Skip to content

Commit

Permalink
Renderer: inversion of control for debug rendering
Browse files Browse the repository at this point in the history
  • Loading branch information
Helco committed Nov 23, 2018
1 parent 70472e1 commit fe12b98
Show file tree
Hide file tree
Showing 5 changed files with 97 additions and 67 deletions.
29 changes: 16 additions & 13 deletions pcmockup/debugwindow.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,19 +9,20 @@ struct DebugWindow
SDL_Renderer* renderer;
SDL_Texture* texture;
SDL_Rect texturePos;
DebugInfo info;
xz_t position;
Renderer* podRenderer;
const DebugView* view;
xz_t position, offset;
real_t zoom;
};

DebugWindow* debugWindow_init(SDL_Rect bounds, int index, const char* title)
DebugWindow* debugWindow_init(SDL_Rect bounds, const DebugView* view, Renderer* podRenderer)
{
DebugWindow* me = (DebugWindow*)malloc(sizeof(DebugWindow));
if (me == NULL)
return NULL;
memset(me, 0, sizeof(DebugWindow));

me->window = SDL_CreateWindow(title,
me->window = SDL_CreateWindow(view->name,
bounds.x, bounds.y,
bounds.w, bounds.h,
SDL_WINDOW_RESIZABLE);
Expand All @@ -42,9 +43,9 @@ DebugWindow* debugWindow_init(SDL_Rect bounds, int index, const char* title)

me->position = xz(real_zero, real_zero);
me->zoom = real_one;
me->info.index = index;
me->info.offset = xz(real_from_int(bounds.w / 2), real_from_int(bounds.h / 2));
me->info.ren = me->renderer;
me->offset = xz(real_from_int(bounds.w / 2), real_from_int(bounds.h / 2));
me->podRenderer = podRenderer;
me->view = view;
return me;
}

Expand Down Expand Up @@ -104,6 +105,13 @@ void debugWindow_endUpdate(DebugWindow* me)
SDL_RenderPresent(me->renderer);
}

void debugWindow_update(DebugWindow* me)
{
debugWindow_startUpdate(me);
me->view->callback.sdl(me->podRenderer, me->renderer, me->offset, me->view->userdata);
debugWindow_endUpdate(me);
}

