From b75d700dd6f13890aaee3aeb19d5e9c2713564da Mon Sep 17 00:00:00 2001 From: Doyle Thai Date: Wed, 16 Nov 2016 16:57:24 +1100 Subject: [PATCH] Rename rect members from pos, size to min, max --- src/AssetManager.c | 14 ++--- src/Asteroid.c | 27 ++++---- src/Entity.c | 2 +- src/Renderer.c | 125 ++++++++++++++++--------------------- src/UserInterface.c | 54 ++++++++-------- src/include/Dengine/Math.h | 8 +-- 6 files changed, 108 insertions(+), 122 deletions(-) diff --git a/src/AssetManager.c b/src/AssetManager.c index ab40e9d..cc40f38 100644 --- a/src/AssetManager.c +++ b/src/AssetManager.c @@ -666,7 +666,7 @@ INTERNAL void parseXmlTreeToGame(AssetManager *assetManager, MemoryArena_ *arena i32 valueLen = common_strlen(value); i32 intValue = common_atoi(value, valueLen); - subTex.rect.pos.x = CAST(f32) intValue; + subTex.rect.min.x = CAST(f32) intValue; } else if (common_strcmp(subTexAttrib->name, "y") == 0) @@ -675,7 +675,7 @@ INTERNAL void parseXmlTreeToGame(AssetManager *assetManager, MemoryArena_ *arena i32 valueLen = common_strlen(value); i32 intValue = common_atoi(value, valueLen); - subTex.rect.pos.y = CAST(f32) intValue; + subTex.rect.min.y = CAST(f32) intValue; } else if (common_strcmp(subTexAttrib->name, "width") == 0) @@ -684,7 +684,7 @@ INTERNAL void parseXmlTreeToGame(AssetManager *assetManager, MemoryArena_ *arena i32 valueLen = common_strlen(value); i32 intValue = common_atoi(value, valueLen); - subTex.rect.size.w = CAST(f32) intValue; + subTex.rect.max.w = CAST(f32) intValue; } else if (common_strcmp(subTexAttrib->name, "height") == 0) @@ -693,7 +693,7 @@ INTERNAL void parseXmlTreeToGame(AssetManager *assetManager, MemoryArena_ *arena i32 valueLen = common_strlen(value); i32 intValue = common_atoi(value, valueLen); - subTex.rect.size.h = CAST(f32) intValue; + subTex.rect.max.h = CAST(f32) intValue; } else if (common_strcmp(subTexAttrib->name, "hand_offset_x") == 0) @@ -726,9 +726,9 @@ INTERNAL void parseXmlTreeToGame(AssetManager *assetManager, MemoryArena_ *arena // TODO(doyle): XML specifies 0,0 top left, we // prefer 0,0 bottom right, so offset by size since 0,0 // is top left and size creates a bounding box below it - subTex.rect.pos.y = 1024 - subTex.rect.pos.y; - subTex.rect.pos.y -= subTex.rect.size.h; - subTex.offset.y = subTex.rect.size.h - subTex.offset.y; + subTex.rect.min.y = 1024 - subTex.rect.min.y; + subTex.rect.min.y -= subTex.rect.max.h; + subTex.offset.y = subTex.rect.max.h - subTex.offset.y; #ifdef DENGINE_DEBUG ASSERT(key); diff --git a/src/Asteroid.c b/src/Asteroid.c index 2034c11..758dead 100644 --- a/src/Asteroid.c +++ b/src/Asteroid.c @@ -180,7 +180,7 @@ void asteroid_gameUpdateAndRender(GameState *state, Memory *memory, { // Init ship entity Entity *ship = &state->entityList[state->entityIndex++]; ship->id = 0; - ship->pos = V2(100, 100); + ship->pos = V2(0, 0); ship->size = V2(25.0f, 50.0f); ship->hitbox = ship->size; ship->offset = v2_scale(ship->size, 0.5f); @@ -192,9 +192,9 @@ void asteroid_gameUpdateAndRender(GameState *state, Memory *memory, ship->collides = FALSE; } - state->camera.pos = V2(0, 0); - state->camera.size = state->renderer.size; - state->init = TRUE; + state->camera.min = V2(0, 0); + state->camera.max = state->renderer.size; + state->init = TRUE; state->worldSize = windowSize; @@ -247,8 +247,7 @@ void asteroid_gameUpdateAndRender(GameState *state, Memory *memory, // is right facing for trig to work Radians rotation = DEGREES_TO_RADIANS((entity->rotation + 90.0f)); v2 direction = V2(math_cosf(rotation), math_sinf(rotation)); - - ddP = v2_normalise(direction); + ddP = direction; } if (getKeyStatus(&state->input.keys[keycode_left], @@ -322,14 +321,16 @@ void asteroid_gameUpdateAndRender(GameState *state, Memory *memory, renderer_entity(&state->renderer, state->camera, entity, pivotPoint, 0, V4(0.4f, 0.8f, 1.0f, 1.0f), flags); - v2 rightAlignedP = v2_add(entity->pos, entity->hitbox); - renderer_rect(&state->renderer, state->camera, rightAlignedP, V2(10, 10), - V2(0, 0), DEGREES_TO_RADIANS(entity->rotation), NULL, - V4(0.4f, 0.8f, 1.0f, 1.0f), flags); + v2 leftAlignedP = v2_sub(entity->pos, entity->offset); + renderer_rect(&state->renderer, state->camera, leftAlignedP, + entity->size, v2_scale(entity->size, 0.5f), + DEGREES_TO_RADIANS(entity->rotation), NULL, + V4(1.0f, 0.8f, 1.0f, 1.0f), flags); - v2 leftAlignedP = entity->pos; - renderer_rect(&state->renderer, state->camera, leftAlignedP, V2(10, 10), - V2(0, 0), DEGREES_TO_RADIANS(entity->rotation), NULL, + v2 rightAlignedP = v2_add(leftAlignedP, entity->size); + renderer_rect(&state->renderer, state->camera, rightAlignedP, V2(4, 4), + v2_scale(pivotPoint, -1.0f), + DEGREES_TO_RADIANS(entity->rotation), NULL, V4(0.4f, 0.8f, 1.0f, 1.0f), flags); } diff --git a/src/Entity.c b/src/Entity.c index 1803841..4a77d1e 100644 --- a/src/Entity.c +++ b/src/Entity.c @@ -65,7 +65,7 @@ void entity_updateAnim(Entity *const entity, const f32 dt) char *frameName = anim->frameList[currEntityAnim->currFrame]; SubTexture texRect = asset_getAtlasSubTex(anim->atlas, frameName); - entity->size = v2_scale(texRect.rect.size, entity->scale); + entity->size = v2_scale(texRect.rect.max, entity->scale); } void entity_addAnim(AssetManager *const assetManager, Entity *const entity, diff --git a/src/Renderer.c b/src/Renderer.c index ded7d88..61785fa 100644 --- a/src/Renderer.c +++ b/src/Renderer.c @@ -339,7 +339,7 @@ void renderer_rect(Renderer *const renderer, Rect camera, v2 pos, v2 size, RenderFlags flags) { // NOTE(doyle): Bottom left and top right position of quad in world space - v2 posInCameraSpace = v2_sub(pos, camera.pos); + v2 posInCameraSpace = v2_sub(pos, camera.min); RenderTex emptyRenderTex = {0}; if (!renderTex) renderTex = &emptyRenderTex; @@ -385,7 +385,7 @@ void renderer_triangle(Renderer *const renderer, Rect camera, ARRAY_COUNT(triangleInCamSpace.points)); for (i32 i = 0; i < ARRAY_COUNT(triangleInCamSpace.points); i++) - triangleInCamSpace.points[i] = v2_sub(triangle.points[i], camera.pos); + triangleInCamSpace.points[i] = v2_sub(triangle.points[i], camera.min); RenderTex emptyRenderTex = {0}; if (!renderTex) renderTex = &emptyRenderTex; @@ -425,7 +425,7 @@ void renderer_string(Renderer *const renderer, MemoryArena_ *arena, Rect camera, Vertex *vertexList = memory_pushBytes(arena, numVertexesToAlloc * sizeof(Vertex)); - v2 posInCameraSpace = v2_sub(pos, camera.pos); + v2 posInCameraSpace = v2_sub(pos, camera.min); pos = posInCameraSpace; // TODO(doyle): Find why font is 1px off, might be arial font semantics @@ -443,9 +443,9 @@ void renderer_string(Renderer *const renderer, MemoryArena_ *arena, Rect camera, asset_getAtlasSubTex(font->atlas, &CAST(char)codepoint); v4 charTexRect = {0}; - charTexRect.vec2[0] = subTexture.rect.pos; + charTexRect.vec2[0] = subTexture.rect.min; charTexRect.vec2[1] = - v2_add(subTexture.rect.pos, subTexture.rect.size); + v2_add(subTexture.rect.min, subTexture.rect.max); flipTexCoord(&charTexRect, FALSE, TRUE); RenderTex renderTex = {tex, charTexRect}; @@ -472,78 +472,63 @@ void renderer_string(Renderer *const renderer, MemoryArena_ *arena, Rect camera, void renderer_entity(Renderer *renderer, Rect camera, Entity *entity, v2 pivotPoint, Degrees rotate, v4 color, RenderFlags flags) { - // TODO(doyle): Batch into render groups - - // NOTE(doyle): Pos + Size since the origin of an entity is it's bottom left - // corner. Add the two together so that the clipping point is the far right - // side of the entity - v2 rightAlignedP = v2_add(entity->pos, entity->hitbox); - v2 leftAlignedP = entity->pos; - if (math_pointInRect(camera, leftAlignedP) || - math_pointInRect(camera, rightAlignedP)) + Radians totalRotation = DEGREES_TO_RADIANS((entity->rotation + rotate)); + RenderTex renderTex = {0}; + if (entity->tex) { - - RenderTex renderTex = {0}; - if (entity->tex) + EntityAnim *entityAnim = &entity->animList[entity->animListIndex]; + v4 texRect = {0}; + if (entityAnim->anim) { - EntityAnim *entityAnim = &entity->animList[entity->animListIndex]; - v4 texRect = {0}; - if (entityAnim->anim) - { - Animation *anim = entityAnim->anim; - char *frameName = anim->frameList[entityAnim->currFrame]; - SubTexture subTex = - asset_getAtlasSubTex(anim->atlas, frameName); + Animation *anim = entityAnim->anim; + char *frameName = anim->frameList[entityAnim->currFrame]; + SubTexture subTex = asset_getAtlasSubTex(anim->atlas, frameName); - texRect.vec2[0] = subTex.rect.pos; - texRect.vec2[1] = v2_add(subTex.rect.pos, subTex.rect.size); - flipTexCoord(&texRect, entity->flipX, entity->flipY); - } - else - { - texRect = V4(0.0f, 0.0f, (f32)entity->tex->width, - (f32)entity->tex->height); - } - - if (entity->direction == direction_east) - { - flipTexCoord(&texRect, TRUE, FALSE); - } - - renderTex.tex = entity->tex; - renderTex.texRect = texRect; - } - - Radians totalRotation = DEGREES_TO_RADIANS((entity->rotation + rotate)); - if (entity->renderMode == rendermode_quad) - { - renderer_rect(renderer, camera, entity->pos, entity->size, - pivotPoint, totalRotation, &renderTex, - color, flags); - } - else if (entity->renderMode == rendermode_triangle) - { - TrianglePoints triangle = {0}; - - v2 entityPWithOffset = v2_add(entity->pos, entity->offset); - v2 triangleTopPoint = - V2(entityPWithOffset.x + (entity->size.w * 0.5f), - entityPWithOffset.y + entity->size.h); - - v2 triangleRightSide = - V2(entityPWithOffset.x + entity->size.w, entityPWithOffset.y); - - triangle.points[0] = entityPWithOffset; - triangle.points[1] = triangleRightSide; - triangle.points[2] = triangleTopPoint; - - renderer_triangle(renderer, camera, triangle, pivotPoint, - totalRotation, &renderTex, color, flags); + texRect.vec2[0] = subTex.rect.min; + texRect.vec2[1] = v2_add(subTex.rect.min, subTex.rect.max); + flipTexCoord(&texRect, entity->flipX, entity->flipY); } else { - ASSERT(INVALID_CODE_PATH); + texRect = V4(0.0f, 0.0f, (f32)entity->tex->width, + (f32)entity->tex->height); } + + if (entity->direction == direction_east) + { + flipTexCoord(&texRect, TRUE, FALSE); + } + + renderTex.tex = entity->tex; + renderTex.texRect = texRect; + } + + if (entity->renderMode == rendermode_quad) + { + renderer_rect(renderer, camera, entity->pos, entity->size, pivotPoint, + totalRotation, &renderTex, color, flags); + } + else if (entity->renderMode == rendermode_triangle) + { + TrianglePoints triangle = {0}; + + v2 entityPWithOffset = v2_sub(entity->pos, entity->offset); + v2 triangleTopPoint = V2(entityPWithOffset.x + (entity->size.w * 0.5f), + entityPWithOffset.y + entity->size.h); + + v2 triangleRightSide = + V2(entityPWithOffset.x + entity->size.w, entityPWithOffset.y); + + triangle.points[0] = entityPWithOffset; + triangle.points[1] = triangleRightSide; + triangle.points[2] = triangleTopPoint; + + renderer_triangle(renderer, camera, triangle, pivotPoint, totalRotation, + &renderTex, color, flags); + } + else + { + ASSERT(INVALID_CODE_PATH); } } diff --git a/src/UserInterface.c b/src/UserInterface.c index 587ed59..9c00c1d 100644 --- a/src/UserInterface.c +++ b/src/UserInterface.c @@ -35,7 +35,7 @@ i32 userInterface_button(UiState *const uiState, MemoryArena_ *const arena, #if 0 // Draw shadow - renderer_staticRect(renderer, v2_add(V2(1, 1), rect.pos), rect.size, + renderer_staticRect(renderer, v2_add(V2(1, 1), rect.min), rect.size, V2(0, 0), 0, renderTex, V4(0, 0, 0, 1)); #endif @@ -68,29 +68,29 @@ i32 userInterface_button(UiState *const uiState, MemoryArena_ *const arena, { // Draw outline renderer_staticRect(renderer, - v2_add(V2(-2, -2), v2_add(buttonOffset, rect.pos)), - v2_add(V2(4, 4), rect.size), V2(0, 0), 0, &renderTex, + v2_add(V2(-2, -2), v2_add(buttonOffset, rect.min)), + v2_add(V2(4, 4), rect.max), V2(0, 0), 0, &renderTex, buttonColor, 0); } - renderer_staticRect(renderer, v2_add(buttonOffset, rect.pos), rect.size, + renderer_staticRect(renderer, v2_add(buttonOffset, rect.min), rect.max, V2(0, 0), 0, &renderTex, buttonColor, 0); if (label) { v2 labelDim = asset_stringDimInPixels(font, label); - v2 labelPos = rect.pos; + v2 labelPos = rect.min; // Initially position the label to half the width of the button - labelPos.x += (rect.size.w * 0.5f); + labelPos.x += (rect.max.w * 0.5f); // Move the label pos back half the length of the string (i.e. // center it) labelPos.x -= (CAST(f32) labelDim.w * 0.5f); - if (labelDim.h < rect.size.h) + if (labelDim.h < rect.max.h) { - labelPos.y += (rect.size.h * 0.5f); + labelPos.y += (rect.max.h * 0.5f); labelPos.y -= (CAST(f32)labelDim.h * 0.5f); } @@ -168,13 +168,13 @@ i32 userInterface_scrollbar(UiState *const uiState, if (uiState->kbdItem == id) { // Draw outline - renderer_staticRect(renderer, v2_add(V2(-2, -2), scrollBarRect.pos), - v2_add(V2(4, 4), scrollBarRect.size), V2(0, 0), 0, + renderer_staticRect(renderer, v2_add(V2(-2, -2), scrollBarRect.min), + v2_add(V2(4, 4), scrollBarRect.max), V2(0, 0), 0, &renderTex, V4(1, 0, 0, 1), 0); } // Render scroll bar background - renderer_staticRect(renderer, scrollBarRect.pos, scrollBarRect.size, + renderer_staticRect(renderer, scrollBarRect.min, scrollBarRect.max, V2(0, 0), 0, &renderTex, V4(0.75f, 0.5f, 0.5f, 1), 0); // Render scroll bar slider @@ -183,8 +183,8 @@ i32 userInterface_scrollbar(UiState *const uiState, f32 sliderPercentageOffset = (CAST(f32) *value / CAST(f32) maxValue); f32 sliderYOffsetToBar = - (scrollBarRect.size.h - sliderSize.h) * sliderPercentageOffset; - v2 sliderPos = v2_add(scrollBarRect.pos, V2(0, sliderYOffsetToBar)); + (scrollBarRect.max.h - sliderSize.h) * sliderPercentageOffset; + v2 sliderPos = v2_add(scrollBarRect.min, V2(0, sliderYOffsetToBar)); if (uiState->hotItem == id || uiState->activeItem == id) sliderColor = V4(1.0f, 0, 0, 1); @@ -228,16 +228,16 @@ i32 userInterface_scrollbar(UiState *const uiState, if (uiState->activeItem == id) { - f32 mouseYRelToRect = input.mouseP.y - scrollBarRect.pos.y; + f32 mouseYRelToRect = input.mouseP.y - scrollBarRect.min.y; // Bounds check if (mouseYRelToRect < 0) mouseYRelToRect = 0; - else if (mouseYRelToRect > scrollBarRect.size.h) - mouseYRelToRect = scrollBarRect.size.h; + else if (mouseYRelToRect > scrollBarRect.max.h) + mouseYRelToRect = scrollBarRect.max.h; f32 newSliderPercentOffset = - (CAST(f32) mouseYRelToRect / scrollBarRect.size.h); + (CAST(f32) mouseYRelToRect / scrollBarRect.max.h); i32 newValue = CAST(i32)(newSliderPercentOffset * CAST(f32)maxValue); if (newValue != *value) @@ -282,27 +282,27 @@ i32 userInterface_textField(UiState *const uiState, MemoryArena_ *const arena, if (uiState->kbdItem == id) { // Draw outline - renderer_staticRect(renderer, v2_add(V2(-2, -2), rect.pos), - v2_add(V2(4, 4), rect.size), V2(0, 0), 0, + renderer_staticRect(renderer, v2_add(V2(-2, -2), rect.min), + v2_add(V2(4, 4), rect.max), V2(0, 0), 0, &renderTex, V4(1.0f, 0, 0, 1), 0); } // Render text field - renderer_staticRect(renderer, rect.pos, rect.size, V2(0, 0), 0, + renderer_staticRect(renderer, rect.min, rect.max, V2(0, 0), 0, &renderTex, V4(0.75f, 0.5f, 0.5f, 1), 0); if (uiState->activeItem == id || uiState->hotItem == id) { - renderer_staticRect(renderer, rect.pos, rect.size, V2(0, 0), 0, + renderer_staticRect(renderer, rect.min, rect.max, V2(0, 0), 0, &renderTex, V4(0.75f, 0.75f, 0.0f, 1), 0); } else { - renderer_staticRect(renderer, rect.pos, rect.size, V2(0, 0), 0, + renderer_staticRect(renderer, rect.min, rect.max, V2(0, 0), 0, &renderTex, V4(0.5f, 0.5f, 0.5f, 1), 0); } - v2 strPos = rect.pos; + v2 strPos = rect.min; renderer_staticString(renderer, arena, font, string, strPos, V2(0, 0), 0, V4(0, 0, 0, 1), 0); @@ -365,10 +365,10 @@ i32 userInterface_window(UiState *const uiState, MemoryArena_ *const arena, Rect rect = window->rect; RenderTex nullRenderTex = renderer_createNullRenderTex(assetManager); - renderer_staticRect(renderer, rect.pos, rect.size, V2(0, 0), 0, + renderer_staticRect(renderer, rect.min, rect.max, V2(0, 0), 0, &nullRenderTex, V4(0.25f, 0.25f, 0.5f, 0.5f), 0); - v2 menuTitleP = v2_add(rect.pos, V2(0, rect.size.h - 10)); + v2 menuTitleP = v2_add(rect.min, V2(0, rect.max.h - 10)); renderer_staticString(renderer, arena, font, window->title, menuTitleP, V2(0, 0), 0, V4(0, 0, 0, 1), 0); @@ -444,11 +444,11 @@ i32 userInterface_window(UiState *const uiState, MemoryArena_ *const arena, for (i32 i = 0; i < window->numChildUiItems; i++) { UiItem *childUi = &window->childUiItems[i]; - childUi->rect.pos = v2_add(deltaP, childUi->rect.pos); + childUi->rect.min = v2_add(deltaP, childUi->rect.min); } DEBUG_PUSH_VAR("Delta Pos %4.2f, %4.2f", deltaP, "v2"); - window->rect.pos = v2_add(deltaP, window->rect.pos); + window->rect.min = v2_add(deltaP, window->rect.min); } else { diff --git a/src/include/Dengine/Math.h b/src/include/Dengine/Math.h index 5d75a94..f01734b 100644 --- a/src/include/Dengine/Math.h +++ b/src/include/Dengine/Math.h @@ -70,8 +70,8 @@ typedef union v4 typedef struct Rect { - v2 pos; - v2 size; + v2 min; + v2 max; } Rect; INTERNAL inline v2 V2i(const i32 x, const i32 y) @@ -319,11 +319,11 @@ INTERNAL inline v4 mat4_mul_v4(const mat4 a, const v4 b) INTERNAL inline b32 math_pointInRect(Rect rect, v2 point) { b32 outsideOfRectX = FALSE; - if (point.x < rect.pos.x || point.x > (rect.pos.x + rect.size.w)) + if (point.x < rect.min.x || point.x > (rect.min.x + rect.max.w)) outsideOfRectX = TRUE; b32 outsideOfRectY = FALSE; - if (point.y < rect.pos.y || point.y > (rect.pos.y + rect.size.h)) + if (point.y < rect.min.y || point.y > (rect.min.y + rect.max.h)) outsideOfRectY = TRUE; if (outsideOfRectX || outsideOfRectY) return FALSE;