Tiled sprite improvements!
This commit is contained in:
@ -12,7 +12,10 @@ TiledSprite::TiledSprite(SceneItem *item) :
|
||||
SceneItemComponent(item),
|
||||
tile(-1),
|
||||
tileset(nullptr),
|
||||
meshHost(nullptr)
|
||||
meshHost(nullptr),
|
||||
flip(TILED_SPRITE_FLIP_Y),
|
||||
sizeType(TILED_SPRITE_SIZE_TYPE_SCALE),
|
||||
size(1.0f)
|
||||
{
|
||||
|
||||
}
|
||||
@ -33,11 +36,60 @@ void TiledSprite::onStart() {
|
||||
useEffect([&]{
|
||||
if(this->meshHost == nullptr || this->tileset == nullptr) return;
|
||||
auto tile = this->tileset->getTile(this->tile);
|
||||
this->meshHost->uv0 = tile.uv0;
|
||||
this->meshHost->uv1 = tile.uv1;
|
||||
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->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
|
||||
})();
|
||||
}
|
Reference in New Issue
Block a user