X-Git-Url: https://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fapp%2Fapp.cpp;h=064786fb82baf42403588ec4f789c23b3e1f6d2e;hb=64d455cba09900ef6ad19d1f60b72908153bae00;hp=a7bbf39321db2de6f685892696fb2576eeed1893;hpb=91dfd6cd62ea0723c3c83572b4ebfa4ef7b4ac5f;p=blobs.git diff --git a/src/app/app.cpp b/src/app/app.cpp index a7bbf39..064786f 100644 --- a/src/app/app.cpp +++ b/src/app/app.cpp @@ -1,14 +1,20 @@ #include "Application.hpp" +#include "Assets.hpp" #include "State.hpp" +#include "init.hpp" +#include "../graphics/Viewport.hpp" + #include 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() { } }