hedgewars/uFloat.pas
author unc0rr
Sun, 21 Jan 2007 19:51:02 +0000
changeset 351 29bc9c36ad5f
child 355 40c68869899e
permissions -rw-r--r--
Fixed-point arithmetics in engine. Introduced many bugs. Currently disabled: - land morphing in land generator - AI - many minor features Engine is nearly unusable and totally unplayable.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
     1
(*
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
     2
 * Hedgewars, a Worms style game
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
     3
 * Copyright (c) 2007 Andrey Korotaev <unC0Rr@gmail.com>
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
     4
 *
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License as published by
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
     7
 * the Free Software Foundation; version 2 of the License
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
     8
 *
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    12
 * GNU General Public License for more details.
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    13
 *
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    15
 * along with this program; if not, write to the Free Software
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    16
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    17
 *)
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    18
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    19
unit uFloat;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    20
interface
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    21
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    22
{$IFDEF FPC}
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    23
{$ifdef FPC_LITTLE_ENDIAN}
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    24
type hwFloat = record
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    25
               isNegative: boolean;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    26
               case byte of
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    27
               0: (Frac, Round: Longword);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    28
               1: (QWordValue : QWord);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    29
               end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    30
{$else FPC_LITTLE_ENDIAN}
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    31
type hwFloat = record
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    32
               isNegative: boolean;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    33
               case byte of
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    34
               0: (Round, Frac: Longword);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    35
               1: (QWordValue : QWord);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    36
               end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    37
{$endif FPC_LITTLE_ENDIAN}
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    38
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    39
operator := (i: LongInt) z : hwFloat;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    40
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    41
operator + (z1, z2: hwFloat) z : hwFloat;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    42
operator - (z1, z2: hwFloat) z : hwFloat;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    43
operator - (z1: hwFloat) z : hwFloat;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    44
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    45
operator * (z1, z2: hwFloat) z : hwFloat;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    46
operator * (z1: hwFloat; z2: LongInt) z : hwFloat;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    47
operator / (z1, z2: hwFloat) z : hwFloat;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    48
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    49
operator < (z1, z2: hwFloat) b : boolean;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    50
operator > (z1, z2: hwFloat) b : boolean;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    51
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    52
function cstr(z: hwFloat): string;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    53
function hwRound(t: hwFloat): integer;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    54
function hwAbs(t: hwFloat): hwFloat;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    55
function hwSqr(t: hwFloat): hwFloat;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    56
function Distance(dx, dy: hwFloat): hwFloat;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    57
function AngleSin(angle: Longword): hwFloat;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    58
function AngleCos(angle: Longword): hwFloat;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    59
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    60
const  _1div1024: hwFloat = (isNegative: false; QWordValue:     4194304);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    61
      _1div10000: hwFloat = (isNegative: false; QWordValue:      429496);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    62
      _1div50000: hwFloat = (isNegative: false; QWordValue:       85899);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    63
     _1div100000: hwFloat = (isNegative: false; QWordValue:       42950);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    64
          _1div3: hwFloat = (isNegative: false; QWordValue:  1431655766);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    65
            hwPi: hwFloat = (isNegative: false; QWordValue: 13493037704);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    66
       _0_000004: hwFloat = (isNegative: false; QWordValue:       17179);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    67
         _0_0002: hwFloat = (isNegative: false; QWordValue:      858993);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    68
          _0_001: hwFloat = (isNegative: false; QWordValue:     4294967);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    69
          _0_003: hwFloat = (isNegative: false; QWordValue:    12884902);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    70
          _0_004: hwFloat = (isNegative: false; QWordValue:    17179869);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    71
          _0_005: hwFloat = (isNegative: false; QWordValue:    21474836);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    72
           _0_01: hwFloat = (isNegative: false; QWordValue:    42949673);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    73
           _0_02: hwFloat = (isNegative: false; QWordValue:    85899345);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    74
           _0_03: hwFloat = (isNegative: false; QWordValue:   128849018);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    75
           _0_08: hwFloat = (isNegative: false; QWordValue:   343597383);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    76
            _0_1: hwFloat = (isNegative: false; QWordValue:   429496729);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    77
           _0_15: hwFloat = (isNegative: false; QWordValue:   644245094);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    78
            _0_2: hwFloat = (isNegative: false; QWordValue:   858993459);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    79
           _0_25: hwFloat = (isNegative: false; QWordValue:  1073741824);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    80
            _0_3: hwFloat = (isNegative: false; QWordValue:  1288490189);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    81
           _0_35: hwFloat = (isNegative: false; QWordValue:  1503238553);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    82
            _0_4: hwFloat = (isNegative: false; QWordValue:  1717986918);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    83
           _0_45: hwFloat = (isNegative: false; QWordValue:  1932735283);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    84
            _0_5: hwFloat = (isNegative: false; QWordValue:  2147483648);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    85
           _0_55: hwFloat = (isNegative: false; QWordValue:  2362232012);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    86
            _0_6: hwFloat = (isNegative: false; QWordValue:  2576980377);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    87
            _0_8: hwFloat = (isNegative: false; QWordValue:  3435973837);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    88
           _0_84: hwFloat = (isNegative: false; QWordValue:  3607772528);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    89
           _0_87: hwFloat = (isNegative: false; QWordValue:  3736621547);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    90
            _0_9: hwFloat = (isNegative: false; QWordValue:  3865470566);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    91
           _0_93: hwFloat = (isNegative: false; QWordValue:  3994319585);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    92
           _0_96: hwFloat = (isNegative: false; QWordValue:  4123168604);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    93
          _0_995: hwFloat = (isNegative: false; QWordValue:  4273492459);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    94
          _0_999: hwFloat = (isNegative: false; QWordValue:  4290672328);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    95
            _1_9: hwFloat = (isNegative: false; QWordValue:  8160437862);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    96
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    97
         cLittle: hwFloat = (isNegative: false; QWordValue:           1);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    98
         cHHKick: hwFloat = (isNegative: false; QWordValue:   128849018);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    99
{$ENDIF}
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   100
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   101
{$IFNDEF FPC}
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   102
type hwFloat = Extended;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   103
{$ENDIF}
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   104
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   105
implementation
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   106
uses uConsts;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   107
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   108
{$IFDEF FPC}
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   109
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   110
operator := (i: LongInt) z : hwFloat;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   111
begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   112
z.isNegative:= i < 0;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   113
z.Round:= abs(i);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   114
z.Frac:= 0
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   115
end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   116
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   117
operator + (z1, z2: hwFloat) z : hwFloat;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   118
begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   119
if z1.isNegative = z2.isNegative then
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   120
   begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   121
   z.isNegative:= z1.isNegative;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   122
   z.QWordValue:= z1.QWordValue + z2.QWordValue
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   123
   end
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   124
else
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   125
   if z1.QWordValue > z2.QWordValue then
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   126
      begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   127
      z.isNegative:= z1.isNegative;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   128
      z.QWordValue:= z1.QWordValue - z2.QWordValue
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   129
      end else
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   130
      begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   131
      z.isNegative:= z2.isNegative;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   132
      z.QWordValue:= z2.QWordValue - z1.QWordValue
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   133
      end
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   134
end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   135
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   136
operator - (z1, z2: hwFloat) z : hwFloat;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   137
begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   138
if z1.isNegative = z2.isNegative then
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   139
   if z1.QWordValue > z2.QWordValue then
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   140
      begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   141
      z.isNegative:= z1.isNegative;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   142
      z.QWordValue:= z1.QWordValue - z2.QWordValue
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   143
      end else
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   144
      begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   145
      z.isNegative:= not z2.isNegative;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   146
      z.QWordValue:= z2.QWordValue - z1.QWordValue
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   147
      end
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   148
else begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   149
     z.isNegative:= z1.isNegative;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   150
     z.QWordValue:= z1.QWordValue + z2.QWordValue
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   151
     end
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   152
end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   153
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   154
operator - (z1: hwFloat) z : hwFloat;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   155
begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   156
z:= z1;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   157
z.isNegative:= not z.isNegative
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   158
end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   159
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   160
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   161
operator * (z1, z2: hwFloat) z : hwFloat;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   162
begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   163
z.isNegative:= z1.isNegative xor z2.isNegative;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   164
z.QWordValue:= QWord(z1.Round) * z2.Frac +
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   165
               QWord(z1.Frac) * z2.Round +
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   166
               ((QWord(z1.Frac) * z2.Frac) shr 32);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   167
