From c644599c91e1508ad7623938dfde3390daa2ffe1 Mon Sep 17 00:00:00 2001 From: ryan <> Date: Sat, 1 Mar 2014 06:46:16 +0000 Subject: [PATCH] -manually deleting floors now deletes any walls created in the "external" mesh -do not process geometry buffers if no data exists - fixes a crash on Windows -fixed a vector overrun (element was removed before accessed) --- src/sbs/floor.cpp | 4 ++++ src/sbs/mesh.cpp | 57 +++++++++++++++++++++++++++++++++++++++++++------------ src/sbs/mesh.h | 2 ++ src/sbs/sbs.cpp | 3 ++- 4 files changed, 53 insertions(+), 13 deletions(-) diff --git a/src/sbs/floor.cpp b/src/sbs/floor.cpp index 524680f7..a478354d 100644 --- a/src/sbs/floor.cpp +++ b/src/sbs/floor.cpp @@ -194,6 +194,10 @@ Floor::~Floor() delete ColumnFrame; ColumnFrame = 0; + //delete walls in external mesh + if (sbs->FastDelete == false) + sbs->External->DeleteWalls(object); + //unregister from parent if (sbs->FastDelete == false && object->parent_deleting == false) sbs->RemoveFloor(this); diff --git a/src/sbs/mesh.cpp b/src/sbs/mesh.cpp index 7e265f5f..ac0de77a 100644 --- a/src/sbs/mesh.cpp +++ b/src/sbs/mesh.cpp @@ -895,15 +895,7 @@ MeshObject::~MeshObject() DeleteCollider(); //delete wall objects - for (int i = 0; i < (int)Walls.size(); i++) - { - if (Walls[i]) - { - Walls[i]->parent_deleting = true; - delete Walls[i]; - } - Walls[i] = 0; - } + DeleteWalls(); std::string nodename; if (SceneNode) @@ -1530,15 +1522,19 @@ void MeshObject::Prepare() if (prepared == true) return; - //exit if there's no submesh data - if (Submeshes.size() == 0) + //clear vertex data and exit if there's no associated submesh or geometry data + if (Submeshes.size() == 0 || MeshGeometry.size() == 0) + { + delete MeshWrapper->sharedVertexData; + MeshWrapper->sharedVertexData = new Ogre::VertexData(); return; + } Ogre::Real radius = 0; Ogre::AxisAlignedBox box; //set up vertex buffer - OGRE_DELETE MeshWrapper->sharedVertexData; + delete MeshWrapper->sharedVertexData; Ogre::VertexData* data = new Ogre::VertexData(); MeshWrapper->sharedVertexData = data; data->vertexCount = MeshGeometry.size(); @@ -2089,3 +2085,40 @@ void MeshObject::GetMeshInformation(const Ogre::Mesh* const mesh, int &vertex_co current_offset = next_offset; } } + +void MeshObject::DeleteWalls() +{ + //delete all wall objects + + for (int i = 0; i < (int)Walls.size(); i++) + { + WallObject *wall = Walls[i]; + if (wall) + { + wall->parent_deleting = true; + delete wall; + Walls[i] = 0; + } + } +} + +void MeshObject::DeleteWalls(Object *parent) +{ + //delete walls of specified parent object + + for (int i = 0; i < (int)Walls.size(); i++) + { + WallObject *wall = Walls[i]; + if (wall) + { + if (wall->GetParent() == parent) + { + wall->parent_deleting = true; + wall->DeletePolygons(); + delete wall; + Walls.erase(Walls.begin() + i); + i--; + } + } + } +} diff --git a/src/sbs/mesh.h b/src/sbs/mesh.h index a3c140a8..19c91f74 100644 --- a/src/sbs/mesh.h +++ b/src/sbs/mesh.h @@ -115,6 +115,8 @@ public: void GetMeshInformation(const Ogre::Mesh* const mesh, int &vertex_count, Ogre::Vector3* &vertices, int &index_count, unsigned long* &indices, float scale_multiplier, Ogre::AxisAlignedBox &extents); void CreateColliderFromModel(int &vertex_count, Ogre::Vector3* &vertices, int &index_count, unsigned long* &indices); void CreateBoxCollider(float scale_multiplier); + void DeleteWalls(); + void DeleteWalls(Object *parent); Ogre::MeshPtr MeshWrapper; //mesh std::vector MeshGeometry; //mesh geometry (vertices/texels/normals) container diff --git a/src/sbs/sbs.cpp b/src/sbs/sbs.cpp index fe2bf11a..b565596e 100644 --- a/src/sbs/sbs.cpp +++ b/src/sbs/sbs.cpp @@ -3358,12 +3358,13 @@ void SBS::RemoveFloor(Floor *floor) { if (FloorArray[i].object == floor) { - FloorArray.erase(FloorArray.begin() + i); if (FloorArray[i].object->Number < 0) Basements--; else Floors--; + FloorArray.erase(FloorArray.begin() + i); + //clear cached values getfloor_result = 0; getfloor_number = 0; -- 2.11.0