Przeglądaj źródła

Unregister destroy function

Daniele Bartolini 10 lat temu
rodzic
commit
71b1f000c5

+ 4 - 0
src/world/physics_world_bullet.cpp

@@ -157,6 +157,7 @@ public:
 
 	BulletWorld(Allocator& a, ResourceManager& rm, UnitManager& um, DebugLine& dl)
 		: _allocator(&a)
+		, _unit_manager(&um)
 		, _collider_map(a)
 		, _actor_map(a)
 		, _controller_map(a)
@@ -186,6 +187,8 @@ public:
 
 	~BulletWorld()
 	{
+		_unit_manager->unregister_destroy_function(this);
+
 		for (u32 i = 0; i < array::size(_actor); ++i)
 		{
 			btRigidBody* rb = _actor[i].actor;
@@ -963,6 +966,7 @@ private:
 	};
 
 	Allocator* _allocator;
+	UnitManager* _unit_manager;
 
 	Hash<u32> _collider_map;
 	Hash<u32> _actor_map;

+ 3 - 0
src/world/render_world.cpp

@@ -25,6 +25,7 @@ RenderWorld::RenderWorld(Allocator& a, ResourceManager& rm, ShaderManager& sm, M
 	, _resource_manager(&rm)
 	, _shader_manager(&sm)
 	, _material_manager(&mm)
+	, _unit_manager(&um)
 	, _debug_drawing(false)
 	, _mesh_manager(a)
 	, _sprite_manager(a)
@@ -39,6 +40,8 @@ RenderWorld::RenderWorld(Allocator& a, ResourceManager& rm, ShaderManager& sm, M
 
 RenderWorld::~RenderWorld()
 {
+	_unit_manager->unregister_destroy_function(this);
+
 	bgfx::destroyUniform(_u_light_pos);
 	bgfx::destroyUniform(_u_light_dir);
 	bgfx::destroyUniform(_u_light_col);

+ 1 - 0
src/world/render_world.h

@@ -264,6 +264,7 @@ private:
 	ResourceManager* _resource_manager;
 	ShaderManager* _shader_manager;
 	MaterialManager* _material_manager;
+	UnitManager* _unit_manager;
 
 	bgfx::UniformHandle _u_light_pos;
 	bgfx::UniformHandle _u_light_dir;

+ 15 - 0
src/world/unit_manager.cpp

@@ -73,6 +73,21 @@ void UnitManager::register_destroy_function(DestroyFunction fn, void* user_ptr)
 	array::push_back(_destroy_callbacks, dd);
 }
 
+void UnitManager::unregister_destroy_function(void* user_ptr)
+{
+	for (u32 i = 0, n = array::size(_destroy_callbacks); i < n; ++i)
+	{
+		if (_destroy_callbacks[i].user_ptr == user_ptr)
+		{
+			_destroy_callbacks[i] = _destroy_callbacks[n - 1];
+			array::pop_back(_destroy_callbacks);
+			return;
+		}
+	}
+
+	CE_ASSERT(false, "Bad destroy function");
+}
+
 void UnitManager::trigger_destroy_callbacks(UnitId id)
 {
 	for (u32 i = 0; i < array::size(_destroy_callbacks); ++i)

+ 2 - 0
src/world/unit_manager.h

@@ -50,6 +50,8 @@ public:
 
 	void register_destroy_function(DestroyFunction fn, void* user_ptr);
 
+	void unregister_destroy_function(void* user_ptr);
+
 	void trigger_destroy_callbacks(UnitId id);
 };