Selaa lähdekoodia

world: add Material.set_vector4() and Material.set_matrix4x4()

Daniele Bartolini 6 vuotta sitten
vanhempi
sitoutus
c7a42357e2

+ 1 - 0
CHANGELOG.md

@@ -6,6 +6,7 @@ Changelog
 *DD MMM YYYY*
 
 * runtime: added RenderWorld.mesh_set_material()
+* runtime: added Material.set_vector4() and Material.set_matrix4x4()
 * runtime: added the ability to scale the shape of colliders at Unit spawn time
 * runtime: added World.unit_by_name() to retrieve unit by its name in the Level Editor
 * runtime: fixed an issue that caused PhysicsWorld.set_gravity() to re-enable gravity to actors that previously disabled it with PhysicsWorld.actor_disable_gravity()

+ 6 - 0
docs/lua_api.rst

@@ -597,6 +597,12 @@ Material
 **set_vector3** (material, name, value)
 	Sets the *value* of the variable *name*.
 
+**set_vector4** (material, name, value)
+	Sets the *value* of the variable *name*.
+
+**set_matrix4x4** (material, name, value)
+	Sets the *value* of the variable *name*.
+
 RenderWorld
 ===========
 

+ 12 - 0
src/lua/lua_api.cpp

@@ -2940,6 +2940,18 @@ void load_api(LuaEnvironment& env)
 			stack.get_material(1)->set_vector3(stack.get_string_id_32(2), stack.get_vector3(3));
 			return 0;
 		});