void debugWindow_handleEvent(DebugWindow* me, const SDL_Event* ev)
{
Uint32 windowID = SDL_GetWindowID(me->window);
Expand All @@ -128,13 +136,8 @@ void debugWindow_handleEvent(DebugWindow* me, const SDL_Event* ev)
int textureW, textureH;
SDL_QueryTexture(me->texture, NULL, NULL, &textureW, &textureH);
xz_t halfSize = xz(real_from_int(textureW / 2), real_from_int(textureH / 2));
me->info.offset = xz_sub(
me->offset = xz_sub(
xz_invScale(halfSize, me->zoom),
me->position
);
}

const DebugInfo* debugWindow_getDebugInfo(DebugWindow* me)
{
return &me->info;
}
9 changes: 3 additions & 6 deletions pcmockup/debugwindowset.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ DebugWindowSet* debugWindowSet_init(const WindowGrid* grid, Renderer* renderer)
{
me->windows[i] = debugWindow_init(
windowGrid_getSingleBounds(grid, -1 - i),
i,
renderer_getDebugName(renderer, i)
&renderer_getDebugViews(renderer)[i],
renderer
);
if (me->windows[i] == NULL)
{
Expand Down Expand Up @@ -68,10 +68,7 @@ void debugWindowSet_update(DebugWindowSet* me)
#ifdef DEBUG_WINDOWS
for (int i = 0; i < me->count; i++)
{
debugWindow_startUpdate(me->windows[i]);
const DebugInfo* info = debugWindow_getDebugInfo(me->windows[i]);
renderer_renderDebug(me->renderer, info);
debugWindow_endUpdate(me->windows[i]);
debugWindow_update(me->windows[i]);
}
#endif
}
Expand Down
6 changes: 2 additions & 4 deletions pcmockup/pcmockup.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,10 @@ SDL_Rect pebbleWindow_getBounds(PebbleWindow* window);
GColor* pebbleWindow_getPebbleFramebuffer(PebbleWindow* window);

typedef struct DebugWindow DebugWindow;
DebugWindow* debugWindow_init(SDL_Rect bounds, int index, const char* title);
DebugWindow* debugWindow_init(SDL_Rect bounds, const DebugView* debugView, Renderer* renderer);
void debugWindow_free(DebugWindow* window);
void debugWindow_startUpdate(DebugWindow* window);
void debugWindow_endUpdate(DebugWindow* window);
void debugWindow_update(DebugWindow* window);
void debugWindow_handleEvent(DebugWindow* window, const SDL_Event* ev);
const DebugInfo* debugWindow_getDebugInfo(DebugWindow* window);

typedef struct DebugWindowSet DebugWindowSet;
DebugWindowSet* debugWindowSet_init(const WindowGrid* grid, Renderer* renderer);
Expand Down
29 changes: 19 additions & 10 deletions renderer/renderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,18 +33,27 @@ void renderer_moveForward(Renderer* renderer);
void renderer_moveBackwards(Renderer* renderer);

#ifdef DEBUG_WINDOWS
#include <sdl.include.h>
struct SDL_Renderer; // no need to include SDL here

typedef struct DebugInfo
typedef enum DebugViewType
{
int index;
SDL_Renderer* ren;
xz_t offset;
} DebugInfo;

int renderer_getDebugCount(Renderer* renderer);
const char* renderer_getDebugName(Renderer* renderer, int index);
void renderer_renderDebug(Renderer* me, const DebugInfo* debug);
DebugViewType_SDL
} DebugViewType;

typedef void (*DebugViewCallback_SDL)(Renderer* me, struct SDL_Renderer* sdlRenderer, xz_t offset, const void* userdata);

typedef struct DebugView
{
const char* name;
DebugViewType type;
union {
DebugViewCallback_SDL sdl;
} callback;
const void* userdata; // given to the callbacks
} DebugView;

int renderer_getDebugCount(const Renderer* renderer);
const DebugView* renderer_getDebugViews(const Renderer* renderer);
#endif

#endif
91 changes: 57 additions & 34 deletions renderer/renderer_debug.c
Original file line number Diff line number Diff line change
@@ -1,59 +1,53 @@
#ifdef DEBUG_WINDOWS
#include "renderer_internal.h"
#include "platform.h"
#include "sdl.include.h"

int renderer_getDebugCount(Renderer* renderer)
typedef struct
{
UNUSED(renderer);
return 2;
}

const char* renderer_getDebugName(Renderer* renderer, int index)
{
UNUSED(renderer);
if (index < 0 || index > 1)
return "";
static const char* const NAMES[] = {
"world-space",
"player-space"
};
return NAMES[index];
}
bool_t transform;
} RenderWorldOptions;
static const RenderWorldOptions worldSpaceOptions = {
.transform = false
};
static const RenderWorldOptions playerSpaceOptions = {
.transform = true
};

void renderer_setDebugColor(const DebugInfo* debug, GColor color)
void renderer_setDebugColor(SDL_Renderer* sdlRenderer, GColor color)
{
SDL_SetRenderDrawColor(debug->ren, color.r * (255 / 3), color.g * (255 / 3), color.b * (255 / 3), 255);
SDL_SetRenderDrawColor(sdlRenderer, color.r * (255 / 3), color.g * (255 / 3), color.b * (255 / 3), 255);
}

