2025-05-31 00:27:25 +02:00

248 lines
6.5 KiB
C

#include "game.h"
typedef enum {
ENGINE_STATE_GAME,
ENGINE_STATE_MENU_START,
ENGINE_STATE_LOADING_SCREEN,
ENGINE_STATE_MENU_SETTING,
ENGINE_STATE_MENU4,
ENGINE_STATE_MENU5,
ENGINE_STATE_MENU6,
ENGINE_STATE_MENU7
} engine_state_enum;
static struct {
bool exit_window;
bool exit_request;
int engine_state;
int deferred_mode;
unsigned int width;
unsigned int height;
Shader *shader;
gbuffer_t gbuffer;
Font font;
Camera3D camera;
Texture2D *textures;
unsigned int textures_size;
} ctx;
void scene_render(const Model skybox, Camera3D *camera, const gbuffer_t gbuffer, const Shader shader[MAX_SHADER], int deferred_mode) {
UpdateCamera(camera, CAMERA_FREE);
float camerapos[3] = {camera->position.x, camera->position.y, camera->position.z};
SetShaderValue(shader[SHADER_DEFERRED], shader[SHADER_DEFERRED].locs[SHADER_LOC_VECTOR_VIEW], camerapos, SHADER_UNIFORM_VEC3);
SetMousePosition(GetScreenWidth() * 0.5, GetScreenHeight() * 0.5);
//update all light;
BeginDrawing(); {
haven_gbuffer_start_draw(gbuffer, *camera, shader[SHADER_GBUFFER]); {
//drawDeferred scene here
} haven_gbuffer_end_draw();
switch (deferred_mode){
case (DEFERRED_SHADING) : {
haven_gbuffer_rendering(gbuffer, *camera, shader[SHADER_DEFERRED]);
BeginMode3D(*camera); {
rlDisableBackfaceCulling();
rlDisableDepthMask();
DrawModel(skybox, Vector3Zero(), 1.0f, WHITE);
rlEnableBackfaceCulling();
rlEnableDepthMask();
rlEnableShader(rlGetShaderIdDefault()); {
DrawCube((Vector3){10, 10, 10}, 10, 10, 10, RED);
} rlDisableShader();
}EndMode3D();
break;
}
case (DEFERRED_POSITION) : {
haven_gbuffer_texture_render(gbuffer.positionTexture, gbuffer.width, gbuffer.height);
break;
}
case (DEFERRED_NORMAL) : {
haven_gbuffer_texture_render(gbuffer.normalTexture, gbuffer.width, gbuffer.height);
break;
}
case (DEFERRED_ALBEDO) : {
haven_gbuffer_texture_render(gbuffer.albedoSpecTexture, gbuffer.width, gbuffer.height);
break;
}
case (DEFERRED_ZBUFFER) : {
haven_gbuffer_texture_render(gbuffer.zTexture, gbuffer.width, gbuffer.height);
break;
}
default:{
break;
}
}
DrawFPS(10, 10);
DrawText(TextFormat("%f", GetFrameTime() * 1000), 30, 30, 10, GREEN);
render_debug_draw();
} EndDrawing();
}
int main(const int ac, char *av[]) {
haven_memory_system_init();
haven_thread_mgr_init();
haven_time_init();
ctx.height = 1080;
ctx.width = 1920;
ctx.deferred_mode = DEFERRED_SHADING;
ctx.engine_state = ENGINE_STATE_LOADING_SCREEN;
ctx.camera = (Camera3D){0};
// ctx.camera.position = (Vector3){ 2.0f, 3.0f, 2.0f };// Camera position
// ctx.camera.target = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera looking at point
// ctx.camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target)
// ctx.camera.fovy = 45.0f; // Camera field-of-view Y
// ctx.camera.projection = CAMERA_PERSPECTIVE; // Camera projection type(Camera3D) {
ctx.camera.fovy = 45.0f;
ctx.camera.projection = CAMERA_PERSPECTIVE;
ctx.camera.position = (Vector3){40, 40, 40};
ctx.camera.up = (Vector3){0, 1, 0};
ctx.camera.target = (Vector3){0, 0, 0};
haven_memory_system_print();
InitAudioDevice();
assert(IsAudioDeviceReady());
SetConfigFlags(FLAG_MSAA_4X_HINT | FLAG_WINDOW_UNDECORATED | FLAG_WINDOW_RESIZABLE);//need to see if it work
InitWindow(ctx.width, ctx.height, "World of Haven : Chaos dungeons");
assert(IsWindowReady());
rlEnableSmoothLines();//need to see if it work
ctx.shader = game_shader_load();
ctx.font = LoadFont("assets/Monster_hunter.ttf");
SetTargetFPS(ac == 2 ? atoi(av[1]) : 165);
ctx.gbuffer = haven_gbuffer_init(ctx.width, ctx.height);
haven_deferred_set_loc(ctx.shader[SHADER_DEFERRED]);
Model cube = haven_skybox_create(ctx.shader[SHADER_SKYBOX]);
FilePathList sounds_files = {0};
sounds_files = LoadDirectoryFiles("assets/sound");
haven_sound_init((const char**)sounds_files.paths, sounds_files.count);
UnloadDirectoryFiles(sounds_files);
// FilePathList music_files = {0};
// music_files = LoadDirectoryFiles("assets/not_free/music");
// haven_music_init((const char**)music_files.paths, music_files.count);
// UnloadDirectoryFiles(music_files);
FilePathList texture_files = {0};
texture_files = LoadDirectoryFiles("assets/textures");
ctx.textures = malloc(sizeof(Texture2D) * texture_files.count);
for (int i = 0; i < texture_files.count; i++) {
ctx.textures[i] = LoadTexture(texture_files.paths[i]);
}
ctx.textures_size = texture_files.count;
UnloadDirectoryFiles(texture_files);
game_menu_start_init();
rlEnableDepthTest();
rlEnableBackfaceCulling();
while (!WindowShouldClose()) {
switch (ctx.engine_state) {
case (ENGINE_STATE_GAME): {
scene_render(cube, &ctx.camera, ctx.gbuffer, ctx.shader, ctx.deferred_mode);
break;
}
case (ENGINE_STATE_MENU_START): {
BeginDrawing();
ClearBackground(BLACK);
switch (game_menu_start_update()) {
case (1): {
ctx.engine_state = ENGINE_STATE_GAME;
HideCursor();
break;
}
case (2): {
ctx.engine_state = ENGINE_STATE_GAME;
HideCursor();
break;
}
case (3): {
ctx.engine_state = ENGINE_STATE_MENU_SETTING;
break;
}
case (4): {
goto close;
break;
}
default:break;
}
game_menu_start_render(ctx.textures, ctx.font);
EndDrawing();
break;
}
case (ENGINE_STATE_LOADING_SCREEN): {
game_loading_screen();
ctx.engine_state = ENGINE_STATE_MENU_START;
break;
}
case (ENGINE_STATE_MENU_SETTING): {
BeginDrawing();
ClearBackground(BLACK);
//setting
EndDrawing();
break;
}
case (ENGINE_STATE_MENU4): {
BeginDrawing();
ClearBackground(BLACK);
EndDrawing();
break;
}
case (ENGINE_STATE_MENU5): {
BeginDrawing();
ClearBackground(BLACK);
EndDrawing();
break;
}
case (ENGINE_STATE_MENU6): {
BeginDrawing();
ClearBackground(BLACK);
EndDrawing();
break;
}
case (ENGINE_STATE_MENU7): {
BeginDrawing();
ClearBackground(BLACK);
EndDrawing();
break;
}
default:{
break;
}
}
// haven_music_update();
haven_time_update();
haven_stack_reset();
}
close:
game_menu_start_clear();
for (int i = 0; i < ctx.textures_size; i++) {
UnloadTexture(ctx.textures[i]);
}
haven_music_close();
haven_sound_close();
CloseAudioDevice();
game_shader_unload(ctx.shader);
ShowCursor();
haven_thread_mgr_close();
haven_memory_system_shutdown();
CloseWindow();
return(0);
}