diff --git a/pcmockup/debugwindow.c b/pcmockup/debugwindow.c index ded9bf6..cec8b09 100644 --- a/pcmockup/debugwindow.c +++ b/pcmockup/debugwindow.c @@ -28,7 +28,6 @@ SDL_Surface* createSDLSurface(int w, int h, Uint32 format) return surface; } -void debugWindow_onDrag(Window* window, int button, ImVec2 delta, void* userdata); void debugWindow_onKeyDown(Window* window, SDL_Keysym sym, void* userdata); DebugWindow* debugWindow_init(WindowContainer* parent, SDL_Rect bounds, const DebugView* view, Renderer* podRenderer) @@ -45,7 +44,6 @@ DebugWindow* debugWindow_init(WindowContainer* parent, SDL_Rect bounds, const De debugWindow_free(me); return NULL; } - window_setDragCallback(imageWindow_asWindow(me->window), debugWindow_onDrag, me); window_setKeyCallbacks(imageWindow_asWindow(me->window), (WindowKeyCallbacks) { .down = debugWindow_onKeyDown, .userdata = me @@ -130,17 +128,29 @@ void debugWindow_onDrag(Window* window, int button, ImVec2 delta, void* userdata void debugWindow_onKeyDown(Window* window, SDL_Keysym sym, void* userdata) { UNUSED(window); - real_t delta = real_zero; + static const float zoomSpeed = 0.1f; + static const float moveSpeed = 8.0f; + real_t zoomDelta = real_zero; + xz_t moveDelta = xz_zero; switch (sym.sym) { case (SDLK_PLUS): - case (SDLK_KP_PLUS): delta = real_from_float(0.1f); break; + case (SDLK_KP_PLUS): zoomDelta = real_from_float(zoomSpeed); break; case (SDLK_MINUS): - case (SDLK_KP_MINUS): delta = real_from_float(-0.1f); break; + case (SDLK_KP_MINUS): zoomDelta = real_from_float(-zoomSpeed); break; + case (SDLK_w): + case (SDLK_UP): moveDelta = xz(real_zero, real_from_float(-moveSpeed)); break; + case (SDLK_s): + case (SDLK_DOWN): moveDelta = xz(real_zero, real_from_float(moveSpeed)); break; + case (SDLK_a): + case (SDLK_LEFT): moveDelta = xz(real_from_float(-moveSpeed), real_zero); break; + case (SDLK_d): + case (SDLK_RIGHT): moveDelta = xz(real_from_float(moveSpeed), real_zero); break; default: return; } DebugWindow* me = (DebugWindow*)userdata; - me->zoom = real_add(me->zoom, real_mul(me->zoom, delta)); + me->position = xz_sub(me->position, xz_invScale(moveDelta, me->zoom)); + me->zoom = real_add(me->zoom, real_mul(me->zoom, zoomDelta)); debugWindow_updateOffset(me); } diff --git a/pcmockup/pcmockup.c b/pcmockup/pcmockup.c index b31c663..1a94929 100644 --- a/pcmockup/pcmockup.c +++ b/pcmockup/pcmockup.c @@ -70,7 +70,8 @@ PCMockup *pcmockup_init() me->pebbleWindow = pebbleWindow_init( me->windowContainer, windowGrid_getSingleBounds(&windowGrid, 0), - GSize(RENDERER_WIDTH, RENDERER_HEIGHT) + GSize(RENDERER_WIDTH, RENDERER_HEIGHT), + me->renderer ); if (me->pebbleWindow == NULL) { @@ -151,58 +152,7 @@ void pcmockup_update(PCMockup *me) case (SDLK_ESCAPE): { me->isRunning = 0; - } - break; - case (SDLK_w): - { - renderer_moveForward(me->renderer); - } - break; - case (SDLK_s): - { - renderer_moveBackwards(me->renderer); - } - break; - case (SDLK_a): - { - renderer_moveLeft(me->renderer); - } - break; - case (SDLK_d): - { - renderer_moveRight(me->renderer); - } - break; - case (SDLK_RIGHT): - { - renderer_rotateRight(me->renderer); - } - break; - case (SDLK_LEFT): - { - renderer_rotateLeft(me->renderer); - } - break; - case (SDLK_UP): - { - renderer_moveUp(me->renderer); - } - break; - case (SDLK_DOWN): - { - renderer_moveDown(me->renderer); - } - break; - case (SDLK_SPACE): - { - Location playerLocation; - playerLocation.angle = real_degToRad(real_from_int(0)); - playerLocation.height = real_zero; - playerLocation.position = xz(real_from_int(20), real_from_int(20)); - - renderer_moveTo(me->renderer, playerLocation); - } - break; + }break; } } windowContainer_handleEvent(me->windowContainer, &event); diff --git a/pcmockup/pcmockup.h b/pcmockup/pcmockup.h index 96bf863..9781c06 100644 --- a/pcmockup/pcmockup.h +++ b/pcmockup/pcmockup.h @@ -33,7 +33,7 @@ void safeFramebuffer_prepare(SafeFramebuffer* me); void safeFramebuffer_check(SafeFramebuffer* me); typedef struct PebbleWindow PebbleWindow; -PebbleWindow* pebbleWindow_init(WindowContainer* parent, SDL_Rect initialBounds, GSize pebbleSize); +PebbleWindow* pebbleWindow_init(WindowContainer* parent, SDL_Rect initialBounds, GSize pebbleSize, Renderer* renderer); void pebbleWindow_free(PebbleWindow* window); void pebbleWindow_startUpdate(PebbleWindow* me); void pebbleWindow_endUpdate(PebbleWindow* me); diff --git a/pcmockup/pebblewindow.c b/pcmockup/pebblewindow.c index 0d25f21..05e40e0 100644 --- a/pcmockup/pebblewindow.c +++ b/pcmockup/pebblewindow.c @@ -1,4 +1,5 @@ #include "pcmockup.h" +#include "platform.h" #include #include @@ -10,10 +11,13 @@ struct PebbleWindow SDL_Color* textureData; SDL_PixelFormat* texturePixelFormat; SafeFramebuffer* framebuffer; + Renderer* renderer; GSize pebbleSize; }; -PebbleWindow* pebbleWindow_init(WindowContainer* parent, SDL_Rect initialBounds, GSize pebbleSize) +void pebbleWindow_onKeyDown(Window* window, SDL_Keysym sym, void* userdata); + +PebbleWindow* pebbleWindow_init(WindowContainer* parent, SDL_Rect initialBounds, GSize pebbleSize, Renderer* renderer) { PebbleWindow* me = (PebbleWindow*)malloc(sizeof(PebbleWindow)); if (me == NULL) @@ -27,6 +31,10 @@ PebbleWindow* pebbleWindow_init(WindowContainer* parent, SDL_Rect initialBounds, pebbleWindow_free(me); return NULL; } + window_setKeyCallbacks(imageWindow_asWindow(me->window), (WindowKeyCallbacks) { + .down = pebbleWindow_onKeyDown, + .userdata = me + }); me->textureData = (SDL_Color*)malloc(sizeof(SDL_Color) * pebbleSize.w * pebbleSize.h); if (me->textureData == NULL) @@ -52,7 +60,7 @@ PebbleWindow* pebbleWindow_init(WindowContainer* parent, SDL_Rect initialBounds, } me->pebbleSize = pebbleSize; - + me->renderer = renderer; return me; } @@ -118,6 +126,32 @@ void pebbleWindow_endUpdate(PebbleWindow* me) imageWindow_setImageData(me->window, me->pebbleSize, me->textureData); } +void pebbleWindow_onKeyDown(Window* window, SDL_Keysym sym, void* userdata) +{ + UNUSED(window); + PebbleWindow* me = (PebbleWindow*)userdata; + switch(sym.sym) + { + case (SDLK_w): renderer_moveForward(me->renderer); break; + case (SDLK_s): renderer_moveBackwards(me->renderer); break; + case (SDLK_a): renderer_moveLeft(me->renderer); break; + case (SDLK_d): renderer_moveRight(me->renderer); break; + case (SDLK_UP): renderer_moveUp(me->renderer); break; + case (SDLK_DOWN): renderer_moveDown(me->renderer); break; + case (SDLK_LEFT): renderer_rotateLeft(me->renderer); break; + case (SDLK_RIGHT): renderer_rotateRight(me->renderer); break; + case(SDLK_SPACE): + { + Location playerLocation; + playerLocation.angle = real_degToRad(real_from_int(0)); + playerLocation.height = real_zero; + playerLocation.position = xz(real_from_int(20), real_from_int(20)); + + renderer_moveTo(me->renderer, playerLocation); + }break; + } +} + GColor* pebbleWindow_getPebbleFramebuffer(PebbleWindow* window) { return safeFramebuffer_getScreenBuffer(window->framebuffer);