diff options
Diffstat (limited to 'src/collision/ColModel.cpp')
-rw-r--r-- | src/collision/ColModel.cpp | 138 |
1 files changed, 100 insertions, 38 deletions
diff --git a/src/collision/ColModel.cpp b/src/collision/ColModel.cpp index 2224a804..944f76d8 100644 --- a/src/collision/ColModel.cpp +++ b/src/collision/ColModel.cpp @@ -1,4 +1,5 @@ #include "common.h" +#include "main.h" #include "ColModel.h" #include "Collision.h" #include "Game.h" @@ -7,6 +8,10 @@ CColModel::CColModel(void) { + boundingSphere.Set(0.0001f, CVector(0.0f, 0.0f, 0.0f)); + boundingBox.Set(CVector(0.0f, 0.0f, 0.0f), CVector(0.0f, 0.0f, 0.0f)); + numTriBBoxes = 0; + triBBoxes = nil; numSpheres = 0; spheres = nil; numLines = 0; @@ -18,14 +23,18 @@ CColModel::CColModel(void) triangles = nil; trianglePlanes = nil; level = LEVEL_GENERIC; // generic col slot - ownsCollisionVolumes = true; +// ownsCollisionVolumes = true; } CColModel::~CColModel(void) { - RemoveCollisionVolumes(); + if(!gNASTY_NASTY_MEM_SHUTDOWN_HACK){ + RemoveTrianglePlanes(); + RemoveCollisionVolumes(); + } } +//--LCS: no pool used, but maybe we better keep it? void* CColModel::operator new(size_t) throw() { @@ -43,19 +52,28 @@ CColModel::operator delete(void *p, size_t) throw() void CColModel::RemoveCollisionVolumes(void) { - if(ownsCollisionVolumes){ - RwFree(spheres); - RwFree(lines); - RwFree(boxes); - RwFree(vertices); - RwFree(triangles); - CCollision::RemoveTrianglePlanes(this); +#ifdef FIX_BUGS + // why is this missing? + if(ownsCollisionVolumes) +#endif + if(!gUseChunkFiles){ + delete[] triBBoxes; + delete[] spheres; + delete[] lines; + delete[] boxes; + delete[] vertices; + delete[] triangles; } + CCollision::RemoveTrianglePlanes(this); numSpheres = 0; + numTriBBoxes = 0; numLines = 0; numBoxes = 0; numTriangles = 0; spheres = nil; +#ifdef FIX_BUGS + triBBoxes = nil; +#endif lines = nil; boxes = nil; vertices = nil; @@ -68,7 +86,7 @@ CColModel::CalculateTrianglePlanes(void) PUSH_MEMID(MEMID_COLLISION); // HACK: allocate space for one more element to stuff the link pointer into - trianglePlanes = (CColTrianglePlane*)RwMalloc(sizeof(CColTrianglePlane) * (numTriangles+1)); + trianglePlanes = new CColTrianglePlane[numTriangles+1]; REGISTER_MEMPTR(&trianglePlanes); for(int i = 0; i < numTriangles; i++) trianglePlanes[i].Set(vertices, triangles[i]); @@ -79,8 +97,10 @@ CColModel::CalculateTrianglePlanes(void) void CColModel::RemoveTrianglePlanes(void) { - RwFree(trianglePlanes); - trianglePlanes = nil; + if(trianglePlanes){ + delete[] trianglePlanes; + trianglePlanes = nil; + } } void @@ -112,20 +132,33 @@ CColModel::operator=(const CColModel &other) boundingSphere = other.boundingSphere; boundingBox = other.boundingBox; + // copy tri bboxes + if(other.numTriBBoxes){ + if(numTriBBoxes != other.numTriBBoxes){ + numTriBBoxes = other.numTriBBoxes; + delete[] triBBoxes; + triBBoxes = new CColTriBBox[numTriBBoxes]; + } + for(i = 0; i < numTriBBoxes; i++) + triBBoxes[i] = other.triBBoxes[i]; + }else{ + numTriBBoxes = 0; + delete[] triBBoxes; + triBBoxes = nil; + } + // copy spheres if(other.numSpheres){ if(numSpheres != other.numSpheres){ numSpheres = other.numSpheres; - if(spheres) - RwFree(spheres); - spheres = (CColSphere*)RwMalloc(numSpheres*sizeof(CColSphere)); + delete[] spheres; + spheres = new CColSphere[numSpheres]; } for(i = 0; i < numSpheres; i++) spheres[i] = other.spheres[i]; }else{ numSpheres = 0; - if(spheres) - RwFree(spheres); + delete[] spheres; spheres = nil; } @@ -133,16 +166,14 @@ CColModel::operator=(const CColModel &other) if(other.numLines){ if(numLines != other.numLines){ numLines = other.numLines; - if(lines) - RwFree(lines); - lines = (CColLine*)RwMalloc(numLines*sizeof(CColLine)); + delete[] lines; + lines = new CColLine[numLines]; } for(i = 0; i < numLines; i++) lines[i] = other.lines[i]; }else{ numLines = 0; - if(lines) - RwFree(lines); + delete[] lines; lines = nil; } @@ -150,23 +181,21 @@ CColModel::operator=(const CColModel &other) if(other.numBoxes){ if(numBoxes != other.numBoxes){ numBoxes = other.numBoxes; - if(boxes) - RwFree(boxes); - boxes = (CColBox*)RwMalloc(numBoxes*sizeof(CColBox)); + delete[] boxes; + boxes = new CColBox[numBoxes]; } for(i = 0; i < numBoxes; i++) boxes[i] = other.boxes[i]; }else{ numBoxes = 0; - if(boxes) - RwFree(boxes); + delete[] boxes; boxes = nil; } // copy mesh if(other.numTriangles){ // copy vertices - numVerts = 0; + numVerts = -1; for(i = 0; i < other.numTriangles; i++){ if(other.triangles[i].a > numVerts) numVerts = other.triangles[i].a; @@ -176,10 +205,9 @@ CColModel::operator=(const CColModel &other) numVerts = other.triangles[i].c; } numVerts++; - if(vertices) - RwFree(vertices); + delete[] vertices; if(numVerts){ - vertices = (CompressedVector*)RwMalloc(numVerts*sizeof(CompressedVector)); + vertices = new CompressedVector[numVerts]; for(i = 0; i < numVerts; i++) vertices[i] = other.vertices[i]; } @@ -187,20 +215,54 @@ CColModel::operator=(const CColModel &other) // copy triangles if(numTriangles != other.numTriangles){ numTriangles = other.numTriangles; - if(triangles) - RwFree(triangles); - triangles = (CColTriangle*)RwMalloc(numTriangles*sizeof(CColTriangle)); + delete[] triangles; + triangles = new CColTriangle[numTriangles]; } for(i = 0; i < numTriangles; i++) triangles[i] = other.triangles[i]; }else{ numTriangles = 0; - if(triangles) - RwFree(triangles); + delete[] triangles; triangles = nil; - if(vertices) - RwFree(vertices); + delete[] vertices; vertices = nil; } return *this; } + +bool +CColModel::Write(base::cRelocatableChunkWriter &writer, bool allocSpace) +{ + int numVerts = -1; + for(int i = 0; i < numTriangles; i++){ + if(triangles[i].a > numVerts) + numVerts = triangles[i].a; + if(triangles[i].b > numVerts) + numVerts = triangles[i].b; + if(triangles[i].c > numVerts) + numVerts = triangles[i].c; + } + numVerts++; + + if(allocSpace) + writer.AllocateRaw(this, sizeof(*this), 16, false, true); + writer.AllocateRaw(spheres, sizeof(*spheres)*numSpheres, 16, false, true); + writer.AddPatch(&spheres); + writer.AllocateRaw(lines, sizeof(*lines)*numLines, 16, false, true); + writer.AddPatch(&lines); + writer.AllocateRaw(boxes, sizeof(*boxes)*numBoxes, 16, false, true); + writer.AddPatch(&boxes); + if(triBBoxes && numTriBBoxes != 0){ + writer.AllocateRaw(triBBoxes, sizeof(*triBBoxes)*numTriBBoxes, 16, false, true); + writer.AddPatch(&triBBoxes); + }else + triBBoxes = nil; + if(numTriangles != 0){ + writer.AllocateRaw(vertices, sizeof(*vertices)*numVerts, 2, false, true); + writer.AddPatch(&vertices); + writer.AllocateRaw(triangles, sizeof(*triangles)*numTriangles, 2, false, true); + writer.AddPatch(&triangles); + RemoveTrianglePlanes(); + } + return 1; +} |