// 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) { } glm::vec2 TiledSprite::getUV0() { assertNotNull(this->tileset); auto tile = this->tileset->getTile(tileIndex); return glm::vec2( (this->flipState & TILED_SPRITE_FLIP_X) == 0 ? tile.uv0.x : tile.uv1.x, (this->flipState & TILED_SPRITE_FLIP_Y) == 0 ? tile.uv0.y : tile.uv1.y ); } glm::vec2 TiledSprite::getUV1() { assertNotNull(this->tileset); auto tile = this->tileset->getTile(tileIndex); return glm::vec2( (this->flipState & TILED_SPRITE_FLIP_X) == 0 ? tile.uv1.x : tile.uv0.x, (this->flipState & TILED_SPRITE_FLIP_Y) == 0 ? tile.uv1.y : tile.uv0.y ); } void TiledSprite::setTileset(Tileset *tileset) { assertNotNull(tileset); this->tileset = tileset; this->setTile(0); } void TiledSprite::setTilesetAndSize(TilesetGrid *tileset, glm::vec2 center) { this->setTileset(tileset); this->setSize(glm::vec2(tileset->divX, tileset->divY), center); } void TiledSprite::setTilesetAndSize(TilesetGrid *tileset) { this->setTileset(tileset); this->setSize(glm::vec2(tileset->divX, tileset->divY)); } void TiledSprite::setTile(int32_t tileIndex) { if(tileIndex == this->tileIndex) return; this->tileIndex = tileIndex; if(this->host != nullptr) { QuadMesh::bufferCoordinates( &this->host->mesh, this->getUV0(), this->getUV1(), 0 ); } } void TiledSprite::setSize(glm::vec2 size, glm::vec2 center) { this->xy0 = -center; this->xy1 = size - center; if(this->host != nullptr) { QuadMesh::bufferPositions( &this->host->mesh, this->xy0, this->xy1, 0 ); } } void TiledSprite::setSize(glm::vec2 size) { this->setSize(size, size / 2.0f); } std::vector TiledSprite::getDependencies() { this->host = this->item->getComponent(); return std::vector{ this->host }; } void TiledSprite::onStart() { SceneItemComponent::onStart(); assertNotNull(this->host); assertNotNull(this->tileset); QuadMesh::initQuadMesh(&this->host->mesh, this->xy0, this->getUV0(), this->xy1, this->getUV1(), 0 ); }