Revision: 16728
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16728
Author:   erwin
Date:     2008-09-25 19:53:15 +0200 (Thu, 25 Sep 2008)

Log Message:
-----------
avoid crash and apply force for soft bodies.
copy normals for soft body vertices, to get proper lighting

Modified Paths:
--------------
    trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp
    trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp

Modified: trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp       
2008-09-25 17:43:06 UTC (rev 16727)
+++ trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp       
2008-09-25 17:53:15 UTC (rev 16728)
@@ -14,6 +14,7 @@
 
 #include "PHY_IPhysicsEnvironment.h"
 #include "CcdPhysicsEnvironment.h"
+#include "BulletSoftBody/btSoftBody.h"
 
 
 KX_BulletPhysicsController::KX_BulletPhysicsController (const 
CcdConstructionInfo& ci, bool dyna)
@@ -148,8 +149,12 @@
 }
 MT_Scalar      KX_BulletPhysicsController::GetMass()
 {
-
-       MT_Scalar invmass = GetRigidBody()->getInvMass();
+       if (GetSoftBody())
+               return GetSoftBody()->getTotalMass();
+       
+       MT_Scalar invmass = 0.f;
+       if (GetRigidBody())
+               invmass = GetRigidBody()->getInvMass();
        if (invmass)
                return 1.f/invmass;
        return 0.f;
@@ -167,7 +172,7 @@
 void   KX_BulletPhysicsController::SuspendDynamics(bool ghost)
 {
        btRigidBody *body = GetRigidBody();
-       if (body->getActivationState() != DISABLE_SIMULATION)
+       if (body && body->getActivationState() != DISABLE_SIMULATION)
        {
                btBroadphaseProxy* handle = body->getBroadphaseHandle();
                m_savedCollisionFlags = body->getCollisionFlags();
@@ -186,7 +191,7 @@
 void   KX_BulletPhysicsController::RestoreDynamics()
 {
        btRigidBody *body = GetRigidBody();
-       if (body->getActivationState() == DISABLE_SIMULATION)
+       if (body && body->getActivationState() == DISABLE_SIMULATION)
        {
                GetPhysicsEnvironment()->updateCcdPhysicsController(this, 
                        m_savedMass,
@@ -241,18 +246,22 @@
 
 void   KX_BulletPhysicsController::SetSumoTransform(bool nondynaonly)
 {
-       GetRigidBody()->activate(true);
+       if (GetRigidBody())
+               GetRigidBody()->activate(true);
 
        if (!m_bDyna)
        {
-               
GetRigidBody()->setCollisionFlags(GetRigidBody()->getCollisionFlags() | 
btCollisionObject::CF_KINEMATIC_OBJECT);
+               
GetCollisionObject()->setCollisionFlags(GetRigidBody()->getCollisionFlags() | 
btCollisionObject::CF_KINEMATIC_OBJECT);
        } else
        {
                if (!nondynaonly)
                {
                        btTransform worldTrans;
-                       
GetRigidBody()->getMotionState()->getWorldTransform(worldTrans);
-                       GetRigidBody()->setCenterOfMassTransform(worldTrans);
+                       if (GetRigidBody())
+                       {
+                               
GetRigidBody()->getMotionState()->getWorldTransform(worldTrans);
+                               
GetRigidBody()->setCenterOfMassTransform(worldTrans);
+                       }
                        
                        /*
                        scaling?

Modified: trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp 
2008-09-25 17:43:06 UTC (rev 16727)
+++ trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp 
2008-09-25 17:53:15 UTC (rev 16728)
@@ -727,6 +727,13 @@
                                                
nodes[v.getSoftBodyIndex()].m_x.getY(),
                                                
nodes[v.getSoftBodyIndex()].m_x.getZ());
                                        v.SetXYZ(pt);
+
+                                       MT_Vector3 normal (
+                                               
nodes[v.getSoftBodyIndex()].m_n.getX(),
+                                               
nodes[v.getSoftBodyIndex()].m_n.getY(),
+                                               
nodes[v.getSoftBodyIndex()].m_n.getZ());
+                                       v.SetNormal(normal);
+
                                }
                        }
                        return true;

Modified: 
trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
===================================================================
--- trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp     
2008-09-25 17:43:06 UTC (rev 16727)
+++ trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp     
2008-09-25 17:53:15 UTC (rev 16728)
@@ -862,15 +862,20 @@
                        
m_object->setCollisionFlags(m_object->getCollisionFlags() | 
btCollisionObject::CF_KINEMATIC_OBJECT);
                }
 
-               btRigidBody* body = GetRigidBody();
-               if (body)
                {
-                       btTransform xform = body->getCenterOfMassTransform();
+                       btTransform xform = m_object->getWorldTransform();
+                       
                        if (local)
                        {       
                                force   = xform.getBasis()*force;
                        }
-                       body->applyCentralForce(force);
+                       btRigidBody* body = GetRigidBody();
+                       if (body)
+                               body->applyCentralForce(force);
+                       btSoftBody* soft = GetSoftBody();
+                       if (soft)
+                               soft->addForce(force);
+
                }
        }
 }
@@ -884,15 +889,16 @@
                {
                        
m_object->setCollisionFlags(m_object->getCollisionFlags() | 
btCollisionObject::CF_KINEMATIC_OBJECT);
                }
-               btRigidBody* body = GetRigidBody();
-               if (body)
                {
-                       btTransform xform = body->getCenterOfMassTransform();
+                       btTransform xform = m_object->getWorldTransform();
                        if (local)
                        {
                                angvel  = xform.getBasis()*angvel;
                        }
-                       body->setAngularVelocity(angvel);
+                       btRigidBody* body = GetRigidBody();
+                       if (body)
+                               body->setAngularVelocity(angvel);
+
                }
        }
 
@@ -908,15 +914,17 @@
                {
                        
m_object->setCollisionFlags(m_object->getCollisionFlags() | 
btCollisionObject::CF_KINEMATIC_OBJECT);
                }
-               btRigidBody* body = GetRigidBody();
-               if (body)
+               
                {
                        btTransform xform = m_object->getWorldTransform();
                        if (local)
                        {
                                linVel  = xform.getBasis()*linVel;
                        }
-                       body->setLinearVelocity(linVel);
+                       btRigidBody* body = GetRigidBody();
+                       if (body)
+                               body->setLinearVelocity(linVel);
+
                }
        }
 }
@@ -936,6 +944,7 @@
                btRigidBody* body = GetRigidBody();
                if (body)
                        body->applyImpulse(impulse,pos);
+                       
        }
 
 }


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to