core/smn_vector.cpp
author David Anderson <dvander@alliedmods.net>
Tue Oct 16 17:28:36 2007 +0000 (2007-10-16)
changeset 1590 47557c457768
parent 1553 164d888e1d9f
child 1871 a152bfe8634b
permissions -rw-r--r--
adminmenu now loads config file
removed debug line
dvander@1069
     1
/**
dvander@1069
     2
 * vim: set ts=4 :
ds@1330
     3
 * =============================================================================
dvander@1231
     4
 * SourceMod
dvander@1231
     5
 * Copyright (C) 2004-2007 AlliedModders LLC.  All rights reserved.
ds@1330
     6
 * =============================================================================
dvander@1069
     7
 *
ds@1330
     8
 * This program is free software; you can redistribute it and/or modify it under
ds@1330
     9
 * the terms of the GNU General Public License, version 3.0, as published by the
ds@1330
    10
 * Free Software Foundation.
dvander@1231
    11
 * 
ds@1330
    12
 * This program is distributed in the hope that it will be useful, but WITHOUT
ds@1330
    13
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ds@1330
    14
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
ds@1330
    15
 * details.
dvander@1231
    16
 *
ds@1330
    17
 * You should have received a copy of the GNU General Public License along with
ds@1330
    18
 * this program.  If not, see <http://www.gnu.org/licenses/>.
dvander@1231
    19
 *
ds@1330
    20
 * As a special exception, AlliedModders LLC gives you permission to link the
ds@1330
    21
 * code of this program (as well as its derivative works) to "Half-Life 2," the
ds@1330
    22
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
ds@1330
    23
 * by the Valve Corporation.  You must obey the GNU General Public License in
ds@1330
    24
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
ds@1330
    25
 * this exception to all derivative works.  AlliedModders LLC defines further
ds@1330
    26
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
ds@1330
    27
 * or <http://www.sourcemod.net/license.php>.
dvander@1069
    28
 *
dvander@1069
    29
 * Version: $Id$
dvander@1069
    30
 */
dvander@1069
    31
dvander@1069
    32
#include "sm_globals.h"
dvander@1069
    33
#include <vector.h>
faluco@1541
    34
#include <mathlib/math_base.h>
dvander@1069
    35
dvander@1069
    36
#define SET_VECTOR(addr, vec) \
dvander@1070
    37
	addr[0] = sp_ftoc(vec.x); \
dvander@1070
    38
	addr[1] = sp_ftoc(vec.y); \
dvander@1070
    39
	addr[2] = sp_ftoc(vec.z); 
dvander@1069
    40
dvander@1069
    41
static cell_t GetVectorLength(IPluginContext *pContext, const cell_t *params)
dvander@1069
    42
{
dvander@1069
    43
	cell_t *addr;
dvander@1069
    44
dvander@1069
    45
	pContext->LocalToPhysAddr(params[1], &addr);
dvander@1069
    46
dvander@1069
    47
	Vector source(sp_ctof(addr[0]), sp_ctof(addr[1]), sp_ctof(addr[2]));
dvander@1069
    48
	
dvander@1069
    49
	if (!params[2])
dvander@1069
    50
	{
dvander@1069
    51
		return sp_ftoc(source.Length());
dvander@1069
    52
	} else {
dvander@1069
    53
		return sp_ftoc(source.LengthSqr());
dvander@1069
    54
	}
dvander@1069
    55
}
dvander@1069
    56
dvander@1069
    57
static cell_t GetVectorDistance(IPluginContext *pContext, const cell_t *params)
dvander@1069
    58
{
dvander@1069
    59
	cell_t *addr1, *addr2;
dvander@1069
    60
dvander@1069
    61
	pContext->LocalToPhysAddr(params[1], &addr1);
dvander@1069
    62
	pContext->LocalToPhysAddr(params[2], &addr2);
dvander@1069
    63
dvander@1069
    64
	Vector source(sp_ctof(addr1[0]), sp_ctof(addr1[1]), sp_ctof(addr1[2]));
dvander@1069
    65
	Vector dest(sp_ctof(addr2[0]), sp_ctof(addr2[1]), sp_ctof(addr2[2]));
dvander@1069
    66
dvander@1069
    67
	if (!params[3])
dvander@1069
    68
	{
dvander@1069
    69
		return sp_ftoc(source.DistTo(dest));
dvander@1069
    70
	} else {
dvander@1069
    71
		return sp_ftoc(source.DistToSqr(dest));
dvander@1069
    72
	}
dvander@1069
    73
}
dvander@1069
    74
