diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/engine/M_block.h | 4 | ||||
| -rw-r--r-- | src/engine/M_camera.c | 62 | ||||
| -rw-r--r-- | src/engine/M_camera.h | 15 | ||||
| -rw-r--r-- | src/engine/M_chunk.c | 20 | ||||
| -rw-r--r-- | src/engine/M_game.c | 22 | ||||
| -rw-r--r-- | src/engine/M_game.h | 6 | ||||
| -rw-r--r-- | src/engine/M_main.c | 16 | ||||
| -rw-r--r-- | src/engine/M_object.c | 9 | ||||
| -rw-r--r-- | src/engine/M_object.h | 15 | ||||
| -rw-r--r-- | src/engine/M_player.c | 1 | ||||
| -rw-r--r-- | src/engine/M_render.c | 12 | ||||
| -rw-r--r-- | src/engine/M_render.h | 2 |
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); |
