Browse Source

Only receive contact event when physics stepping.

aster 11 years ago
parent
commit
55e576bc11
2 changed files with 23 additions and 10 deletions
  1. 21 10
      Source/Engine/Urho2D/PhysicsWorld2D.cpp
  2. 2 0
      Source/Engine/Urho2D/PhysicsWorld2D.h

+ 21 - 10
Source/Engine/Urho2D/PhysicsWorld2D.cpp

@@ -51,6 +51,7 @@ PhysicsWorld2D::PhysicsWorld2D(Context* context) :
     velocityIterations_(DEFAULT_VELOCITY_ITERATIONS),
     velocityIterations_(DEFAULT_VELOCITY_ITERATIONS),
     positionIterations_(DEFAULT_POSITION_ITERATIONS),
     positionIterations_(DEFAULT_POSITION_ITERATIONS),
     debugRenderer_(0),
     debugRenderer_(0),
+    physicsSteping_(false),
     applyingTransforms_(false)
     applyingTransforms_(false)
 {
 {
     // Set default debug draw flags
     // Set default debug draw flags
@@ -62,7 +63,7 @@ PhysicsWorld2D::PhysicsWorld2D(Context* context) :
     world_->SetContactListener(this);
     world_->SetContactListener(this);
     // Set debug draw
     // Set debug draw
     world_->SetDebugDraw(this);
     world_->SetDebugDraw(this);
-    
+
     world_->SetContinuousPhysics(true);
     world_->SetContinuousPhysics(true);
     world_->SetSubStepping(true);
     world_->SetSubStepping(true);
 }
 }
