core/smn_float.cpp
author Scott Ehlert <ds@alliedmods.net>
Wed Jun 06 20:42:46 2007 +0000 (2007-06-06)
changeset 891 30343d215489
parent 851 66d23844a8aa
child 1231 17badaf66ce4
permissions -rw-r--r--
Changed a few natives/stocks that should have used IsClientInGame() rather than IsClientConnected()
dvander@370
     1
/**
ds@653
     2
 * vim: set ts=4 :
dvander@370
     3
 * ===============================================================
dvander@370
     4
 * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
dvander@370
     5
 * ===============================================================
dvander@370
     6
 *
dvander@370
     7
 * This file is not open source and may not be copied without explicit
dvander@370
     8
 * written permission of AlliedModders LLC.  This file may not be redistributed 
dvander@370
     9
 * in whole or significant part.
dvander@370
    10
 * For information, see LICENSE.txt or http://www.sourcemod.net/license.php
dvander@370
    11
 *
dvander@370
    12
 * Version: $Id$
dvander@370
    13
 */
dvander@370
    14
faluco@225
    15
#include <math.h>
dvander@464
    16
#include <string.h>
dvander@464
    17
#include <stdlib.h>
ds@432
    18
#include "sm_globals.h"
faluco@225
    19
faluco@225
    20
/****************************************
faluco@225
    21
*                                       *
faluco@225
    22
* FLOATING POINT NATIVE IMPLEMENTATIONS *
faluco@225
    23
*                                       *
faluco@225
    24
****************************************/
faluco@225
    25
faluco@225
    26
faluco@225
    27
static cell_t sm_float(IPluginContext *pCtx, const cell_t *params)
faluco@225
    28
{
faluco@225
    29
	float val = static_cast<float>(params[1]);
faluco@225
    30
dvander@233
    31
	return sp_ftoc(val);
faluco@225
    32
}
faluco@225
    33
faluco@260
    34
static cell_t sm_FloatAbs(IPluginContext *pCtx, const cell_t *params)
faluco@225
    35
{
dvander@233
    36
	float val = sp_ctof(params[1]);
faluco@831
    37
	val = (val >= 0.0f) ? val : -val;
faluco@225
    38
dvander@233
    39
	return sp_ftoc(val);
faluco@225
    40
}
faluco@225
    41
faluco@260
    42
static cell_t sm_FloatAdd(IPluginContext *pCtx, const cell_t *params)
faluco@225
    43
{
dvander@233
    44
	float val = sp_ctof(params[1]) + sp_ctof(params[2]);
faluco@225
    45
dvander@233
    46
	return sp_ftoc(val);
faluco@225
    47
}
faluco@225
    48
faluco@260
    49
static cell_t sm_FloatSub(IPluginContext *pCtx, const cell_t *params)
faluco@225
    50
{
dvander@233
    51
	float val = sp_ctof(params[1]) - sp_ctof(params[2]);
faluco@225
    52
dvander@233
    53
	return sp_ftoc(val);
faluco@225
    54
}
faluco@225
    55
faluco@260
    56
static cell_t sm_FloatMul(IPluginContext *pCtx, const cell_t *params)
faluco@225
    57
{
dvander@233
    58
	float val = sp_ctof(params[1]) * sp_ctof(params[2]);
faluco@225
    59
dvander@233
    60
	return sp_ftoc(val);
faluco@225
    61
}
faluco@225
    62
faluco@260
    63
static cell_t sm_FloatDiv(IPluginContext *pCtx, const cell_t *params)
faluco@225
    64
{
dvander@233
    65
	float val = sp_ctof(params[1]) / sp_ctof(params[2]);
faluco@225
    66
dvander@233
    67
	return sp_ftoc(val);
faluco@225
    68
}
faluco@225
    69
faluco@260
    70
static cell_t sm_FloatCompare(IPluginContext *pCtx, const cell_t *params)
faluco@225
    71
{
dvander@233
    72
	float val1 = sp_ctof(params[1]);
dvander@233
    73
	float val2 = sp_ctof(params[2]);
faluco@225
    74
faluco@225
    75
	if (val1 > val2)
faluco@225
    76
	{
faluco@225
    77
		return 1;
faluco@225
    78
	} else if (val1 < val2) {
faluco@225
    79
		return -1;
faluco@225
    80
	}
faluco@225
    81
faluco@225
    82
	return 0;
faluco@225
    83
}
faluco@225
    84
faluco@260
    85
static cell_t sm_Logarithm(IPluginContext *pCtx, const cell_t *params)
faluco@225
    86
{
dvander@233
    87
	float val = sp_ctof(params[1]);
dvander@233
    88
	float base = sp_ctof(params[2]);
faluco@225
    89
faluco@831
    90
	if ((val <= 0.0f) || (base <= 0.0f))
faluco@225
    91
	{
ds@470
    92
		return pCtx->ThrowNativeError("Cannot evaluate the logarithm of zero or a negative number (val:%f base:%f)", val, base);
faluco@225
    93
	}
faluco@831
    94
	if (base == 10.0f)
faluco@225
    95
	{
faluco@225
    96
		val = log10(val);
faluco@225
    97
	} else {
faluco@225
    98
		val = log(val) / log(base);
faluco@225
    99
	}
faluco@225
   100
dvander@233
   101
	return sp_ftoc(val);
faluco@225
   102
}
faluco@225
   103
