91 lines
2.3 KiB
C++
91 lines
2.3 KiB
C++
// 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<SceneItemComponent*> TiledSprite::getDependencies() {
|
|
this->host = this->item->getComponent<MeshHost>();
|
|
|
|
return std::vector<SceneItemComponent*>{
|
|
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
|
|
);
|
|
} |