+	env.add_module_function("Material", "set_vector4", [](lua_State* L)
+		{
+			LuaStack stack(L);
+			stack.get_material(1)->set_vector4(stack.get_string_id_32(2), stack.get_vector4(3));
+			return 0;
+		});
+	env.add_module_function("Material", "set_matrix4x4", [](lua_State* L)
+		{
+			LuaStack stack(L);
+			stack.get_material(1)->set_matrix4x4(stack.get_string_id_32(2), stack.get_matrix4x4(3));
+			return 0;
+		});
 
 	env.add_module_function("Gui", "move", [](lua_State* L)
 		{

+ 11 - 0
src/lua/lua_stack.h

@@ -388,6 +388,17 @@ struct LuaStack
 #endif
 	}
 
+	Vector4 get_vector4(int i)
+	{
+		Quaternion q = get_quaternion(i);
+		Vector4 a;
+		a.x = q.x;
+		a.y = q.y;
+		a.z = q.z;
+		a.w = q.w;
+		return a;
+	}
+
 	Quaternion& get_quaternion(int i)
 	{
 #if CROWN_DEBUG

+ 33 - 28
src/resource/material_resource.cpp

@@ -30,10 +30,11 @@ namespace material_resource_internal
 
 	static const UniformTypeInfo s_uniform_type_info[] =
 	{
-		{ "float",   UniformType::FLOAT,    4 },
-		{ "vector2", UniformType::VECTOR2,  8 },
-		{ "vector3", UniformType::VECTOR3, 12 },
-		{ "vector4", UniformType::VECTOR4, 16 }
+		{ "float",     UniformType::FLOAT,      4 },
+		{ "vector2",   UniformType::VECTOR2,    8 },
+		{ "vector3",   UniformType::VECTOR3,   12 },
+		{ "vector4",   UniformType::VECTOR4,   16 },
+		{ "matrix4x4", UniformType::MATRIX4X4, 64 }
 	};
 	CE_STATIC_ASSERT(countof(s_uniform_type_info) == UniformType::COUNT);
 
@@ -64,7 +65,7 @@ namespace material_resource_internal
 
 	// Returns offset to start of data
 	template <typename T>
-	static u32 reserve_dynamic_data(T data, Array<char>& dynamic)
+	static u32 reserve_dynamic_data(Array<char>& dynamic, T data)
 	{
 		u32 offt = array::size(dynamic);
 		array::push(dynamic, (char*) &data, sizeof(data));
@@ -103,7 +104,7 @@ namespace material_resource_internal
 			td.sampler_name_offset = sampler_name_offset;
 			td.name                = StringId32(key.data(), key.length());
 			td.id                  = sjson::parse_resource_name(value);
-			td.data_offset         = reserve_dynamic_data(th, dynamic);
+			td.data_offset         = reserve_dynamic_data(dynamic, th);
 			td._pad1               = 0;
 
 			array::push_back(textures, td);
@@ -151,24 +152,28 @@ namespace material_resource_internal
 			ud.type        = ut;
 			ud.name        = StringId32(key.data(), key.length());
 			ud.name_offset = name_offset;
-			ud.data_offset = reserve_dynamic_data(uh, dynamic);
+			ud.data_offset = reserve_dynamic_data(dynamic, uh);
 
 			switch (ud.type)
 			{
 			case UniformType::FLOAT:
-				reserve_dynamic_data(sjson::parse_float(uniform["value"]), dynamic);
+				reserve_dynamic_data(dynamic, sjson::parse_float(uniform["value"]));
 				break;
 
 			case UniformType::VECTOR2:
-				reserve_dynamic_data(sjson::parse_vector2(uniform["value"]), dynamic);
+				reserve_dynamic_data(dynamic, sjson::parse_vector2(uniform["value"]));
 				break;
 
 			case UniformType::VECTOR3:
-				reserve_dynamic_data(sjson::parse_vector3(uniform["value"]), dynamic);
+				reserve_dynamic_data(dynamic, sjson::parse_vector3(uniform["value"]));
 				break;
 
 			case UniformType::VECTOR4:
-				reserve_dynamic_data(sjson::parse_vector4(uniform["value"]), dynamic);
+				reserve_dynamic_data(dynamic, sjson::parse_vector4(uniform["value"]));
+				break;
+
+			case UniformType::MATRIX4X4:
+				reserve_dynamic_data(dynamic, sjson::parse_matrix4x4(uniform["value"]));
 				break;
 
 			default:
@@ -275,17 +280,17 @@ namespace material_resource_internal
 
 namespace material_resource
 {
-	UniformData* get_uniform_data(const MaterialResource* mr, u32 i)
+	UniformData* uniform_data(const MaterialResource* mr, u32 i)
 	{
-		UniformData* base = (UniformData*) ((char*)mr + mr->uniform_data_offset);
+		UniformData* base = (UniformData*)((char*)mr + mr->uniform_data_offset);
 		return &base[i];
 	}
 
-	UniformData* get_uniform_data_by_name(const MaterialResource* mr, StringId32 name)
+	UniformData* uniform_data_by_name(const MaterialResource* mr, StringId32 name)
 	{
 		for (u32 i = 0, n = mr->num_uniforms; i < n; ++i)
 		{
-			UniformData* data = get_uniform_data(mr, i);
+			UniformData* data = uniform_data(mr, i);
 			if (data->name == name)
 				return data;
 		}
@@ -294,38 +299,38 @@ namespace material_resource
 		return NULL;
 	}
 
-	const char* get_uniform_name(const MaterialResource* mr, const UniformData* ud)
+	const char* uniform_name(const MaterialResource* mr, const UniformData* ud)
 	{
 		return (const char*)mr + mr->dynamic_data_offset + mr->dynamic_data_size + ud->name_offset;
 	}
 
-	TextureData* get_texture_data(const MaterialResource* mr, u32 i)
+	TextureData* texture_data(const MaterialResource* mr, u32 i)
 	{
-		TextureData* base = (TextureData*) ((char*)mr + mr->texture_data_offset);
+		TextureData* base = (TextureData*)((char*)mr + mr->texture_data_offset);
 		return &base[i];
 	}
 
-	const char* get_texture_name(const MaterialResource* mr, const TextureData* td)
+	const char* texture_name(const MaterialResource* mr, const TextureData* td)
 	{
 		return (const char*)mr + mr->dynamic_data_offset + mr->dynamic_data_size + td->sampler_name_offset;
 	}
 
-	UniformHandle* get_uniform_handle(const MaterialResource* mr, u32 i, char* dynamic)
+	UniformHandle* uniform_handle(const MaterialResource* mr, u32 i, char* dynamic)
 	{
-		UniformData* ud = get_uniform_data(mr, i);
-		return (UniformHandle*) (dynamic + ud->data_offset);
+		UniformData* ud = uniform_data(mr, i);
+		return (UniformHandle*)(dynamic + ud->data_offset);
 	}
 
-	UniformHandle* get_uniform_handle_by_name(const MaterialResource* mr, StringId32 name, char* dynamic)
+	UniformHandle* uniform_handle_by_name(const MaterialResource* mr, StringId32 name, char* dynamic)
 	{
-		UniformData* ud = get_uniform_data_by_name(mr, name);
-		return (UniformHandle*) (dynamic + ud->data_offset);
+		UniformData* ud = uniform_data_by_name(mr, name);
+		return (UniformHandle*)(dynamic + ud->data_offset);
 	}
 
-	TextureHandle* get_texture_handle(const MaterialResource* mr, u32 i, char* dynamic)
+	TextureHandle* texture_handle(const MaterialResource* mr, u32 i, char* dynamic)
 	{
-		TextureData* td = get_texture_data(mr, i);
-		return (TextureHandle*) (dynamic + td->data_offset);
+		TextureData* td = texture_data(mr, i);
+		return (TextureHandle*)(dynamic + td->data_offset);
 	}
 
 } // namespace material_resource

+ 25 - 9
src/resource/material_resource.h

@@ -10,7 +10,6 @@
 #include "core/memory/types.h"
 #include "core/strings/string_id.h"
 #include "resource/types.h"
-#include "resource/types.h"
 
 namespace crown
 {
@@ -49,6 +48,8 @@ struct UniformType
 		VECTOR2,
 		VECTOR3,
 		VECTOR4,
+		MATRIX4X4,
+
 		COUNT
 	};
 };
@@ -79,14 +80,29 @@ namespace material_resource_internal
 
 namespace material_resource
 {
-	UniformData* get_uniform_data(const MaterialResource* mr, u32 i);
-	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_name(const MaterialResource* mr, StringId32 name, char* dynamic);
-	TextureHandle* get_texture_handle(const MaterialResource* mr, u32 i, char* dynamic);
+	///
+	UniformData* uniform_data(const MaterialResource* mr, u32 i);
+
+	///
+	UniformData* uniform_data_by_name(const MaterialResource* mr, StringId32 name);
+
+	///
+	const char* uniform_name(const MaterialResource* mr, const UniformData* ud);
+
+	///
+	TextureData* texture_data(const MaterialResource* mr, u32 i);
+
+	///
+	const char* texture_name(const MaterialResource* mr, const TextureData* td);
+
+	///
+	UniformHandle* uniform_handle(const MaterialResource* mr, u32 i, char* dynamic);
+
+	///
+	UniformHandle* uniform_handle_by_name(const MaterialResource* mr, StringId32 name, char* dynamic);
+
+	///
+	TextureHandle* texture_handle(const MaterialResource* mr, u32 i, char* dynamic);
 
 } // namespace material_resource
 

+ 18 - 6
src/world/material.cpp

@@ -19,8 +19,8 @@ void Material::bind(ResourceManager& rm, ShaderManager& sm, u8 view, s32 depth)
 	// Set samplers
 	for (u32 i = 0; i < _resource->num_textures; ++i)
 	{
-		const TextureData* td   = get_texture_data(_resource, i);
-		const TextureHandle* th = get_texture_handle(_resource, i, _data);
+		const TextureData* td   = texture_data(_resource, i);
+		const TextureHandle* th = texture_handle(_resource, i, _data);
 
 		const TextureResource* teximg = (TextureResource*)rm.get(RESOURCE_TYPE_TEXTURE, td->id);
 
@@ -39,7 +39,7 @@ void Material::bind(ResourceManager& rm, ShaderManager& sm, u8 view, s32 depth)
 	// Set uniforms
 	for (u32 i = 0; i < _resource->num_uniforms; ++i)
 	{
-		const UniformHandle* uh = get_uniform_handle(_resource, i, _data);
+		const UniformHandle* uh = uniform_handle(_resource, i, _data);
 
 		bgfx::UniformHandle buh;
 		buh.idx = uh->uniform_handle;
@@ -51,20 +51,32 @@ void Material::bind(ResourceManager& rm, ShaderManager& sm, u8 view, s32 depth)
 
 void Material::set_float(StringId32 name, f32 value)
 {
-	char* p = (char*)material_resource::get_uniform_handle_by_name(_resource, name, _data);
+	char* p = (char*)material_resource::uniform_handle_by_name(_resource, name, _data);
 	*(f32*)(p + sizeof(u32)) = value;
 }
 
 void Material::set_vector2(StringId32 name, const Vector2& value)
 {
-	char* p = (char*)material_resource::get_uniform_handle_by_name(_resource, name, _data);
+	char* p = (char*)material_resource::uniform_handle_by_name(_resource, name, _data);
 	*(Vector2*)(p + sizeof(u32)) = value;
 }
 
 void Material::set_vector3(StringId32 name, const Vector3& value)
 {
-	char* p = (char*)material_resource::get_uniform_handle_by_name(_resource, name, _data);
+	char* p = (char*)material_resource::uniform_handle_by_name(_resource, name, _data);
 	*(Vector3*)(p + sizeof(u32)) = value;
 }
 
+void Material::set_vector4(StringId32 name, const Vector4& value)
+{
+	char* p = (char*)material_resource::uniform_handle_by_name(_resource, name, _data);
+	*(Vector4*)(p + sizeof(u32)) = value;
+}
+
+void Material::set_matrix4x4(StringId32 name, const Matrix4x4& value)
+{
+	char* p = (char*)material_resource::uniform_handle_by_name(_resource, name, _data);
+	*(Matrix4x4*)(p + sizeof(u32)) = value;
+}
+
 } // namespace crown

+ 6 - 0
src/world/material.h

@@ -30,6 +30,12 @@ struct Material
 
 	/// Sets the @a value of the variable @a name.
 	void set_vector3(StringId32 name, const Vector3& value);
+
+	/// Sets the @a value of the variable @a name.
+	void set_vector4(StringId32 name, const Vector4& value);
+
+	/// Sets the @a value of the variable @a name.
+	void set_matrix4x4(StringId32 name, const Matrix4x4& value);
 };
 
 } // namespace crown

+ 8 - 8
src/world/material_manager.cpp

@@ -51,16 +51,16 @@ void MaterialManager::online(StringId64 id, ResourceManager& rm)
 
 	for (u32 i = 0; i < mr->num_textures; ++i)
 	{
-		TextureData* td    = get_texture_data(mr, i);
-		TextureHandle* th  = get_texture_handle(mr, i, base);
-		th->sampler_handle = bgfx::createUniform(get_texture_name(mr, td), bgfx::UniformType::Sampler).idx;
+		TextureData* td    = texture_data(mr, i);
+		TextureHandle* th  = texture_handle(mr, i, base);
+		th->sampler_handle = bgfx::createUniform(texture_name(mr, td), bgfx::UniformType::Sampler).idx;
 	}
 
 	for (u32 i = 0; i < mr->num_uniforms; ++i)
 	{
-		UniformData* ud    = get_uniform_data(mr, i);
-		UniformHandle* uh  = get_uniform_handle(mr, i, base);
-		uh->uniform_handle = bgfx::createUniform(get_uniform_name(mr, ud), bgfx::UniformType::Vec4).idx;
+		UniformData* ud    = uniform_data(mr, i);
+		UniformHandle* uh  = uniform_handle(mr, i, base);
+		uh->uniform_handle = bgfx::createUniform(uniform_name(mr, ud), bgfx::UniformType::Vec4).idx;
 	}
 }
 
@@ -74,7 +74,7 @@ void MaterialManager::offline(StringId64 id, ResourceManager& rm)
 
 	for (u32 i = 0; i < mr->num_textures; ++i)
 	{
-		TextureHandle* th = get_texture_handle(mr, i, base);
+		TextureHandle* th = texture_handle(mr, i, base);
 		bgfx::UniformHandle sh;
 		sh.idx = th->sampler_handle;
 		bgfx::destroy(sh);
@@ -82,7 +82,7 @@ void MaterialManager::offline(StringId64 id, ResourceManager& rm)
 
 	for (u32 i = 0; i < mr->num_uniforms; ++i)
 	{
-		UniformHandle* uh = get_uniform_handle(mr, i, base);
+		UniformHandle* uh = uniform_handle(mr, i, base);
 		bgfx::UniformHandle bgfx_uh;
 		bgfx_uh.idx = uh->uniform_handle;
 		bgfx::destroy(bgfx_uh);