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 base volume collider class.
12  *	\file		OPC_VolumeCollider.cpp
13  *	\author		Pierre Terdiman
14  *	\date		June, 2, 2001
15  */
16 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
17 
18 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
19 /**
20  *	Contains the abstract class for volume colliders.
21  *
22  *	\class		VolumeCollider
23  *	\author		Pierre Terdiman
24  *	\version	1.3
25  *	\date		June, 2, 2001
26 */
27 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
28 
29 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30 // Precompiled Header
31 #include "Stdafx.h"
32 
33 using namespace Opcode;
34 
35 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
36 /**
37  *	Constructor.
38  */
39 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
VolumeCollider()40 VolumeCollider::VolumeCollider() :
41 	mTouchedPrimitives	(null),
42 	mNbVolumeBVTests	(0),
43 	mNbVolumePrimTests	(0)
44 {
45 }
46 
47 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
48 /**
49  *	Destructor.
50  */
51 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
~VolumeCollider()52 VolumeCollider::~VolumeCollider()
53 {
54 	mTouchedPrimitives = null;
55 }
56 
57 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
58 /**
59  *	Validates current settings. You should call this method after all the settings / callbacks have been defined for a collider.
60  *	\return		null if everything is ok, else a string describing the problem
61  */
62 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ValidateSettings()63 const char* VolumeCollider::ValidateSettings()
64 {
65 	return null;
66 }
67 
68 // Pretty dumb way to dump - to do better - one day...
69 
70 #define IMPLEMENT_NOLEAFDUMP(type)												\
71 void VolumeCollider::_Dump(const type* node)									\
72 {																				\
73 	if(node->HasPosLeaf())	mTouchedPrimitives->Add(udword(node->GetPosPrimitive()));	\
74 	else					_Dump(node->GetPos());								\
75 																				\
76 	if(ContactFound()) return;													\
77 																				\
78 	if(node->HasNegLeaf())	mTouchedPrimitives->Add(udword(node->GetNegPrimitive()));	\
79 	else					_Dump(node->GetNeg());								\
80 }
81 
82 #define IMPLEMENT_LEAFDUMP(type)						\
83 void VolumeCollider::_Dump(const type* node)			\
84 {														\
85 	if(node->IsLeaf())									\
86 	{													\
87 		mTouchedPrimitives->Add(udword(node->GetPrimitive()));	\
88 	}													\
89 	else												\
90 	{													\
91 		_Dump(node->GetPos());							\
92 														\
93 		if(ContactFound()) return;						\
94 														\
95 		_Dump(node->GetNeg());							\
96 	}													\
97 }
98 
99 IMPLEMENT_NOLEAFDUMP(AABBNoLeafNode)
100 IMPLEMENT_NOLEAFDUMP(AABBQuantizedNoLeafNode)
101 
102 IMPLEMENT_LEAFDUMP(AABBCollisionNode)
103 IMPLEMENT_LEAFDUMP(AABBQuantizedNode)
104