2
0
Эх сурвалжийг харах

Implement component spawn order

Daniele Bartolini 9 жил өмнө
parent
commit
61d3b319d6

+ 29 - 17
src/resource/unit_compiler.cpp

@@ -175,16 +175,17 @@ UnitCompiler::UnitCompiler(CompileOptions& opts)
 	: _opts(opts)
 	, _num_units(0)
 	, _component_data(default_allocator())
+	, _component_info(default_allocator())
 {
-	register_component_compiler("transform",       &compile_transform, 0.0f);
-	register_component_compiler("camera",          &compile_camera, 1.0f);
-	register_component_compiler("mesh_renderer",   &compile_mesh_renderer, 1.0f);
-	register_component_compiler("sprite_renderer", &compile_sprite_renderer, 1.0f);
-	register_component_compiler("light",           &compile_light, 1.0f);
+	register_component_compiler("transform",       &compile_transform,                    0.0f);
+	register_component_compiler("camera",          &compile_camera,                       1.0f);
+	register_component_compiler("mesh_renderer",   &compile_mesh_renderer,                1.0f);
+	register_component_compiler("sprite_renderer", &compile_sprite_renderer,              1.0f);
+	register_component_compiler("light",           &compile_light,                        1.0f);
 	register_component_compiler("controller",      &physics_resource::compile_controller, 1.0f);
-	register_component_compiler("collider",        &physics_resource::compile_collider, 1.0f);
-	register_component_compiler("actor",           &physics_resource::compile_actor, 1.0f);
-	register_component_compiler("joint",           &physics_resource::compile_joint, 1.0f);
+	register_component_compiler("collider",        &physics_resource::compile_collider,   1.0f);
+	register_component_compiler("actor",           &physics_resource::compile_actor,      2.0f);
+	register_component_compiler("joint",           &physics_resource::compile_joint,      3.0f);
 }
 
 Buffer UnitCompiler::read_unit(const char* path)
@@ -318,15 +319,14 @@ Buffer UnitCompiler::blob()
 	Buffer buf(default_allocator());
 	array::push(buf, (char*)&ur, sizeof(ur));
 
-	begin = sort_map::begin(_component_data);
-	end = sort_map::end(_component_data);
-
-	for (; begin != end; --end)
+	for (u32 i = 0; i < array::size(_component_info); ++i)
 	{
-		const StringId32 type        = (end-1)->pair.first;
-		const Buffer& data           = (end-1)->pair.second._data;
-		const Array<u32>& unit_index = (end-1)->pair.second._unit_index;
-		const u32 num                = (end-1)->pair.second._num;
+		const StringId32 type        = _component_info[i]._type;
+		const ComponentTypeData& ctd = sort_map::get(_component_data, type, ComponentTypeData(default_allocator()));
+
+		const Buffer& data           = ctd._data;
+		const Array<u32>& unit_index = ctd._unit_index;
+		const u32 num                = ctd._num;
 
 		if (num > 0)
 		{
@@ -354,12 +354,24 @@ void UnitCompiler::add_component_data(StringId32 type, const Buffer& data, u32 u
 }
 
 void UnitCompiler::register_component_compiler(const char* type, CompileFunction fn, f32 spawn_order)
+{
+	register_component_compiler(StringId32(type), fn, spawn_order);
+}
+
+void UnitCompiler::register_component_compiler(StringId32 type, CompileFunction fn, f32 spawn_order)
 {
 	ComponentTypeData ctd(default_allocator());
 	ctd._compiler = fn;
 
-	sort_map::set(_component_data, StringId32(type), ctd);
+	ComponentTypeInfo cti;
+	cti._type = type;
+	cti._spawn_order = spawn_order;
+
+	sort_map::set(_component_data, type, ctd);
 	sort_map::sort(_component_data);
+
+	array::push_back(_component_info, cti);
+	std::sort(array::begin(_component_info), array::end(_component_info));
 }
 
 Buffer UnitCompiler::compile_component(StringId32 type, const char* json)

+ 14 - 0
src/resource/unit_compiler.h

@@ -33,13 +33,27 @@ class UnitCompiler
 		}
 	};
 
+	struct ComponentTypeInfo
+	{
+		StringId32 _type;
+		float _spawn_order;
+
+		bool operator<(const ComponentTypeInfo& a)
+		{
+			return _spawn_order < a._spawn_order;
+		}
+	};
+
 	typedef SortMap<StringId32, ComponentTypeData> ComponentTypeMap;
+	typedef Array<ComponentTypeInfo> ComponentTypeArray;
 
 	CompileOptions& _opts;
 	u32 _num_units;
 	ComponentTypeMap _component_data;
+	ComponentTypeArray _component_info;
 
 	void register_component_compiler(const char* type, CompileFunction fn, f32 spawn_order);
+	void register_component_compiler(StringId32 type, CompileFunction fn, f32 spawn_order);
 	Buffer compile_component(StringId32 type, const char* json);
 	void add_component_data(StringId32 type, const Buffer& data, u32 unit_index);