plugins/include/float.inc
author David Anderson <dvander@alliedmods.net>
Sun Jan 13 08:10:25 2008 +0000 (2008-01-13)
changeset 1847 5336a438763f
parent 1330 ab94316bb52b
child 1936 89d6e5038933
permissions -rw-r--r--
fixed amb1379 with sweeping changes to the entity stuff. all prop stocks are now natives so they can properly compute everything quickly, as well as do type checks. Get/SetEntDataEnt are deprecated for being sucky, the new 2 versions do more checking and uses better values. lastly, there are functions/parameters for finding types and sizes of property.
faluco@242
     1
/**
ds@475
     2
 * vim: set ts=4 :
ds@1330
     3
 * =============================================================================
dvander@374
     4
 * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
ds@1330
     5
 * =============================================================================
ds@1330
     6
 *
ds@1330
     7
 * This file is part of the SourceMod/SourcePawn SDK.
dvander@374
     8
 *
ds@1330
     9
 * This program is free software; you can redistribute it and/or modify it under
ds@1330
    10
 * the terms of the GNU General Public License, version 3.0, as published by the
ds@1330
    11
 * Free Software Foundation.
ds@1330
    12
 * 
ds@1330
    13
 * This program is distributed in the hope that it will be useful, but WITHOUT
ds@1330
    14
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ds@1330
    15
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
ds@1330
    16
 * details.
ds@1330
    17
 *
ds@1330
    18
 * You should have received a copy of the GNU General Public License along with
ds@1330
    19
 * this program.  If not, see <http://www.gnu.org/licenses/>.
ds@1330
    20
 *
ds@1330
    21
 * As a special exception, AlliedModders LLC gives you permission to link the
ds@1330
    22
 * code of this program (as well as its derivative works) to "Half-Life 2," the
ds@1330
    23
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
ds@1330
    24
 * by the Valve Corporation.  You must obey the GNU General Public License in
ds@1330
    25
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
ds@1330
    26
 * this exception to all derivative works.  AlliedModders LLC defines further
ds@1330
    27
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
ds@1330
    28
 * or <http://www.sourcemod.net/license.php>.
dvander@374
    29
 *
dvander@374
    30
 * Version: $Id$
faluco@242
    31
 */
dvander@374
    32
 
faluco@242
    33
#if defined _float_included
faluco@242
    34
 #endinput
faluco@242
    35
#endif
faluco@242
    36
#define _float_included
faluco@242
    37
faluco@242
    38
/**
faluco@242
    39
 * Converts an integer into a floating point value.
faluco@242
    40
 *
faluco@242
    41
 * @param value			Integer to convert.
faluco@242
    42
 * @return				Floating point value.
faluco@242
    43
 */
faluco@242
    44
native Float:float(value);
faluco@242
    45
faluco@242
    46
/**
faluco@242
    47
 * Multiplies two floats together.
faluco@242
    48
 *
faluco@242
    49
 * @param oper1			First value.
faluco@242
    50
 * @param oper2			Second value.
faluco@242
    51
 * @return				oper1*oper2.
faluco@242
    52
 */
faluco@242
    53
native Float:FloatMul(Float:oper1, Float:oper2);
faluco@242
    54
faluco@242
    55
/**
faluco@242
    56
 * Divides the dividend by the divisor.
faluco@242
    57
 *
faluco@242
    58
 * @param dividend		First value.
faluco@242
    59
 * @param divisor		Second value.
faluco@242
    60
 * @return				dividend/divisor.
faluco@242
    61
 */
faluco@242
    62
native Float:FloatDiv(Float:dividend, Float:divisor);
faluco@242
    63
faluco@242
    64
/**
faluco@242
    65
 * Adds two floats together.
faluco@242
    66
 *
faluco@242
    67
 * @param oper1			First value.
faluco@242
    68
 * @param oper2			Second value.
faluco@242
    69
 * @return				oper1+oper2.
faluco@242
    70
 */
faluco@242
    71
native Float:FloatAdd(Float:oper1, Float:oper2);
faluco@242
    72
faluco@242
    73
