#include "stdafx.h" #include "utils.h" #include "primitives.h" #include "geometries.h" #include "geoman.h" void CGeomManager::InitGeoman() { m_nGeomChunks=0; m_nGeomsInLastChunk=0; } void CGeomManager::ShutDownGeoman() { int i,j; for(i=0;i pVertices,index_t *pIndices,const short *pIds,int nTris, int flags,bool bCopyTriangles, bool bCopyVertices, float approx_tolerance, int nMinTrisPerNode,int nMaxTrisPerNode, float favorAABB) { vectorr axes[3],center; primitive *pprim; int i,itype = triangle::type; if (nTris<=0) return 0; if (pIds) { if (flags & mesh_uchar_ids) for(i=1;iCreateTriMesh(pVertices,pIndices,pIds,nTris, flags,bCopyTriangles,bCopyVertices, nMinTrisPerNode,nMaxTrisPerNode, favorAABB); else return CreatePrimitive(itype,pprim); } IGeometry *CGeomManager::CreatePrimitive(int type, const primitive *pprim) { switch (type) { case cylinder::type: return (new CCylinderGeom)->CreateCylinder((cylinder*)pprim); case sphere::type: return (new CSphereGeom)->CreateSphere((sphere*)pprim); case box::type: return (new CBoxGeom)->CreateBox((box*)pprim); case heightfield::type: return (new CHeightfield)->CreateHeightfield((heightfield*)pprim); case ray::type: return new CRayGeom((ray*)pprim); } return 0; } void CGeomManager::DestroyGeometry(IGeometry *pGeom) { pGeom->Release(); } int CGeomManager::AddRefGeometry(phys_geometry *pgeom) { return ++pgeom->nRefCount; } int CGeomManager::UnregisterGeometry(phys_geometry *pgeom) { if (--pgeom->nRefCount!=0) return pgeom->nRefCount; pgeom->pGeom->Release(); pgeom->pGeom = 0; if (pgeom-m_pGeoms[m_nGeomChunks-1]==m_nGeomsInLastChunk-1) m_nGeomsInLastChunk--; return 0; } phys_geometry *CGeomManager::GetFreeGeomSlot() { int i,j; for(i=0;i=m_nGeomChunks-1) for(j=0;jCalcPhysicalProperties(pgeom); pgeom->nRefCount = 1; pgeom->surface_idx = defSurfaceIdx; return pgeom; } void CGeomManager::SaveGeometry(CMemStream &stm, IGeometry *pGeom) { stm.Write(pGeom->GetType()); pGeom->Save(stm); } IGeometry *CGeomManager::LoadGeometry(CMemStream &stm) { int itype; stm.Read(itype); IGeometry *pGeom; switch (itype) { case GEOM_TRIMESH: pGeom = new CTriMesh; break; case GEOM_CYLINDER: pGeom = new CCylinderGeom; break; case GEOM_SPHERE: pGeom = new CSphereGeom; break; case GEOM_BOX: pGeom = new CBoxGeom; break; } pGeom->Load(stm); return pGeom; } void CGeomManager::SavePhysGeometry(CMemStream &stm, phys_geometry *pgeom) { stm.Write(*pgeom); SaveGeometry(stm,pgeom->pGeom); } phys_geometry *CGeomManager::LoadPhysGeometry(CMemStream &stm) { phys_geometry *pgeom = GetFreeGeomSlot(); stm.Read(*pgeom); pgeom->pGeom = LoadGeometry(stm); return pgeom; }