Explorar o código

Move load code into MaterialManager

Daniele Bartolini %!s(int64=10) %!d(string=hai) anos
pai
achega
252d86a148

+ 6 - 43
src/resource/material_resource.cpp

@@ -4,17 +4,18 @@
  */
 
 #include "compile_options.h"
+#include "device.h"
 #include "dynamic_string.h"
 #include "filesystem.h"
 #include "macros.h"
 #include "map.h"
+#include "material_manager.h"
 #include "material_resource.h"
 #include "reader_writer.h"
 #include "resource_manager.h"
 #include "sjson.h"
 #include "string_utils.h"
 #include "vector.h"
-#include <bgfx/bgfx.h>
 
 namespace crown
 {
@@ -241,60 +242,22 @@ namespace material_resource
 
 	void* load(File& file, Allocator& a)
 	{
-		const u32 file_size = file.size();
-		void* res = a.allocate(file_size);
-		file.read(res, file_size);
-		CE_ASSERT(*(u32*)res == MATERIAL_VERSION, "Wrong version");
-		return res;
+		return device()->material_manager()->load(file, a);
 	}
 
 	void online(StringId64 id, ResourceManager& rm)
 	{
-		MaterialResource* mr = (MaterialResource*) rm.get(MATERIAL_TYPE, id);
-
-		char* base = (char*)mr + mr->dynamic_data_offset;
-
-		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::Int1).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;
-		}
+		device()->material_manager()->online(id, rm);
 	}
 
 	void offline(StringId64 id, ResourceManager& rm)
 	{
-		MaterialResource* mr = (MaterialResource*) rm.get(MATERIAL_TYPE, id);
-
-		char* base = (char*) mr + mr->dynamic_data_offset;
-
-		for (u32 i = 0; i < mr->num_textures; ++i)
-		{
-			TextureHandle* th = get_texture_handle(mr, i, base);
-			bgfx::UniformHandle sh;
-			sh.idx = th->sampler_handle;
-			bgfx::destroyUniform(sh);
-		}
-
-		for (u32 i = 0; i < mr->num_uniforms; ++i)
-		{
-			UniformHandle* uh = get_uniform_handle(mr, i, base);
-			bgfx::UniformHandle bgfx_uh;
-			bgfx_uh.idx = uh->uniform_handle;
-			bgfx::destroyUniform(bgfx_uh);
-		}
+		device()->material_manager()->offline(id, rm);
 	}
 
 	void unload(Allocator& a, void* res)
 	{
-		a.deallocate(res);
+		device()->material_manager()->unload(a, res);
 	}
 
 	UniformData* get_uniform_data(const MaterialResource* mr, u32 i)

+ 67 - 1
src/world/material_manager.cpp

@@ -3,11 +3,13 @@
  * License: https://github.com/taylor001/crown/blob/master/LICENSE
  */
 
+#include "file.h"
 #include "material_manager.h"
 #include "material_resource.h"
 #include "resource_manager.h"
 #include "sort_map.h"
 #include <string.h> // memcpy
+#include <bgfx/bgfx.h>
 
 namespace crown
 {
@@ -29,6 +31,70 @@ MaterialManager::~MaterialManager()
 	}
 }
 
+void* MaterialManager::load(File& file, Allocator& a)
+{
+	const u32 file_size = file.size();
+	void* res = a.allocate(file_size);
+	file.read(res, file_size);
+	CE_ASSERT(*(u32*)res == MATERIAL_VERSION, "Wrong version");
+	return res;
+}
+
+void MaterialManager::online(StringId64 id, ResourceManager& rm)
+{
+	using namespace material_resource;
+
+	MaterialResource* mr = (MaterialResource*) rm.get(MATERIAL_TYPE, id);
+
+	char* base = (char*)mr + mr->dynamic_data_offset;
+
+	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::Int1).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;
+	}
+
+	create_material(id);
+}
+
+void MaterialManager::offline(StringId64 id, ResourceManager& rm)
+{
+	using namespace material_resource;
+
+	MaterialResource* mr = (MaterialResource*) rm.get(MATERIAL_TYPE, id);
+
+	char* base = (char*) mr + mr->dynamic_data_offset;
+
+	for (u32 i = 0; i < mr->num_textures; ++i)
+	{
+		TextureHandle* th = get_texture_handle(mr, i, base);
+		bgfx::UniformHandle sh;
+		sh.idx = th->sampler_handle;
+		bgfx::destroyUniform(sh);
+	}
+
+	for (u32 i = 0; i < mr->num_uniforms; ++i)
+	{
+		UniformHandle* uh = get_uniform_handle(mr, i, base);
+		bgfx::UniformHandle bgfx_uh;
+		bgfx_uh.idx = uh->uniform_handle;
+		bgfx::destroyUniform(bgfx_uh);
+	}
+}
+
+void MaterialManager::unload(Allocator& a, void* res)
+{
+	a.deallocate(res);
+}
+
 void MaterialManager::create_material(StringId64 id)
 {
 	if (sort_map::has(_materials, id))
@@ -37,7 +103,7 @@ void MaterialManager::create_material(StringId64 id)
 	const MaterialResource* mr = (MaterialResource*)_resource_manager->get(MATERIAL_TYPE, id);
 
 	const u32 size = sizeof(Material) + mr->dynamic_data_size;
-	Material* mat = (Material*)_allocator->allocate(size);
+	Material* mat  = (Material*)_allocator->allocate(size);
 	mat->_resource = mr;
 	mat->_data     = (char*)&mat[1];
 

+ 8 - 2
src/world/material_manager.h

@@ -5,11 +5,12 @@
 
 #pragma once
 
-#include "types.h"
 #include "container_types.h"
-#include "resource_types.h"
+#include "filesystem_types.h"
 #include "material.h"
+#include "resource_types.h"
 #include "string_id.h"
+#include "types.h"
 
 namespace crown
 {
@@ -24,6 +25,11 @@ public:
 	MaterialManager(Allocator& a, ResourceManager& rm);
 	~MaterialManager();
 
+	void* load(File& file, Allocator& a);
+	void online(StringId64 id, ResourceManager& rm);
+	void offline(StringId64 id, ResourceManager& rm);
+	void unload(Allocator& a, void* res);
+
 	/// Creates the material @a id.
 	void create_material(StringId64 id);