Beispiel #1
0
	void SpriteAtlas::draw( PrimitiveBatch* batch, const Vector2& pos, uint32 sprite_idx ) const
	{
		if( sprite_idx < num_sprites() )
		{
			TexturedQuad2D q = m_sprites[sprite_idx];

			q.pos[0] += pos;
			q.pos[1] += pos;
			q.pos[2] += pos;
			q.pos[3] += pos;

			batch->draw_textured_quad(&q, m_texture);
		}
	}
Beispiel #2
0
	SpriteAtlas::SpriteAtlas( RenderDevice* device, uint32 sprite_width, uint32 sprite_height, const char* filename ) 
		: m_device(device)		
		, m_sprite_size(float(sprite_width), float(sprite_height))
		, m_texture_size(1,1)
		, m_num_sprites_x(0)
		, m_num_sprites_y(0)
	{
        Gfx_AddReference(m_device);

		m_texture = Gfx_Texture_Load(m_device, filename);

		TextureDescr descr = Gfx_Texture_Descr(m_device, m_texture);

		m_texture_size.x = float(descr.width);
		m_texture_size.y = float(descr.height);

		m_num_sprites_x = descr.width  / sprite_width;
		m_num_sprites_y = descr.height / sprite_height;

		m_sprites.resize(num_sprites());

		for(uint32 y=0; y<m_num_sprites_y; ++y)
		{
			for(uint32 x=0; x<m_num_sprites_x; ++x)
			{
				TexturedQuad2D& q = m_sprites[x + y*m_num_sprites_x];

				float w = m_sprite_size.x;
				float h = m_sprite_size.y;

				float tx = float(x)*m_sprite_size.x	/ m_texture_size.x;
				float ty = float(y)*m_sprite_size.x	/ m_texture_size.y;

				float tw = m_sprite_size.x / m_texture_size.x;
				float th = m_sprite_size.y / m_texture_size.y;

				q.pos[0] = Vector2(0,	0);
				q.pos[1] = Vector2(w,	0);
				q.pos[2] = Vector2(w,	h);
				q.pos[3] = Vector2(0,	h);

				q.tex[0] = Vector2(tx,		ty);
				q.tex[1] = Vector2(tx+tw,	ty);
				q.tex[2] = Vector2(tx+tw,	ty+th);
				q.tex[3] = Vector2(tx,		ty+th);
			}
		}
	}
	StringId64 get_sprite_id(const PackageResource* pr, uint32_t i)
	{
		CE_ASSERT(i < num_sprites(pr), "Index out of bounds");
		StringId64* begin = (StringId64*) ((char*)pr + pr->sprites_offset);
		return begin[i];
	}