faluco@260
   104
static cell_t sm_Exponential(IPluginContext *pCtx, const cell_t *params)
faluco@225
   105
{
dvander@233
   106
	float val = sp_ctof(params[1]);
faluco@225
   107
dvander@233
   108
	return sp_ftoc(exp(val));
faluco@225
   109
}
faluco@225
   110
faluco@260
   111
static cell_t sm_Pow(IPluginContext *pCtx, const cell_t *params)
faluco@225
   112
{
dvander@233
   113
	float base = sp_ctof(params[1]);
dvander@233
   114
	float exponent = sp_ctof(params[2]);
faluco@225
   115
dvander@233
   116
	return sp_ftoc(pow(base, exponent));
faluco@225
   117
}
faluco@225
   118
faluco@260
   119
static cell_t sm_SquareRoot(IPluginContext *pCtx, const cell_t *params)
faluco@225
   120
{
dvander@233
   121
	float val = sp_ctof(params[1]);
faluco@225
   122
faluco@831
   123
	if (val < 0.0f)
faluco@225
   124
	{
ds@470
   125
		return pCtx->ThrowNativeError("Cannot evaluate the square root of a negative number (val:%f)", val);
faluco@225
   126
	}
faluco@225
   127
dvander@233
   128
	return sp_ftoc(sqrt(val));
faluco@225
   129
}
faluco@225
   130
faluco@851
   131
static cell_t sm_RoundToNearest(IPluginContext *pCtx, const cell_t *params)
faluco@831
   132
{
faluco@831
   133
	float val = sp_ctof(params[1]);
faluco@831
   134
	val = (float)floor(val + 0.5f);
faluco@831
   135
faluco@831
   136
	return static_cast<int>(val);
faluco@831
   137
}
faluco@831
   138
faluco@831
   139
static cell_t sm_RoundToFloor(IPluginContext *pCtx, const cell_t *params)
faluco@225
   140
{
dvander@233
   141
	float val = sp_ctof(params[1]);
faluco@831
   142
	val = floor(val);
faluco@225
   143
faluco@831
   144
	return static_cast<int>(val);
faluco@831
   145
}
faluco@831
   146
faluco@831
   147
static cell_t sm_RoundToCeil(IPluginContext *pCtx, const cell_t *params)
faluco@831
   148
{
faluco@831
   149
	float val = sp_ctof(params[1]);
faluco@831
   150
	val = ceil(val);
faluco@831
   151
faluco@831
   152
	return static_cast<int>(val);
faluco@831
   153
}
faluco@831
   154
faluco@831
   155
static cell_t sm_RoundToZero(IPluginContext *pCtx, const cell_t *params)
faluco@831
   156
{
faluco@831
   157
	float val = sp_ctof(params[1]);
faluco@831
   158
	if (val >= 0.0f)
faluco@225
   159
	{
faluco@831
   160
		val = floor(val);
faluco@831
   161
	} else {
faluco@831
   162
		val = ceil(val);
faluco@225
   163
	}
faluco@225
   164
faluco@242
   165
	return static_cast<int>(val);
faluco@225
   166
}
faluco@225
   167
faluco@260
   168
static cell_t sm_FloatFraction(IPluginContext *pCtx, const cell_t *params)
faluco@225
   169
{
dvander@233
   170
	float val = sp_ctof(params[1]);
faluco@225
   171
	val = val - floor(val);
faluco@225
   172
dvander@233
   173
	return sp_ftoc(val);
faluco@225
   174
}
faluco@225
   175
faluco@260
   176
static cell_t sm_Sine(IPluginContext *pCtx, const cell_t *params)
faluco@225
   177
{
dvander@233
   178
	float val = sp_ctof(params[1]);
faluco@235
   179
	val = sin(val);
faluco@225
   180
dvander@233
   181
	return sp_ftoc(val);
faluco@225
   182
}
faluco@225
   183
faluco@260
   184
static cell_t sm_Cosine(IPluginContext *pCtx, const cell_t *params)
faluco@225
   185
{
dvander@233
   186
	float val = sp_ctof(params[1]);
faluco@235
   187
	val = cos(val);
faluco@225
   188
dvander@233
   189
	return sp_ftoc(val);
faluco@225
   190
}
faluco@225
   191
faluco@260
   192
static cell_t sm_Tangent(IPluginContext *pCtx, const cell_t *params)
faluco@225
   193
{
dvander@233
   194
	float val = sp_ctof(params[1]);
faluco@235
   195
	val = tan(val);
faluco@225
   196
dvander@233
   197
	return sp_ftoc(val);
faluco@225
   198
}
faluco@225
   199
