ソースを参照

resource: cleanup

Daniele Bartolini 1 年間 前
コミット
9336f85466

+ 20 - 38
src/resource/material_resource.cpp

@@ -24,74 +24,56 @@ namespace crown
 {
 namespace material_resource
 {
-	UniformData *uniform_data(const MaterialResource *mr, u32 i)
+	UniformData *uniform_data_array(const MaterialResource *mr)
 	{
-		UniformData *base = (UniformData *)((char *)mr + mr->uniform_data_offset);
-		return &base[i];
+		return (UniformData *)((char *)mr + mr->uniform_data_offset);
 	}
 
-	UniformData *uniform_data_by_name(const MaterialResource *mr, StringId32 name)
+	u32 uniform_data_index(const MaterialResource *mr, const UniformData *ud, StringId32 name)
 	{
 		for (u32 i = 0, n = mr->num_uniforms; i < n; ++i) {
-			UniformData *data = uniform_data(mr, i);
-			if (data->name == name)
-				return data;
+			if (ud[i].name == name)
+				return i;
 		}
 
 		CE_FATAL("Unknown uniform");
-		return NULL;
+		return UINT32_MAX;
 	}
 
-	const char *uniform_name(const MaterialResource *mr, const UniformData *ud)
+	const char *uniform_name(const MaterialResource *mr, const UniformData *ud, u32 i)
 	{
-		return (const char *)mr + mr->dynamic_data_offset + mr->dynamic_data_size + ud->name_offset;
+		return (const char *)mr + mr->dynamic_data_offset + mr->dynamic_data_size + ud[i].name_offset;
 	}
 
-	TextureData *texture_data(const MaterialResource *mr, u32 i)
+	TextureData *texture_data_array(const MaterialResource *mr)
 	{
-		TextureData *base = (TextureData *)((char *)mr + mr->texture_data_offset);
-		return &base[i];
+		return (TextureData *)((char *)mr + mr->texture_data_offset);
 	}
 
-	TextureData *texture_data_by_name(const MaterialResource *mr, StringId32 name)
+	u32 texture_data_index(const MaterialResource *mr, const TextureData *td, StringId32 name)
 	{
 		for (u32 i = 0, n = mr->num_textures; i < n; ++i) {
-			TextureData *data = texture_data(mr, i);
-			if (data->name == name)
-				return data;
+			if (td[i].name == name)
+				return i;
 		}
 
 		CE_FATAL("Unknown texture");
-		return NULL;
+		return UINT32_MAX;
 	}
 
-	const char *texture_name(const MaterialResource *mr, const TextureData *td)
+	const char *texture_name(const MaterialResource *mr, const TextureData *td, u32 i)
 	{
-		return (const char *)mr + mr->dynamic_data_offset + mr->dynamic_data_size + td->sampler_name_offset;
+		return (const char *)mr + mr->dynamic_data_offset + mr->dynamic_data_size + td[i].sampler_name_offset;
 	}
 
-	UniformHandle *uniform_handle(const MaterialResource *mr, u32 i, char *dynamic)
+	UniformHandle *uniform_handle(const UniformData *ud, u32 i, char *dynamic)
 	{
-		UniformData *ud = uniform_data(mr, i);
-		return (UniformHandle *)(dynamic + ud->data_offset);
+		return (UniformHandle *)(dynamic + ud[i].data_offset);
 	}
 
-	UniformHandle *uniform_handle_by_name(const MaterialResource *mr, StringId32 name, char *dynamic)
+	TextureHandle *texture_handle(const TextureData *td, u32 i, char *dynamic)
 	{
-		UniformData *ud = uniform_data_by_name(mr, name);
-		return (UniformHandle *)(dynamic + ud->data_offset);
-	}
-
-	TextureHandle *texture_handle(const MaterialResource *mr, u32 i, char *dynamic)
-	{
-		TextureData *td = texture_data(mr, i);
-		return (TextureHandle *)(dynamic + td->data_offset);
-	}
-
-	TextureHandle *texture_handle_by_name(const MaterialResource *mr, StringId32 name, char *dynamic)
-	{
-		TextureData *td = texture_data_by_name(mr, name);
-		return (TextureHandle *)(dynamic + td->data_offset);
+		return (TextureHandle *)(dynamic + td[i].data_offset);
 	}
 
 } // namespace material_resource

+ 8 - 14
src/resource/material_resource.h

@@ -84,34 +84,28 @@ namespace material_resource_internal
 namespace material_resource
 {
 	///
-	UniformData *uniform_data(const MaterialResource *mr, u32 i);
+	UniformData *uniform_data_array(const MaterialResource *mr);
 
 	///
-	UniformData *uniform_data_by_name(const MaterialResource *mr, StringId32 name);
+	u32 uniform_data_index(const MaterialResource *mr, const UniformData *ud, StringId32 name);
 
 	///
-	const char *uniform_name(const MaterialResource *mr, const UniformData *ud);
+	const char *uniform_name(const MaterialResource *mr, const UniformData *ud, u32 i);
 
 	///
-	TextureData *texture_data(const MaterialResource *mr, u32 i);
+	TextureData *texture_data_array(const MaterialResource *mr);
 
 	///
-	TextureData *texture_data_by_name(const MaterialResource *mr, StringId32 name);
+	u32 texture_data_index(const MaterialResource *mr, const TextureData *td, StringId32 name);
 
 	///
-	const char *texture_name(const MaterialResource *mr, const TextureData *td);
+	const char *texture_name(const MaterialResource *mr, const TextureData *td, u32 i);
 
 	///
-	UniformHandle *uniform_handle(const MaterialResource *mr, u32 i, char *dynamic);
+	UniformHandle *uniform_handle(const UniformData *ud, 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);
-
-	///
-	TextureHandle *texture_handle_by_name(const MaterialResource *mr, StringId32 name, char *dynamic);
+	TextureHandle *texture_handle(const TextureData *td, u32 i, char *dynamic);
 
 } // namespace material_resource
 

+ 23 - 16
src/world/material.cpp

@@ -17,10 +17,10 @@ void Material::bind(ShaderManager &sm, u8 view, s32 depth) const
 {
 	using namespace material_resource;
 
-	// Set samplers
+	// Set samplers.
+	const TextureData *td = texture_data_array(_resource);
 	for (u32 i = 0; i < _resource->num_textures; ++i) {
-		const TextureData *td   = texture_data(_resource, i);
-		const TextureHandle *th = texture_handle(_resource, i, _data);
+		const TextureHandle *th = texture_handle(td, i, _data);
 
 		bgfx::UniformHandle sampler;
 		bgfx::TextureHandle texture;
@@ -34,9 +34,10 @@ void Material::bind(ShaderManager &sm, u8 view, s32 depth) const
 			);
 	}
 
-	// Set uniforms
+	// Set uniforms.
+	const UniformData *ud = uniform_data_array(_resource);
 	for (u32 i = 0; i < _resource->num_uniforms; ++i) {
-		const UniformHandle *uh = uniform_handle(_resource, i, _data);
+		const UniformHandle *uh = uniform_handle(ud, i, _data);
 
 		bgfx::UniformHandle buh;
 		buh.idx = uh->uniform_handle;
@@ -46,40 +47,46 @@ void Material::bind(ShaderManager &sm, u8 view, s32 depth) const
 	sm.submit(_resource->shader, view, depth);
 }
 
+template<typename T>
+static void set_uniform_value(StringId32 name, const T &value, const MaterialResource *mr, char *dynamic_data)
+{
+	UniformData *ud = material_resource::uniform_data_array(mr);
+	u32 idx = material_resource::uniform_data_index(mr, ud, name);
+	char *p = (char *)material_resource::uniform_handle(ud, idx, dynamic_data);
+	*(T *)(p + sizeof(u32)) = value;
+}
+
 void Material::set_float(StringId32 name, f32 value)
 {
-	char *p = (char *)material_resource::uniform_handle_by_name(_resource, name, _data);
-	*(f32 *)(p + sizeof(u32)) = value;
+	set_uniform_value(name, value, _resource, _data);
 }
 
 void Material::set_vector2(StringId32 name, const Vector2 &value)
 {
-	char *p = (char *)material_resource::uniform_handle_by_name(_resource, name, _data);
-	*(Vector2 *)(p + sizeof(u32)) = value;
+	set_uniform_value(name, value, _resource, _data);
 }
 
 void Material::set_vector3(StringId32 name, const Vector3 &value)
 {
-	char *p = (char *)material_resource::uniform_handle_by_name(_resource, name, _data);
-	*(Vector3 *)(p + sizeof(u32)) = value;
+	set_uniform_value(name, value, _resource, _data);
 }
 
 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;
+	set_uniform_value(name, value, _resource, _data);
 }
 
 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;
