core/smn_float.cpp
author Borja Ferrer <faluco@alliedmods.net>
Thu Dec 28 00:48:09 2006 +0000 (2006-12-28)
changeset 226 4663ea3fc2d3
parent 225 dd5851605e26
child 233 968f92668138
permissions -rw-r--r--
Added PlayerManager basic hookings
Moved ftoc and ctof to an utility file
Added some more string natives
faluco@225
     1
#include <math.h>
faluco@225
     2
#include <string.h>
faluco@225
     3
#include "sp_vm_api.h"
faluco@226
     4
#include "sp_vm_typeutil.h"
faluco@225
     5
faluco@225
     6
using namespace SourcePawn;
faluco@225
     7
faluco@225
     8
#define PI 3.14159265358979323846
faluco@225
     9
faluco@225
    10
inline float AngleToRadians(float val, int mode)
faluco@225
    11
{
faluco@225
    12
	switch (mode)
faluco@225
    13
	{
faluco@225
    14
	case 1:
faluco@225
    15
		{
faluco@225
    16
			return (float)((val * PI) / 180.0);
faluco@225
    17
		}
faluco@225
    18
	case 2:
faluco@225
    19
		{
faluco@225
    20
			return (float)((val * PI) / 200.0);
faluco@225
    21
		}
faluco@225
    22
	default:
faluco@225
    23
		{
faluco@225
    24
			return val;
faluco@225
    25
		}
faluco@225
    26
	}
faluco@225
    27
}
faluco@225
    28
faluco@225
    29
inline float RadiansToAngle(float val, int mode)
faluco@225
    30
{
faluco@225
    31
	switch (mode)
faluco@225
    32
	{
faluco@225
    33
	case 1:
faluco@225
    34
		{
faluco@225
    35
			return (float)((val / PI) * 180.0);
faluco@225
    36
		}
faluco@225
    37
	case 2:
faluco@225
    38
		{
faluco@225
    39
			return (float)((val / PI) * 200.0);
faluco@225
    40
		}
faluco@225
    41
	default:
faluco@225
    42
		{
faluco@225
    43
			return val;
faluco@225
    44
		}
faluco@225
    45
	}
faluco@225
    46
}
faluco@225
    47
faluco@225
    48
faluco@225
    49
/****************************************
faluco@225
    50
*                                       *
faluco@225
    51
* FLOATING POINT NATIVE IMPLEMENTATIONS *
faluco@225
    52
*                                       *
faluco@225
    53
****************************************/
faluco@225
    54
faluco@225
    55
faluco@225
    56
static cell_t sm_float(IPluginContext *pCtx, const cell_t *params)
faluco@225
    57
{
faluco@225
    58
	float val = static_cast<float>(params[1]);
faluco@225
    59
faluco@225
    60
	return ftoc(val);
faluco@225
    61
}
faluco@225
    62
faluco@225
    63
static cell_t sm_floatabs(IPluginContext *pCtx, const cell_t *params)
faluco@225
    64
{
faluco@225
    65
	float val = ctof(params[1]);
faluco@225
    66
	val = (val >= 0) ? val : -val;
faluco@225
    67
faluco@225
    68
	return ftoc(val);
faluco@225
    69
}
faluco@225
    70
faluco@225
    71
static cell_t sm_floatadd(IPluginContext *pCtx, const cell_t *params)
faluco@225
    72
{
faluco@225
    73
	float val = ctof(params[1]) + ctof(params[2]);
faluco@225
    74
faluco@225
    75
	return ftoc(val);
faluco@225
    76
}
faluco@225
    77
faluco@225
    78
static cell_t sm_floatsub(IPluginContext *pCtx, const cell_t *params)
faluco@225
    79
{
faluco@225
    80
	float val = ctof(params[1]) - ctof(params[2]);
faluco@225
    81
faluco@225
    82
	return ftoc(val);
faluco@225
    83
}
faluco@225
    84
faluco@225
    85
static cell_t sm_floatmul(IPluginContext *pCtx, const cell_t *params)
faluco@225
    86
{
faluco@225
    87
	float val = ctof(params[1]) * ctof(params[2]);
faluco@225
    88
faluco@225
    89
	return ftoc(val);
faluco@225
    90
}
faluco@225
    91