/**
faluco@242
    74
 * Subtracts oper2 from oper1.
faluco@242
    75
 *
faluco@242
    76
 * @param oper1			First value.
faluco@242
    77
 * @param oper2			Second value.
faluco@242
    78
 * @return				oper1-oper2.
faluco@242
    79
 */
faluco@242
    80
native Float:FloatSub(Float:oper1, Float:oper2);
faluco@242
    81
faluco@242
    82
/**
faluco@242
    83
 * Returns the decimal part of a float.
faluco@242
    84
 *
faluco@242
    85
 * @param value			Input value.
faluco@242
    86
 * @return				Decimal part.
faluco@242
    87
 */
faluco@242
    88
native Float:FloatFraction(Float:value);
faluco@242
    89
faluco@242
    90
/**
faluco@831
    91
 * Rounds a float to the closest integer to zero.
faluco@831
    92
 *
faluco@831
    93
 * @param value			Input value to be rounded.
faluco@831
    94
 * @return				Rounded value.
faluco@831
    95
 */
faluco@831
    96
native RoundToZero(Float:value);
faluco@831
    97
faluco@831
    98
/**
faluco@831
    99
 * Rounds a float to the next highest integer value.
faluco@242
   100
 *
faluco@242
   101
 * @param value			Input value to be rounded.
faluco@831
   102
 * @return				Rounded value.
faluco@831
   103
 */
faluco@831
   104
native RoundToCeil(Float:value);
faluco@831
   105
faluco@831
   106
/**
faluco@831
   107
 * Rounds a float to the next lowest integer value.
faluco@831
   108
 *
faluco@831
   109
 * @param value			Input value to be rounded.
faluco@242
   110
 * @return				Rounded value.
faluco@242
   111
 */
faluco@831
   112
native RoundToFloor(Float:value);
faluco@831
   113
faluco@831
   114
/**
faluco@831
   115
 * Standard IEEE rounding.
faluco@831
   116
 *
faluco@831
   117
 * @param value			Input value to be rounded.
faluco@831
   118
 * @return				Rounded value.
faluco@831
   119
 */
faluco@851
   120
native RoundToNearest(Float:value);
faluco@242
   121
faluco@242
   122
/**
faluco@242
   123
 * Compares two floats.
faluco@242
   124
 *
faluco@242
   125
 * @param fOne			First value.
faluco@242
   126
 * @param fTwo			Second value.
faluco@242
   127
 * @return				Returns 1 if the first argument is greater than the second argument.
faluco@242
   128
 *                      Returns -1 if the first argument is smaller than the second argument.
faluco@242
   129
 *                      Returns 0 if both arguments are equal.
faluco@242
   130
 */
faluco@242
   131
native FloatCompare(Float:fOne, Float:fTwo);
faluco@242
   132
faluco@242
   133
/**
faluco@242
   134
 * Returns the square root of the input value, equivalent to floatpower(value, 0.5).
faluco@242
   135
 *
faluco@242
   136
 * @param value			Input value.
faluco@242
   137
 * @return				Square root of the value.
faluco@242
   138
 */
faluco@242
   139
native Float:SquareRoot(Float:value);
faluco@242
   140
faluco@242
   141
/**
faluco@242
   142
 * Returns the value raised to the power of the exponent.
faluco@242
   143
 *
faluco@242
   144
 * @param value			Value to be raised.
faluco@242
   145
 * @param exponent		Value to raise the base.
faluco@242
   146
 * @return				value^exponent.
faluco@242
   147
 */
faluco@242
   148
native Float:Pow(Float:value, Float:exponent);
faluco@242
   149
faluco@242
   150
/**
faluco@242
   151
 * Returns the value of raising the input by e.
faluco@242
   152
 *
faluco@242
   153
 * @param value			Input value.
faluco@242
   154
 * @return				exp(value).
faluco@242
   155
 */
faluco@242
   156
native Float:Exponential(Float:value);
faluco@242
   157
faluco@242
   158
/**
faluco@242
   159
 * Returns the logarithm of any base specified.
faluco@242
   160
 *
faluco@242
   161
 * @param value			Input value.
faluco@242
   162
 * @param base			Logarithm base to use, default is 10.
faluco@242
   163
 * @return				log(value)/log(base).
faluco@242
   164
 */
