1 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2 /*
3  *	OPCODE - Optimized Collision Detection
4  *	Copyright (C) 2001 Pierre Terdiman
5  *	Homepage: http://www.codercorner.com/Opcode.htm
6  */
7 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
8 
9 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
10 /**
11  *	Contains common classes & defs used in OPCODE.
12  *	\file		OPC_Common.h
13  *	\author		Pierre Terdiman
14  *	\date		March, 20, 2001
15  */
16 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
17 
18 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
19 // Include Guard
20 #ifndef __OPC_COMMON_H__
21 #define __OPC_COMMON_H__
22 
23 // [GOTTFRIED]: Just a small change for readability.
24 #ifdef OPC_CPU_COMPARE
25 	#define GREATER(x, y)	AIR(x) > IR(y)
26 #else
27 	#define GREATER(x, y)	fabsf(x) > (y)
28 #endif
29 
30 	class OPCODE_API CollisionAABB
31 	{
32 		public:
33 		//! Constructor
CollisionAABB()34 		inline_				CollisionAABB()						{}
35 		//! Constructor
CollisionAABB(const AABB & b)36 		inline_				CollisionAABB(const AABB& b)		{ b.GetCenter(mCenter);	b.GetExtents(mExtents);	}
37 		//! Destructor
~CollisionAABB()38 		inline_				~CollisionAABB()					{}
39 
40 		//! Get min point of the box
GetMin(Point & min)41 		inline_	void		GetMin(Point& min)		const		{ min = mCenter - mExtents;					}
42 		//! Get max point of the box
GetMax(Point & max)43 		inline_	void		GetMax(Point& max)		const		{ max = mCenter + mExtents;					}
44 
45 		//! Get component of the box's min point along a given axis
GetMin(udword axis)46 		inline_	float		GetMin(udword axis)		const		{ return mCenter[axis] - mExtents[axis];	}
47 		//! Get component of the box's max point along a given axis
GetMax(udword axis)48 		inline_	float		GetMax(udword axis)		const		{ return mCenter[axis] + mExtents[axis];	}
49 
50 		///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
51 		/**
52 		 *	Setups an AABB from min & max vectors.
53 		 *	\param		min			[in] the min point
54 		 *	\param		max			[in] the max point
55 		 */
56 		///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
SetMinMax(const Point & min,const Point & max)57 		inline_	void		SetMinMax(const Point& min, const Point& max)		{ mCenter = (max + min)*0.5f; mExtents = (max - min)*0.5f;		}
58 
59 		///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
60 		/**
61 		 *	Checks a box is inside another box.
62 		 *	\param		box		[in] the other box
63 		 *	\return		true if current box is inside input box
64 		 */
65 		///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
IsInside(const CollisionAABB & box)66 		inline_	BOOL		IsInside(const CollisionAABB& box) const
67 							{
68 								if(box.GetMin(0)>GetMin(0))	return FALSE;
69 								if(box.GetMin(1)>GetMin(1))	return FALSE;
70 								if(box.GetMin(2)>GetMin(2))	return FALSE;
71 								if(box.GetMax(0)<GetMax(0))	return FALSE;
72 								if(box.GetMax(1)<GetMax(1))	return FALSE;
73 								if(box.GetMax(2)<GetMax(2))	return FALSE;
74 								return TRUE;
75 							}
76 
77 				Point		mCenter;				//!< Box center
78 				Point		mExtents;				//!< Box extents
79 	};
80 
81 	class OPCODE_API QuantizedAABB
82 	{
83 		public:
84 		//! Constructor
QuantizedAABB()85 		inline_				QuantizedAABB()			{}
86 		//! Destructor
~QuantizedAABB()87 		inline_				~QuantizedAABB()		{}
88 
89 				sword		mCenter[3];				//!< Quantized center
90 				uword		mExtents[3];			//!< Quantized extents
91 	};
92 
93 	//! Quickly rotates & translates a vector
TransformPoint(Point & dest,const Point & source,const Matrix3x3 & rot,const Point & trans)94 	inline_ void TransformPoint(Point& dest, const Point& source, const Matrix3x3& rot, const Point& trans)
95 	{
96 		dest.x = trans.x + source.x * rot.m[0][0] + source.y * rot.m[1][0] + source.z * rot.m[2][0];
97 		dest.y = trans.y + source.x * rot.m[0][1] + source.y * rot.m[1][1] + source.z * rot.m[2][1];
98 		dest.z = trans.z + source.x * rot.m[0][2] + source.y * rot.m[1][2] + source.z * rot.m[2][2];
99 	}
100 
101 #endif //__OPC_COMMON_H__
102