4 #include "sp_vm_typeutil.h"
6 using namespace SourcePawn;
8 #define PI 3.14159265358979323846
10 inline float AngleToRadians(float val, int mode)
16 return (float)((val * PI) / 180.0);
20 return (float)((val * PI) / 200.0);
29 inline float RadiansToAngle(float val, int mode)
35 return (float)((val / PI) * 180.0);
39 return (float)((val / PI) * 200.0);
49 /****************************************
51 * FLOATING POINT NATIVE IMPLEMENTATIONS *
53 ****************************************/
56 static cell_t sm_float(IPluginContext *pCtx, const cell_t *params)
58 float val = static_cast<float>(params[1]);
63 static cell_t sm_floatabs(IPluginContext *pCtx, const cell_t *params)
65 float val = ctof(params[1]);
66 val = (val >= 0) ? val : -val;
71 static cell_t sm_floatadd(IPluginContext *pCtx, const cell_t *params)
73 float val = ctof(params[1]) + ctof(params[2]);
78 static cell_t sm_floatsub(IPluginContext *pCtx, const cell_t *params)
80 float val = ctof(params[1]) - ctof(params[2]);
85 static cell_t sm_floatmul(IPluginContext *pCtx, const cell_t *params)
87 float val = ctof(params[1]) * ctof(params[2]);
92 static cell_t sm_floatdiv(IPluginContext *pCtx, const cell_t *params)
94 float val = ctof(params[1]) / ctof(params[2]);
99 static cell_t sm_floatcmp(IPluginContext *pCtx, const cell_t *params)
101 float val1 = ctof(params[1]);
102 float val2 = ctof(params[2]);
107 } else if (val1 < val2) {
114 static cell_t sm_floatlog(IPluginContext *pCtx, const cell_t *params)
116 float val = ctof(params[1]);
117 float base = ctof(params[2]);
119 if ((val <= 0) || (base <= 0))
121 //:TODO: error out! logs cant take in negative numbers and log 0=-inf
127 val = log(val) / log(base);
133 static cell_t sm_floatexp(IPluginContext *pCtx, const cell_t *params)
135 float val = ctof(params[1]);
137 return ftoc(exp(val));
140 static cell_t sm_floatpower(IPluginContext *pCtx, const cell_t *params)
142 float base = ctof(params[1]);
143 float exponent = ctof(params[2]);
145 return ftoc(pow(base, exponent));
148 static cell_t sm_floatsqroot(IPluginContext *pCtx, const cell_t *params)
150 float val = ctof(params[1]);
154 //:TODO: error out! we dont support complex numbers
157 return ftoc(sqrt(val));
160 static cell_t sm_floatround(IPluginContext *pCtx, const cell_t *params)
162 float val = ctof(params[1]);
188 val = (float)floor(val + 0.5);
196 static cell_t sm_floatstr(IPluginContext *pCtx, const cell_t *params)
200 pCtx->LocalToString(params[1], &str);
206 return ftoc((float)atof(str));
209 static cell_t sm_floatfract(IPluginContext *pCtx, const cell_t *params)
211 float val = ctof(params[1]);
212 val = val - floor(val);
217 static cell_t sm_floatsin(IPluginContext *pCtx, const cell_t *params)
219 float val = ctof(params[1]);
220 val = sin(AngleToRadians(val, params[2]));
225 static cell_t sm_floatcos(IPluginContext *pCtx, const cell_t *params)
227 float val = ctof(params[1]);
228 val = cos(AngleToRadians(val, params[2]));
233 static cell_t sm_floattan(IPluginContext *pCtx, const cell_t *params)
235 float val = ctof(params[1]);
236 val = tan(AngleToRadians(val, params[2]));
241 static cell_t sm_floatasin(IPluginContext *pCtx, const cell_t *params)
243 float val = ctof(params[1]);
246 return ftoc(RadiansToAngle(val, params[2]));
249 static cell_t sm_floatacos(IPluginContext *pCtx, const cell_t *params)
251 float val = ctof(params[1]);
254 return ftoc(RadiansToAngle(val, params[2]));
257 static cell_t sm_floatatan(IPluginContext *pCtx, const cell_t *params)
259 float val = ctof(params[1]);
262 return ftoc(RadiansToAngle(val, params[2]));
265 static cell_t sm_floatatan2(IPluginContext *pCtx, const cell_t *params)
267 float val1 = ctof(params[1]);
268 float val2 = ctof(params[2]);
269 val1 = atan2(val1, val2);
271 return ftoc(RadiansToAngle(val1, params[3]));