dvander@1069
    75
static cell_t GetVectorDotProduct(IPluginContext *pContext, const cell_t *params)
dvander@1069
    76
{
dvander@1069
    77
	cell_t *addr1, *addr2;
dvander@1069
    78
dvander@1069
    79
	pContext->LocalToPhysAddr(params[1], &addr1);
dvander@1069
    80
	pContext->LocalToPhysAddr(params[2], &addr2);
dvander@1069
    81
dvander@1069
    82
	Vector source(sp_ctof(addr1[0]), sp_ctof(addr1[1]), sp_ctof(addr1[2]));
dvander@1069
    83
	Vector dest(sp_ctof(addr2[0]), sp_ctof(addr2[1]), sp_ctof(addr2[2]));
dvander@1069
    84
dvander@1069
    85
	return sp_ftoc(source.Dot(dest));
dvander@1069
    86
}
dvander@1069
    87
dvander@1069
    88
static cell_t GetVectorCrossProduct(IPluginContext *pContext, const cell_t *params)
dvander@1069
    89
{
dvander@1069
    90
	cell_t *addr1, *addr2, *set;
dvander@1069
    91
dvander@1069
    92
	pContext->LocalToPhysAddr(params[1], &addr1);
dvander@1069
    93
	pContext->LocalToPhysAddr(params[2], &addr2);
dvander@1069
    94
	pContext->LocalToPhysAddr(params[3], &set);
dvander@1069
    95
dvander@1069
    96
	Vector vec1(sp_ctof(addr1[0]), sp_ctof(addr1[1]), sp_ctof(addr1[2]));
dvander@1069
    97
	Vector vec2(sp_ctof(addr2[0]), sp_ctof(addr2[1]), sp_ctof(addr2[2]));
dvander@1069
    98
dvander@1069
    99
	Vector vec3 = vec1.Cross(vec2);
dvander@1069
   100
dvander@1069
   101
	SET_VECTOR(set, vec3);
dvander@1069
   102
dvander@1069
   103
	return 1;
dvander@1069
   104
}
dvander@1069
   105
dvander@1069
   106
static cell_t GetAngleVectors(IPluginContext *pContext, const cell_t *params)
dvander@1069
   107
{
dvander@1069
   108
	cell_t *ang_addr;
dvander@1069
   109
dvander@1069
   110
	pContext->LocalToPhysAddr(params[1], &ang_addr);
dvander@1069
   111
dvander@1069
   112
	QAngle angle(sp_ctof(ang_addr[0]), sp_ctof(ang_addr[1]), sp_ctof(ang_addr[2]));
dvander@1069
   113
	Vector fwd, right, up;
dvander@1069
   114
dvander@1069
   115
	AngleVectors(angle, &fwd, &right, &up);
dvander@1069
   116
dvander@1069
   117
	cell_t *addr_fwd, *addr_right, *addr_up;
dvander@1069
   118
	pContext->LocalToPhysAddr(params[2], &addr_fwd);
dvander@1069
   119
	pContext->LocalToPhysAddr(params[3], &addr_right);
dvander@1069
   120
	pContext->LocalToPhysAddr(params[4], &addr_up);
dvander@1069
   121
dvander@1069
   122
	SET_VECTOR(addr_fwd, fwd);
dvander@1069
   123
	SET_VECTOR(addr_right, right);
dvander@1069
   124
	SET_VECTOR(addr_up, up);
dvander@1069
   125
dvander@1069
   126
	return 1;
dvander@1069
   127
}
dvander@1069
   128
dvander@1069
   129