void renderer_renderDebugLine(Renderer* me, const DebugInfo* debug, lineSeg_t line)
void renderer_renderSDLDebugLine(Renderer* me, SDL_Renderer* sdlRenderer, xz_t offset, lineSeg_t line, const RenderWorldOptions* opts)
{
lineSeg_t transformed = line;
if (debug->index == 1)
if (opts->transform)
renderer_transformLine(me, &line, &transformed);
xz_t start = xz_add(transformed.start.xz, debug->offset);
xz_t end = xz_add(transformed.end.xz, debug->offset);
SDL_RenderDrawLine(debug->ren,
xz_t start = xz_add(transformed.start.xz, offset);
xz_t end = xz_add(transformed.end.xz, offset);
SDL_RenderDrawLine(sdlRenderer,
real_to_int(start.x), real_to_int(start.z),
real_to_int(end.x), real_to_int(end.z));
}

void renderer_renderDebugVector(Renderer* me, const DebugInfo* debug, xz_t origin, xz_t direction)
void renderer_renderDebugVector(Renderer* me, SDL_Renderer* sdlRenderer, xz_t offset, xz_t origin, xz_t direction, const RenderWorldOptions* opts)
{
lineSeg_t seg;
seg.start.xz = origin;
seg.end.xz = xz_add(origin, direction);
renderer_renderDebugLine(me, debug, seg);
renderer_renderSDLDebugLine(me, sdlRenderer, offset, seg, opts);

real_t arrowLength = real_div(xz_length(direction), real_from_int(3));
direction = xz_normalize(direction);
xz_t arrow = xz_scale(xz_rotate(direction, real_degToRad(160)), arrowLength);
seg.start.xz = seg.end.xz;
seg.end.xz = xz_add(seg.start.xz, arrow);
renderer_renderDebugLine(me, debug, seg);
renderer_renderSDLDebugLine(me, sdlRenderer, offset, seg, opts);

arrow = xz_scale(xz_rotate(direction, real_degToRad(-160)), arrowLength);
seg.end.xz = xz_add(seg.start.xz, arrow);
renderer_renderDebugLine(me, debug, seg);
renderer_renderSDLDebugLine(me, sdlRenderer, offset, seg, opts);
}

xz_t angleToVector(real_t angle, real_t length)
Expand All @@ -64,8 +58,10 @@ xz_t angleToVector(real_t angle, real_t length)
), length);
}

void renderer_renderDebug(Renderer* me, const DebugInfo* debug)
void renderer_debug_renderWorld(Renderer* me, SDL_Renderer* sdlRenderer, xz_t offset, const void* userdata)
{
const RenderWorldOptions* opts = (const RenderWorldOptions*)userdata;

const Wall* walls[] = {
&me->wall,
&me->wall2,
Expand All @@ -78,20 +74,47 @@ void renderer_renderDebug(Renderer* me, const DebugInfo* debug)
lineSeg_t wallLine;
wallLine.start.xz = (*curWall)->start;
wallLine.end.xz = (*curWall)->end;
renderer_setDebugColor(debug, (*curWall)->wallColor);
renderer_renderDebugLine(me, debug, wallLine);
renderer_setDebugColor(sdlRenderer, (*curWall)->wallColor);
renderer_renderSDLDebugLine(me, sdlRenderer, offset, wallLine, opts);
curWall++;
}

GColor red = GColorFromRGB(255, 0, 0);
renderer_setDebugColor(debug, red);
renderer_renderDebugVector(me, debug, me->location.position, angleToVector(me->location.angle, 30));
renderer_setDebugColor(sdlRenderer, red);
renderer_renderDebugVector(me, sdlRenderer, offset, me->location.position, angleToVector(me->location.angle, 30), opts);
lineSeg_t fovLine;
fovLine.start.xz = me->location.position;
fovLine.end.xz = xz_add(me->location.position, angleToVector(me->location.angle + me->halfFov, 70));
renderer_renderDebugLine(me, debug, fovLine);
renderer_renderSDLDebugLine(me, sdlRenderer, offset, fovLine, opts);
fovLine.end.xz = xz_add(me->location.position, angleToVector(me->location.angle - me->halfFov, 70));
renderer_renderDebugLine(me, debug, fovLine);
renderer_renderSDLDebugLine(me, sdlRenderer, offset, fovLine, opts);
}

static const DebugView debugViews[] = {
{
.name = "world-space",
.type = DebugViewType_SDL,
.callback = { .sdl = renderer_debug_renderWorld },
.userdata = &worldSpaceOptions
},
{
.name = "player-space",
.type = DebugViewType_SDL,
.callback = { .sdl = renderer_debug_renderWorld },
.userdata = &playerSpaceOptions
}
};

int renderer_getDebugCount(const Renderer* renderer)
{
UNUSED(renderer);
return sizeof(debugViews) / sizeof(DebugView);
}

const DebugView* renderer_getDebugViews(const Renderer* renderer)
{
UNUSED(renderer);
return debugViews;
}

#endif

0 comments on commit fe12b98

Please sign in to comment.