diff --git a/.gitignore b/.gitignore index 0b2f793d..31cd7e69 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ Debug/voxel_engine /build /world +/worlds .vscode diff --git a/src/engine.cpp b/src/engine.cpp index a730377d..ae35e5c2 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -59,12 +59,15 @@ Engine::Engine(const EngineSettings& settings_) { std::cout << "-- initializing finished" << std::endl; std::cout << "-- loading world" << std::endl; - vec3 playerPosition = vec3(0, 64, 0); - Camera* camera = new Camera(playerPosition, radians(90.0f)); - World* world = new World("world-1", enginefs::get_worlds_folder()/"world", 42, settings); - Player* player = new Player(playerPosition, 4.0f, camera); - setScreen(new LevelScreen(this, world->loadLevel(player, settings))); + //World* world = new World("world-1", enginefs::get_worlds_folder()/"world", 42, settings); + + //vec3 playerPosition = vec3(0, 64, 0); + //Camera* camera = new Camera(playerPosition, radians(90.0f)); + //Player* player = new Player(playerPosition, 4.0f, camera); + //setScreen(new LevelScreen(this, world->loadLevel(player, settings))); + + setScreen(new MenuScreen(this)); } void Engine::updateTimers() { diff --git a/src/frontend/gui/GUI.cpp b/src/frontend/gui/GUI.cpp index fdf90a25..b3011356 100644 --- a/src/frontend/gui/GUI.cpp +++ b/src/frontend/gui/GUI.cpp @@ -3,33 +3,35 @@ #include "panels.h" #include +#include #include "../../assets/Assets.h" #include "../../graphics/Batch2D.h" +#include "../../graphics/Shader.h" #include "../../window/Events.h" #include "../../window/input.h" +#include "../../window/Camera.h" using std::shared_ptr; using namespace gui; GUI::GUI() { container = new Container(vec2(0, 0), vec2(Window::width, Window::height)); + + uicamera = new Camera(vec3(), Window::height); + uicamera->perspective = false; + uicamera->flipped = true; } GUI::~GUI() { + delete uicamera; delete container; } void GUI::act(float delta) { - for (IntervalEvent& event : intervalEvents) { - event.timer += delta; - if (event.timer > event.interval) { - event.callback(); - event.timer = fmod(event.timer, event.interval); - } - } - container->size(vec2(Window::width, Window::height)); + container->act(delta); + int mx = Events::x; int my = Events::y; @@ -77,6 +79,12 @@ void GUI::act(float delta) { } void GUI::draw(Batch2D* batch, Assets* assets) { + uicamera->fov = Window::height; + + Shader* uishader = assets->getShader("ui"); + uishader->use(); + uishader->uniformMatrix("u_projview", uicamera->getProjection()*uicamera->getView()); + batch->begin(); container->draw(batch, assets); } @@ -93,6 +101,6 @@ void GUI::add(shared_ptr panel) { container->add(panel); } -void GUI::interval(float interval, ontimeout callback) { - intervalEvents.push_back({callback, interval, 0.0f}); -} \ No newline at end of file +void GUI::remove(std::shared_ptr panel) { + container->remove(panel); +} diff --git a/src/frontend/gui/GUI.h b/src/frontend/gui/GUI.h index 4ce8f858..b261c630 100644 --- a/src/frontend/gui/GUI.h +++ b/src/frontend/gui/GUI.h @@ -8,6 +8,7 @@ class Batch2D; class Assets; +class Camera; /* Some info about padding and margin. @@ -44,19 +45,12 @@ namespace gui { class UINode; class Container; - typedef std::function ontimeout; - struct IntervalEvent { - ontimeout callback; - float interval; - float timer; - }; - class GUI { Container* container; std::shared_ptr hover = nullptr; std::shared_ptr pressed = nullptr; std::shared_ptr focus = nullptr; - std::vector intervalEvents; + Camera* uicamera; public: GUI(); ~GUI(); @@ -67,8 +61,7 @@ namespace gui { void act(float delta); void draw(Batch2D* batch, Assets* assets); void add(std::shared_ptr panel); - - void interval(float interval, ontimeout callback); + void remove(std::shared_ptr panel); }; } diff --git a/src/frontend/gui/UINode.h b/src/frontend/gui/UINode.h index 7a2aa74c..63bb03d0 100644 --- a/src/frontend/gui/UINode.h +++ b/src/frontend/gui/UINode.h @@ -35,6 +35,7 @@ namespace gui { UINode(glm::vec2 coord, glm::vec2 size); public: virtual ~UINode(); + virtual void act(float delta) {}; virtual void draw(Batch2D* batch, Assets* assets) = 0; virtual void visible(bool flag); diff --git a/src/frontend/gui/panels.cpp b/src/frontend/gui/panels.cpp index e1a30c1a..8cc22511 100644 --- a/src/frontend/gui/panels.cpp +++ b/src/frontend/gui/panels.cpp @@ -29,6 +29,20 @@ shared_ptr Container::getAt(vec2 pos, shared_ptr self) { return UINode::getAt(pos, self); } +void Container::act(float delta) { + for (IntervalEvent& event : intervalEvents) { + event.timer += delta; + if (event.timer > event.interval) { + event.callback(); + event.timer = fmod(event.timer, event.interval); + } + } + for (auto node : nodes) { + if (node->visible()) + node->act(delta); + } +} + void Container::draw(Batch2D* batch, Assets* assets) { vec2 coord = calcCoord(); vec2 size = this->size(); @@ -50,6 +64,18 @@ void Container::add(shared_ptr node) { refresh(); } +void Container::remove(shared_ptr selected) { + selected->setParent(nullptr); + nodes.erase(std::remove_if(nodes.begin(), nodes.end(), [selected](const shared_ptr node) { + return node == selected; + }), nodes.end()); + refresh(); +} + +void Container::listenInterval(float interval, ontimeout callback) { + intervalEvents.push_back({callback, interval, 0.0f}); +} + Panel::Panel(vec2 size, glm::vec4 padding, float interval, bool resizing) : Container(vec2(), size), padding(padding), interval(interval), resizing_(resizing) { color_ = vec4(0.0f, 0.0f, 0.0f, 0.75f); diff --git a/src/frontend/gui/panels.h b/src/frontend/gui/panels.h index f7ec7334..8bc20aea 100644 --- a/src/frontend/gui/panels.h +++ b/src/frontend/gui/panels.h @@ -10,18 +10,29 @@ class Batch2D; class Assets; namespace gui { + typedef std::function ontimeout; + struct IntervalEvent { + ontimeout callback; + float interval; + float timer; + }; + enum class Orientation { vertical, horizontal }; class Container : public UINode { protected: std::vector> nodes; + std::vector intervalEvents; public: Container(glm::vec2 coord, glm::vec2 size); + virtual void act(float delta) override; virtual void drawBackground(Batch2D* batch, Assets* assets) {}; - virtual void draw(Batch2D* batch, Assets* assets); + virtual void draw(Batch2D* batch, Assets* assets) override; virtual std::shared_ptr getAt(glm::vec2 pos, std::shared_ptr self) override; virtual void add(std::shared_ptr node); + virtual void remove(std::shared_ptr node); + void listenInterval(float interval, ontimeout callback); }; class Panel : public Container { diff --git a/src/frontend/hud.cpp b/src/frontend/hud.cpp index 1f7b0d13..de1ce563 100644 --- a/src/frontend/hud.cpp +++ b/src/frontend/hud.cpp @@ -28,6 +28,8 @@ #include "gui/panels.h" #include "gui/UINode.h" #include "gui/GUI.h" +#include "screens.h" +#include "../engine.h" using std::wstring; using std::shared_ptr; @@ -42,18 +44,18 @@ inline Label* create_label(gui::wstringsupplier supplier) { return label; } -HudRenderer::HudRenderer(GUI* gui, Level* level, Assets* assets) : level(level), assets(assets), guiController(gui) { +HudRenderer::HudRenderer(Engine* engine, Level* level) : level(level), assets(engine->getAssets()), guiController(engine->getGUI()) { batch = new Batch2D(1024); uicamera = new Camera(vec3(), Window::height); uicamera->perspective = false; uicamera->flipped = true; - gui->interval(1.0f, [this]() { + Panel* panel = new Panel(vec2(200, 200), vec4(5.0f), 1.0f); + panel->listenInterval(1.0f, [this]() { fpsString = std::to_wstring(fpsMax)+L" / "+std::to_wstring(fpsMin); fpsMin = fps; fpsMax = fps; }); - Panel* panel = new Panel(vec2(200, 200), vec4(5.0f), 1.0f); panel->setCoord(vec2(10, 10)); panel->add(shared_ptr