From b4b49ccd83f57187808ee5f2b836e6334a01807d Mon Sep 17 00:00:00 2001 From: GHOST11111100 Date: Sat, 26 Jul 2025 16:19:00 +0300 Subject: [PATCH] added custom caption to items. fixed glyph render. --- src/graphics/core/Font.cpp | 21 +++- src/graphics/ui/GUI.cpp | 2 +- src/graphics/ui/elements/InventoryView.cpp | 131 ++++++++++++--------- 3 files changed, 97 insertions(+), 57 deletions(-) diff --git a/src/graphics/core/Font.cpp b/src/graphics/core/Font.cpp index 68cba17c..19abb9f0 100644 --- a/src/graphics/core/Font.cpp +++ b/src/graphics/core/Font.cpp @@ -57,6 +57,14 @@ static inline void draw_glyph( const FontStyle& style ) { for (int i = 0; i <= style.bold; i++) { + glm::vec4 color; + + if (style.color == glm::vec4(1, 1, 1, 1)) { + color = batch.getColor(); + } else { + color = style.color; + } + batch.sprite( pos.x + (offset.x + i / (right.x/glyphInterval/2.0f)) * right.x, pos.y + offset.y * right.y, @@ -65,7 +73,7 @@ static inline void draw_glyph( -0.15f * style.italic, 16, c, - batch.getColor() * style.color + color ); } } @@ -81,6 +89,15 @@ static inline void draw_glyph( const FontStyle& style ) { for (int i = 0; i <= style.bold; i++) { + glm::vec4 color; + + if (style.color == glm::vec4(1, 1, 1, 1)) { + color = batch.getColor(); + } else { + color = style.color; + } + + batch.sprite( pos + right * (offset.x + i) + up * offset.y, up, right / glyphInterval, @@ -88,7 +105,7 @@ static inline void draw_glyph( 0.5f, 16, c, - batch.getColor() * style.color + color ); } } diff --git a/src/graphics/ui/GUI.cpp b/src/graphics/ui/GUI.cpp index 0cea8a66..ceb2f4a0 100644 --- a/src/graphics/ui/GUI.cpp +++ b/src/graphics/ui/GUI.cpp @@ -50,7 +50,7 @@ GUI::GUI(Engine& engine) tooltip = guiutil::create( *this, "" - "" + "" "" ); store("tooltip", tooltip); diff --git a/src/graphics/ui/elements/InventoryView.cpp b/src/graphics/ui/elements/InventoryView.cpp index b41dce98..cbb1dde6 100644 --- a/src/graphics/ui/elements/InventoryView.cpp +++ b/src/graphics/ui/elements/InventoryView.cpp @@ -1,10 +1,21 @@ #include "InventoryView.hpp" +#include +#include + #include "assets/Assets.hpp" #include "assets/assets_util.hpp" #include "content/Content.hpp" #include "frontend/LevelFrontend.hpp" #include "frontend/locale.hpp" +#include "graphics/core/Atlas.hpp" +#include "graphics/core/Batch2D.hpp" +#include "graphics/core/DrawContext.hpp" +#include "graphics/core/Font.hpp" +#include "graphics/core/Shader.hpp" +#include "graphics/core/Texture.hpp" +#include "graphics/render/BlocksPreview.hpp" +#include "graphics/ui/GUI.hpp" #include "items/Inventories.hpp" #include "items/Inventory.hpp" #include "items/ItemDef.hpp" @@ -15,17 +26,6 @@ #include "voxels/Block.hpp" #include "window/input.hpp" #include "world/Level.hpp" -#include "graphics/core/Atlas.hpp" -#include "graphics/core/Batch2D.hpp" -#include "graphics/core/Font.hpp" -#include "graphics/core/DrawContext.hpp" -#include "graphics/core/Shader.hpp" -#include "graphics/core/Texture.hpp" -#include "graphics/render/BlocksPreview.hpp" -#include "graphics/ui/GUI.hpp" - -#include -#include using namespace gui; @@ -37,21 +37,24 @@ SlotLayout::SlotLayout( slotcallback updateFunc, slotcallback shareFunc, slotcallback rightClick -) : index(index), - position(position), - background(background), - itemSource(itemSource), - updateFunc(std::move(updateFunc)), - shareFunc(std::move(shareFunc)), - rightClick(std::move(rightClick)) {} +) + : index(index), + position(position), + background(background), + itemSource(itemSource), + updateFunc(std::move(updateFunc)), + shareFunc(std::move(shareFunc)), + rightClick(std::move(rightClick)) { +} InventoryBuilder::InventoryBuilder(GUI& gui) : gui(gui) { view = std::make_shared(gui); } void InventoryBuilder::addGrid( - int cols, int count, - glm::vec2 pos, + int cols, + int count, + glm::vec2 pos, glm::vec4 padding, bool addpanel, const SlotLayout& slotLayout @@ -61,9 +64,11 @@ void InventoryBuilder::addGrid( int rows = ceildiv(count, cols); - uint width = cols * (slotSize + interval) - interval + padding.x + padding.z; - uint height = rows * (slotSize + interval) - interval + padding.y + padding.w; - + uint width = + cols * (slotSize + interval) - interval + padding.x + padding.z; + uint height = + rows * (slotSize + interval) - interval + padding.y + padding.w; + glm::vec2 vsize = view->getSize(); if (pos.x + width > vsize.x) { vsize.x = pos.x + width; @@ -85,7 +90,7 @@ void InventoryBuilder::addGrid( if (row * cols + col >= count) { break; } - glm::vec2 position ( + glm::vec2 position( col * (slotSize + interval) + padding.x, row * (slotSize + interval) + padding.y ); @@ -105,11 +110,9 @@ std::shared_ptr InventoryBuilder::build() { return view; } -SlotView::SlotView( - GUI& gui, SlotLayout layout -) : UINode(gui, glm::vec2(InventoryView::SLOT_SIZE)), - layout(std::move(layout)) -{ +SlotView::SlotView(GUI& gui, SlotLayout layout) + : UINode(gui, glm::vec2(InventoryView::SLOT_SIZE)), + layout(std::move(layout)) { setColor(glm::vec4(0, 0, 0, 0.2f)); setTooltipDelay(0.0f); } @@ -120,9 +123,16 @@ void SlotView::refreshTooltip(const ItemStack& stack, const ItemDef& item) { return; } if (itemid) { - tooltip = util::pascal_case( - langs::get(util::str2wstr_utf8(item.caption)) - ); + dv::value* caption = stack.getField("caption"); + if (caption != nullptr) { + tooltip = util::pascal_case( + langs::get(util::str2wstr_utf8(caption->asString())) + ); + } else { + tooltip = util::pascal_case( + langs::get(util::str2wstr_utf8(item.caption)) + ); + } } else { tooltip.clear(); } @@ -148,19 +158,37 @@ void SlotView::drawItemIcon( UVRegion region = previews.get(block.name); batch.rect( - pos.x, pos.y, SLOT_SIZE, SLOT_SIZE, - 0, 0, 0, region, false, true, tint + pos.x, + pos.y, + SLOT_SIZE, + SLOT_SIZE, + 0, + 0, + 0, + region, + false, + true, + tint ); break; } case ItemIconType::SPRITE: { auto textureRegion = util::get_texture_region(assets, item.icon, "blocks:notfound"); - + batch.texture(textureRegion.texture); batch.rect( - pos.x, pos.y, SLOT_SIZE, SLOT_SIZE, - 0, 0, 0, textureRegion.region, false, true, tint + pos.x, + pos.y, + SLOT_SIZE, + SLOT_SIZE, + 0, + 0, + 0, + textureRegion.region, + false, + true, + tint ); break; } @@ -184,7 +212,7 @@ void SlotView::draw(const DrawContext& pctx, const Assets& assets) { glm::vec4 tint(1, 1, 1, isEnabled() ? 1 : 0.5f); glm::vec2 pos = calcPos(); glm::vec4 color = getColor(); - + if (hover || highlighted) { tint *= 1.333f; color = glm::vec4(1, 1, 1, 0.2f); @@ -262,7 +290,7 @@ void SlotView::drawItemInfo( batch.setColor({0, 0, 0, 0.75f}); batch.rect(pos.x - 2, pos.y - 2, 6, SLOT_SIZE + 4); float t = static_cast(uses) / item.uses; - + int height = SLOT_SIZE * t; batch.setColor({(1.0f - t * 0.8f), 0.4f, t * 0.8f + 0.2f, 1.0f}); batch.rect(pos.x, pos.y + SLOT_SIZE - height, 2, height); @@ -317,8 +345,7 @@ void SlotView::performRightClick(ItemStack& stack, ItemStack& grabbed) { } return; } - if (layout.itemSource) - return; + if (layout.itemSource) return; if (grabbed.isEmpty()) { if (!stack.isEmpty() && layout.taking) { grabbed.set(std::move(stack)); @@ -342,15 +369,15 @@ void SlotView::performRightClick(ItemStack& stack, ItemStack& grabbed) { } else { grabbed = ItemStack(stack.getItemId(), count - 1); } - } else if (stack.accepts(grabbed) && stack.getCount() < stackDef.stackSize) { + } else if (stack.accepts(grabbed) && + stack.getCount() < stackDef.stackSize) { stack.setCount(stack.getCount() + 1); grabbed.setCount(grabbed.getCount() - 1); } } void SlotView::clicked(Mousecode button) { - if (bound == nullptr) - return; + if (bound == nullptr) return; auto exchangeSlot = std::dynamic_pointer_cast(gui.get(EXCHANGE_SLOT_NAME)); if (exchangeSlot == nullptr) { @@ -358,7 +385,7 @@ void SlotView::clicked(Mousecode button) { } ItemStack& grabbed = exchangeSlot->getStack(); ItemStack& stack = *bound; - + if (button == Mousecode::BUTTON_1) { performLeftClick(stack, grabbed); } else if (button == Mousecode::BUTTON_2) { @@ -382,9 +409,7 @@ const std::wstring& SlotView::getTooltip() const { } void SlotView::bind( - int64_t inventoryid, - ItemStack& stack, - const Content* content + int64_t inventoryid, ItemStack& stack, const Content* content ) { this->inventoryid = inventoryid; bound = &stack; @@ -403,11 +428,11 @@ InventoryView::InventoryView(GUI& gui) : Container(gui, glm::vec2()) { setColor(glm::vec4(0, 0, 0, 0.0f)); } -InventoryView::~InventoryView() {} - +InventoryView::~InventoryView() { +} std::shared_ptr InventoryView::addSlot(const SlotLayout& layout) { - uint width = InventoryView::SLOT_SIZE + layout.padding; + uint width = InventoryView::SLOT_SIZE + layout.padding; uint height = InventoryView::SLOT_SIZE + layout.padding; auto pos = layout.position; @@ -432,14 +457,12 @@ std::shared_ptr InventoryView::getInventory() const { return inventory; } - size_t InventoryView::getSlotsCount() const { return slots.size(); } void InventoryView::bind( - const std::shared_ptr& inventory, - const Content* content + const std::shared_ptr& inventory, const Content* content ) { this->inventory = inventory; this->content = content;