From e6c966f3dd909a90ee4db11482e287c03ee9ef02 Mon Sep 17 00:00:00 2001 From: Dominic Masters Date: Sun, 14 May 2023 19:06:37 -0700 Subject: [PATCH] Tiled sprite improvements! --- src/dawn/display/Tileset.cpp | 4 +- src/dawn/display/Tileset.hpp | 31 ++++++---- src/dawn/display/font/BitmapFont.cpp | 6 +- src/dawn/scene/Scene.hpp | 3 +- .../scene/components/display/TiledSprite.cpp | 60 +++++++++++++++++-- .../scene/components/display/TiledSprite.hpp | 15 +++++ src/dawn/scene/components/ui/UIComponent.hpp | 3 +- src/dawnliminal/scenes/HelloWorldScene.hpp | 54 ++++++++--------- .../display/TextureRenderTarget.cpp | 4 +- .../prefabtool/PrefabComponentParser.cpp | 2 + 10 files changed, 128 insertions(+), 54 deletions(-) diff --git a/src/dawn/display/Tileset.cpp b/src/dawn/display/Tileset.cpp index 87f7390d..e24f3d37 100644 --- a/src/dawn/display/Tileset.cpp +++ b/src/dawn/display/Tileset.cpp @@ -63,11 +63,11 @@ TilesetGrid::TilesetGrid( } } -float_t TilesetGrid::getTileWidth() { +float_t TilesetGrid::getTileWidth(int32_t tile) { return this->divX; } -float_t TilesetGrid::getTileHeight() { +float_t TilesetGrid::getTileHeight(int32_t tile) { return this->divY; } diff --git a/src/dawn/display/Tileset.hpp b/src/dawn/display/Tileset.hpp index 84509b1d..4ffb33aa 100644 --- a/src/dawn/display/Tileset.hpp +++ b/src/dawn/display/Tileset.hpp @@ -24,6 +24,22 @@ namespace Dawn { * @return Tile at that index. */ struct Tile getTile(int32_t tile); + + /** + * Returns the width of an individual tile. + * + * @param tile The tile to get the width of. + * @return The tile width. + */ + virtual float_t getTileWidth(int32_t tile) = 0; + + /** + * Returns the height of an individual tile. + * + * @param tile The tile to get the height of. + * @return The tile height. + */ + virtual float_t getTileHeight(int32_t tile) = 0; }; struct TilesetGrid : public Tileset{ @@ -61,19 +77,8 @@ namespace Dawn { int32_t borderY ); - /** - * Returns the width of an individual tile. - * - * @return The tile width. - */ - float_t getTileWidth(); - - /** - * Returns the height of an individual tile. - * - * @return The tile height. - */ - float_t getTileHeight(); + float_t getTileWidth(int32_t tile) override; + float_t getTileHeight(int32_t tile) override; /** * Returns the tile at a given grid position. diff --git a/src/dawn/display/font/BitmapFont.cpp b/src/dawn/display/font/BitmapFont.cpp index 12bc7e42..34b6cc19 100644 --- a/src/dawn/display/font/BitmapFont.cpp +++ b/src/dawn/display/font/BitmapFont.cpp @@ -45,7 +45,7 @@ void BitmapFont::buffer( size_t wordStart = 0; glm::vec2 xy0(0, 0); glm::vec2 tileSize = - glm::vec2(tileset->getTileWidth(), tileset->getTileHeight()) * + glm::vec2(tileset->getTileWidth(0), tileset->getTileHeight(0)) * (fontSize / this->getDefaultFontSize()) ; @@ -142,9 +142,9 @@ void BitmapFont::draw(Mesh *mesh, int32_t start, int32_t len) { } float_t BitmapFont::getLineHeight(float_t fontSize) { - return tileset->getTileHeight(); + return tileset->getTileHeight(0); } float_t BitmapFont::getDefaultFontSize() { - return tileset->getTileHeight(); + return tileset->getTileHeight(0); } \ No newline at end of file diff --git a/src/dawn/scene/Scene.hpp b/src/dawn/scene/Scene.hpp index 4fbd197f..aac42c95 100644 --- a/src/dawn/scene/Scene.hpp +++ b/src/dawn/scene/Scene.hpp @@ -10,6 +10,7 @@ #include "scene/debug/SceneDebugLine.hpp" #include "physics/ScenePhysicsManager.hpp" #include "state/StateEvent.hpp" +#include "state/StateOwner.hpp" namespace Dawn { class DawnGame; @@ -25,7 +26,7 @@ namespace Dawn { template std::vector _sceneForwardGetComponents(SceneItem *item); - class Scene { + class Scene : public StateOwner { private: sceneitemid_t nextId; std::map items; diff --git a/src/dawn/scene/components/display/TiledSprite.cpp b/src/dawn/scene/components/display/TiledSprite.cpp index 45fab2ef..c24db9e8 100644 --- a/src/dawn/scene/components/display/TiledSprite.cpp +++ b/src/dawn/scene/components/display/TiledSprite.cpp @@ -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 })(); } \ No newline at end of file diff --git a/src/dawn/scene/components/display/TiledSprite.hpp b/src/dawn/scene/components/display/TiledSprite.hpp index c98dbbe3..b8aafb40 100644 --- a/src/dawn/scene/components/display/TiledSprite.hpp +++ b/src/dawn/scene/components/display/TiledSprite.hpp @@ -7,7 +7,16 @@ #include "display/Tileset.hpp" #include "scene/components/display/mesh/QuadMeshHost.hpp" +#define TILED_SPRITE_FLIP_Y FLAG_DEFINE(1) +#define TILED_SPRITE_FLIP_X FLAG_DEFINE(2) + namespace Dawn { + enum TiledSpriteSizeType { + TILED_SPRITE_SIZE_TYPE_SCALE, + TILED_SPRITE_SIZE_TYPE_WIDTH_RATIO, + TILED_SPRITE_SIZE_TYPE_HEIGHT_RATIO + }; + class TiledSprite : public SceneItemComponent { public: // @optional @@ -16,6 +25,12 @@ namespace Dawn { StateProperty meshHost; // @optional StateProperty tile; + // @optional + StateProperty flip; + // @optional + StateProperty sizeType; + // @optional + StateProperty size; TiledSprite(SceneItem *item); std::vector getDependencies(); diff --git a/src/dawn/scene/components/ui/UIComponent.hpp b/src/dawn/scene/components/ui/UIComponent.hpp index b9a31c57..17058dfd 100644 --- a/src/dawn/scene/components/ui/UIComponent.hpp +++ b/src/dawn/scene/components/ui/UIComponent.hpp @@ -42,8 +42,6 @@ namespace Dawn { protected: float_t width = 1; float_t height = 1; - - StateEvent<> eventAlignmentUpdated; /** * Simply returns this UI Components' dimensional parent, used for the @@ -60,6 +58,7 @@ namespace Dawn { public: StateProperty alignmentNeedsUpdating; + StateEvent<> eventAlignmentUpdated; /** * Method used to calculate alignment values. diff --git a/src/dawnliminal/scenes/HelloWorldScene.hpp b/src/dawnliminal/scenes/HelloWorldScene.hpp index 1bd3aa75..64636e8b 100644 --- a/src/dawnliminal/scenes/HelloWorldScene.hpp +++ b/src/dawnliminal/scenes/HelloWorldScene.hpp @@ -21,51 +21,51 @@ namespace Dawn { TextureRenderTarget *renderTarget; Texture text; TilesetGrid grid; + CameraTexture *camTexture; + UIImage *image; int32_t test = 0; void stage() override { - // canvas = UICanvas::create(this); + canvas = UICanvas::create(this); camera = Camera::create(this); glm::vec3 off = glm::vec3(0, 0, 0); camera->transform->lookAt(glm::vec3(10, 10, 10) + off, glm::vec3(0, 0, 0) + off); - // auto textbox = VNTextbox::create(this); - // textbox->transform.setParent(canvas->transform); + auto textbox = VNTextbox::create(this); + textbox->transform.setParent(canvas->transform); - // camNew = Camera::create(this); - // auto camTexture = camNew->item->addComponent(); - // camNew->fov = 0.436332f; - // camNew->transform->lookAt(glm::vec3(10, 10, 10), glm::vec3(0, 0, 0)); - // camTexture->renderTarget.setSize(1024, 1024); + camNew = Camera::create(this); + camTexture = camNew->item->addComponent(); + camNew->fov = 0.436332f; + camNew->transform->lookAt(glm::vec3(0, 0, 5), glm::vec3(0, 0, 0)); + camTexture->renderTarget.setSize(1, 1); - // auto uiTest = this->createSceneItem(); - // uiTest->transform.setParent(canvas->transform); - // auto image = uiTest->addComponent(); - // image->texture = camTexture->renderTarget.getTexture(); - // image->alignment = glm::vec4(0, 0, 50, 0); - // image->alignX = UI_COMPONENT_ALIGN_START; - // image->alignUnitRight = UI_COMPONENT_ALIGN_UNIT_PERCENT; - // image->alignY = UI_COMPONENT_ALIGN_STRETCH; + auto uiTest = this->createSceneItem(); + uiTest->transform.setParent(canvas->transform); + image = uiTest->addComponent(); + image->texture = camTexture->renderTarget.getTexture(); + image->alignment = glm::vec4(0, 0, 50, 0); + image->alignX = UI_COMPONENT_ALIGN_START; + image->alignUnitRight = UI_COMPONENT_ALIGN_UNIT_PERCENT; + image->alignY = UI_COMPONENT_ALIGN_STRETCH; this->grid = TilesetGrid( - 1, 26, - 741, 20540, + 1, 13, + 741, 10270, 0, 0, 0, 0 ); auto eth = EthPrefab::create(this); - // eth->tiledSprite->tileset = &grid; + eth->tiledSprite->tileset = &grid; - // struct Color colors[] = { - // COLOR_BLUE, COLOR_MAGENTA, COLOR_WHITE, - // COLOR_MAGENTA, COLOR_CORNFLOWER_BLUE, COLOR_MAGENTA, - // COLOR_BLACK, COLOR_MAGENTA, COLOR_BLUE - // }; - // text.setSize(3, 3); - // text.buffer(colors); - // textbox->border->texture = &text; + useEvent([&]{ + assertNotNull(camTexture); + assertNotNull(image); + std::cout << "Size Update" << std::endl; + camTexture->renderTarget.setSize(image->getWidth(), image->getHeight()); + }, image->eventAlignmentUpdated); } std::vector getRequiredAssets() override { diff --git a/src/dawnopengl/display/TextureRenderTarget.cpp b/src/dawnopengl/display/TextureRenderTarget.cpp index 4fcc61ae..94f709ac 100644 --- a/src/dawnopengl/display/TextureRenderTarget.cpp +++ b/src/dawnopengl/display/TextureRenderTarget.cpp @@ -18,8 +18,8 @@ Texture * TextureRenderTarget::getTexture() { void TextureRenderTarget::setSize(float_t width, float_t height) { assertTrue(width > 0); assertTrue(height > 0); - assertTrue(width != this->getWidth()); - assertTrue(height != this->getHeight()); + + if(width == this->getWidth() && height == this->getHeight()) return; // Delete old buffers. if(this->rboId != -1) glDeleteRenderbuffers(1, &this->rboId); diff --git a/src/dawntools/prefabtool/PrefabComponentParser.cpp b/src/dawntools/prefabtool/PrefabComponentParser.cpp index 71227048..402fb5d4 100644 --- a/src/dawntools/prefabtool/PrefabComponentParser.cpp +++ b/src/dawntools/prefabtool/PrefabComponentParser.cpp @@ -62,6 +62,8 @@ int32_t PrefabComponentParser::onParse( parser = intParser; } else if(type == "bool_t") { parser = boolParser; + } else if(type == "flag_t") { + parser = rawParser; } else if(type.starts_with("enum")) { parser = rawParser; } else if(type.find("*") == (type.size() - 1)) {