@@ -112,6 +113,10 @@ void PhysicsWorld2D::DrawDebugGeometry(DebugRenderer* debug, bool depthTest)
 
 
 void PhysicsWorld2D::BeginContact(b2Contact* contact)
 void PhysicsWorld2D::BeginContact(b2Contact* contact)
 {
 {
+    // On receive begin contact when physics steping
+    if (!physicsSteping_)
+        return;
+
     b2Fixture* fixtureA = contact->GetFixtureA();
     b2Fixture* fixtureA = contact->GetFixtureA();
     b2Fixture* fixtureB = contact->GetFixtureB();
     b2Fixture* fixtureB = contact->GetFixtureB();
     if (!fixtureA || !fixtureB)
     if (!fixtureA || !fixtureB)
@@ -122,6 +127,10 @@ void PhysicsWorld2D::BeginContact(b2Contact* contact)
 
 
 void PhysicsWorld2D::EndContact(b2Contact* contact)
 void PhysicsWorld2D::EndContact(b2Contact* contact)
 {
 {
+    // On receive begin contact when physics steping
+    if (!physicsSteping_)
+        return;
+
     b2Fixture* fixtureA = contact->GetFixtureA();
     b2Fixture* fixtureA = contact->GetFixtureA();
     b2Fixture* fixtureB = contact->GetFixtureB();
     b2Fixture* fixtureB = contact->GetFixtureB();
     if (!fixtureA || !fixtureB)
     if (!fixtureA || !fixtureB)
@@ -222,7 +231,9 @@ void PhysicsWorld2D::Update(float timeStep)
     eventData[P_TIMESTEP] = timeStep;
     eventData[P_TIMESTEP] = timeStep;
     SendEvent(E_PHYSICSPRESTEP2D, eventData);
     SendEvent(E_PHYSICSPRESTEP2D, eventData);
 
 
+    physicsSteping_ = true;
     world_->Step(timeStep, velocityIterations_, positionIterations_);
     world_->Step(timeStep, velocityIterations_, positionIterations_);
+    physicsSteping_ = false;
 
 
     for (unsigned i = 0; i < rigidBodies_.Size(); ++i)
     for (unsigned i = 0; i < rigidBodies_.Size(); ++i)
         rigidBodies_[i]->ApplyWorldTransform();
         rigidBodies_[i]->ApplyWorldTransform();
@@ -352,18 +363,18 @@ public:
     // Construct.
     // Construct.
     RayCastCallback(PODVector<PhysicsRaycastResult2D>& results, const Vector2& startPoint, unsigned collisionMask) :
     RayCastCallback(PODVector<PhysicsRaycastResult2D>& results, const Vector2& startPoint, unsigned collisionMask) :
         results_(results),
         results_(results),
-        startPoint_(startPoint), 
+        startPoint_(startPoint),
         collisionMask_(collisionMask)
         collisionMask_(collisionMask)
     {
     {
     }
     }
-    
+
     // Called for each fixture found in the query.
     // Called for each fixture found in the query.
     virtual float32 ReportFixture(b2Fixture* fixture, const b2Vec2& point, const b2Vec2& normal, float32 fraction)
     virtual float32 ReportFixture(b2Fixture* fixture, const b2Vec2& point, const b2Vec2& normal, float32 fraction)
     {
     {
         // Ignore sensor
         // Ignore sensor
         if (fixture->IsSensor())
         if (fixture->IsSensor())
             return true;
             return true;
-        
+
         if ((fixture->GetFilterData().maskBits & collisionMask_) == 0)
         if ((fixture->GetFilterData().maskBits & collisionMask_) == 0)
             return true;
             return true;
 
 
@@ -372,7 +383,7 @@ public:
         result.normal_ = ToVector2(normal);
         result.normal_ = ToVector2(normal);
         result.distance_ = (result.position_ - startPoint_).Length();
         result.distance_ = (result.position_ - startPoint_).Length();
         result.body_ = (RigidBody2D*)(fixture->GetBody()->GetUserData());
         result.body_ = (RigidBody2D*)(fixture->GetBody()->GetUserData());
-        
+
         results_.Push(result);
         results_.Push(result);
         return true;
         return true;
     }
     }
@@ -413,7 +424,7 @@ public:
         // Ignore sensor
         // Ignore sensor
         if (fixture->IsSensor())
         if (fixture->IsSensor())
             return true;
             return true;
-        
+
         if ((fixture->GetFilterData().maskBits & collisionMask_) == 0)
         if ((fixture->GetFilterData().maskBits & collisionMask_) == 0)
             return true;
             return true;
 
 
@@ -468,7 +479,7 @@ public:
         // Ignore sensor
         // Ignore sensor
         if (fixture->IsSensor())
         if (fixture->IsSensor())
             return true;
             return true;
-        
+
         if ((fixture->GetFilterData().maskBits & collisionMask_) == 0)
         if ((fixture->GetFilterData().maskBits & collisionMask_) == 0)
             return true;
             return true;
 
 
@@ -483,7 +494,7 @@ public:
 
 
     // Return rigid body.
     // Return rigid body.
     RigidBody2D* GetRigidBody() const { return rigidBody_; }
     RigidBody2D* GetRigidBody() const { return rigidBody_; }
-    
+
 private:
 private:
     // Point.
     // Point.
     b2Vec2 point_;
     b2Vec2 point_;
@@ -526,7 +537,7 @@ RigidBody2D* PhysicsWorld2D::GetRigidBody(int screenX, int screenY, unsigned col
     Vector3 screenPoint((float)screenX / graphics->GetWidth(), (float)screenY / graphics->GetHeight(), 0.0f);
     Vector3 screenPoint((float)screenX / graphics->GetWidth(), (float)screenY / graphics->GetHeight(), 0.0f);
     Vector3 worldPoint = camera->ScreenToWorldPoint(screenPoint);
     Vector3 worldPoint = camera->ScreenToWorldPoint(screenPoint);
 
 
-    return GetRigidBody(Vector2(worldPoint.x_, worldPoint.y_), collisionMask);    
+    return GetRigidBody(Vector2(worldPoint.x_, worldPoint.y_), collisionMask);
 }
 }
 
 
 // Aabb query callback class.
 // Aabb query callback class.
@@ -546,7 +557,7 @@ public:
         // Ignore sensor
         // Ignore sensor
         if (fixture->IsSensor())
         if (fixture->IsSensor())
             return true;
             return true;
-        
+
         if ((fixture->GetFilterData().maskBits & collisionMask_) == 0)
         if ((fixture->GetFilterData().maskBits & collisionMask_) == 0)
             return true;
             return true;
 
 

+ 2 - 0
Source/Engine/Urho2D/PhysicsWorld2D.h

@@ -196,6 +196,8 @@ private:
     /// Debug draw depth test mode.
     /// Debug draw depth test mode.
     bool debugDepthTest_;
     bool debugDepthTest_;
 
 
+    /// Physics steping.
+    bool physicsSteping_;
     /// Applying transforms.
     /// Applying transforms.
     bool applyingTransforms_;
     bool applyingTransforms_;
     /// Rigid bodies.
     /// Rigid bodies.