ソースを参照

Fix creation of sprites in RenderWorld and clean SpriteResource from direct references to TextureId

Daniele Bartolini 12 年 前
コミット
4ccfe0530f
4 ファイル変更23 行追加47 行削除
  1. 20 31
      engine/RenderWorld.cpp
  2. 2 9
      engine/RenderWorld.h
  3. 1 1
      engine/Sprite.cpp
  4. 0 6
      engine/resource/SpriteResource.h

+ 20 - 31
engine/RenderWorld.cpp

@@ -89,6 +89,7 @@ static const char* texture_fragment =
 RenderWorld::RenderWorld()
 	: m_mesh_pool(default_allocator(), MAX_MESHES, sizeof(Mesh))
 	, m_mesh(default_allocator())
+	, m_sprite_pool(default_allocator(), MAX_SPRITES, sizeof(Sprite))
 	, m_sprite(default_allocator())
 {
 	Renderer* r = device()->renderer();
@@ -151,9 +152,14 @@ SpriteId RenderWorld::create_sprite(ResourceId id, int32_t node, const Vector3&
 {
 	SpriteResource* sr = (SpriteResource*) device()->resource_manager()->data(id);
 
-	SpriteId sprite = allocate_sprite(sr, node, pos, rot);
+	// Allocate memory for sprite
+	Sprite* sprite = (Sprite*) m_sprite_pool.allocate(sizeof(Sprite));
 
-	return sprite;
+	// Create sprite id
+	const SpriteId sprite_id = m_sprite.create(sprite);
+	sprite->create(sr, node, pos, rot);
+
+	return sprite_id;
 }
 
 //-----------------------------------------------------------------------------
@@ -165,7 +171,9 @@ void RenderWorld::destroy_sprite(SpriteId /*id*/)
 //-----------------------------------------------------------------------------
 Sprite*	RenderWorld::lookup_sprite(SpriteId id)
 {
-	return &m_sprite[m_sprite_sparse_to_packed[id.index]];
+	CE_ASSERT(m_sprite.has(id), "Sprite does not exist");
+
+	return m_sprite.lookup(id);
 }
 
 //-----------------------------------------------------------------------------
@@ -204,13 +212,14 @@ void RenderWorld::update(const Matrix4x4& view, const Matrix4x4& projection, uin
 		r->commit(0);
 	}
 
-	for (uint32_t s = 0; s < m_sprite.size(); s++)
+	const List<Sprite*>& sprites = m_sprite.m_objects;
+	for (uint32_t s = 0; s < sprites.size(); s++)
 	{
-		Sprite& sprite = m_sprite[s];
+		Sprite* sprite = sprites[s];
 
-		if (frames % sprite.m_animator->m_frame_rate == 0)
+		if (frames % sprite->m_animator->m_frame_rate == 0)
 		{
-			sprite.m_animator->play_frame();
+			sprite->m_animator->play_frame();
 		}
 
 		r->set_state(STATE_DEPTH_WRITE 
@@ -219,36 +228,16 @@ void RenderWorld::update(const Matrix4x4& view, const Matrix4x4& projection, uin
 			| STATE_CULL_CW 
 			| STATE_BLEND_EQUATION_ADD 
 			| STATE_BLEND_FUNC(STATE_BLEND_FUNC_SRC_ALPHA, STATE_BLEND_FUNC_ONE_MINUS_SRC_ALPHA));
-		r->set_vertex_buffer(sprite.m_vb);
-		r->set_index_buffer(sprite.m_ib);
+		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);
 
-		r->set_pose(sprite.m_world_pose);
+		r->set_pose(sprite->m_world_pose);
 		r->commit(0);
 	}
 
 	frames++;
 }
 
-//-----------------------------------------------------------------------------
-SpriteId RenderWorld::allocate_sprite(SpriteResource* sr, int32_t node, const Vector3& pos, const Quaternion& rot)
-{
-	SpriteId id = m_sprite_table.create();
-
-	Sprite sprite;
-	sprite.create(sr, node, pos, rot);
-
-	uint32_t index = m_sprite.push_back(sprite);
-	m_sprite_sparse_to_packed[id.index] = index;
-
-	return id;
-}
-
-//-----------------------------------------------------------------------------
-void RenderWorld::deallocate_sprite(SpriteId /*id*/)
-{
-	// Stub
-}
-
 } // namespace crown

+ 2 - 9
engine/RenderWorld.h

@@ -62,12 +62,6 @@ public:
 	void		destroy_sprite(SpriteId id);
 	Sprite*		lookup_sprite(SpriteId id);
 
-	MeshId 		allocate_mesh(MeshResource* mr, int32_t node, const Vector3& pos, const Quaternion& rot);
-	void 		deallocate_mesh(MeshId id);
-
-	SpriteId	allocate_sprite(SpriteResource* sr, int32_t node, const Vector3& pos, const Quaternion& rot);
-	void 		deallocate_sprite(SpriteId id);
-
 	void		update(const Matrix4x4& view, const Matrix4x4& projection, uint16_t x, uint16_t y, uint16_t width, uint16_t height, float dt);
 
 private:
@@ -75,9 +69,8 @@ private:
 	PoolAllocator					m_mesh_pool;
 	IdArray<MAX_MESHES, Mesh*>		m_mesh;
 
-	IdTable<MAX_SPRITES>	m_sprite_table;
-	uint32_t				m_sprite_sparse_to_packed[MAX_SPRITES];
-	List<Sprite>			m_sprite;
+	PoolAllocator					m_sprite_pool;
+	IdArray<MAX_SPRITES, Sprite*>	m_sprite;
 };
 
 } // namespace crown

+ 1 - 1
engine/Sprite.cpp

@@ -40,7 +40,7 @@ void Sprite::create(SpriteResource* sr, int32_t node, const Vector3& /*pos*/, co
 {
 	m_vb = sr->m_vb;
 	m_ib = sr->m_ib;
-	m_texture = sr->m_texture;
+	m_texture = ((TextureResource*)device()->resource_manager()->data(sr->texture()))->m_texture;
 	m_node = node;
 
 	m_animator = CE_NEW(default_allocator(), SpriteAnimator)(sr);

+ 0 - 6
engine/resource/SpriteResource.h

@@ -91,11 +91,6 @@ public:
 
 		sr->m_vb = device()->renderer()->create_vertex_buffer(4, VertexFormat::P2_T2, sr->frame(0));
 		sr->m_ib = device()->renderer()->create_index_buffer(6, t_indices);
-
-		TextureResource* res = (TextureResource*)device()->resource_manager()->data(sr->texture());
-		sr->m_texture = res->m_texture;
-
-		Log::i("resource: " "%.16"PRIx64"", sr->texture().id);
 	}
 
 	//-----------------------------------------------------------------------------
@@ -168,7 +163,6 @@ public:
 	uint8_t*					m_data;
 	size_t						m_data_size;
 
-	TextureId 					m_texture;
 	VertexBufferId 				m_vb;
 	IndexBufferId 				m_ib;
 };