248 lines
6.5 KiB
C
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);
|
|
}
|