faluco@242
   165
native Float:Logarithm(Float:value, Float:base=10.0);
faluco@242
   166
faluco@242
   167
/**
faluco@242
   168
 * Returns the sine of the argument.
faluco@242
   169
 *
faluco@242
   170
 * @param value			Input value in radians.
faluco@242
   171
 * @return				sin(value).
faluco@242
   172
 */
faluco@242
   173
native Float:Sine(Float:value);
faluco@242
   174
faluco@242
   175
/**
faluco@242
   176
 * Returns the cosine of the argument.
faluco@242
   177
 *
faluco@242
   178
 * @param value			Input value in radians.
faluco@242
   179
 * @return				cos(value).
faluco@242
   180
 */
faluco@242
   181
native Float:Cosine(Float:value);
faluco@242
   182
faluco@242
   183
/**
faluco@242
   184
 * Returns the tangent of the argument.
faluco@242
   185
 *
faluco@242
   186
 * @param value			Input value in radians.
faluco@242
   187
 * @return				tan(value).
faluco@242
   188
 */
faluco@242
   189
native Float:Tangent(Float:value);
faluco@242
   190
faluco@242
   191
/**
dvander@619
   192
 * Returns an absolute value.
faluco@242
   193
 *
faluco@242
   194
 * @param value			Input value.
dvander@619
   195
 * @return				Absolute value of the input.
faluco@242
   196
 */
faluco@242
   197
native Float:FloatAbs(Float:value);
faluco@242
   198
faluco@242
   199
/**
faluco@242
   200
 * Returns the arctangent of the input value.
faluco@242
   201
 *
faluco@242
   202
 * @param angle			Input value.
faluco@242
   203
 * @return				atan(value) in radians.
faluco@242
   204
 */
faluco@242
   205
native Float:ArcTangent(Float:angle);
faluco@242
   206
faluco@242
   207
/**
faluco@242
   208
 * Returns the arccosine of the input value.
faluco@242
   209
 *
faluco@242
   210
 * @param angle			Input value.
faluco@242
   211
 * @return				acos(value) in radians.
faluco@242
   212
 */
faluco@242
   213
native Float:ArcCosine(Float:angle);
faluco@242
   214
faluco@242
   215
/**
faluco@242
   216
 * Returns the arcsine of the input value.
faluco@242
   217
 *
faluco@242
   218
 * @param angle			Input value.
faluco@242
   219
 * @return				asin(value) in radians.
faluco@242
   220
 */
faluco@242
   221
native Float:ArcSine(Float:angle);
faluco@242
   222
faluco@242
   223
/**
faluco@242
   224
 * Returns the arctangent2 of the input values.
faluco@242
   225
 *
faluco@242
   226
 * @param x				Horizontal value.
faluco@242
   227
 * @param y				Vertical value.
faluco@242
   228
 * @return				atan2(value) in radians.
faluco@242
   229
 */
faluco@244
   230
native Float:ArcTangent2(Float:x, Float:y);
faluco@242
   231
faluco@242
   232
/**
dvander@845
   233
 * Rounds a floating point number using the "round to nearest" algorithm.
dvander@845
   234
 *
dvander@845
   235
 * @param value			Floating point value to round.
dvander@845
   236
 * @return				The value rounded to the nearest integer.
faluco@836
   237
 */
dvander@845
   238
stock RoundFloat(Float:value)
faluco@836
   239
{
dvander@845
   240
	return RoundToNearest(value);
dvander@845
   241
}
faluco@836
   242
faluco@836
   243
/**
dvander@845
   244
 * Backwards compatibility stock.  Do not use.
dvander@845
   245
 *
faluco@836
   246
 * @deprecated
faluco@836
   247
 */
ds@1268
   248
#pragma deprecated Use RoundToNearest() or RoundFloat() instead
dvander@845
   249
stock FloatRound(Float:value)
dvander@845
   250
{
dvander@845
   251
	return RoundToNearest(value);
dvander@845
   252
}
faluco@836
   253
faluco@836
   254