faluco@225
    92
static cell_t sm_floatdiv(IPluginContext *pCtx, const cell_t *params)
faluco@225
    93
{
faluco@225
    94
	float val = ctof(params[1]) / ctof(params[2]);
faluco@225
    95
faluco@225
    96
	return ftoc(val);
faluco@225
    97
}
faluco@225
    98
faluco@225
    99
static cell_t sm_floatcmp(IPluginContext *pCtx, const cell_t *params)
faluco@225
   100
{
faluco@225
   101
	float val1 = ctof(params[1]);
faluco@225
   102
	float val2 = ctof(params[2]);
faluco@225
   103
faluco@225
   104
	if (val1 > val2)
faluco@225
   105
	{
faluco@225
   106
		return 1;
faluco@225
   107
	} else if (val1 < val2) {
faluco@225
   108
		return -1;
faluco@225
   109
	}
faluco@225
   110
faluco@225
   111
	return 0;
faluco@225
   112
}
faluco@225
   113
faluco@225
   114
static cell_t sm_floatlog(IPluginContext *pCtx, const cell_t *params)
faluco@225
   115
{
faluco@225
   116
	float val = ctof(params[1]);
faluco@225
   117
	float base = ctof(params[2]);
faluco@225
   118
faluco@225
   119
	if ((val <= 0) || (base <= 0))
faluco@225
   120
	{
faluco@225
   121
		//:TODO: error out! logs cant take in negative numbers and log 0=-inf
faluco@225
   122
	}
faluco@225
   123
	if (base == 10.0)
faluco@225
   124
	{
faluco@225
   125
		val = log10(val);
faluco@225
   126
	} else {
faluco@225
   127
		val = log(val) / log(base);
faluco@225
   128
	}
faluco@225
   129
faluco@225
   130
	return ftoc(val);
faluco@225
   131
}
faluco@225
   132
faluco@225
   133
static cell_t sm_floatexp(IPluginContext *pCtx, const cell_t *params)
faluco@225
   134
{
faluco@225
   135
	float val = ctof(params[1]);
faluco@225
   136
faluco@225
   137
	return ftoc(exp(val));
faluco@225
   138
}
faluco@225
   139
faluco@225
   140
static cell_t sm_floatpower(IPluginContext *pCtx, const cell_t *params)
faluco@225
   141
{
faluco@225
   142
	float base = ctof(params[1]);
faluco@225
   143
	float exponent = ctof(params[2]);
faluco@225
   144
faluco@225
   145
	return ftoc(pow(base, exponent));
faluco@225
   146
}
faluco@225
   147
faluco@225
   148
static cell_t sm_floatsqroot(IPluginContext *pCtx, const cell_t *params)
faluco@225
   149
{
faluco@225
   150
	float val = ctof(params[1]);
faluco@225
   151
faluco@225
   152
	if (val < 0.0)
faluco@225
   153
	{
faluco@225
   154
		//:TODO: error out! we dont support complex numbers
faluco@225
   155
	}
faluco@225
   156
faluco@225
   157
	return ftoc(sqrt(val));
faluco@225
   158
}
faluco@225
   159
faluco@225
   160
static cell_t sm_floatround(IPluginContext *pCtx, const cell_t *params)
faluco@225
   161
{
faluco@225
   162
	float val = ctof(params[1]);
faluco@225
   163
faluco@225
   164
	switch (params[2])
faluco@225
   165
	{
faluco@225
   166
	case 1:
faluco@225
   167
		{
faluco@225
   168
			val = floor(val);
faluco@225
   169
			break;
faluco@225
   170
		}
faluco@225
   171
	case 2:
faluco@225
   172
		{
faluco@225
   173
			val = ceil(val);
faluco@225
   174
			break;
faluco@225
   175
		}
faluco@225
   176
	case 3:
faluco@225
   177
		{
faluco@225
   178
			if (val >= 0.0)
faluco@225
   179
			{
faluco@225
   180
				val = floor(val);
faluco@225
   181
			} else {
faluco@225
   182
				val = ceil(val);
faluco@225
   183
			}
faluco@225
   184
			break;
faluco@225
   185
		}
faluco@225
   186
	default:
faluco@225
   187
		{
faluco@225
   188
			val = (float)floor(val + 0.5);
faluco@225
   189
			break;
faluco@225
   190
		}
faluco@225
   191
	}
faluco@225
   192
faluco@225
   193
	return ftoc(val);
faluco@225
   194
}
faluco@225
   195