faluco@260
   200
static cell_t sm_ArcSine(IPluginContext *pCtx, const cell_t *params)
faluco@225
   201
{
dvander@233
   202
	float val = sp_ctof(params[1]);
faluco@225
   203
	val = asin(val);
faluco@225
   204
faluco@235
   205
	return sp_ftoc(val);
faluco@225
   206
}
faluco@225
   207
faluco@260
   208
static cell_t sm_ArcCosine(IPluginContext *pCtx, const cell_t *params)
faluco@225
   209
{
dvander@233
   210
	float val = sp_ctof(params[1]);
faluco@225
   211
	val = acos(val);
faluco@225
   212
faluco@235
   213
	return sp_ftoc(val);
faluco@225
   214
}
faluco@225
   215
faluco@260
   216
static cell_t sm_ArcTangent(IPluginContext *pCtx, const cell_t *params)
faluco@225
   217
{
dvander@233
   218
	float val = sp_ctof(params[1]);
faluco@225
   219
	val = atan(val);
faluco@225
   220
faluco@235
   221
	return sp_ftoc(val);
faluco@225
   222
}
faluco@225
   223
faluco@260
   224
static cell_t sm_ArcTangent2(IPluginContext *pCtx, const cell_t *params)
faluco@225
   225
{
dvander@233
   226
	float val1 = sp_ctof(params[1]);
dvander@233
   227
	float val2 = sp_ctof(params[2]);
faluco@225
   228
	val1 = atan2(val1, val2);
faluco@225
   229
faluco@235
   230
	return sp_ftoc(val1);
faluco@225
   231
}
faluco@260
   232
faluco@836
   233
static cell_t sm_FloatRound(IPluginContext *pCtx, const cell_t *params)
faluco@836
   234
{
faluco@836
   235
	float val = sp_ctof(params[1]);
faluco@836
   236
faluco@836
   237
	switch (params[2])
faluco@836
   238
	{
faluco@836
   239
	case 1:
faluco@836
   240
		{
faluco@836
   241
			val = floor(val);
faluco@836
   242
			break;
faluco@836
   243
		}
faluco@836
   244
	case 2:
faluco@836
   245
		{
faluco@836
   246
			val = ceil(val);
faluco@836
   247
			break;
faluco@836
   248
		}
faluco@836
   249
	case 3:
faluco@836
   250
		{
faluco@836
   251
			if (val >= 0.0f)
faluco@836
   252
			{
faluco@836
   253
				val = floor(val);
faluco@836
   254
			} else {
faluco@836
   255
				val = ceil(val);
faluco@836
   256
			}
faluco@836
   257
			break;
faluco@836
   258
		}
faluco@836
   259
	default:
faluco@836
   260
		{
faluco@836
   261
			val = (float)floor(val + 0.5f);
faluco@836
   262
			break;
faluco@836
   263
		}
faluco@836
   264
	}
faluco@836
   265
faluco@836
   266
	return static_cast<int>(val);
faluco@836
   267
}
faluco@836
   268
faluco@260
   269
REGISTER_NATIVES(floatnatives)
faluco@260
   270
{
faluco@260
   271
	{"float",			sm_float},
faluco@260
   272
	{"FloatMul",		sm_FloatMul},
faluco@260
   273
	{"FloatDiv",		sm_FloatDiv},
faluco@260
   274
	{"FloatAdd",		sm_FloatAdd},
faluco@260
   275
	{"FloatSub",		sm_FloatSub},
faluco@260
   276
	{"FloatFraction",	sm_FloatFraction},
faluco@831
   277
	{"RoundToZero",		sm_RoundToZero},
faluco@831
   278
	{"RoundToCeil",		sm_RoundToCeil},
faluco@831
   279
	{"RoundToFloor",	sm_RoundToFloor},
faluco@851
   280
	{"RoundToNearest",	sm_RoundToNearest},
faluco@260
   281
	{"FloatCompare",	sm_FloatCompare},
faluco@260
   282
	{"SquareRoot",		sm_SquareRoot},
faluco@260
   283
	{"Pow",				sm_Pow},
faluco@260
   284
	{"Exponential",		sm_Exponential},
faluco@260
   285
	{"Logarithm",		sm_Logarithm},
faluco@260
   286
	{"Sine",			sm_Sine},
faluco@260
   287
	{"Cosine",			sm_Cosine},
faluco@260
   288
	{"Tangent",			sm_Tangent},
faluco@260
   289
	{"FloatAbs",		sm_FloatAbs},
faluco@260
   290
	{"ArcTangent",		sm_ArcTangent},
faluco@260
   291
	{"ArcCosine",		sm_ArcCosine},
faluco@260
   292
	{"ArcSine",			sm_ArcSine},
faluco@260
   293
	{"ArcTangent2",		sm_ArcTangent2},
faluco@836
   294
	{"FloatRound",		sm_FloatRound},			/* Backwards compat shim */
faluco@260
   295
	{NULL,				NULL}
dvander@351
   296
};