1 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
3 * OPCODE - Optimized Collision Detection
4 * Copyright (C) 2001 Pierre Terdiman
5 * Homepage: http://www.codercorner.com/Opcode.htm
7 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
9 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
11 * Contains code for an LSS collider.
12 * \file OPC_LSSCollider.h
13 * \author Pierre Terdiman
14 * \date December, 28, 2002
16 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
18 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
20 #ifndef __OPC_LSSCOLLIDER_H__
21 #define __OPC_LSSCOLLIDER_H__
23 struct OPCODE_API LSSCache
: VolumeCache
27 Previous
.mP0
= Point(0.0f
, 0.0f
, 0.0f
);
28 Previous
.mP1
= Point(0.0f
, 0.0f
, 0.0f
);
29 Previous
.mRadius
= 0.0f
;
33 // Cached faces signature
34 LSS Previous
; //!< LSS used when performing the query resulting in cached faces
36 float FatCoeff
; //!< mRadius2 multiplier used to create a fat LSS
39 class OPCODE_API LSSCollider
: public VolumeCollider
42 // Constructor / Destructor
44 virtual ~LSSCollider();
46 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
48 * Generic collision query for generic OPCODE models. After the call, access the results:
49 * - with GetContactStatus()
50 * - with GetNbTouchedPrimitives()
51 * - with GetTouchedPrimitives()
53 * \param cache [in/out] an lss cache
54 * \param lss [in] collision lss in local space
55 * \param model [in] Opcode model to collide with
56 * \param worldl [in] lss world matrix, or null
57 * \param worldm [in] model's world matrix, or null
58 * \return true if success
59 * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only.
61 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
62 bool Collide(LSSCache
& cache
, const LSS
& lss
, const Model
& model
, const Matrix4x4
* worldl
=null
, const Matrix4x4
* worldm
=null
);
64 bool Collide(LSSCache
& cache
, const LSS
& lss
, const AABBTree
* tree
);
67 Segment mSeg
; //!< Segment
68 float mRadius2
; //!< LSS radius squared
70 void _Collide(const AABBCollisionNode
* node
);
71 void _Collide(const AABBNoLeafNode
* node
);
72 void _Collide(const AABBQuantizedNode
* node
);
73 void _Collide(const AABBQuantizedNoLeafNode
* node
);
74 void _Collide(const AABBTreeNode
* node
);
75 void _CollideNoPrimitiveTest(const AABBCollisionNode
* node
);
76 void _CollideNoPrimitiveTest(const AABBNoLeafNode
* node
);
77 void _CollideNoPrimitiveTest(const AABBQuantizedNode
* node
);
78 void _CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode
* node
);
80 inline_ BOOL
LSSContainsBox(const Point
& bc
, const Point
& be
);
81 inline_ BOOL
LSSAABBOverlap(const Point
& center
, const Point
& extents
);
82 inline_ BOOL
LSSTriOverlap(const Point
& vert0
, const Point
& vert1
, const Point
& vert2
);
84 BOOL
InitQuery(LSSCache
& cache
, const LSS
& lss
, const Matrix4x4
* worldl
=null
, const Matrix4x4
* worldm
=null
);
87 class OPCODE_API HybridLSSCollider
: public LSSCollider
90 // Constructor / Destructor
92 virtual ~HybridLSSCollider();
94 bool Collide(LSSCache
& cache
, const LSS
& lss
, const HybridModel
& model
, const Matrix4x4
* worldl
=null
, const Matrix4x4
* worldm
=null
);
96 Container mTouchedBoxes
;
99 #endif // __OPC_LSSCOLLIDER_H__