Bladeren bron

Simplify sprite component

Daniele Bartolini 9 jaren geleden
bovenliggende
commit
2995c66098
3 gewijzigde bestanden met toevoegingen van 20 en 133 verwijderingen
  1. 1 12
      src/lua/lua_api.cpp
  2. 15 112
      src/world/render_world.cpp
  3. 4 9
      src/world/render_world.h

+ 1 - 12
src/lua/lua_api.cpp

@@ -1854,18 +1854,7 @@ static int render_world_sprite_instances(lua_State* L)
 	RenderWorld* rw = stack.get_render_world(1);
 	RenderWorld* rw = stack.get_render_world(1);
 	UnitId unit = stack.get_unit(2);
 	UnitId unit = stack.get_unit(2);
 
 
-	TempAllocator512 ta;
-	Array<SpriteInstance> inst(ta);
-	rw->sprite_instances(unit, inst);
-
-	stack.push_table(array::size(inst));
-	for (u32 i = 0; i < array::size(inst); ++i)
-	{
-		stack.push_key_begin(i+1);
-		stack.push_sprite_instance(inst[i]);
-		stack.push_key_end();
-	}
-
+	stack.push_sprite_instance(rw->sprite(unit));
 	return 1;
 	return 1;
 }
 }
 
 

+ 15 - 112
src/world/render_world.cpp

@@ -132,15 +132,9 @@ void RenderWorld::sprite_destroy(SpriteInstance i)
 	_sprite_manager.destroy(i);
 	_sprite_manager.destroy(i);
 }
 }
 
 
-void RenderWorld::sprite_instances(UnitId id, Array<SpriteInstance>& instances)
+SpriteInstance RenderWorld::sprite(UnitId id)
 {
 {
-	SpriteInstance inst = _sprite_manager.first(id);
-
-	while (_sprite_manager.is_valid(inst))
-	{
-		array::push_back(instances, inst);
-		inst = _sprite_manager.next(inst);
-	}
+	return _sprite_manager.sprite(id);
 }
 }
 
 
 void RenderWorld::sprite_set_material(SpriteInstance i, StringId64 id)
 void RenderWorld::sprite_set_material(SpriteInstance i, StringId64 id)