faluco@225
   196
static cell_t sm_floatstr(IPluginContext *pCtx, const cell_t *params)
faluco@225
   197
{
faluco@225
   198
	char *str;
faluco@225
   199
faluco@225
   200
	pCtx->LocalToString(params[1], &str);
faluco@225
   201
	if (!strlen(str))
faluco@225
   202
	{
faluco@225
   203
		return 0;
faluco@225
   204
	}
faluco@225
   205
faluco@225
   206
	return ftoc((float)atof(str));
faluco@225
   207
}
faluco@225
   208
faluco@225
   209
static cell_t sm_floatfract(IPluginContext *pCtx, const cell_t *params)
faluco@225
   210
{
faluco@225
   211
	float val = ctof(params[1]);
faluco@225
   212
	val = val - floor(val);
faluco@225
   213
faluco@225
   214
	return ftoc(val);
faluco@225
   215
}
faluco@225
   216
faluco@225
   217
static cell_t sm_floatsin(IPluginContext *pCtx, const cell_t *params)
faluco@225
   218
{
faluco@225
   219
	float val = ctof(params[1]);
faluco@225
   220
	val = sin(AngleToRadians(val, params[2]));
faluco@225
   221
faluco@225
   222
	return ftoc(val);
faluco@225
   223
}
faluco@225
   224
faluco@225
   225
static cell_t sm_floatcos(IPluginContext *pCtx, const cell_t *params)
faluco@225
   226
{
faluco@225
   227
	float val = ctof(params[1]);
faluco@225
   228
	val = cos(AngleToRadians(val, params[2]));
faluco@225
   229
faluco@225
   230
	return ftoc(val);
faluco@225
   231
}
faluco@225
   232
faluco@225
   233
static cell_t sm_floattan(IPluginContext *pCtx, const cell_t *params)
faluco@225
   234
{
faluco@225
   235
	float val = ctof(params[1]);
faluco@225
   236
	val = tan(AngleToRadians(val, params[2]));
faluco@225
   237
faluco@225
   238
	return ftoc(val);
faluco@225
   239
}
faluco@225
   240
faluco@225
   241
static cell_t sm_floatasin(IPluginContext *pCtx, const cell_t *params)
faluco@225
   242
{
faluco@225
   243
	float val = ctof(params[1]);
faluco@225
   244
	val = asin(val);
faluco@225
   245
faluco@225
   246
	return ftoc(RadiansToAngle(val, params[2]));
faluco@225
   247
}
faluco@225
   248
faluco@225
   249
static cell_t sm_floatacos(IPluginContext *pCtx, const cell_t *params)
faluco@225
   250
{
faluco@225
   251
	float val = ctof(params[1]);
faluco@225
   252
	val = acos(val);
faluco@225
   253
faluco@225
   254
	return ftoc(RadiansToAngle(val, params[2]));
faluco@225
   255
}
faluco@225
   256
faluco@225
   257
static cell_t sm_floatatan(IPluginContext *pCtx, const cell_t *params)
faluco@225
   258
{
faluco@225
   259
	float val = ctof(params[1]);
faluco@225
   260
	val = atan(val);
faluco@225
   261
faluco@225
   262
	return ftoc(RadiansToAngle(val, params[2]));
faluco@225
   263
}
faluco@225
   264
faluco@225
   265
static cell_t sm_floatatan2(IPluginContext *pCtx, const cell_t *params)
faluco@225
   266
{
faluco@225
   267
	float val1 = ctof(params[1]);
faluco@225
   268
	float val2 = ctof(params[2]);
faluco@225
   269
	val1 = atan2(val1, val2);
faluco@225
   270
faluco@225
   271
	return ftoc(RadiansToAngle(val1, params[3]));
faluco@225
   272
}