Daniele Bartolini 1 год назад
Родитель
Сommit
bc85fa68a4
3 измененных файлов с 15 добавлено и 14 удалено
  1. 1 0
      docs/changelog.rst
  2. 12 14
      src/world/world.cpp
  3. 2 0
      src/world/world.h

+ 1 - 0
docs/changelog.rst

@@ -7,6 +7,7 @@ Changelog
 **Runtime**
 
 * Lua: fixed max temporaries check failing to trigger in some circumnstances.
+* Fixed a crash when moving many objects simultaneusly.
 
 0.54.0 --- 13 Jan 2025
 ----------------------

+ 12 - 14
src/world/world.cpp

@@ -50,6 +50,8 @@ World::World(Allocator &a, ResourceManager &rm, ShaderManager &sm, MaterialManag
 	, _camera(a)
 	, _camera_map(a)
 	, _events(a)
+	, _changed_units(a)
+	, _changed_world(a)
 	, _gui_buffer(sm)
 {
 	_lines = create_debug_line(true);
@@ -192,15 +194,11 @@ void World::update_scene(f32 dt)
 		array::clear(events);
 	}
 
-	TempAllocator4096 ta;
-	Array<UnitId> changed_units(ta);
-	Array<Matrix4x4> changed_world(ta);
+	_scene_graph->get_changed(_changed_units, _changed_world);
 
-	_scene_graph->get_changed(changed_units, changed_world);
-
-	_physics_world->update_actor_world_poses(array::begin(changed_units)
-		, array::end(changed_units)
-		, array::begin(changed_world)
+	_physics_world->update_actor_world_poses(array::begin(_changed_units)
+		, array::end(_changed_units)
+		, array::begin(_changed_world)
 		);
 
 	_physics_world->update(dt);
@@ -242,14 +240,14 @@ void World::update_scene(f32 dt)
 		array::clear(events);
 	}
 
-	array::clear(changed_units);
-	array::clear(changed_world);
-	_scene_graph->get_changed(changed_units, changed_world);
+	array::clear(_changed_units);
+	array::clear(_changed_world);
+	_scene_graph->get_changed(_changed_units, _changed_world);
 	_scene_graph->clear_changed();
 
-	_render_world->update_transforms(array::begin(changed_units)
-		, array::end(changed_units)
-		, array::begin(changed_world)
+	_render_world->update_transforms(array::begin(_changed_units)
+		, array::end(_changed_units)
+		, array::begin(_changed_world)
 		);
 
 	_sound_world->update();

+ 2 - 0
src/world/world.h

@@ -56,6 +56,8 @@ struct World
 	HashMap<UnitId, u32> _camera_map;
 
 	EventStream _events;
+	Array<UnitId> _changed_units;
+	Array<Matrix4x4> _changed_world;
 	GuiBuffer _gui_buffer;
 
 	ListNode _guis;