Parcourir la source

resource: add functions to access component type's data

Daniele Bartolini il y a 5 ans
Parent
commit
8c14ff42af
4 fichiers modifiés avec 37 ajouts et 13 suppressions
  1. 19 0
      src/resource/unit_resource.cpp
  2. 10 2
      src/resource/unit_resource.h
  3. 4 6
      src/world/debug_line.cpp
  4. 4 5
      src/world/world.cpp

+ 19 - 0
src/resource/unit_resource.cpp

@@ -6,6 +6,7 @@
 #include "config.h"
 #include "core/containers/array.inl"
 #include "core/memory/globals.h"
+#include "core/memory/memory.inl"
 #include "resource/compile_options.inl"
 #include "resource/unit_compiler.h"
 #include "resource/unit_resource.h"
@@ -35,6 +36,24 @@ namespace unit_resource
 	const ComponentData* component_data(const UnitResource* ur)
 	{
 		return (ComponentData*)(&ur[1]);
+
+	const ComponentData* component_type_data(const UnitResource* ur, const ComponentData* component)
+	{
+		if (component == NULL)
+			return (ComponentData*)(&ur[1]);
+		else
+			return (ComponentData*)memory::align_top(component_payload(component) + component->data_size, alignof(ComponentData));
+	}
+
+	const u32* component_unit_index(const ComponentData* component)
+	{
+		return (u32*)(&component[1]);
+	}
+
+	const char* component_payload(const ComponentData* component)
+	{
+		const u32* unit_index = component_unit_index(component);
+		return (char*)memory::align_top(unit_index + component->num_instances, 16);
 	}
 
 } // namespace unit_resource

+ 10 - 2
src/resource/unit_resource.h

@@ -38,8 +38,16 @@ namespace unit_resource_internal
 
 namespace unit_resource
 {
-	/// Returns the first component data in the unit resource @ur.
-	const ComponentData* component_data(const UnitResource* ur);
+	/// Returns the first component type data in the unit resource @a ur, or, if
+	/// @a component is != NULL, it returns the next component type data after
+	/// it.
+	const ComponentData* component_type_data(const UnitResource* ur, const ComponentData* component);
+
+	/// Returns the payload data (the actual component data) for the @a component.
+	const char* component_payload(const ComponentData* component);
+
+	/// Returns the unit index of the @a component.
+	const u32* component_unit_index(const ComponentData* component);
 
 } // namespace unit_resource
 

+ 4 - 6
src/world/debug_line.cpp

@@ -212,13 +212,11 @@ void DebugLine::add_unit(ResourceManager& rm, const Matrix4x4& tm, StringId64 na
 {
 	const UnitResource& ur = *(const UnitResource*)rm.get(RESOURCE_TYPE_UNIT, name);
 
-	const char* component_data = (const char*)(&ur + 1);
-
+	const ComponentData* component = unit_resource::component_type_data(&ur, NULL);
 	for (u32 cc = 0; cc < ur.num_component_types; ++cc)
 	{
-		const ComponentData* component = (const ComponentData*)component_data;
-		const u32* unit_index = (const u32*)(component + 1);
-		const char* data = (const char*)(unit_index + component->num_instances);
+		const u32* unit_index = unit_resource::component_unit_index(component);
+		const char* data = unit_resource::component_payload(component);
 
 		if (component->type == COMPONENT_TYPE_MESH_RENDERER)
 		{
@@ -251,7 +249,7 @@ void DebugLine::add_unit(ResourceManager& rm, const Matrix4x4& tm, StringId64 na
 			}
 		}
 
-		component_data += component->data_size + sizeof(ComponentData);
+		component = unit_resource::component_type_data(&ur, component);
 	}
 }
 

+ 4 - 5
src/world/world.cpp

@@ -579,11 +579,11 @@ void spawn_units(World& w, const UnitResource& ur, const Vector3& pos, const Qua
 	AnimationStateMachine* animation_state_machine = w._animation_state_machine;
 
 	// Create components
-	const ComponentData* component = unit_resource::component_data(&ur);
+	const ComponentData* component = unit_resource::component_type_data(&ur, NULL);
 	for (u32 cc = 0; cc < ur.num_component_types; ++cc)
 	{
-		const u32* unit_index = (u32*)(component + 1);
-		const char* data = (char*)memory::align_top(unit_index + component->num_instances, 16);
+		const u32* unit_index = unit_resource::component_unit_index(component);
+		const char* data = unit_resource::component_payload(component);
 
 		if (component->type == COMPONENT_TYPE_TRANSFORM)
 		{
@@ -680,8 +680,7 @@ void spawn_units(World& w, const UnitResource& ur, const Vector3& pos, const Qua
 			CE_FATAL("Unknown component type");
 		}
 
-		// Advance to next component type
-		component = (ComponentData*)memory::align_top(data + component->data_size, alignof(ComponentData));
+		component = unit_resource::component_type_data(&ur, component);
 	}
 
 	for (u32 i = 0; i < ur.num_units; ++i)