summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDrNuget <drnuget@outlook.com>2026-01-10 06:41:13 +0200
committerDrNuget <drnuget@outlook.com>2026-01-10 06:41:13 +0200
commit3a3b64bedc47a0795358c6be7062160f52f2fc3b (patch)
treeeeaebee9ad6bab1a91e46ed8e7f682ac404e16e2 /src
parent7f3aa1cff755d21d972457b05c140cf465b9fa19 (diff)
downloadmnm-3a3b64bedc47a0795358c6be7062160f52f2fc3b.tar.gz
added FPS camera movement and probably some other changes
Diffstat (limited to 'src')
-rw-r--r--src/engine/M_block.h4
-rw-r--r--src/engine/M_camera.c62
-rw-r--r--src/engine/M_camera.h15
-rw-r--r--src/engine/M_chunk.c20
-rw-r--r--src/engine/M_game.c22
-rw-r--r--src/engine/M_game.h6
-rw-r--r--src/engine/M_main.c16
-rw-r--r--src/engine/M_object.c9
-rw-r--r--src/engine/M_object.h15
-rw-r--r--src/engine/M_player.c1
-rw-r--r--src/engine/M_render.c12
-rw-r--r--src/engine/M_render.h2
12 files changed, 138 insertions, 46 deletions
diff --git a/src/engine/M_block.h b/src/engine/M_block.h
index 852830c..296eb88 100644
--- a/src/engine/M_block.h
+++ b/src/engine/M_block.h
@@ -3,6 +3,10 @@
//#include "M_types.ḥ"
#include "M_object.h"
+enum M_DefaultBlockTypes {
+ M_BLOCK_AIR = 0
+};
+
typedef struct {
unsigned short type;
} M_Block;
diff --git a/src/engine/M_camera.c b/src/engine/M_camera.c
index 58414a7..f28d22f 100644
--- a/src/engine/M_camera.c
+++ b/src/engine/M_camera.c
@@ -3,28 +3,48 @@
void M_initCamera(M_Camera *camera, vec3 up)
{
glm_vec3_zero(camera->pos);
- glm_vec3_copy(
- up,
- camera->up
- );
- glm_vec3_copy(
- (vec3){0.0f, 0.0f, -1.0f},
- camera->direction
- );
+ switch (camera->type) {
+ case M_CAMERA_FPS:
+ camera->yaw = 0.0f;
+ camera->pitch = 0.0f;
+ camera->roll = 0.0f;
+ break;
+ case M_CAMERA_REGULAR:
+ default:
+ glm_vec3_copy(
+ up,
+ camera->up
+ );
+ glm_vec3_copy(
+ (vec3){0.0f, 0.0f, -1.0f},
+ camera->direction
+ );
+ break;
+ }
}
-inline void M_cameraViewMatrix(M_Camera* camera)
+inline void M_cameraViewMatrix(M_Camera *camera)
{
- vec3 target;
- glm_vec3_add(
- camera->pos,
- camera->direction,
- target
- );
- glm_lookat(
- camera->pos,
- target,
- camera->up,
- camera->view_matrix
- );
+ switch (camera->type) {
+ case M_CAMERA_REGULAR:
+ vec3 target;
+ glm_vec3_add(
+ camera->pos,
+ camera->direction,
+ target
+ );
+ glm_lookat(
+ camera->pos,
+ target,
+ camera->up,
+ camera->view_matrix
+ );
+ break;
+ case M_CAMERA_FPS:
+ glm_mat4_identity(camera->view_matrix);
+ glm_translate(camera->view_matrix, camera->pos);
+ glm_rotate_x(camera->view_matrix, camera->pitch, camera->view_matrix);
+ glm_rotate_y(camera->view_matrix, camera->yaw, camera->view_matrix);
+ break;
+ }
}
diff --git a/src/engine/M_camera.h b/src/engine/M_camera.h
index 4663a94..074bff5 100644
--- a/src/engine/M_camera.h
+++ b/src/engine/M_camera.h
@@ -4,15 +4,30 @@
#include <cglm/mat4.h>
#include <cglm/vec3.h>
+enum M_CameraType {
+ M_CAMERA_REGULAR = 0,
+ M_CAMERA_FPS
+};
+
typedef struct {
vec3 pos;
vec3 direction;
vec3 up;
+ float yaw, pitch, roll;
+
+ unsigned short type;
+
mat4 view_matrix;
} M_Camera;
+typedef struct {
+ vec3 pos;
+
+ mat4 view_matrix;
+} M_FPS_Camera;
+
void M_initCamera(M_Camera *camera, vec3 up);
//Generates the M_Camera's view matrix required for rendering
diff --git a/src/engine/M_chunk.c b/src/engine/M_chunk.c
index 5c120f5..2227ee9 100644
--- a/src/engine/M_chunk.c
+++ b/src/engine/M_chunk.c
@@ -5,9 +5,15 @@ void M_generateChunk(M_Chunk *chunk)
for (int x=0;x<M_CHUNK_SIZE;x++)
for (int y=0;y<M_CHUNK_SIZE;y++)
for (int z=0;z<M_CHUNK_SIZE;z++) {
- M_Block block;
- M_createBlock(&block, 0);
- chunk->blocks[x][y][z] = block;
+ if (x==M_CHUNK_SIZE) {
+ M_Block block;
+ M_createBlock(&block, 1);
+ chunk->blocks[x][y][z] = block;
+ } else {
+ M_Block block;
+ M_createBlock(&block, M_BLOCK_AIR);
+ chunk->blocks[x][y][z] = block;
+ }
}
}
@@ -17,8 +23,10 @@ void M_renderChunk(M_Game *game, M_Chunk *chunk)
for (int y=0;y<M_CHUNK_SIZE;y++)
for (int z=0;z<M_CHUNK_SIZE;z++) {
M_Block block = chunk->blocks[x][y][z];
- M_Object *block_object = &game->block_atlas.blocks[block.type].obj;
- M_moveObject(block_object, (vec3){(float)x, (float)y-32, (float)z});
- M_drawObject(&game->render_info, &game->player.camera, block_object);
+ if (block.type != M_BLOCK_AIR) {
+ M_Object *block_object = &game->block_atlas.blocks[block.type].obj;
+ M_moveObject(block_object, (vec3){(float)x, (float)y-32, (float)z});
+ M_drawObject(&game->render_info, &game->player.camera, block_object);
+ }
}
}
diff --git a/src/engine/M_game.c b/src/engine/M_game.c
index 3c76d96..6295f51 100644
--- a/src/engine/M_game.c
+++ b/src/engine/M_game.c
@@ -15,6 +15,8 @@ int M_initGame(M_Game *game, const char *window_title)
game->window_height,
SDL_WINDOW_OPENGL
);
+ SDL_SetWindowRelativeMouseMode(game->window, 1);
+
M_setupProjection(90.0f, ((float)game->window_width)/((float)game->window_height), &game->render_info);
game->block_atlas = M_createBlockAtlas();
@@ -33,7 +35,9 @@ int M_initGame(M_Game *game, const char *window_title)
return 1;
}
- game->event_handler = SDL_CreateThread(M_handleEvents, "eventHandler", (void*)game);
+ game->render_info.global_models = malloc(10*sizeof(M_ViewModel));
+
+ game->render_info.global_models[0] = M_createCube();
glClearColor(0.0f, 0.25f, 0.5f, 1.0f);
@@ -44,23 +48,27 @@ int M_initGame(M_Game *game, const char *window_title)
int M_killGame(M_Game *game)
{
- SDL_WaitThread(game->event_handler, NULL);
+ free(game->render_info.global_models);
SDL_Quit();
return 0;
}
-int SDLCALL M_handleEvents(void* arg)
+int M_handleEvents(M_Game *game)
{
- M_Game *game = arg;
SDL_Event event;
- while (game->running) {
- SDL_PollEvent(&event);
+ while(SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_EVENT_QUIT:
game->running = 0;
break;
+ case SDL_EVENT_KEY_DOWN:
+ SDL_SetWindowRelativeMouseMode(game->window, 0);
+ break;
+ case SDL_EVENT_MOUSE_MOTION:
+ game->player.camera.yaw += (float)event.motion.xrel/100;
+ game->player.camera.pitch += (float)event.motion.yrel/100;
+ break;
}
- SDL_Delay(1);
}
return 0;
}
diff --git a/src/engine/M_game.h b/src/engine/M_game.h
index a0b7942..4c884d9 100644
--- a/src/engine/M_game.h
+++ b/src/engine/M_game.h
@@ -3,6 +3,7 @@
#include <SDL3/SDL_init.h>
#include <SDL3/SDL_video.h>
#include <SDL3/SDL_timer.h>
+#include <SDL3/SDL_mouse.h>
#include <glad/gl.h>
@@ -11,6 +12,7 @@
#include "M_player.h"
//#include "M_object.h"
#include "M_block.h"
+#include "M_cube.h"
typedef struct {
SDL_Window *window;
@@ -23,11 +25,9 @@ typedef struct {
M_BlockAtlas block_atlas;
M_Player player;
-
- SDL_Thread *event_handler;
} M_Game;
int M_initGame(M_Game *game, const char *window_title);
int M_killGame(M_Game *game);
-int SDLCALL M_handleEvents(void* arg);
+int M_handleEvents(M_Game *game);
diff --git a/src/engine/M_main.c b/src/engine/M_main.c
index 93c186e..98cc605 100644
--- a/src/engine/M_main.c
+++ b/src/engine/M_main.c
@@ -6,6 +6,8 @@
#include "M_block.h"
#include "M_chunk.h"
+#include <stdio.h>
+
int main()
{
M_Game game;
@@ -20,24 +22,30 @@ int main()
);
M_Object my_cube;
- M_createObject(&my_cube, &cube_model);
+ M_createObject(&my_cube,
+ (M_ObjectInfo){
+ .type = M_OBJECT_CUBE
+ }
+ );
my_cube.shader = &my_shader;
M_scaleObject(&my_cube, (vec3){0.5f, 0.5, 0.5f});
M_createBlockType(my_cube, &game.block_atlas);
+ M_createBlockType(my_cube, &game.block_atlas);
M_Chunk my_chunk;
M_generateChunk(&my_chunk);
M_moveObject(&my_cube, (vec3){0.0f, -0.5f, -1.0f});
- M_bindViewModel(my_cube.model);
-
while (game.running) {
+ printf("hello\n");
+ M_handleEvents(&game);
glClear(GL_COLOR_BUFFER_BIT);
glClear(GL_DEPTH_BUFFER_BIT);
- M_renderChunk(&game, &my_chunk);
+// M_renderChunk(&game, &my_chunk);
+ M_drawObject(&game.render_info, &game.player.camera, &my_cube);
SDL_GL_SwapWindow(game.window);
}
diff --git a/src/engine/M_object.c b/src/engine/M_object.c
index 07293d5..8ee29fa 100644
--- a/src/engine/M_object.c
+++ b/src/engine/M_object.c
@@ -58,9 +58,14 @@ void M_bindViewModel(M_ViewModel *model)
}
-void M_createObject(M_Object *obj, M_ViewModel *model)
+void M_createObject(M_Object *obj, M_ObjectInfo object_info)
{
- obj->model = model;
+ switch (object_info.type) {
+ case M_OBJECT_CUSTOM:
+ obj->model = object_info.model;
+ break;
+ }
+ obj->type = object_info.type;
glm_mat4_identity(obj->transform);
glm_vec3_zero(obj->pos);
diff --git a/src/engine/M_object.h b/src/engine/M_object.h
index ca87f0a..96bd0fe 100644
--- a/src/engine/M_object.h
+++ b/src/engine/M_object.h
@@ -9,9 +9,13 @@
#include <assimp/mesh.h>
#include <assimp/postprocess.h>
-//#include "M_game.h"
#include "M_shader.h"
+enum {
+ M_OBJECT_CUBE,
+ M_OBJECT_CUSTOM
+};
+
//Temporary type for storing M_Object rotation information,
//will get replaced in later revisions.
typedef struct {
@@ -26,12 +30,19 @@ typedef struct {
unsigned int VAO, VBO, EBO;
} M_ViewModel;
+typedef struct {
+ unsigned short type;
+ M_ViewModel *model;
+} M_ObjectInfo;
+
//Type meant for handling 3D models in a scene,
//stores additional information like a model's position, size and rotation.
typedef struct {
M_ViewModel *model;
M_ShaderProgram *shader;
+ unsigned short type;
+
vec3 pos, size;
M_Rotation rotation;
@@ -49,7 +60,7 @@ void M_killViewModel(M_ViewModel *model);
M_ViewModel M_loadViewModel(const char* filename);
//Creates a M_Object
-void M_createObject(M_Object *obj, M_ViewModel *model);
+void M_createObject(M_Object *obj, M_ObjectInfo object_info);
//Functions for moving, scaling and rotating M_Object
diff --git a/src/engine/M_player.c b/src/engine/M_player.c
index 1e065fd..b8a6eec 100644
--- a/src/engine/M_player.c
+++ b/src/engine/M_player.c
@@ -3,6 +3,7 @@
void M_initPlayer(M_Player* player)
{
glm_vec3_zero(player->pos);
+ player->camera.type = M_CAMERA_FPS;
M_initCamera(&player->camera, (vec3){0.0f, 1.0f, 0.0f});
}
diff --git a/src/engine/M_render.c b/src/engine/M_render.c
index 1d83ceb..9317167 100644
--- a/src/engine/M_render.c
+++ b/src/engine/M_render.c
@@ -9,9 +9,19 @@ void M_drawObject(M_RenderInfo *render_info, M_Camera *camera, M_Object *obj)
{
glUseProgram(obj->shader->prog);
glUniformMatrix4fv(obj->shader->transform_loc, 1, GL_FALSE, (float*)obj->transform);
+ M_ViewModel *model;
+ switch (obj->type) {
+ case M_OBJECT_CUBE:
+ model = &render_info->global_models[0];
+ break;
+ case M_OBJECT_CUSTOM:
+ model = obj->model;
+ break;
+ }
+ M_bindViewModel(model);
M_cameraViewMatrix(camera);
glUniformMatrix4fv(obj->shader->view_loc, 1, GL_FALSE, (float*)camera->view_matrix);
glUniformMatrix4fv(obj->shader->projection_loc, 1, GL_FALSE, (float*)render_info->projection_matrix);
- glDrawElements(GL_TRIANGLES, obj->model->num_indices, GL_UNSIGNED_INT, 0);
+ glDrawElements(GL_TRIANGLES, model->num_indices, GL_UNSIGNED_INT, 0);
}
diff --git a/src/engine/M_render.h b/src/engine/M_render.h
index 948f0d5..c6800ae 100644
--- a/src/engine/M_render.h
+++ b/src/engine/M_render.h
@@ -8,6 +8,8 @@
typedef struct {
mat4 view_matrix, projection_matrix;
+
+ M_ViewModel *global_models;
} M_RenderInfo;
void M_setupProjection(float fov, float aspect_ratio, M_RenderInfo *render_indo);