@@ -252,7 +246,7 @@ void RenderWorld::update_transforms(const UnitId* begin, const UnitId* end, cons
 
 
 		if (_sprite_manager.has(*begin))
 		if (_sprite_manager.has(*begin))
 		{
 		{
-			SpriteInstance inst = _sprite_manager.first(*begin);
+			SpriteInstance inst = _sprite_manager.sprite(*begin);
 			sid.world[inst.i] = *world;
 			sid.world[inst.i] = *world;
 		}
 		}
 
 
@@ -377,15 +371,10 @@ void RenderWorld::unit_destroyed_callback(UnitId id)
 	}
 	}
 
 
 	{
 	{
-		SpriteInstance curr = _sprite_manager.first(id);
-		SpriteInstance next;
+		SpriteInstance first = sprite(id);
 
 
-		while (_sprite_manager.is_valid(curr))
-		{
-			next = _sprite_manager.next(curr);
-			sprite_destroy(curr);
-			curr = next;
-		}
+		if (_sprite_manager.is_valid(first))
+			sprite_destroy(first);
 	}
 	}
 
 
 	{
 	{
@@ -663,16 +652,7 @@ SpriteInstance RenderWorld::SpriteManager::create(UnitId id, const SpriteResourc
 	++_data.size;
 	++_data.size;
 	++_data.first_hidden;
 	++_data.first_hidden;
 
 
-	SpriteInstance curr = first(id);
-	if (!is_valid(curr))
-	{
-		hash_map::set(_map, id, last);
-	}
-	else
-	{
-		add_node(curr, make_instance(last));
-	}
-
+	hash_map::set(_map, id, last);
 	return make_instance(last);
 	return make_instance(last);
 }
 }
 
 
@@ -680,13 +660,9 @@ void RenderWorld::SpriteManager::destroy(SpriteInstance i)
 {
 {
 	CE_ASSERT(i.i < _data.size, "Index out of bounds");
 	CE_ASSERT(i.i < _data.size, "Index out of bounds");
 
 
-	const u32 last               = _data.size - 1;
-	const UnitId u               = _data.unit[i.i];
-	const SpriteInstance first_i = first(u);
-	const SpriteInstance last_i  = make_instance(last);
-
-	swap_node(last_i, i);
-	remove_node(first_i, i);
+	const u32 last      = _data.size - 1;
+	const UnitId u      = _data.unit[i.i];
+	const UnitId last_u = _data.unit[last];
 
 
 	_data.unit[i.i]          = _data.unit[last];
 	_data.unit[i.i]          = _data.unit[last];
 	_data.resource[i.i]      = _data.resource[last];
 	_data.resource[i.i]      = _data.resource[last];
@@ -700,94 +676,21 @@ void RenderWorld::SpriteManager::destroy(SpriteInstance i)
 
 
 	--_data.size;
 	--_data.size;
 	--_data.first_hidden;
 	--_data.first_hidden;
+
+	hash_map::set(_map, last_u, i.i);
+	hash_map::remove(_map, u);
 }
 }
 
 
 bool RenderWorld::SpriteManager::has(UnitId id)
 bool RenderWorld::SpriteManager::has(UnitId id)
 {
 {
-	return is_valid(first(id));
+	return is_valid(sprite(id));
 }
 }
 
 
-SpriteInstance RenderWorld::SpriteManager::first(UnitId id)
+SpriteInstance RenderWorld::SpriteManager::sprite(UnitId id)
 {
 {
 	return make_instance(hash_map::get(_map, id, UINT32_MAX));
 	return make_instance(hash_map::get(_map, id, UINT32_MAX));
 }
 }
 
 
-SpriteInstance RenderWorld::SpriteManager::next(SpriteInstance i)
-{
-	CE_ASSERT(i.i < _data.size, "Index out of bounds");
-	return _data.next_instance[i.i];
-}
-
-SpriteInstance RenderWorld::SpriteManager::previous(SpriteInstance i)
-{
-	CE_ASSERT(i.i < _data.size, "Index out of bounds");
-
-	const UnitId u = _data.unit[i.i];
-
-	SpriteInstance curr = first(u);
-	SpriteInstance prev = { UINT32_MAX };
-
-	while (curr.i != i.i)
-	{
-		prev = curr;
-		curr = next(curr);
-	}
-
-	return prev;
-}
-
-void RenderWorld::SpriteManager::add_node(SpriteInstance first, SpriteInstance i)
-{
-	CE_ASSERT(first.i < _data.size, "Index out of bounds");
-	CE_ASSERT(i.i < _data.size, "Index out of bounds");
-
-	SpriteInstance curr = first;
-	while (is_valid(next(curr)))
-		curr = next(curr);
-
-	_data.next_instance[curr.i] = i;
-}
-
-void RenderWorld::SpriteManager::remove_node(SpriteInstance first, SpriteInstance i)
-{
-	CE_ASSERT(first.i < _data.size, "Index out of bounds");
-	CE_ASSERT(i.i < _data.size, "Index out of bounds");
-
-	const UnitId u = _data.unit[first.i];
-
-	if (i.i == first.i)
-	{
-		if (!is_valid(next(i)))
-			hash_map::remove(_map, u);
-		else
-			hash_map::set(_map, u, next(i).i);
-	}
-	else
-	{
-		SpriteInstance prev = previous(i);
-		_data.next_instance[prev.i] = next(i);
-	}
-}
-
-void RenderWorld::SpriteManager::swap_node(SpriteInstance a, SpriteInstance b)
-{
-	CE_ASSERT(a.i < _data.size, "Index out of bounds");
-	CE_ASSERT(b.i < _data.size, "Index out of bounds");
-
-	const UnitId u = _data.unit[a.i];
-	const SpriteInstance first_i = first(u);
-
-	if (a.i == first_i.i)
-	{
-		hash_map::set(_map, u, b.i);
-	}
-	else
-	{
-		const SpriteInstance prev_a = previous(a);
-		_data.next_instance[prev_a.i] = b;
-	}
-}
-
 void RenderWorld::SpriteManager::destroy()
 void RenderWorld::SpriteManager::destroy()
 {
 {
 	_allocator->deallocate(_data.buffer);
 	_allocator->deallocate(_data.buffer);

+ 4 - 9
src/world/render_world.h

@@ -54,7 +54,7 @@ public:
 	void sprite_destroy(SpriteInstance i);
 	void sprite_destroy(SpriteInstance i);
 
 
 	/// Returns the sprite instances of the unit @a id.
 	/// Returns the sprite instances of the unit @a id.
-	void sprite_instances(UnitId id, Array<SpriteInstance>& instances);
+	SpriteInstance sprite(UnitId id);
 
 
 	/// Sets the material @a id of the sprite @a i.
 	/// Sets the material @a id of the sprite @a i.
 	void sprite_set_material(SpriteInstance i, StringId64 id);
 	void sprite_set_material(SpriteInstance i, StringId64 id);
@@ -217,17 +217,12 @@ private:
 			memset(&_data, 0, sizeof(_data));
 			memset(&_data, 0, sizeof(_data));
 		}
 		}
 
 
-		void allocate(u32 num);
-		void grow();
 		SpriteInstance create(UnitId id, const SpriteResource* sr, StringId64 material, const Matrix4x4& tr);
 		SpriteInstance create(UnitId id, const SpriteResource* sr, StringId64 material, const Matrix4x4& tr);
 		void destroy(SpriteInstance i);
 		void destroy(SpriteInstance i);
 		bool has(UnitId id);
 		bool has(UnitId id);
-		SpriteInstance first(UnitId id);
-		SpriteInstance next(SpriteInstance i);
-		SpriteInstance previous(SpriteInstance i);
-		void add_node(SpriteInstance first, SpriteInstance i);
-		void remove_node(SpriteInstance first, SpriteInstance i);
-		void swap_node(SpriteInstance a, SpriteInstance b);
+		SpriteInstance sprite(UnitId id);
+		void allocate(u32 num);
+		void grow();
 		void destroy();
 		void destroy();
 
 
 		SpriteInstance make_instance(u32 i) { SpriteInstance inst = { i }; return inst; }
 		SpriteInstance make_instance(u32 i) { SpriteInstance inst = { i }; return inst; }