22 #ifndef __ND_WORLD_DYNAMICS_UPDATE_H__
23 #define __ND_WORLD_DYNAMICS_UPDATE_H__
25 #include "ndNewtonStdafx.h"
27 #define D_MAX_BODY_RADIX_BIT 9
80 virtual const char* GetStringId()
const;
81 ndInt32 GetUnconstrainedBodyCount()
const;
82 void ClearBuffer(
void*
const buffer, ndInt32 sizeInByte)
const;
83 void ClearJacobianBuffer(ndInt32 count,
ndJacobian*
const dst)
const;
86 ndFloat32 GetTimestepRK()
const;
101 void InitBodyArray();
102 void InitSkeletons();
103 void CalculateForces();
104 void IntegrateBodies();
105 void UpdateSkeletons();
106 void InitJacobianMatrix();
107 void UpdateForceFeedback();
108 void CalculateJointsForce();
109 void IntegrateBodiesVelocity();
110 void CalculateJointsAcceleration();
111 void IntegrateUnconstrainedBodies();
113 void DetermineSleepStates();
118 virtual void Update();
119 void SortJointsScan();
120 void SortBodyJointScan();
134 ndFloat32 m_timestep;
135 ndFloat32 m_invTimestep;
136 ndFloat32 m_firstPassCoef;
137 ndFloat32 m_invStepRK;
138 ndFloat32 m_timestepRK;
139 ndFloat32 m_invTimestepRK;
140 ndUnsigned32 m_solverPasses;
141 ndInt32 m_activeJointCount;
142 ndInt32 m_unConstrainedBodyCount;
146 } D_GCC_NEWTON_ALIGN_32;
148 inline ndVector ndDynamicsUpdate::GetVelocTol()
const
153 inline ndFloat32 ndDynamicsUpdate::GetTimestepRK()
const
165 return m_internalForces;
170 return m_tempInternalForces;
175 return m_leftHandSide;
180 return m_rightHandSide;
185 return m_bodyIslandOrder;
188 inline ndInt32 ndDynamicsUpdate::GetUnconstrainedBodyCount()
const
190 return m_unConstrainedBodyCount;
195 return m_jointBodyPairIndexBuffer;
200 return m_jointForcesIndex;
203 inline void ndDynamicsUpdate::ClearJacobianBuffer(ndInt32 count,
ndJacobian*
const buffer)
const
205 const ndVector zero(ndVector::m_zero);
206 ndVector*
const dst = &buffer[0].m_linear;
207 for (ndInt32 i = 0; i < count; ++i)
209 dst[i * 2 + 0] = zero;
210 dst[i * 2 + 1] = zero;
214 inline void ndDynamicsUpdate::ClearBuffer(
void*
const buffer, ndInt32 sizeInByte)
const
217 ndInt32 sizeInJacobian = ndInt32 (sizeInByte /
sizeof(
ndJacobian));
218 ClearJacobianBuffer(sizeInJacobian, (
ndJacobian*)buffer);
219 char*
const ptr = (
char*)buffer;
220 for (ndInt32 i = ndInt32 (sizeInJacobian *
sizeof(
ndJacobian)); i < sizeInByte; ++i)
229 while (node->m_islandParent != node)
232 node = node->m_islandParent;
233 prev->m_islandParent = node->m_islandParent;