From 81f98231f4913835d50d97fce3dbd0f68e522b08 Mon Sep 17 00:00:00 2001 From: g-cont Date: Fri, 7 Dec 2007 00:00:00 +0300 Subject: [PATCH] 07 Dec 2007 --- .../{btSolverBody.h => btsolverbody.h} | 0 ...olverConstraint.h => btsolverconstraint.h} | 0 physic/LinearMath/CMakeLists.txt | 11 +++ physic/LinearMath/Jamfile | 9 ++ physic/btBulletBspLoader.cpp | 84 ++++++++++++++++++- physic/btBulletBspLoader.h | 21 +++++ physic/btBulletWorld.cpp | 6 +- physic/btBulletWorld.h | 1 - physic/pworld.cpp | 3 +- 9 files changed, 127 insertions(+), 8 deletions(-) rename physic/BulletDynamics/ConstraintSolver/{btSolverBody.h => btsolverbody.h} (100%) rename physic/BulletDynamics/ConstraintSolver/{btSolverConstraint.h => btsolverconstraint.h} (100%) create mode 100644 physic/LinearMath/CMakeLists.txt create mode 100644 physic/LinearMath/Jamfile diff --git a/physic/BulletDynamics/ConstraintSolver/btSolverBody.h b/physic/BulletDynamics/ConstraintSolver/btsolverbody.h similarity index 100% rename from physic/BulletDynamics/ConstraintSolver/btSolverBody.h rename to physic/BulletDynamics/ConstraintSolver/btsolverbody.h diff --git a/physic/BulletDynamics/ConstraintSolver/btSolverConstraint.h b/physic/BulletDynamics/ConstraintSolver/btsolverconstraint.h similarity index 100% rename from physic/BulletDynamics/ConstraintSolver/btSolverConstraint.h rename to physic/BulletDynamics/ConstraintSolver/btsolverconstraint.h diff --git a/physic/LinearMath/CMakeLists.txt b/physic/LinearMath/CMakeLists.txt new file mode 100644 index 00000000..82393547 --- /dev/null +++ b/physic/LinearMath/CMakeLists.txt @@ -0,0 +1,11 @@ + +INCLUDE_DIRECTORIES( +${BULLET_PHYSICS_SOURCE_DIR}/src } +) + +ADD_LIBRARY(LibLinearMath +btQuickprof.cpp +btGeometryUtil.cpp +btAlignedAllocator.cpp +) + diff --git a/physic/LinearMath/Jamfile b/physic/LinearMath/Jamfile new file mode 100644 index 00000000..3c2adfc2 --- /dev/null +++ b/physic/LinearMath/Jamfile @@ -0,0 +1,9 @@ +SubDir TOP src LinearMath ; + +Description bulletmath : "Bullet Math Library" ; + +Library bulletmath : +[ Wildcard *.h *.cpp ] + ; + +#InstallHeader [ Wildcard *.h ] ; diff --git a/physic/btBulletBspLoader.cpp b/physic/btBulletBspLoader.cpp index 1b8ae934..ffcf5163 100644 --- a/physic/btBulletBspLoader.cpp +++ b/physic/btBulletBspLoader.cpp @@ -56,11 +56,26 @@ bool BspLoader::loadBSPFile( uint* memoryBuffer) m_dbrushes.resize(length+extrasize); m_numbrushes = copyLump( header, LUMP_BRUSHES, &m_dbrushes[0], sizeof(dbrush_t)); - length = (header->lumps[LUMP_BRUSHSIDES].filelen) / sizeof(dbrushside_t); m_dbrushsides.resize(length+extrasize); m_numbrushsides = copyLump( header, LUMP_BRUSHSIDES, &m_dbrushsides[0], sizeof(dbrushside_t)); + length = (header->lumps[LUMP_VERTEXES].filelen) / sizeof(dvertex_t); + m_vertices.resize(length + extrasize); + m_numverts = copyLump( header, LUMP_VERTEXES, &m_vertices[0], sizeof(dvertex_t)); + + length = (header->lumps[LUMP_EDGES].filelen) / sizeof(dedge_t); + m_edges.resize(length + extrasize); + m_numedges = copyLump( header, LUMP_EDGES, &m_edges[0], sizeof(dedge_t)); + + length = (header->lumps[LUMP_SURFEDGES].filelen) / sizeof(m_surfedges[0]); + m_surfedges.resize(length + extrasize); + m_numsurfedges = copyLump( header, LUMP_SURFEDGES, &m_surfedges[0], sizeof(m_surfedges[0])); + + length = (header->lumps[LUMP_FACES].filelen) / sizeof(dface_t); + m_surfaces.resize(length + extrasize); + m_numfaces = copyLump( header, LUMP_FACES, &m_surfaces[0], sizeof(dface_t)); + // swap everything //swapBSPFile(); @@ -70,6 +85,73 @@ bool BspLoader::loadBSPFile( uint* memoryBuffer) return false; } +void BspLoader::buildTriMesh( void ) +{ + int vertStride = 3 * sizeof(btScalar); + int indexStride = 3 * sizeof(int); + int k; + + // convert from tri-fans to tri-list + m_numTris = 0; + + // get number of triangles + for(int i = 0; i < m_numfaces; i++) + { + if(m_surfaces[i].numedges) + { + m_numTris += m_surfaces[i].numedges - 2; + Msg("face [%i] numverts[%i]\n", i, m_surfaces[i].numedges ); + } + } + + g_vertices = new btScalar[m_numverts * 3]; + g_indices = new int[m_numTris * 3]; + + // transform all vertices + for( i = 0, k = 0; i < m_numverts; i++) + { + vec3_t temp; + VectorCopy(m_vertices[i].point, temp ); + ConvertPositionToPhysic( temp ); + g_vertices[k++] = temp[0]; + g_vertices[k++] = temp[1]; + g_vertices[k++] = temp[2]; + } + Msg("total verts %d\n", k ); + + // build indices list + for(k = 0, i = 0; i < m_numfaces; i++) + { + const dface_t& pFace = m_surfaces[i]; + int startVertex = pFace.firstedge; + + for(int j = 0; j < pFace.numedges - 2; j++) + { + int lindex = m_surfedges[startVertex + j]; + int realIndex; + + if(lindex > 0) realIndex = m_edges[lindex].v[0]; + else realIndex = m_edges[-lindex].v[1]; + + g_indices[k++] = realIndex; + g_indices[k++] = realIndex + j + 2; + g_indices[k++] = realIndex + j + 1; + } + } + Msg("total verts %d\n", k ); + + btTriangleIndexVertexArray* indexVertexArrays = new btTriangleIndexVertexArray(m_numTris, g_indices, indexStride, m_numverts, &g_vertices[0], vertStride); + CollisionTree = new btBvhTriangleMeshShape( indexVertexArrays, true ); + + btTransform startTransform; + btRigidBody* staticBody; + + startTransform.setIdentity(); + staticBody = g_PhysWorld->AddStaticRigidBody( startTransform, CollisionTree ); + staticBody->setCollisionFlags(staticBody->getCollisionFlags() | btCollisionObject::CF_STATIC_OBJECT); + staticBody->setCollisionFlags(staticBody->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); +} + void BspLoader::convertBsp( float scale ) { for (int i = 0; i < m_numleafs; i++) diff --git a/physic/btBulletBspLoader.h b/physic/btBulletBspLoader.h index c4b49481..24859070 100644 --- a/physic/btBulletBspLoader.h +++ b/physic/btBulletBspLoader.h @@ -18,6 +18,7 @@ subject to the following restrictions: #include "LinearMath/btAlignedObjectArray.h" #include "LinearMath/btVector3.h" #include "LinearMath/btGeometryUtil.h" +#include "BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h" #include "physic.h" class BspLoader @@ -26,6 +27,7 @@ class BspLoader BspLoader(){ } // constructor bool loadBSPFile( uint* memoryBuffer); + void buildTriMesh( void ); void convertBsp( float scale ); int copyLump( dheader_t *header, int lump, void *dest, int size ); @@ -41,9 +43,21 @@ class BspLoader int m_numplanes; btAlignedObjectArray m_dplanes; + int m_numverts; + btAlignedObjectArray m_vertices; + + int m_numedges; + btAlignedObjectArray m_edges; + + int m_numsurfedges; + btAlignedObjectArray m_surfedges; + int m_numnodes; btAlignedObjectArray m_dnodes; + int m_numfaces; + btAlignedObjectArray m_surfaces; + int m_numleafsurfaces; btAlignedObjectArray m_dleafsurfaces; @@ -58,5 +72,12 @@ class BspLoader int m_numPhysSurfaces; btAlignedObjectArray m_physSurfaces; + + // bvh triangle mesh + int m_numTris; + int m_numVerts; + btScalar* g_vertices; + int* g_indices; + btBvhTriangleMeshShape* CollisionTree; }; #endif//BSP_LOADER_H \ No newline at end of file diff --git a/physic/btBulletWorld.cpp b/physic/btBulletWorld.cpp index 252869be..50e1ed53 100644 --- a/physic/btBulletWorld.cpp +++ b/physic/btBulletWorld.cpp @@ -26,7 +26,7 @@ subject to the following restrictions: CM_Debug DebugDrawer; -btBulletPhysic::btBulletPhysic(): m_World(0), m_numBodies(0), m_debugMode(0), m_WorldScale(METERS_PER_INCH) +btBulletPhysic::btBulletPhysic(): m_World(0), m_debugMode(0), m_WorldScale(METERS_PER_INCH) { btVector3 m_worldAabbMin(-1000, -1000, -1000), m_worldAabbMax(1000, 1000, 1000); @@ -59,7 +59,6 @@ void btBulletPhysic::DeleteAllBodies( void ) btRigidBody* body = btRigidBody::upcast(obj); m_World->removeRigidBody( body ); m_World->removeCollisionObject(obj); - m_numBodies--; } } @@ -73,7 +72,6 @@ btRigidBody* btBulletPhysic::AddDynamicRigidBody(float mass, const btTransform& btDefaultMotionState* m_State = new btDefaultMotionState( startTransform ); btRigidBody* m_body = new btRigidBody(mass, m_State, shape, localInertia ); m_World->addRigidBody(m_body); - m_numBodies++; return m_body; } @@ -84,7 +82,6 @@ btRigidBody* btBulletPhysic::AddStaticRigidBody(const btTransform& startTransfor btDefaultMotionState* m_State = new btDefaultMotionState(startTransform); btRigidBody* m_body = new btRigidBody(0.f, m_State, shape); m_World->addRigidBody(m_body); - m_numBodies++; return m_body; } @@ -108,7 +105,6 @@ void btBulletPhysic::PhysicFrame( void ) if(m_World) { int numObjects = m_World->getNumCollisionObjects(); - Msg("total bodies %d, realnum %d\n", m_numBodies, numObjects ); for (int i = 0; i < numObjects; i++) { btCollisionObject* colObj = m_World->getCollisionObjectArray()[i]; diff --git a/physic/btBulletWorld.h b/physic/btBulletWorld.h index df6aa07d..290ad731 100644 --- a/physic/btBulletWorld.h +++ b/physic/btBulletWorld.h @@ -81,7 +81,6 @@ protected: int m_debugMode; // replace with cvar float m_WorldScale; // convert units to meters - int m_numBodies; public: btBulletPhysic(); diff --git a/physic/pworld.cpp b/physic/pworld.cpp index b43c6106..525841e2 100644 --- a/physic/pworld.cpp +++ b/physic/pworld.cpp @@ -43,7 +43,8 @@ void Phys_LoadBSP( uint *buffer ) BspLoader WorldHull; WorldHull.loadBSPFile( buffer ); - WorldHull.convertBsp( g_PhysWorld->getScale()); + //WorldHull.convertBsp( g_PhysWorld->getScale()); + WorldHull.buildTriMesh();// test } void Phys_FreeBSP( void )