diff --git a/res/layouts/inventory.xml b/res/layouts/inventory.xml index c33d57d6..416778b6 100644 --- a/res/layouts/inventory.xml +++ b/res/layouts/inventory.xml @@ -1,3 +1,26 @@ - + + + + + + + + + + + 4321.40 + + + + 120.0 + + + + -424.10 + + + + + diff --git a/res/layouts/inventory.xml.lua b/res/layouts/inventory.xml.lua index 532b9ee5..2386812c 100644 --- a/res/layouts/inventory.xml.lua +++ b/res/layouts/inventory.xml.lua @@ -1,11 +1,15 @@ -function on_open(inv) - print("OPEN", inv) +function on_open(invid) + print("OPEN", invid) end -function on_close(inv) - print("CLOSE", inv) +function on_close(invid) + print("CLOSE", invid) end function inventory_share_func(invid, slotid) inventory.set(invid, slotid, 0, 0) end + +function time_change(x) + world.set_day_time(x) +end diff --git a/res/modules/document.lua b/res/modules/document.lua new file mode 100644 index 00000000..e69de29b diff --git a/res/scripts/stdlib.lua b/res/scripts/stdlib.lua index 09d28f55..b8dcfb47 100644 --- a/res/scripts/stdlib.lua +++ b/res/scripts/stdlib.lua @@ -91,3 +91,46 @@ end function pack.is_installed(packid) return file.isfile(packid..":package.json") end + +vec2_mt = {} +function vec2_mt.__tostring(self) + return "vec2("..self[1]..", "..self[2]..")" +end + +vec3_mt = {} +function vec3_mt.__tostring(self) + return "vec3("..self[1]..", "..self[2]..", "..self[3]..")" +end + +vec4_mt = {} +function vec4_mt.__tostring(self) + return "vec4("..self[1]..", "..self[2]..", "..self[3]..", "..self[4]..")" +end + +color_mt = {} +function color_mt.__tostring(self) + return "rgba("..self[1]..", "..self[2]..", "..self[3]..", "..self[4]..")" +end + +-- class designed for simple UI-nodes access via properties syntax +local Element = {} +function Element.new(docname, name) + return setmetatable({docname=docname, name=name}, { + __index=function(self, k) + return gui.getattr(self.docname, self.name, k) + end, + __newindex=function(self, k, v) + gui.setattr(self.docname, self.name, k, v) + end + }) +end + +-- the engine automatically creates an instance for every ui document (layout) +Document = {} +function Document.new(docname) + return setmetatable({name=docname}, { + __index=function(self, k) + return Element.new(self.name, k) + end + }) +end diff --git a/res/textures/gui/crosshair.png b/res/textures/gui/crosshair.png new file mode 100644 index 00000000..7010266b Binary files /dev/null and b/res/textures/gui/crosshair.png differ diff --git a/src/assets/AssetsLoader.cpp b/src/assets/AssetsLoader.cpp index c03ebf4b..2298904a 100644 --- a/src/assets/AssetsLoader.cpp +++ b/src/assets/AssetsLoader.cpp @@ -76,6 +76,7 @@ void AssetsLoader::addDefaults(AssetsLoader& loader, const Content* content) { loader.add(ASSET_SHADER, SHADERS_FOLDER"/skybox_gen", "skybox_gen"); loader.add(ASSET_TEXTURE, TEXTURES_FOLDER"/misc/moon.png", "misc/moon"); loader.add(ASSET_TEXTURE, TEXTURES_FOLDER"/misc/sun.png", "misc/sun"); + loader.add(ASSET_TEXTURE, TEXTURES_FOLDER"/gui/crosshair.png", "gui/crosshair"); addLayouts(0, "core", loader.getPaths()->getMainRoot()/fs::path("layouts"), loader); for (auto& pack : content->getPacks()) { diff --git a/src/delegates.h b/src/delegates.h index 61360464..7698c59a 100644 --- a/src/delegates.h +++ b/src/delegates.h @@ -8,5 +8,10 @@ using runnable = std::function; using stringconsumer = std::function; using wstringsupplier = std::function; using wstringconsumer = std::function; +using doublesupplier = std::function; +using doubleconsumer = std::function; +using boolsupplier = std::function; +using boolconsumer = std::function; +using wstringchecker = std::function; #endif // DELEGATES_H_ diff --git a/src/engine.cpp b/src/engine.cpp index d1e85eeb..80d9114a 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -208,6 +208,10 @@ void Engine::loadAllPacks() { ContentPack::scan(paths, contentPacks); } +double Engine::getDelta() const { + return delta; +} + void Engine::setScreen(std::shared_ptr screen) { this->screen = screen; } diff --git a/src/engine.h b/src/engine.h index 1532e84b..90ffc8b5 100644 --- a/src/engine.h +++ b/src/engine.h @@ -63,6 +63,7 @@ public: void loadContent(); void loadWorldContent(const fs::path& folder); void loadAllPacks(); + double getDelta() const; std::shared_ptr getScreen(); }; diff --git a/src/frontend/UiDocument.cpp b/src/frontend/UiDocument.cpp index 9df8f123..301c1f7c 100644 --- a/src/frontend/UiDocument.cpp +++ b/src/frontend/UiDocument.cpp @@ -30,6 +30,14 @@ const std::shared_ptr UiDocument::getRoot() const { return root; } +const std::shared_ptr UiDocument::get(const std::string& id) const { + auto found = map.find(id); + if (found == map.end()) { + return nullptr; + } + return found->second; +} + const uidocscript& UiDocument::getScript() const { return script; } diff --git a/src/frontend/UiDocument.h b/src/frontend/UiDocument.h index 7668a414..8dad5cb0 100644 --- a/src/frontend/UiDocument.h +++ b/src/frontend/UiDocument.h @@ -43,6 +43,7 @@ public: const std::string& getId() const; const uinodes_map& getMap() const; const std::shared_ptr getRoot() const; + const std::shared_ptr get(const std::string& id) const; const uidocscript& getScript() const; int getEnvironment() const; /* Collect map of all uinodes having identifiers */ diff --git a/src/frontend/gui/UINode.cpp b/src/frontend/gui/UINode.cpp index 95e8e4b7..1a726cc8 100644 --- a/src/frontend/gui/UINode.cpp +++ b/src/frontend/gui/UINode.cpp @@ -110,6 +110,10 @@ void UINode::setCoord(glm::vec2 coord) { this->coord = coord; } +glm::vec2 UINode::getCoord() const { + return coord; +} + glm::vec2 UINode::getSize() const { return size; } diff --git a/src/frontend/gui/UINode.h b/src/frontend/gui/UINode.h index 1e195932..45d6ca8b 100644 --- a/src/frontend/gui/UINode.h +++ b/src/frontend/gui/UINode.h @@ -112,6 +112,7 @@ namespace gui { /* Calculate screen position of the element */ virtual glm::vec2 calcCoord() const; virtual void setCoord(glm::vec2 coord); + glm::vec2 getCoord() const; virtual glm::vec2 getSize() const; virtual void setSize(glm::vec2 size); virtual void refresh() {}; diff --git a/src/frontend/gui/controls.cpp b/src/frontend/gui/controls.cpp index d79a2cd8..e2dc7003 100644 --- a/src/frontend/gui/controls.cpp +++ b/src/frontend/gui/controls.cpp @@ -10,24 +10,20 @@ #include "../../util/stringutil.h" #include "GUI.h" -using glm::vec2; -using glm::vec3; -using glm::vec4; - using namespace gui; Label::Label(std::string text, std::string fontName) - : UINode(vec2(), vec2(text.length() * 8, 15)), + : UINode(glm::vec2(), glm::vec2(text.length() * 8, 15)), text(util::str2wstr_utf8(text)), - fontName_(fontName) { + fontName(fontName) { setInteractive(false); } Label::Label(std::wstring text, std::string fontName) - : UINode(vec2(), vec2(text.length() * 8, 15)), + : UINode(glm::vec2(), glm::vec2(text.length() * 8, 15)), text(text), - fontName_(fontName) { + fontName(fontName) { setInteractive(false); } @@ -46,14 +42,14 @@ void Label::draw(const GfxContext* pctx, Assets* assets) { auto batch = pctx->getBatch2D(); batch->color = getColor(); - Font* font = assets->getFont(fontName_); - vec2 size = getSize(); - vec2 newsize = vec2( + Font* font = assets->getFont(fontName); + glm::vec2 size = getSize(); + glm::vec2 newsize ( font->calcWidth(text), font->getLineHeight()+font->getYOffset() ); - vec2 coord = calcCoord(); + glm::vec2 coord = calcCoord(); switch (align) { case Align::left: break; @@ -74,13 +70,13 @@ Label* Label::textSupplier(wstringsupplier supplier) { } // ================================= Image ==================================== -Image::Image(std::string texture, vec2 size) : UINode(vec2(), size), texture(texture) { +Image::Image(std::string texture, glm::vec2 size) : UINode(glm::vec2(), size), texture(texture) { setInteractive(false); } void Image::draw(const GfxContext* pctx, Assets* assets) { - vec2 coord = calcCoord(); - vec4 color = getColor(); + glm::vec2 coord = calcCoord(); + glm::vec4 color = getColor(); auto batch = pctx->getBatch2D(); batch->texture(assets->getTexture(texture)); batch->color = color; @@ -90,10 +86,11 @@ void Image::draw(const GfxContext* pctx, Assets* assets) { // ================================= Button =================================== Button::Button(std::shared_ptr content, glm::vec4 padding) - : Panel(vec2(), padding, 0) { - vec4 margin = getMargin(); - setSize(content->getSize()+vec2(padding[0]+padding[2]+margin[0]+margin[2], - padding[1]+padding[3]+margin[1]+margin[3])); + : Panel(glm::vec2(), padding, 0) { + glm::vec4 margin = getMargin(); + setSize(content->getSize()+ + glm::vec2(padding[0]+padding[2]+margin[0]+margin[2], + padding[1]+padding[3]+margin[1]+margin[3])); add(content); setScrollable(false); setHoverColor(glm::vec4(0.05f, 0.1f, 0.15f, 0.75f)); @@ -102,13 +99,13 @@ Button::Button(std::shared_ptr content, glm::vec4 padding) Button::Button( std::wstring text, - vec4 padding, + glm::vec4 padding, onaction action, - vec2 size + glm::vec2 size ) : Panel(size, padding, 0) { if (size.y < 0.0f) { - size = vec2( + size = glm::vec2( glm::max(padding.x + padding.z + text.length()*8, size.x), glm::max(padding.y + padding.w + 16, size.y) ); @@ -122,7 +119,7 @@ Button::Button( label = std::make_shared