diff options
author | nathansmithsmith <nathansmith7@mailfence.com> | 2023-09-24 00:00:00 -0600 |
---|---|---|
committer | nathansmithsmith <nathansmith7@mailfence.com> | 2023-09-24 00:00:00 -0600 |
commit | 6c2037ad2c6303545cc051120c00663def468a2a (patch) | |
tree | 3c10e229c08305c634e3207a8704d8e514e072d1 | |
parent | 4f4e5d1f9fc85ab0af46831bc6a0af6555d00213 (diff) |
Made camera system handle more cameras easier
-rw-r--r-- | src/cameras.c | 40 | ||||
-rw-r--r-- | src/cameras.h | 26 | ||||
-rw-r--r-- | src/game.c | 2 | ||||
-rw-r--r-- | src/game.h | 4 | ||||
-rw-r--r-- | src/gameScreen.c | 8 | ||||
-rw-r--r-- | src/gameScreen.h | 2 | ||||
-rw-r--r-- | src/playerCamera.c | 29 | ||||
-rw-r--r-- | src/playerCamera.h | 11 |
8 files changed, 77 insertions, 45 deletions
diff --git a/src/cameras.c b/src/cameras.c new file mode 100644 index 0000000..6a960f5 --- /dev/null +++ b/src/cameras.c @@ -0,0 +1,40 @@ +#include "cameras.h" +#include "game.h" +#include "world.h" + +// First person camera indeed. +void initFirstPersonCamera(Game * game, Camera3D * camera) { + *camera = (Camera3D){ + .fovy = 90.0, + .projection = CAMERA_PERSPECTIVE + }; +} + +void updateFirstPersonCamera(Game * game, Camera3D * camera) { + Entity * player = getEntityFromWorld(game->world, 0); + Vector3 direction = Vector3RotateByQuaternion((Vector3){0.0, 0.0, 1.0}, player->rotation); + + camera->position = Vector3Add(player->position, Vector3Scale(direction, CAMERA_DIS)); + camera->target = Vector3Add(camera->position, direction); + camera->up = Vector3RotateByQuaternion((Vector3){0.0, 1.0, 0.0}, player->rotation); +} + +// Callbacks indeed. +const CameraInitCb cameraInitCallbacks[CAMERA_COUNT] = { + initFirstPersonCamera +}; + +const CameraCb cameraCallbacks[CAMERA_COUNT] = { + updateFirstPersonCamera +}; + +void initCameras(Game * game, Cameras cameras) { + int i; + + for (i = 0; i < CAMERA_COUNT; ++i) + cameraInitCallbacks[i](game, &cameras[i]); +} + +void runCameraUpdate(Game * game, Cameras cameras, CameraId id) { + cameraCallbacks[id](game, &cameras[id]); +} diff --git a/src/cameras.h b/src/cameras.h new file mode 100644 index 0000000..c892ee1 --- /dev/null +++ b/src/cameras.h @@ -0,0 +1,26 @@ +#include "gameCommon.h" + +#ifndef CAMERAS_H +#define CAMERAS_H + +#define CAMERA_DIS 5.0 +#define CAMERA_COUNT 1 + +// Each camera has a game loop callback and a init callback. +typedef void (*CameraInitCb)(Game * game, Camera3D * camera); +typedef void (*CameraCb)(Game * game, Camera3D * camera); + +extern const CameraInitCb cameraInitCallbacks[CAMERA_COUNT]; +extern const CameraCb cameraCallbacks[CAMERA_COUNT]; + +typedef enum CameraId { + FIRST_PERSON_CAMERA +} CameraId; + +// A array of the cameras. +typedef Camera3D Cameras[CAMERA_COUNT]; + +void initCameras(Game * game, Cameras cameras); +void runCameraUpdate(Game * game, Cameras cameras, CameraId id); + +#endif @@ -18,7 +18,7 @@ void initGame(Game * game) { initMainMenu(game); // Camera. - initPlayerCamera(&game->playerCamera); + initCameras(game, game->cameras); // Game screen. initGameScreen(&game->gameScreen); @@ -1,7 +1,7 @@ #include "gameCommon.h" #include "mainMenu.h" #include "gameScreen.h" -#include "playerCamera.h" +#include "cameras.h" #include "entity.h" #include "assets.h" #include "world.h" @@ -20,7 +20,7 @@ typedef struct Game { ScreenId screenId; MainMenu mainMenu; GameScreen gameScreen; - Camera3D playerCamera; + Cameras cameras; Assets assets; World world; Settings settings; diff --git a/src/gameScreen.c b/src/gameScreen.c index 0ba7a6a..9b14c00 100644 --- a/src/gameScreen.c +++ b/src/gameScreen.c @@ -16,6 +16,8 @@ void initGameScreenGui(GameScreen * gameScreen) { // Radar indeed. initRadar(&gameScreen->radar); + + gameScreen->mainCamera = FIRST_PERSON_CAMERA; } void initGameScreen(GameScreen * gameScreen) { @@ -87,6 +89,8 @@ void drawGameScreenGui(Game * game) { } void updateGameScreen(Game * game) { + GameScreen * gameScreen = &game->gameScreen; + ClearBackground(BLACK); drawGameScreenGui(game); @@ -95,10 +99,10 @@ void updateGameScreen(Game * game) { updateWorld(&game->world, game); // Camera. - updatePlayerCamera(&game->playerCamera, game); + runCameraUpdate(game, game->cameras, gameScreen->mainCamera); // Draw. - BeginMode3D(game->playerCamera); + BeginMode3D(game->cameras[gameScreen->mainCamera]); DrawGrid(50, 25.0); diff --git a/src/gameScreen.h b/src/gameScreen.h index 9e0f99a..f12b8ea 100644 --- a/src/gameScreen.h +++ b/src/gameScreen.h @@ -1,6 +1,7 @@ #include "gameCommon.h" #include "gyroscope.h" #include "radar.h" +#include "cameras.h" #ifndef GAME_SCREEN_H #define GAME_SCREEN_H @@ -12,6 +13,7 @@ typedef struct GameScreen { Vector2 infoText; Gyroscope gyroscope; Radar radar; + CameraId mainCamera; } GameScreen; void initGameScreen(GameScreen * gameScreen); diff --git a/src/playerCamera.c b/src/playerCamera.c deleted file mode 100644 index 096ee36..0000000 --- a/src/playerCamera.c +++ /dev/null @@ -1,29 +0,0 @@ -#include "playerCamera.h" -#include "game.h" -#include "world.h" - -void initPlayerCamera(Camera3D * camera) { - *camera = (Camera3D){ - .fovy = 90.0, - .projection = CAMERA_PERSPECTIVE - }; -} - -void updatePlayerCamera(Camera3D * camera, Game * game) { - Entity * player = getEntityFromWorld(game->world, 0); - - Vector3 direction = Vector3RotateByQuaternion((Vector3){0.0, 0.0, 1.0}, player->rotation); - - // Position. - camera->position = Vector3Add(player->position, Vector3Scale(direction, CAMERA_DIS)); - - // Target. - camera->target = Vector3Add(camera->position, direction); - - // Up. - camera->up = Vector3RotateByQuaternion((Vector3){0.0, 1.0, 0.0}, player->rotation); - - // camera->target = player->position; - // camera->position = (Vector3){10.0, 10.0, 10.0}; - // camera->up = (Vector3){0.0, 1.0, 0.0}; -} diff --git a/src/playerCamera.h b/src/playerCamera.h deleted file mode 100644 index 87663d4..0000000 --- a/src/playerCamera.h +++ /dev/null @@ -1,11 +0,0 @@ -#include "gameCommon.h" - -#ifndef PLAYER_CAMERA_H -#define PLAYER_CAMERA_H - -#define CAMERA_DIS 5.0 - -void initPlayerCamera(Camera3D * camera); -void updatePlayerCamera(Camera3D * camera, Game * game); - -#endif |