Просмотр исходного кода

Release Units when dtor called

Daniele Bartolini 12 лет назад
Родитель
Сommit
7a00e12b08
2 измененных файлов с 22 добавлено и 14 удалено
  1. 19 12
      engine/world/World.cpp
  2. 3 2
      engine/world/World.h

+ 19 - 12
engine/world/World.cpp

@@ -43,6 +43,16 @@ World::World()
 {
 }
 
+//-----------------------------------------------------------------------------
+World::~World()
+{
+	// Destroy all units
+	for (Unit** uu = m_units.begin(); uu != m_units.end(); uu++)
+	{
+		CE_DELETE(m_unit_pool, (*uu));
+	}
+}
+
 //-----------------------------------------------------------------------------
 UnitId World::spawn_unit(const char* name, const Vector3& pos, const Quaternion& rot)
 {
@@ -53,11 +63,8 @@ UnitId World::spawn_unit(const char* name, const Vector3& pos, const Quaternion&
 //-----------------------------------------------------------------------------
 UnitId World::spawn_unit(UnitResource* ur, const Vector3& pos, const Quaternion& rot)
 {
-	// Create a new scene graph
-	SceneGraph* sg = m_scenegraph_manager.create_scene_graph();
-
 	// Allocate memory for unit
-	Unit* unit = CE_NEW(m_unit_pool, Unit)(*this, *sg, ur, Matrix4x4(rot, pos));
+	Unit* unit = CE_NEW(m_unit_pool, Unit)(*this, ur, Matrix4x4(rot, pos));
 
 	// Create Id for the unit
 	const UnitId unit_id = m_units.create(unit);
@@ -71,12 +78,7 @@ void World::destroy_unit(UnitId id)
 {
 	CE_ASSERT(m_units.has(id), "Unit does not exist");
 
-	Unit* unit = m_units.lookup(id);
-
-	// Destry unit's scene graph
-	m_scenegraph_manager.destroy_scene_graph(&unit->m_scene_graph);
-
-	CE_DELETE(m_unit_pool, unit);
+	CE_DELETE(m_unit_pool, m_units.lookup(id));
 	m_units.destroy(id);
 }
 
@@ -160,8 +162,8 @@ void World::destroy_camera(CameraId id)
 {
 	CE_ASSERT(m_cameras.has(id), "Camera does not exist");
 
-	Camera* camera = m_cameras.lookup(id);
-	CE_DELETE(m_camera_pool, camera);
+	CE_DELETE(m_camera_pool, m_cameras.lookup(id));
+	m_cameras.destroy(id);
 }
 
 //-----------------------------------------------------------------------------
@@ -260,6 +262,11 @@ void World::set_sound_volume(SoundId id, const float vol)
 	sound.volume = vol;
 }
 
+//-----------------------------------------------------------------------------
+SceneGraphManager* World::scene_graph_manager()
+{
+	return &m_scenegraph_manager;
+}
 //-----------------------------------------------------------------------------
 RenderWorld* World::render_world()
 {

+ 3 - 2
engine/world/World.h

@@ -84,6 +84,7 @@ class World
 {
 public:
 										World();
+										~World();
 
 	UnitId								spawn_unit(const char* name, const Vector3& pos = Vector3::ZERO, const Quaternion& rot = Quaternion::IDENTITY);
 	UnitId								spawn_unit(UnitResource* ur, const Vector3& pos, const Quaternion& rot);
@@ -112,6 +113,7 @@ public:
 	void								set_sound_range(SoundId sound, const float range);
 	void								set_sound_volume(SoundId sound, const float vol);
 
+	SceneGraphManager*					scene_graph_manager();
 	RenderWorld*						render_world();
 	PhysicsWorld*						physics_world();
 
@@ -124,11 +126,10 @@ private:
 	IdArray<MAX_CAMERAS, Camera*>		m_cameras;
 	IdArray<MAX_SOUNDS, Sound> 			m_sounds;
 
-	SceneGraphManager					m_scenegraph_manager;
-
 	// Connections
 	List<UnitToSound>					m_unit_to_sound;
 
+	SceneGraphManager					m_scenegraph_manager;
 	RenderWorld							m_render_world;
 	PhysicsWorld						m_physics_world;
 };