mikymod 12 سال پیش
والد
کامیت
73dfdbbf1b
2فایلهای تغییر یافته به همراه62 افزوده شده و 5 حذف شده
  1. 49 4
      engine/World.cpp
  2. 13 1
      engine/World.h

+ 49 - 4
engine/World.cpp

@@ -37,12 +37,13 @@ namespace crown
 
 //-----------------------------------------------------------------------------
 World::World()
-	: m_unit_pool(default_allocator(), MAX_UNITS, sizeof(Unit))
+	: m_unit_pool(default_allocator(), MAX_UNITS, sizeof(Unit), CE_ALIGNOF(Unit))
 	, m_units(default_allocator())
 	, m_camera(default_allocator())
 	, m_sounds(default_allocator())
 	, m_unit_to_camera(default_allocator())
 	, m_unit_to_sound_instance(default_allocator())
+	, m_unit_to_sprite(default_allocator())
 {
 }
 
@@ -100,7 +101,7 @@ void World::link_camera(CameraId camera, UnitId unit, int32_t node)
 
 	for (uint32_t i = 0; i < m_unit_to_camera.size(); i++)
 	{
-		if (utc->camera == camera && utc->unit == unit)
+		if (m_unit_to_camera[i].camera == camera && m_unit_to_camera[i].unit == unit)
 		{
 			utc = &m_unit_to_camera[i];
 		}
@@ -126,6 +127,39 @@ void World::unlink_camera(CameraId camera)
 	(void)camera;
 }
 
+//-----------------------------------------------------------------------------
+void World::link_sprite(SpriteId sprite, UnitId unit, int32_t node)
+{
+	UnitToSprite* uts = NULL;
+
+	for (uint32_t i = 0; i < m_unit_to_sprite.size(); i++)
+	{
+		if (m_unit_to_sprite[i].sprite == sprite && m_unit_to_sprite[i].unit == unit)
+		{
+			uts = &m_unit_to_sprite[i];
+		}
+	}
+
+	if (uts != NULL)
+	{
+		uts->node = node;
+	}
+	else
+	{
+		UnitToSprite new_uts;
+		new_uts.sprite = sprite;
+		new_uts.unit = unit;
+		new_uts.node = node;
+		m_unit_to_sprite.push_back(new_uts);
+	}	
+}
+
+//-----------------------------------------------------------------------------
+void World::unlink_sprite(SpriteId sprite)
+{
+	(void)sprite;
+}
+
 //-----------------------------------------------------------------------------
 Unit* World::lookup_unit(UnitId unit)
 {
@@ -189,6 +223,17 @@ void World::update(Camera& camera, float dt)
 		sound.world = unit->m_scene_graph.world_pose(uts.node);
 	}
 
+	// Update sprites
+	for (uint32_t i = 0; i < m_unit_to_sprite.size(); i++)
+	{
+		const UnitToSprite& uts = m_unit_to_sprite[i];
+
+		Unit* unit = lookup_unit(uts.unit);
+		Sprite* sprite = lookup_sprite(uts.sprite);
+
+		sprite->m_world_pose = unit->m_scene_graph.world_pose(uts.node);
+	}
+
 	// Update render world
 	m_render_world.update(camera.m_world_pose, camera.m_projection, camera.m_view_x, camera.m_view_y,
 							camera.m_view_width, camera.m_view_height, dt);
@@ -246,9 +291,9 @@ void World::destroy_mesh(MeshId id)
 }
 
 //-----------------------------------------------------------------------------
-SpriteId World::create_sprite(const char* name, int32_t node, const Vector3& pos, const Quaternion& rot)
+SpriteId World::create_sprite(ResourceId id, int32_t node, const Vector3& pos, const Quaternion& rot)
 {
-	return m_render_world.create_sprite(name, node, pos, rot);
+	return m_render_world.create_sprite(id, node, pos, rot);
 }
 
 //-----------------------------------------------------------------------------

+ 13 - 1
engine/World.h

@@ -49,6 +49,7 @@ typedef Id UnitId;
 typedef Id CameraId;
 typedef Id MeshId;
 typedef Id SoundInstanceId;
+typedef Id SpriteId;
 
 struct SoundInstance
 {
@@ -74,6 +75,13 @@ struct UnitToSoundInstance
 	int32_t node;
 };
 
+struct UnitToSprite
+{
+	UnitId unit;
+	SpriteId sprite;
+	int32_t node;
+};
+
 class Mesh;
 class Sprite;
 class Vector3;
@@ -94,6 +102,9 @@ public:
 	void					link_camera(CameraId camera, UnitId unit, int32_t node);
 	void					unlink_camera(CameraId camera);
 
+	void					link_sprite(SpriteId sprite, UnitId unit, int32_t node);
+	void					unlink_sprite(SpriteId sprite);
+
 	Unit*					lookup_unit(UnitId unit);
 	Camera*					lookup_camera(CameraId camera);
 	Mesh*					lookup_mesh(MeshId mesh);
@@ -108,7 +119,7 @@ public:
 	MeshId					create_mesh(ResourceId id, int32_t node, const Vector3& pos = Vector3::ZERO, const Quaternion& rot = Quaternion::IDENTITY);
 	void					destroy_mesh(MeshId id);
 
-	SpriteId				create_sprite(const char* name, int32_t node = -1, const Vector3& pos = Vector3::ZERO, const Quaternion& rot = Quaternion::IDENTITY);
+	SpriteId				create_sprite(ResourceId id, int32_t node = -1, const Vector3& pos = Vector3::ZERO, const Quaternion& rot = Quaternion::IDENTITY);
 	void					destroy_sprite(SpriteId id);
 
 	SoundInstanceId			play_sound(const char* name, const bool loop = false, const float volume = 1.0f, const Vector3& pos = Vector3::ZERO, const float range = 50.0f);
@@ -130,6 +141,7 @@ private:
 	// Connections
 	List<UnitToCamera>					m_unit_to_camera;
 	List<UnitToSoundInstance>			m_unit_to_sound_instance;
+	List<UnitToSprite>					m_unit_to_sprite;
 
 	RenderWorld							m_render_world;
 };