From 955858a48b21bed5364ec5f314baa984af78a05f Mon Sep 17 00:00:00 2001 From: ejcoumans Date: Fri, 11 Aug 2006 21:24:35 +0000 Subject: [PATCH] Added Quake BSP loading to the ColladaDemo example. This can become utility to transform bsp2dae --- Demos/ColladaDemo/ColladaDemo.cpp | 92 +++++++++++++++++++++++++++++-- 1 file changed, 86 insertions(+), 6 deletions(-) diff --git a/Demos/ColladaDemo/ColladaDemo.cpp b/Demos/ColladaDemo/ColladaDemo.cpp index e8fcf8c54..7081123cf 100644 --- a/Demos/ColladaDemo/ColladaDemo.cpp +++ b/Demos/ColladaDemo/ColladaDemo.cpp @@ -48,6 +48,15 @@ extern int gForwardAxis; #include "GLDebugDrawer.h" + +#define QUAKE_BSP_IMPORTING 1 + +#ifdef QUAKE_BSP_IMPORTING +#include "BspLoader.h" +#include "BspConverter.h" +#endif //QUAKE_BSP_IMPORTING + + //either FCollada or COLLADA_DOM //COLLADA_DOM and LibXML source code are included in Extras/ folder. @@ -255,7 +264,7 @@ CcdPhysicsController* CreatePhysicsObject(bool isDynamic, float mass, const Sim ms[i].setWorldPosition(startTransform.getOrigin().getX(),startTransform.getOrigin().getY(),startTransform.getOrigin().getZ()); ccdObjectCi.m_MotionState = &ms[i]; - ccdObjectCi.m_gravity = SimdVector3(0,0,0); + ccdObjectCi.m_gravity = SimdVector3(0,-9.8,0); ccdObjectCi.m_localInertiaTensor =SimdVector3(0,0,0); if (!isDynamic) { @@ -300,6 +309,33 @@ CcdPhysicsController* CreatePhysicsObject(bool isDynamic, float mass, const Sim +///BspToBulletConverter extends the BspConverter to convert to Bullet datastructures +class BspToBulletConverter : public BspConverter +{ +public: + + virtual void AddConvexVerticesCollider(std::vector& vertices, bool isEntity, const SimdVector3& entityTargetLocation) + { + ///perhaps we can do something special with entities (isEntity) + ///like adding a collision Triggering (as example) + + if (vertices.size() > 0) + { + bool isDynamic = false; + float mass = 0.f; + SimdTransform startTransform; + //can use a shift + startTransform.setIdentity(); + startTransform.setOrigin(SimdVector3(0,0,-10.f)); + //this create an internal copy of the vertices + CollisionShape* shape = new ConvexHullShape(&vertices[0],vertices.size()); + + CreatePhysicsObject(isDynamic, mass, startTransform,shape); + } + } +}; + + #ifdef USE_FCOLLADA @@ -909,6 +945,7 @@ char* getLastFileName(); int main(int argc,char** argv) { + /// Import Collada 1.4 Physics objects //char* filename = "analyticalGeomPhysicsTest.dae";//ColladaPhysics.dae"; @@ -944,11 +981,48 @@ int main(int argc,char** argv) //BroadphaseInterface* broadphase = new SimpleBroadphase(); physicsEnvironmentPtr = new CcdPhysicsEnvironment(dispatcher,broadphase); physicsEnvironmentPtr->setDeactivationTime(2.f); - physicsEnvironmentPtr->setGravity(0,-10,0); + physicsEnvironmentPtr->setGravity(0,0,-10); physicsEnvironmentPtr->setDebugDrawer(&debugDrawer); +#ifdef QUAKE_BSP_IMPORTING + + void* memoryBuffer = 0; + char* bspfilename = "bsptest.bsp"; + FILE* file = fopen(bspfilename,"r"); + if (!file) + { + //try again other path, + //sight... visual studio leaves the current working directory in the projectfiles folder + //instead of executable folder. who wants this default behaviour?!? + bspfilename = "../../bsptest.bsp"; + file = fopen(bspfilename,"r"); + } + if (file) + { + BspLoader bspLoader; + int size=0; + if (fseek(file, 0, SEEK_END) || (size = ftell(file)) == EOF || fseek(file, 0, SEEK_SET)) { /* File operations denied? ok, just close and return failure */ + printf("Error: cannot get filesize from %s\n", bspfilename); + } else + { + //how to detect file size? + memoryBuffer = malloc(size+1); + fread(memoryBuffer,1,size,file); + bspLoader.LoadBSPFile( memoryBuffer); + + BspToBulletConverter bsp2bullet; + float bspScaling = 0.1f; + bsp2bullet.convertBsp(bspLoader,bspScaling); + + } + fclose(file); + } + +#endif + + #ifdef USE_FCOLLADA @@ -1777,7 +1851,7 @@ int main(int argc,char** argv) #endif clientResetScene(); - setCameraDistance(26.f); + setCameraDistance(16.f); return glutmain(argc, argv,640,480,"Bullet COLLADA Physics Viewer http://bullet.sourceforge.net"); } @@ -2095,9 +2169,15 @@ void clientResetScene() void shootBox(const SimdVector3& destination) { - //no objects to shoot - if (!numObjects) - return; + + bool isDynamic = true; + float mass = 1.f; + SimdTransform startTransform; + startTransform.setIdentity(); + startTransform.setOrigin(SimdVector3(eye[0],eye[1],eye[2])); + CollisionShape* boxShape = new BoxShape(SimdVector3(1.f,1.f,1.f)); + + CreatePhysicsObject(isDynamic, mass, startTransform,boxShape); int i = numObjects-1;