core/smn_float.cpp
author David Anderson <dvander@alliedmods.net>
Fri Jan 26 02:04:07 2007 +0000 (2007-01-26)
changeset 373 bf3335acefdd
parent 370 d3a484f98f6d
child 432 77112e9620fa
permissions -rw-r--r--
added license headers to extensions
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>
faluco@225
    15
#include <string.h>
dvander@351
    16
#include <stdlib.h>
faluco@260
    17
#include "sm_autonatives.h"
faluco@225
    18
#include "sp_vm_api.h"
dvander@233
    19
#include "sp_typeutil.h"
faluco@225
    20
faluco@225
    21
using namespace SourcePawn;
faluco@225
    22
faluco@225
    23
/****************************************
faluco@225
    24
*                                       *
faluco@225
    25
* FLOATING POINT NATIVE IMPLEMENTATIONS *
faluco@225
    26
*                                       *
faluco@225
    27
****************************************/
faluco@225
    28
faluco@225
    29
faluco@225
    30
static cell_t sm_float(IPluginContext *pCtx, const cell_t *params)
faluco@225
    31
{
faluco@225
    32
	float val = static_cast<float>(params[1]);
faluco@225
    33
dvander@233
    34
	return sp_ftoc(val);
faluco@225
    35
}
faluco@225
    36
faluco@260
    37
static cell_t sm_FloatAbs(IPluginContext *pCtx, const cell_t *params)
faluco@225
    38
{
dvander@233
    39
	float val = sp_ctof(params[1]);
faluco@225
    40
	val = (val >= 0) ? val : -val;
faluco@225
    41
dvander@233
    42
	return sp_ftoc(val);
faluco@225
    43
}
faluco@225
    44
faluco@260
    45
static cell_t sm_FloatAdd(IPluginContext *pCtx, const cell_t *params)
faluco@225
    46
{
dvander@233
    47
	float val = sp_ctof(params[1]) + sp_ctof(params[2]);
faluco@225
    48
dvander@233
    49
	return sp_ftoc(val);
faluco@225
    50
}
faluco@225
    51
faluco@260
    52
static cell_t sm_FloatSub(IPluginContext *pCtx, const cell_t *params)
faluco@225
    53
{
dvander@233
    54
	float val = sp_ctof(params[1]) - sp_ctof(params[2]);
faluco@225
    55
dvander@233
    56
	return sp_ftoc(val);
faluco@225
    57
}
faluco@225
    58
faluco@260
    59
static cell_t sm_FloatMul(IPluginContext *pCtx, const cell_t *params)
faluco@225
    60
{
dvander@233
    61
	float val = sp_ctof(params[1]) * sp_ctof(params[2]);
faluco@225
    62
dvander@233
    63
	return sp_ftoc(val);
faluco@225
    64
}
faluco@225
    65
faluco@260
    66
static cell_t sm_FloatDiv(IPluginContext *pCtx, const cell_t *params)
faluco@225
    67
{
dvander@233
    68
	float val = sp_ctof(params[1]) / sp_ctof(params[2]);
faluco@225
    69
dvander@233
    70
	return sp_ftoc(val);
faluco@225
    71
}
faluco@225
    72
faluco@260
    73
static cell_t sm_FloatCompare(IPluginContext *pCtx, const cell_t *params)
faluco@225
    74
{
dvander@233
    75
	float val1 = sp_ctof(params[1]);
dvander@233
    76
	float val2 = sp_ctof(params[2]);
faluco@225
    77
faluco@225
    78
	if (val1 > val2)
faluco@225
    79
	{
faluco@225
    80
		return 1;
faluco@225
    81
	} else if (val1 < val2) {
faluco@225
    82
		return -1;
faluco@225
    83
	}
faluco@225
    84
faluco@225
    85
	return 0;
faluco@225
    86
}
faluco@225
    87
faluco@260
    88
static cell_t sm_Logarithm(IPluginContext *pCtx, const cell_t *params)
faluco@225
    89
{
dvander@233
    90
	float val = sp_ctof(params[1]);
dvander@233
    91
	float base = sp_ctof(params[2]);
faluco@225
    92
faluco@225
    93
	if ((val <= 0) || (base <= 0))
faluco@225
    94
	{
faluco@260
    95
		return pCtx->ThrowNativeError("Cannot evaluate the logarithm of zero or a negative number (val:%f base:%f).", val, base);
faluco@225
    96
	}
faluco@225
    97
	if (base == 10.0)
faluco@225
    98
	{
faluco@225
    99
		val = log10(val);
faluco@225
   100
	} else {
faluco@225
   101
		val = log(val) / log(base);
faluco@225
   102
	}
faluco@225
   103
dvander@233
   104
	return sp_ftoc(val);
faluco@225
   105
}
faluco@225
   106
faluco@260
   107
static cell_t sm_Exponential(IPluginContext *pCtx, const cell_t *params)
faluco@225
   108
{
dvander@233
   109
	float val = sp_ctof(params[1]);
faluco@225
   110
dvander@233
   111
	return sp_ftoc(exp(val));
faluco@225
   112
}
faluco@225
   113
faluco@260
   114
static cell_t sm_Pow(IPluginContext *pCtx, const cell_t *params)
faluco@225
   115
{
dvander@233
   116
	float base = sp_ctof(params[1]);
dvander@233
   117
	float exponent = sp_ctof(params[2]);
faluco@225
   118
dvander@233
   119
	return sp_ftoc(pow(base, exponent));
faluco@225
   120
}
faluco@225
   121
faluco@260
   122
static cell_t sm_SquareRoot(IPluginContext *pCtx, const cell_t *params)
faluco@225
   123
{
dvander@233
   124
	float val = sp_ctof(params[1]);
faluco@225
   125
faluco@225
   126
	if (val < 0.0)
faluco@225
   127
	{
faluco@260
   128
		return pCtx->ThrowNativeError("Cannot evaluate the square root of a negative number (val:%f).", val);
faluco@225
   129
	}
faluco@225
   130
dvander@233
   131
	return sp_ftoc(sqrt(val));
faluco@225
   132
}
faluco@225
   133
faluco@260
   134
static cell_t sm_FloatRound(IPluginContext *pCtx, const cell_t *params)
faluco@225
   135
{
dvander@233
   136
	float val = sp_ctof(params[1]);
faluco@225
   137
faluco@225
   138
	switch (params[2])
faluco@225
   139
	{
faluco@225
   140
	case 1:
faluco@225
   141
		{
faluco@225
   142
			val = floor(val);
faluco@225
   143
			break;
faluco@225
   144
		}
faluco@225
   145
	case 2:
faluco@225
   146
		{
faluco@225
   147
			val = ceil(val);
faluco@225
   148
			break;
faluco@225
   149
		}
faluco@225
   150
	case 3:
faluco@225
   151
		{
faluco@225
   152
			if (val >= 0.0)
faluco@225
   153
			{
faluco@225
   154
				val = floor(val);
faluco@225
   155
			} else {
faluco@225
   156
				val = ceil(val);
faluco@225
   157
			}
faluco@225
   158
			break;
faluco@225
   159
		}
faluco@225
   160
	default:
faluco@225
   161
		{
faluco@225
   162
			val = (float)floor(val + 0.5);
faluco@225
   163
			break;
faluco@225
   164
		}
faluco@225
   165
	}
faluco@225
   166
faluco@242
   167
	return static_cast<int>(val);
faluco@225
   168
}
faluco@225
   169
faluco@260
   170
static cell_t sm_FloatStr(IPluginContext *pCtx, const cell_t *params)
faluco@225
   171
{
faluco@225
   172
	char *str;
faluco@225
   173
faluco@225
   174
	pCtx->LocalToString(params[1], &str);
faluco@225
   175
	if (!strlen(str))
faluco@225
   176
	{
faluco@225
   177
		return 0;
faluco@225
   178
	}
faluco@225
   179
dvander@233
   180
	return sp_ftoc((float)atof(str));
faluco@225
   181
}
faluco@225
   182
faluco@260
   183
static cell_t sm_FloatFraction(IPluginContext *pCtx, const cell_t *params)
faluco@225
   184
{
dvander@233
   185
	float val = sp_ctof(params[1]);
faluco@225
   186
	val = val - floor(val);
faluco@225
   187
dvander@233
   188
	return sp_ftoc(val);
faluco@225
   189
}
faluco@225
   190
faluco@260
   191
