Character controller, reimplementing shadow pass

This commit is contained in:
2024-10-15 00:02:41 +02:00
parent 55adf0971e
commit a60fe82272
7 changed files with 117 additions and 99 deletions

View File

@@ -69,6 +69,69 @@ if _scene == null {
_scene = current_scene; } _scene = current_scene; }
p, locator := find_and_occupy_empty_slot(*_scene.by_type._Item); p._locator = locator; register_entity(_scene, p); p.transform = create_identity_transform(); init_entity(p); return p; } p, locator := find_and_occupy_empty_slot(*_scene.by_type._Item); p._locator = locator; register_entity(_scene, p); p.transform = create_identity_transform(); init_entity(p); return p; }
//
// String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:272.
//
serialize_entity :: (e: *Item, builder: *String_Builder) {
print_to_builder(builder, "type: Item\n");
print_to_builder(builder, "entity.enabled: %\n", e.entity.enabled);
print_to_builder(builder, "entity.flags: %\n", e.entity.flags);
print_to_builder(builder, "entity.transform.position.x: %\n", e.entity.transform.position.x);
print_to_builder(builder, "entity.transform.position.y: %\n", e.entity.transform.position.y);
print_to_builder(builder, "entity.transform.position.z: %\n", e.entity.transform.position.z);
print_to_builder(builder, "entity.transform.orientation.x: %\n", e.entity.transform.orientation.x);
print_to_builder(builder, "entity.transform.orientation.y: %\n", e.entity.transform.orientation.y);
print_to_builder(builder, "entity.transform.orientation.z: %\n", e.entity.transform.orientation.z);
print_to_builder(builder, "entity.transform.orientation.w: %\n", e.entity.transform.orientation.w);
print_to_builder(builder, "entity.transform.scale.x: %\n", e.entity.transform.scale.x);
print_to_builder(builder, "entity.transform.scale.y: %\n", e.entity.transform.scale.y);
print_to_builder(builder, "entity.transform.scale.z: %\n", e.entity.transform.scale.z);
print_to_builder(builder, "entity.snap_offset.x: %\n", e.entity.snap_offset.x);
print_to_builder(builder, "entity.snap_offset.y: %\n", e.entity.snap_offset.y);
print_to_builder(builder, "entity.snap_offset.z: %\n", e.entity.snap_offset.z);
}
//
// String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:272.
//
deserialize_entity :: (scene: *Scene, lines: [] string, e: *Item) {
for line: lines {
values := split(line, ":");
if values.count == 2 {
if trim(values[0], " ") == {
case "entity.enabled";
scan2(values[1], "%", *e.entity.enabled);
case "entity.transform.position.x";
scan2(values[1], "%", *e.entity.transform.position.x);
case "entity.transform.position.y";
scan2(values[1], "%", *e.entity.transform.position.y);
case "entity.transform.position.z";
scan2(values[1], "%", *e.entity.transform.position.z);
case "entity.transform.orientation.x";
scan2(values[1], "%", *e.entity.transform.orientation.x);
case "entity.transform.orientation.y";
scan2(values[1], "%", *e.entity.transform.orientation.y);
case "entity.transform.orientation.z";
scan2(values[1], "%", *e.entity.transform.orientation.z);
case "entity.transform.orientation.w";
scan2(values[1], "%", *e.entity.transform.orientation.w);
case "entity.transform.scale.x";
scan2(values[1], "%", *e.entity.transform.scale.x);
case "entity.transform.scale.y";
scan2(values[1], "%", *e.entity.transform.scale.y);
case "entity.transform.scale.z";
scan2(values[1], "%", *e.entity.transform.scale.z);
case "entity.snap_offset.x";
scan2(values[1], "%", *e.entity.snap_offset.x);
case "entity.snap_offset.y";
scan2(values[1], "%", *e.entity.snap_offset.y);
case "entity.snap_offset.z";
scan2(values[1], "%", *e.entity.snap_offset.z);
}
}
}
}
// //
// String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:272. // String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:272.
// //
@@ -86,9 +149,6 @@ serialize_entity :: (e: *Block, builder: *String_Builder) {
print_to_builder(builder, "entity.transform.scale.x: %\n", e.entity.transform.scale.x); print_to_builder(builder, "entity.transform.scale.x: %\n", e.entity.transform.scale.x);
print_to_builder(builder, "entity.transform.scale.y: %\n", e.entity.transform.scale.y); print_to_builder(builder, "entity.transform.scale.y: %\n", e.entity.transform.scale.y);
print_to_builder(builder, "entity.transform.scale.z: %\n", e.entity.transform.scale.z); print_to_builder(builder, "entity.transform.scale.z: %\n", e.entity.transform.scale.z);
print_to_builder(builder, "entity.grid_position.x: %\n", e.entity.grid_position.x);
print_to_builder(builder, "entity.grid_position.y: %\n", e.entity.grid_position.y);
print_to_builder(builder, "entity.grid_position.z: %\n", e.entity.grid_position.z);
print_to_builder(builder, "entity.snap_offset.x: %\n", e.entity.snap_offset.x); print_to_builder(builder, "entity.snap_offset.x: %\n", e.entity.snap_offset.x);
print_to_builder(builder, "entity.snap_offset.y: %\n", e.entity.snap_offset.y); print_to_builder(builder, "entity.snap_offset.y: %\n", e.entity.snap_offset.y);
print_to_builder(builder, "entity.snap_offset.z: %\n", e.entity.snap_offset.z); print_to_builder(builder, "entity.snap_offset.z: %\n", e.entity.snap_offset.z);
@@ -126,12 +186,6 @@ deserialize_entity :: (scene: *Scene, lines: [] string, e: *Block) {
scan2(values[1], "%", *e.entity.transform.scale.y); scan2(values[1], "%", *e.entity.transform.scale.y);
case "entity.transform.scale.z"; case "entity.transform.scale.z";
scan2(values[1], "%", *e.entity.transform.scale.z); scan2(values[1], "%", *e.entity.transform.scale.z);
case "entity.grid_position.x";
scan2(values[1], "%", *e.entity.grid_position.x);
case "entity.grid_position.y";
scan2(values[1], "%", *e.entity.grid_position.y);
case "entity.grid_position.z";
scan2(values[1], "%", *e.entity.grid_position.z);
case "entity.snap_offset.x"; case "entity.snap_offset.x";
scan2(values[1], "%", *e.entity.snap_offset.x); scan2(values[1], "%", *e.entity.snap_offset.x);
case "entity.snap_offset.y"; case "entity.snap_offset.y";
@@ -145,78 +199,6 @@ deserialize_entity :: (scene: *Scene, lines: [] string, e: *Block) {
} }
} }
//
// String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:272.
//
serialize_entity :: (e: *Item, builder: *String_Builder) {
print_to_builder(builder, "type: Item\n");
print_to_builder(builder, "entity.enabled: %\n", e.entity.enabled);
print_to_builder(builder, "entity.flags: %\n", e.entity.flags);
print_to_builder(builder, "entity.transform.position.x: %\n", e.entity.transform.position.x);
print_to_builder(builder, "entity.transform.position.y: %\n", e.entity.transform.position.y);
print_to_builder(builder, "entity.transform.position.z: %\n", e.entity.transform.position.z);
print_to_builder(builder, "entity.transform.orientation.x: %\n", e.entity.transform.orientation.x);
print_to_builder(builder, "entity.transform.orientation.y: %\n", e.entity.transform.orientation.y);
print_to_builder(builder, "entity.transform.orientation.z: %\n", e.entity.transform.orientation.z);
print_to_builder(builder, "entity.transform.orientation.w: %\n", e.entity.transform.orientation.w);
print_to_builder(builder, "entity.transform.scale.x: %\n", e.entity.transform.scale.x);
print_to_builder(builder, "entity.transform.scale.y: %\n", e.entity.transform.scale.y);
print_to_builder(builder, "entity.transform.scale.z: %\n", e.entity.transform.scale.z);
print_to_builder(builder, "entity.grid_position.x: %\n", e.entity.grid_position.x);
print_to_builder(builder, "entity.grid_position.y: %\n", e.entity.grid_position.y);
print_to_builder(builder, "entity.grid_position.z: %\n", e.entity.grid_position.z);
print_to_builder(builder, "entity.snap_offset.x: %\n", e.entity.snap_offset.x);
print_to_builder(builder, "entity.snap_offset.y: %\n", e.entity.snap_offset.y);
print_to_builder(builder, "entity.snap_offset.z: %\n", e.entity.snap_offset.z);
}
//
// String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:272.
//
deserialize_entity :: (scene: *Scene, lines: [] string, e: *Item) {
for line: lines {
values := split(line, ":");
if values.count == 2 {
if trim(values[0], " ") == {
case "entity.enabled";
scan2(values[1], "%", *e.entity.enabled);
case "entity.transform.position.x";
scan2(values[1], "%", *e.entity.transform.position.x);
case "entity.transform.position.y";
scan2(values[1], "%", *e.entity.transform.position.y);
case "entity.transform.position.z";
scan2(values[1], "%", *e.entity.transform.position.z);
case "entity.transform.orientation.x";
scan2(values[1], "%", *e.entity.transform.orientation.x);
case "entity.transform.orientation.y";
scan2(values[1], "%", *e.entity.transform.orientation.y);
case "entity.transform.orientation.z";
scan2(values[1], "%", *e.entity.transform.orientation.z);
case "entity.transform.orientation.w";
scan2(values[1], "%", *e.entity.transform.orientation.w);
case "entity.transform.scale.x";
scan2(values[1], "%", *e.entity.transform.scale.x);
case "entity.transform.scale.y";
scan2(values[1], "%", *e.entity.transform.scale.y);
case "entity.transform.scale.z";
scan2(values[1], "%", *e.entity.transform.scale.z);
case "entity.grid_position.x";
scan2(values[1], "%", *e.entity.grid_position.x);
case "entity.grid_position.y";
scan2(values[1], "%", *e.entity.grid_position.y);
case "entity.grid_position.z";
scan2(values[1], "%", *e.entity.grid_position.z);
case "entity.snap_offset.x";
scan2(values[1], "%", *e.entity.snap_offset.x);
case "entity.snap_offset.y";
scan2(values[1], "%", *e.entity.snap_offset.y);
case "entity.snap_offset.z";
scan2(values[1], "%", *e.entity.snap_offset.z);
}
}
}
}
// //
// String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:272. // String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:272.
// //
@@ -234,16 +216,19 @@ serialize_entity :: (e: *Character, builder: *String_Builder) {
print_to_builder(builder, "entity.transform.scale.x: %\n", e.entity.transform.scale.x); print_to_builder(builder, "entity.transform.scale.x: %\n", e.entity.transform.scale.x);
print_to_builder(builder, "entity.transform.scale.y: %\n", e.entity.transform.scale.y); print_to_builder(builder, "entity.transform.scale.y: %\n", e.entity.transform.scale.y);
print_to_builder(builder, "entity.transform.scale.z: %\n", e.entity.transform.scale.z); print_to_builder(builder, "entity.transform.scale.z: %\n", e.entity.transform.scale.z);
print_to_builder(builder, "entity.grid_position.x: %\n", e.entity.grid_position.x);
print_to_builder(builder, "entity.grid_position.y: %\n", e.entity.grid_position.y);
print_to_builder(builder, "entity.grid_position.z: %\n", e.entity.grid_position.z);
print_to_builder(builder, "entity.snap_offset.x: %\n", e.entity.snap_offset.x); print_to_builder(builder, "entity.snap_offset.x: %\n", e.entity.snap_offset.x);
print_to_builder(builder, "entity.snap_offset.y: %\n", e.entity.snap_offset.y); print_to_builder(builder, "entity.snap_offset.y: %\n", e.entity.snap_offset.y);
print_to_builder(builder, "entity.snap_offset.z: %\n", e.entity.snap_offset.z); print_to_builder(builder, "entity.snap_offset.z: %\n", e.entity.snap_offset.z);
print_to_builder(builder, "look_direction.x: %\n", e.look_direction.x); print_to_builder(builder, "look_direction.x: %\n", e.look_direction.x);
print_to_builder(builder, "look_direction.y: %\n", e.look_direction.y); print_to_builder(builder, "look_direction.y: %\n", e.look_direction.y);
print_to_builder(builder, "look_direction.z: %\n", e.look_direction.z); print_to_builder(builder, "look_direction.z: %\n", e.look_direction.z);
print_to_builder(builder, "yaw: %\n", e.yaw); print_to_builder(builder, "target_look_direction.x: %\n", e.target_look_direction.x);
print_to_builder(builder, "target_look_direction.y: %\n", e.target_look_direction.y);
print_to_builder(builder, "target_look_direction.z: %\n", e.target_look_direction.z);
print_to_builder(builder, "current_yaw: %\n", e.current_yaw);
print_to_builder(builder, "current_direction.x: %\n", e.current_direction.x);
print_to_builder(builder, "current_direction.y: %\n", e.current_direction.y);
print_to_builder(builder, "current_direction.z: %\n", e.current_direction.z);
print_to_builder(builder, "last_footstep_audio: %\n", e.last_footstep_audio); print_to_builder(builder, "last_footstep_audio: %\n", e.last_footstep_audio);
print_to_builder(builder, "animation_time: %\n", e.animation_time); print_to_builder(builder, "animation_time: %\n", e.animation_time);
print_to_builder(builder, "jump_press_time: %\n", e.jump_press_time); print_to_builder(builder, "jump_press_time: %\n", e.jump_press_time);
@@ -280,12 +265,6 @@ deserialize_entity :: (scene: *Scene, lines: [] string, e: *Character) {
scan2(values[1], "%", *e.entity.transform.scale.y); scan2(values[1], "%", *e.entity.transform.scale.y);
case "entity.transform.scale.z"; case "entity.transform.scale.z";
scan2(values[1], "%", *e.entity.transform.scale.z); scan2(values[1], "%", *e.entity.transform.scale.z);
case "entity.grid_position.x";
scan2(values[1], "%", *e.entity.grid_position.x);
case "entity.grid_position.y";
scan2(values[1], "%", *e.entity.grid_position.y);
case "entity.grid_position.z";
scan2(values[1], "%", *e.entity.grid_position.z);
case "entity.snap_offset.x"; case "entity.snap_offset.x";
scan2(values[1], "%", *e.entity.snap_offset.x); scan2(values[1], "%", *e.entity.snap_offset.x);
case "entity.snap_offset.y"; case "entity.snap_offset.y";
@@ -298,8 +277,20 @@ deserialize_entity :: (scene: *Scene, lines: [] string, e: *Character) {
scan2(values[1], "%", *e.look_direction.y); scan2(values[1], "%", *e.look_direction.y);
case "look_direction.z"; case "look_direction.z";
scan2(values[1], "%", *e.look_direction.z); scan2(values[1], "%", *e.look_direction.z);
case "yaw"; case "target_look_direction.x";
scan2(values[1], "%", *e.yaw); scan2(values[1], "%", *e.target_look_direction.x);
case "target_look_direction.y";
scan2(values[1], "%", *e.target_look_direction.y);
case "target_look_direction.z";
scan2(values[1], "%", *e.target_look_direction.z);
case "current_yaw";
scan2(values[1], "%", *e.current_yaw);
case "current_direction.x";
scan2(values[1], "%", *e.current_direction.x);
case "current_direction.y";
scan2(values[1], "%", *e.current_direction.y);
case "current_direction.z";
scan2(values[1], "%", *e.current_direction.z);
case "last_footstep_audio"; case "last_footstep_audio";
scan2(values[1], "%", *e.last_footstep_audio); scan2(values[1], "%", *e.last_footstep_audio);
case "animation_time"; case "animation_time";

View File

@@ -65,7 +65,6 @@ Entity :: struct {
transform: Transform; transform: Transform;
grid_position: Vector3i;
snap_offset: Vector3; snap_offset: Vector3;
renderable: Renderable; @DontSerialize renderable: Renderable; @DontSerialize

View File

@@ -1,4 +1,4 @@
FPS_COUNT_AMOUNT :: 8; FPS_COUNT_AMOUNT :: 30;
average_fps: int; average_fps: int;
fps_counts: [FPS_COUNT_AMOUNT] int; fps_counts: [FPS_COUNT_AMOUNT] int;
fps_count_cursor: int; fps_count_cursor: int;

View File

@@ -24,9 +24,9 @@ build :: (main_path: string, game_name: string, working_dir: string = #filepath)
array_add(*new_path, "modules"); array_add(*new_path, "modules");
opts.import_path = new_path; opts.import_path = new_path;
//if build_release { if build_release {
set_optimization(*opts, .VERY_OPTIMIZED); set_optimization(*opts, .VERY_OPTIMIZED);
//} }
compiler_begin_intercept(w); compiler_begin_intercept(w);

View File

@@ -60,7 +60,7 @@ coven_run :: (game_update_proc: (float), game_update_post_physics_proc: (float))
time = xx seconds_since_init(); time = xx seconds_since_init();
while !quit { while !quit {
//reset_temporary_storage(); reset_temporary_storage();
frame_index += 1; frame_index += 1;
@@ -104,7 +104,32 @@ coven_run :: (game_update_proc: (float), game_update_post_physics_proc: (float))
SDL_Quit(); SDL_Quit();
} }
update_light_buffer :: () {
scene := current_scene;
light_data : Directional_Light_Buffer_Data;
light_data.direction = scene.directional_light.direction;
light_data.color_and_intensity = scene.directional_light.color_and_intensity;
dir := to_v3(scene.directional_light.direction);
z_near := 1.0;
z_far := 50.5;
width := 10.0;
light_projection := orthographic_lh_projection_matrix(-width, width, -width, width, z_near, z_far);
light_view : Matrix4;
eye := scene.directional_light.view_position - dir * 30.0;
m := look_at_lh(eye, eye + dir * 5.0, .{0,1,0});
light_view = m;
light_data.light_matrix = light_projection * light_view;
upload_data_to_buffer(renderer, directional_light_buffer, *light_data, size_of(Directional_Light_Buffer_Data));
}
sync_engine_buffers :: () { sync_engine_buffers :: () {
update_light_buffer();
// Camera buffer // Camera buffer
camera := *current_scene.camera; camera := *current_scene.camera;

View File

@@ -9,6 +9,6 @@ Directional_Light_Buffer_Data :: struct {
color_and_intensity : Vector4; color_and_intensity : Vector4;
direction : Vector4; direction : Vector4;
//light_matrix: Matrix4; light_matrix: Matrix4;
} }

View File

@@ -1436,7 +1436,10 @@ render :: (backend: *D3D11_Backend, command_buffer: *Render_Command_Buffer) {
time = now; time = now;
// Present the information rendered to the back buffer to the front buffer (the screen) // Present the information rendered to the back buffer to the front buffer (the screen)
before_swap := seconds_since_init();
hr := IDXGISwapChain_Present(swap_chain, xx ifx renderer.vsync then 1 else 0, 0); hr := IDXGISwapChain_Present(swap_chain, xx ifx renderer.vsync then 1 else 0, 0);
after_swap := seconds_since_init();
//print("RENDERING: It took % sec to present the final image\n", after_swap - before_swap);
renderer.last_render_time_gpu = cast(float)(now - time) * 1000.0; renderer.last_render_time_gpu = cast(float)(now - time) * 1000.0;
if FAILED(hr) { if FAILED(hr) {