core/smn_float.cpp
author Borja Ferrer <faluco@alliedmods.net>
Mon Jan 01 03:33:14 2007 +0000 (2007-01-01)
changeset 242 9dcd59d9014a
parent 235 3bf937e72b4d
child 248 6ef6d19934fe
permissions -rw-r--r--
Added CPlayer class
Added new player natives
Fixed floatround returning a float instead of an int
Added new float.inc file
Added OnClientSettingsChanged forward
faluco@225
     1
#include <math.h>
faluco@225
     2
#include <string.h>
faluco@225
     3
#include "sp_vm_api.h"
dvander@233
     4
#include "sp_typeutil.h"
faluco@225
     5
faluco@225
     6
using namespace SourcePawn;
faluco@225
     7
faluco@225
     8
faluco@225
     9
/****************************************
faluco@225
    10
*                                       *
faluco@225
    11
* FLOATING POINT NATIVE IMPLEMENTATIONS *
faluco@225
    12
*                                       *
faluco@225
    13
****************************************/
faluco@225
    14
faluco@225
    15
faluco@225
    16
static cell_t sm_float(IPluginContext *pCtx, const cell_t *params)
faluco@225
    17
{
faluco@225
    18
	float val = static_cast<float>(params[1]);
faluco@225
    19
dvander@233
    20
	return sp_ftoc(val);
faluco@225
    21
}
faluco@225
    22
faluco@225
    23
static cell_t sm_floatabs(IPluginContext *pCtx, const cell_t *params)
faluco@225
    24
{
dvander@233
    25
	float val = sp_ctof(params[1]);
faluco@225
    26
	val = (val >= 0) ? val : -val;
faluco@225
    27
dvander@233
    28
	return sp_ftoc(val);
faluco@225
    29
}
faluco@225
    30
faluco@225
    31
static cell_t sm_floatadd(IPluginContext *pCtx, const cell_t *params)
faluco@225
    32
{
dvander@233
    33
	float val = sp_ctof(params[1]) + sp_ctof(params[2]);
faluco@225
    34
dvander@233
    35
	return sp_ftoc(val);
faluco@225
    36
}
faluco@225
    37
faluco@225
    38
static cell_t sm_floatsub(IPluginContext *pCtx, const cell_t *params)
faluco@225
    39
{
dvander@233
    40
	float val = sp_ctof(params[1]) - sp_ctof(params[2]);
faluco@225
    41
dvander@233
    42
	return sp_ftoc(val);
faluco@225
    43
}
faluco@225
    44
faluco@225
    45