static cell_t GetVectorAngles(IPluginContext *pContext, const cell_t *params)
dvander@1069
   130
{
dvander@1069
   131
	cell_t *vec_addr;
dvander@1069
   132
dvander@1069
   133
	pContext->LocalToPhysAddr(params[1], &vec_addr);
dvander@1069
   134
dvander@1069
   135
	Vector vec(sp_ctof(vec_addr[0]), sp_ctof(vec_addr[1]), sp_ctof(vec_addr[2]));
dvander@1069
   136
	QAngle angle;
dvander@1069
   137
dvander@1069
   138
	VectorAngles(vec, angle);
dvander@1069
   139
dvander@1069
   140
	cell_t *ang_addr;
dvander@1069
   141
	pContext->LocalToPhysAddr(params[2], &ang_addr);
dvander@1069
   142
dvander@1069
   143
	SET_VECTOR(ang_addr, angle);
dvander@1069
   144
dvander@1069
   145
	return 1;
dvander@1069
   146
}
dvander@1069
   147
dvander@1069
   148
static cell_t GetVectorVectors(IPluginContext *pContext, const cell_t *params)
dvander@1069
   149
{
dvander@1069
   150
	cell_t *vec_addr;
dvander@1069
   151
dvander@1069
   152
	pContext->LocalToPhysAddr(params[1], &vec_addr);
dvander@1069
   153
dvander@1069
   154
	Vector vec(sp_ctof(vec_addr[0]), sp_ctof(vec_addr[1]), sp_ctof(vec_addr[2]));
dvander@1069
   155
	Vector right, up;
dvander@1069
   156
dvander@1069
   157
	VectorVectors(vec, right, up);
dvander@1069
   158
dvander@1069
   159
	cell_t *addr_right, *addr_up;
dvander@1069
   160
	pContext->LocalToPhysAddr(params[2], &addr_right);
dvander@1069
   161
	pContext->LocalToPhysAddr(params[3], &addr_up);
dvander@1069
   162
dvander@1069
   163
	SET_VECTOR(addr_right, right);
dvander@1069
   164
	SET_VECTOR(addr_up, up);
dvander@1069
   165
dvander@1069
   166
	return 1;
dvander@1069
   167
}
dvander@1069
   168
dvander@1069
   169
static cell_t NormalizeVector(IPluginContext *pContext, const cell_t *params)
dvander@1069
   170
{
dvander@1069
   171
	cell_t *addr;
dvander@1069
   172
dvander@1069
   173
	pContext->LocalToPhysAddr(params[1], &addr);
dvander@1069
   174
dvander@1069
   175
	Vector source(sp_ctof(addr[0]), sp_ctof(addr[1]), sp_ctof(addr[2]));
dvander@1069
   176
	float length = VectorNormalize(source);
dvander@1069
   177
dvander@1069
   178
	pContext->LocalToPhysAddr(params[2], &addr);
dvander@1069
   179
	SET_VECTOR(addr, source);
dvander@1069
   180
dvander@1069
   181
	return sp_ftoc(length);
dvander@1069
   182
}
dvander@1069
   183
faluco@1541
   184
//:TODO: OMG remove this when we get the OB SDK!!1
faluco@1541
   185
// as well as bitbuf.cpp (i write it here just to remind it)
dvander@1553
   186
#if defined ORANGEBOX_BUILD && !defined __linux__
faluco@1541
   187
float ham(float _X)
faluco@1541
   188
{
faluco@1541
   189
	return sqrt(_X); 
faluco@1541
   190
}
faluco@1541
   191
float (*pfSqrt)(float x)  = ham;
faluco@1541
   192
#endif
faluco@1541
   193
dvander@1069
   194
REGISTER_NATIVES(vectorNatives)
dvander@1069
   195
{
dvander@1069
   196
	{"GetAngleVectors",			GetAngleVectors},
dvander@1069
   197
	{"GetVectorAngles",			GetVectorAngles},
dvander@1069
   198
	{"GetVectorCrossProduct",	GetVectorCrossProduct},
dvander@1069
   199
	{"GetVectorDistance",		GetVectorDistance},
dvander@1069
   200
	{"GetVectorDotProduct",		GetVectorDotProduct},
dvander@1069
   201
	{"GetVectorLength",			GetVectorLength},
dvander@1069
   202
	{"GetVectorVectors",		GetVectorVectors},
dvander@1069
   203
	{"NormalizeVector",			NormalizeVector},
dvander@1069
   204
	{NULL,					NULL}
dvander@1069
   205
};