From 89c61b20f019766fa57835b3548c4f84d36f6214 Mon Sep 17 00:00:00 2001 From: Mitchell Stokes Date: Wed, 23 Apr 2014 17:53:25 -0700 Subject: 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) --- .../Converter/KX_BlenderSceneConverter.cpp | 122 ++++----------------- .../Physics/Bullet/CcdPhysicsEnvironment.cpp | 64 +++++++++++ .../Physics/Bullet/CcdPhysicsEnvironment.h | 2 + 3 files changed, 85 insertions(+), 103 deletions(-) diff --git a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp index 6b7a53c9bf7..1df518467a4 100644 --- a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp +++ b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp @@ -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,56 +265,31 @@ 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); - 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; - } + phy_env = CcdPhysicsEnvironment::Create(blenderscene, visualizePhysics); + physics_engine = UseBullet; + break; + } #endif - default: - case UseNone: + default: + case WOPHY_NONE: + { + // We should probably use some sort of factory here + phy_env = new DummyPhysicsEnvironment(); physics_engine = UseNone; - destinationscene ->SetPhysicsEnvironment(new DummyPhysicsEnvironment()); break; + } } + destinationscene->SetPhysicsEnvironment(phy_env); + BL_ConvertBlenderObjects(m_maggie, destinationscene, m_ketsjiEngine, @@ -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 diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp index dcd30ea1174..4a9fd6aa3c6 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp +++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp @@ -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; +} diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h index 4e002f5ce3c..8b8e3f1f6d0 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h +++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h @@ -260,6 +260,8 @@ protected: void MergeEnvironment(PHY_IPhysicsEnvironment *other_env); + static CcdPhysicsEnvironment *Create(struct Scene *blenderscene, bool visualizePhysics); + protected: -- cgit v1.2.3