07 Dec 2007
This commit is contained in:
parent
94d044bb27
commit
81f98231f4
|
@ -0,0 +1,11 @@
|
|||
|
||||
INCLUDE_DIRECTORIES(
|
||||
${BULLET_PHYSICS_SOURCE_DIR}/src }
|
||||
)
|
||||
|
||||
ADD_LIBRARY(LibLinearMath
|
||||
btQuickprof.cpp
|
||||
btGeometryUtil.cpp
|
||||
btAlignedAllocator.cpp
|
||||
)
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
SubDir TOP src LinearMath ;
|
||||
|
||||
Description bulletmath : "Bullet Math Library" ;
|
||||
|
||||
Library bulletmath :
|
||||
[ Wildcard *.h *.cpp ]
|
||||
;
|
||||
|
||||
#InstallHeader [ Wildcard *.h ] ;
|
|
@ -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++)
|
||||
|
|
|
@ -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<dplane_t> m_dplanes;
|
||||
|
||||
int m_numverts;
|
||||
btAlignedObjectArray<dvertex_t> m_vertices;
|
||||
|
||||
int m_numedges;
|
||||
btAlignedObjectArray<dedge_t> m_edges;
|
||||
|
||||
int m_numsurfedges;
|
||||
btAlignedObjectArray<int> m_surfedges;
|
||||
|
||||
int m_numnodes;
|
||||
btAlignedObjectArray<dnode_t> m_dnodes;
|
||||
|
||||
int m_numfaces;
|
||||
btAlignedObjectArray<dface_t> m_surfaces;
|
||||
|
||||
int m_numleafsurfaces;
|
||||
btAlignedObjectArray<short> m_dleafsurfaces;
|
||||
|
||||
|
@ -58,5 +72,12 @@ class BspLoader
|
|||
|
||||
int m_numPhysSurfaces;
|
||||
btAlignedObjectArray<csurface_t> m_physSurfaces;
|
||||
|
||||
// bvh triangle mesh
|
||||
int m_numTris;
|
||||
int m_numVerts;
|
||||
btScalar* g_vertices;
|
||||
int* g_indices;
|
||||
btBvhTriangleMeshShape* CollisionTree;
|
||||
};
|
||||
#endif//BSP_LOADER_H
|
|
@ -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];
|
||||
|
|
|
@ -81,7 +81,6 @@ protected:
|
|||
|
||||
int m_debugMode; // replace with cvar
|
||||
float m_WorldScale; // convert units to meters
|
||||
int m_numBodies;
|
||||
public:
|
||||
|
||||
btBulletPhysic();
|
||||
|
|
|
@ -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 )
|
||||
|
|
Reference in New Issue