water improvement test

This commit is contained in:
Tuomas Katajisto 2025-10-18 15:11:34 +03:00
parent 39f187689e
commit 857338993b
28 changed files with 4857 additions and 4083 deletions

View File

@ -28,7 +28,9 @@ game_tick :: () {
} }
game_draw :: () { game_draw :: () {
create_set_cam_rendering_task(cam);
curworld := get_current_world(); curworld := get_current_world();
if curworld.valid then create_world_rendering_tasks(curworld.world); if curworld.valid {
create_set_cam_rendering_task(cam, curworld.world.conf.planeHeight);
create_world_rendering_tasks(curworld.world);
}
} }

View File

@ -1,7 +1,7 @@
{ {
"exposure": -0.252874, "exposure": 0.057475,
"contrast": 1.604926, "contrast": 2.06763,
"saturation": 0, "saturation": 1.202777,
"gamma": 2.162069, "gamma": 1.019477,
"tonemap": 1 "tonemap": 1
} }

View File

@ -361,7 +361,7 @@ tick_level_editor :: () {
draw_level_editor :: () { draw_level_editor :: () {
curworld := get_current_world(); curworld := get_current_world();
if !curworld.valid then return; if !curworld.valid then return;
create_set_cam_rendering_task(get_level_editor_camera()); create_set_cam_rendering_task(get_level_editor_camera(), curworld.world.conf.planeHeight);
create_world_rendering_tasks(curworld.world); create_world_rendering_tasks(curworld.world);
} }

View File

@ -18,7 +18,7 @@ tick_post_process_editor :: () {
draw_post_process_editor :: () { draw_post_process_editor :: () {
curworld := get_current_world(); curworld := get_current_world();
if !curworld.valid then return; if !curworld.valid then return;
create_set_cam_rendering_task(get_post_processing_camera()); create_set_cam_rendering_task(get_post_processing_camera(), curworld.world.conf.planeHeight);
create_world_rendering_tasks(curworld.world); create_world_rendering_tasks(curworld.world);
} }

View File

@ -304,7 +304,7 @@ draw_material_tab :: (theme: *GR.Overall_Theme, area: GR.Rect) {
draw_trile_editor :: () { draw_trile_editor :: () {
create_set_cam_rendering_task(get_trile_editor_camera()); create_set_cam_rendering_task(get_trile_editor_camera(), 0.0);
w := New(World,, temp); w := New(World,, temp);
create_sky_rendering_task(*w.conf); create_sky_rendering_task(*w.conf);
create_trixel_rendering_task(editor_current_trile, *colorMuls); create_trixel_rendering_task(editor_current_trile, *colorMuls);

View File

@ -7,6 +7,7 @@ current_trile_offset_index : s32 = 0;
current_world_config : *World_Config = null; current_world_config : *World_Config = null;
in_shadowmap_pass : bool = false; in_shadowmap_pass : bool = false;
in_reflection_pass : bool = false;
shadow_mvp : Matrix4; shadow_mvp : Matrix4;
backend_handle_command :: (cmd: *Render_Command) { backend_handle_command :: (cmd: *Render_Command) {
@ -124,7 +125,12 @@ backend_draw_trile_positions :: (trile : string, amount : s32, worldConf: *World
bindings.samplers[0] = gPipelines.trile.bind.samplers[0]; bindings.samplers[0] = gPipelines.trile.bind.samplers[0];
bindings.images[0] = trilegfx.trixel_colors; bindings.images[0] = trilegfx.trixel_colors;
fs_params : Trile_Fs_Params;
fs_params.mvp_shadow = shadow_mvp.floats;
fs_params.is_reflection = ifx in_reflection_pass then cast(s32)1 else cast(s32)0;
sg_apply_bindings(*bindings); sg_apply_bindings(*bindings);
sg_apply_uniforms(UB_trile_fs_params, *(sg_range.{ ptr = *fs_params, size = size_of(type_of(fs_params)) }));
sg_apply_uniforms(UB_trile_vs_params, *(sg_range.{ ptr = *vs_params, size = size_of(type_of(vs_params))})); sg_apply_uniforms(UB_trile_vs_params, *(sg_range.{ ptr = *vs_params, size = size_of(type_of(vs_params))}));
sg_apply_uniforms(UB_trile_world_config, *(sg_range.{ptr = *world_conf, size = size_of(type_of(world_conf))})); sg_apply_uniforms(UB_trile_world_config, *(sg_range.{ptr = *world_conf, size = size_of(type_of(world_conf))}));
sg_draw(0, cast(s32) trilegfx.vertex_count, amount); sg_draw(0, cast(s32) trilegfx.vertex_count, amount);
@ -160,7 +166,9 @@ backend_draw_ground :: (wc: *World_Config) {
fs_params : Plane_Fs_Params; fs_params : Plane_Fs_Params;
fs_params.mvp_shadow = shadow_mvp.floats; fs_params.mvp_shadow = shadow_mvp.floats;
fs_params.is_reflection = ifx in_reflection_pass then cast(s32)1 else cast(s32)0;
vs_params.mvp = mvp.floats; vs_params.mvp = mvp.floats;
vs_params.planeHeight = wc.planeHeight;
sg_apply_pipeline(gPipelines.plane.pipeline); sg_apply_pipeline(gPipelines.plane.pipeline);
gPipelines.plane.bind.samplers[2] = g_shadowmap_sampler; gPipelines.plane.bind.samplers[2] = g_shadowmap_sampler;
gPipelines.plane.bind.images[2] = g_shadowmap; gPipelines.plane.bind.images[2] = g_shadowmap;
@ -169,7 +177,7 @@ backend_draw_ground :: (wc: *World_Config) {
sg_apply_uniforms(UB_plane_fs_params, *(sg_range.{ ptr = *fs_params, size = size_of(type_of(fs_params)) })); sg_apply_uniforms(UB_plane_fs_params, *(sg_range.{ ptr = *fs_params, size = size_of(type_of(fs_params)) }));
sg_apply_uniforms(UB_plane_world_config, *(sg_range.{ptr = *world_conf, size = size_of(type_of(world_conf))})); sg_apply_uniforms(UB_plane_world_config, *(sg_range.{ptr = *world_conf, size = size_of(type_of(world_conf))}));
sg_apply_uniforms(UB_plane_data, *(sg_range.{ptr = *plane_data, size = size_of(type_of(plane_data))})); sg_apply_uniforms(UB_plane_data, *(sg_range.{ptr = *plane_data, size = size_of(type_of(plane_data))}));
sg_draw(0, 6, 1); sg_draw(0, 6, 2);
} }
backend_process_command_buckets :: () { backend_process_command_buckets :: () {
@ -192,9 +200,11 @@ backend_process_command_buckets :: () {
// 2. Reflection pass // 2. Reflection pass
sg_begin_pass(*(sg_pass.{ action = state.pass_action_clear, attachments = gPipelines.plane.attachments})); sg_begin_pass(*(sg_pass.{ action = state.pass_action_clear, attachments = gPipelines.plane.attachments}));
in_reflection_pass = true;
for render_command_buckets.reflection { for render_command_buckets.reflection {
backend_handle_command(it); backend_handle_command(it);
} }
in_reflection_pass = false;
sg_end_pass(); sg_end_pass();
current_trile_offset_index = 0; // This is not optimal, but it is nice and simple. current_trile_offset_index = 0; // This is not optimal, but it is nice and simple.

View File

@ -15,7 +15,6 @@ fill_uniform_with_engine_data :: (uniform: *$A, enginedata: *$B) {
create_world_rendering_tasks :: (world: *World) { create_world_rendering_tasks :: (world: *World) {
create_sky_rendering_task(*world.conf); create_sky_rendering_task(*world.conf);
create_set_light_rendering_task(*world.conf); create_set_light_rendering_task(*world.conf);
create_ground_rendering_task(world);
for world.positions { for world.positions {
if it.positions.count < 1 then continue; if it.positions.count < 1 then continue;
triletask := Rendering_Task_Trile.{}; triletask := Rendering_Task_Trile.{};
@ -24,6 +23,7 @@ create_world_rendering_tasks :: (world: *World) {
triletask.worldConf = *world.conf; triletask.worldConf = *world.conf;
add_rendering_task(triletask); add_rendering_task(triletask);
} }
create_ground_rendering_task(world);
} }
create_sky_rendering_task :: (conf: *World_Config) { create_sky_rendering_task :: (conf: *World_Config) {
@ -47,8 +47,8 @@ create_ground_rendering_task :: (world: *World) {
add_rendering_task(groundtask); add_rendering_task(groundtask);
} }
create_set_cam_rendering_task :: (cam: Camera) { create_set_cam_rendering_task :: (cam: Camera, planeHeight: float) {
camtask := Rendering_Task_Set_Camera.{type = .SET_CAMERA, camera = cam}; camtask := Rendering_Task_Set_Camera.{type = .SET_CAMERA, camera = cam, planeHeight = planeHeight};
add_rendering_task(camtask); add_rendering_task(camtask);
} }

View File

@ -1,7 +1,7 @@
Post_Process :: struct { Post_Process :: struct {
exposure : float = 0.0; @Slider,-1,1,0.1; exposure : float = 0.0; @Slider,-1,1,0.1;
contrast : float = 1.0; @Slider,0.1,4.0,0.1; contrast : float = 1.0; @Slider,0.1,4.0,0.1;
saturation : float; saturation : float = 1.0; @Slider,0.0,2.0,0.1;
gamma : float = 1.0; @Slider,0.3,3.0,0.1; gamma : float = 1.0; @Slider,0.3,3.0,0.1;
tonemap : float = 1.0; @Slider,0,1,1; tonemap : float = 1.0; @Slider,0,1,1;
} }

View File

@ -71,10 +71,11 @@ create_shadow_viewproj :: (cam: *Camera, conf: *World_Config) -> Matrix4 {
max_v.y = max(max_v.y, transformed_corner.y); max_v.y = max(max_v.y, transformed_corner.y);
max_v.z = max(max_v.z, transformed_corner.z); max_v.z = max(max_v.z, transformed_corner.z);
} }
max_v.xy = avg.xy + Vector2.{50, 50}; transformed_avg := (view * Vector4.{avg.x, avg.y, avg.z, 1.0}).xyz;
min_v.xy = avg.xy - Vector2.{50, 50}; max_v.xy = transformed_avg.xy + Vector2.{50, 50};
min_v.xy = transformed_avg.xy - Vector2.{50, 50};
proj := matrix_ortho(min_v.x, max_v.x, min_v.y, max_v.y, -max_v.z-100, -min_v.z); proj := matrix_ortho(min_v.x, max_v.x, min_v.y, max_v.y, -min_v.z, -max_v.z-100);
return view*proj; return view*proj;
} }

View File

@ -57,6 +57,7 @@ Rendering_Task_Trixels :: struct {
Rendering_Task_Set_Camera :: struct { Rendering_Task_Set_Camera :: struct {
#as using t : Rendering_Task; #as using t : Rendering_Task;
camera : Camera; camera : Camera;
planeHeight : float;
} }
rendering_tasklist_clear :: () { rendering_tasklist_clear :: () {
@ -116,13 +117,16 @@ tasks_to_commands :: () {
array_add(*render_command_buckets.setup, commandGenGround); array_add(*render_command_buckets.setup, commandGenGround);
array_add(*render_command_buckets.main, commandDrawGround); array_add(*render_command_buckets.main, commandDrawGround);
case .SET_CAMERA; case .SET_CAMERA;
task := (cast(*Rendering_Task_Set_Camera)it);
command := New(Render_Command_Set_Camera,, temp); command := New(Render_Command_Set_Camera,, temp);
command.camera = (cast(*Rendering_Task_Set_Camera)it).camera; command.camera = task.camera;
array_add(*render_command_buckets.main, command); array_add(*render_command_buckets.main, command);
commandReflected := New(Render_Command_Set_Camera,, temp); commandReflected := New(Render_Command_Set_Camera,, temp);
commandReflected.camera = (cast(*Rendering_Task_Set_Camera)it).camera; commandReflected.camera = task.camera;
commandReflected.camera.target *= Vector3.{1, -1, 1}; commandReflected.camera.target *= Vector3.{1, -1, 1};
commandReflected.camera.position *= Vector3.{1, -1, 1}; commandReflected.camera.position *= Vector3.{1, -1, 1};
commandReflected.camera.target.y += task.planeHeight * 2;
commandReflected.camera.position.y += task.planeHeight * 2;
array_add(*render_command_buckets.reflection, commandReflected); array_add(*render_command_buckets.reflection, commandReflected);
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -100,7 +100,8 @@ vs_pp_source_glsl430 := u8.[
{ {
tonemapped = _61; tonemapped = _61;
} }
frag_color = vec4((((pow(tonemapped, vec3(1.0 / post_process_config[0].w)) - vec3(0.5)) * max(post_process_config[0].y, 0.0)) + vec3(0.5)) + vec3(post_process_config[0].x), 1.0); vec3 _106 = (((pow(tonemapped, vec3(1.0 / post_process_config[0].w)) - vec3(0.5)) * max(post_process_config[0].y, 0.0)) + vec3(0.5)) + vec3(post_process_config[0].x);
frag_color = vec4(mix(vec3(((0.2125000059604644775390625 * _106.x) + (0.7153999805450439453125 * _106.y)) + (0.07209999859333038330078125 * _106.z)), _106, vec3(post_process_config[0].z)), 1.0);
} }
*/ */
@ -152,18 +153,30 @@ fs_pp_source_glsl430 := u8.[
0x20,0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20, 0x20,0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x74,0x6f,0x6e,0x65,0x6d,0x61,0x70,0x70,0x65,0x64,0x20, 0x20,0x20,0x20,0x20,0x20,0x74,0x6f,0x6e,0x65,0x6d,0x61,0x70,0x70,0x65,0x64,0x20,
0x3d,0x20,0x5f,0x36,0x31,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20, 0x3d,0x20,0x5f,0x36,0x31,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,
0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x76,0x65, 0x20,0x76,0x65,0x63,0x33,0x20,0x5f,0x31,0x30,0x36,0x20,0x3d,0x20,0x28,0x28,0x28,
0x63,0x34,0x28,0x28,0x28,0x28,0x70,0x6f,0x77,0x28,0x74,0x6f,0x6e,0x65,0x6d,0x61, 0x70,0x6f,0x77,0x28,0x74,0x6f,0x6e,0x65,0x6d,0x61,0x70,0x70,0x65,0x64,0x2c,0x20,
0x70,0x70,0x65,0x64,0x2c,0x20,0x76,0x65,0x63,0x33,0x28,0x31,0x2e,0x30,0x20,0x2f, 0x76,0x65,0x63,0x33,0x28,0x31,0x2e,0x30,0x20,0x2f,0x20,0x70,0x6f,0x73,0x74,0x5f,
0x20,0x70,0x6f,0x73,0x74,0x5f,0x70,0x72,0x6f,0x63,0x65,0x73,0x73,0x5f,0x63,0x6f, 0x70,0x72,0x6f,0x63,0x65,0x73,0x73,0x5f,0x63,0x6f,0x6e,0x66,0x69,0x67,0x5b,0x30,
0x6e,0x66,0x69,0x67,0x5b,0x30,0x5d,0x2e,0x77,0x29,0x29,0x20,0x2d,0x20,0x76,0x65, 0x5d,0x2e,0x77,0x29,0x29,0x20,0x2d,0x20,0x76,0x65,0x63,0x33,0x28,0x30,0x2e,0x35,
0x63,0x33,0x28,0x30,0x2e,0x35,0x29,0x29,0x20,0x2a,0x20,0x6d,0x61,0x78,0x28,0x70, 0x29,0x29,0x20,0x2a,0x20,0x6d,0x61,0x78,0x28,0x70,0x6f,0x73,0x74,0x5f,0x70,0x72,
0x6f,0x73,0x74,0x5f,0x70,0x72,0x6f,0x63,0x65,0x73,0x73,0x5f,0x63,0x6f,0x6e,0x66, 0x6f,0x63,0x65,0x73,0x73,0x5f,0x63,0x6f,0x6e,0x66,0x69,0x67,0x5b,0x30,0x5d,0x2e,
0x69,0x67,0x5b,0x30,0x5d,0x2e,0x79,0x2c,0x20,0x30,0x2e,0x30,0x29,0x29,0x20,0x2b, 0x79,0x2c,0x20,0x30,0x2e,0x30,0x29,0x29,0x20,0x2b,0x20,0x76,0x65,0x63,0x33,0x28,
0x20,0x76,0x65,0x63,0x33,0x28,0x30,0x2e,0x35,0x29,0x29,0x20,0x2b,0x20,0x76,0x65, 0x30,0x2e,0x35,0x29,0x29,0x20,0x2b,0x20,0x76,0x65,0x63,0x33,0x28,0x70,0x6f,0x73,
0x63,0x33,0x28,0x70,0x6f,0x73,0x74,0x5f,0x70,0x72,0x6f,0x63,0x65,0x73,0x73,0x5f, 0x74,0x5f,0x70,0x72,0x6f,0x63,0x65,0x73,0x73,0x5f,0x63,0x6f,0x6e,0x66,0x69,0x67,
0x63,0x6f,0x6e,0x66,0x69,0x67,0x5b,0x30,0x5d,0x2e,0x78,0x29,0x2c,0x20,0x31,0x2e, 0x5b,0x30,0x5d,0x2e,0x78,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x72,0x61,0x67,
0x30,0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x00, 0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x76,0x65,0x63,0x34,0x28,0x6d,0x69,
0x78,0x28,0x76,0x65,0x63,0x33,0x28,0x28,0x28,0x30,0x2e,0x32,0x31,0x32,0x35,0x30,
0x30,0x30,0x30,0x35,0x39,0x36,0x30,0x34,0x36,0x34,0x34,0x37,0x37,0x35,0x33,0x39,
0x30,0x36,0x32,0x35,0x20,0x2a,0x20,0x5f,0x31,0x30,0x36,0x2e,0x78,0x29,0x20,0x2b,
0x20,0x28,0x30,0x2e,0x37,0x31,0x35,0x33,0x39,0x39,0x39,0x38,0x30,0x35,0x34,0x35,
0x30,0x34,0x33,0x39,0x34,0x35,0x33,0x31,0x32,0x35,0x20,0x2a,0x20,0x5f,0x31,0x30,
0x36,0x2e,0x79,0x29,0x29,0x20,0x2b,0x20,0x28,0x30,0x2e,0x30,0x37,0x32,0x30,0x39,
0x39,0x39,0x39,0x38,0x35,0x39,0x33,0x33,0x33,0x30,0x33,0x38,0x33,0x33,0x30,0x30,
0x37,0x38,0x31,0x32,0x35,0x20,0x2a,0x20,0x5f,0x31,0x30,0x36,0x2e,0x7a,0x29,0x29,
0x2c,0x20,0x5f,0x31,0x30,0x36,0x2c,0x20,0x76,0x65,0x63,0x33,0x28,0x70,0x6f,0x73,
0x74,0x5f,0x70,0x72,0x6f,0x63,0x65,0x73,0x73,0x5f,0x63,0x6f,0x6e,0x66,0x69,0x67,
0x5b,0x30,0x5d,0x2e,0x7a,0x29,0x29,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x7d,
0x0a,0x0a,0x00,
]; ];
/* /*
#version 300 es #version 300 es
@ -224,7 +237,8 @@ vs_pp_source_glsl300es := u8.[
{ {
tonemapped = _61; tonemapped = _61;
} }
frag_color = vec4((((pow(tonemapped, vec3(1.0 / post_process_config[0].w)) - vec3(0.5)) * max(post_process_config[0].y, 0.0)) + vec3(0.5)) + vec3(post_process_config[0].x), 1.0); highp vec3 _106 = (((pow(tonemapped, vec3(1.0 / post_process_config[0].w)) - vec3(0.5)) * max(post_process_config[0].y, 0.0)) + vec3(0.5)) + vec3(post_process_config[0].x);
frag_color = vec4(mix(vec3(((0.2125000059604644775390625 * _106.x) + (0.7153999805450439453125 * _106.y)) + (0.07209999859333038330078125 * _106.z)), _106, vec3(post_process_config[0].z)), 1.0);
} }
*/ */
@ -280,8 +294,8 @@ fs_pp_source_glsl300es := u8.[
0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0x0a, 0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0x0a,
0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x6f, 0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x6f,
0x6e,0x65,0x6d,0x61,0x70,0x70,0x65,0x64,0x20,0x3d,0x20,0x5f,0x36,0x31,0x3b,0x0a, 0x6e,0x65,0x6d,0x61,0x70,0x70,0x65,0x64,0x20,0x3d,0x20,0x5f,0x36,0x31,0x3b,0x0a,
0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x66,0x72,0x61,0x67,0x5f,0x63, 0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,
0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x76,0x65,0x63,0x34,0x28,0x28,0x28,0x28,0x70, 0x76,0x65,0x63,0x33,0x20,0x5f,0x31,0x30,0x36,0x20,0x3d,0x20,0x28,0x28,0x28,0x70,
0x6f,0x77,0x28,0x74,0x6f,0x6e,0x65,0x6d,0x61,0x70,0x70,0x65,0x64,0x2c,0x20,0x76, 0x6f,0x77,0x28,0x74,0x6f,0x6e,0x65,0x6d,0x61,0x70,0x70,0x65,0x64,0x2c,0x20,0x76,
0x65,0x63,0x33,0x28,0x31,0x2e,0x30,0x20,0x2f,0x20,0x70,0x6f,0x73,0x74,0x5f,0x70, 0x65,0x63,0x33,0x28,0x31,0x2e,0x30,0x20,0x2f,0x20,0x70,0x6f,0x73,0x74,0x5f,0x70,
0x72,0x6f,0x63,0x65,0x73,0x73,0x5f,0x63,0x6f,0x6e,0x66,0x69,0x67,0x5b,0x30,0x5d, 0x72,0x6f,0x63,0x65,0x73,0x73,0x5f,0x63,0x6f,0x6e,0x66,0x69,0x67,0x5b,0x30,0x5d,
@ -291,8 +305,20 @@ fs_pp_source_glsl300es := u8.[
0x2c,0x20,0x30,0x2e,0x30,0x29,0x29,0x20,0x2b,0x20,0x76,0x65,0x63,0x33,0x28,0x30, 0x2c,0x20,0x30,0x2e,0x30,0x29,0x29,0x20,0x2b,0x20,0x76,0x65,0x63,0x33,0x28,0x30,
0x2e,0x35,0x29,0x29,0x20,0x2b,0x20,0x76,0x65,0x63,0x33,0x28,0x70,0x6f,0x73,0x74, 0x2e,0x35,0x29,0x29,0x20,0x2b,0x20,0x76,0x65,0x63,0x33,0x28,0x70,0x6f,0x73,0x74,
0x5f,0x70,0x72,0x6f,0x63,0x65,0x73,0x73,0x5f,0x63,0x6f,0x6e,0x66,0x69,0x67,0x5b, 0x5f,0x70,0x72,0x6f,0x63,0x65,0x73,0x73,0x5f,0x63,0x6f,0x6e,0x66,0x69,0x67,0x5b,
0x30,0x5d,0x2e,0x78,0x29,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x7d,0x0a,0x0a, 0x30,0x5d,0x2e,0x78,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x72,0x61,0x67,0x5f,
0x00, 0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x76,0x65,0x63,0x34,0x28,0x6d,0x69,0x78,
0x28,0x76,0x65,0x63,0x33,0x28,0x28,0x28,0x30,0x2e,0x32,0x31,0x32,0x35,0x30,0x30,
0x30,0x30,0x35,0x39,0x36,0x30,0x34,0x36,0x34,0x34,0x37,0x37,0x35,0x33,0x39,0x30,
0x36,0x32,0x35,0x20,0x2a,0x20,0x5f,0x31,0x30,0x36,0x2e,0x78,0x29,0x20,0x2b,0x20,
0x28,0x30,0x2e,0x37,0x31,0x35,0x33,0x39,0x39,0x39,0x38,0x30,0x35,0x34,0x35,0x30,
0x34,0x33,0x39,0x34,0x35,0x33,0x31,0x32,0x35,0x20,0x2a,0x20,0x5f,0x31,0x30,0x36,
0x2e,0x79,0x29,0x29,0x20,0x2b,0x20,0x28,0x30,0x2e,0x30,0x37,0x32,0x30,0x39,0x39,
0x39,0x39,0x38,0x35,0x39,0x33,0x33,0x33,0x30,0x33,0x38,0x33,0x33,0x30,0x30,0x37,
0x38,0x31,0x32,0x35,0x20,0x2a,0x20,0x5f,0x31,0x30,0x36,0x2e,0x7a,0x29,0x29,0x2c,
0x20,0x5f,0x31,0x30,0x36,0x2c,0x20,0x76,0x65,0x63,0x33,0x28,0x70,0x6f,0x73,0x74,
0x5f,0x70,0x72,0x6f,0x63,0x65,0x73,0x73,0x5f,0x63,0x6f,0x6e,0x66,0x69,0x67,0x5b,
0x30,0x5d,0x2e,0x7a,0x29,0x29,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x7d,0x0a,
0x0a,0x00,
]; ];
/* /*
#include <metal_stdlib> #include <metal_stdlib>
@ -400,7 +426,8 @@ vs_pp_source_metal_macos := u8.[
{ {
tonemapped = _61; tonemapped = _61;
} }
out.frag_color = float4((((powr(tonemapped, float3(1.0 / _65.gamma)) - float3(0.5)) * fast::max(_65.contrast, 0.0)) + float3(0.5)) + float3(_65.exposure), 1.0); float3 _106 = (((powr(tonemapped, float3(1.0 / _65.gamma)) - float3(0.5)) * fast::max(_65.contrast, 0.0)) + float3(0.5)) + float3(_65.exposure);
out.frag_color = float4(mix(float3(((0.2125000059604644775390625 * _106.x) + (0.7153999805450439453125 * _106.y)) + (0.07209999859333038330078125 * _106.z)), _106, float3(_65.saturation)), 1.0);
return out; return out;
} }
@ -481,18 +508,30 @@ fs_pp_source_metal_macos := u8.[
0x0a,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a, 0x0a,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x6f,0x6e,0x65,0x6d,0x61,0x70,0x70, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x6f,0x6e,0x65,0x6d,0x61,0x70,0x70,
0x65,0x64,0x20,0x3d,0x20,0x5f,0x36,0x31,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a, 0x65,0x64,0x20,0x3d,0x20,0x5f,0x36,0x31,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,
0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c, 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x5f,0x31,0x30,0x36,0x20,
0x6f,0x72,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x28,0x28,0x28,0x70, 0x3d,0x20,0x28,0x28,0x28,0x70,0x6f,0x77,0x72,0x28,0x74,0x6f,0x6e,0x65,0x6d,0x61,
0x6f,0x77,0x72,0x28,0x74,0x6f,0x6e,0x65,0x6d,0x61,0x70,0x70,0x65,0x64,0x2c,0x20, 0x70,0x70,0x65,0x64,0x2c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x28,0x31,0x2e,0x30,
0x66,0x6c,0x6f,0x61,0x74,0x33,0x28,0x31,0x2e,0x30,0x20,0x2f,0x20,0x5f,0x36,0x35, 0x20,0x2f,0x20,0x5f,0x36,0x35,0x2e,0x67,0x61,0x6d,0x6d,0x61,0x29,0x29,0x20,0x2d,
0x2e,0x67,0x61,0x6d,0x6d,0x61,0x29,0x29,0x20,0x2d,0x20,0x66,0x6c,0x6f,0x61,0x74, 0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x28,0x30,0x2e,0x35,0x29,0x29,0x20,0x2a,0x20,
0x33,0x28,0x30,0x2e,0x35,0x29,0x29,0x20,0x2a,0x20,0x66,0x61,0x73,0x74,0x3a,0x3a, 0x66,0x61,0x73,0x74,0x3a,0x3a,0x6d,0x61,0x78,0x28,0x5f,0x36,0x35,0x2e,0x63,0x6f,
0x6d,0x61,0x78,0x28,0x5f,0x36,0x35,0x2e,0x63,0x6f,0x6e,0x74,0x72,0x61,0x73,0x74, 0x6e,0x74,0x72,0x61,0x73,0x74,0x2c,0x20,0x30,0x2e,0x30,0x29,0x29,0x20,0x2b,0x20,
0x2c,0x20,0x30,0x2e,0x30,0x29,0x29,0x20,0x2b,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33, 0x66,0x6c,0x6f,0x61,0x74,0x33,0x28,0x30,0x2e,0x35,0x29,0x29,0x20,0x2b,0x20,0x66,
0x28,0x30,0x2e,0x35,0x29,0x29,0x20,0x2b,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x28, 0x6c,0x6f,0x61,0x74,0x33,0x28,0x5f,0x36,0x35,0x2e,0x65,0x78,0x70,0x6f,0x73,0x75,
0x5f,0x36,0x35,0x2e,0x65,0x78,0x70,0x6f,0x73,0x75,0x72,0x65,0x29,0x2c,0x20,0x31, 0x72,0x65,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x66,0x72,0x61,
0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20, 0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,
0x6f,0x75,0x74,0x3b,0x0a,0x7d,0x0a,0x0a,0x00, 0x28,0x6d,0x69,0x78,0x28,0x66,0x6c,0x6f,0x61,0x74,0x33,0x28,0x28,0x28,0x30,0x2e,
0x32,0x31,0x32,0x35,0x30,0x30,0x30,0x30,0x35,0x39,0x36,0x30,0x34,0x36,0x34,0x34,
0x37,0x37,0x35,0x33,0x39,0x30,0x36,0x32,0x35,0x20,0x2a,0x20,0x5f,0x31,0x30,0x36,
0x2e,0x78,0x29,0x20,0x2b,0x20,0x28,0x30,0x2e,0x37,0x31,0x35,0x33,0x39,0x39,0x39,
0x38,0x30,0x35,0x34,0x35,0x30,0x34,0x33,0x39,0x34,0x35,0x33,0x31,0x32,0x35,0x20,
0x2a,0x20,0x5f,0x31,0x30,0x36,0x2e,0x79,0x29,0x29,0x20,0x2b,0x20,0x28,0x30,0x2e,
0x30,0x37,0x32,0x30,0x39,0x39,0x39,0x39,0x38,0x35,0x39,0x33,0x33,0x33,0x30,0x33,
0x38,0x33,0x33,0x30,0x30,0x37,0x38,0x31,0x32,0x35,0x20,0x2a,0x20,0x5f,0x31,0x30,
0x36,0x2e,0x7a,0x29,0x29,0x2c,0x20,0x5f,0x31,0x30,0x36,0x2c,0x20,0x66,0x6c,0x6f,
0x61,0x74,0x33,0x28,0x5f,0x36,0x35,0x2e,0x73,0x61,0x74,0x75,0x72,0x61,0x74,0x69,
0x6f,0x6e,0x29,0x29,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,
0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x6f,0x75,0x74,0x3b,0x0a,0x7d,0x0a,0x0a,0x00,
]; ];
postprocess_shader_desc :: (backend: sg_backend) -> sg_shader_desc { postprocess_shader_desc :: (backend: sg_backend) -> sg_shader_desc {
desc: sg_shader_desc; desc: sg_shader_desc;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -5,6 +5,7 @@ in vec4 position;
layout(binding=0) uniform plane_vs_params { layout(binding=0) uniform plane_vs_params {
mat4 mvp; mat4 mvp;
float planeHeight;
}; };
out vec4 pos; out vec4 pos;
@ -12,6 +13,7 @@ out flat int idx;
void main() { void main() {
vec3 multisize = vec3(position.xyz * 1000.0); vec3 multisize = vec3(position.xyz * 1000.0);
multisize.y += float(gl_InstanceIndex) * planeHeight;
gl_Position = mvp * vec4(multisize, 1.0); gl_Position = mvp * vec4(multisize, 1.0);
pos = vec4(multisize, 1.0); pos = vec4(multisize, 1.0);
idx = gl_InstanceIndex; idx = gl_InstanceIndex;
@ -26,6 +28,7 @@ out vec4 frag_color;
layout(binding=3) uniform plane_fs_params { layout(binding=3) uniform plane_fs_params {
mat4 mvp_shadow; mat4 mvp_shadow;
int is_reflection;
}; };
uint murmurHash12(uvec2 src) { uint murmurHash12(uvec2 src) {
@ -55,13 +58,12 @@ layout(binding=1) uniform plane_world_config {
int hasClouds; int hasClouds;
int hasPlane;
float planeHeight; float planeHeight;
int planeType; int planeType;
vec3 waterColor;
vec3 deepColor;
float time; float time;
float grassDensity;
}; };
layout(binding=2) uniform plane_data { layout(binding=2) uniform plane_data {
@ -129,37 +131,39 @@ vec3 get_ground_sample(vec4 pos, float dirX, float dirY) {
} }
void main() { void main() {
vec4 npos = floor(pos * 16.0) / 16.0; // vec4 npos = floor(pos * 16.0) / 16.0;
vec2 tileCenter = vec2(floor(npos.x) + 0.5, floor(npos.z) + 0.5); // vec2 tileCenter = vec2(floor(npos.x) + 0.5, floor(npos.z) + 0.5);
vec2 toCenter = npos.xz - tileCenter; // vec2 toCenter = npos.xz - tileCenter;
// Bilinear filtering // // Bilinear filtering
float u = smoothstep(0.2, 0.5, abs(toCenter.x)) * 0.5; // float u = smoothstep(0.2, 0.5, abs(toCenter.x)) * 0.5;
float v = smoothstep(0.2, 0.5, abs(toCenter.y)) * 0.5; // float v = smoothstep(0.2, 0.5, abs(toCenter.y)) * 0.5;
// @ToDo: We should implement some sort of fog system and stop doing all this sampling // // @ToDo: We should implement some sort of fog system and stop doing all this sampling
// stuff if we are far enough from the camera. Currently ground rendering is taking way // // stuff if we are far enough from the camera. Currently ground rendering is taking way
// too much time each frame. // // too much time each frame.
vec3 c0 = get_ground_sample(npos, 0.0, 0.0); // vec3 c0 = get_ground_sample(npos, 0.0, 0.0);
vec3 c1 = get_ground_sample(npos, sign2(toCenter.x), 0.0); // vec3 c1 = get_ground_sample(npos, sign2(toCenter.x), 0.0);
vec3 c2 = get_ground_sample(npos, 0.0, sign2(toCenter.y)); // vec3 c2 = get_ground_sample(npos, 0.0, sign2(toCenter.y));
vec3 c3 = get_ground_sample(npos, sign2(toCenter.x), sign2(toCenter.y)); // vec3 c3 = get_ground_sample(npos, sign2(toCenter.x), sign2(toCenter.y));
// @ToDo: Consider using cool Inigo Quilez trick here to make it even smoother. // // @ToDo: Consider using cool Inigo Quilez trick here to make it even smoother.
vec3 b01 = mix(c0, c1, u); // vec3 b01 = mix(c0, c1, u);
vec3 b23 = mix(c2, c3, u); // vec3 b23 = mix(c2, c3, u);
vec3 bf = mix(b01, b23, v); // vec3 bf = mix(b01, b23, v);
vec4 light_proj_pos = mvp_shadow * vec4(npos.xyz + vec3(1.0/32.0, 0.0, 1.0/32.0), 1.0); // vec4 light_proj_pos = mvp_shadow * vec4(npos.xyz + vec3(1.0/32.0, 0.0, 1.0/32.0), 1.0);
vec3 light_pos = light_proj_pos.xyz / light_proj_pos.w; // vec3 light_pos = light_proj_pos.xyz / light_proj_pos.w;
light_pos = light_pos * 0.5 + 0.5; // light_pos = light_pos * 0.5 + 0.5;
float bias = 0.0005; // float bias = 0.0005;
float shadowp = max(0.7, texture(sampler2DShadow(shadow, shadowsmp), vec3(light_pos.xy, light_pos.z - bias))); // float shadowp = max(0.7, texture(sampler2DShadow(shadow, shadowsmp), vec3(light_pos.xy, light_pos.z - bias)));
if(planeType == 1) { if(idx == 1) {
frag_color = vec4(bf * shadowp, 1.0); float f = skyBase.x * float(screen_h) * mvp_shadow[0][0];
vec4 reflection = texelFetch(sampler2D(reftex, refsmp), ivec2(gl_FragCoord.x, screen_h - gl_FragCoord.y), 0);
frag_color = vec4(reflection.xyz * 0.5 + waterColor * 0.5 + 0.00001 * f, 0.3);
} else { } else {
frag_color = vec4(vec3(shadowp), 1.0); frag_color = vec4(deepColor, 1.0);
} }
} }
@end @end

View File

@ -46,6 +46,10 @@ void main() {
vec3 gammaCorrected = pow(tonemapped, vec3(1.0/gamma)); vec3 gammaCorrected = pow(tonemapped, vec3(1.0/gamma));
gammaCorrected.rgb = ((gammaCorrected.rgb - 0.5f) * max(contrast, 0)) + 0.5f; gammaCorrected.rgb = ((gammaCorrected.rgb - 0.5f) * max(contrast, 0)) + 0.5f;
gammaCorrected.rgb += exposure; gammaCorrected.rgb += exposure;
float lum = (0.2125 * gammaCorrected.r) + (0.7154 * gammaCorrected.g) + (0.0721 * gammaCorrected.b);
vec3 brtColor = vec3(lum, lum, lum);
gammaCorrected.rgb = mix(brtColor, gammaCorrected.rgb, saturation);
frag_color = vec4(gammaCorrected, 1.0); frag_color = vec4(gammaCorrected, 1.0);
} }

View File

@ -31,13 +31,12 @@ layout(binding=1) uniform sky_world_config {
int hasClouds; int hasClouds;
int hasPlane;
float planeHeight; float planeHeight;
int planeType; int planeType;
vec3 waterColor;
vec3 deepColor;
float time; float time;
float grassDensity;
}; };
in vec4 pos; in vec4 pos;

View File

@ -41,13 +41,12 @@ layout(binding=1) uniform trile_world_config {
int hasClouds; int hasClouds;
int hasPlane;
float planeHeight; float planeHeight;
int planeType; int planeType;
vec3 waterColor;
vec3 deepColor;
float time; float time;
float grassDensity;
}; };
in vec3 cam; in vec3 cam;
@ -57,6 +56,11 @@ in vec3 ipos;
in vec4 fnormal; in vec4 fnormal;
out vec4 frag_color; out vec4 frag_color;
layout(binding=3) uniform trile_fs_params {
mat4 mvp_shadow;
int is_reflection;
};
layout(binding = 0) uniform texture2D triletex; layout(binding = 0) uniform texture2D triletex;
layout(binding = 0) uniform sampler trilesmp; layout(binding = 0) uniform sampler trilesmp;
@ -179,6 +183,9 @@ vec3 fresnelSchlick(float cosTheta, vec3 F0) {
} }
void main() { void main() {
if (vpos.y < planeHeight - 0.01 && is_reflection == 1) {
discard;
}
//frag_color = vec4((fnormal.xyz + vec3(1.0, 1.0, 1.0)) * 0.5, 1.0); //frag_color = vec4((fnormal.xyz + vec3(1.0, 1.0, 1.0)) * 0.5, 1.0);
vec3 pos_after_adjust = ipos - fnormal.xyz * 0.02; vec3 pos_after_adjust = ipos - fnormal.xyz * 0.02;
int count = 0; int count = 0;
@ -232,7 +239,7 @@ void main() {
vec3 samp = sky(R, sunPosition); vec3 samp = sky(R, sunPosition);
// light += F * samp * modifier; // light += F * samp * modifier;
frag_color = vec4(vec3(light), 1.0); frag_color = vec4(mix(deepColor, light, smoothstep(0.0, planeHeight, vpos.y)), 1.0);
} }
@end @end

View File

@ -40,13 +40,12 @@ layout(binding=1) uniform trixel_world_config {
int hasClouds; int hasClouds;
int hasPlane;
float planeHeight; float planeHeight;
int planeType; int planeType;
vec3 waterColor;
vec3 deepColor;
float time; float time;
float grassDensity;
}; };
in vec4 color; in vec4 color;

View File

@ -73,11 +73,11 @@ World_Config :: struct {
hasClouds : s32 = 1; @Slider,0,1,1 hasClouds : s32 = 1; @Slider,0,1,1
hasPlane : s32 = 0; @Slider,0,1,1 planeHeight : float = 0.0; @Slider,0,3,0.1
planeHeight : float = 0.0; @Slider,-100,100,1
planeType : s32 = 1; @Slider,0,1,1 planeType : s32 = 1; @Slider,0,1,1
waterColor : Vector3 = .{1.0, 1.0, 1.0}; @Color // @ToDo: sensible default values.
deepColor : Vector3 = .{1.0, 1.0, 1.0}; @Color // @ToDo: sensible default values.
grassDensity : float = 200; @Slider,10,300,1
} }
// Copies over all the fields of our world config into a given shader type. // Copies over all the fields of our world config into a given shader type.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict/>
</plist>

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>BuildLocationStyle</key>
<string>UseAppPreferences</string>
<key>CustomBuildLocationType</key>
<string>RelativeToDerivedData</string>
<key>DerivedDataLocationStyle</key>
<string>Default</string>
<key>ShowSharedSchemesAutomaticallyEnabled</key>
<true/>
</dict>
</plist>

View File

@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1640"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"
buildArchitectures = "Automatic">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "EA317AAE2E9ED68E00D1563E"
BuildableName = "trueno"
BlueprintName = "trueno"
ReferencedContainer = "container:trueno.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "EA317AAE2E9ED68E00D1563E"
BuildableName = "trueno"
BlueprintName = "trueno"
ReferencedContainer = "container:trueno.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SchemeUserState</key>
<dict>
<key>trueno.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>0</integer>
</dict>
</dict>
<key>SuppressBuildableAutocreation</key>
<dict>
<key>EA317AAE2E9ED68E00D1563E</key>
<dict>
<key>primary</key>
<true/>
</dict>
</dict>
</dict>
</plist>