// Copyright (c) 2022 Dominic Masters // // This software is released under the MIT License. // https://opensource.org/licenses/MIT #include "TiledSprite.hpp" #include "scene/SceneItem.hpp" using namespace Dawn; TiledSprite::TiledSprite(SceneItem *item) : SceneItemComponent(item), tile(-1), tileset(nullptr), meshHost(nullptr), flip(TILED_SPRITE_FLIP_Y), sizeType(TILED_SPRITE_SIZE_TYPE_SCALE), size(1.0f) { } std::vector TiledSprite::getDependencies() { if(this->meshHost == nullptr) { this->meshHost = this->item->getComponent(); } return { this->meshHost }; } void TiledSprite::onStart() { SceneItemComponent::onStart(); useEffect([&]{ if(this->meshHost == nullptr || this->tileset == nullptr) return; auto tile = this->tileset->getTile(this->tile); this->meshHost->uv0 = glm::vec2( (((flag_t)this->flip) & TILED_SPRITE_FLIP_X) == 0 ? tile.uv0.x : tile.uv1.x, (((flag_t)this->flip) & TILED_SPRITE_FLIP_Y) == 0 ? tile.uv0.y : tile.uv1.y ); this->meshHost->uv1 = glm::vec2( (((flag_t)this->flip) & TILED_SPRITE_FLIP_X) == 0 ? tile.uv1.x : tile.uv0.x, (((flag_t)this->flip) & TILED_SPRITE_FLIP_Y) == 0 ? tile.uv1.y : tile.uv0.y ); }, { &this->tile, &this->meshHost, &this->tileset, &this->flip })(); useEffect([&]{ if(this->meshHost == nullptr || this->tileset == nullptr) return; auto tile = this->tileset->getTile(this->tile); glm::vec2 size; switch(this->sizeType) { case TILED_SPRITE_SIZE_TYPE_SCALE: { size = glm::vec2( this->tileset->getTileWidth(this->tile), this->tileset->getTileHeight(this->tile) ) * (float_t)this->size; break; } case TILED_SPRITE_SIZE_TYPE_WIDTH_RATIO: { float_t rw = this->tileset->getTileHeight(this->tile) / this->tileset->getTileWidth(this->tile); size.x = (float_t)this->size; size.y = size.x * rw; break; } case TILED_SPRITE_SIZE_TYPE_HEIGHT_RATIO: { float_t rh = this->tileset->getTileWidth(this->tile) / this->tileset->getTileHeight(this->tile); size.y = (float_t)this->size; size.x = size.y * rh; break; } default: assertUnreachable(); } this->meshHost->xy0 = -size; this->meshHost->xy1 = size; }, { &this->tile, &this->meshHost, &this->tileset, &this->size })(); }