22 #ifndef __ND_SCENE_H__
23 #define __ND_SCENE_H__
25 #include "ndCollisionStdafx.h"
26 #include "ndBvhNode.h"
27 #include "ndBodyListView.h"
28 #include "ndContactArray.h"
29 #include "ndPolygonMeshDesc.h"
31 #define D_SCENE_MAX_STACK_DEPTH 256
54 virtual void OnDebugNode(
const ndBvhNode*
const node) = 0;
55 } D_GCC_NEWTON_ALIGN_32;
65 :m_body0(ndMin(body0, body1))
66 ,m_body1(ndMax(body0, body1))
75 D_COLLISION_API
virtual ~
ndScene();
79 D_COLLISION_API
virtual void Begin();
80 D_COLLISION_API
virtual void End();
81 D_COLLISION_API
virtual void Sync();
82 D_COLLISION_API
virtual bool IsGPU()
const;
83 D_COLLISION_API
virtual bool IsValid()
const;
84 D_COLLISION_API
virtual double GetGPUTime()
const;
86 D_COLLISION_API
virtual void Cleanup();
99 ndInt32 GetThreadCount()
const;
101 virtual ndWorld* GetWorld()
const;
112 ndFloat32 GetTimestep()
const;
113 void SetTimestep(ndFloat32 timestep);
119 bool ValidateContactCache(
ndContact*
const contact,
const ndVector& timestep)
const;
122 void FindCollidingPairs(
ndBodyKinematic*
const body, ndInt32 threadId);
123 void FindCollidingPairsForward(
ndBodyKinematic*
const body, ndInt32 threadId);
124 void FindCollidingPairsBackward(
ndBodyKinematic*
const body, ndInt32 threadId);
128 void CalculateJointContacts(ndInt32 threadIndex,
ndContact*
const contact);
129 void ProcessContacts(ndInt32 threadIndex, ndInt32 contactCount,
ndContactSolver*
const contactSolver);
136 D_COLLISION_API
virtual void ApplyExtForce();
137 D_COLLISION_API
virtual void BalanceScene();
138 D_COLLISION_API
virtual void InitBodyArray();
139 D_COLLISION_API
virtual void UpdateSpecial();
140 D_COLLISION_API
virtual void UpdateBodyList();
141 D_COLLISION_API
virtual void UpdateTransform();
142 D_COLLISION_API
virtual void CreateNewContacts();
143 D_COLLISION_API
virtual void CalculateContacts();
144 D_COLLISION_API
virtual void FindCollidingPairs();
145 D_COLLISION_API
virtual void DeleteDeadContacts();
147 D_COLLISION_API
virtual void CalculateContacts(ndInt32 threadIndex,
ndContact*
const contact);
148 D_COLLISION_API
virtual void UpdateTransformNotify(ndInt32 threadIndex,
ndBodyKinematic*
const body);
168 ndFloat32 m_timestep;
170 ndUnsigned32 m_frameNumber;
171 ndUnsigned32 m_subStepNumber;
172 ndUnsigned32 m_forceBalanceSceneCounter;
175 static ndVector m_linearContactError2;
176 static ndVector m_angularContactError2;
184 } D_GCC_NEWTON_ALIGN_32 ;
186 inline bool ndScene::IsValid()
const
191 inline bool ndScene::IsGPU()
const
196 inline double ndScene::GetGPUTime()
const
201 inline ndWorld* ndScene::GetWorld()
const
206 inline ndInt32 ndScene::GetThreadCount()
const
209 return pool.GetThreadCount();
214 return m_scratchBuffer;
224 return m_activeConstraintArray;
229 return m_contactArray;
234 return m_activeConstraintArray;
239 return m_bodyList.GetView();
244 return m_bodyList.GetView();
247 inline ndFloat32 ndScene::GetTimestep()
const
252 inline void ndScene::SetTimestep(ndFloat32 timestep)
254 m_timestep = timestep;
259 return m_sentinelBody;