1cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/*
2cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCopyright (C) 1996-1997 Id Software, Inc.
3cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
4cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is free software; you can redistribute it and/or
5cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichmodify it under the terms of the GNU General Public License
6cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichas published by the Free Software Foundation; either version 2
7cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichof the License, or (at your option) any later version.
8cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
9cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is distributed in the hope that it will be useful,
10cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbut WITHOUT ANY WARRANTY; without even the implied warranty of
11cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
13cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichSee the GNU General Public License for more details.
14cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
15cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichYou should have received a copy of the GNU General Public License
16cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichalong with this program; if not, write to the Free Software
17cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
19cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/
209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// mathlib.h
219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamtypedef float vec_t;
239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamtypedef vec_t vec3_t[3];
249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamtypedef vec_t vec5_t[5];
259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamtypedef	int	fixed4_t;
279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamtypedef	int	fixed8_t;
289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamtypedef	int	fixed16_t;
299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#ifndef M_PI
319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define M_PI		3.14159265358979323846	// matches value in gcc v2 math.h
329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstruct mplane_s;
359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern vec3_t vec3_origin;
379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern	int nanmask;
389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
39cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define	IS_NAN(x) isnanf(x) // (((*(int *)&x)&nanmask)==nanmask)
409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define DotProduct(x,y) (x[0]*y[0]+x[1]*y[1]+x[2]*y[2])
429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define VectorSubtract(a,b,c) {c[0]=a[0]-b[0];c[1]=a[1]-b[1];c[2]=a[2]-b[2];}
439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define VectorAdd(a,b,c) {c[0]=a[0]+b[0];c[1]=a[1]+b[1];c[2]=a[2]+b[2];}
449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define VectorCopy(a,b) {b[0]=a[0];b[1]=a[1];b[2]=a[2];}
459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid VectorMA (vec3_t veca, float scale, vec3_t vecb, vec3_t vecc);
479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvec_t _DotProduct (vec3_t v1, vec3_t v2);
499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid _VectorSubtract (vec3_t veca, vec3_t vecb, vec3_t out);
509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid _VectorAdd (vec3_t veca, vec3_t vecb, vec3_t out);
519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid _VectorCopy (vec3_t in, vec3_t out);
529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint VectorCompare (vec3_t v1, vec3_t v2);
549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvec_t Length (vec3_t v);
559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CrossProduct (vec3_t v1, vec3_t v2, vec3_t cross);
569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamfloat VectorNormalize (vec3_t v);		// returns vector length
579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid VectorInverse (vec3_t v);
589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid VectorScale (vec3_t in, vec_t scale, vec3_t out);
599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint Q_log2(int val);
609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid R_ConcatRotations (float in1[3][3], float in2[3][3], float out[3][3]);
629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid R_ConcatTransforms (float in1[3][4], float in2[3][4], float out[3][4]);
639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid FloorDivMod (double numer, double denom, int *quotient,
659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		int *rem);
669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamfixed16_t Invert24To16(fixed16_t val);
679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint GreatestCommonDivisor (int i1, int i2);
689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid AngleVectors (vec3_t angles, vec3_t forward, vec3_t right, vec3_t up);
709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint BoxOnPlaneSide (vec3_t emins, vec3_t emaxs, struct mplane_s *plane);
719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamfloat	anglemod(float a);
729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define BOX_ON_PLANE_SIDE(emins, emaxs, p)	\
769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	(((p)->type < 3)?						\
779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	(										\
789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		((p)->dist <= (emins)[(p)->type])?	\
799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			1								\
809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		:									\
819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		(									\
829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			((p)->dist >= (emaxs)[(p)->type])?\
839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				2							\
849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			:								\
859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				3							\
869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		)									\
879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	)										\
889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	:										\
899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		BoxOnPlaneSide( (emins), (emaxs), (p)))
90