/* * SpriteRenderer.cpp * * Created on: Nov 30, 2016 * Author: tibi */ #include #include #include #include #include #include #include using namespace farmlands::components::basic; using namespace farmlands::graphics::backend; using namespace farmlands::resources; namespace farmlands { namespace graphics { SpriteRenderer::SpriteRenderer() : m_context(nullptr), m_transform(nullptr), m_sprite(nullptr) { } SpriteRenderer::~SpriteRenderer() { } model::Component* SpriteRenderer::clone() { return new SpriteRenderer(); } void SpriteRenderer::onInitialize() { m_context = &GameState::current().renderContext; m_transform = gameObject->component(); m_sprite = gameObject->component(); } void SpriteRenderer::onRender() { float posX = m_context->xToScreen(m_transform->globalX()); float posY = m_context->yToScreen(m_transform->globalY()); float w = m_sprite->currentFrame().width * m_context->viewport.pixelsPerUnitX; float h = m_sprite->currentFrame().height * m_context->viewport.pixelsPerUnitY; // Compute destination rectangle float scale = m_context->camera()->scale; SDL_Rect dest; dest.x = posX - m_sprite->anchorX * w * scale; dest.y = posY - m_sprite->anchorY * h * scale; dest.w = w * scale; dest.h = h * scale; if (m_context->visible(dest)) { // Obtain texture int texId = m_sprite->currentFrame().tileSetId; SDL_Texture* texture = resources::ResourceManager::instance().texture(texId); // Compute source rectangle SDL_Rect src; getCell(texture, m_sprite->currentFrame().tileSetCell, &src.x, &src.y); src.w = w; src.h = h; // Draw SdlRenderer::instance().renderTexture(texture, &src, &dest); } } void SpriteRenderer::getCell(SDL_Texture* texture, uint32_t cell, int* outX, int* outY) { int texWidth, texHeight; SdlRenderer::instance().getTextureSize(texture, &texWidth, &texHeight); int ppuX = m_context->viewport.pixelsPerUnitX; int ppuY = m_context->viewport.pixelsPerUnitY; // Compute texture coordinates *outX = (cell * ppuX) % texWidth; *outY = ((cell * ppuX) / texWidth) * ppuY; } void SpriteRenderer::dump(unsigned level) { for (unsigned i = 0; i < level; i++) std::cout<<" "; std::cout << " .Component: SpriteRenderer\n"; } } /* namespace graphics */ } /* namespace farmlands */