static cell_t sm_Sine(IPluginContext *pCtx, const cell_t *params)
faluco@225
   192
{
dvander@233
   193
	float val = sp_ctof(params[1]);
faluco@235
   194
	val = sin(val);
faluco@225
   195
dvander@233
   196
	return sp_ftoc(val);
faluco@225
   197
}
faluco@225
   198
faluco@260
   199
static cell_t sm_Cosine(IPluginContext *pCtx, const cell_t *params)
faluco@225
   200
{
dvander@233
   201
	float val = sp_ctof(params[1]);
faluco@235
   202
	val = cos(val);
faluco@225
   203
dvander@233
   204
	return sp_ftoc(val);
faluco@225
   205
}
faluco@225
   206
faluco@260
   207
static cell_t sm_Tangent(IPluginContext *pCtx, const cell_t *params)
faluco@225
   208
{
dvander@233
   209
	float val = sp_ctof(params[1]);
faluco@235
   210
	val = tan(val);
faluco@225
   211
dvander@233
   212
	return sp_ftoc(val);
faluco@225
   213
}
faluco@225
   214
faluco@260
   215
static cell_t sm_ArcSine(IPluginContext *pCtx, const cell_t *params)
faluco@225
   216
{
dvander@233
   217
	float val = sp_ctof(params[1]);
faluco@225
   218
	val = asin(val);
faluco@225
   219
faluco@235
   220
	return sp_ftoc(val);
faluco@225
   221
}
faluco@225
   222
faluco@260
   223
static cell_t sm_ArcCosine(IPluginContext *pCtx, const cell_t *params)
faluco@225
   224
{
dvander@233
   225
	float val = sp_ctof(params[1]);
faluco@225
   226
	val = acos(val);
faluco@225
   227
faluco@235
   228
	return sp_ftoc(val);
faluco@225
   229
}
faluco@225
   230
faluco@260
   231
static cell_t sm_ArcTangent(IPluginContext *pCtx, const cell_t *params)
faluco@225
   232
{
dvander@233
   233
	float val = sp_ctof(params[1]);
faluco@225
   234
	val = atan(val);
faluco@225
   235
faluco@235
   236
	return sp_ftoc(val);
faluco@225
   237
}
faluco@225
   238
faluco@260
   239
static cell_t sm_ArcTangent2(IPluginContext *pCtx, const cell_t *params)
faluco@225
   240
{
dvander@233
   241
	float val1 = sp_ctof(params[1]);
dvander@233
   242
	float val2 = sp_ctof(params[2]);
faluco@225
   243
	val1 = atan2(val1, val2);
faluco@225
   244
faluco@235
   245
	return sp_ftoc(val1);
faluco@225
   246
}
faluco@260
   247
faluco@260
   248
REGISTER_NATIVES(floatnatives)
faluco@260
   249
{
faluco@260
   250
	{"float",			sm_float},
faluco@260
   251
	{"FloatStr",		sm_FloatStr},
faluco@260
   252
	{"FloatMul",		sm_FloatMul},
faluco@260
   253
	{"FloatDiv",		sm_FloatDiv},
faluco@260
   254
	{"FloatAdd",		sm_FloatAdd},
faluco@260
   255
	{"FloatSub",		sm_FloatSub},
faluco@260
   256
	{"FloatFraction",	sm_FloatFraction},
faluco@260
   257
	{"FloatRound",		sm_FloatRound},
faluco@260
   258
	{"FloatCompare",	sm_FloatCompare},
faluco@260
   259
	{"SquareRoot",		sm_SquareRoot},
faluco@260
   260
	{"Pow",				sm_Pow},
faluco@260
   261
	{"Exponential",		sm_Exponential},
faluco@260
   262
	{"Logarithm",		sm_Logarithm},
faluco@260
   263
	{"Sine",			sm_Sine},
faluco@260
   264
	{"Cosine",			sm_Cosine},
faluco@260
   265
	{"Tangent",			sm_Tangent},
faluco@260
   266
	{"FloatAbs",		sm_FloatAbs},
faluco@260
   267
	{"ArcTangent",		sm_ArcTangent},
faluco@260
   268
	{"ArcCosine",		sm_ArcCosine},
faluco@260
   269
	{"ArcSine",			sm_ArcSine},
faluco@260
   270
	{"ArcTangent2",		sm_ArcTangent2},
faluco@260
   271
	{NULL,				NULL}
dvander@351
   272
};