From ef28a368cbeb790ed76f35ee83f78f467bfb4b0e Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sun, 28 Apr 2024 22:33:34 +0300 Subject: [PATCH] refactor --- src/assets/assetload_funcs.cpp | 4 +-- src/frontend/InventoryView.cpp | 20 +++++------- src/frontend/InventoryView.h | 3 +- src/frontend/LevelFrontend.cpp | 11 +++---- src/frontend/LevelFrontend.h | 5 --- src/frontend/hud.cpp | 2 +- src/graphics/core/Atlas.cpp | 4 +-- src/graphics/core/Atlas.hpp | 2 +- src/graphics/render/BlocksPreview.cpp | 44 +++++++++++++++++---------- src/items/Inventories.cpp | 4 ++- src/window/Camera.cpp | 2 +- src/window/Camera.h | 4 +-- 12 files changed, 54 insertions(+), 51 deletions(-) diff --git a/src/assets/assetload_funcs.cpp b/src/assets/assetload_funcs.cpp index fc0bece0..32072f71 100644 --- a/src/assets/assetload_funcs.cpp +++ b/src/assets/assetload_funcs.cpp @@ -96,7 +96,7 @@ assetload::postfunc assetload::atlas( continue; } std::set names = builder.getNames(); - Atlas* atlas = builder.build(2, false); + Atlas* atlas = builder.build(2, false).release(); return [=](auto assets) { atlas->prepare(); assets->store(atlas, name); @@ -247,7 +247,7 @@ static bool animation( continue; } - std::unique_ptr srcAtlas (builder.build(2)); + auto srcAtlas = builder.build(2); srcAtlas->prepare(); Texture* srcTex = srcAtlas->getTexture(); diff --git a/src/frontend/InventoryView.cpp b/src/frontend/InventoryView.cpp index b07a62f3..ec4a2d0c 100644 --- a/src/frontend/InventoryView.cpp +++ b/src/frontend/InventoryView.cpp @@ -136,7 +136,7 @@ void SlotView::draw(const GfxContext* pctx, Assets* assets) { batch->setColor(glm::vec4(1.0f)); - auto previews = frontend->getBlocksAtlas(); + auto previews = assets->getAtlas("block-previews"); auto indices = content->getIndices(); ItemDef* item = indices->getItemDef(stack.getItemId()); @@ -181,7 +181,7 @@ void SlotView::draw(const GfxContext* pctx, Assets* assets) { int x = pos.x+slotSize-text.length()*8; int y = pos.y+slotSize-16; - batch->setColor(glm::vec4(0, 0, 0, 1.0f)); + batch->setColor({0, 0, 0, 1.0f}); font->draw(batch, text, x+1, y+1); batch->setColor(glm::vec4(1.0f)); font->draw(batch, text, x, y); @@ -266,13 +266,12 @@ void SlotView::onFocus(gui::GUI* gui) { void SlotView::bind( int64_t inventoryid, ItemStack& stack, - LevelFrontend* frontend, + const Content* content, InventoryInteraction* interaction ) { this->inventoryid = inventoryid; bound = &stack; - content = frontend->getLevel()->content; - this->frontend = frontend; + this->content = content; this->interaction = interaction; } @@ -332,21 +331,18 @@ void InventoryView::bind( slot->bind( inventory->getId(), inventory->getSlot(slot->getLayout().index), - frontend, interaction + content, interaction ); } } void InventoryView::unbind() { - if (inventory && inventory->isVirtual()) { - frontend->getLevel()->inventories->remove(inventory->getId()); - } + inventory = nullptr; } void InventoryView::setSelected(int index) { - for (int i = 0; i < int(slots.size()); i++) { - auto slot = slots[i]; - slot->setHighlighted(i == index); + for (size_t i = 0; i < slots.size(); i++) { + slots[i]->setHighlighted(static_cast(i) == index); } } diff --git a/src/frontend/InventoryView.h b/src/frontend/InventoryView.h index 83eaeae0..95f66ab9 100644 --- a/src/frontend/InventoryView.h +++ b/src/frontend/InventoryView.h @@ -59,7 +59,6 @@ struct SlotLayout { }; class SlotView : public gui::UINode { - LevelFrontend* frontend = nullptr; InventoryInteraction* interaction = nullptr; const Content* content; SlotLayout layout; @@ -81,7 +80,7 @@ public: void bind( int64_t inventoryid, ItemStack& stack, - LevelFrontend* frontend, + const Content* content, InventoryInteraction* interaction ); diff --git a/src/frontend/LevelFrontend.cpp b/src/frontend/LevelFrontend.cpp index fe549d3a..0f3163b9 100644 --- a/src/frontend/LevelFrontend.cpp +++ b/src/frontend/LevelFrontend.cpp @@ -15,9 +15,12 @@ LevelFrontend::LevelFrontend(LevelController* controller, Assets* assets) : level(controller->getLevel()), controller(controller), assets(assets), - contentCache(std::make_unique(level->content, assets)), - blocksAtlas(BlocksPreview::build(contentCache.get(), assets, level->content)) + contentCache(std::make_unique(level->content, assets)) { + assets->store( + BlocksPreview::build(contentCache.get(), assets, level->content).release(), + "block-previews" + ); controller->getPlayerController()->listenBlockInteraction( [=](Player*, glm::ivec3 pos, const Block* def, BlockInteraction type) { auto material = level->content->findBlockMaterial(def->material); @@ -79,10 +82,6 @@ ContentGfxCache* LevelFrontend::getContentGfxCache() const { return contentCache.get(); } -Atlas* LevelFrontend::getBlocksAtlas() const { - return blocksAtlas.get(); -} - LevelController* LevelFrontend::getController() const { return controller; } diff --git a/src/frontend/LevelFrontend.h b/src/frontend/LevelFrontend.h index f31ac7e0..eff35134 100644 --- a/src/frontend/LevelFrontend.h +++ b/src/frontend/LevelFrontend.h @@ -3,10 +3,8 @@ #include -class Atlas; class Level; class Assets; -class BlocksPreview; class ContentGfxCache; class LevelController; @@ -15,7 +13,6 @@ class LevelFrontend { LevelController* controller; Assets* assets; std::unique_ptr contentCache; - std::unique_ptr blocksAtlas; public: LevelFrontend(LevelController* controller, Assets* assets); ~LevelFrontend(); @@ -23,8 +20,6 @@ public: Level* getLevel() const; Assets* getAssets() const; ContentGfxCache* getContentGfxCache() const; - Atlas* getBlocksAtlas() const; - LevelController* getController() const; }; diff --git a/src/frontend/hud.cpp b/src/frontend/hud.cpp index da87e746..f1c0b3c1 100644 --- a/src/frontend/hud.cpp +++ b/src/frontend/hud.cpp @@ -153,7 +153,7 @@ Hud::Hud(Engine* engine, LevelFrontend* frontend, Player* player) grabbedItemView->bind( 0, interaction->getGrabbedItem(), - frontend, + frontend->getLevel()->content, interaction.get() ); grabbedItemView->setColor(glm::vec4()); diff --git a/src/graphics/core/Atlas.cpp b/src/graphics/core/Atlas.cpp index 980170ea..fdf725c4 100644 --- a/src/graphics/core/Atlas.cpp +++ b/src/graphics/core/Atlas.cpp @@ -50,7 +50,7 @@ bool AtlasBuilder::has(const std::string& name) const { return names.find(name) != names.end(); } -Atlas* AtlasBuilder::build(uint extrusion, bool prepare, uint maxResolution) { +std::unique_ptr AtlasBuilder::build(uint extrusion, bool prepare, uint maxResolution) { if (maxResolution == 0) { maxResolution = Texture::MAX_RESOLUTION; } @@ -99,5 +99,5 @@ Atlas* AtlasBuilder::build(uint extrusion, bool prepare, uint maxResolution) { unitX * x, unitY * y, unitX * (x + w), unitY * (y + h) ); } - return new Atlas(std::move(canvas), regions, prepare); + return std::make_unique(std::move(canvas), regions, prepare); } diff --git a/src/graphics/core/Atlas.hpp b/src/graphics/core/Atlas.hpp index 88c1d51d..d43aef62 100644 --- a/src/graphics/core/Atlas.hpp +++ b/src/graphics/core/Atlas.hpp @@ -55,7 +55,7 @@ public: /// (greather is less mip-mapping artifacts) /// @param prepare generate atlas texture (calls .prepare()) /// @param maxResolution max atlas resolution - Atlas* build(uint extrusion, bool prepare=true, uint maxResolution=0); + std::unique_ptr build(uint extrusion, bool prepare=true, uint maxResolution=0); }; #endif // GRAPHICS_CORE_ATLAS_HPP_ diff --git a/src/graphics/render/BlocksPreview.cpp b/src/graphics/render/BlocksPreview.cpp index 12ffe158..9ee93bf7 100644 --- a/src/graphics/render/BlocksPreview.cpp +++ b/src/graphics/render/BlocksPreview.cpp @@ -55,9 +55,11 @@ std::unique_ptr BlocksPreview::draw( break; case BlockModel::custom: { + glm::vec3 pmul = glm::vec3(size * 0.63f); glm::vec3 hitbox = glm::vec3(); - for (const auto& box : def->modelBoxes) + for (const auto& box : def->modelBoxes) { hitbox = glm::max(hitbox, box.size()); + } offset.y += (1.0f - hitbox).y * 0.5f; shader->uniformMatrix("u_apply", glm::translate(glm::mat4(1.0f), offset)); for (size_t i = 0; i < def->modelBoxes.size(); i++) { @@ -69,28 +71,39 @@ std::unique_ptr BlocksPreview::draw( def->modelUVs[i * 6 + 4], def->modelUVs[i * 6 + 5] }; - batch->cube(def->modelBoxes[i].a * glm::vec3(1.0f, 1.0f, -1.0f) * glm::vec3(size * 0.63f), def->modelBoxes[i].size() * glm::vec3(size * 0.63f), texfaces, glm::vec4(1.0f), !def->rt.emissive); + batch->cube( + def->modelBoxes[i].a * glm::vec3(1.0f, 1.0f, -1.0f) * pmul, + def->modelBoxes[i].size() * pmul, + texfaces, glm::vec4(1.0f), !def->rt.emissive + ); } + + auto& points = def->modelExtraPoints; + glm::vec3 poff = glm::vec3(0.0f, 0.0f, 1.0f); + for (size_t i = 0; i < def->modelExtraPoints.size() / 4; i++) { const UVRegion& reg = def->modelUVs[def->modelBoxes.size() * 6 + i]; - batch->point((def->modelExtraPoints[i * 4 + 0] - glm::vec3(0.0f, 0.0f, 1.0f)) * glm::vec3(size * 0.63f), glm::vec2(reg.u1, reg.v1), glm::vec4(1.0)); - batch->point((def->modelExtraPoints[i * 4 + 1] - glm::vec3(0.0f, 0.0f, 1.0f)) * glm::vec3(size * 0.63f), glm::vec2(reg.u2, reg.v1), glm::vec4(1.0)); - batch->point((def->modelExtraPoints[i * 4 + 2] - glm::vec3(0.0f, 0.0f, 1.0f)) * glm::vec3(size * 0.63f), glm::vec2(reg.u2, reg.v2), glm::vec4(1.0)); - batch->point((def->modelExtraPoints[i * 4 + 0] - glm::vec3(0.0f, 0.0f, 1.0f)) * glm::vec3(size * 0.63f), glm::vec2(reg.u1, reg.v1), glm::vec4(1.0)); - batch->point((def->modelExtraPoints[i * 4 + 2] - glm::vec3(0.0f, 0.0f, 1.0f)) * glm::vec3(size * 0.63f), glm::vec2(reg.u2, reg.v2), glm::vec4(1.0)); - batch->point((def->modelExtraPoints[i * 4 + 3] - glm::vec3(0.0f, 0.0f, 1.0f)) * glm::vec3(size * 0.63f), glm::vec2(reg.u1, reg.v2), glm::vec4(1.0)); + + batch->point((points[i * 4 + 0] - poff) * pmul, glm::vec2(reg.u1, reg.v1), glm::vec4(1.0)); + batch->point((points[i * 4 + 1] - poff) * pmul, glm::vec2(reg.u2, reg.v1), glm::vec4(1.0)); + batch->point((points[i * 4 + 2] - poff) * pmul, glm::vec2(reg.u2, reg.v2), glm::vec4(1.0)); + batch->point((points[i * 4 + 0] - poff) * pmul, glm::vec2(reg.u1, reg.v1), glm::vec4(1.0)); + batch->point((points[i * 4 + 2] - poff) * pmul, glm::vec2(reg.u2, reg.v2), glm::vec4(1.0)); + batch->point((points[i * 4 + 3] - poff) * pmul, glm::vec2(reg.u1, reg.v2), glm::vec4(1.0)); } batch->flush(); } break; case BlockModel::xsprite: { glm::vec3 right = glm::normalize(glm::vec3(1.f, 0.f, -1.f)); - batch->sprite(right*float(size)*0.43f+glm::vec3(0, size*0.4f, 0), - glm::vec3(0.f, 1.f, 0.f), - right, - size*0.5f, size*0.6f, - texfaces[0], - glm::vec4(1.0f)); + batch->sprite( + right*float(size)*0.43f+glm::vec3(0, size*0.4f, 0), + glm::vec3(0.f, 1.f, 0.f), + right, + size*0.5f, size*0.6f, + texfaces[0], + glm::vec4(1.0f) + ); batch->flush(); break; } @@ -141,6 +154,5 @@ std::unique_ptr BlocksPreview::build( fbo.unbind(); Window::viewport(0, 0, Window::width, Window::height); - auto newAtlas = std::unique_ptr(builder.build(2)); - return newAtlas; + return builder.build(2); } diff --git a/src/items/Inventories.cpp b/src/items/Inventories.cpp index 07b33706..47441059 100644 --- a/src/items/Inventories.cpp +++ b/src/items/Inventories.cpp @@ -26,7 +26,9 @@ std::shared_ptr Inventories::createVirtual(size_t size) { auto inv = std::make_shared(id, size); store(inv); - return inv; + return std::shared_ptr(inv.get(), [this](Inventory* ptr) { + remove(ptr->getId()); + }); } void Inventories::store(std::shared_ptr inv) { diff --git a/src/window/Camera.cpp b/src/window/Camera.cpp index 98273624..79a31208 100644 --- a/src/window/Camera.cpp +++ b/src/window/Camera.cpp @@ -3,7 +3,7 @@ #include -Camera::Camera(glm::vec3 position, float fov) : fov(fov), position(position), zoom(1.0f), rotation(1.0f) { +Camera::Camera(glm::vec3 position, float fov) : fov(fov), position(position) { updateVectors(); } diff --git a/src/window/Camera.h b/src/window/Camera.h index 90426acd..03e16b0d 100644 --- a/src/window/Camera.h +++ b/src/window/Camera.h @@ -14,8 +14,8 @@ public: glm::vec3 position; - float zoom; - glm::mat4 rotation; + float zoom = 1.0f; + glm::mat4 rotation {1.0f}; bool perspective = true; bool flipped = false; float aspect = 0.0f;