]> code.bitgloo.com Git - clyne/gamedev2.git/commitdiff
allow lua to create dialog box
authorClyne Sullivan <clyne@bitgloo.com>
Wed, 16 Nov 2022 01:40:37 +0000 (20:40 -0500)
committerClyne Sullivan <clyne@bitgloo.com>
Wed, 16 Nov 2022 01:40:37 +0000 (20:40 -0500)
Makefile
Scripts/init.lua
src/engine.cpp
src/events/render.hpp
src/render.cpp
src/render.hpp
src/ui.cpp
src/ui.hpp

index 4ec54da02261e85123946a14f4d9758307a178a3..12d779095995729d952a492f6a135095cf608f3a 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -39,7 +39,7 @@ LIBDIR = lib
 LIBS   = -L$(LIBDIR) -lSDL2 -lpthread -lentityx -lluajit -ldl -lGLEW -lGL \
          -lSDL2_image -lsoil -lfreetype -lopenal -lalut
 
-CXXFLAGS = -ggdb -std=c++17 -Wall -Wextra -Werror -pedantic \
+CXXFLAGS = -ggdb -std=c++20 -Wall -Wextra -Werror -pedantic \
            -Wno-class-memaccess -Wno-implicit-fallthrough -Wno-unused-parameter
 
 CXXINCS = -I$(SRCDIR) \
index 60f21c6d8ff032f6356b7c9318d2db86b8826c91..441cc2a7c01838bf2b818c223fd5f218dea0df2e 100644 (file)
@@ -30,6 +30,7 @@ player = {
             end
         end,
         JumpKeyReleased = function(self)
+            game.dialog(30, -150, 400, 100)
         end
     },
     Position = {
index d8eef23f563e8903120f3d73b972670fc469e622..02598d48e49d51217e68ca1da494627c814a8cac 100644 (file)
@@ -71,6 +71,9 @@ int Engine::init(void)
     script->addToGameNamespace("play",
         bindInstance(&AudioSystem::playSound,
                      systems.system<AudioSystem>().get()));
+    script->addToGameNamespace("dialog",
+        bindInstance(&UISystem::createDialogBox,
+                     systems.system<UISystem>().get()));
     script->init();
     
 
index 7bb45df6632886e636cb96ea46e269246f069cde..07f5d64e36cb63a4126e9ab53f774e595c5d1721 100644 (file)
@@ -27,11 +27,20 @@ struct NewRenderEvent
     GLuint normal;
     unsigned int vertex;
 
+    NewRenderEvent() = default;
     NewRenderEvent(GLuint _vbo, GLuint _tex, 
                    GLuint _normal, unsigned int _vertex) :
         vbo(_vbo), tex(_tex), normal(_normal), vertex(_vertex) {}
 };
 
+struct DelRenderEvent
+{
+    GLuint vbo;
+
+    DelRenderEvent(GLuint _vbo) :
+        vbo(_vbo) {}
+};
+
 struct WorldMeshUpdateEvent
 {
     GLuint worldVBO;
index 6e30f213680169f280e42407b5041fff332b0335..5ae2c15364b77190ffeecb9a1940f2a7919478fc 100644 (file)
@@ -29,6 +29,7 @@ void RenderSystem::configure([[maybe_unused]] entityx::EntityManager& entities,
                              [[maybe_unused]] entityx::EventManager& events)
 {
     events.subscribe<NewRenderEvent>(*this);
+    events.subscribe<DelRenderEvent>(*this);
     events.subscribe<WorldMeshUpdateEvent>(*this);
     events.subscribe<entityx::ComponentAddedEvent<Player>>(*this);
 
@@ -404,6 +405,12 @@ void RenderSystem::receive(const NewRenderEvent &nre)
                                UIRenderData(nre.tex, nre.normal, nre.vertex));
 }
 
