dvander@370: /** dvander@370: * =============================================================== dvander@370: * SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved. dvander@370: * =============================================================== dvander@370: * dvander@370: * This file is not open source and may not be copied without explicit dvander@370: * written permission of AlliedModders LLC. This file may not be redistributed dvander@370: * in whole or significant part. dvander@370: * For information, see LICENSE.txt or http://www.sourcemod.net/license.php dvander@370: * dvander@370: * Version: $Id$ dvander@370: */ dvander@370: faluco@225: #include dvander@464: #include dvander@464: #include ds@432: #include "sm_globals.h" faluco@225: faluco@225: /**************************************** faluco@225: * * faluco@225: * FLOATING POINT NATIVE IMPLEMENTATIONS * faluco@225: * * faluco@225: ****************************************/ faluco@225: faluco@225: faluco@225: static cell_t sm_float(IPluginContext *pCtx, const cell_t *params) faluco@225: { faluco@225: float val = static_cast(params[1]); faluco@225: dvander@233: return sp_ftoc(val); faluco@225: } faluco@225: faluco@260: static cell_t sm_FloatAbs(IPluginContext *pCtx, const cell_t *params) faluco@225: { dvander@233: float val = sp_ctof(params[1]); faluco@225: val = (val >= 0) ? val : -val; faluco@225: dvander@233: return sp_ftoc(val); faluco@225: } faluco@225: faluco@260: static cell_t sm_FloatAdd(IPluginContext *pCtx, const cell_t *params) faluco@225: { dvander@233: float val = sp_ctof(params[1]) + sp_ctof(params[2]); faluco@225: dvander@233: return sp_ftoc(val); faluco@225: } faluco@225: faluco@260: static cell_t sm_FloatSub(IPluginContext *pCtx, const cell_t *params) faluco@225: { dvander@233: float val = sp_ctof(params[1]) - sp_ctof(params[2]); faluco@225: dvander@233: return sp_ftoc(val); faluco@225: } faluco@225: faluco@260: static cell_t sm_FloatMul(IPluginContext *pCtx, const cell_t *params) faluco@225: { dvander@233: float val = sp_ctof(params[1]) * sp_ctof(params[2]); faluco@225: dvander@233: return sp_ftoc(val); faluco@225: } faluco@225: faluco@260: static cell_t sm_FloatDiv(IPluginContext *pCtx, const cell_t *params) faluco@225: { dvander@233: float val = sp_ctof(params[1]) / sp_ctof(params[2]); faluco@225: dvander@233: return sp_ftoc(val); faluco@225: } faluco@225: faluco@260: static cell_t sm_FloatCompare(IPluginContext *pCtx, const cell_t *params) faluco@225: { dvander@233: float val1 = sp_ctof(params[1]); dvander@233: float val2 = sp_ctof(params[2]); faluco@225: faluco@225: if (val1 > val2) faluco@225: { faluco@225: return 1; faluco@225: } else if (val1 < val2) { faluco@225: return -1; faluco@225: } faluco@225: faluco@225: return 0; faluco@225: } faluco@225: faluco@260: static cell_t sm_Logarithm(IPluginContext *pCtx, const cell_t *params) faluco@225: { dvander@233: float val = sp_ctof(params[1]); dvander@233: float base = sp_ctof(params[2]); faluco@225: faluco@225: if ((val <= 0) || (base <= 0)) faluco@225: { ds@470: return pCtx->ThrowNativeError("Cannot evaluate the logarithm of zero or a negative number (val:%f base:%f)", val, base); faluco@225: } faluco@225: if (base == 10.0) faluco@225: { faluco@225: val = log10(val); faluco@225: } else { faluco@225: val = log(val) / log(base); faluco@225: } faluco@225: dvander@233: return sp_ftoc(val); faluco@225: } faluco@225: faluco@260: static cell_t sm_Exponential(IPluginContext *pCtx, const cell_t *params) faluco@225: { dvander@233: float val = sp_ctof(params[1]); faluco@225: dvander@233: return sp_ftoc(exp(val)); faluco@225: } faluco@225: faluco@260: static cell_t sm_Pow(IPluginContext *pCtx, const cell_t *params) faluco@225: { dvander@233: float base = sp_ctof(params[1]); dvander@233: float exponent = sp_ctof(params[2]); faluco@225: dvander@233: return sp_ftoc(pow(base, exponent)); faluco@225: } faluco@225: faluco@260: static cell_t sm_SquareRoot(IPluginContext *pCtx, const cell_t *params) faluco@225: { dvander@233: float val = sp_ctof(params[1]); faluco@225: faluco@225: if (val < 0.0) faluco@225: { ds@470: return pCtx->ThrowNativeError("Cannot evaluate the square root of a negative number (val:%f)", val); faluco@225: } faluco@225: dvander@233: return sp_ftoc(sqrt(val)); faluco@225: } faluco@225: faluco@260: static cell_t sm_FloatRound(IPluginContext *pCtx, const cell_t *params) faluco@225: { dvander@233: float val = sp_ctof(params[1]); faluco@225: faluco@225: switch (params[2]) faluco@225: { faluco@225: case 1: faluco@225: { faluco@225: val = floor(val); faluco@225: break; faluco@225: } faluco@225: case 2: faluco@225: { faluco@225: val = ceil(val); faluco@225: break; faluco@225: } faluco@225: case 3: faluco@225: { faluco@225: if (val >= 0.0) faluco@225: { faluco@225: val = floor(val); faluco@225: } else { faluco@225: val = ceil(val); faluco@225: } faluco@225: break; faluco@225: } faluco@225: default: faluco@225: { faluco@225: val = (float)floor(val + 0.5); faluco@225: break; faluco@225: } faluco@225: } faluco@225: faluco@242: return static_cast(val); faluco@225: } faluco@225: faluco@260: static cell_t sm_FloatStr(IPluginContext *pCtx, const cell_t *params) faluco@225: { faluco@225: char *str; faluco@225: faluco@225: pCtx->LocalToString(params[1], &str); faluco@225: if (!strlen(str)) faluco@225: { faluco@225: return 0; faluco@225: } faluco@225: dvander@233: return sp_ftoc((float)atof(str)); faluco@225: } faluco@225: faluco@260: static cell_t sm_FloatFraction(IPluginContext *pCtx, const cell_t *params) faluco@225: { dvander@233: float val = sp_ctof(params[1]); faluco@225: val = val - floor(val); faluco@225: dvander@233: return sp_ftoc(val); faluco@225: } faluco@225: faluco@260: static cell_t sm_Sine(IPluginContext *pCtx, const cell_t *params) faluco@225: { dvander@233: float val = sp_ctof(params[1]); faluco@235: val = sin(val); faluco@225: dvander@233: return sp_ftoc(val); faluco@225: } faluco@225: faluco@260: static cell_t sm_Cosine(IPluginContext *pCtx, const cell_t *params) faluco@225: { dvander@233: float val = sp_ctof(params[1]); faluco@235: val = cos(val); faluco@225: dvander@233: return sp_ftoc(val); faluco@225: } faluco@225: faluco@260: static cell_t sm_Tangent(IPluginContext *pCtx, const cell_t *params) faluco@225: { dvander@233: float val = sp_ctof(params[1]); faluco@235: val = tan(val); faluco@225: dvander@233: return sp_ftoc(val); faluco@225: } faluco@225: faluco@260: static cell_t sm_ArcSine(IPluginContext *pCtx, const cell_t *params) faluco@225: { dvander@233: float val = sp_ctof(params[1]); faluco@225: val = asin(val); faluco@225: faluco@235: return sp_ftoc(val); faluco@225: } faluco@225: faluco@260: static cell_t sm_ArcCosine(IPluginContext *pCtx, const cell_t *params) faluco@225: { dvander@233: float val = sp_ctof(params[1]); faluco@225: val = acos(val); faluco@225: faluco@235: return sp_ftoc(val); faluco@225: } faluco@225: faluco@260: static cell_t sm_ArcTangent(IPluginContext *pCtx, const cell_t *params) faluco@225: { dvander@233: float val = sp_ctof(params[1]); faluco@225: val = atan(val); faluco@225: faluco@235: return sp_ftoc(val); faluco@225: } faluco@225: faluco@260: static cell_t sm_ArcTangent2(IPluginContext *pCtx, const cell_t *params) faluco@225: { dvander@233: float val1 = sp_ctof(params[1]); dvander@233: float val2 = sp_ctof(params[2]); faluco@225: val1 = atan2(val1, val2); faluco@225: faluco@235: return sp_ftoc(val1); faluco@225: } faluco@260: faluco@260: REGISTER_NATIVES(floatnatives) faluco@260: { faluco@260: {"float", sm_float}, faluco@260: {"FloatStr", sm_FloatStr}, faluco@260: {"FloatMul", sm_FloatMul}, faluco@260: {"FloatDiv", sm_FloatDiv}, faluco@260: {"FloatAdd", sm_FloatAdd}, faluco@260: {"FloatSub", sm_FloatSub}, faluco@260: {"FloatFraction", sm_FloatFraction}, faluco@260: {"FloatRound", sm_FloatRound}, faluco@260: {"FloatCompare", sm_FloatCompare}, faluco@260: {"SquareRoot", sm_SquareRoot}, faluco@260: {"Pow", sm_Pow}, faluco@260: {"Exponential", sm_Exponential}, faluco@260: {"Logarithm", sm_Logarithm}, faluco@260: {"Sine", sm_Sine}, faluco@260: {"Cosine", sm_Cosine}, faluco@260: {"Tangent", sm_Tangent}, faluco@260: {"FloatAbs", sm_FloatAbs}, faluco@260: {"ArcTangent", sm_ArcTangent}, faluco@260: {"ArcCosine", sm_ArcCosine}, faluco@260: {"ArcSine", sm_ArcSine}, faluco@260: {"ArcTangent2", sm_ArcTangent2}, faluco@260: {NULL, NULL} dvander@351: };