/**
faluco@242
   255
 * User defined operators.
faluco@242
   256
 *
faluco@242
   257
 */
faluco@242
   258
#pragma rational Float
faluco@242
   259
faluco@242
   260
native Float:operator*(Float:oper1, Float:oper2) = FloatMul;
faluco@242
   261
native Float:operator/(Float:oper1, Float:oper2) = FloatDiv;
faluco@242
   262
native Float:operator+(Float:oper1, Float:oper2) = FloatAdd;
faluco@242
   263
native Float:operator-(Float:oper1, Float:oper2) = FloatSub;
faluco@242
   264
faluco@242
   265
stock Float:operator++(Float:oper)
dvander@815
   266
{
faluco@242
   267
	return oper+1.0;
dvander@815
   268
}
faluco@242
   269
faluco@242
   270
stock Float:operator--(Float:oper)
dvander@815
   271
{
faluco@242
   272
	return oper-1.0;
dvander@815
   273
}
faluco@242
   274
faluco@242
   275
stock Float:operator-(Float:oper)
dvander@815
   276
{
faluco@242
   277
	return oper^Float:((-1)^((-1)/2));				/* IEEE values are sign/magnitude */
dvander@815
   278
}
faluco@242
   279
faluco@242
   280
stock Float:operator*(Float:oper1, oper2)
dvander@815
   281
{
faluco@242
   282
	return FloatMul(oper1, float(oper2));			/* "*" is commutative */
dvander@815
   283
}
faluco@242
   284
faluco@242
   285
stock Float:operator/(Float:oper1, oper2)
dvander@815
   286
{
faluco@242
   287
	return FloatDiv(oper1, float(oper2));
dvander@815
   288
}
faluco@242
   289
faluco@242
   290
stock Float:operator/(oper1, Float:oper2)
dvander@815
   291
{
faluco@242
   292
	return FloatDiv(float(oper1), oper2);
dvander@815
   293
}
faluco@242
   294
faluco@242
   295
stock Float:operator+(Float:oper1, oper2)
dvander@815
   296
{
faluco@242
   297
	return FloatAdd(oper1, float(oper2));			/* "+" is commutative */
dvander@815
   298
}
faluco@242
   299
faluco@242
   300
stock Float:operator-(Float:oper1, oper2)
dvander@815
   301
{
faluco@242
   302
	return FloatSub(oper1, float(oper2));
dvander@815
   303
}
faluco@242
   304
faluco@242
   305
stock Float:operator-(oper1, Float:oper2)
dvander@815
   306
{
faluco@242
   307
	return FloatSub(float(oper1), oper2);
dvander@815
   308
}
faluco@242
   309
faluco@242
   310
stock bool:operator==(Float:oper1, Float:oper2)
dvander@815
   311
{
faluco@242
   312
	return FloatCompare(oper1, oper2) == 0;
dvander@815
   313
}
faluco@242
   314
faluco@242
   315
stock bool:operator==(Float:oper1, oper2)
dvander@815
   316
{
faluco@242
   317
	return FloatCompare(oper1, float(oper2)) == 0; 	/* "==" is commutative */
dvander@815
   318
}
faluco@242
   319
faluco@242
   320
stock bool:operator!=(Float:oper1, Float:oper2)
dvander@815
   321
{
faluco@242
   322
	return FloatCompare(oper1, oper2) != 0;
dvander@815
   323
}
faluco@242
   324
faluco@242
   325
stock bool:operator!=(Float:oper1, oper2)
dvander@815
   326
{
faluco@242
   327
	return FloatCompare(oper1, float(oper2)) != 0; 	/* "==" is commutative */
dvander@815
   328
}
faluco@242
   329
faluco@242
   330
stock bool:operator>(Float:oper1, Float:oper2)
dvander@815
   331
{
faluco@242
   332
	return FloatCompare(oper1, oper2) > 0;
dvander@815
   333
}
faluco@242
   334
faluco@242
   335
stock bool:operator>(Float:oper1, oper2)
dvander@815
   336
{
faluco@242
   337
	return FloatCompare(oper1, float(oper2)) > 0;
dvander@815
   338
}
faluco@242
   339
faluco@242
   340