+	set_uniform_value(name, value, _resource, _data);
 }
 
 void Material::set_texture(StringId32 sampler_name, ResourceId texture_resource)
 {
 	const TextureResource *tr = (TextureResource *)_resource_manager->get(RESOURCE_TYPE_TEXTURE, texture_resource);
-	TextureHandle *th = (TextureHandle *)material_resource::texture_handle_by_name(_resource, sampler_name, _data);
+	TextureData *td = material_resource::texture_data_array(_resource);
+	u32 idx = material_resource::texture_data_index(_resource, td, sampler_name);
+	TextureHandle *th = (TextureHandle *)material_resource::texture_handle(td, idx, _data);
 	th->texture_handle = tr->handle.idx;
 }
 

+ 10 - 8
src/world/material_manager.cpp

@@ -51,18 +51,18 @@ void MaterialManager::online(StringId64 id, ResourceManager &rm)
 
 	char *base = (char *)mr + mr->dynamic_data_offset;
 
+	const TextureData *td = texture_data_array(mr);
 	for (u32 i = 0; i < mr->num_textures; ++i) {
-		TextureData *td    = texture_data(mr, i);
-		TextureHandle *th  = texture_handle(mr, i, base);
+		TextureHandle *th  = texture_handle(td, i, base);
 		TextureResource *tr = (TextureResource *)rm.get(RESOURCE_TYPE_TEXTURE, td->id);
-		th->sampler_handle = bgfx::createUniform(texture_name(mr, td), bgfx::UniformType::Sampler).idx;
+		th->sampler_handle = bgfx::createUniform(texture_name(mr, td, i), bgfx::UniformType::Sampler).idx;
 		th->texture_handle = tr->handle.idx;
 	}
 
