diff -r 3dc3b1fd2796 -r 8e475210cd4d core/smn_vector.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/smn_vector.cpp Sun Jul 08 17:33:10 2007 +0000 @@ -0,0 +1,178 @@ +/** + * vim: set ts=4 : + * =============================================================== + * SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved. + * =============================================================== + * + * This file is not open source and may not be copied without explicit + * written permission of AlliedModders LLC. This file may not be redistributed + * in whole or significant part. + * For information, see LICENSE.txt or http://www.sourcemod.net/license.php + * + * Version: $Id$ + */ + +#include "sm_globals.h" +#include +#include + +#define SET_VECTOR(addr, vec) \ + addr[0] = vec.x; \ + addr[1] = vec.y; \ + addr[2] = vec.z; + +static cell_t GetVectorLength(IPluginContext *pContext, const cell_t *params) +{ + cell_t *addr; + + pContext->LocalToPhysAddr(params[1], &addr); + + Vector source(sp_ctof(addr[0]), sp_ctof(addr[1]), sp_ctof(addr[2])); + + if (!params[2]) + { + return sp_ftoc(source.Length()); + } else { + return sp_ftoc(source.LengthSqr()); + } +} + +static cell_t GetVectorDistance(IPluginContext *pContext, const cell_t *params) +{ + cell_t *addr1, *addr2; + + pContext->LocalToPhysAddr(params[1], &addr1); + pContext->LocalToPhysAddr(params[2], &addr2); + + Vector source(sp_ctof(addr1[0]), sp_ctof(addr1[1]), sp_ctof(addr1[2])); + Vector dest(sp_ctof(addr2[0]), sp_ctof(addr2[1]), sp_ctof(addr2[2])); + + if (!params[3]) + { + return sp_ftoc(source.DistTo(dest)); + } else { + return sp_ftoc(source.DistToSqr(dest)); + } +} + +static cell_t GetVectorDotProduct(IPluginContext *pContext, const cell_t *params) +{ + cell_t *addr1, *addr2; + + pContext->LocalToPhysAddr(params[1], &addr1); + pContext->LocalToPhysAddr(params[2], &addr2); + + Vector source(sp_ctof(addr1[0]), sp_ctof(addr1[1]), sp_ctof(addr1[2])); + Vector dest(sp_ctof(addr2[0]), sp_ctof(addr2[1]), sp_ctof(addr2[2])); + + return sp_ftoc(source.Dot(dest)); +} + +static cell_t GetVectorCrossProduct(IPluginContext *pContext, const cell_t *params) +{ + cell_t *addr1, *addr2, *set; + + pContext->LocalToPhysAddr(params[1], &addr1); + pContext->LocalToPhysAddr(params[2], &addr2); + pContext->LocalToPhysAddr(params[3], &set); + + Vector vec1(sp_ctof(addr1[0]), sp_ctof(addr1[1]), sp_ctof(addr1[2])); + Vector vec2(sp_ctof(addr2[0]), sp_ctof(addr2[1]), sp_ctof(addr2[2])); + + Vector vec3 = vec1.Cross(vec2); + + SET_VECTOR(set, vec3); + + return 1; +} + +static cell_t GetAngleVectors(IPluginContext *pContext, const cell_t *params) +{ + cell_t *ang_addr; + + pContext->LocalToPhysAddr(params[1], &ang_addr); + + QAngle angle(sp_ctof(ang_addr[0]), sp_ctof(ang_addr[1]), sp_ctof(ang_addr[2])); + Vector fwd, right, up; + + AngleVectors(angle, &fwd, &right, &up); + + cell_t *addr_fwd, *addr_right, *addr_up; + pContext->LocalToPhysAddr(params[2], &addr_fwd); + pContext->LocalToPhysAddr(params[3], &addr_right); + pContext->LocalToPhysAddr(params[4], &addr_up); + + SET_VECTOR(addr_fwd, fwd); + SET_VECTOR(addr_right, right); + SET_VECTOR(addr_up, up); + + return 1; +} + +static cell_t GetVectorAngles(IPluginContext *pContext, const cell_t *params) +{ + cell_t *vec_addr; + + pContext->LocalToPhysAddr(params[1], &vec_addr); + + Vector vec(sp_ctof(vec_addr[0]), sp_ctof(vec_addr[1]), sp_ctof(vec_addr[2])); + QAngle angle; + + VectorAngles(vec, angle); + + cell_t *ang_addr; + pContext->LocalToPhysAddr(params[2], &ang_addr); + + SET_VECTOR(ang_addr, angle); + + return 1; +} + +static cell_t GetVectorVectors(IPluginContext *pContext, const cell_t *params) +{ + cell_t *vec_addr; + + pContext->LocalToPhysAddr(params[1], &vec_addr); + + Vector vec(sp_ctof(vec_addr[0]), sp_ctof(vec_addr[1]), sp_ctof(vec_addr[2])); + Vector right, up; + + VectorVectors(vec, right, up); + + cell_t *addr_right, *addr_up; + pContext->LocalToPhysAddr(params[2], &addr_right); + pContext->LocalToPhysAddr(params[3], &addr_up); + + SET_VECTOR(addr_right, right); + SET_VECTOR(addr_up, up); + + return 1; +} + +static cell_t NormalizeVector(IPluginContext *pContext, const cell_t *params) +{ + cell_t *addr; + + pContext->LocalToPhysAddr(params[1], &addr); + + Vector source(sp_ctof(addr[0]), sp_ctof(addr[1]), sp_ctof(addr[2])); + float length = VectorNormalize(source); + + pContext->LocalToPhysAddr(params[2], &addr); + SET_VECTOR(addr, source); + + return sp_ftoc(length); +} + +REGISTER_NATIVES(vectorNatives) +{ + {"GetAngleVectors", GetAngleVectors}, + {"GetVectorAngles", GetVectorAngles}, + {"GetVectorCrossProduct", GetVectorCrossProduct}, + {"GetVectorDistance", GetVectorDistance}, + {"GetVectorDotProduct", GetVectorDotProduct}, + {"GetVectorLength", GetVectorLength}, + {"GetVectorVectors", GetVectorVectors}, + {"NormalizeVector", NormalizeVector}, + {NULL, NULL} +};