BGE Cleanup: Reducing KX_BlenderSceneConverter's dependence on Bullet.
authorMitchell Stokes <mogurijin@gmail.com>
Thu, 24 Apr 2014 00:53:25 +0000 (17:53 -0700)
committerMitchell Stokes <mogurijin@gmail.com>
Thu, 24 Apr 2014 00:53:25 +0000 (17:53 -0700)
  * 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)

source/gameengine/Converter/KX_BlenderSceneConverter.cpp
source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h

index 6b7a53c9bf720fd136a4676258ebeb6332d63c0b..1df518467a4eac1ec51e6192bd429e1ac893297d 100644 (file)
@@ -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
index dcd30ea1174cf4cdf42e842104dc0a6b93f4564b..4a9fd6aa3c6e9f5a9c99b849519486c4388b0952 100644 (file)
@@ -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;
+}
index 4e002f5ce3cf145f48bd79883ccae9be26e1f237..8b8e3f1f6d0b2c33db80ba68ad8430e043a72c1d 100644 (file)
@@ -260,6 +260,8 @@ protected:
 
                void MergeEnvironment(PHY_IPhysicsEnvironment *other_env);
 
+               static CcdPhysicsEnvironment *Create(struct Scene *blenderscene, bool visualizePhysics);
+
        protected: