diff --git a/source/game/BaseAnimating.cpp b/source/game/BaseAnimating.cpp index ee58f156ad3c0e9809ab7654ddfe57699f6e52e1..c7b6c468ebcc556810dda4d235ecd0b050ac9a9c 100644 --- a/source/game/BaseAnimating.cpp +++ b/source/game/BaseAnimating.cpp @@ -441,7 +441,7 @@ void CBaseAnimating::setPos(const float3 &pos) BaseClass::setPos(pos); if(m_pRigidBody) { - SPhysics_GetDynWorld()->updateSingleAabb(m_pRigidBody); + SPhysics_UpdateSingleAABB(m_pRigidBody); } SAFE_CALL(m_pModel, setPosition, pos); @@ -452,7 +452,7 @@ void CBaseAnimating::setOrient(const SMQuaternion & q) BaseClass::setOrient(q); if(m_pRigidBody) { - SPhysics_GetDynWorld()->updateSingleAabb(m_pRigidBody); + SPhysics_UpdateSingleAABB(m_pRigidBody); } SAFE_CALL(m_pModel, setOrientation, q); diff --git a/source/game/BaseAnimating.h b/source/game/BaseAnimating.h index e5336bcd4de9646f8c99ca3cb9dcd20f331e9b19..43426cd876f9823f227449067ddcddafbb500fdd 100644 --- a/source/game/BaseAnimating.h +++ b/source/game/BaseAnimating.h @@ -48,8 +48,7 @@ public: { const btVector3 &v = centerOfMassWorldTrans.getOrigin(); const btQuaternion &q = centerOfMassWorldTrans.getRotation(); - m_pEntity->setPos(BTVEC_F3(v)); - m_pEntity->setOrient(BTQUAT_Q4(q)); + m_pEntity->setXform(BTVEC_F3(v), BTQUAT_Q4(q)); } }; diff --git a/source/game/BaseEntity.cpp b/source/game/BaseEntity.cpp index 18df921c0603dad288073ba305b3ccf39be22221..713dd63d93acf48ac4df6d760c0fac304d94d563 100644 --- a/source/game/BaseEntity.cpp +++ b/source/game/BaseEntity.cpp @@ -163,7 +163,7 @@ void CBaseEntity::setPos(const float3 &pos) if(m_pEditorRigidBody) { m_pEditorRigidBody->getWorldTransform().setOrigin(F3_BTVEC(m_vPosition)); - SPhysics_GetDynWorld()->updateSingleAabb(m_pEditorRigidBody); + SPhysics_UpdateSingleAABB(m_pEditorRigidBody); } { diff --git a/source/game/BaseTrigger.cpp b/source/game/BaseTrigger.cpp index 3d23d5f18d63ef089cb2eebb4583c096bd1d473e..6577b79b883e3e9a9bb518df6dec51898c12a824 100644 --- a/source/game/BaseTrigger.cpp +++ b/source/game/BaseTrigger.cpp @@ -244,7 +244,7 @@ void CBaseTrigger::setPos(const float3 & pos) { m_pGhostObject->getWorldTransform().setOrigin(F3_BTVEC(pos)); - SPhysics_GetDynWorld()->updateSingleAabb(m_pGhostObject); + SPhysics_UpdateSingleAABB(m_pGhostObject); } } @@ -255,7 +255,7 @@ void CBaseTrigger::setOrient(const SMQuaternion & q) { m_pGhostObject->getWorldTransform().setRotation(Q4_BTQUAT(q)); - SPhysics_GetDynWorld()->updateSingleAabb(m_pGhostObject); + SPhysics_UpdateSingleAABB(m_pGhostObject); } } diff --git a/source/physics/PhyWorld.cpp b/source/physics/PhyWorld.cpp index 9e294766d2f2d30338247b1a4dc7d6eee2ef7157..ee554457e62a8ad3f6034f8c85ca06d930d7459a 100644 --- a/source/physics/PhyWorld.cpp +++ b/source/physics/PhyWorld.cpp @@ -223,7 +223,10 @@ void CPhyWorld::update(int thread) } //printf("%.3fs\n", (float)(time1 - time0) / 1000.0f); + + m_isUpdating = true; m_pDynamicsWorld->stepSimulation((float)(time1 - time0) / 1000.0f, 2, 1.0f / 60.0f); + m_isUpdating = false; time0 = time1; } @@ -249,6 +252,14 @@ void CPhyWorld::removeShape(btRigidBody * pBody) } } +void CPhyWorld::updateSingleAABB(btCollisionObject* colObj) +{ + if(!m_isUpdating) + { + m_pDynamicsWorld->updateSingleAabb(colObj); + } +} + #if 0 void CPhyWorld::loadGeom(const char * file) diff --git a/source/physics/PhyWorld.h b/source/physics/PhyWorld.h index 1112d84dc01f6151961b907491d1bbf0b0e00b3e..9752a082f15c53b06657481405b1b964a5c4721f 100644 --- a/source/physics/PhyWorld.h +++ b/source/physics/PhyWorld.h @@ -56,6 +56,8 @@ public: void addShape(btRigidBody * pBody, int group, int mask); void removeShape(btRigidBody * pBody); + void updateSingleAABB(btCollisionObject* colObj); + #if 0 void loadGeom(const char * file=NULL); void unloadGeom(); @@ -178,6 +180,8 @@ protected: btDiscreteDynamicsWorldMt * m_pDynamicsWorld; btGhostPairCallback * m_pGHostPairCallback; + bool m_isUpdating = false; + const bool * m_bDebugDraw; CDebugDrawer * m_pDebugDrawer; diff --git a/source/physics/sxphysics.h b/source/physics/sxphysics.h index 5ec58faa5af0da555c015952a28f6a7a153302f3..aa00825fc110900bc639cd5f3d083ab7923aa429 100644 --- a/source/physics/sxphysics.h +++ b/source/physics/sxphysics.h @@ -107,6 +107,8 @@ SX_LIB_API ID SPhysics_GetMtlID(const btCollisionObject *pBody, const btCollisio SX_LIB_API btDiscreteDynamicsWorldMt * SPhysics_GetDynWorld(); +SX_LIB_API void SPhysics_UpdateSingleAABB(btCollisionObject* colObj); + /*! Запускает симуляцию */ SX_LIB_API void SPhysics_EnableSimulation(); diff --git a/source/physics/sxphysics_dll.cpp b/source/physics/sxphysics_dll.cpp index bbce25badb718893c890d1c48c99ab83f42925e7..64c5508e1279e4b94baa4230b12273f51ee69f57 100644 --- a/source/physics/sxphysics_dll.cpp +++ b/source/physics/sxphysics_dll.cpp @@ -151,6 +151,12 @@ SX_LIB_API btDiscreteDynamicsWorldMt * SPhysics_GetDynWorld() return(g_pWorld->getBtWorld()); } +SX_LIB_API void SPhysics_UpdateSingleAABB(btCollisionObject* colObj) +{ + SP_PRECOND(_VOID); + g_pWorld->updateSingleAABB(colObj); +} + #if 0 SX_LIB_API bool SPhysics_ImportGeom(const char * file) { diff --git a/source/xcommon/XEvents.h b/source/xcommon/XEvents.h index 2a3929d35ceb605a2b64f06474bfbe5ecfe529a3..693df482e4d9f79e39a1bc3eda334dae0b9ad7c0 100644 --- a/source/xcommon/XEvents.h +++ b/source/xcommon/XEvents.h @@ -59,11 +59,11 @@ public: } void broadcastEvent(const T *pEvent) { - for(UINT i = 0, l = m_vListeners.size(); i < l; ++i) + for(UINT i = 0; i < m_vListeners.size(); ++i) { m_vListeners[i](pEvent); } - for(UINT i = 0, l = m_vListeners2.size(); i < l; ++i) + for(UINT i = 0; i < m_vListeners2.size(); ++i) { m_vListeners2[i]->onEvent(pEvent); }