Daniele Bartolini 9 年 前
コミット
d9130d7d1e

+ 3 - 3
src/lua/lua_api.cpp

@@ -2883,21 +2883,21 @@ static int resource_package_tostring(lua_State* L)
 static int material_set_float(lua_State* L)
 {
 	LuaStack stack(L);
-	stack.get_material(1)->set_float(stack.get_string(2), stack.get_float(3));
+	stack.get_material(1)->set_float(stack.get_string_id_32(2), stack.get_float(3));
 	return 0;
 }
 
 static int material_set_vector2(lua_State* L)
 {
 	LuaStack stack(L);
-	stack.get_material(1)->set_vector2(stack.get_string(2), stack.get_vector2(3));
+	stack.get_material(1)->set_vector2(stack.get_string_id_32(2), stack.get_vector2(3));
 	return 0;
 }
 
 static int material_set_vector3(lua_State* L)
 {
 	LuaStack stack(L);
-	stack.get_material(1)->set_vector3(stack.get_string(2), stack.get_vector3(3));
+	stack.get_material(1)->set_vector3(stack.get_string_id_32(2), stack.get_vector3(3));
 	return 0;
 }
 

+ 10 - 10
src/resource/material_resource.cpp

@@ -140,8 +140,9 @@ namespace material_resource
 			array::push_back(names, '\0');
 
 			UniformData ud;
-			ud.name_offset = name_offset;
 			ud.type        = ut;
+			ud.name        = StringId32(key.data(), key.length());
+			ud.name_offset = name_offset;
 			ud.data_offset = reserve_dynamic_data(uh, dynamic);
 
 			switch (ud.type)
@@ -227,6 +228,7 @@ namespace material_resource
 		for (u32 i = 0; i < array::size(unidata); i++)
 		{
 			opts.write(unidata[i].type);
+			opts.write(unidata[i].name);
 			opts.write(unidata[i].name_offset);
 			opts.write(unidata[i].data_offset);
 		}
@@ -261,18 +263,16 @@ namespace material_resource
 		return &base[i];
 	}
 
-	UniformData* get_uniform_data_by_string(const MaterialResource* mr, const char* str)
+	UniformData* get_uniform_data_by_name(const MaterialResource* mr, StringId32 name)
 	{
 		for (u32 i = 0, n = mr->num_uniforms; i < n; ++i)
 		{
-			UniformData* base = get_uniform_data(mr, i);
-			const char* name = get_uniform_name(mr, base);
-
-			if (strcmp(str, name) == 0)
-				return base;
+			UniformData* data = get_uniform_data(mr, i);
+			if (data->name == name)
+				return data;
 		}
 
-		CE_ASSERT(false, "Bad uniform name: '%s'", str);
+		CE_FATAL("Unknown uniform");
 		return NULL;
 	}
 
@@ -298,9 +298,9 @@ namespace material_resource
 		return (UniformHandle*) (dynamic + ud->data_offset);
 	}
 
-	UniformHandle* get_uniform_handle_by_string(const MaterialResource* mr, const char* str, char* dynamic)
+	UniformHandle* get_uniform_handle_by_name(const MaterialResource* mr, StringId32 name, char* dynamic)
 	{
-		UniformData* ud = get_uniform_data_by_string(mr, str);
+		UniformData* ud = get_uniform_data_by_name(mr, name);
 		return (UniformHandle*) (dynamic + ud->data_offset);
 	}
 

+ 4 - 3
src/resource/material_resource.h

@@ -56,7 +56,8 @@ struct UniformType
 struct UniformData
 {
 	u32 type;        // UniformType::Enum
-	u32 name_offset; // Uniform name
+	StringId32 name; // Uniform name
+	u32 name_offset; // Uniform name (string)
 	u32 data_offset; // Offset into dynamic blob
 };
 
@@ -75,12 +76,12 @@ namespace material_resource
 	void unload(Allocator& a, void* res);
 
 	UniformData* get_uniform_data(const MaterialResource* mr, u32 i);
-	UniformData* get_uniform_data_by_string(const MaterialResource* mr, const char* str);
+	UniformData* get_uniform_data_by_name(const MaterialResource* mr, StringId32 name);
 	const char* get_uniform_name(const MaterialResource* mr, const UniformData* ud);
 	TextureData* get_texture_data(const MaterialResource* mr, u32 i);
 	const char* get_texture_name(const MaterialResource* mr, const TextureData* td);
 	UniformHandle* get_uniform_handle(const MaterialResource* mr, u32 i, char* dynamic);
-	UniformHandle* get_uniform_handle_by_string(const MaterialResource* mr, const char* str, char* dynamic);
+	UniformHandle* get_uniform_handle_by_name(const MaterialResource* mr, StringId32 name, char* dynamic);
 	TextureHandle* get_texture_handle(const MaterialResource* mr, u32 i, char* dynamic);
 } // namespace material_resource
 } // namespace crown

+ 9 - 12
src/world/material.cpp

@@ -47,25 +47,22 @@ void Material::bind(ResourceManager& rm, ShaderManager& sm, u8 view) const
 	bgfx::submit(view, sd.program);
 }
 
-void Material::set_float(const char* name, f32 val)
+void Material::set_float(StringId32 name, f32 value)
 {
-	using namespace material_resource;
-	char* p = (char*)get_uniform_handle_by_string(_resource, name, _data);
-	*((f32*)(p + sizeof(u32))) = val;
+	char* p = (char*)material_resource::get_uniform_handle_by_name(_resource, name, _data);
+	*(f32*)(p + sizeof(u32)) = value;
 }
 
-void Material::set_vector2(const char* name, const Vector2& val)
+void Material::set_vector2(StringId32 name, const Vector2& value)
 {
-	using namespace material_resource;
-	char* p = (char*)get_uniform_handle_by_string(_resource, name, _data);
-	*((Vector2*)(p + sizeof(u32))) = val;
+	char* p = (char*)material_resource::get_uniform_handle_by_name(_resource, name, _data);
+	*(Vector2*)(p + sizeof(u32)) = value;
 }
 
-void Material::set_vector3(const char* name, const Vector3& val)
+void Material::set_vector3(StringId32 name, const Vector3& value)
 {
-	using namespace material_resource;
-	char* p = (char*)get_uniform_handle_by_string(_resource, name, _data);
-	*((Vector3*)(p + sizeof(u32))) = val;
+	char* p = (char*)material_resource::get_uniform_handle_by_name(_resource, name, _data);
+	*(Vector3*)(p + sizeof(u32)) = value;
 }
 
 } // namespace crown

+ 12 - 3
src/world/material.h

@@ -11,15 +11,24 @@
 
 namespace crown
 {
+/// Material
+///
+/// @ingroup World
 struct Material
 {
 	const MaterialResource* _resource;
 	char* _data;
 
 	void bind(ResourceManager& rm, ShaderManager& sm, u8 view = 0) const;
-	void set_float(const char* name, f32 val);
-	void set_vector2(const char* name, const Vector2& val);
-	void set_vector3(const char* name, const Vector3& val);
+
+	/// Sets the @a value of the variable @a name.
+	void set_float(StringId32 name, f32 value);
+
+	/// Sets the @a value of the variable @a name.
+	void set_vector2(StringId32 name, const Vector2& value);
+
+	/// Sets the @a value of the variable @a name.
+	void set_vector3(StringId32 name, const Vector3& value);
 };
 
 } // namespace crown