z.Round:= z.Round + QWord(z1.Round) * z2.Round;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   168
end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   169
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   170
operator * (z1: hwFloat; z2: LongInt) z : hwFloat;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   171
begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   172
z.isNegative:= z1.isNegative xor (z2 < 0);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   173
z2:= abs(z2);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   174
z.QWordValue:= z.QWordValue * z2
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   175
end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   176
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   177
operator / (z1, z2: hwFloat) z : hwFloat;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   178
var t: hwFloat;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   179
begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   180
z.isNegative:= z1.isNegative xor z2.isNegative;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   181
z.Round:= z1.QWordValue div z2.QWordValue;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   182
t:= z1 - z2 * z.Round;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   183
if t.QWordValue = 0 then
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   184
   z.Frac:= 0
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   185
else
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   186
   begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   187
   while ((t.QWordValue and $8000000000000000) = 0) and
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   188
         ((z2.QWordValue and $8000000000000000) = 0) do
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   189
         begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   190
         t.QWordValue:= t.QWordValue shl 1;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   191
         z2.QWordValue:= z2.QWordValue shl 1
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   192
         end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   193
   z.Frac:= (t.QWordValue) div (z2.Round)
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   194
   end
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   195
end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   196
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   197
operator < (z1, z2: hwFloat) b : boolean;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   198
begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   199
if z1.isNegative <> z2.isNegative then
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   200
   b:= z1.isNegative
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   201
else
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   202
   if z1.QWordValue = z2.QWordValue then
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   203
      b:= false
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   204
   else
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   205
      b:= (z1.QWordValue < z2.QWordValue) xor z1.isNegative
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   206
end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   207
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   208
operator > (z1, z2: hwFloat) b : boolean;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   209
begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   210
if z1.isNegative <> z2.isNegative then
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   211
   b:= z2.isNegative
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   212
else
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   213
   if z1.QWordValue = z2.QWordValue then
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   214
      b:= false
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   215
   else
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   216
      b:= (z1.QWordValue > z2.QWordValue) xor z2.isNegative
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   217
end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   218
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   219
function cstr(z: hwFloat): string;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   220
var tmpstr: string;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   221
begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   222
str(z.Round, cstr);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   223
if z.Frac <> 0 then
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   224
   begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   225
   str(z.Frac / $100000000:1:15, tmpstr);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   226
   delete(tmpstr, 1, 2);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   227
   cstr:= cstr + '.' + tmpstr
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   228
   end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   229
