diff --git a/.gitignore b/.gitignore index f25181b..c094b4f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ build/ code/compile_commands.json code/.cache +.vscode diff --git a/code/first.c b/code/first.c index 6491283..ea0c706 100644 --- a/code/first.c +++ b/code/first.c @@ -20,9 +20,10 @@ #include "game/impl/npc.c" #include "game/testnavmesh.h" -int main(int argc, char **argv) { - (void) argc; - (void) argv; +int main(int argc, char **argv) +{ + (void)argc; + (void)argv; if (!SDL_Init(SDL_INIT_VIDEO)) { @@ -59,7 +60,7 @@ int main(int argc, char **argv) { camera->fov = 60.0f; camera->nearp = 0.01f; - camera->farp = 1000.0f; + camera->farp = 1000.0f; game->draw.camera = camera; game->camera.p.z = 200; @@ -84,21 +85,21 @@ int main(int argc, char **argv) { npc1->collision.size.y = 10; } - NPC *npc2 = &world->npcs[1]; - npc2->collision.pos.x = 15; - npc2->collision.pos.y = 15; - npc2->collision.size.x = 10; - npc2->collision.size.y = 10; - npc2->name = S("James"); - npc2->mode = NPC_ACTION_WAITING; - npc2->waitTime = 0; - npc2->maxWaitTime = 10; - npc2->currentNavNode = 0; + NPC *npc2 = &world->npcs[1]; + npc2->collision.pos.x = 15; + npc2->collision.pos.y = 15; + npc2->collision.size.x = 10; + npc2->collision.size.y = 10; + npc2->name = S("James"); + npc2->mode = NPC_ACTION_WAITING; + npc2->waitTime = 0; + npc2->maxWaitTime = 10; + npc2->currentNavNode = 0; - world->navMesh = &TestNavMesh; - world->npcPOI[0] = 100; - world->player.pos.x = 0; - world->player.pos.y = 0; + world->navMesh = &TestNavMesh; + world->npcPOI[0] = 100; + world->player.pos.x = 0; + world->player.pos.y = 0; } bool running = true; @@ -130,15 +131,15 @@ int main(int argc, char **argv) { } ProcessEvents(&e, game->world); } - UpdateWorld(1.0/60.0, game->world); + UpdateWorld(1.0 / 60.0, game->world); int w, h; SDL_GetWindowSizeInPixels(window, &w, &h); - game->draw.window_width = w; + game->draw.window_width = w; game->draw.window_height = h; - G_CalculateCamera(&game->camera, (F32) w / (F32) h); + G_CalculateCamera(&game->camera, (F32)w / (F32)h); Vk_Frame *frame = Vk_FrameBegin(window); VkCommandBuffer cmd = frame->cmd; @@ -150,28 +151,28 @@ int main(int argc, char **argv) { clear_colour.color.float32[3] = 1.0f; VkRenderingAttachmentInfo colour_attachment = {0}; - colour_attachment.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO; - colour_attachment.imageView = vk.swapchain.views[frame->image]; + colour_attachment.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO; + colour_attachment.imageView = vk.swapchain.views[frame->image]; colour_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - colour_attachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; - colour_attachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE; - colour_attachment.clearValue = clear_colour; + colour_attachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; + colour_attachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE; + colour_attachment.clearValue = clear_colour; VkRenderingInfo rendering_info = {0}; - rendering_info.sType = VK_STRUCTURE_TYPE_RENDERING_INFO; - rendering_info.renderArea = (VkRect2D) { 0, 0, w, h }; - rendering_info.layerCount = 1; + rendering_info.sType = VK_STRUCTURE_TYPE_RENDERING_INFO; + rendering_info.renderArea = (VkRect2D){0, 0, w, h}; + rendering_info.layerCount = 1; rendering_info.colorAttachmentCount = 1; - rendering_info.pColorAttachments = &colour_attachment; + rendering_info.pColorAttachments = &colour_attachment; vk.CmdBeginRendering(cmd, &rendering_info); D_Begin(&game->draw, frame, D_MAX_RECTS); RenderWorld(game->world, &game->draw); - D_Rect(&game->draw, 0.0f, 0.0f, .texture = 1); + D_Rect(&game->draw, 0.0f, 0.0f, .texture = 1); D_Rect(&game->draw, -8.0f, 0.0f, .texture = 2, .scale = 2.0f); - D_Rect(&game->draw, 6.0f, 0.0f, .texture = 3); + D_Rect(&game->draw, 6.0f, 0.0f, .texture = 3); D_End(&game->draw, frame); diff --git a/code/game/aabb.h b/code/game/aabb.h index e61ba60..9344521 100644 --- a/code/game/aabb.h +++ b/code/game/aabb.h @@ -3,15 +3,15 @@ #include "../core/types.h" #include "../core/macros.h" - typedef struct AABB AABB; -struct AABB { +struct AABB +{ V2f pos; V2f size; }; - function bool AABB_Collide(AABB a, AABB b); function bool AABB_Point(AABB a, V2f v); +function bool AABB_Slab(V2f origin, V2f point, AABB a); -#endif // LD_GAME_AABB_H_ +#endif // LD_GAME_AABB_H_ diff --git a/code/game/impl/aabb.c b/code/game/impl/aabb.c index c1d1fba..dfeb99b 100644 --- a/code/game/impl/aabb.c +++ b/code/game/impl/aabb.c @@ -1,15 +1,36 @@ #include "game/aabb.h" -#include "core/types.h" +#include -bool AABB_Collide(AABB a, AABB b) { +bool AABB_Collide(AABB a, AABB b) +{ bool collision_x = a.pos.x + a.size.x >= b.pos.x && b.pos.x + b.size.x >= a.pos.x; bool collision_y = a.pos.y + a.size.x >= b.pos.y && b.pos.y + b.size.y >= a.pos.y; return collision_x && collision_y; } -bool AABB_Point(AABB a, V2f v) { +bool AABB_Point(AABB a, V2f v) +{ bool collision_x = a.pos.x + a.size.x >= v.x && a.pos.x <= v.x; bool collision_y = a.pos.x + a.size.y >= v.y && a.pos.y <= v.y; return collision_x && collision_y; } +bool AABB_Slab(V2f origin, V2f point, AABB a) +{ + V2f start = a.pos; + V2f finish = {a.pos.x + a.size.x, a.pos.y + a.size.y}; + V2f invdirection = {1 / (origin.x - point.x), 1 / (origin.y - point.y)}; + // x + F32 tLow = (start.x - origin.x) * invdirection.x; + F32 tHigh = (finish.x - origin.x) * invdirection.x; + F32 tMin = Min(tLow, tHigh); + F32 tMax = Max(tLow, tHigh); + // y + tLow = (start.y - origin.y) * invdirection.y; + tHigh = (finish.y - origin.y) * invdirection.y; + + tMin = Max(tMin, Min(tLow, tHigh)); + tMax = Min(tMax, Max(tLow, tHigh)); + + return tMax >= tMin; +} diff --git a/code/game/impl/nav.c b/code/game/impl/nav.c index 0e6c416..8953898 100644 --- a/code/game/impl/nav.c +++ b/code/game/impl/nav.c @@ -6,7 +6,8 @@ #define MAX_UNFINISHED 128 typedef struct navSearchNodeState navSearchNodeState; -struct navSearchNodeState{ +struct navSearchNodeState +{ bool visited; F64 distance; U32 shortest; @@ -14,37 +15,45 @@ struct navSearchNodeState{ }; typedef struct navSearchState navSearchState; -struct navSearchState{ +struct navSearchState +{ navSearchNodeState nodeStates[NAV_MAX_NODES]; }; -navSearchState initState(U32 start, U32 meshSize) { - navSearchState state = {}; - for(U32 i = 0; i < meshSize; i++) { - state.nodeStates[i].visited = false; +navSearchState initState(U32 start, U32 meshSize) +{ + navSearchState state; + for (U32 i = 0; i < meshSize; i++) + { + state.nodeStates[i].visited = false; state.nodeStates[i].addedToUnvisited = false; - state.nodeStates[i].distance = U64_MAX; - state.nodeStates[i].shortest = 0; + state.nodeStates[i].distance = U64_MAX; + state.nodeStates[i].shortest = 0; } state.nodeStates[start].distance = 0; return state; } -U32 getLowestState(U32 unfinishedIndexes[128], U32 unfinishedCount, navSearchState state, U32 *offset) { - U32 lowest = U32_MAX; +U32 getLowestState(U32 unfinishedIndexes[128], U32 unfinishedCount, navSearchState state, U32 *offset) +{ + U32 lowest = U32_MAX; U32 lowestI = U32_MAX; bool startFound = false; - for(U32 i = *offset; i < unfinishedCount; i++) { + for (U32 i = *offset; i < unfinishedCount; i++) + { navSearchNodeState checkNode = state.nodeStates[unfinishedIndexes[i]]; - if(checkNode.visited) { - if(!startFound) { + if (checkNode.visited) + { + if (!startFound) + { *offset = i; } continue; } startFound = true; - if (lowest > checkNode.distance) { - lowest = cast(U32) checkNode.distance; + if (lowest > checkNode.distance) + { + lowest = cast(U32) checkNode.distance; lowestI = unfinishedIndexes[i]; } } @@ -81,7 +90,8 @@ NavPath Nav_Path(NavMesh *mesh, U32 start, U32 end) { testNode->distance = distance; testNode->shortest = lowestNodeIndex; } - if(!testNode->addedToUnvisited) { + if (!testNode->addedToUnvisited) + { unfinishedIndexes[unfinishedCount] = connection->NodeIndex; unfinishedCount++; testNode->addedToUnvisited = true; @@ -89,13 +99,15 @@ NavPath Nav_Path(NavMesh *mesh, U32 start, U32 end) { } state.nodeStates[lowestNodeIndex].visited = true; lowestNodeIndex = getLowestState(unfinishedIndexes, unfinishedCount, state, &unfinishedOffset); - if(lowestNodeIndex == end) { + if (lowestNodeIndex == end) + { found = true; } } NavPath res_path = {0}; U32 index = end; - while(index!=start) { + while (index != start) + { res_path.indexes[res_path.nodeCount] = index; res_path.nodeCount++; index = state.nodeStates[index].shortest; diff --git a/code/game/impl/player.c b/code/game/impl/player.c index ae8ded7..043a729 100644 --- a/code/game/impl/player.c +++ b/code/game/impl/player.c @@ -4,23 +4,34 @@ void PlayerUpdate(SDL_Event *event, Player *player) { - SDL_KeyboardEvent key = event->key; - switch(key.key) { - case SDLK_W: { - player->pos.y += 10; - break; - } - case SDLK_A: { - player->pos.x -= 10; - break; - } - case SDLK_D: { - player->pos.x += 10; - break; - } - case SDLK_S: { - player->pos.y -= 10; - break; - } - } + SDL_KeyboardEvent key = event->key; + SDL_MouseButtonEvent mouseBtn = event->button; + switch (key.key) + { + case SDLK_W: + { + player->pos.y += 10; + break; + } + case SDLK_A: + { + player->pos.x -= 10; + break; + } + case SDLK_D: + { + player->pos.x += 10; + break; + } + case SDLK_S: + { + player->pos.y -= 10; + break; + } + } + if (mouseBtn.clicks == 1) + { + // shooting + player->bulletsLoaded -= 1; + } } diff --git a/code/game/impl/world.c b/code/game/impl/world.c index f168744..a06fd6b 100644 --- a/code/game/impl/world.c +++ b/code/game/impl/world.c @@ -3,17 +3,21 @@ #include "../player.h" #include -void UpdateWorld(F32 delta, World *world) { +void UpdateWorld(F32 delta, World *world) +{ UpdateNPCs(delta, world); } -void UpdateNPCs(F32 delta, World *world) { - for(U32 i = 0; i < world->npcCount; i++) { +void UpdateNPCs(F32 delta, World *world) +{ + for (U32 i = 0; i < world->npcCount; i++) + { updateNPC(delta, &world->npcs[i], world); } } -void ProcessEvents(SDL_Event *event, World *world) { +void ProcessEvents(SDL_Event *event, World *world) +{ PlayerUpdate(event, &world->player); } diff --git a/code/game/player.h b/code/game/player.h index 8067026..fddf014 100644 --- a/code/game/player.h +++ b/code/game/player.h @@ -10,6 +10,7 @@ typedef struct Player Player; struct Player { V2f pos; + U32 bulletsLoaded; }; function void PlayerUpdate(SDL_Event *event, Player *player);