From 2d9fded23579d7493da69ab10e8ae93999330ef3 Mon Sep 17 00:00:00 2001 From: Doyle Thai Date: Sat, 16 Jul 2016 20:21:49 +1000 Subject: [PATCH] Group texture & texture rect together in renderer --- src/Renderer.c | 38 +++++++++++++++------------------- src/WorldTraveller.c | 8 +++++-- src/include/Dengine/Renderer.h | 8 ++++++- 3 files changed, 30 insertions(+), 24 deletions(-) diff --git a/src/Renderer.c b/src/Renderer.c index 823ac43..2829cd1 100644 --- a/src/Renderer.c +++ b/src/Renderer.c @@ -18,8 +18,8 @@ INTERNAL void updateBufferObject(Renderer *const renderer, glBindBuffer(GL_ARRAY_BUFFER, 0); } -INTERNAL RenderQuad createTexQuad(Renderer *renderer, v4 quadRect, v4 texRect, - Texture *tex) +INTERNAL RenderQuad createTexQuad(Renderer *renderer, v4 quadRect, + RenderTex renderTex) { // NOTE(doyle): Draws a series of triangles (three-sided polygons) using // vertices v0, v1, v2, then v2, v1, v3 (note the order) @@ -33,10 +33,11 @@ INTERNAL RenderQuad createTexQuad(Renderer *renderer, v4 quadRect, v4 texRect, quadRectNdc.e[3] *= renderer->vertexNdcFactor.h; /* Convert texture coordinates to normalised texture coordinates */ - v4 texRectNdc = texRect; - if (tex) + v4 texRectNdc = renderTex.texRect; + if (renderTex.tex) { - v2 texNdcFactor = V2(1.0f / tex->width, 1.0f / tex->height); + v2 texNdcFactor = + V2(1.0f / renderTex.tex->width, 1.0f / renderTex.tex->height); texRectNdc.e[0] *= texNdcFactor.w; texRectNdc.e[1] *= texNdcFactor.h; texRectNdc.e[2] *= texNdcFactor.w; @@ -55,20 +56,12 @@ INTERNAL RenderQuad createTexQuad(Renderer *renderer, v4 quadRect, v4 texRect, return result; } -INTERNAL inline RenderQuad createQuad(Renderer *renderer, v4 quadRect) -{ - v4 texRect = V4(0, 0, 0, 0); - RenderQuad result = - createTexQuad(renderer, quadRect, texRect, NULL); - return result; -} - INTERNAL inline RenderQuad -createDefaultTexQuad(Renderer *renderer, v4 texRect, Texture *tex) +createDefaultTexQuad(Renderer *renderer, RenderTex renderTex) { RenderQuad result = {0}; v4 defaultQuad = V4(0.0f, renderer->size.h, renderer->size.w, 0.0f); - result = createTexQuad(renderer, defaultQuad, texRect, tex); + result = createTexQuad(renderer, defaultQuad, renderTex); return result; } @@ -125,15 +118,16 @@ INTERNAL void renderObject(Renderer *renderer, v2 pos, v2 size, f32 rotate, } void renderer_rect(Renderer *const renderer, v4 cameraBounds, v2 pos, v2 size, - f32 rotate, Texture *tex, v4 texRect, v4 color) + f32 rotate, RenderTex renderTex, v4 color) { - RenderQuad quad = createDefaultTexQuad(renderer, texRect, tex); + RenderQuad quad = createDefaultTexQuad(renderer, renderTex); updateBufferObject(renderer, &quad, 1); // NOTE(doyle): Get the origin of cameraBounds in world space, bottom left v2 offsetFromCamOrigin = V2(cameraBounds.x, cameraBounds.w); v2 rectRelativeToCamera = v2_sub(pos, offsetFromCamOrigin); - renderObject(renderer, rectRelativeToCamera, size, rotate, color, tex); + renderObject(renderer, rectRelativeToCamera, size, rotate, color, + renderTex.tex); } void renderer_string(Renderer *const renderer, v4 cameraBounds, @@ -181,9 +175,10 @@ void renderer_string(Renderer *const renderer, v4 cameraBounds, /* Get texture out */ v4 charTexRect = font->atlas->texRect[relativeIndex]; renderer_flipTexCoord(&charTexRect, FALSE, TRUE); + RenderTex renderTex = {font->tex, charTexRect}; - RenderQuad charQuad = createTexQuad(renderer, charRectOnScreen, - charTexRect, font->tex); + RenderQuad charQuad = + createTexQuad(renderer, charRectOnScreen, renderTex); stringQuads[quadIndex++] = charQuad; } @@ -227,8 +222,9 @@ void renderer_entity(Renderer *renderer, v4 cameraBounds, Entity *entity, // NOTE(doyle): Flip the x coordinates to flip the tex renderer_flipTexCoord(&texRect, TRUE, FALSE); } + RenderTex renderTex = {entity->tex, texRect}; RenderQuad entityQuad = - createDefaultTexQuad(renderer, texRect, entity->tex); + createDefaultTexQuad(renderer, renderTex); updateBufferObject(renderer, &entityQuad, 1); v2 offsetFromCamOrigin = V2(cameraBounds.x, cameraBounds.w); diff --git a/src/WorldTraveller.c b/src/WorldTraveller.c index c088d4a..034bafc 100644 --- a/src/WorldTraveller.c +++ b/src/WorldTraveller.c @@ -500,8 +500,10 @@ void worldTraveller_gameUpdateAndRender(GameState *state, const f32 dt) Texture *emptyTex = asset_getTexture(assetManager, texlist_empty); v2 heroCenter = v2_add(hero->pos, v2_scale(hero->size, 0.5f)); + + RenderTex renderTex = {emptyTex, V4(0, 1, 1, 0)}; renderer_rect(renderer, cameraBounds, heroCenter, - V2(distance, 10.0f), 0, emptyTex, V4(0, 1, 1, 0), + V2(distance, 10.0f), 0, renderTex, V4(1, 0, 0, 0.5f)); } } @@ -574,8 +576,10 @@ void worldTraveller_gameUpdateAndRender(GameState *state, const f32 dt) v2 heroAvatarSize = math_getRectSize(heroAvatarTexRect); v2 heroAvatarP = V2(10.0f, (renderer->size.h * 0.5f) - (0.5f * heroAvatarSize.h)); + + RenderTex heroRenderTex = {hero->tex, heroAvatarTexRect}; renderer_rect(renderer, cameraBounds, heroAvatarP, heroAvatarSize, 0, - hero->tex, heroAvatarTexRect, V4(1, 1, 1, 1)); + heroRenderTex, V4(1, 1, 1, 1)); v4 color = V4(0, 0, 1.0f, 1); char *heroAvatarStr = "HP: 100/100"; diff --git a/src/include/Dengine/Renderer.h b/src/include/Dengine/Renderer.h index f21a0e4..abf295d 100644 --- a/src/include/Dengine/Renderer.h +++ b/src/include/Dengine/Renderer.h @@ -14,6 +14,12 @@ typedef struct Renderer v2 size; } Renderer; +typedef struct RenderTex +{ + Texture *tex; + v4 texRect; +} RenderTex; + typedef struct RenderQuad { v4 vertex[4]; @@ -23,7 +29,7 @@ typedef struct RenderQuad // Renderer::~Renderer() { glDeleteVertexArrays(1, &this->quadVAO); } void renderer_rect(Renderer *const renderer, v4 cameraBounds, v2 pos, v2 size, - f32 rotate, Texture *tex, v4 texRect, v4 color); + f32 rotate, RenderTex renderTex, v4 color); void renderer_string(Renderer *const renderer, v4 cameraBounds, Font *const font, const char *const string, v2 pos,