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

resource: compile scalars and vectors as Vector4

Daniele Bartolini 4 лет назад
Родитель
Сommit
162b767656
3 измененных файлов с 35 добавлено и 11 удалено
  1. 1 0
      docs/changelog.rst
  2. 33 10
      src/resource/material_resource.cpp
  3. 1 1
      src/resource/types.h

+ 1 - 0
docs/changelog.rst

@@ -8,6 +8,7 @@ Changelog
 **Data Compiler**
 
 * Windows: fixed garbage data written past EOF in some circumnstances.
+* Fixed uniform data compilation in materials.
 
 **Runtime**
 

+ 33 - 10
src/resource/material_resource.cpp

@@ -110,16 +110,15 @@ namespace material_resource_internal
 	{
 		const char* name;
 		UniformType::Enum type;
-		u8 size;
 	};
 
 	static const UniformTypeInfo s_uniform_type_info[] =
 	{
-		{ "float",     UniformType::FLOAT,      4 },
-		{ "vector2",   UniformType::VECTOR2,    8 },
-		{ "vector3",   UniformType::VECTOR3,   12 },
-		{ "vector4",   UniformType::VECTOR4,   16 },
-		{ "matrix4x4", UniformType::MATRIX4X4, 64 }
+		{ "float",     UniformType::FLOAT     },
+		{ "vector2",   UniformType::VECTOR2   },
+		{ "vector3",   UniformType::VECTOR3   },
+		{ "vector4",   UniformType::VECTOR4   },
+		{ "matrix4x4", UniformType::MATRIX4X4 }
 	};
 	CE_STATIC_ASSERT(countof(s_uniform_type_info) == UniformType::COUNT);
 
@@ -153,7 +152,7 @@ namespace material_resource_internal
 	static u32 reserve_dynamic_data(Array<char>& dynamic, T data)
 	{
 		u32 offt = array::size(dynamic);
-		array::push(dynamic, (char*) &data, sizeof(data));
+		array::push(dynamic, (char*)&data, sizeof(data));
 		return offt;
 	}
 
@@ -242,15 +241,39 @@ namespace material_resource_internal
 			switch (ud.type)
 			{
 			case UniformType::FLOAT:
-				reserve_dynamic_data(dynamic, sjson::parse_float(uniform["value"]));
+				{
+					const f32 value = sjson::parse_float(uniform["value"]);
+					Vector4 data;
+					data.x = value;
+					data.y = 0.0f;
+					data.z = 0.0f;
+					data.w = 0.0f;
+					reserve_dynamic_data(dynamic, data);
+				}
 				break;
 
 			case UniformType::VECTOR2:
-				reserve_dynamic_data(dynamic, sjson::parse_vector2(uniform["value"]));
+				{
+					const Vector2 value = sjson::parse_vector2(uniform["value"]);
+					Vector4 data;
+					data.x = value.x;
+					data.y = value.y;
+					data.z = 0.0f;
+					data.w = 0.0f;
+					reserve_dynamic_data(dynamic, data);
+				}
 				break;
 
 			case UniformType::VECTOR3:
-				reserve_dynamic_data(dynamic, sjson::parse_vector3(uniform["value"]));
+				{
+					const Vector3 value = sjson::parse_vector3(uniform["value"]);
+					Vector4 data;
+					data.x = value.x;
+					data.y = value.y;
+					data.z = value.z;
+					data.w = 0.0f;
+					reserve_dynamic_data(dynamic, data);
+				}
 				break;
 
 			case UniformType::VECTOR4:

+ 1 - 1
src/resource/types.h

@@ -62,7 +62,7 @@ struct UnitResource;
 #define RESOURCE_VERSION_FONT             RESOURCE_VERSION(1)
 #define RESOURCE_VERSION_UNIT             RESOURCE_VERSION(8)
 #define RESOURCE_VERSION_LEVEL            (RESOURCE_VERSION_UNIT + 4) //!< Level embeds UnitResource
-#define RESOURCE_VERSION_MATERIAL         RESOURCE_VERSION(2)
+#define RESOURCE_VERSION_MATERIAL         RESOURCE_VERSION(3)
 #define RESOURCE_VERSION_MESH             RESOURCE_VERSION(4)
 #define RESOURCE_VERSION_PACKAGE          RESOURCE_VERSION(5)
 #define RESOURCE_VERSION_PHYSICS_CONFIG   RESOURCE_VERSION(1)