182 lines
4.5 KiB
Plaintext
182 lines
4.5 KiB
Plaintext
#module_parameters(WITH_EDITOR := true, WITH_NETWORKING := false);
|
|
|
|
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";
|
|
|
|
editor: Editor;
|
|
}
|
|
|
|
Engine_Mode :: enum {
|
|
PLAYING;
|
|
EDITING;
|
|
}
|
|
mode: Engine_Mode;
|
|
|
|
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;
|
|
|
|
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) {
|
|
window = create_window(window_title, window_width, window_height, fullscreen);
|
|
renderer = create_renderer(window);
|
|
renderer.vsync = true;
|
|
|
|
init_input();
|
|
init_audio_system();
|
|
init_console();
|
|
|
|
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();
|
|
|
|
ui_begin();
|
|
|
|
game_update_proc(min(0.4, dt));
|
|
|
|
update_animators(dt);
|
|
|
|
update_physics(current_scene, dt);
|
|
update_transforms();
|
|
game_update_post_physics_proc(dt);
|
|
sync_engine_buffers();
|
|
|
|
update_particle_systems(dt);
|
|
|
|
ui_end();
|
|
|
|
update_audio(dt);
|
|
|
|
render();
|
|
}
|
|
|
|
SDL_DestroyWindow(window);
|
|
|
|
SDL_Quit();
|
|
}
|
|
|
|
sync_engine_buffers :: () {
|
|
// Camera buffer
|
|
camera := *current_scene.camera;
|
|
|
|
camera_data : Camera_Data;
|
|
camera_data.projection_matrix = camera.projection_matrix;
|
|
camera_data.view_matrix = camera.view_matrix;
|
|
camera_data.position = to_v4(camera.position);
|
|
upload_data_to_buffer(renderer, camera_buffer, *camera_data, size_of(Camera_Data));
|
|
|
|
shader_time : Shader_Time;
|
|
shader_time.time = time;
|
|
upload_data_to_buffer(renderer, time_buffer, *shader_time, size_of(Shader_Time));
|
|
|
|
// Sync entity transforms
|
|
for current_scene.entities {
|
|
if it.flags & .RENDERABLE {
|
|
if it.renderable.type == {
|
|
case .MODEL; {
|
|
for n, i: it.renderable.model.nodes {
|
|
if n.meshes.count > 0 {
|
|
node_data := *it.renderable.nodes[i];
|
|
upload_data_to_buffer(renderer, node_data.transform_buffer, *node_data.transform.world_matrix, size_of(Matrix4));
|
|
|
|
if node_data.num_bones > 0 {
|
|
for handle, mesh_index: n.meshes {
|
|
m := parray_get(*renderer.meshes, handle);
|
|
bones : [MAX_BONES] Matrix4;
|
|
for bone_index: 0..m.num_bones-1 {
|
|
bone := *it.renderable.nodes[m.bone_indices[bone_index]];
|
|
bones[bone_index] = bone.transform.world_matrix * m.bone_matrices[bone_index];
|
|
}
|
|
upload_data_to_buffer(renderer, node_data.bone_buffers[mesh_index], bones.data, size_of(Matrix4) * m.num_bones);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#if NETWORKING {
|
|
#load "networking/networking.jai";
|
|
}
|
|
|
|
#load "input/input.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/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"; |