Daniele Bartolini 10 سال پیش
والد
کامیت
37d5131a22
3فایلهای تغییر یافته به همراه34 افزوده شده و 46 حذف شده
  1. 16 32
      src/world/material.cpp
  2. 3 7
      src/world/material.h
  3. 15 7
      src/world/material_manager.cpp

+ 16 - 32
src/world/material.cpp

@@ -4,84 +4,68 @@
  */
 
 #include "material.h"
-#include "material_manager.h"
 #include "material_resource.h"
-#include "memory.h"
 #include "resource_manager.h"
-#include "shader.h"
 #include "shader_manager.h"
 #include "texture_resource.h"
 #include <bgfx/bgfx.h>
-#include <string.h> // memcpy
 
 namespace crown
 {
 
-using namespace material_resource;
-
-void Material::create(const MaterialResource* mr)
-{
-	const uint32_t size = mr->dynamic_data_size;
-	const uint32_t offt = mr->dynamic_data_offset;
-	char* base = (char*)mr + offt;
-	data = (char*)default_allocator().allocate(size);
-	memcpy(data, base, size);
-	resource = mr;
-}
-
-void Material::destroy() const
-{
-	default_allocator().deallocate(data);
-}
-
 void Material::bind(ResourceManager& rm, ShaderManager& sm) const
 {
+	using namespace material_resource;
+
 	// Set samplers
-	for (uint32_t i = 0; i < resource->num_textures; ++i)
+	for (uint32_t i = 0; i < _resource->num_textures; ++i)
 	{
-		TextureData* td   = get_texture_data(resource, i);
-		TextureHandle* th = get_texture_handle(resource, i, data);
+		const TextureData* td   = get_texture_data(_resource, i);
+		const TextureHandle* th = get_texture_handle(_resource, i, _data);
+
+		const TextureResource* teximg = (TextureResource*)rm.get(TEXTURE_TYPE, td->id);
 
 		bgfx::UniformHandle sampler;
 		bgfx::TextureHandle texture;
 		sampler.idx = th->sampler_handle;
-
-		const TextureResource* teximg = (TextureResource*)rm.get(TEXTURE_TYPE, td->id);
 		texture.idx = teximg->handle.idx;
 
 		bgfx::setTexture(i, sampler, texture);
 	}
 
 	// Set uniforms
-	for (uint32_t i = 0; i < resource->num_uniforms; ++i)
+	for (uint32_t i = 0; i < _resource->num_uniforms; ++i)
 	{
-		UniformHandle* uh = get_uniform_handle(resource, i, data);
+		const UniformHandle* uh = get_uniform_handle(_resource, i, _data);
 
 		bgfx::UniformHandle buh;
 		buh.idx = uh->uniform_handle;
 		bgfx::setUniform(buh, (char*)uh + sizeof(uh->uniform_handle));
 	}
 
-	const ShaderData& sd = sm.get(resource->shader);
+	const ShaderData& sd = sm.get(_resource->shader);
 	bgfx::setState(sd.state);
 	bgfx::submit(0, sd.program);
 }
 
 void Material::set_float(const char* name, float val)
 {
-	char* p = (char*)get_uniform_handle_by_string(resource, name, data);
+	using namespace material_resource;
+	char* p = (char*)get_uniform_handle_by_string(_resource, name, _data);
 	*((float*)(p + sizeof(uint32_t))) = val;
 }
 
 void Material::set_vector2(const char* name, const Vector2& val)
 {
-	char* p = (char*)get_uniform_handle_by_string(resource, name, data);
+	using namespace material_resource;
+	char* p = (char*)get_uniform_handle_by_string(_resource, name, _data);
 	*((Vector2*)(p + sizeof(uint32_t))) = val;
 }
 
 void Material::set_vector3(const char* name, const Vector3& val)
 {
-	char* p = (char*)get_uniform_handle_by_string(resource, name, data);
+	using namespace material_resource;
+	char* p = (char*)get_uniform_handle_by_string(_resource, name, _data);
 	*((Vector3*)(p + sizeof(uint32_t))) = val;
 }
 

+ 3 - 7
src/world/material.h

@@ -8,23 +8,19 @@
 #include "math_types.h"
 #include "resource_types.h"
 #include "world_types.h"
-#include <bgfx/bgfx.h>
 
 namespace crown
 {
 
 struct Material
 {
-	void create(const MaterialResource* mr);
-	void destroy() const;
-	void bind(ResourceManager& rm, ShaderManager& sm) const;
+	const MaterialResource* _resource;
+	char* _data;
 
+	void bind(ResourceManager& rm, ShaderManager& sm) const;
 	void set_float(const char* name, float val);
 	void set_vector2(const char* name, const Vector2& val);
 	void set_vector3(const char* name, const Vector3& val);
-
-	const MaterialResource* resource;
-	char* data;
 };
 
 } // namespace crown

+ 15 - 7
src/world/material_manager.cpp

@@ -4,8 +4,10 @@
  */
 
 #include "material_manager.h"
-#include "sort_map.h"
+#include "material_resource.h"
 #include "resource_manager.h"
+#include "sort_map.h"
+#include <string.h> // memcpy
 
 namespace crown
 {
@@ -24,8 +26,7 @@ MaterialManager::~MaterialManager()
 
 	for (; begin != end; ++begin)
 	{
-		begin->pair.second->destroy();
-		CE_DELETE(*_allocator, begin->pair.second);
+		_allocator->deallocate(begin->pair.second);
 	}
 }
 
@@ -34,8 +35,15 @@ void MaterialManager::create_material(StringId64 id)
 	if (sort_map::has(_materials, id))
 		return;
 
-	Material* mat = CE_NEW(*_allocator, Material);
-	mat->create((MaterialResource*)_resource_manager->get(MATERIAL_TYPE, id));
+	const MaterialResource* mr = (MaterialResource*)_resource_manager->get(MATERIAL_TYPE, id);
+
+	const uint32_t size = sizeof(Material) + mr->dynamic_data_size;
+	Material* mat = (Material*)_allocator->allocate(size);
+	mat->_resource = mr;
+	mat->_data     = (char*)&mat[1];
+
+	const char* data = (char*)mr + mr->dynamic_data_offset;
+	memcpy(mat->_data, data, mr->dynamic_data_size);
 
 	sort_map::set(_materials, id, mat);
 	sort_map::sort(_materials);
@@ -44,8 +52,8 @@ void MaterialManager::create_material(StringId64 id)
 void MaterialManager::destroy_material(StringId64 id)
 {
 	Material* mat = sort_map::get(_materials, id, (Material*)NULL);
-	mat->destroy();
-	CE_DELETE(*_allocator, mat);
+	_allocator->deallocate(mat);
+
 	sort_map::remove(_materials, id);
 	sort_map::sort(_materials);
 }