BGE Cleanup: Reducing KX_BlenderSceneConverter's dependence on Bullet.

* Moving the BlenderDebugDraw (derived from btIDebugDraw) from
    KX_BlenderSceneConverter to CcdPhysicsEnvironment
  * Moving CcdPhysicsEnvironment initialization to CcdPhysicsEnvironment
    (this could probably be cleaned up some more with some sort of
    factory, or at least moving code to CcdPhysicsEnvironment's
    constructor)
  * Simplifying physics environment initialization (went from two
    switches to one)
This commit is contained in:
Mitchell Stokes 2014-04-23 17:53:25 -07:00
parent 3442a658fc
commit 89c61b20f0
3 changed files with 87 additions and 105 deletions

@ -246,60 +246,6 @@ Scene *KX_BlenderSceneConverter::GetBlenderSceneForName(const STR_String& name)
}
#ifdef WITH_BULLET
#include "LinearMath/btIDebugDraw.h"
struct BlenderDebugDraw : public btIDebugDraw
{
BlenderDebugDraw () :
m_debugMode(0)
{
}
int m_debugMode;
virtual void drawLine(const btVector3& from,const btVector3& to,const btVector3& color)
{
if (m_debugMode >0)
{
MT_Vector3 kxfrom(from[0],from[1],from[2]);
MT_Vector3 kxto(to[0],to[1],to[2]);
MT_Vector3 kxcolor(color[0],color[1],color[2]);
KX_RasterizerDrawDebugLine(kxfrom,kxto,kxcolor);
}
}
virtual void reportErrorWarning(const char* warningString)
{
}
virtual void drawContactPoint(const btVector3& PointOnB,const btVector3& normalOnB,float distance,int lifeTime,const btVector3& color)
{
//not yet
}
virtual void setDebugMode(int debugMode)
{
m_debugMode = debugMode;
}
virtual int getDebugMode() const
{
return m_debugMode;
}
///todo: find out if Blender can do this
virtual void draw3dText(const btVector3& location,const char* textString)
{
}
};
#endif
void KX_BlenderSceneConverter::ConvertScene(class KX_Scene* destinationscene,
class RAS_IRasterizer* rendertools,
class RAS_ICanvas* canvas,
@ -308,8 +254,9 @@ void KX_BlenderSceneConverter::ConvertScene(class KX_Scene* destinationscene,
//find out which physics engine
Scene *blenderscene = destinationscene->GetBlenderScene();
PHY_IPhysicsEnvironment *phy_env = NULL;
e_PhysicsEngine physics_engine = UseBullet;
bool useDbvtCulling = false;
// hook for registration function during conversion.
m_currentScene = destinationscene;
destinationscene->SetSceneConverter(this);
@ -318,55 +265,30 @@ void KX_BlenderSceneConverter::ConvertScene(class KX_Scene* destinationscene,
// when doing threaded conversion, so it's disabled for now.
// SG_SetActiveStage(SG_STAGE_CONVERTER);
if (blenderscene)
switch (blenderscene->gm.physicsEngine)
{
switch (blenderscene->gm.physicsEngine)
#ifdef WITH_BULLET
case WOPHY_BULLET:
{
case WOPHY_BULLET:
{
physics_engine = UseBullet;
useDbvtCulling = (blenderscene->gm.mode & WO_DBVT_CULLING) != 0;
break;
}
default:
case WOPHY_NONE:
{
physics_engine = UseNone;
break;
}
SYS_SystemHandle syshandle = SYS_GetSystem(); /*unused*/
int visualizePhysics = SYS_GetCommandLineInt(syshandle,"show_physics",0);
phy_env = CcdPhysicsEnvironment::Create(blenderscene, visualizePhysics);
physics_engine = UseBullet;
break;
}
#endif
default:
case WOPHY_NONE:
{
// We should probably use some sort of factory here
phy_env = new DummyPhysicsEnvironment();
physics_engine = UseNone;
break;
}
}
switch (physics_engine)
{
#ifdef WITH_BULLET
case UseBullet:
{
CcdPhysicsEnvironment* ccdPhysEnv = new CcdPhysicsEnvironment(useDbvtCulling);
ccdPhysEnv->SetDebugDrawer(new BlenderDebugDraw());
ccdPhysEnv->SetDeactivationLinearTreshold(blenderscene->gm.lineardeactthreshold);
ccdPhysEnv->SetDeactivationAngularTreshold(blenderscene->gm.angulardeactthreshold);
ccdPhysEnv->SetDeactivationTime(blenderscene->gm.deactivationtime);
SYS_SystemHandle syshandle = SYS_GetSystem(); /*unused*/
int visualizePhysics = SYS_GetCommandLineInt(syshandle,"show_physics",0);
if (visualizePhysics)
ccdPhysEnv->SetDebugMode(btIDebugDraw::DBG_DrawWireframe|btIDebugDraw::DBG_DrawAabb|btIDebugDraw::DBG_DrawContactPoints|btIDebugDraw::DBG_DrawText|btIDebugDraw::DBG_DrawConstraintLimits|btIDebugDraw::DBG_DrawConstraints);
//todo: get a button in blender ?
//disable / enable debug drawing (contact points, aabb's etc)
//ccdPhysEnv->setDebugMode(1);
destinationscene->SetPhysicsEnvironment(ccdPhysEnv);
break;
}
#endif
default:
case UseNone:
physics_engine = UseNone;
destinationscene ->SetPhysicsEnvironment(new DummyPhysicsEnvironment());
break;
}
destinationscene->SetPhysicsEnvironment(phy_env);
BL_ConvertBlenderObjects(m_maggie,
destinationscene,
@ -389,12 +311,6 @@ void KX_BlenderSceneConverter::ConvertScene(class KX_Scene* destinationscene,
//This cache mecanism is buggy so I leave it disable and the memory leak
//that would result from this is fixed in RemoveScene()
m_map_mesh_to_gamemesh.clear();
#ifndef WITH_BULLET
/* quiet compiler warning */
(void)useDbvtCulling;
#endif
}
// This function removes all entities stored in the converter for that scene

@ -40,10 +40,14 @@ subject to the following restrictions:
#include "PHY_IMotionState.h"
#include "PHY_ICharacter.h"
#include "KX_GameObject.h"
#include "KX_PythonInit.h" // for KX_RasterizerDrawDebugLine
#include "RAS_MeshObject.h"
#include "RAS_Polygon.h"
#include "RAS_TexVert.h"
#include "DNA_scene_types.h"
#include "DNA_world_types.h"
#define CCD_CONSTRAINT_DISABLE_LINKED_COLLISION 0x80
#ifdef NEW_BULLET_VEHICLE_SUPPORT
@ -2895,3 +2899,63 @@ void CcdPhysicsEnvironment::ExportFile(const char* filename)
}
}
struct BlenderDebugDraw : public btIDebugDraw
{
BlenderDebugDraw () :
m_debugMode(0)
{
}
int m_debugMode;
virtual void drawLine(const btVector3& from,const btVector3& to,const btVector3& color)
{
if (m_debugMode >0)
{
MT_Vector3 kxfrom(from[0],from[1],from[2]);
MT_Vector3 kxto(to[0],to[1],to[2]);
MT_Vector3 kxcolor(color[0],color[1],color[2]);
KX_RasterizerDrawDebugLine(kxfrom,kxto,kxcolor);
}
}
virtual void reportErrorWarning(const char* warningString)
{
}
virtual void drawContactPoint(const btVector3& PointOnB,const btVector3& normalOnB,float distance,int lifeTime,const btVector3& color)
{
//not yet
}
virtual void setDebugMode(int debugMode)
{
m_debugMode = debugMode;
}
virtual int getDebugMode() const
{
return m_debugMode;
}
///todo: find out if Blender can do this
virtual void draw3dText(const btVector3& location,const char* textString)
{
}
};
CcdPhysicsEnvironment *CcdPhysicsEnvironment::Create(Scene *blenderscene, bool visualizePhysics)
{
CcdPhysicsEnvironment* ccdPhysEnv = new CcdPhysicsEnvironment((blenderscene->gm.mode & WO_DBVT_CULLING) != 0);
ccdPhysEnv->SetDebugDrawer(new BlenderDebugDraw());
ccdPhysEnv->SetDeactivationLinearTreshold(blenderscene->gm.lineardeactthreshold);
ccdPhysEnv->SetDeactivationAngularTreshold(blenderscene->gm.angulardeactthreshold);
ccdPhysEnv->SetDeactivationTime(blenderscene->gm.deactivationtime);
if (visualizePhysics)
ccdPhysEnv->SetDebugMode(btIDebugDraw::DBG_DrawWireframe|btIDebugDraw::DBG_DrawAabb|btIDebugDraw::DBG_DrawContactPoints|btIDebugDraw::DBG_DrawText|btIDebugDraw::DBG_DrawConstraintLimits|btIDebugDraw::DBG_DrawConstraints);
return ccdPhysEnv;
}

@ -260,6 +260,8 @@ protected:
void MergeEnvironment(PHY_IPhysicsEnvironment *other_env);
static CcdPhysicsEnvironment *Create(struct Scene *blenderscene, bool visualizePhysics);
protected: