234 lines
5.2 KiB
Plaintext
234 lines
5.2 KiB
Plaintext
#module_parameters(WITH_EDITOR := true, WITH_NETWORKING := false, action_type : Type, entity_fields: Type);
|
|
|
|
Custom_Entity_Fields :: entity_fields;
|
|
Action :: action_type;
|
|
EDITOR :: WITH_EDITOR;
|
|
DEBUG :: true;
|
|
NETWORKING :: WITH_NETWORKING;
|
|
|
|
#if EDITOR {
|
|
//#load "../editor/scene_editor.jai";
|
|
//#load "../ui/new_ui/new_ui.jai";
|
|
#load "editor/editor.jai";
|
|
}
|
|
|
|
Engine_Mode :: enum {
|
|
PLAYING;
|
|
EDITING;
|
|
}
|
|
|
|
Engine_Core :: struct {
|
|
mode: Engine_Mode;
|
|
|
|
#if EDITOR {
|
|
editor: Editor;
|
|
imgui_context: *ImGui.ImGuiContext;
|
|
}
|
|
|
|
window: *Window;
|
|
renderer: *Renderer;
|
|
input : Input_State;
|
|
current_scene: *Scene;
|
|
|
|
camera_buffer : Buffer_Handle;
|
|
time_buffer : Buffer_Handle;
|
|
screen_data_buffer : Buffer_Handle;
|
|
directional_light_buffer : Buffer_Handle;
|
|
point_light_buffer : Buffer_Handle;
|
|
|
|
procs: struct {
|
|
on_scene_loaded: (*Scene, Engine_Mode);
|
|
on_pre_scene_loaded: (*Scene, Engine_Mode);
|
|
on_pre_scene_unloaded: (*Scene);
|
|
on_trigger_enter: (*Entity, *Entity);
|
|
on_trigger_exit: (*Entity, *Entity);
|
|
}
|
|
|
|
paused: bool;
|
|
|
|
time: float;
|
|
dt: float;
|
|
}
|
|
|
|
engine: Engine_Core;
|
|
|
|
time: float;
|
|
dt: float;
|
|
quit: bool;
|
|
frame_index : u64 = 0;
|
|
|
|
Camera_Data :: struct {
|
|
projection_matrix: Matrix4;
|
|
view_matrix: Matrix4;
|
|
position: Vector4;
|
|
}
|
|
|
|
Shader_Time :: struct {
|
|
time: float;
|
|
padding: Vector3;
|
|
}
|
|
|
|
coven_init :: (window_title: string, window_width: u32, window_height: u32, fullscreen: bool) {
|
|
engine.imgui_context = ImGui.CreateContext();
|
|
engine.window = create_window(window_title, window_width, window_height, fullscreen);
|
|
engine.renderer = create_renderer(engine.window);
|
|
engine.renderer.vsync = true;
|
|
|
|
init_input();
|
|
init_audio_system();
|
|
init_console();
|
|
|
|
#if EDITOR {
|
|
init_editor();
|
|
ui_init();
|
|
}
|
|
}
|
|
|
|
coven_run :: (game_update_proc: (float), game_editor_update_proc: (float), game_update_post_physics_proc: (float)) {
|
|
if engine.current_scene == null {
|
|
last_opened_scene := get_last_opened_scene_file();
|
|
if last_opened_scene.count > 0 {
|
|
engine.current_scene = load_scene(last_opened_scene);
|
|
free(last_opened_scene);
|
|
}
|
|
}
|
|
|
|
sdl_window := cast(*SDL_Window_Type)engine.window;
|
|
|
|
ImGui_ImplSdl_Init(sdl_window.sdl_window);
|
|
ImGui.StyleColorsClassic();
|
|
ImGui.GetIO();
|
|
|
|
time = xx seconds_since_init();
|
|
|
|
while !quit {
|
|
reset_temporary_storage();
|
|
|
|
frame_index += 1;
|
|
|
|
|
|
update_input();
|
|
|
|
// @Incomplete
|
|
if key_pressed(.SHIFT) && key_down(.ESCAPE) {
|
|
quit = true;
|
|
}
|
|
|
|
now : float = xx seconds_since_init();
|
|
dt = now - time;
|
|
time = now;
|
|
engine.time = time;
|
|
engine.dt = min(dt, 0.4);
|
|
|
|
update_fps_counter(dt);
|
|
|
|
update_console();
|
|
|
|
#if EDITOR {
|
|
ImGui_ImplSdl_NewFrame((cast(*SDL_Window_Type)engine.window).sdl_window);
|
|
imgui_impldx11_new_frame();
|
|
ImGui.NewFrame();
|
|
|
|
//ui_begin();
|
|
}
|
|
|
|
clamped_dt := min(0.4, dt);
|
|
|
|
#if EDITOR {
|
|
base_editor_update();
|
|
}
|
|
if engine.mode == .PLAYING {
|
|
game_update_proc(clamped_dt);
|
|
|
|
if engine.current_scene != null && !engine.paused {
|
|
update_animators(clamped_dt);
|
|
update_mesh_colliders(engine.current_scene);
|
|
update_physics(engine.current_scene, clamped_dt);
|
|
game_update_post_physics_proc(clamped_dt);
|
|
}
|
|
} else {
|
|
game_editor_update_proc(clamped_dt);
|
|
|
|
if engine.current_scene != null {
|
|
update_trigger_mesh_colliders(engine.current_scene);
|
|
}
|
|
}
|
|
|
|
if engine.current_scene != null {
|
|
update_transforms(engine.current_scene);
|
|
sync_engine_buffers();
|
|
|
|
if !engine.paused {
|
|
update_particle_systems(clamped_dt);
|
|
}
|
|
}
|
|
|
|
#if EDITOR {
|
|
ImGui.Render();
|
|
}
|
|
|
|
update_audio(dt);
|
|
|
|
render();
|
|
}
|
|
|
|
|
|
#if WITH_EDITOR {
|
|
imgui_impldx11_shutdown();
|
|
ImGui.DestroyContext(engine.imgui_context);
|
|
}
|
|
|
|
SDL_DestroyWindow(engine.window);
|
|
|
|
SDL_Quit();
|
|
}
|
|
|
|
switch_engine_mode :: (to_mode: Engine_Mode) {
|
|
engine.mode = to_mode;
|
|
|
|
#if EDITOR {
|
|
engine.editor.selected_entities.count = 0;
|
|
engine.editor.transform_gizmo.selected_axis = .NONE;
|
|
}
|
|
|
|
if engine.current_scene != null {
|
|
reload_scene(engine.current_scene);
|
|
}
|
|
}
|
|
|
|
#if NETWORKING {
|
|
#load "networking/networking.jai";
|
|
}
|
|
|
|
#load "input/input.jai";
|
|
#load "renderer/engine_buffers.jai";
|
|
#load "renderer/renderer.jai";
|
|
#load "windowing/window.jai";
|
|
#load "physics/physics.jai";
|
|
|
|
#load "core/string_helpers.jai";
|
|
#load "core/math.jai";
|
|
#load "core/ray.jai";
|
|
#load "animation/animator.jai";
|
|
#load "core/entity.jai";
|
|
#load "core/parray.jai";
|
|
#load "core/static_array.jai";
|
|
#load "core/queue.jai";
|
|
#load "core/scene.jai";
|
|
#load "core/transform.jai";
|
|
#load "core/camera.jai";
|
|
#load "core/console.jai";
|
|
#load "audio/audio.jai";
|
|
#load "core/fps.jai";
|
|
|
|
#scope_export
|
|
|
|
#import "Bucket_Array";
|
|
#import "Basic";
|
|
#import "String";
|
|
#import "System";
|
|
#import "Flat_Pool";
|
|
#import "Hash_Table";
|
|
File :: #import "File";
|
|
#import "File_Watcher";
|
|
#import "File_Utilities"; |