+void RenderSystem::receive(const DelRenderEvent &dre)
+{
+    if (uiRenders.contains(dre.vbo))
+        uiRenders.erase(dre.vbo);
+}
+
 void RenderSystem::receive(const WorldMeshUpdateEvent &wmu)
 {
     worldRenders.insert_or_assign(
index 45fb548a35f3c20c3e4c09546a0b65131a6f909d..ede3f88d7ed6f4e7938e56732c474cfd31ff0b19 100644 (file)
@@ -116,6 +116,7 @@ public:
     ************/
     void receive(const WorldMeshUpdateEvent &wmu);
     void receive(const NewRenderEvent &nre);
+    void receive(const DelRenderEvent &dre);
     void receive(const entityx::ComponentAddedEvent<Player> &cae);
 };
 
index 71cb8757091654f875dd4a7ccc7e2bd9de2793ca..5d8b0cc2ad461eeb208f059967a4a9ab585bbcc8 100644 (file)
@@ -1,56 +1,68 @@
 #include "ui.hpp"
 
-#include "events/render.hpp"
 #include "text.hpp"
 
 #include <SDL2/SDL_opengl.h>
 #include <iostream>
 #include <string>
 
-static NewRenderEvent NRE (0, 0, 0, 0);
 static const unsigned int NRE_TEX_DATA = 0xBBBBBBBB;
-static std::basic_string<TextMeshData> buffer;
 
 void UISystem::configure(entityx::EntityManager&, entityx::EventManager&)
 {
 }
 
+void UISystem::createDialogBox(float x, float y, float w, float h)
+{
+    // Queue for generation in the main thread.
+    m_boxes.emplace_back(0, x, y, w, h);
+}
+
 void UISystem::update(entityx::EntityManager&,
     entityx::EventManager& events,
     entityx::TimeDelta)
 {
-    static bool t = false;
-
-    if (!t) {
-        t = true;
-
-        glGenBuffers(1, &NRE.vbo);
-        glGenTextures(1, &NRE.tex);
-
-        glBindTexture(GL_TEXTURE_2D, NRE.tex);
-        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &NRE_TEX_DATA);
-
-        glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
-        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
-        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
-        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-
-        buffer += { 30, -50, -5, 0, 0, 1 };
-        buffer += { 160, -50, -5, 0, 0, 1 };
-        buffer += { 160, -10, -5, 0, 0, 1 };
-        buffer += { 160, -10, -5, 0, 0, 1 };
-        buffer += { 30, -10, -5, 0, 0, 1 };
-        buffer += { 30, -50, -5, 0, 0, 1 };
-
-        glBindBuffer(GL_ARRAY_BUFFER, NRE.vbo);
-        glBufferData(GL_ARRAY_BUFFER,
-                     buffer.size() * sizeof(TextMeshData), buffer.data(),
-                     GL_DYNAMIC_DRAW);
-
-        NRE.normal = 0;
-        NRE.vertex = buffer.size();
-        events.emit<NewRenderEvent>(NRE);
+    for (auto& b : m_boxes) {
+        if (b.vbo == 0) {
+            auto nre = generateDialogBox(b);
+            events.emit<NewRenderEvent>(nre);
+        }
     }
 }
 
+NewRenderEvent UISystem::generateDialogBox(Box& box)
+{
+    NewRenderEvent nre;
+    std::basic_string<TextMeshData> buffer;
+
+    glGenBuffers(1, &nre.vbo);
+    glGenTextures(1, &nre.tex);
+    box.vbo = nre.vbo;
+
+    glBindTexture(GL_TEXTURE_2D, nre.tex);
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1, 1, 0, GL_RGBA,
+                 GL_UNSIGNED_BYTE, &NRE_TEX_DATA);
+
+    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+    buffer += { box.x, box.y, -5, 0, 0, 1 };
+    buffer += { box.x + box.w, box.y, -5, 0, 0, 1 };
+    buffer += { box.x + box.w, box.y + box.h, -5, 0, 0, 1 };
+    buffer += { box.x + box.w, box.y + box.h, -5, 0, 0, 1 };
+    buffer += { box.x, box.y + box.h, -5, 0, 0, 1 };
+    buffer += { box.x, box.y, -5, 0, 0, 1 };
+
+    glBindBuffer(GL_ARRAY_BUFFER, nre.vbo);
+    glBufferData(GL_ARRAY_BUFFER,
+                 buffer.size() * sizeof(TextMeshData), buffer.data(),
+                 GL_DYNAMIC_DRAW);
+
+    nre.normal = 0;
+    nre.vertex = buffer.size();
+    return nre;
+}
+
index 809b5dcadaff1c5c4ca508dbbedfe61198195499..1986c8f0f15b12552aa9d8e6ca142f5a37e06f75 100644 (file)
 #ifndef SYSTEM_UI_HPP_
 #define SYSTEM_UI_HPP_
 
+#include "events/render.hpp"
+
 #include <entityx/entityx.h>
+#include <GL/glew.h>
+#include <SDL2/SDL.h>
+#include <SDL2/SDL_opengl.h>
 
-#include <map>
-#include <string>
-#include <tuple>
 #include <vector>
 
 class UISystem : public entityx::System<UISystem>
@@ -36,6 +38,18 @@ public:
     void update(entityx::EntityManager&,
                 entityx::EventManager&,
                 entityx::TimeDelta) final;
+
+    void createDialogBox(float x, float y, float w, float h);
+
+private:
+    struct Box {
+        GLuint vbo;
+        float x, y, w, h;
+    };
+
+    std::vector<Box> m_boxes;
+
+    NewRenderEvent generateDialogBox(Box& box);
 };
 
 #endif // SYSTEM_UI_HPP_