[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