Procházet zdrojové kódy

Create/destroy uniforms in online/offline callback

Daniele Bartolini před 11 roky
rodič
revize
eb83df5d1c

+ 7 - 59
engine/renderers/material.cpp

@@ -27,12 +27,10 @@ OTHER DEALINGS IN THE SOFTWARE.
 #include "material.h"
 #include "material_resource.h"
 #include "memory.h"
-#include "random.h"
 #include "device.h"
 #include "resource_manager.h"
 #include "texture_resource.h"
 #include "material_manager.h"
-#include "log.h"
 #include "shader.h"
 #include <bgfx.h>
 
@@ -44,73 +42,18 @@ void Material::create(const MaterialResource* mr, MaterialManager& mm)
 	uint32_t size = mr->dynamic_data_size();
 	uint32_t offt = mr->dynamic_data_offset();
 	char* base = (char*) mr + offt;
-
-	data = (char*) default_allocator().allocate(size);
-	memcpy(data, base, size);
-
-	for (uint32_t i = 0; i < mr->num_textures(); i++)
-	{
-		TextureData* ud = mr->get_texture_data(i);
-
-		TextureHandle* th = mr->get_texture_handle(i, data);
-		th->sampler_handle = bgfx::createUniform(ud->sampler_name, bgfx::UniformType::Uniform1iv).idx;
-
-		ResourceId texid;
-		texid.type = TEXTURE_TYPE;
-		texid.name = ud->id;
-		TextureImage* teximg = (TextureImage*) device()->resource_manager()->get(texid);
-		th->texture_handle = teximg->handle.idx;
-	}
-
-	for (uint32_t i = 0; i < mr->num_uniforms(); i++)
-	{
-		UniformData* ud = mr->get_uniform_data(i);
-
-		UniformHandle* uh = mr->get_uniform_handle(i, data);
-		uh->uniform_handle = bgfx::createUniform(ud->name, bgfx::UniformType::Uniform4fv).idx;
-	}
-
-	resource = mr;
-}
-
-void Material::clone(const Material& m)
-{
-	const MaterialResource* mr = m.resource;
-	uint32_t size = mr->dynamic_data_size();
-	char* base = m.data;
-
 	data = (char*) default_allocator().allocate(size);
 	memcpy(data, base, size);
-
 	resource = mr;
 }
 
 void Material::destroy() const
 {
-	for (uint32_t i = 0; i < resource->num_textures(); i++)
-	{
-		TextureHandle* th = resource->get_texture_handle(i, data);
-
-		bgfx::UniformHandle sh;
-		sh.idx = th->sampler_handle;
-		bgfx::destroyUniform(sh);
-	}
-
-	for (uint32_t i = 0; i < resource->num_uniforms(); i++)
-	{
-		UniformHandle* uh = resource->get_uniform_handle(i, data);
-
-		bgfx::UniformHandle bgfx_uh;
-		bgfx_uh.idx = uh->uniform_handle;
-		bgfx::destroyUniform(bgfx_uh);
-	}
-
 	default_allocator().deallocate(data);
 }
 
 void Material::bind() const
 {
-	// bgfx::setProgram(program);
 	ResourceId shader_id;
 	shader_id.type = SHADER_TYPE;
 	shader_id.name = resource->shader();
@@ -120,12 +63,18 @@ void Material::bind() const
 	// Set samplers
 	for (uint32_t i = 0; i < resource->num_textures(); i++)
 	{
+		TextureData* td = resource->get_texture_data(i);
 		TextureHandle* th = resource->get_texture_handle(i, data);
 
 		bgfx::UniformHandle sampler;
 		bgfx::TextureHandle texture;
 		sampler.idx = th->sampler_handle;
-		texture.idx = th->texture_handle;
+
+		ResourceId texid;
+		texid.type = TEXTURE_TYPE;
+		texid.name = td->id;
+		TextureImage* teximg = (TextureImage*) device()->resource_manager()->get(texid);
+		texture.idx = teximg->handle.idx;
 
 		bgfx::setTexture(i, sampler, texture);
 	}
@@ -145,7 +94,6 @@ void Material::set_float(const char* name, float val)
 {
 	char* p = (char*) resource->get_uniform_handle_by_string(name, data);
 	*((float*)(p + sizeof(uint32_t))) = val;
-
 }
 
 void Material::set_vector2(const char* name, const Vector2& val)

+ 0 - 1
engine/renderers/material.h

@@ -38,7 +38,6 @@ struct MaterialResource;
 struct Material
 {
 	void create(const MaterialResource* mr, MaterialManager& mm);
-	void clone(const Material& m);
 	void destroy() const;
 	void bind() const;
 

+ 4 - 37
engine/renderers/material_manager.cpp

@@ -27,6 +27,7 @@ OTHER DEALINGS IN THE SOFTWARE.
 #include "material_manager.h"
 #include "memory.h"
 #include "sort_map.h"
+#include "device.h"
 
 namespace crown
 {
@@ -52,56 +53,22 @@ namespace material_manager
 } // namespace material_manager
 
 MaterialManager::MaterialManager()
-	: m_materials(default_allocator())
 {
 }
 
-void MaterialManager::load(StringId64 id, ResourceManager& rm)
+MaterialId MaterialManager::create_material(StringId64 id)
 {
 	ResourceId res_id;
 	res_id.type = MATERIAL_TYPE;
 	res_id.name = id;
-
-	MaterialId mat_id = id_table::create(_materials_ids);
-	_materials[mat_id.index].create((MaterialResource*) rm.get(res_id), *this);
-
-	sort_map::set(m_materials, id, mat_id);
-	sort_map::sort(m_materials);
-}
-
-void MaterialManager::unload(StringId64 id, ResourceManager& /*rm*/)
-{
-	MaterialId deff_id;
-	deff_id.id = INVALID_ID;
-	deff_id.index = 0;
-
-	MaterialId mat_id = sort_map::get(m_materials, id, deff_id);
-	CE_ASSERT(mat_id.id != INVALID_ID, "Material not loaded");
-
-	_materials[mat_id.index].destroy();
-	id_table::destroy(_materials_ids, mat_id);
-
-	sort_map::remove(m_materials, id);
-	sort_map::sort(m_materials);
-}
-
-MaterialId MaterialManager::create_material(StringId64 id)
-{
-	MaterialId deff_id;
-	deff_id.id = INVALID_ID;
-	deff_id.index = 0;
-
-	MaterialId idd = sort_map::get(m_materials, id, deff_id);
-	CE_ASSERT(idd.id != INVALID_ID, "Material not loaded");
-
 	MaterialId new_id = id_table::create(_materials_ids);
-	_materials[new_id.index].clone(_materials[idd.index]);
-
+	_materials[new_id.index].create((MaterialResource*) device()->resource_manager()->get(res_id), *this);
 	return new_id;
 }
 
 void MaterialManager::destroy_material(MaterialId id)
 {
+	_materials[id.index].destroy();
 	id_table::destroy(_materials_ids, id);
 }
 

+ 0 - 4
engine/renderers/material_manager.h

@@ -43,16 +43,12 @@ struct MaterialManager
 {
 	MaterialManager();
 
-	void load(StringId64 id, ResourceManager& rm);
-	void unload(StringId64 id, ResourceManager& rm);
-
 	MaterialId create_material(StringId64 id);
 	void destroy_material(MaterialId id);
 	Material* lookup_material(MaterialId id);
 
 private:
 
-	SortMap<StringId64, MaterialId> m_materials;
 	IdTable<512> _materials_ids;
 	Material _materials[512];
 };

+ 42 - 2
engine/resource/material_resource.h

@@ -114,13 +114,53 @@ public:
 	//-----------------------------------------------------------------------------
 	static void online(StringId64 id, ResourceManager& rm)
 	{
-		material_manager::get()->load(id, rm);
+		ResourceId res_id;
+		res_id.type = MATERIAL_TYPE;
+		res_id.name = id;
+		MaterialResource* mr = (MaterialResource*) rm.get(res_id);
+
+		char* base = (char*) mr + mr->dynamic_data_offset();
+
+		for (uint32_t i = 0; i < mr->num_textures(); i++)
+		{
+			TextureData* ud = mr->get_texture_data(i);
+			TextureHandle* th = mr->get_texture_handle(i, base);
+			th->sampler_handle = bgfx::createUniform(ud->sampler_name, bgfx::UniformType::Uniform1iv).idx;
+		}
+
+		for (uint32_t i = 0; i < mr->num_uniforms(); i++)
+		{
+			UniformData* ud = mr->get_uniform_data(i);
+			UniformHandle* uh = mr->get_uniform_handle(i, base);
+			uh->uniform_handle = bgfx::createUniform(ud->name, bgfx::UniformType::Uniform4fv).idx;
+		}
 	}
 
 	//-----------------------------------------------------------------------------
 	static void offline(StringId64 id, ResourceManager& rm)
 	{
-		material_manager::get()->unload(id, rm);
+		ResourceId res_id;
+		res_id.type = MATERIAL_TYPE;
+		res_id.name = id;
+		MaterialResource* mr = (MaterialResource*) rm.get(res_id);
+
+		char* base = (char*) mr + mr->dynamic_data_offset();
+
+		for (uint32_t i = 0; i < mr->num_textures(); i++)
+		{
+			TextureHandle* th = mr->get_texture_handle(i, base);
+			bgfx::UniformHandle sh;
+			sh.idx = th->sampler_handle;
+			bgfx::destroyUniform(sh);
+		}
+
+		for (uint32_t i = 0; i < mr->num_uniforms(); i++)
+		{
+			UniformHandle* uh = mr->get_uniform_handle(i, base);
+			bgfx::UniformHandle bgfx_uh;
+			bgfx_uh.idx = uh->uniform_handle;
+			bgfx::destroyUniform(bgfx_uh);
+		}
 	}
 
 	//-----------------------------------------------------------------------------