static cell_t sm_floatmul(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@225
    52
static cell_t sm_floatdiv(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@225
    59
static cell_t sm_floatcmp(IPluginContext *pCtx, const cell_t *params)
faluco@225
    60
{
dvander@233
    61
	float val1 = sp_ctof(params[1]);
dvander@233
    62
	float val2 = sp_ctof(params[2]);
faluco@225
    63
faluco@225
    64
	if (val1 > val2)
faluco@225
    65
	{
faluco@225
    66
		return 1;
faluco@225
    67
	} else if (val1 < val2) {
faluco@225
    68
		return -1;
faluco@225
    69
	}
faluco@225
    70
faluco@225
    71
	return 0;
faluco@225
    72
}
faluco@225
    73
faluco@225
    74
static cell_t sm_floatlog(IPluginContext *pCtx, const cell_t *params)
faluco@225
    75
{
dvander@233
    76
	float val = sp_ctof(params[1]);
dvander@233
    77
	float base = sp_ctof(params[2]);
faluco@225
    78
faluco@225
    79
	if ((val <= 0) || (base <= 0))
faluco@225
    80
	{
faluco@225
    81
		//:TODO: error out! logs cant take in negative numbers and log 0=-inf
faluco@225
    82
	}
faluco@225
    83
	if (base == 10.0)
faluco@225
    84
	{
faluco@225
    85
		val = log10(val);
faluco@225
    86
	} else {
faluco@225
    87
		val = log(val) / log(base);
faluco@225
    88
	}
faluco@225
    89
dvander@233
    90
	return sp_ftoc(val);
faluco@225
    91
}
faluco@225
    92
faluco@225
    93
static cell_t sm_floatexp(IPluginContext *pCtx, const cell_t *params)
faluco@225
    94
{
dvander@233
    95
	float val = sp_ctof(params[1]);
faluco@225
    96
dvander@233
    97
	return sp_ftoc(exp(val));
faluco@225
    98
}
faluco@225
    99
faluco@225
   100
static cell_t sm_floatpower(IPluginContext *pCtx, const cell_t *params)
faluco@225
   101
{
dvander@233
   102
	float base = sp_ctof(params[1]);
dvander@233
   103
	float exponent = sp_ctof(params[2]);
faluco@225
   104
dvander@233
   105
	return sp_ftoc(pow(base, exponent));
faluco@225
   106
}
faluco@225
   107
faluco@225
   108
static cell_t sm_floatsqroot(IPluginContext *pCtx, const cell_t *params)
faluco@225
   109
{
dvander@233
   110
	float val = sp_ctof(params[1]);
faluco@225
   111
faluco@225
   112
	if (val < 0.0)
faluco@225
   113
	{
faluco@225
   114
		//:TODO: error out! we dont support complex numbers
faluco@225
   115
	}
faluco@225
   116
dvander@233
   117
	return sp_ftoc(sqrt(val));
faluco@225
   118
}
faluco@225
   119
faluco@225
   120
static cell_t sm_floatround(IPluginContext *pCtx, const cell_t *params)
faluco@225
   121
{
dvander@233
   122
	float val = sp_ctof(params[1]);
faluco@225
   123
faluco@225
   124
	switch (params[2])
faluco@225
   125
	{
faluco@225
   126
	case 1:
faluco@225
   127
		{
faluco@225
   128
			val = floor(val);
faluco@225
   129
			break;
faluco@225
   130
		}
faluco@225
   131
	case 2:
faluco@225
   132
		{
faluco@225
   133
			val = ceil(val);
faluco@225
   134
			break;
faluco@225
   135
		}
faluco@225
   136
	case 3:
faluco@225
   137
		{
faluco@225
   138
			if (val >= 0.0)
faluco@225
   139
			{
faluco@225
   140
				val = floor(val);
faluco@225
   141
			} else {
faluco@225
   142
				val = ceil(val);
faluco@225
   143
			}
faluco@225
   144
			break;
faluco@225
   145
		}
faluco@225
   146
	default:
faluco@225
   147
		{
faluco@225
   148
			val = (float)floor(val + 0.5);
faluco@225
   149
			break;
faluco@225
   150
		}
faluco@225
   151
	}
faluco@225
   152
faluco@242
   153
	return static_cast<int>(val);
faluco@225
   154
}
faluco@225
   155
faluco@225
   156
static cell_t sm_floatstr(IPluginContext *pCtx, const cell_t *params)
faluco@225
   157
{
faluco@225
   158
	char *str;
faluco@225
   159
faluco@225
   160
	pCtx->LocalToString(params[1], &str);
faluco@225
   161
	if (!strlen(str))
faluco@225
   162
	{
faluco@225
   163
		return 0;
faluco@225
   164
	}
faluco@225
   165
dvander@233
   166
	return sp_ftoc((float)atof(str));
faluco@225
   167
}
faluco@225
   168
faluco@225
   169
static cell_t sm_floatfract(IPluginContext *pCtx, const cell_t *params)
faluco@225
   170
{
dvander@233
   171
	float val = sp_ctof(params[1]);
faluco@225
   172
	val = val - floor(val);
faluco@225
   173
dvander@233
   174
	return sp_ftoc(val);
faluco@225
   175
}
faluco@225
   176
faluco@225
   177
static cell_t sm_floatsin(IPluginContext *pCtx, const cell_t *params)
faluco@225
   178
{
dvander@233
   179
	float val = sp_ctof(params[1]);
faluco@235
   180
	val = sin(val);
faluco@225
   181
dvander@233
   182
	return sp_ftoc(val);
faluco@225
   183
}
faluco@225
   184
faluco@225
   185
static cell_t sm_floatcos(IPluginContext *pCtx, const cell_t *params)
faluco@225
   186
{
dvander@233
   187
	float val = sp_ctof(params[1]);
faluco@235
   188
	val = cos(val);
faluco@225
   189
dvander@233
   190
	return sp_ftoc(val);
faluco@225
   191
}
faluco@225
   192
faluco@225
   193
static cell_t sm_floattan(IPluginContext *pCtx, const cell_t *params)
faluco@225
   194
{
dvander@233
   195
	float val = sp_ctof(params[1]);
faluco@235
   196
	val = tan(val);
faluco@225
   197
dvander@233
   198
	return sp_ftoc(val);
faluco@225
   199
}
faluco@225
   200
faluco@225
   201
static cell_t sm_floatasin(IPluginContext *pCtx, const cell_t *params)
faluco@225
   202
{
dvander@233
   203
	float val = sp_ctof(params[1]);
faluco@225
   204
	val = asin(val);
faluco@225
   205
faluco@235
   206
	return sp_ftoc(val);
faluco@225
   207
}
faluco@225
   208
faluco@225
   209
static cell_t sm_floatacos(IPluginContext *pCtx, const cell_t *params)
faluco@225
   210
{
dvander@233
   211
	float val = sp_ctof(params[1]);
faluco@225
   212
	val = acos(val);
faluco@225
   213
faluco@235
   214
	return sp_ftoc(val);
faluco@225
   215
}
faluco@225
   216
faluco@225
   217
static cell_t sm_floatatan(IPluginContext *pCtx, const cell_t *params)
faluco@225
   218
{
dvander@233
   219
	float val = sp_ctof(params[1]);
faluco@225
   220
	val = atan(val);
faluco@225
   221
faluco@235
   222
	return sp_ftoc(val);
faluco@225
   223
}
faluco@225
   224
faluco@225
   225
static cell_t sm_floatatan2(IPluginContext *pCtx, const cell_t *params)
faluco@225
   226
{
dvander@233
   227
	float val1 = sp_ctof(params[1]);
dvander@233
   228
	float val2 = sp_ctof(params[2]);
faluco@225
   229
	val1 = atan2(val1, val2);
faluco@225
   230
faluco@235
   231
	return sp_ftoc(val1);
faluco@225
   232
}