OSDN Git Service

-manually deleting floors now deletes any walls created in the "external" mesh
authorryan <>
Sat, 1 Mar 2014 06:46:16 +0000 (06:46 +0000)
committerryan <>
Sat, 1 Mar 2014 06:46:16 +0000 (06:46 +0000)
-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
src/sbs/mesh.cpp
src/sbs/mesh.h
src/sbs/sbs.cpp

index 524680f..a478354 100644 (file)
@@ -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);
index 7e265f5..ac0de77 100644 (file)
@@ -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--;
+                       }
+               }
+       }
+}
index a3c140a..19c91f7 100644 (file)
@@ -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<Geometry> MeshGeometry; //mesh geometry (vertices/texels/normals) container
index fe2bf11..b565596 100644 (file)
@@ -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;