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