]> git.localhorst.tv Git - blobs.git/blobdiff - src/app/app.cpp
simple planet render
[blobs.git] / src / app / app.cpp
index a7bbf39321db2de6f685892696fb2576eeed1893..064786fb82baf42403588ec4f789c23b3e1f6d2e 100644 (file)
@@ -1,14 +1,20 @@
 #include "Application.hpp"
+#include "Assets.hpp"
 #include "State.hpp"
 
+#include "init.hpp"
+#include "../graphics/Viewport.hpp"
+
 #include <SDL.h>
 
 
 namespace blobs {
 namespace app {
 
-Application::Application()
-: states() {
+Application::Application(Window &win, graphics::Viewport &vp)
+: window(win)
+, viewport(vp)
+, states() {
 }
 
 Application::~Application() {
@@ -16,6 +22,7 @@ Application::~Application() {
 
 
 void Application::PushState(State *s) {
+       s->app = this;
        if (!states.empty()) {
                states.top()->OnPause();
        }
@@ -39,6 +46,7 @@ State *Application::PopState() {
 }
 
 State *Application::SwitchState(State *s_new) {
+       s_new->app = this;
        State *s_old = states.top();
        states.top() = s_new;
        --s_old->ref_count;
@@ -78,23 +86,49 @@ void Application::Loop(int dt) {
        if (!HasState()) return;
        GetState().Update(dt);
        if (!HasState()) return;
-       GetState().Render();
+       viewport.Clear();
+       GetState().Render(viewport);
+       window.Flip();
 }
 
 void Application::HandleEvents() {
        SDL_Event event;
        while (HasState() && SDL_PollEvent(&event)) {
+               if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_RESIZED) {
+                       viewport.Resize(event.window.data1, event.window.data2);
+               }
                GetState().Handle(event);
        }
 }
 
 void State::Handle(const SDL_Event &event) {
        switch (event.type) {
+               case SDL_KEYDOWN:
+                       OnKeyDown(event.key);
+                       break;
+               case SDL_KEYUP:
+                       OnKeyUp(event.key);
+                       break;
+               case SDL_MOUSEBUTTONDOWN:
+                       OnMouseDown(event.button);
+                       break;
+               case SDL_MOUSEBUTTONUP:
+                       OnMouseUp(event.button);
+                       break;
+               case SDL_MOUSEMOTION:
+                       OnMouseMotion(event.motion);
+                       break;
+               case SDL_MOUSEWHEEL:
+                       OnMouseWheel(event.wheel);
+                       break;
+               case SDL_QUIT:
+                       OnQuit();
+                       break;
                case SDL_WINDOWEVENT:
                        Handle(event.window);
                        break;
                default:
-                       OnEvent(event);
+                       // ignore
                        break;
        }
 }
@@ -108,8 +142,7 @@ void State::Handle(const SDL_WindowEvent &event) {
                        OnBlur();
                        break;
                case SDL_WINDOWEVENT_RESIZED:
-                       //env.viewport.Resize(event.data1, event.data2);
-                       OnResize();
+                       OnResize(event.data1, event.data2);
                        break;
                default:
                        break;
@@ -120,8 +153,32 @@ void State::Update(int dt) {
        OnUpdate(dt);
 }
 
-void State::Render() {
-       OnRender();
+void State::Render(graphics::Viewport &viewport) {
+       OnRender(viewport);
+}
+
+void State::OnQuit() {
+       while (App().HasState()) {
+               App().PopState();
+       }
+}
+
+
+Assets::Assets() {
+       graphics::Format format;
+       textures.tiles.Bind();
+       textures.tiles.Reserve(1, 1, 3, format);
+       std::uint8_t texdata[] = {
+               0xFF, 0x00, 0x00, 0xFF,
+               0x00, 0xFF, 0x00, 0xFF,
+               0x00, 0x00, 0xFF, 0xFF,
+       };
+       textures.tiles.Data(0, format, texdata);
+       textures.tiles.Data(1, format, texdata + 4);
+       textures.tiles.Data(2, format, texdata + 8);
+}
+
+Assets::~Assets() {
 }
 
 }