From 61ca91b5256b77729782444af0014dc063e2d8ec Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 22 Apr 2024 20:32:28 +0300 Subject: [PATCH] frontend/screens deleted --- src/engine.cpp | 3 +- src/frontend/hud.cpp | 1 - src/frontend/screens.h | 63 ---- .../{screens.cpp => screens/LevelScreen.cpp} | 323 +++++++----------- src/frontend/screens/LevelScreen.hpp | 37 ++ src/frontend/screens/MenuScreen.cpp | 48 +++ src/frontend/screens/MenuScreen.hpp | 22 ++ src/frontend/screens/Screen.cpp | 10 + src/frontend/screens/Screen.hpp | 22 ++ src/logic/EngineController.cpp | 3 +- src/logic/scripting/lua/libcore.cpp | 2 +- 11 files changed, 272 insertions(+), 262 deletions(-) delete mode 100644 src/frontend/screens.h rename src/frontend/{screens.cpp => screens/LevelScreen.cpp} (58%) create mode 100644 src/frontend/screens/LevelScreen.hpp create mode 100644 src/frontend/screens/MenuScreen.cpp create mode 100644 src/frontend/screens/MenuScreen.hpp create mode 100644 src/frontend/screens/Screen.cpp create mode 100644 src/frontend/screens/Screen.hpp diff --git a/src/engine.cpp b/src/engine.cpp index 54d62ec5..53e1a6a8 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -12,7 +12,8 @@ #include "files/files.h" #include "frontend/locale/langs.h" #include "frontend/menu.hpp" -#include "frontend/screens.h" +#include "frontend/screens/Screen.hpp" +#include "frontend/screens/MenuScreen.hpp" #include "graphics/core/Batch2D.h" #include "graphics/core/GfxContext.h" #include "graphics/core/ImageData.h" diff --git a/src/frontend/hud.cpp b/src/frontend/hud.cpp index 446decd9..bfbd02d1 100644 --- a/src/frontend/hud.cpp +++ b/src/frontend/hud.cpp @@ -43,7 +43,6 @@ #include "InventoryView.h" #include "LevelFrontend.h" #include "menu.hpp" -#include "screens.h" #include "UiDocument.h" #include diff --git a/src/frontend/screens.h b/src/frontend/screens.h deleted file mode 100644 index 98be2ec7..00000000 --- a/src/frontend/screens.h +++ /dev/null @@ -1,63 +0,0 @@ -#ifndef FRONTEND_SCREENS_H_ -#define FRONTEND_SCREENS_H_ - -#include -#include "../settings.h" -#include "../util/ObjectsKeeper.hpp" - -class Assets; -class Level; -class WorldRenderer; -class Hud; -class Engine; -class Camera; -class Batch2D; -class LevelFrontend; -class LevelController; -class TextureAnimator; - -/// @brief Screen is a mainloop state -class Screen : public util::ObjectsKeeper { -protected: - Engine* engine; - std::unique_ptr batch; -public: - Screen(Engine* engine); - virtual ~Screen(); - virtual void update(float delta) = 0; - virtual void draw(float delta) = 0; - virtual void onEngineShutdown() {}; -}; - -class MenuScreen : public Screen { - std::unique_ptr uicamera; -public: - MenuScreen(Engine* engine); - ~MenuScreen(); - - void update(float delta) override; - void draw(float delta) override; -}; - -class LevelScreen : public Screen { - std::unique_ptr frontend; - std::unique_ptr hud; - std::unique_ptr controller; - std::unique_ptr worldRenderer; - std::unique_ptr animator; - - bool hudVisible = true; - void updateHotkeys(); -public: - LevelScreen(Engine* engine, Level* level); - ~LevelScreen(); - - void update(float delta) override; - void draw(float delta) override; - - void onEngineShutdown() override; - - LevelController* getLevelController() const; -}; - -#endif // FRONTEND_SCREENS_H_ diff --git a/src/frontend/screens.cpp b/src/frontend/screens/LevelScreen.cpp similarity index 58% rename from src/frontend/screens.cpp rename to src/frontend/screens/LevelScreen.cpp index 63877fb1..82e0f912 100644 --- a/src/frontend/screens.cpp +++ b/src/frontend/screens/LevelScreen.cpp @@ -1,195 +1,128 @@ -#include "screens.h" - -#include "../assets/Assets.h" -#include "../audio/audio.h" -#include "../content/Content.h" -#include "../core_defs.h" -#include "../engine.h" -#include "../graphics/core/Batch2D.h" -#include "../graphics/core/GfxContext.h" -#include "../graphics/core/Shader.h" -#include "../graphics/core/TextureAnimation.h" -#include "../graphics/render/WorldRenderer.h" -#include "../graphics/ui/elements/Menu.hpp" -#include "../graphics/ui/GUI.h" -#include "../logic/ChunksController.h" -#include "../logic/LevelController.h" -#include "../logic/scripting/scripting_hud.h" -#include "../logic/scripting/scripting.h" -#include "../objects/Player.h" -#include "../physics/Hitbox.h" -#include "../util/stringutil.h" -#include "../voxels/Block.h" -#include "../voxels/Chunk.h" -#include "../voxels/Chunks.h" -#include "../window/Camera.h" -#include "../window/Events.h" -#include "../window/input.h" -#include "../world/Level.h" -#include "../world/World.h" - -#include "ContentGfxCache.h" -#include "hud.h" -#include "LevelFrontend.h" -#include "menu.hpp" - -#include -#include -#include -#include -#include -#include -#include - -Screen::Screen(Engine* engine) : engine(engine), batch(new Batch2D(1024)) { -} - -Screen::~Screen() { -} - -MenuScreen::MenuScreen(Engine* engine_) : Screen(engine_) { - auto menu = engine->getGUI()->getMenu(); - menu->reset(); - menu->setPage("main"); - - uicamera.reset(new Camera(glm::vec3(), Window::height)); - uicamera->perspective = false; - uicamera->flipped = true; -} - -MenuScreen::~MenuScreen() { -} - -void MenuScreen::update(float delta) { -} - -void MenuScreen::draw(float delta) { - Window::clear(); - Window::setBgColor(glm::vec3(0.2f)); - - uicamera->setFov(Window::height); - Shader* uishader = engine->getAssets()->getShader("ui"); - uishader->use(); - uishader->uniformMatrix("u_projview", uicamera->getProjView()); - - uint width = Window::width; - uint height = Window::height; - - batch->begin(); - batch->texture(engine->getAssets()->getTexture("gui/menubg")); - batch->rect( - 0, 0, - width, height, 0, 0, 0, - UVRegion(0, 0, width/64, height/64), - false, false, glm::vec4(1.0f) - ); - batch->flush(); -} - -LevelScreen::LevelScreen(Engine* engine, Level* level) : Screen(engine) { - auto& settings = engine->getSettings(); - auto assets = engine->getAssets(); - auto menu = engine->getGUI()->getMenu(); - menu->reset(); - - controller = std::make_unique(settings, level); - frontend = std::make_unique(controller.get(), assets); - - worldRenderer = std::make_unique(engine, frontend.get(), controller->getPlayer()); - hud = std::make_unique(engine, frontend.get(), controller->getPlayer()); - - keepAlive(settings.graphics.backlight.observe([=](bool flag) { - controller->getLevel()->chunks->saveAndClear(); - })); - keepAlive(settings.camera.fov.observe([=](double value) { - controller->getPlayer()->camera->setFov(glm::radians(value)); - })); - - animator = std::make_unique(); - animator->addAnimations(assets->getAnimations()); - - auto content = level->content; - for (auto& entry : content->getPacks()) { - auto pack = entry.second.get(); - const ContentPack& info = pack->getInfo(); - fs::path scriptFile = info.folder/fs::path("scripts/hud.lua"); - if (fs::is_regular_file(scriptFile)) { - scripting::load_hud_script(pack->getEnvironment(), info.id, scriptFile); - } - } - scripting::on_frontend_init(hud.get()); -} - -LevelScreen::~LevelScreen() { - scripting::on_frontend_close(); - controller->onWorldQuit(); - engine->getPaths()->setWorldFolder(fs::path()); -} - -void LevelScreen::updateHotkeys() { - auto& settings = engine->getSettings(); - if (Events::jpressed(keycode::O)) { - settings.graphics.frustumCulling = !settings.graphics.frustumCulling; - } - if (Events::jpressed(keycode::F1)) { - hudVisible = !hudVisible; - } - if (Events::jpressed(keycode::F3)) { - controller->getPlayer()->debug = !controller->getPlayer()->debug; - } - if (Events::jpressed(keycode::F5)) { - controller->getLevel()->chunks->saveAndClear(); - } -} - -void LevelScreen::update(float delta) { - gui::GUI* gui = engine->getGUI(); - - bool inputLocked = hud->isPause() || - hud->isInventoryOpen() || - gui->isFocusCaught(); - if (!gui->isFocusCaught()) { - updateHotkeys(); - } - - auto player = controller->getPlayer(); - auto camera = player->camera; - - bool paused = hud->isPause(); - audio::get_channel("regular")->setPaused(paused); - audio::get_channel("ambient")->setPaused(paused); - audio::set_listener( - camera->position-camera->dir, - player->hitbox->velocity, - camera->dir, - camera->up - ); - - if (!hud->isPause()) { - controller->getLevel()->getWorld()->updateTimers(delta); - animator->update(delta); - } - controller->update(delta, !inputLocked, hud->isPause()); - hud->update(hudVisible); -} - -void LevelScreen::draw(float delta) { - auto camera = controller->getPlayer()->currentCamera; - - Viewport viewport(Window::width, Window::height); - GfxContext ctx(nullptr, viewport, batch.get()); - - worldRenderer->draw(ctx, camera.get(), hudVisible); - - if (hudVisible) { - hud->draw(ctx); - } -} - -void LevelScreen::onEngineShutdown() { - controller->saveWorld(); -} - -LevelController* LevelScreen::getLevelController() const { - return controller.get(); -} +#include "LevelScreen.hpp" + +#include "../hud.h" +#include "../LevelFrontend.h" +#include "../../audio/audio.h" +#include "../../graphics/core/GfxContext.h" +#include "../../graphics/core/Viewport.h" +#include "../../graphics/ui/GUI.h" +#include "../../graphics/ui/elements/Menu.hpp" +#include "../../graphics/render/WorldRenderer.h" +#include "../../logic/LevelController.h" +#include "../../logic/scripting/scripting_hud.h" +#include "../../physics/Hitbox.h" +#include "../../voxels/Chunks.h" +#include "../../world/Level.h" +#include "../../world/World.h" +#include "../../window/Camera.h" +#include "../../window/Events.h" +#include "../../engine.h" + +LevelScreen::LevelScreen(Engine* engine, Level* level) : Screen(engine) { + auto& settings = engine->getSettings(); + auto assets = engine->getAssets(); + auto menu = engine->getGUI()->getMenu(); + menu->reset(); + + controller = std::make_unique(settings, level); + frontend = std::make_unique(controller.get(), assets); + + worldRenderer = std::make_unique(engine, frontend.get(), controller->getPlayer()); + hud = std::make_unique(engine, frontend.get(), controller->getPlayer()); + + keepAlive(settings.graphics.backlight.observe([=](bool flag) { + controller->getLevel()->chunks->saveAndClear(); + })); + keepAlive(settings.camera.fov.observe([=](double value) { + controller->getPlayer()->camera->setFov(glm::radians(value)); + })); + + animator = std::make_unique(); + animator->addAnimations(assets->getAnimations()); + + auto content = level->content; + for (auto& entry : content->getPacks()) { + auto pack = entry.second.get(); + const ContentPack& info = pack->getInfo(); + fs::path scriptFile = info.folder/fs::path("scripts/hud.lua"); + if (fs::is_regular_file(scriptFile)) { + scripting::load_hud_script(pack->getEnvironment(), info.id, scriptFile); + } + } + scripting::on_frontend_init(hud.get()); +} + +LevelScreen::~LevelScreen() { + scripting::on_frontend_close(); + controller->onWorldQuit(); + engine->getPaths()->setWorldFolder(fs::path()); +} + +void LevelScreen::updateHotkeys() { + auto& settings = engine->getSettings(); + if (Events::jpressed(keycode::O)) { + settings.graphics.frustumCulling = !settings.graphics.frustumCulling; + } + if (Events::jpressed(keycode::F1)) { + hudVisible = !hudVisible; + } + if (Events::jpressed(keycode::F3)) { + controller->getPlayer()->debug = !controller->getPlayer()->debug; + } + if (Events::jpressed(keycode::F5)) { + controller->getLevel()->chunks->saveAndClear(); + } +} + +void LevelScreen::update(float delta) { + gui::GUI* gui = engine->getGUI(); + + bool inputLocked = hud->isPause() || + hud->isInventoryOpen() || + gui->isFocusCaught(); + if (!gui->isFocusCaught()) { + updateHotkeys(); + } + + auto player = controller->getPlayer(); + auto camera = player->camera; + + bool paused = hud->isPause(); + audio::get_channel("regular")->setPaused(paused); + audio::get_channel("ambient")->setPaused(paused); + audio::set_listener( + camera->position-camera->dir, + player->hitbox->velocity, + camera->dir, + camera->up + ); + + if (!hud->isPause()) { + controller->getLevel()->getWorld()->updateTimers(delta); + animator->update(delta); + } + controller->update(delta, !inputLocked, hud->isPause()); + hud->update(hudVisible); +} + +void LevelScreen::draw(float delta) { + auto camera = controller->getPlayer()->currentCamera; + + Viewport viewport(Window::width, Window::height); + GfxContext ctx(nullptr, viewport, batch.get()); + + worldRenderer->draw(ctx, camera.get(), hudVisible); + + if (hudVisible) { + hud->draw(ctx); + } +} + +void LevelScreen::onEngineShutdown() { + controller->saveWorld(); +} + +LevelController* LevelScreen::getLevelController() const { + return controller.get(); +} + diff --git a/src/frontend/screens/LevelScreen.hpp b/src/frontend/screens/LevelScreen.hpp new file mode 100644 index 00000000..93c1e1b4 --- /dev/null +++ b/src/frontend/screens/LevelScreen.hpp @@ -0,0 +1,37 @@ +#ifndef FRONTEND_SCREENS_LEVEL_SCREEN_HPP_ +#define FRONTEND_SCREENS_LEVEL_SCREEN_HPP_ + +#include "Screen.hpp" + +#include + +class Engine; +class LevelFrontend; +class Hud; +class LevelController; +class WorldRenderer; +class TextureAnimator; +class Level; + +class LevelScreen : public Screen { + std::unique_ptr frontend; + std::unique_ptr hud; + std::unique_ptr controller; + std::unique_ptr worldRenderer; + std::unique_ptr animator; + + bool hudVisible = true; + void updateHotkeys(); +public: + LevelScreen(Engine* engine, Level* level); + ~LevelScreen(); + + void update(float delta) override; + void draw(float delta) override; + + void onEngineShutdown() override; + + LevelController* getLevelController() const; +}; + +#endif // FRONTEND_SCREENS_LEVEL_SCREEN_HPP_ diff --git a/src/frontend/screens/MenuScreen.cpp b/src/frontend/screens/MenuScreen.cpp new file mode 100644 index 00000000..26242e14 --- /dev/null +++ b/src/frontend/screens/MenuScreen.cpp @@ -0,0 +1,48 @@ +#include "MenuScreen.hpp" + +#include "../../graphics/ui/GUI.h" +#include "../../graphics/ui/elements/Menu.hpp" +#include "../../graphics/core/Batch2D.h" +#include "../../graphics/core/Shader.h" +#include "../../window/Window.h" +#include "../../window/Camera.h" +#include "../../engine.h" + +MenuScreen::MenuScreen(Engine* engine_) : Screen(engine_) { + auto menu = engine->getGUI()->getMenu(); + menu->reset(); + menu->setPage("main"); + + uicamera.reset(new Camera(glm::vec3(), Window::height)); + uicamera->perspective = false; + uicamera->flipped = true; +} + +MenuScreen::~MenuScreen() { +} + +void MenuScreen::update(float delta) { +} + +void MenuScreen::draw(float delta) { + Window::clear(); + Window::setBgColor(glm::vec3(0.2f)); + + uicamera->setFov(Window::height); + Shader* uishader = engine->getAssets()->getShader("ui"); + uishader->use(); + uishader->uniformMatrix("u_projview", uicamera->getProjView()); + + uint width = Window::width; + uint height = Window::height; + + batch->begin(); + batch->texture(engine->getAssets()->getTexture("gui/menubg")); + batch->rect( + 0, 0, + width, height, 0, 0, 0, + UVRegion(0, 0, width/64, height/64), + false, false, glm::vec4(1.0f) + ); + batch->flush(); +} diff --git a/src/frontend/screens/MenuScreen.hpp b/src/frontend/screens/MenuScreen.hpp new file mode 100644 index 00000000..b8e097ba --- /dev/null +++ b/src/frontend/screens/MenuScreen.hpp @@ -0,0 +1,22 @@ +#ifndef FRONTEND_SCREENS_MENU_SCREEN_HPP_ +#define FRONTEND_SCREENS_MENU_SCREEN_HPP_ + +#include "Screen.hpp" + +#include + +class Camera; +class Engine; + +class MenuScreen : public Screen { + std::unique_ptr uicamera; +public: + MenuScreen(Engine* engine); + ~MenuScreen(); + + void update(float delta) override; + void draw(float delta) override; +}; + + +#endif // FRONTEND_SCREENS_MENU_SCREEN_HPP_ diff --git a/src/frontend/screens/Screen.cpp b/src/frontend/screens/Screen.cpp new file mode 100644 index 00000000..e09d0f10 --- /dev/null +++ b/src/frontend/screens/Screen.cpp @@ -0,0 +1,10 @@ +#include "Screen.hpp" + +#include "../../graphics/core/Batch2D.h" +#include "../../engine.h" + +Screen::Screen(Engine* engine) : engine(engine), batch(new Batch2D(1024)) { +} + +Screen::~Screen() { +} diff --git a/src/frontend/screens/Screen.hpp b/src/frontend/screens/Screen.hpp new file mode 100644 index 00000000..6b283165 --- /dev/null +++ b/src/frontend/screens/Screen.hpp @@ -0,0 +1,22 @@ +#ifndef FRONTEND_SCREENS_SCREEN_HPP_ +#define FRONTEND_SCREENS_SCREEN_HPP_ + +#include "../../util/ObjectsKeeper.hpp" + +class Engine; +class Batch2D; + +/// @brief Screen is a mainloop state +class Screen : public util::ObjectsKeeper { +protected: + Engine* engine; + std::unique_ptr batch; +public: + Screen(Engine* engine); + virtual ~Screen(); + virtual void update(float delta) = 0; + virtual void draw(float delta) = 0; + virtual void onEngineShutdown() {}; +}; + +#endif // FRONTEND_SCREENS_SCREEN_HPP_ diff --git a/src/logic/EngineController.cpp b/src/logic/EngineController.cpp index 5928b537..277305ea 100644 --- a/src/logic/EngineController.cpp +++ b/src/logic/EngineController.cpp @@ -6,7 +6,8 @@ #include "../files/WorldFiles.h" #include "../files/WorldConverter.h" #include "../frontend/locale/langs.h" -#include "../frontend/screens.h" +#include "../frontend/screens/MenuScreen.hpp" +#include "../frontend/screens/LevelScreen.hpp" #include "../frontend/menu.hpp" #include "../graphics/ui/elements/Label.hpp" #include "../graphics/ui/elements/Button.hpp" diff --git a/src/logic/scripting/lua/libcore.cpp b/src/logic/scripting/lua/libcore.cpp index 356b577a..3b5c198f 100644 --- a/src/logic/scripting/lua/libcore.cpp +++ b/src/logic/scripting/lua/libcore.cpp @@ -4,7 +4,7 @@ #include "../../../engine.h" #include "../../../files/engine_paths.h" #include "../../../frontend/menu.hpp" -#include "../../../frontend/screens.h" +#include "../../../frontend/screens/MenuScreen.hpp" #include "../../../logic/LevelController.h" #include "../../../logic/EngineController.hpp" #include "../../../window/Events.h"