if z.isNegative then cstr:= '-' + cstr
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   230
end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   231
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   232
function hwRound(t: hwFloat): integer;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   233
begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   234
if t.isNegative then hwRound:= -t.Round
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   235
                else hwRound:= t.Round
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   236
end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   237
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   238
function hwAbs(t: hwFloat): hwFloat;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   239
begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   240
hwAbs:= t;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   241
hwAbs.isNegative:= false
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   242
end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   243
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   244
function hwSqr(t: hwFloat): hwFloat;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   245
begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   246
hwSqr:= t * t
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   247
end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   248
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   249
function Distance(dx, dy: hwFloat): hwFloat;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   250
var x, y: hwFloat;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   251
    Result: hwFloat;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   252
begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   253
x:= dx * dx;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   254
y:= dy * dy;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   255
Result:= x + y;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   256
Result.QWordValue:= Round(sqrt(1.0 / 4294967296 * (Result.QWordValue)) * 4294967296);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   257
Distance:= Result
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   258
end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   259
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   260
function AngleSin(angle: Longword): hwFloat;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   261
begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   262
AngleSin.isNegative:= false;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   263
AngleSin:= Round(Sin(Angle * pi / cMaxAngle) * 4294967296)
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   264
end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   265
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   266
function AngleCos(angle: Longword): hwFloat;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   267
var CosVal: Extended;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   268
begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   269
CosVal:= Cos(Angle * pi / cMaxAngle);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   270
AngleCos.isNegative:= CosVal < 0;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   271
AngleCos:= Round(Cosval * 4294967296)
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   272
end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   273
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   274
{$ENDIF}
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   275
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   276
end.