aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authornathansmithsmith <nathansmith7@mailfence.com>2023-09-24 00:00:00 -0600
committernathansmithsmith <nathansmith7@mailfence.com>2023-09-24 00:00:00 -0600
commit6c2037ad2c6303545cc051120c00663def468a2a (patch)
tree3c10e229c08305c634e3207a8704d8e514e072d1 /src
parent4f4e5d1f9fc85ab0af46831bc6a0af6555d00213 (diff)
Made camera system handle more cameras easier
Diffstat (limited to 'src')
-rw-r--r--src/cameras.c40
-rw-r--r--src/cameras.h26
-rw-r--r--src/game.c2
-rw-r--r--src/game.h4
-rw-r--r--src/gameScreen.c8
-rw-r--r--src/gameScreen.h2
-rw-r--r--src/playerCamera.c29
-rw-r--r--src/playerCamera.h11
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
diff --git a/src/game.c b/src/game.c
index d4deff4..b552b73 100644
--- a/src/game.c
+++ b/src/game.c
@@ -18,7 +18,7 @@ void initGame(Game * game) {
initMainMenu(game);
// Camera.
- initPlayerCamera(&game->playerCamera);
+ initCameras(game, game->cameras);
// Game screen.
initGameScreen(&game->gameScreen);
diff --git a/src/game.h b/src/game.h
index 063a1cc..7149e4d 100644
--- a/src/game.h
+++ b/src/game.h
@@ -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