+	const UniformData *ud = uniform_data_array(mr);
 	for (u32 i = 0; i < mr->num_uniforms; ++i) {
-		UniformData *ud    = uniform_data(mr, i);
-		UniformHandle *uh  = uniform_handle(mr, i, base);
-		uh->uniform_handle = bgfx::createUniform(uniform_name(mr, ud), s_bgfx_uniform_type[ud->type]).idx;
+		UniformHandle *uh  = uniform_handle(ud, i, base);
+		uh->uniform_handle = bgfx::createUniform(uniform_name(mr, ud, i), s_bgfx_uniform_type[ud->type]).idx;
 	}
 
 	create_material(mr);
@@ -78,15 +78,17 @@ void MaterialManager::offline(StringId64 id, ResourceManager &rm)
 
 	char *base = (char *)mr + mr->dynamic_data_offset;
 
+	const TextureData *td = texture_data_array(mr);
 	for (u32 i = 0; i < mr->num_textures; ++i) {
-		TextureHandle *th = texture_handle(mr, i, base);
+		TextureHandle *th = texture_handle(td, i, base);
 		bgfx::UniformHandle sh;
 		sh.idx = th->sampler_handle;
 		bgfx::destroy(sh);
 	}
 
+	const UniformData *ud = uniform_data_array(mr);
 	for (u32 i = 0; i < mr->num_uniforms; ++i) {
-		UniformHandle *uh = uniform_handle(mr, i, base);
+		UniformHandle *uh = uniform_handle(ud, i, base);
 		bgfx::UniformHandle bgfx_uh;
 		bgfx_uh.idx = uh->uniform_handle;
 		bgfx::destroy(bgfx_uh);