[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16728] trunk/blender/source/gameengine: avoid crash and apply force for soft bodies.

Erwin Coumans blender at erwincoumans.com
Thu Sep 25 19:53:17 CEST 2008


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);
+			
 	}
 
 }





More information about the Bf-blender-cvs mailing list