07 Dec 2007

This commit is contained in:
g-cont 2007-12-07 00:00:00 +03:00 committed by Alibek Omarov
parent 94d044bb27
commit 81f98231f4
9 changed files with 127 additions and 8 deletions

View File

@ -0,0 +1,11 @@
INCLUDE_DIRECTORIES(
${BULLET_PHYSICS_SOURCE_DIR}/src }
)
ADD_LIBRARY(LibLinearMath
btQuickprof.cpp
btGeometryUtil.cpp
btAlignedAllocator.cpp
)

View File

@ -0,0 +1,9 @@
SubDir TOP src LinearMath ;
Description bulletmath : "Bullet Math Library" ;
Library bulletmath :
[ Wildcard *.h *.cpp ]
;
#InstallHeader [ Wildcard *.h ] ;

View File

@ -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++)

View File

@ -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

View File

@ -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];

View File

@ -81,7 +81,6 @@ protected:
int m_debugMode; // replace with cvar
float m_WorldScale; // convert units to meters
int m_numBodies;
public:
btBulletPhysic();

View File

@ -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 )