stock bool:operator>(oper1, Float:oper2)
dvander@815
   341
{
faluco@242
   342
	return FloatCompare(float(oper1), oper2) > 0;
dvander@815
   343
}
faluco@242
   344
faluco@242
   345
stock bool:operator>=(Float:oper1, Float:oper2)
dvander@815
   346
{
faluco@242
   347
	return FloatCompare(oper1, oper2) >= 0;
dvander@815
   348
}
faluco@242
   349
faluco@242
   350
stock bool:operator>=(Float:oper1, oper2)
dvander@815
   351
{
faluco@242
   352
	return FloatCompare(oper1, float(oper2)) >= 0;
dvander@815
   353
}
faluco@242
   354
faluco@242
   355
stock bool:operator>=(oper1, Float:oper2)
dvander@815
   356
{
faluco@242
   357
	return FloatCompare(float(oper1), oper2) >= 0;
dvander@815
   358
}
faluco@242
   359
faluco@242
   360
stock bool:operator<(Float:oper1, Float:oper2)
dvander@815
   361
{
faluco@242
   362
	return FloatCompare(oper1, oper2) < 0;
dvander@815
   363
}
faluco@242
   364
faluco@242
   365
stock bool:operator<(Float:oper1, oper2)
dvander@815
   366
{
faluco@242
   367
	return FloatCompare(oper1, float(oper2)) < 0;
dvander@815
   368
}
faluco@242
   369
faluco@242
   370
stock bool:operator<(oper1, Float:oper2)
dvander@815
   371
{
faluco@242
   372
	return FloatCompare(float(oper1), oper2) < 0;
dvander@815
   373
}
faluco@242
   374
faluco@242
   375
stock bool:operator<=(Float:oper1, Float:oper2)
dvander@815
   376
{
faluco@242
   377
	return FloatCompare(oper1, oper2) <= 0;
dvander@815
   378
}
faluco@242
   379
faluco@242
   380
stock bool:operator<=(Float:oper1, oper2)
dvander@815
   381
{
faluco@242
   382
	return FloatCompare(oper1, float(oper2)) <= 0;
dvander@815
   383
}
faluco@242
   384
faluco@242
   385
stock bool:operator<=(oper1, Float:oper2)
dvander@815
   386
{
faluco@242
   387
	return FloatCompare(float(oper1), oper2) <= 0;
dvander@815
   388
}
faluco@242
   389
faluco@242
   390
stock bool:operator!(Float:oper)
dvander@815
   391
{
faluco@242
   392
	return (_:oper & ((-1)/2)) == 0;		/* -1 = all bits to 1; /2 = remove most significant bit (sign)
faluco@242
   393
											works on both 32bit and 64bit systems; no constant required */
dvander@815
   394
}
faluco@242
   395
faluco@242
   396
/**
faluco@242
   397
 * Forbidden operators.
faluco@242
   398
 *
faluco@242
   399
 */
faluco@242
   400
forward operator%(Float:oper1, Float:oper2);
faluco@242
   401
forward operator%(Float:oper1, oper2);
faluco@261
   402
forward operator%(oper1, Float:oper2);
faluco@261
   403
faluco@261
   404
#define FLOAT_PI 3.1415926535897932384626433832795
faluco@261
   405
dvander@619
   406
/**
dvander@619
   407
 * Converts degrees to radians.
dvander@619
   408
 *
dvander@619
   409
 * @param angle		Degrees.
dvander@619
   410
 * @return			Radians.
dvander@619
   411
 */
faluco@261
   412
stock Float:DegToRad(Float:angle)
faluco@261
   413
{
faluco@261
   414
	return (angle*FLOAT_PI)/180;
faluco@261
   415
}
faluco@261
   416
dvander@619
   417
/**
dvander@619
   418
 * Converts degrees to radians.
dvander@619
   419
 *
dvander@619
   420
 * @param angle		Radians.
dvander@619
   421
 * @return			Degrees.
dvander@619
   422
 */
faluco@261
   423
stock Float:RadToDeg(Float:angle)
faluco@261
   424
{
faluco@261
   425
	return (angle*180)/FLOAT_PI;
ds@475
   426
}