#module_parameters(WITH_EDITOR := true, WITH_NETWORKING := false, action_type : Type); 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; } 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; procs: struct { on_scene_loaded: (*Scene, Engine_Mode); on_pre_scene_loaded: (*Scene, Engine_Mode); } paused: bool; } 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.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_update_post_physics_proc: (float)) { 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; update_fps_counter(dt); update_console(); #if EDITOR { 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_physics(engine.current_scene, clamped_dt); game_update_post_physics_proc(clamped_dt); } } if engine.current_scene != null { update_transforms(); sync_engine_buffers(); if !engine.paused { update_particle_systems(clamped_dt); } } #if EDITOR { ui_end(); } update_audio(dt); render(); } 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; } 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/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";