Просмотр исходного кода

Add support to Material in RenderWorld

Daniele Bartolini 12 лет назад
Родитель
Сommit
6bb991795c
2 измененных файлов с 52 добавлено и 25 удалено
  1. 30 13
      engine/RenderWorld.cpp
  2. 22 12
      engine/RenderWorld.h

+ 30 - 13
engine/RenderWorld.cpp

@@ -26,13 +26,15 @@ OTHER DEALINGS IN THE SOFTWARE.
 
 #include "RenderWorld.h"
 #include "Device.h"
-#include "ResourceManager.h"
 #include "Renderer.h"
 #include "Allocator.h"
 #include "Camera.h"
 #include "Resource.h"
 #include "Log.h"
 #include "SpriteResource.h"
+#include "Mesh.h"
+#include "Sprite.h"
+#include "Material.h"
 
 namespace crown
 {
@@ -88,6 +90,7 @@ static const char* texture_fragment =
 RenderWorld::RenderWorld()
 	: m_mesh_pool(default_allocator(), MAX_MESHES, sizeof(Mesh), CE_ALIGNOF(Mesh))
 	, m_sprite_pool(default_allocator(), MAX_SPRITES, sizeof(Sprite), CE_ALIGNOF(Sprite))
+	, m_material_pool(default_allocator(), MAX_MATERIALS, sizeof(Material), CE_ALIGNOF(Material))
 {
 	Renderer* r = device()->renderer();
 
@@ -115,13 +118,9 @@ RenderWorld::~RenderWorld()
 }
 
 //-----------------------------------------------------------------------------
-MeshId RenderWorld::create_mesh(ResourceId id, SceneGraph& sg, int32_t node)
+MeshId RenderWorld::create_mesh(MeshResource* mr, SceneGraph& sg, int32_t node)
 {
-	MeshResource* mr = (MeshResource*) device()->resource_manager()->data(id);
-
-	// Allocate memory for mesh
 	Mesh* mesh = CE_NEW(m_mesh_pool, Mesh)(sg, node, mr);
-
 	return m_mesh.create(mesh);
 }
 
@@ -144,13 +143,9 @@ Mesh* RenderWorld::lookup_mesh(MeshId mesh)
 }
 
 //-----------------------------------------------------------------------------
-SpriteId RenderWorld::create_sprite(ResourceId id, SceneGraph& sg, int32_t node)
+SpriteId RenderWorld::create_sprite(SpriteResource* sr, SceneGraph& sg, int32_t node)
 {
-	SpriteResource* sr = (SpriteResource*) device()->resource_manager()->data(id);
-
-	// Allocate memory for sprite
-	Sprite* sprite = CE_NEW(m_sprite_pool, Sprite)(sg, node, sr);
-
+	Sprite* sprite = CE_NEW(m_sprite_pool, Sprite)(*this, sg, node, sr);
 	return m_sprite.create(sprite);
 }
 
@@ -172,6 +167,26 @@ Sprite*	RenderWorld::lookup_sprite(SpriteId id)
 	return m_sprite.lookup(id);
 }
 
+//-----------------------------------------------------------------------------
+MaterialId RenderWorld::create_material(MaterialResource* mr)
+{
+	Material* mat = CE_NEW(m_material_pool, Material)(mr);
+	return m_materials.create(mat);
+}
+
+//-----------------------------------------------------------------------------
+void RenderWorld::destroy_material(MaterialId id)
+{
+	CE_DELETE(m_material_pool, m_materials.lookup(id));
+	m_materials.destroy(id);
+}
+
+//-----------------------------------------------------------------------------
+Material* RenderWorld::lookup_material(MaterialId id)
+{
+	return m_materials.lookup(id);
+}
+
 //-----------------------------------------------------------------------------
 void RenderWorld::update(const Matrix4x4& view, const Matrix4x4& projection, uint16_t x, uint16_t y, uint16_t width, uint16_t height)
 {
@@ -217,7 +232,9 @@ void RenderWorld::update(const Matrix4x4& view, const Matrix4x4& projection, uin
 		r->set_vertex_buffer(sprite->m_vb);
 		r->set_index_buffer(sprite->m_ib);
 		r->set_program(texture_program);
-		r->set_texture(0, u_albedo_0, sprite->m_texture, TEXTURE_FILTER_LINEAR | TEXTURE_WRAP_CLAMP_EDGE);
+		//r->set_texture(0, u_albedo_0, sprite->m_texture, TEXTURE_FILTER_LINEAR | TEXTURE_WRAP_CLAMP_EDGE);
+
+		sprite->render(*r, u_albedo_0);
 
 		r->set_pose(sprite->world_pose());
 		r->commit(0);

+ 22 - 12
engine/RenderWorld.h

@@ -27,25 +27,29 @@ OTHER DEALINGS IN THE SOFTWARE.
 #pragma once
 
 #include "IdArray.h"
-#include "Mesh.h"
-#include "Sprite.h"
 #include "List.h"
-#include "Vector3.h"
-#include "Quaternion.h"
 #include "PoolAllocator.h"
 #include "Resource.h"
+#include "Matrix4x4.h"
 
 #define MAX_MESHES 100
 #define MAX_SPRITES 256
+#define MAX_MATERIALS 256
 
 namespace crown
 {
 
 typedef Id MeshId;
 typedef Id SpriteId;
+typedef Id MaterialId;
 
-class SceneGraph;
-struct Camera;
+struct Material;
+struct MaterialResource;
+struct Mesh;
+struct MeshResource;
+struct SceneGraph;
+struct Sprite;
+struct SpriteResource;
 
 class RenderWorld
 {
@@ -54,23 +58,29 @@ public:
 	RenderWorld();
 	~RenderWorld();
 
-	MeshId		create_mesh(ResourceId id, SceneGraph& sg, int32_t node);
+	MeshId		create_mesh(MeshResource* mr, SceneGraph& sg, int32_t node);
 	void 		destroy_mesh(MeshId id);
 	Mesh* 		lookup_mesh(MeshId mesh);
 
-	SpriteId	create_sprite(ResourceId id, SceneGraph& sg, int32_t node);
+	SpriteId	create_sprite(SpriteResource* sr, SceneGraph& sg, int32_t node);
 	void		destroy_sprite(SpriteId id);
 	Sprite*		lookup_sprite(SpriteId id);
 
+	MaterialId	create_material(MaterialResource* mr);
+	void		destroy_material(MaterialId id);
+	Material*	lookup_material(MaterialId id);
+
 	void		update(const Matrix4x4& view, const Matrix4x4& projection, uint16_t x, uint16_t y, uint16_t width, uint16_t height);
 
 private:
 
-	PoolAllocator					m_mesh_pool;
-	IdArray<MAX_MESHES, Mesh*>		m_mesh;
+	PoolAllocator						m_mesh_pool;
+	PoolAllocator						m_sprite_pool;
+	PoolAllocator						m_material_pool;
 
-	PoolAllocator					m_sprite_pool;
-	IdArray<MAX_SPRITES, Sprite*>	m_sprite;
+	IdArray<MAX_MESHES, Mesh*>			m_mesh;
+	IdArray<MAX_SPRITES, Sprite*>		m_sprite;
+	IdArray<MAX_MATERIALS, Material*>	m_materials;
 };
 
 } // namespace crown