core/smn_vector.cpp
author David Anderson <dvander@alliedmods.net>
Mon Jul 09 16:14:16 2007 +0000 (2007-07-09)
changeset 1085 fbfc3f408647
parent 1070 de45bb175165
child 1231 17badaf66ce4
permissions -rw-r--r--
synced linux build
     1 /**
     2  * vim: set ts=4 :
     3  * ===============================================================
     4  * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
     5  * ===============================================================
     6  *
     7  * This file is not open source and may not be copied without explicit
     8  * written permission of AlliedModders LLC.  This file may not be redistributed 
     9  * in whole or significant part.
    10  * For information, see LICENSE.txt or http://www.sourcemod.net/license.php
    11  *
    12  * Version: $Id$
    13  */
    14 
    15 #include "sm_globals.h"
    16 #include <vector.h>
    17 #include <mathlib.h>
    18 
    19 #define SET_VECTOR(addr, vec) \
    20 	addr[0] = sp_ftoc(vec.x); \
    21 	addr[1] = sp_ftoc(vec.y); \
    22 	addr[2] = sp_ftoc(vec.z); 
    23 
    24 static cell_t GetVectorLength(IPluginContext *pContext, const cell_t *params)
    25 {
    26 	cell_t *addr;
    27 
    28 	pContext->LocalToPhysAddr(params[1], &addr);
    29 
    30 	Vector source(sp_ctof(addr[0]), sp_ctof(addr[1]), sp_ctof(addr[2]));
    31 	
    32 	if (!params[2])
    33 	{
    34 		return sp_ftoc(source.Length());
    35 	} else {
    36 		return sp_ftoc(source.LengthSqr());
    37 	}
    38 }
    39 
    40 static cell_t GetVectorDistance(IPluginContext *pContext, const cell_t *params)
    41 {
    42 	cell_t *addr1, *addr2;
    43 
    44 	pContext->LocalToPhysAddr(params[1], &addr1);
    45 	pContext->LocalToPhysAddr(params[2], &addr2);
    46 
    47 	Vector source(sp_ctof(addr1[0]), sp_ctof(addr1[1]), sp_ctof(addr1[2]));
    48 	Vector dest(sp_ctof(addr2[0]), sp_ctof(addr2[1]), sp_ctof(addr2[2]));
    49 
    50 	if (!params[3])
    51 	{
    52 		return sp_ftoc(source.DistTo(dest));
    53 	} else {
    54 		return sp_ftoc(source.DistToSqr(dest));
    55 	}
    56 }
    57 
    58 static cell_t GetVectorDotProduct(IPluginContext *pContext, const cell_t *params)
    59 {
    60 	cell_t *addr1, *addr2;
    61 
    62 	pContext->LocalToPhysAddr(params[1], &addr1);
    63 	pContext->LocalToPhysAddr(params[2], &addr2);
    64 
    65 	Vector source(sp_ctof(addr1[0]), sp_ctof(addr1[1]), sp_ctof(addr1[2]));
    66 	Vector dest(sp_ctof(addr2[0]), sp_ctof(addr2[1]), sp_ctof(addr2[2]));
    67 
    68 	return sp_ftoc(source.Dot(dest));
    69 }
    70 
    71 static cell_t GetVectorCrossProduct(IPluginContext *pContext, const cell_t *params)
    72 {
    73 	cell_t *addr1, *addr2, *set;
    74 
    75 	pContext->LocalToPhysAddr(params[1], &addr1);
    76 	pContext->LocalToPhysAddr(params[2], &addr2);
    77 	pContext->LocalToPhysAddr(params[3], &set);
    78 
    79 	Vector vec1(sp_ctof(addr1[0]), sp_ctof(addr1[1]), sp_ctof(addr1[2]));
    80 	Vector vec2(sp_ctof(addr2[0]), sp_ctof(addr2[1]), sp_ctof(addr2[2]));
    81 
    82 	Vector vec3 = vec1.Cross(vec2);
    83 
    84 	SET_VECTOR(set, vec3);
    85 
    86 	return 1;
    87 }
    88 
    89 static cell_t GetAngleVectors(IPluginContext *pContext, const cell_t *params)
    90 {
    91 	cell_t *ang_addr;
    92 
    93 	pContext->LocalToPhysAddr(params[1], &ang_addr);
    94 
    95 	QAngle angle(sp_ctof(ang_addr[0]), sp_ctof(ang_addr[1]), sp_ctof(ang_addr[2]));
    96 	Vector fwd, right, up;
    97 
    98 	AngleVectors(angle, &fwd, &right, &up);
    99 
   100 	cell_t *addr_fwd, *addr_right, *addr_up;
   101 	pContext->LocalToPhysAddr(params[2], &addr_fwd);
   102 	pContext->LocalToPhysAddr(params[3], &addr_right);
   103 	pContext->LocalToPhysAddr(params[4], &addr_up);
   104 
   105 	SET_VECTOR(addr_fwd, fwd);
   106 	SET_VECTOR(addr_right, right);
   107 	SET_VECTOR(addr_up, up);
   108 
   109 	return 1;
   110 }
   111 
   112 static cell_t GetVectorAngles(IPluginContext *pContext, const cell_t *params)
   113 {
   114 	cell_t *vec_addr;
   115 
   116 	pContext->LocalToPhysAddr(params[1], &vec_addr);
   117 
   118 	Vector vec(sp_ctof(vec_addr[0]), sp_ctof(vec_addr[1]), sp_ctof(vec_addr[2]));
   119 	QAngle angle;
   120 
   121 	VectorAngles(vec, angle);
   122 
   123 	cell_t *ang_addr;
   124 	pContext->LocalToPhysAddr(params[2], &ang_addr);
   125 
   126 	SET_VECTOR(ang_addr, angle);
   127 
   128 	return 1;
   129 }
   130 
   131 static cell_t GetVectorVectors(IPluginContext *pContext, const cell_t *params)
   132 {
   133 	cell_t *vec_addr;
   134 
   135 	pContext->LocalToPhysAddr(params[1], &vec_addr);
   136 
   137 	Vector vec(sp_ctof(vec_addr[0]), sp_ctof(vec_addr[1]), sp_ctof(vec_addr[2]));
   138 	Vector right, up;
   139 
   140 	VectorVectors(vec, right, up);
   141 
   142 	cell_t *addr_right, *addr_up;
   143 	pContext->LocalToPhysAddr(params[2], &addr_right);
   144 	pContext->LocalToPhysAddr(params[3], &addr_up);
   145 
   146 	SET_VECTOR(addr_right, right);
   147 	SET_VECTOR(addr_up, up);
   148 
   149 	return 1;
   150 }
   151 
   152 static cell_t NormalizeVector(IPluginContext *pContext, const cell_t *params)
   153 {
   154 	cell_t *addr;
   155 
   156 	pContext->LocalToPhysAddr(params[1], &addr);
   157 
   158 	Vector source(sp_ctof(addr[0]), sp_ctof(addr[1]), sp_ctof(addr[2]));
   159 	float length = VectorNormalize(source);
   160 
   161 	pContext->LocalToPhysAddr(params[2], &addr);
   162 	SET_VECTOR(addr, source);
   163 
   164 	return sp_ftoc(length);
   165 }
   166 
   167 REGISTER_NATIVES(vectorNatives)
   168 {
   169 	{"GetAngleVectors",			GetAngleVectors},
   170 	{"GetVectorAngles",			GetVectorAngles},
   171 	{"GetVectorCrossProduct",	GetVectorCrossProduct},
   172 	{"GetVectorDistance",		GetVectorDistance},
   173 	{"GetVectorDotProduct",		GetVectorDotProduct},
   174 	{"GetVectorLength",			GetVectorLength},
   175 	{"GetVectorVectors",		GetVectorVectors},
   176 	{"NormalizeVector",			NormalizeVector},
   177 	{NULL,					NULL}
   178 };