Blender V4.3
btGhostObject.h
Go to the documentation of this file.
1/*
2Bullet Continuous Collision Detection and Physics Library
3Copyright (c) 2003-2008 Erwin Coumans http://bulletphysics.com
4
5This software is provided 'as-is', without any express or implied warranty.
6In no event will the authors be held liable for any damages arising from the use of this software.
7Permission is granted to anyone to use this software for any purpose,
8including commercial applications, and to alter it and redistribute it freely,
9subject to the following restrictions:
10
111. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
122. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
133. This notice may not be removed or altered from any source distribution.
14*/
15
16#ifndef BT_GHOST_OBJECT_H
17#define BT_GHOST_OBJECT_H
18
19#include "btCollisionObject.h"
23#include "btCollisionWorld.h"
24
25class btConvexShape;
26
27class btDispatcher;
28
34btGhostObject : public btCollisionObject
35{
36protected:
38
39public:
41
42 virtual ~btGhostObject();
43
44 void convexSweepTest(const class btConvexShape* castShape, const btTransform& convexFromWorld, const btTransform& convexToWorld, btCollisionWorld::ConvexResultCallback& resultCallback, btScalar allowedCcdPenetration = 0.f) const;
45
46 void rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, btCollisionWorld::RayResultCallback& resultCallback) const;
47
49 virtual void addOverlappingObjectInternal(btBroadphaseProxy * otherProxy, btBroadphaseProxy* thisProxy = 0);
51 virtual void removeOverlappingObjectInternal(btBroadphaseProxy * otherProxy, btDispatcher * dispatcher, btBroadphaseProxy* thisProxy = 0);
52
54 {
55 return m_overlappingObjects.size();
56 }
57
58 btCollisionObject* getOverlappingObject(int index)
59 {
60 return m_overlappingObjects[index];
61 }
62
63 const btCollisionObject* getOverlappingObject(int index) const
64 {
65 return m_overlappingObjects[index];
66 }
67
69 {
70 return m_overlappingObjects;
71 }
72
74 {
75 return m_overlappingObjects;
76 }
77
78 //
79 // internal cast
80 //
81
82 static const btGhostObject* upcast(const btCollisionObject* colObj)
83 {
84 if (colObj->getInternalType() == CO_GHOST_OBJECT)
85 return (const btGhostObject*)colObj;
86 return 0;
87 }
88 static btGhostObject* upcast(btCollisionObject * colObj)
89 {
90 if (colObj->getInternalType() == CO_GHOST_OBJECT)
91 return (btGhostObject*)colObj;
92 return 0;
93 }
94};
95
96class btPairCachingGhostObject : public btGhostObject
97{
98 btHashedOverlappingPairCache* m_hashPairCache;
99
100public:
102
104
106 virtual void addOverlappingObjectInternal(btBroadphaseProxy* otherProxy, btBroadphaseProxy* thisProxy = 0);
107
108 virtual void removeOverlappingObjectInternal(btBroadphaseProxy* otherProxy, btDispatcher* dispatcher, btBroadphaseProxy* thisProxy = 0);
109
111 {
112 return m_hashPairCache;
113 }
114};
115
118{
119public:
121 {
122 }
123
125 {
126 }
127
128 virtual btBroadphasePair* addOverlappingPair(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1)
129 {
130 btCollisionObject* colObj0 = (btCollisionObject*)proxy0->m_clientObject;
131 btCollisionObject* colObj1 = (btCollisionObject*)proxy1->m_clientObject;
132 btGhostObject* ghost0 = btGhostObject::upcast(colObj0);
133 btGhostObject* ghost1 = btGhostObject::upcast(colObj1);
134 if (ghost0)
135 ghost0->addOverlappingObjectInternal(proxy1, proxy0);
136 if (ghost1)
137 ghost1->addOverlappingObjectInternal(proxy0, proxy1);
138 return 0;
139 }
140
141 virtual void* removeOverlappingPair(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1, btDispatcher* dispatcher)
142 {
143 btCollisionObject* colObj0 = (btCollisionObject*)proxy0->m_clientObject;
144 btCollisionObject* colObj1 = (btCollisionObject*)proxy1->m_clientObject;
145 btGhostObject* ghost0 = btGhostObject::upcast(colObj0);
146 btGhostObject* ghost1 = btGhostObject::upcast(colObj1);
147 if (ghost0)
148 ghost0->removeOverlappingObjectInternal(proxy1, dispatcher, proxy0);
149 if (ghost1)
150 ghost1->removeOverlappingObjectInternal(proxy0, dispatcher, proxy1);
151 return 0;
152 }
153
154 virtual void removeOverlappingPairsContainingProxy(btBroadphaseProxy* /*proxy0*/, btDispatcher* /*dispatcher*/)
155 {
156 btAssert(0);
157 //need to keep track of all ghost objects and call them here
158 //m_hashPairCache->removeOverlappingPairsContainingProxy(proxy0,dispatcher);
159 }
160};
161
162#endif
btBroadphasePair
@ CO_GHOST_OBJECT
btConvexShape()
not supported on IBM SDK, until we fix the alignment of btVector3
void convexSweepTest(const class btConvexShape *castShape, const btTransform &convexFromWorld, const btTransform &convexToWorld, btCollisionWorld::ConvexResultCallback &resultCallback, btScalar allowedCcdPenetration=0.f) const
virtual void addOverlappingObjectInternal(btBroadphaseProxy *otherProxy, btBroadphaseProxy *thisProxy=0)
this method is mainly for expert/internal use only.
static const btGhostObject * upcast(const btCollisionObject *colObj)
btCollisionObject * getOverlappingObject(int index)
btGhostObject()
int getNumOverlappingObjects() const
virtual void removeOverlappingObjectInternal(btBroadphaseProxy *otherProxy, btDispatcher *dispatcher, btBroadphaseProxy *thisProxy=0)
this method is mainly for expert/internal use only.
virtual ~btGhostObject()
void rayTest(const btVector3 &rayFromWorld, const btVector3 &rayToWorld, btCollisionWorld::RayResultCallback &resultCallback) const
btAlignedObjectArray< btCollisionObject * > & getOverlappingPairs()
btHashedOverlappingPairCache()
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
Definition btScalar.h:314
#define ATTRIBUTE_ALIGNED16(a)
Definition btScalar.h:285
#define btAssert(x)
Definition btScalar.h:295
btTransform
The btTransform class supports rigid transforms with only translation and rotation and no scaling/she...
Definition btTransform.h:30
SIMD_FORCE_INLINE int size() const
return the number of elements in the array
The btGhostPairCallback interfaces and forwards adding and removal of overlapping pairs from the btBr...
virtual btBroadphasePair * addOverlappingPair(btBroadphaseProxy *proxy0, btBroadphaseProxy *proxy1)
virtual ~btGhostPairCallback()
virtual void * removeOverlappingPair(btBroadphaseProxy *proxy0, btBroadphaseProxy *proxy1, btDispatcher *dispatcher)
virtual void removeOverlappingPairsContainingProxy(btBroadphaseProxy *, btDispatcher *)
The btOverlappingPairCallback class is an additional optional broadphase user callback for adding/rem...
virtual void addOverlappingObjectInternal(btBroadphaseProxy *otherProxy, btBroadphaseProxy *thisProxy=0)
this method is mainly for expert/internal use only.
btHashedOverlappingPairCache * getOverlappingPairCache()
virtual void removeOverlappingObjectInternal(btBroadphaseProxy *otherProxy, btDispatcher *dispatcher, btBroadphaseProxy *thisProxy=0)
RayResultCallback is used to report new raycast results.
RayResultCallback is used to report new raycast results.