mirror of https://github.com/axmolengine/axmol.git
[physics] add pre/post callback in `update()` (#19118)
* add physics update pre/post callback * update space * run before simulation
This commit is contained in:
parent
f3ef6b80de
commit
b70a6a6def
|
@ -872,6 +872,9 @@ void PhysicsWorld::step(float delta)
|
||||||
|
|
||||||
void PhysicsWorld::update(float delta, bool userCall/* = false*/)
|
void PhysicsWorld::update(float delta, bool userCall/* = false*/)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
if(_preUpdateCallback) _preUpdateCallback(); //fix #11154
|
||||||
|
|
||||||
if(!_delayAddBodies.empty())
|
if(!_delayAddBodies.empty())
|
||||||
{
|
{
|
||||||
updateBodies();
|
updateBodies();
|
||||||
|
@ -880,7 +883,7 @@ void PhysicsWorld::update(float delta, bool userCall/* = false*/)
|
||||||
{
|
{
|
||||||
updateBodies();
|
updateBodies();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto sceneToWorldTransform = _scene->getNodeToParentTransform();
|
auto sceneToWorldTransform = _scene->getNodeToParentTransform();
|
||||||
beforeSimulation(_scene, sceneToWorldTransform, 1.f, 1.f, 0.f);
|
beforeSimulation(_scene, sceneToWorldTransform, 1.f, 1.f, 0.f);
|
||||||
|
|
||||||
|
@ -888,12 +891,12 @@ void PhysicsWorld::update(float delta, bool userCall/* = false*/)
|
||||||
{
|
{
|
||||||
updateJoints();
|
updateJoints();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (delta < FLT_EPSILON)
|
if (delta < FLT_EPSILON)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (userCall)
|
if (userCall)
|
||||||
{
|
{
|
||||||
#if CC_TARGET_PLATFORM == CC_PLATFORM_WINRT || CC_TARGET_PLATFORM == CC_PLATFORM_WIN32
|
#if CC_TARGET_PLATFORM == CC_PLATFORM_WINRT || CC_TARGET_PLATFORM == CC_PLATFORM_WIN32
|
||||||
|
@ -950,6 +953,8 @@ void PhysicsWorld::update(float delta, bool userCall/* = false*/)
|
||||||
// Update physics position, should loop as the same sequence as node tree.
|
// Update physics position, should loop as the same sequence as node tree.
|
||||||
// PhysicsWorld::afterSimulation() will depend on the sequence.
|
// PhysicsWorld::afterSimulation() will depend on the sequence.
|
||||||
afterSimulation(_scene, sceneToWorldTransform, 0.f);
|
afterSimulation(_scene, sceneToWorldTransform, 0.f);
|
||||||
|
|
||||||
|
if(_postUpdateCallback) _postUpdateCallback(); //fix #11154
|
||||||
}
|
}
|
||||||
|
|
||||||
PhysicsWorld* PhysicsWorld::construct(Scene* scene)
|
PhysicsWorld* PhysicsWorld::construct(Scene* scene)
|
||||||
|
@ -1033,6 +1038,16 @@ void PhysicsWorld::afterSimulation(Node *node, const Mat4& parentToWorldTransfor
|
||||||
afterSimulation(child, nodeToWorldTransform, nodeRotation);
|
afterSimulation(child, nodeToWorldTransform, nodeRotation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PhysicsWorld::setPostUpdateCallback(const std::function<void()> &callback)
|
||||||
|
{
|
||||||
|
_postUpdateCallback = callback;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PhysicsWorld::setPreUpdateCallback(const std::function<void()> &callback)
|
||||||
|
{
|
||||||
|
_preUpdateCallback = callback;
|
||||||
|
}
|
||||||
|
|
||||||
NS_CC_END
|
NS_CC_END
|
||||||
|
|
||||||
#endif // CC_USE_PHYSICS
|
#endif // CC_USE_PHYSICS
|
||||||
|
|
|
@ -310,6 +310,16 @@ public:
|
||||||
*/
|
*/
|
||||||
void setDebugDrawMask(int mask);
|
void setDebugDrawMask(int mask);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set the callback which invoked before update of each object in physics world.
|
||||||
|
*/
|
||||||
|
void setPreUpdateCallback(const std::function<void()> &callback);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set the callback which invoked after update of each object in physics world.
|
||||||
|
*/
|
||||||
|
void setPostUpdateCallback(const std::function<void()> &callback);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the debug draw mask.
|
* Get the debug draw mask.
|
||||||
*
|
*
|
||||||
|
@ -352,7 +362,7 @@ protected:
|
||||||
virtual void addShape(PhysicsShape* shape);
|
virtual void addShape(PhysicsShape* shape);
|
||||||
virtual void removeShape(PhysicsShape* shape);
|
virtual void removeShape(PhysicsShape* shape);
|
||||||
virtual void update(float delta, bool userCall = false);
|
virtual void update(float delta, bool userCall = false);
|
||||||
|
|
||||||
virtual void debugDraw();
|
virtual void debugDraw();
|
||||||
|
|
||||||
virtual bool collisionBeginCallback(PhysicsContact& contact);
|
virtual bool collisionBeginCallback(PhysicsContact& contact);
|
||||||
|
@ -367,7 +377,7 @@ protected:
|
||||||
virtual void removeBodyOrDelay(PhysicsBody* body);
|
virtual void removeBodyOrDelay(PhysicsBody* body);
|
||||||
virtual void updateBodies();
|
virtual void updateBodies();
|
||||||
virtual void updateJoints();
|
virtual void updateJoints();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Vec2 _gravity;
|
Vec2 _gravity;
|
||||||
float _speed;
|
float _speed;
|
||||||
|
@ -394,6 +404,9 @@ protected:
|
||||||
std::vector<PhysicsJoint*> _delayAddJoints;
|
std::vector<PhysicsJoint*> _delayAddJoints;
|
||||||
std::vector<PhysicsJoint*> _delayRemoveJoints;
|
std::vector<PhysicsJoint*> _delayRemoveJoints;
|
||||||
|
|
||||||
|
std::function<void()> _preUpdateCallback;
|
||||||
|
std::function<void()> _postUpdateCallback;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
PhysicsWorld();
|
PhysicsWorld();
|
||||||
virtual ~PhysicsWorld();
|
virtual ~PhysicsWorld();
|
||||||
|
|
Loading…
Reference in New Issue