[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16733] trunk/blender/source/gameengine: don't apply vertex transformation for deformable game soft bodies.
Erwin Coumans
blender at erwincoumans.com
Thu Sep 25 23:04:48 CEST 2008
Revision: 16733
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16733
Author: erwin
Date: 2008-09-25 23:04:41 +0200 (Thu, 25 Sep 2008)
Log Message:
-----------
don't apply vertex transformation for deformable game soft bodies.
set a fake world transform for game soft bodies, based on center of the AABB, so visiblity and some game logic works. note: this world transform is not smooth.
Modified Paths:
--------------
trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
trunk/blender/source/gameengine/Rasterizer/RAS_Deformer.h
trunk/blender/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp
Modified: trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp 2008-09-25 20:29:15 UTC (rev 16732)
+++ trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp 2008-09-25 21:04:41 UTC (rev 16733)
@@ -672,11 +672,11 @@
{
btSoftBody* m_softBody;
class RAS_MeshObject* m_pMeshObject;
- class BL_DeformableGameObject* m_gameobj;
+ class KX_GameObject* m_gameobj;
public:
- KX_SoftBodyDeformer(btSoftBody* softBody,RAS_MeshObject* pMeshObject,BL_DeformableGameObject* gameobj)
+ KX_SoftBodyDeformer(btSoftBody* softBody,RAS_MeshObject* pMeshObject,KX_GameObject* gameobj)
: m_softBody(softBody),
m_pMeshObject(pMeshObject),
m_gameobj(gameobj)
@@ -703,6 +703,8 @@
// update the vertex in m_transverts
Update();
+
+
// The vertex cache can only be updated for this deformer:
// Duplicated objects with more than one ploymaterial (=multiple mesh slot per object)
// share the same mesh (=the same cache). As the rendering is done per polymaterial
@@ -748,6 +750,12 @@
//printf("getReplica\n");
return 0;
}
+
+ virtual bool SkipVertexTransform()
+ {
+ return true;
+ }
+
protected:
//class RAS_MeshObject *m_pMesh;
};
@@ -1089,7 +1097,7 @@
if (softBody && gameobj->GetMesh(0))//only the first mesh, if any
{
//should be a mesh then, so add a soft body deformer
- KX_SoftBodyDeformer* softbodyDeformer = new KX_SoftBodyDeformer(softBody, gameobj->GetMesh(0),(BL_DeformableGameObject*)gameobj);
+ KX_SoftBodyDeformer* softbodyDeformer = new KX_SoftBodyDeformer(softBody, gameobj->GetMesh(0),gameobj);
gameobj->SetDeformer(softbodyDeformer);
}
Modified: trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
===================================================================
--- trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp 2008-09-25 20:29:15 UTC (rev 16732)
+++ trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp 2008-09-25 21:04:41 UTC (rev 16733)
@@ -401,14 +401,18 @@
{
startTrans = rbci.m_startWorldTransform;
}
- startTrans.setIdentity();
+ //startTrans.setIdentity();
- m_object->setWorldTransform(startTrans);
- m_object->setInterpolationWorldTransform(startTrans);
- m_MotionState->setWorldPosition(0,0,0);
+ //m_object->setWorldTransform(startTrans);
+ //m_object->setInterpolationWorldTransform(startTrans);
+ m_MotionState->setWorldPosition(startTrans.getOrigin().getX(),startTrans.getOrigin().getY(),startTrans.getOrigin().getZ());
m_MotionState->setWorldOrientation(0,0,0,1);
+// btVector3 wp = m_softBody->getWorldTransform().getOrigin();
+// MT_Point3 center(wp.getX(),wp.getY(),wp.getZ());
+// m_gameobj->NodeSetWorldPosition(center);
+
} else
{
btRigidBody::btRigidBodyConstructionInfo rbci(m_cci.m_mass,m_bulletMotionState,m_collisionShape,m_cci.m_localInertiaTensor * m_cci.m_inertiaFactor);
@@ -502,10 +506,22 @@
{
//sync non-static to motionstate, and static from motionstate (todo: add kinematic etc.)
+ btSoftBody* sb = GetSoftBody();
+ if (sb)
+ {
+ btVector3 aabbMin,aabbMax;
+ sb->getAabb(aabbMin,aabbMax);
+ btVector3 worldPos = (aabbMax+aabbMin)*0.5f;
+ m_MotionState->setWorldPosition(worldPos[0],worldPos[1],worldPos[2]);
+ m_MotionState->calculateWorldTransformations();
+ return true;
+ }
+
btRigidBody* body = GetRigidBody();
if (body && !body->isStaticObject())
{
+
const btVector3& worldPos = body->getCenterOfMassPosition();
m_MotionState->setWorldPosition(worldPos[0],worldPos[1],worldPos[2]);
Modified: trunk/blender/source/gameengine/Rasterizer/RAS_Deformer.h
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_Deformer.h 2008-09-25 20:29:15 UTC (rev 16732)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_Deformer.h 2008-09-25 21:04:41 UTC (rev 16733)
@@ -45,6 +45,10 @@
virtual bool Apply(class RAS_IPolyMaterial *polymat)=0;
virtual bool Update(void)=0;
virtual RAS_Deformer *GetReplica()=0;
+ virtual bool SkipVertexTransform()
+ {
+ return false;
+ }
protected:
class RAS_MeshObject *m_pMesh;
};
Modified: trunk/blender/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp 2008-09-25 20:29:15 UTC (rev 16732)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp 2008-09-25 21:04:41 UTC (rev 16733)
@@ -539,7 +539,10 @@
ms.m_mesh->SortPolygons(ms, cameratrans*MT_Transform(ms.m_OpenGLMatrix));
rendertools->PushMatrix();
- rendertools->applyTransform(rasty,ms.m_OpenGLMatrix,m_material->GetDrawingMode());
+ if (!ms.m_pDeformer || !ms.m_pDeformer->SkipVertexTransform())
+ {
+ rendertools->applyTransform(rasty,ms.m_OpenGLMatrix,m_material->GetDrawingMode());
+ }
if(rasty->QueryLists())
if(ms.m_DisplayList)
More information about the Bf-blender-cvs
mailing list