Added gui_util
This commit is contained in:
parent
e3f7f7218f
commit
2055cff0be
@ -2,13 +2,13 @@
|
||||
|
||||
#include <glm/ext.hpp>
|
||||
|
||||
#include "../graphics/Viewport.h"
|
||||
#include "../graphics/Shader.h"
|
||||
#include "../graphics/Texture.h"
|
||||
#include "../graphics/Atlas.h"
|
||||
#include "../graphics/Batch3D.h"
|
||||
#include "../window/Camera.h"
|
||||
#include "../voxels/Block.h"
|
||||
#include "../window/Window.h"
|
||||
#include "ContentGfxCache.h"
|
||||
|
||||
using glm::vec4;
|
||||
@ -25,13 +25,12 @@ BlocksPreview::~BlocksPreview() {
|
||||
delete batch;
|
||||
}
|
||||
|
||||
void BlocksPreview::begin() {
|
||||
void BlocksPreview::begin(const Viewport* viewport) {
|
||||
this->viewport = viewport;
|
||||
shader->use();
|
||||
shader->uniformMatrix("u_projview",
|
||||
glm::ortho(0.0f,
|
||||
float(Window::width),
|
||||
0.0f,
|
||||
float(Window::height),
|
||||
glm::ortho(0.0f, float(viewport->getWidth()),
|
||||
0.0f, float(viewport->getHeight()),
|
||||
-1000.0f, 1000.0f) *
|
||||
glm::lookAt(vec3(2, 2, 2), vec3(0.0f), vec3(0, 1, 0)));
|
||||
atlas->getTexture()->bind();
|
||||
@ -39,10 +38,13 @@ void BlocksPreview::begin() {
|
||||
|
||||
/* Draw one block preview at given screen position */
|
||||
void BlocksPreview::draw(const Block* def, int x, int y, int size, vec4 tint) {
|
||||
y = Window::height - y - 1;
|
||||
uint width = viewport->getWidth();
|
||||
uint height = viewport->getHeight();
|
||||
|
||||
y = height - y - 1;
|
||||
x += 2;
|
||||
y -= 35;
|
||||
shader->uniformMatrix("u_apply", glm::translate(glm::mat4(1.0f), vec3(x/float(Window::width) * 2, y/float(Window::height) * 2, 0.0f)));
|
||||
shader->uniformMatrix("u_apply", glm::translate(glm::mat4(1.0f), vec3(x/float(width) * 2, y/float(height) * 2, 0.0f)));
|
||||
blockid_t id = def->rt.id;
|
||||
const UVRegion texfaces[6]{ cache->getRegion(id, 0), cache->getRegion(id, 1),
|
||||
cache->getRegion(id, 2), cache->getRegion(id, 3),
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
#include "../typedefs.h"
|
||||
#include <glm/glm.hpp>
|
||||
|
||||
class Viewport;
|
||||
class Shader;
|
||||
class Atlas;
|
||||
class Batch3D;
|
||||
@ -15,11 +16,12 @@ class BlocksPreview {
|
||||
Atlas* atlas;
|
||||
Batch3D* batch;
|
||||
const ContentGfxCache* const cache;
|
||||
const Viewport* viewport;
|
||||
public:
|
||||
BlocksPreview(Shader* shader, Atlas* atlas, const ContentGfxCache* cache);
|
||||
~BlocksPreview();
|
||||
|
||||
void begin();
|
||||
void begin(const Viewport* viewport);
|
||||
void draw(const Block* block, int x, int y, int size, glm::vec4 tint);
|
||||
};
|
||||
|
||||
|
||||
@ -148,7 +148,7 @@ void WorldRenderer::draw(const GfxContext& pctx, Camera* camera){
|
||||
backShader->use();
|
||||
backShader->uniformMatrix("u_view", camera->getView(false));
|
||||
backShader->uniform1f("u_zoom", camera->zoom*camera->getFov()/(3.141592*0.5f));
|
||||
backShader->uniform1f("u_ar", (float)Window::width/(float)Window::height);
|
||||
backShader->uniform1f("u_ar", float(displayWidth)/float(displayHeight));
|
||||
skybox->draw(backShader);
|
||||
|
||||
{
|
||||
|
||||
@ -19,7 +19,7 @@ using std::shared_ptr;
|
||||
using namespace gui;
|
||||
|
||||
GUI::GUI() {
|
||||
container = new Container(vec2(0, 0), vec2(Window::width, Window::height));
|
||||
container = new Container(vec2(0, 0), vec2(1000));
|
||||
|
||||
uicamera = new Camera(vec3(), Window::height);
|
||||
uicamera->perspective = false;
|
||||
|
||||
@ -44,6 +44,8 @@ class Camera;
|
||||
*/
|
||||
|
||||
namespace gui {
|
||||
typedef std::function<void()> runnable;
|
||||
|
||||
class UINode;
|
||||
class Container;
|
||||
class PagesControl;
|
||||
|
||||
60
src/frontend/gui/gui_util.cpp
Normal file
60
src/frontend/gui/gui_util.cpp
Normal file
@ -0,0 +1,60 @@
|
||||
#include "gui_util.h"
|
||||
#include "controls.h"
|
||||
#include "panels.h"
|
||||
|
||||
#include <glm/glm.hpp>
|
||||
|
||||
using namespace gui;
|
||||
using glm::vec2;
|
||||
using glm::vec4;
|
||||
using std::string;
|
||||
using std::wstring;
|
||||
|
||||
Button* guiutil::backButton(PagesControl* menu) {
|
||||
return (new Button(L"Back", vec4(10.f)))->listenAction([=](GUI* gui) {
|
||||
menu->back();
|
||||
});
|
||||
}
|
||||
|
||||
Button* guiutil::gotoButton(wstring text, string page, PagesControl* menu) {
|
||||
return (new Button(text, vec4(10.f)))->listenAction([=](GUI* gui) {
|
||||
menu->set(page);
|
||||
});
|
||||
}
|
||||
|
||||
void guiutil::alert(GUI* gui, wstring text, gui::runnable on_hidden) {
|
||||
PagesControl* menu = gui->getMenu();
|
||||
Panel* panel = new Panel(vec2(500, 200), vec4(8.0f), 8.0f);
|
||||
panel->color(vec4(0.0f, 0.0f, 0.0f, 0.5f));
|
||||
panel->add(new Label(text));
|
||||
panel->add((new Button(L"Ok", vec4(10.f)))->listenAction([=](GUI* gui) {
|
||||
if (on_hidden)
|
||||
on_hidden();
|
||||
menu->back();
|
||||
}));
|
||||
panel->refresh();
|
||||
menu->add("<alert>", panel);
|
||||
menu->set("<alert>");
|
||||
}
|
||||
|
||||
void guiutil::confirm(GUI* gui, wstring text, gui::runnable on_confirm) {
|
||||
PagesControl* menu = gui->getMenu();
|
||||
Panel* panel = new Panel(vec2(500, 200), vec4(8.0f), 8.0f);
|
||||
panel->color(vec4(0.0f, 0.0f, 0.0f, 0.5f));
|
||||
panel->add(new Label(text));
|
||||
Panel* subpanel = new Panel(vec2(500, 53));
|
||||
subpanel->color(vec4(0));
|
||||
subpanel->add((new Button(L"Yes", vec4(8.0f)))->listenAction([=](GUI*){
|
||||
if (on_confirm)
|
||||
on_confirm();
|
||||
menu->back();
|
||||
}));
|
||||
subpanel->add((new Button(L"No", vec4(8.0f)))->listenAction([=](GUI*){
|
||||
menu->back();
|
||||
}));
|
||||
panel->add(subpanel);
|
||||
|
||||
panel->refresh();
|
||||
menu->add("<confirm>", panel);
|
||||
menu->set("<confirm>");
|
||||
}
|
||||
18
src/frontend/gui/gui_util.h
Normal file
18
src/frontend/gui/gui_util.h
Normal file
@ -0,0 +1,18 @@
|
||||
#ifndef FRONTEND_GUI_GUI_UTIL_H_
|
||||
#define FRONTEND_GUI_GUI_UTIL_H_
|
||||
|
||||
#include <string>
|
||||
#include "GUI.h"
|
||||
|
||||
namespace gui {
|
||||
class Button;
|
||||
}
|
||||
|
||||
namespace guiutil {
|
||||
gui::Button* backButton(gui::PagesControl* menu);
|
||||
gui::Button* gotoButton(std::wstring text, std::string page, gui::PagesControl* menu);
|
||||
void alert(gui::GUI* gui, std::wstring text, gui::runnable on_hidden=nullptr);
|
||||
void confirm(gui::GUI* gui, std::wstring text, gui::runnable on_confirm=nullptr);
|
||||
}
|
||||
|
||||
#endif // FRONTEND_GUI_GUI_UTIL_H_
|
||||
@ -239,7 +239,7 @@ void HudRenderer::drawContentAccess(const GfxContext& ctx, Player* player) {
|
||||
batch->render();
|
||||
|
||||
// blocks & items
|
||||
blocksPreview->begin();
|
||||
blocksPreview->begin(&ctx.getViewport());
|
||||
{
|
||||
Window::clearDepth();
|
||||
GfxContext subctx = ctx.sub();
|
||||
@ -328,7 +328,7 @@ void HudRenderer::draw(const GfxContext& ctx){
|
||||
batch->color = vec4(1.0f);
|
||||
batch->render();
|
||||
|
||||
blocksPreview->begin();
|
||||
blocksPreview->begin(&ctx.getViewport());
|
||||
{
|
||||
Window::clearDepth();
|
||||
GfxContext subctx = ctx.sub();
|
||||
|
||||
@ -19,6 +19,8 @@
|
||||
#include "../engine.h"
|
||||
#include "../settings.h"
|
||||
|
||||
#include "gui/gui_util.h"
|
||||
|
||||
using glm::vec2;
|
||||
using glm::vec4;
|
||||
using std::string;
|
||||
@ -29,25 +31,13 @@ using std::filesystem::u8path;
|
||||
using std::filesystem::directory_iterator;
|
||||
using namespace gui;
|
||||
|
||||
inline Button* gotoButton(wstring text, string page, PagesControl* menu) {
|
||||
return (new Button(text, vec4(10.f)))->listenAction([=](GUI* gui) {
|
||||
menu->set(page);
|
||||
});
|
||||
}
|
||||
|
||||
inline Button* backButton(PagesControl* menu) {
|
||||
return (new Button(L"Back", vec4(10.f)))->listenAction([=](GUI* gui) {
|
||||
menu->back();
|
||||
});
|
||||
}
|
||||
|
||||
Panel* create_main_menu_panel(Engine* engine, PagesControl* menu) {
|
||||
EnginePaths* paths = engine->getPaths();
|
||||
|
||||
Panel* panel = new Panel(vec2(400, 200), vec4(5.0f), 1.0f);
|
||||
panel->color(vec4(0.0f));
|
||||
|
||||
panel->add(gotoButton(L"New World", "new-world", menu));
|
||||
panel->add(guiutil::gotoButton(L"New World", "new-world", menu));
|
||||
|
||||
Panel* worldsPanel = new Panel(vec2(390, 200), vec4(5.0f));
|
||||
worldsPanel->color(vec4(0.1f));
|
||||
@ -75,8 +65,8 @@ Panel* create_main_menu_panel(Engine* engine, PagesControl* menu) {
|
||||
}
|
||||
}
|
||||
panel->add(worldsPanel);
|
||||
panel->add(gotoButton(L"Settings", "settings", menu));
|
||||
panel->add((new Button(L"Quit", vec4(10.f)))->listenAction([](GUI*) {
|
||||
panel->add(guiutil::gotoButton(L"Settings", "settings", menu));
|
||||
panel->add((new Button(L"Quit", vec4(10.f)))->listenAction([](GUI* gui) {
|
||||
Window::setShouldClose(true);
|
||||
}));
|
||||
panel->refresh();
|
||||
@ -163,7 +153,7 @@ Panel* create_new_world_panel(Engine* engine, PagesControl* menu) {
|
||||
panel->add(button);
|
||||
}
|
||||
|
||||
panel->add(backButton(menu));
|
||||
panel->add(guiutil::backButton(menu));
|
||||
panel->refresh();
|
||||
return panel;
|
||||
}
|
||||
@ -209,7 +199,7 @@ Panel* create_controls_panel(Engine* engine, PagesControl* menu) {
|
||||
}
|
||||
panel->add(scrollPanel);
|
||||
|
||||
panel->add(backButton(menu));
|
||||
panel->add(guiutil::backButton(menu));
|
||||
panel->refresh();
|
||||
return panel;
|
||||
}
|
||||
@ -323,8 +313,8 @@ Panel* create_settings_panel(Engine* engine, PagesControl* menu) {
|
||||
panel->add(checkpanel);
|
||||
}
|
||||
|
||||
panel->add(gotoButton(L"Controls", "controls", menu));
|
||||
panel->add(backButton(menu));
|
||||
panel->add(guiutil::gotoButton(L"Controls", "controls", menu));
|
||||
panel->add(guiutil::backButton(menu));
|
||||
panel->refresh();
|
||||
return panel;
|
||||
}
|
||||
@ -339,7 +329,7 @@ Panel* create_pause_panel(Engine* engine, PagesControl* menu) {
|
||||
});
|
||||
panel->add(shared_ptr<UINode>(button));
|
||||
}
|
||||
panel->add(gotoButton(L"Settings", "settings", menu));
|
||||
panel->add(guiutil::gotoButton(L"Settings", "settings", menu));
|
||||
{
|
||||
Button* button = new Button(L"Save and Quit to Menu", vec4(10.f));
|
||||
button->listenAction([engine](GUI*){
|
||||
|
||||
@ -81,11 +81,14 @@ void MenuScreen::draw(float delta) {
|
||||
uishader->use();
|
||||
uishader->uniformMatrix("u_projview", uicamera->getProjView());
|
||||
|
||||
uint width = Window::width;
|
||||
uint height = Window::height;
|
||||
|
||||
batch->begin();
|
||||
batch->texture(engine->getAssets()->getTexture("menubg"));
|
||||
batch->rect(0, 0,
|
||||
Window::width, Window::height, 0, 0, 0,
|
||||
UVRegion(0, 0, Window::width/64, Window::height/64),
|
||||
width, height, 0, 0, 0,
|
||||
UVRegion(0, 0, width/64, height/64),
|
||||
false, false, vec4(1.0f));
|
||||
batch->render();
|
||||
}
|
||||
|
||||
@ -12,10 +12,20 @@ const int BLOCK_DIR_DOWN = 0x5;
|
||||
|
||||
// limited to 16 block orientations
|
||||
const int BLOCK_ROT_MASK = 0xF;
|
||||
// limited to 16 block variants
|
||||
const int BLOCK_VARIANT_MASK = 0xF0;
|
||||
|
||||
struct voxel {
|
||||
blockid_t id;
|
||||
uint8_t states;
|
||||
|
||||
inline uint8_t rotation() {
|
||||
return states & BLOCK_ROT_MASK;
|
||||
}
|
||||
|
||||
inline int8_t variant() {
|
||||
return (states & BLOCK_VARIANT_MASK) >> 4;
|
||||
}
|
||||
};
|
||||
|
||||
#endif /* VOXELS_VOXEL_H_ */
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user