From 78014fcb6fd3cf575ed10580c9fe9a41de7dbd5c Mon Sep 17 00:00:00 2001 From: Katajisto Date: Thu, 23 Oct 2025 22:11:04 +0300 Subject: [PATCH] implement depth of field --- game/game.jai | 9 +- game/resources/postprocess.json | 18 +- game/resources/worlds.json | 5 +- src/main.jai | 2 + src/rendering/backend_sokol.jai | 40 +- src/rendering/backend_sokol_helpers.jai | 42 + src/rendering/pipelines.jai | 120 ++- src/rendering/post_processing.jai | 20 +- src/rendering/rendering.jai | 1 + src/rendering/tasks.jai | 2 +- src/shaders/jai/shader_gbuffer.jai | 450 ++++++--- src/shaders/jai/shader_mix.jai | 574 +++++++++++ src/shaders/jai/shader_op.jai | 945 +++++++++++++++--- src/shaders/shader_gbuffer.glsl | 22 +- src/shaders/shader_mix.glsl | 49 + src/shaders/shader_op.glsl | 64 +- .../UserInterfaceState.xcuserstate | Bin 35307 -> 34999 bytes 17 files changed, 2046 insertions(+), 317 deletions(-) create mode 100644 src/rendering/backend_sokol_helpers.jai create mode 100644 src/shaders/jai/shader_mix.jai create mode 100644 src/shaders/shader_mix.glsl diff --git a/game/game.jai b/game/game.jai index 9030e64..971c4e7 100644 --- a/game/game.jai +++ b/game/game.jai @@ -19,10 +19,11 @@ game_ui :: () { } game_tick :: () { - if input_button_states[#char "W"] & .START then char_pos += Vector3.{1.0, 0.0, 0.0}; - if input_button_states[#char "S"] & .START then char_pos += Vector3.{-1.0, 0.0, 0.0}; - if input_button_states[#char "A"] & .START then char_pos += Vector3.{0.0, 0.0, 1.0}; - if input_button_states[#char "D"] & .START then char_pos += Vector3.{0.0, 0.0, -1.0}; + speed := 0.1; + if input_button_states[#char "W"] & .DOWN then char_pos += speed * Vector3.{-1.0, 0.0, 0.0}; + if input_button_states[#char "S"] & .DOWN then char_pos += speed * Vector3.{1.0, 0.0, 0.0}; + if input_button_states[#char "A"] & .DOWN then char_pos += speed * Vector3.{0.0, 0.0, 1.0}; + if input_button_states[#char "D"] & .DOWN then char_pos += speed * Vector3.{0.0, 0.0, -1.0}; cam.target = char_pos; cam.position = char_pos + .{10,5,0}; } diff --git a/game/resources/postprocess.json b/game/resources/postprocess.json index d08262e..033010b 100644 --- a/game/resources/postprocess.json +++ b/game/resources/postprocess.json @@ -1,8 +1,16 @@ { - "exposure": 0.057475, - "contrast": 1.075945, - "saturation": 1.202777, - "gamma": 1.019477, + "exposure": -0.239281, + "contrast": 1.821381, + "saturation": 0.988528, + "gamma": 2.194679, "tonemap": 1, - "ssao": 2.603531 + "ssao": 0.864454, + "dilate_separation": 1.318038, + "dilate_size": 7, + "dilate_min": 0.142381, + "dilate_max": 0.242047, + "dof_blur_size": 2, + "dof_min": 2.750411, + "dof_max": 15.987307, + "dof_point": 14.644861 } \ No newline at end of file diff --git a/game/resources/worlds.json b/game/resources/worlds.json index 1bd6a4f..75bb248 100644 --- a/game/resources/worlds.json +++ b/game/resources/worlds.json @@ -214,16 +214,17 @@ },{ "trileName": "pillar_top", "positions": [ - 0,2,2,1,0,1,-1,1,-3,2,-1,1,-3,3,2,1 + 0,2,2,1,0,1,-1,1,-3,2,-1,1,-3,3,2,1,-46,3,-13,1,-46,4,-15,1,-48,4,-15,1,-48,4,-13,1 ] },{ "trileName": "test", "positions": [ - -3,1,-1,1,0,1,2,1,-3,1,2,1,0,0,2,1,-3,0,2,1,-3,0,-1,1,0,0,-1,1,-3,2,2,1 + -3,1,-1,1,0,1,2,1,-3,1,2,1,0,0,2,1,-3,0,2,1,-3,0,-1,1,0,0,-1,1,-3,2,2,1,-46,0,-15,1,-46,0,-13,1,-48,0,-13,1,-48,0,-15,1,-46,1,-15,1,-46,1,-13,1,-48,1,-13,1,-48,1,-15,1,-46,2,-15,1,-46,2,-13,1,-48,2,-13,1,-48,2,-15,1,-48,3,-13,1,-48,3,-15,1,-46,3,-15,1 ] },{ "trileName": "plat", "positions": [ + -47,3,-15,1,-47,3,-14,1,-48,3,-14,1,-46,3,-14,1,-47,3,-13,1 ] },{ "trileName": "deck", diff --git a/src/main.jai b/src/main.jai index 57b5ca3..b0ffb71 100644 --- a/src/main.jai +++ b/src/main.jai @@ -35,6 +35,7 @@ V_MINOR :: 5; state: struct { pass_action_clear : sg_pass_action; + pass_action_clear_gbuf : sg_pass_action; pass_action : sg_pass_action; dpi_scale : float; fons : *FONScontext; @@ -88,6 +89,7 @@ init :: () { create_pipelines(); state.pass_action_clear.colors[0] = .{ load_action = .CLEAR, clear_value = .{ r = 0, g = 0, b = 0, a = 0 } }; + state.pass_action_clear_gbuf.colors[0] = .{ load_action = .CLEAR, clear_value = .{ r = 0, g = 0, b = 1000, a = 0 } }; state.pass_action.colors[0] = .{ load_action = .LOAD }; init_asset_pack_load(); diff --git a/src/rendering/backend_sokol.jai b/src/rendering/backend_sokol.jai index 7bbf273..d4ce12b 100644 --- a/src/rendering/backend_sokol.jai +++ b/src/rendering/backend_sokol.jai @@ -8,7 +8,7 @@ current_trile_offset_index : s32 = 0; current_world_config : *World_Config = null; in_shadowmap_pass : bool = false; in_reflection_pass : bool = false; -in_gbuffer_pass : bool = false; +in_gbuffer_pass : bool = false; shadow_mvp : Matrix4; backend_handle_command :: (cmd: *Render_Command) { @@ -30,7 +30,11 @@ backend_handle_command :: (cmd: *Render_Command) { update_image_from_ground(gen_command.world, *gPipelines.plane.bind.images[1]); case .DRAW_GROUND; ground_command := cast(*Render_Command_Draw_Ground)cmd; - backend_draw_ground(ground_command.worldConfig); + if in_gbuffer_pass { + backend_draw_ground_gbuf(ground_command.worldConfig); + } else { + backend_draw_ground(ground_command.worldConfig); + } case .UPDATE_TRIXELS; trixel_update_command := cast(*Render_Command_Update_Trixels)cmd; backend_update_trixels(trixel_update_command); @@ -218,6 +222,27 @@ backend_draw_ground :: (wc: *World_Config) { sg_draw(0, 6, 2); } +backend_draw_ground_gbuf :: (wc: *World_Config) { + mvp := create_viewproj(*camera); + view := create_lookat(*camera); + vs_params : Gbuffer_Vs_Params; + vs_params.mvp = mvp.floats; + vs_params.view_matrix = view.floats; + vs_params.isGround = 1; + vs_params.planeHeight = wc.planeHeight; + sg_apply_pipeline(gPipelines.gbuffer.pipeline); + + bindings : sg_bindings; + bindings.vertex_buffers[0] = g_plane_gbuffer_vertex_buffer; + bindings.vertex_buffers[1] = g_plane_gbuffer_normal_buffer; + bindings.vertex_buffers[2] = g_plane_gbuffer_center_buffer; + bindings.vertex_buffers[3] = g_plane_gbuffer_instance_buffer; + + sg_apply_bindings(*bindings); + sg_apply_uniforms(UB_gbuffer_vs_params, *(sg_range.{ ptr = *vs_params, size = size_of(type_of(vs_params))})); + sg_draw(0, 6, 1); +} + backend_process_command_buckets :: () { // 1. Set up textures and buffers. for render_command_buckets.setup { @@ -248,7 +273,7 @@ backend_process_command_buckets :: () { // 4. G-Buffer pass in_gbuffer_pass = true; - sg_begin_pass(*(sg_pass.{ action = state.pass_action_clear, attachments = g_gbuf_attachments})); + sg_begin_pass(*(sg_pass.{ action = state.pass_action_clear_gbuf, attachments = g_gbuf_attachments})); for render_command_buckets.gbuffer { backend_handle_command(it); } @@ -271,9 +296,15 @@ backend_process_command_buckets :: () { sg_draw(0, 6, 1); sg_end_pass(); + + sg_begin_pass(*(sg_pass.{ action = state.pass_action_clear, attachments = g_ssao_attachments })); sg_apply_pipeline(gPipelines.op.pipeline); + op_uniform : Op_Fs_Params; + op_uniform.blur_size = 1; + op_uniform.op = 0; gPipelines.op.bind.images[0] = g_postprocess_a; + sg_apply_uniforms(UB_op_fs_params, *(sg_range.{ ptr = *op_uniform, size = size_of(type_of(op_uniform)) })); sg_apply_bindings(*gPipelines.op.bind); sg_draw(0, 6, 1); sg_end_pass(); @@ -286,13 +317,14 @@ backend_process_command_buckets :: () { sg_end_pass(); current_trile_offset_index = 0; // This is not optimal, but it is nice and simple. + dof_process(); // Begin drawing to swapchain sg_begin_pass(*(sg_pass.{ action = state.pass_action_clear, swapchain = cast,force(sg_swapchain) sglue_swapchain() })); // Draw the render texture and do post processing: sg_apply_pipeline(gPipelines.postprocess.pipeline); - gPipelines.postprocess.bind.images[0] = g_rendertex; + gPipelines.postprocess.bind.images[0] = g_postprocess_a; sg_apply_bindings(*gPipelines.postprocess.bind); post_process_config_uniform : Post_Process_Config; fill_uniform_with_engine_data(*post_process_config_uniform , *current_post_process); diff --git a/src/rendering/backend_sokol_helpers.jai b/src/rendering/backend_sokol_helpers.jai new file mode 100644 index 0000000..cd07955 --- /dev/null +++ b/src/rendering/backend_sokol_helpers.jai @@ -0,0 +1,42 @@ +dof_process :: () { + sg_begin_pass(*(sg_pass.{ action = state.pass_action_clear, attachments = g_postprocess_attach_a })); + sg_apply_pipeline(gPipelines.op.pipeline); + op_uniform_dilate : Op_Fs_Params; + op_uniform_dilate.blur_size = current_post_process.dof_blur_size; + op_uniform_dilate.op=2; + gPipelines.op.bind.images[0] = g_rendertex; + sg_apply_uniforms(UB_op_fs_params, *(sg_range.{ ptr = *op_uniform_dilate, size = size_of(type_of(op_uniform_dilate)) })); + sg_apply_bindings(*gPipelines.op.bind); + sg_draw(0, 6, 1); + sg_end_pass(); + + sg_begin_pass(*(sg_pass.{ action = state.pass_action_clear, attachments = g_postprocess_attach_b })); + sg_apply_pipeline(gPipelines.op.pipeline); + op_uniform_dof_blur : Op_Fs_Params; + op_uniform_dof_blur.blur_size = current_post_process.dilate_size; + op_uniform_dof_blur.separation = current_post_process.dilate_separation; + op_uniform_dof_blur.dilate_min = current_post_process.dilate_min; + op_uniform_dof_blur.dilate_max = current_post_process.dilate_max; + op_uniform_dof_blur.op=1; + gPipelines.op.bind.images[0] = g_postprocess_a; + sg_apply_uniforms(UB_op_fs_params, *(sg_range.{ ptr = *op_uniform_dof_blur, size = size_of(type_of(op_uniform_dof_blur)) })); + sg_apply_bindings(*gPipelines.op.bind); + sg_draw(0, 6, 1); + sg_end_pass(); + + sg_begin_pass(*(sg_pass.{ action = state.pass_action_clear, attachments = g_postprocess_attach_a })); + sg_apply_pipeline(gPipelines.mix.pipeline); + mix_uniform : Mix_Fs_Params; + mix_uniform.op = 0; + mix_uniform.dof_min = current_post_process.dof_min; + mix_uniform.dof_max = current_post_process.dof_max; + mix_uniform.dof_point = current_post_process.dof_point; + gPipelines.mix.bind.images[0] = g_postprocess_b; + gPipelines.mix.bind.images[1] = g_rendertex; + gPipelines.mix.bind.images[2] = g_gbuf_position; + sg_apply_uniforms(UB_op_fs_params, *(sg_range.{ ptr = *mix_uniform, size = size_of(type_of(mix_uniform)) })); + sg_apply_bindings(*gPipelines.mix.bind); + sg_draw(0, 6, 1); + sg_end_pass(); +} + diff --git a/src/rendering/pipelines.jai b/src/rendering/pipelines.jai index 4093287..ca6aa78 100644 --- a/src/rendering/pipelines.jai +++ b/src/rendering/pipelines.jai @@ -61,6 +61,8 @@ gPipelines : struct { postprocess : Pipeline_Binding; op : Pipeline_Binding; + + mix : Pipeline_Binding; // Renders the SSAO texture using things from the gbuffer pass. ssao: Pipeline_Binding; @@ -136,10 +138,12 @@ create_pipelines :: () { create_postprocess_pipeline(); create_ssao_pipeline(); create_op_pipeline(); + create_mix_pipeline(); create_shadowmap_image(); create_final_image(); create_ssao_images(); + create_gbuffer_impostors(); } create_gbuffer_images :: () { @@ -469,7 +473,6 @@ create_sky_pipeline :: () { gPipelines.sky.bind.vertex_buffers[0] = sg_make_buffer(*vbuffer); } -// @ToDo: This needs to be redone when the window is resized; create_plane_pipeline_reflection_images :: () { binding := *gPipelines.plane.bind; if binding.images[4].id != INVALID_ID then sg_destroy_image(binding.images[4]); @@ -689,6 +692,7 @@ create_postprocess_pipeline :: () { } +// Takes in a texture, manipulates it and outputs it. create_op_pipeline :: () { platconf := get_plat_conf(); pipeline: sg_pipeline_desc; @@ -749,6 +753,67 @@ create_op_pipeline :: () { } +// Takes in 2-3 textures, and mixes them. +create_mix_pipeline :: () { + platconf := get_plat_conf(); + pipeline: sg_pipeline_desc; + shader_desc := mix_shader_desc(sg_query_backend()); + pipeline.shader = sg_make_shader(*shader_desc); + + pipeline.layout.attrs[ATTR_mix_position] = .{ format = .FLOAT2 }; + pipeline.layout.attrs[ATTR_mix_uv] = .{ format = .FLOAT2 }; + pipeline.index_type = .UINT16; + + color_state := sg_color_target_state.{ + blend = .{ + enabled = true, + src_factor_rgb = .SRC_ALPHA, + dst_factor_rgb = .ONE_MINUS_SRC_ALPHA + } + }; + pipeline.depth = .{ + write_enabled = true, + compare = .LESS_EQUAL, + pixel_format = .DEPTH + }; + + pipeline.color_count = 1; + pipeline.colors[0] = color_state; + + gPipelines.mix.pipeline = sg_make_pipeline(*pipeline); + + quad_vertices : [16]float = .[ + -1.0, 1.0, 0.0, flip_if_plat(1.0), // top-let + -1.0, -1.0, 0.0, flip_if_plat(0.0), // bottom-let + 1.0, -1.0, 1.0, flip_if_plat(0.0), // bottom-right + 1.0, 1.0, 1.0, flip_if_plat(1.0), // top-right + ]; + quad_indices : [6]u16 = .[ + 0, 1, 2, 0, 2, 3 + ]; + + vbuffer := sg_buffer_desc.{ size = size_of(float) * 16, data = .{ + ptr = quad_vertices.data, + size = 16 * 4 + }}; + ibuffer := sg_buffer_desc.{ size = size_of(u16) * 6, data = .{ + ptr = quad_indices.data, + size = 6 * 2 + }, + type = .INDEXBUFFER, + }; + + gPipelines.mix.bind.vertex_buffers[0] = sg_make_buffer(*vbuffer); + gPipelines.mix.bind.index_buffer = sg_make_buffer(*ibuffer); + gPipelines.mix.bind.samplers[0] = sg_make_sampler(*(sg_sampler_desc.{ + wrap_u = .CLAMP_TO_EDGE, + wrap_v = .CLAMP_TO_EDGE, + min_filter = .NEAREST, + mag_filter = .NEAREST, + })); + +} + create_ssao_images :: () { if g_ssaobuf.id != INVALID_ID then sg_destroy_image(g_ssaobuf); if g_ssaobuf_depth.id != INVALID_ID then sg_destroy_image(g_ssaobuf_depth); @@ -874,3 +939,56 @@ create_ssao_pipeline :: () { init_plane_textures :: () { gPipelines.plane.bind.images[3] = create_texture_from_pack("./resources/utiltex/water.png"); } + +g_plane_gbuffer_vertex_buffer : sg_buffer; +g_plane_gbuffer_normal_buffer : sg_buffer; +g_plane_gbuffer_center_buffer : sg_buffer; +g_plane_gbuffer_instance_buffer : sg_buffer; + +create_gbuffer_impostors :: () { + plane_vertices: [6]Vector3 = .[ + .{-1.0, 0.0, -1.0}, + .{ 1.0, 0.0, -1.0}, + .{ 1.0, 0.0, 1.0}, + .{-1.0, 0.0, -1.0}, + .{ 1.0, 0.0, 1.0}, + .{-1.0, 0.0, 1.0}, + ]; + vbuffer := sg_buffer_desc.{ size = size_of(float) * 18, data = .{ + ptr = plane_vertices.data, + size = 6 * 3 * 4 + }}; + g_plane_gbuffer_vertex_buffer = sg_make_buffer(*vbuffer); + + plane_normals: [6]Vector3 = .[ + .{0.0, 1.0, 0.0}, + .{0.0, 1.0, 0.0}, + .{0.0, 1.0, 0.0}, + .{0.0, 1.0, 0.0}, + .{0.0, 1.0, 0.0}, + .{0.0, 1.0, 0.0}, + ]; + nbuffer := sg_buffer_desc.{ size = size_of(float) * 18, data = .{ + ptr = plane_normals.data, + size = 6 * 3 * 4 + }}; + g_plane_gbuffer_normal_buffer = sg_make_buffer(*nbuffer); + + plane_centers: [2]Vector3 = .[ // these are useless, just to fill the pipeline requirement. + .{0.0, 1.0, 0.0}, + .{0.0, 1.0, 0.0}, + ]; + cbuffer := sg_buffer_desc.{ size = size_of(float) * 6, data = .{ + ptr = plane_centers.data, + size = 3 * 2 * 4 + }}; + g_plane_gbuffer_center_buffer = sg_make_buffer(*cbuffer); + + instances: [1]Vector4 = .[.{0,0,0,0}]; + instance_buffer := sg_buffer_desc.{size = 4 * 4, data = .{ + ptr = instances.data, + size = 4*4, + }}; + g_plane_gbuffer_instance_buffer = sg_make_buffer(*instance_buffer); + +} diff --git a/src/rendering/post_processing.jai b/src/rendering/post_processing.jai index 7d668f9..b28af5a 100644 --- a/src/rendering/post_processing.jai +++ b/src/rendering/post_processing.jai @@ -1,10 +1,18 @@ Post_Process :: struct { - exposure : float = 0.0; @Slider,-1,1,0.1; - contrast : float = 1.0; @Slider,0.1,4.0,0.1; - saturation : float = 1.0; @Slider,0.0,2.0,0.1; - gamma : float = 1.0; @Slider,0.3,3.0,0.1; - tonemap : float = 1.0; @Slider,0,1,1; - ssao : float = 1.0; @Slider,0,5,0.1; + exposure : float = 0.0; @Slider,-1,1,0.1; + contrast : float = 1.0; @Slider,0.1,4.0,0.1; + saturation : float = 1.0; @Slider,0.0,2.0,0.1; + gamma : float = 1.0; @Slider,0.3,3.0,0.1; + tonemap : float = 1.0; @Slider,0,1,1; + ssao : float = 1.0; @Slider,0,5,0.1; + dilate_separation : float = 1.0; @Slider,0,6,0.1; + dilate_size : s32 = 2; @Slider,0,10,1; + dilate_min : float = 0.1; @Slider,0,1,0.1; + dilate_max : float = 0.3; @Slider,0,1,0.1; + dof_blur_size : s32 = 2; @Slider,0,10,1; + dof_min : float = 1.0; @Slider,0,10,1; + dof_max : float = 3.0; @Slider,0,20,1; + dof_point : float = 5.0; @Slider,0,30,1; } current_post_process : Post_Process; diff --git a/src/rendering/rendering.jai b/src/rendering/rendering.jai index c0bf432..509b938 100644 --- a/src/rendering/rendering.jai +++ b/src/rendering/rendering.jai @@ -17,6 +17,7 @@ #load "helpers.jai"; #load "pipelines.jai"; #load "post_processing.jai"; +#load "backend_sokol_helpers.jai"; #scope_file diff --git a/src/rendering/tasks.jai b/src/rendering/tasks.jai index 08b89b8..ef8e7d3 100644 --- a/src/rendering/tasks.jai +++ b/src/rendering/tasks.jai @@ -115,8 +115,8 @@ tasks_to_commands :: () { commandDrawGround.worldConfig = *(cast(*Rendering_Task_Ground)it).world.conf; commandGenGround := New(Render_Command_Generate_Ground_Texture,, temp); commandGenGround.world = (cast(*Rendering_Task_Ground)it).world; - array_add(*render_command_buckets.setup, commandGenGround); array_add(*render_command_buckets.main, commandDrawGround); + array_add(*render_command_buckets.gbuffer, commandDrawGround); case .SET_CAMERA; task := (cast(*Rendering_Task_Set_Camera)it); command := New(Render_Command_Set_Camera,, temp); diff --git a/src/shaders/jai/shader_gbuffer.jai b/src/shaders/jai/shader_gbuffer.jai index d325169..a563be6 100644 --- a/src/shaders/jai/shader_gbuffer.jai +++ b/src/shaders/jai/shader_gbuffer.jai @@ -30,74 +30,116 @@ UB_gbuffer_vs_params :: 0; Gbuffer_Vs_Params :: struct { mvp: [16]float; view_matrix: [16]float; + isGround: s32; + planeHeight: float; + _: [8]u8; }; /* #version 430 - uniform vec4 gbuffer_vs_params[8]; + struct gbuffer_vs_params + { + mat4 mvp; + mat4 view_matrix; + int isGround; + float planeHeight; + }; + + uniform gbuffer_vs_params _12; + layout(location = 0) in vec4 position; - layout(location = 3) in vec4 instance; layout(location = 0) out vec3 view_space_pos; layout(location = 1) out vec3 view_space_normal; layout(location = 1) in vec4 normal; + layout(location = 3) in vec4 instance; layout(location = 2) in vec4 centre; void main() { - vec4 _23 = vec4(position.xyz + instance.xyz, 1.0); - mat4 _33 = mat4(gbuffer_vs_params[4], gbuffer_vs_params[5], gbuffer_vs_params[6], gbuffer_vs_params[7]); - gl_Position = mat4(gbuffer_vs_params[0], gbuffer_vs_params[1], gbuffer_vs_params[2], gbuffer_vs_params[3]) * _23; - view_space_pos = (_33 * _23).xyz; - view_space_normal = mat3(_33[0].xyz, _33[1].xyz, _33[2].xyz) * normal.xyz; + if (_12.isGround == 1) + { + vec4 _42 = vec4(position.x * 100.0, _12.planeHeight, position.z * 100.0, 1.0); + gl_Position = _12.mvp * _42; + view_space_pos = (_12.view_matrix * _42).xyz; + view_space_normal = mat3(_12.view_matrix[0].xyz, _12.view_matrix[1].xyz, _12.view_matrix[2].xyz) * normal.xyz; + } + else + { + vec4 _92 = vec4(position.xyz + instance.xyz, 1.0); + gl_Position = _12.mvp * _92; + view_space_pos = (_12.view_matrix * _92).xyz; + view_space_normal = mat3(_12.view_matrix[0].xyz, _12.view_matrix[1].xyz, _12.view_matrix[2].xyz) * normal.xyz; + } } */ vs_g_source_glsl430 := u8.[ - 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x34,0x33,0x30,0x0a,0x0a,0x75,0x6e, - 0x69,0x66,0x6f,0x72,0x6d,0x20,0x76,0x65,0x63,0x34,0x20,0x67,0x62,0x75,0x66,0x66, - 0x65,0x72,0x5f,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x38,0x5d,0x3b, + 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x34,0x33,0x30,0x0a,0x0a,0x73,0x74, + 0x72,0x75,0x63,0x74,0x20,0x67,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x76,0x73,0x5f, + 0x70,0x61,0x72,0x61,0x6d,0x73,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x6d,0x61,0x74, + 0x34,0x20,0x6d,0x76,0x70,0x3b,0x0a,0x20,0x20,0x20,0x20,0x6d,0x61,0x74,0x34,0x20, + 0x76,0x69,0x65,0x77,0x5f,0x6d,0x61,0x74,0x72,0x69,0x78,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x69,0x6e,0x74,0x20,0x69,0x73,0x47,0x72,0x6f,0x75,0x6e,0x64,0x3b,0x0a,0x20, + 0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x6c,0x61,0x6e,0x65,0x48,0x65, + 0x69,0x67,0x68,0x74,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a,0x75,0x6e,0x69,0x66,0x6f,0x72, + 0x6d,0x20,0x67,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x76,0x73,0x5f,0x70,0x61,0x72, + 0x61,0x6d,0x73,0x20,0x5f,0x31,0x32,0x3b,0x0a,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74, + 0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29,0x20,0x69, + 0x6e,0x20,0x76,0x65,0x63,0x34,0x20,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3b, 0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e, - 0x20,0x3d,0x20,0x30,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x34,0x20,0x70,0x6f, - 0x73,0x69,0x74,0x69,0x6f,0x6e,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c, - 0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x33,0x29,0x20,0x69,0x6e,0x20, - 0x76,0x65,0x63,0x34,0x20,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x3b,0x0a,0x6c, + 0x20,0x3d,0x20,0x30,0x29,0x20,0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x33,0x20,0x76, + 0x69,0x65,0x77,0x5f,0x73,0x70,0x61,0x63,0x65,0x5f,0x70,0x6f,0x73,0x3b,0x0a,0x6c, 0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d, - 0x20,0x30,0x29,0x20,0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x33,0x20,0x76,0x69,0x65, - 0x77,0x5f,0x73,0x70,0x61,0x63,0x65,0x5f,0x70,0x6f,0x73,0x3b,0x0a,0x6c,0x61,0x79, - 0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x31, - 0x29,0x20,0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x33,0x20,0x76,0x69,0x65,0x77,0x5f, - 0x73,0x70,0x61,0x63,0x65,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x3b,0x0a,0x6c,0x61, - 0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20, - 0x31,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x34,0x20,0x6e,0x6f,0x72,0x6d,0x61, - 0x6c,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69, - 0x6f,0x6e,0x20,0x3d,0x20,0x32,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x34,0x20, - 0x63,0x65,0x6e,0x74,0x72,0x65,0x3b,0x0a,0x0a,0x76,0x6f,0x69,0x64,0x20,0x6d,0x61, - 0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x34,0x20, - 0x5f,0x32,0x33,0x20,0x3d,0x20,0x76,0x65,0x63,0x34,0x28,0x70,0x6f,0x73,0x69,0x74, - 0x69,0x6f,0x6e,0x2e,0x78,0x79,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x73,0x74,0x61,0x6e, - 0x63,0x65,0x2e,0x78,0x79,0x7a,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20, - 0x20,0x20,0x6d,0x61,0x74,0x34,0x20,0x5f,0x33,0x33,0x20,0x3d,0x20,0x6d,0x61,0x74, - 0x34,0x28,0x67,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x76,0x73,0x5f,0x70,0x61,0x72, - 0x61,0x6d,0x73,0x5b,0x34,0x5d,0x2c,0x20,0x67,0x62,0x75,0x66,0x66,0x65,0x72,0x5f, - 0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x35,0x5d,0x2c,0x20,0x67,0x62, - 0x75,0x66,0x66,0x65,0x72,0x5f,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b, - 0x36,0x5d,0x2c,0x20,0x67,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x76,0x73,0x5f,0x70, - 0x61,0x72,0x61,0x6d,0x73,0x5b,0x37,0x5d,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x67, - 0x6c,0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x6d,0x61,0x74, - 0x34,0x28,0x67,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x76,0x73,0x5f,0x70,0x61,0x72, - 0x61,0x6d,0x73,0x5b,0x30,0x5d,0x2c,0x20,0x67,0x62,0x75,0x66,0x66,0x65,0x72,0x5f, - 0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x31,0x5d,0x2c,0x20,0x67,0x62, - 0x75,0x66,0x66,0x65,0x72,0x5f,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b, - 0x32,0x5d,0x2c,0x20,0x67,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x76,0x73,0x5f,0x70, - 0x61,0x72,0x61,0x6d,0x73,0x5b,0x33,0x5d,0x29,0x20,0x2a,0x20,0x5f,0x32,0x33,0x3b, - 0x0a,0x20,0x20,0x20,0x20,0x76,0x69,0x65,0x77,0x5f,0x73,0x70,0x61,0x63,0x65,0x5f, - 0x70,0x6f,0x73,0x20,0x3d,0x20,0x28,0x5f,0x33,0x33,0x20,0x2a,0x20,0x5f,0x32,0x33, - 0x29,0x2e,0x78,0x79,0x7a,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x69,0x65,0x77,0x5f, + 0x20,0x31,0x29,0x20,0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x33,0x20,0x76,0x69,0x65, + 0x77,0x5f,0x73,0x70,0x61,0x63,0x65,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x3b,0x0a, + 0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20, + 0x3d,0x20,0x31,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x34,0x20,0x6e,0x6f,0x72, + 0x6d,0x61,0x6c,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61, + 0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x33,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63, + 0x34,0x20,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x3b,0x0a,0x6c,0x61,0x79,0x6f, + 0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x32,0x29, + 0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x34,0x20,0x63,0x65,0x6e,0x74,0x72,0x65,0x3b, + 0x0a,0x0a,0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a, + 0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x31,0x32,0x2e,0x69,0x73,0x47,0x72, + 0x6f,0x75,0x6e,0x64,0x20,0x3d,0x3d,0x20,0x31,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b, + 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x34,0x20,0x5f,0x34, + 0x32,0x20,0x3d,0x20,0x76,0x65,0x63,0x34,0x28,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f, + 0x6e,0x2e,0x78,0x20,0x2a,0x20,0x31,0x30,0x30,0x2e,0x30,0x2c,0x20,0x5f,0x31,0x32, + 0x2e,0x70,0x6c,0x61,0x6e,0x65,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x70,0x6f, + 0x73,0x69,0x74,0x69,0x6f,0x6e,0x2e,0x7a,0x20,0x2a,0x20,0x31,0x30,0x30,0x2e,0x30, + 0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x67,0x6c,0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x5f,0x31, + 0x32,0x2e,0x6d,0x76,0x70,0x20,0x2a,0x20,0x5f,0x34,0x32,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x76,0x69,0x65,0x77,0x5f,0x73,0x70,0x61,0x63,0x65,0x5f, + 0x70,0x6f,0x73,0x20,0x3d,0x20,0x28,0x5f,0x31,0x32,0x2e,0x76,0x69,0x65,0x77,0x5f, + 0x6d,0x61,0x74,0x72,0x69,0x78,0x20,0x2a,0x20,0x5f,0x34,0x32,0x29,0x2e,0x78,0x79, + 0x7a,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x69,0x65,0x77,0x5f, 0x73,0x70,0x61,0x63,0x65,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20,0x3d,0x20,0x6d, - 0x61,0x74,0x33,0x28,0x5f,0x33,0x33,0x5b,0x30,0x5d,0x2e,0x78,0x79,0x7a,0x2c,0x20, - 0x5f,0x33,0x33,0x5b,0x31,0x5d,0x2e,0x78,0x79,0x7a,0x2c,0x20,0x5f,0x33,0x33,0x5b, - 0x32,0x5d,0x2e,0x78,0x79,0x7a,0x29,0x20,0x2a,0x20,0x6e,0x6f,0x72,0x6d,0x61,0x6c, - 0x2e,0x78,0x79,0x7a,0x3b,0x0a,0x7d,0x0a,0x0a,0x00, + 0x61,0x74,0x33,0x28,0x5f,0x31,0x32,0x2e,0x76,0x69,0x65,0x77,0x5f,0x6d,0x61,0x74, + 0x72,0x69,0x78,0x5b,0x30,0x5d,0x2e,0x78,0x79,0x7a,0x2c,0x20,0x5f,0x31,0x32,0x2e, + 0x76,0x69,0x65,0x77,0x5f,0x6d,0x61,0x74,0x72,0x69,0x78,0x5b,0x31,0x5d,0x2e,0x78, + 0x79,0x7a,0x2c,0x20,0x5f,0x31,0x32,0x2e,0x76,0x69,0x65,0x77,0x5f,0x6d,0x61,0x74, + 0x72,0x69,0x78,0x5b,0x32,0x5d,0x2e,0x78,0x79,0x7a,0x29,0x20,0x2a,0x20,0x6e,0x6f, + 0x72,0x6d,0x61,0x6c,0x2e,0x78,0x79,0x7a,0x3b,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,0x76,0x65,0x63,0x34,0x20,0x5f,0x39,0x32,0x20, + 0x3d,0x20,0x76,0x65,0x63,0x34,0x28,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x2e, + 0x78,0x79,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x2e,0x78, + 0x79,0x7a,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x67,0x6c,0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20, + 0x5f,0x31,0x32,0x2e,0x6d,0x76,0x70,0x20,0x2a,0x20,0x5f,0x39,0x32,0x3b,0x0a,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x69,0x65,0x77,0x5f,0x73,0x70,0x61,0x63, + 0x65,0x5f,0x70,0x6f,0x73,0x20,0x3d,0x20,0x28,0x5f,0x31,0x32,0x2e,0x76,0x69,0x65, + 0x77,0x5f,0x6d,0x61,0x74,0x72,0x69,0x78,0x20,0x2a,0x20,0x5f,0x39,0x32,0x29,0x2e, + 0x78,0x79,0x7a,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x69,0x65, + 0x77,0x5f,0x73,0x70,0x61,0x63,0x65,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20,0x3d, + 0x20,0x6d,0x61,0x74,0x33,0x28,0x5f,0x31,0x32,0x2e,0x76,0x69,0x65,0x77,0x5f,0x6d, + 0x61,0x74,0x72,0x69,0x78,0x5b,0x30,0x5d,0x2e,0x78,0x79,0x7a,0x2c,0x20,0x5f,0x31, + 0x32,0x2e,0x76,0x69,0x65,0x77,0x5f,0x6d,0x61,0x74,0x72,0x69,0x78,0x5b,0x31,0x5d, + 0x2e,0x78,0x79,0x7a,0x2c,0x20,0x5f,0x31,0x32,0x2e,0x76,0x69,0x65,0x77,0x5f,0x6d, + 0x61,0x74,0x72,0x69,0x78,0x5b,0x32,0x5d,0x2e,0x78,0x79,0x7a,0x29,0x20,0x2a,0x20, + 0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x2e,0x78,0x79,0x7a,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x7d,0x0a,0x7d,0x0a,0x0a,0x00, ]; /* #version 430 @@ -139,68 +181,106 @@ fs_g_source_glsl430 := u8.[ /* #version 300 es - uniform vec4 gbuffer_vs_params[8]; + struct gbuffer_vs_params + { + mat4 mvp; + mat4 view_matrix; + int isGround; + float planeHeight; + }; + + uniform gbuffer_vs_params _12; + layout(location = 0) in vec4 position; - layout(location = 3) in vec4 instance; out vec3 view_space_pos; out vec3 view_space_normal; layout(location = 1) in vec4 normal; + layout(location = 3) in vec4 instance; layout(location = 2) in vec4 centre; void main() { - vec4 _23 = vec4(position.xyz + instance.xyz, 1.0); - mat4 _33 = mat4(gbuffer_vs_params[4], gbuffer_vs_params[5], gbuffer_vs_params[6], gbuffer_vs_params[7]); - gl_Position = mat4(gbuffer_vs_params[0], gbuffer_vs_params[1], gbuffer_vs_params[2], gbuffer_vs_params[3]) * _23; - view_space_pos = (_33 * _23).xyz; - view_space_normal = mat3(_33[0].xyz, _33[1].xyz, _33[2].xyz) * normal.xyz; + if (_12.isGround == 1) + { + vec4 _42 = vec4(position.x * 100.0, _12.planeHeight, position.z * 100.0, 1.0); + gl_Position = _12.mvp * _42; + view_space_pos = (_12.view_matrix * _42).xyz; + view_space_normal = mat3(_12.view_matrix[0].xyz, _12.view_matrix[1].xyz, _12.view_matrix[2].xyz) * normal.xyz; + } + else + { + vec4 _92 = vec4(position.xyz + instance.xyz, 1.0); + gl_Position = _12.mvp * _92; + view_space_pos = (_12.view_matrix * _92).xyz; + view_space_normal = mat3(_12.view_matrix[0].xyz, _12.view_matrix[1].xyz, _12.view_matrix[2].xyz) * normal.xyz; + } } */ vs_g_source_glsl300es := u8.[ 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x33,0x30,0x30,0x20,0x65,0x73,0x0a, - 0x0a,0x75,0x6e,0x69,0x66,0x6f,0x72,0x6d,0x20,0x76,0x65,0x63,0x34,0x20,0x67,0x62, - 0x75,0x66,0x66,0x65,0x72,0x5f,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b, - 0x38,0x5d,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74, - 0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x34, - 0x20,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75, - 0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x33,0x29,0x20, - 0x69,0x6e,0x20,0x76,0x65,0x63,0x34,0x20,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65, - 0x3b,0x0a,0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x33,0x20,0x76,0x69,0x65,0x77,0x5f, - 0x73,0x70,0x61,0x63,0x65,0x5f,0x70,0x6f,0x73,0x3b,0x0a,0x6f,0x75,0x74,0x20,0x76, - 0x65,0x63,0x33,0x20,0x76,0x69,0x65,0x77,0x5f,0x73,0x70,0x61,0x63,0x65,0x5f,0x6e, - 0x6f,0x72,0x6d,0x61,0x6c,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f, - 0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x31,0x29,0x20,0x69,0x6e,0x20,0x76, - 0x65,0x63,0x34,0x20,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x3b,0x0a,0x6c,0x61,0x79,0x6f, - 0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x32,0x29, - 0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x34,0x20,0x63,0x65,0x6e,0x74,0x72,0x65,0x3b, - 0x0a,0x0a,0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a, - 0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x34,0x20,0x5f,0x32,0x33,0x20,0x3d,0x20,0x76, - 0x65,0x63,0x34,0x28,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x2e,0x78,0x79,0x7a, - 0x20,0x2b,0x20,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x2e,0x78,0x79,0x7a,0x2c, - 0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x6d,0x61,0x74,0x34,0x20, - 0x5f,0x33,0x33,0x20,0x3d,0x20,0x6d,0x61,0x74,0x34,0x28,0x67,0x62,0x75,0x66,0x66, - 0x65,0x72,0x5f,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x34,0x5d,0x2c, - 0x20,0x67,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x76,0x73,0x5f,0x70,0x61,0x72,0x61, - 0x6d,0x73,0x5b,0x35,0x5d,0x2c,0x20,0x67,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x76, - 0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x36,0x5d,0x2c,0x20,0x67,0x62,0x75, - 0x66,0x66,0x65,0x72,0x5f,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x37, - 0x5d,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x67,0x6c,0x5f,0x50,0x6f,0x73,0x69,0x74, - 0x69,0x6f,0x6e,0x20,0x3d,0x20,0x6d,0x61,0x74,0x34,0x28,0x67,0x62,0x75,0x66,0x66, - 0x65,0x72,0x5f,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x30,0x5d,0x2c, - 0x20,0x67,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x76,0x73,0x5f,0x70,0x61,0x72,0x61, - 0x6d,0x73,0x5b,0x31,0x5d,0x2c,0x20,0x67,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x76, - 0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x32,0x5d,0x2c,0x20,0x67,0x62,0x75, - 0x66,0x66,0x65,0x72,0x5f,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x33, - 0x5d,0x29,0x20,0x2a,0x20,0x5f,0x32,0x33,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x69, + 0x0a,0x73,0x74,0x72,0x75,0x63,0x74,0x20,0x67,0x62,0x75,0x66,0x66,0x65,0x72,0x5f, + 0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20, + 0x6d,0x61,0x74,0x34,0x20,0x6d,0x76,0x70,0x3b,0x0a,0x20,0x20,0x20,0x20,0x6d,0x61, + 0x74,0x34,0x20,0x76,0x69,0x65,0x77,0x5f,0x6d,0x61,0x74,0x72,0x69,0x78,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x73,0x47,0x72,0x6f,0x75,0x6e,0x64, + 0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x6c,0x61,0x6e, + 0x65,0x48,0x65,0x69,0x67,0x68,0x74,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a,0x75,0x6e,0x69, + 0x66,0x6f,0x72,0x6d,0x20,0x67,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x76,0x73,0x5f, + 0x70,0x61,0x72,0x61,0x6d,0x73,0x20,0x5f,0x31,0x32,0x3b,0x0a,0x0a,0x6c,0x61,0x79, + 0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30, + 0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x34,0x20,0x70,0x6f,0x73,0x69,0x74,0x69, + 0x6f,0x6e,0x3b,0x0a,0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x33,0x20,0x76,0x69,0x65, + 0x77,0x5f,0x73,0x70,0x61,0x63,0x65,0x5f,0x70,0x6f,0x73,0x3b,0x0a,0x6f,0x75,0x74, + 0x20,0x76,0x65,0x63,0x33,0x20,0x76,0x69,0x65,0x77,0x5f,0x73,0x70,0x61,0x63,0x65, + 0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28, + 0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x31,0x29,0x20,0x69,0x6e, + 0x20,0x76,0x65,0x63,0x34,0x20,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x3b,0x0a,0x6c,0x61, + 0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20, + 0x33,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x34,0x20,0x69,0x6e,0x73,0x74,0x61, + 0x6e,0x63,0x65,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61, + 0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x32,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63, + 0x34,0x20,0x63,0x65,0x6e,0x74,0x72,0x65,0x3b,0x0a,0x0a,0x76,0x6f,0x69,0x64,0x20, + 0x6d,0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20, + 0x28,0x5f,0x31,0x32,0x2e,0x69,0x73,0x47,0x72,0x6f,0x75,0x6e,0x64,0x20,0x3d,0x3d, + 0x20,0x31,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x76,0x65,0x63,0x34,0x20,0x5f,0x34,0x32,0x20,0x3d,0x20,0x76,0x65,0x63, + 0x34,0x28,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x2e,0x78,0x20,0x2a,0x20,0x31, + 0x30,0x30,0x2e,0x30,0x2c,0x20,0x5f,0x31,0x32,0x2e,0x70,0x6c,0x61,0x6e,0x65,0x48, + 0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x2e, + 0x7a,0x20,0x2a,0x20,0x31,0x30,0x30,0x2e,0x30,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x67,0x6c,0x5f,0x50,0x6f,0x73,0x69, + 0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x5f,0x31,0x32,0x2e,0x6d,0x76,0x70,0x20,0x2a, + 0x20,0x5f,0x34,0x32,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x69, 0x65,0x77,0x5f,0x73,0x70,0x61,0x63,0x65,0x5f,0x70,0x6f,0x73,0x20,0x3d,0x20,0x28, - 0x5f,0x33,0x33,0x20,0x2a,0x20,0x5f,0x32,0x33,0x29,0x2e,0x78,0x79,0x7a,0x3b,0x0a, + 0x5f,0x31,0x32,0x2e,0x76,0x69,0x65,0x77,0x5f,0x6d,0x61,0x74,0x72,0x69,0x78,0x20, + 0x2a,0x20,0x5f,0x34,0x32,0x29,0x2e,0x78,0x79,0x7a,0x3b,0x0a,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x76,0x69,0x65,0x77,0x5f,0x73,0x70,0x61,0x63,0x65,0x5f,0x6e, - 0x6f,0x72,0x6d,0x61,0x6c,0x20,0x3d,0x20,0x6d,0x61,0x74,0x33,0x28,0x5f,0x33,0x33, - 0x5b,0x30,0x5d,0x2e,0x78,0x79,0x7a,0x2c,0x20,0x5f,0x33,0x33,0x5b,0x31,0x5d,0x2e, - 0x78,0x79,0x7a,0x2c,0x20,0x5f,0x33,0x33,0x5b,0x32,0x5d,0x2e,0x78,0x79,0x7a,0x29, - 0x20,0x2a,0x20,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x2e,0x78,0x79,0x7a,0x3b,0x0a,0x7d, - 0x0a,0x0a,0x00, + 0x6f,0x72,0x6d,0x61,0x6c,0x20,0x3d,0x20,0x6d,0x61,0x74,0x33,0x28,0x5f,0x31,0x32, + 0x2e,0x76,0x69,0x65,0x77,0x5f,0x6d,0x61,0x74,0x72,0x69,0x78,0x5b,0x30,0x5d,0x2e, + 0x78,0x79,0x7a,0x2c,0x20,0x5f,0x31,0x32,0x2e,0x76,0x69,0x65,0x77,0x5f,0x6d,0x61, + 0x74,0x72,0x69,0x78,0x5b,0x31,0x5d,0x2e,0x78,0x79,0x7a,0x2c,0x20,0x5f,0x31,0x32, + 0x2e,0x76,0x69,0x65,0x77,0x5f,0x6d,0x61,0x74,0x72,0x69,0x78,0x5b,0x32,0x5d,0x2e, + 0x78,0x79,0x7a,0x29,0x20,0x2a,0x20,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x2e,0x78,0x79, + 0x7a,0x3b,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, + 0x76,0x65,0x63,0x34,0x20,0x5f,0x39,0x32,0x20,0x3d,0x20,0x76,0x65,0x63,0x34,0x28, + 0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x2e,0x78,0x79,0x7a,0x20,0x2b,0x20,0x69, + 0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x2e,0x78,0x79,0x7a,0x2c,0x20,0x31,0x2e,0x30, + 0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x67,0x6c,0x5f,0x50,0x6f, + 0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x5f,0x31,0x32,0x2e,0x6d,0x76,0x70, + 0x20,0x2a,0x20,0x5f,0x39,0x32,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x76,0x69,0x65,0x77,0x5f,0x73,0x70,0x61,0x63,0x65,0x5f,0x70,0x6f,0x73,0x20,0x3d, + 0x20,0x28,0x5f,0x31,0x32,0x2e,0x76,0x69,0x65,0x77,0x5f,0x6d,0x61,0x74,0x72,0x69, + 0x78,0x20,0x2a,0x20,0x5f,0x39,0x32,0x29,0x2e,0x78,0x79,0x7a,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x69,0x65,0x77,0x5f,0x73,0x70,0x61,0x63,0x65, + 0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20,0x3d,0x20,0x6d,0x61,0x74,0x33,0x28,0x5f, + 0x31,0x32,0x2e,0x76,0x69,0x65,0x77,0x5f,0x6d,0x61,0x74,0x72,0x69,0x78,0x5b,0x30, + 0x5d,0x2e,0x78,0x79,0x7a,0x2c,0x20,0x5f,0x31,0x32,0x2e,0x76,0x69,0x65,0x77,0x5f, + 0x6d,0x61,0x74,0x72,0x69,0x78,0x5b,0x31,0x5d,0x2e,0x78,0x79,0x7a,0x2c,0x20,0x5f, + 0x31,0x32,0x2e,0x76,0x69,0x65,0x77,0x5f,0x6d,0x61,0x74,0x72,0x69,0x78,0x5b,0x32, + 0x5d,0x2e,0x78,0x79,0x7a,0x29,0x20,0x2a,0x20,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x2e, + 0x78,0x79,0x7a,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x7d,0x0a,0x0a,0x00, ]; /* #version 300 es @@ -253,6 +333,8 @@ fs_g_source_glsl300es := u8.[ { float4x4 mvp; float4x4 view_matrix; + int isGround; + float planeHeight; }; struct main0_out @@ -269,13 +351,23 @@ fs_g_source_glsl300es := u8.[ float4 instance [[attribute(3)]]; }; - vertex main0_out main0(main0_in in [[stage_in]], constant gbuffer_vs_params& _28 [[buffer(0)]]) + vertex main0_out main0(main0_in in [[stage_in]], constant gbuffer_vs_params& _12 [[buffer(0)]]) { main0_out out = {}; - float4 _23 = float4(in.position.xyz + in.instance.xyz, 1.0); - out.gl_Position = _28.mvp * _23; - out.view_space_pos = (_28.view_matrix * _23).xyz; - out.view_space_normal = float3x3(_28.view_matrix[0].xyz, _28.view_matrix[1].xyz, _28.view_matrix[2].xyz) * in.normal.xyz; + if (_12.isGround == 1) + { + float4 _42 = float4(in.position.x * 100.0, _12.planeHeight, in.position.z * 100.0, 1.0); + out.gl_Position = _12.mvp * _42; + out.view_space_pos = (_12.view_matrix * _42).xyz; + out.view_space_normal = float3x3(_12.view_matrix[0].xyz, _12.view_matrix[1].xyz, _12.view_matrix[2].xyz) * in.normal.xyz; + } + else + { + float4 _92 = float4(in.position.xyz + in.instance.xyz, 1.0); + out.gl_Position = _12.mvp * _92; + out.view_space_pos = (_12.view_matrix * _92).xyz; + out.view_space_normal = float3x3(_12.view_matrix[0].xyz, _12.view_matrix[1].xyz, _12.view_matrix[2].xyz) * in.normal.xyz; + } return out; } @@ -289,52 +381,80 @@ vs_g_source_metal_macos := u8.[ 0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73, 0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x78,0x34,0x20, 0x6d,0x76,0x70,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x78, - 0x34,0x20,0x76,0x69,0x65,0x77,0x5f,0x6d,0x61,0x74,0x72,0x69,0x78,0x3b,0x0a,0x7d, - 0x3b,0x0a,0x0a,0x73,0x74,0x72,0x75,0x63,0x74,0x20,0x6d,0x61,0x69,0x6e,0x30,0x5f, - 0x6f,0x75,0x74,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33, - 0x20,0x76,0x69,0x65,0x77,0x5f,0x73,0x70,0x61,0x63,0x65,0x5f,0x70,0x6f,0x73,0x20, - 0x5b,0x5b,0x75,0x73,0x65,0x72,0x28,0x6c,0x6f,0x63,0x6e,0x30,0x29,0x5d,0x5d,0x3b, - 0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x76,0x69,0x65,0x77, - 0x5f,0x73,0x70,0x61,0x63,0x65,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20,0x5b,0x5b, - 0x75,0x73,0x65,0x72,0x28,0x6c,0x6f,0x63,0x6e,0x31,0x29,0x5d,0x5d,0x3b,0x0a,0x20, - 0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x67,0x6c,0x5f,0x50,0x6f,0x73, - 0x69,0x74,0x69,0x6f,0x6e,0x20,0x5b,0x5b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e, - 0x5d,0x5d,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a,0x73,0x74,0x72,0x75,0x63,0x74,0x20,0x6d, - 0x61,0x69,0x6e,0x30,0x5f,0x69,0x6e,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c, - 0x6f,0x61,0x74,0x34,0x20,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x5b,0x5b, - 0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x28,0x30,0x29,0x5d,0x5d,0x3b,0x0a, - 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6e,0x6f,0x72,0x6d,0x61, - 0x6c,0x20,0x5b,0x5b,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x28,0x31,0x29, - 0x5d,0x5d,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69, - 0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x20,0x5b,0x5b,0x61,0x74,0x74,0x72,0x69,0x62, - 0x75,0x74,0x65,0x28,0x33,0x29,0x5d,0x5d,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a,0x76,0x65, - 0x72,0x74,0x65,0x78,0x20,0x6d,0x61,0x69,0x6e,0x30,0x5f,0x6f,0x75,0x74,0x20,0x6d, - 0x61,0x69,0x6e,0x30,0x28,0x6d,0x61,0x69,0x6e,0x30,0x5f,0x69,0x6e,0x20,0x69,0x6e, - 0x20,0x5b,0x5b,0x73,0x74,0x61,0x67,0x65,0x5f,0x69,0x6e,0x5d,0x5d,0x2c,0x20,0x63, - 0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x67,0x62,0x75,0x66,0x66,0x65,0x72,0x5f, - 0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x26,0x20,0x5f,0x32,0x38,0x20,0x5b, - 0x5b,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x30,0x29,0x5d,0x5d,0x29,0x0a,0x7b,0x0a, - 0x20,0x20,0x20,0x20,0x6d,0x61,0x69,0x6e,0x30,0x5f,0x6f,0x75,0x74,0x20,0x6f,0x75, - 0x74,0x20,0x3d,0x20,0x7b,0x7d,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61, - 0x74,0x34,0x20,0x5f,0x32,0x33,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28, - 0x69,0x6e,0x2e,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x2e,0x78,0x79,0x7a,0x20, - 0x2b,0x20,0x69,0x6e,0x2e,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x2e,0x78,0x79, - 0x7a,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x6f,0x75,0x74, - 0x2e,0x67,0x6c,0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x5f, - 0x32,0x38,0x2e,0x6d,0x76,0x70,0x20,0x2a,0x20,0x5f,0x32,0x33,0x3b,0x0a,0x20,0x20, - 0x20,0x20,0x6f,0x75,0x74,0x2e,0x76,0x69,0x65,0x77,0x5f,0x73,0x70,0x61,0x63,0x65, - 0x5f,0x70,0x6f,0x73,0x20,0x3d,0x20,0x28,0x5f,0x32,0x38,0x2e,0x76,0x69,0x65,0x77, - 0x5f,0x6d,0x61,0x74,0x72,0x69,0x78,0x20,0x2a,0x20,0x5f,0x32,0x33,0x29,0x2e,0x78, - 0x79,0x7a,0x3b,0x0a,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x76,0x69,0x65,0x77, - 0x5f,0x73,0x70,0x61,0x63,0x65,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20,0x3d,0x20, - 0x66,0x6c,0x6f,0x61,0x74,0x33,0x78,0x33,0x28,0x5f,0x32,0x38,0x2e,0x76,0x69,0x65, - 0x77,0x5f,0x6d,0x61,0x74,0x72,0x69,0x78,0x5b,0x30,0x5d,0x2e,0x78,0x79,0x7a,0x2c, - 0x20,0x5f,0x32,0x38,0x2e,0x76,0x69,0x65,0x77,0x5f,0x6d,0x61,0x74,0x72,0x69,0x78, - 0x5b,0x31,0x5d,0x2e,0x78,0x79,0x7a,0x2c,0x20,0x5f,0x32,0x38,0x2e,0x76,0x69,0x65, - 0x77,0x5f,0x6d,0x61,0x74,0x72,0x69,0x78,0x5b,0x32,0x5d,0x2e,0x78,0x79,0x7a,0x29, - 0x20,0x2a,0x20,0x69,0x6e,0x2e,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x2e,0x78,0x79,0x7a, - 0x3b,0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x6f,0x75,0x74, - 0x3b,0x0a,0x7d,0x0a,0x0a,0x00, + 0x34,0x20,0x76,0x69,0x65,0x77,0x5f,0x6d,0x61,0x74,0x72,0x69,0x78,0x3b,0x0a,0x20, + 0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x73,0x47,0x72,0x6f,0x75,0x6e,0x64,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x6c,0x61,0x6e,0x65, + 0x48,0x65,0x69,0x67,0x68,0x74,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a,0x73,0x74,0x72,0x75, + 0x63,0x74,0x20,0x6d,0x61,0x69,0x6e,0x30,0x5f,0x6f,0x75,0x74,0x0a,0x7b,0x0a,0x20, + 0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x76,0x69,0x65,0x77,0x5f,0x73, + 0x70,0x61,0x63,0x65,0x5f,0x70,0x6f,0x73,0x20,0x5b,0x5b,0x75,0x73,0x65,0x72,0x28, + 0x6c,0x6f,0x63,0x6e,0x30,0x29,0x5d,0x5d,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c, + 0x6f,0x61,0x74,0x33,0x20,0x76,0x69,0x65,0x77,0x5f,0x73,0x70,0x61,0x63,0x65,0x5f, + 0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20,0x5b,0x5b,0x75,0x73,0x65,0x72,0x28,0x6c,0x6f, + 0x63,0x6e,0x31,0x29,0x5d,0x5d,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61, + 0x74,0x34,0x20,0x67,0x6c,0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x5b, + 0x5b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x5d,0x5d,0x3b,0x0a,0x7d,0x3b,0x0a, + 0x0a,0x73,0x74,0x72,0x75,0x63,0x74,0x20,0x6d,0x61,0x69,0x6e,0x30,0x5f,0x69,0x6e, + 0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x70,0x6f, + 0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x5b,0x5b,0x61,0x74,0x74,0x72,0x69,0x62,0x75, + 0x74,0x65,0x28,0x30,0x29,0x5d,0x5d,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f, + 0x61,0x74,0x34,0x20,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20,0x5b,0x5b,0x61,0x74,0x74, + 0x72,0x69,0x62,0x75,0x74,0x65,0x28,0x31,0x29,0x5d,0x5d,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65, + 0x20,0x5b,0x5b,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x28,0x33,0x29,0x5d, + 0x5d,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a,0x76,0x65,0x72,0x74,0x65,0x78,0x20,0x6d,0x61, + 0x69,0x6e,0x30,0x5f,0x6f,0x75,0x74,0x20,0x6d,0x61,0x69,0x6e,0x30,0x28,0x6d,0x61, + 0x69,0x6e,0x30,0x5f,0x69,0x6e,0x20,0x69,0x6e,0x20,0x5b,0x5b,0x73,0x74,0x61,0x67, + 0x65,0x5f,0x69,0x6e,0x5d,0x5d,0x2c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74, + 0x20,0x67,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x76,0x73,0x5f,0x70,0x61,0x72,0x61, + 0x6d,0x73,0x26,0x20,0x5f,0x31,0x32,0x20,0x5b,0x5b,0x62,0x75,0x66,0x66,0x65,0x72, + 0x28,0x30,0x29,0x5d,0x5d,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x6d,0x61,0x69, + 0x6e,0x30,0x5f,0x6f,0x75,0x74,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x7b,0x7d,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x31,0x32,0x2e,0x69,0x73,0x47, + 0x72,0x6f,0x75,0x6e,0x64,0x20,0x3d,0x3d,0x20,0x31,0x29,0x0a,0x20,0x20,0x20,0x20, + 0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34, + 0x20,0x5f,0x34,0x32,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x69,0x6e, + 0x2e,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x2e,0x78,0x20,0x2a,0x20,0x31,0x30, + 0x30,0x2e,0x30,0x2c,0x20,0x5f,0x31,0x32,0x2e,0x70,0x6c,0x61,0x6e,0x65,0x48,0x65, + 0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x2e,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f, + 0x6e,0x2e,0x7a,0x20,0x2a,0x20,0x31,0x30,0x30,0x2e,0x30,0x2c,0x20,0x31,0x2e,0x30, + 0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x67, + 0x6c,0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x5f,0x31,0x32, + 0x2e,0x6d,0x76,0x70,0x20,0x2a,0x20,0x5f,0x34,0x32,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x76,0x69,0x65,0x77,0x5f,0x73,0x70,0x61, + 0x63,0x65,0x5f,0x70,0x6f,0x73,0x20,0x3d,0x20,0x28,0x5f,0x31,0x32,0x2e,0x76,0x69, + 0x65,0x77,0x5f,0x6d,0x61,0x74,0x72,0x69,0x78,0x20,0x2a,0x20,0x5f,0x34,0x32,0x29, + 0x2e,0x78,0x79,0x7a,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75, + 0x74,0x2e,0x76,0x69,0x65,0x77,0x5f,0x73,0x70,0x61,0x63,0x65,0x5f,0x6e,0x6f,0x72, + 0x6d,0x61,0x6c,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x78,0x33,0x28,0x5f, + 0x31,0x32,0x2e,0x76,0x69,0x65,0x77,0x5f,0x6d,0x61,0x74,0x72,0x69,0x78,0x5b,0x30, + 0x5d,0x2e,0x78,0x79,0x7a,0x2c,0x20,0x5f,0x31,0x32,0x2e,0x76,0x69,0x65,0x77,0x5f, + 0x6d,0x61,0x74,0x72,0x69,0x78,0x5b,0x31,0x5d,0x2e,0x78,0x79,0x7a,0x2c,0x20,0x5f, + 0x31,0x32,0x2e,0x76,0x69,0x65,0x77,0x5f,0x6d,0x61,0x74,0x72,0x69,0x78,0x5b,0x32, + 0x5d,0x2e,0x78,0x79,0x7a,0x29,0x20,0x2a,0x20,0x69,0x6e,0x2e,0x6e,0x6f,0x72,0x6d, + 0x61,0x6c,0x2e,0x78,0x79,0x7a,0x3b,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,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x5f,0x39,0x32,0x20, + 0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x69,0x6e,0x2e,0x70,0x6f,0x73,0x69, + 0x74,0x69,0x6f,0x6e,0x2e,0x78,0x79,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x69,0x6e, + 0x73,0x74,0x61,0x6e,0x63,0x65,0x2e,0x78,0x79,0x7a,0x2c,0x20,0x31,0x2e,0x30,0x29, + 0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x67,0x6c, + 0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x5f,0x31,0x32,0x2e, + 0x6d,0x76,0x70,0x20,0x2a,0x20,0x5f,0x39,0x32,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x76,0x69,0x65,0x77,0x5f,0x73,0x70,0x61,0x63, + 0x65,0x5f,0x70,0x6f,0x73,0x20,0x3d,0x20,0x28,0x5f,0x31,0x32,0x2e,0x76,0x69,0x65, + 0x77,0x5f,0x6d,0x61,0x74,0x72,0x69,0x78,0x20,0x2a,0x20,0x5f,0x39,0x32,0x29,0x2e, + 0x78,0x79,0x7a,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74, + 0x2e,0x76,0x69,0x65,0x77,0x5f,0x73,0x70,0x61,0x63,0x65,0x5f,0x6e,0x6f,0x72,0x6d, + 0x61,0x6c,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x78,0x33,0x28,0x5f,0x31, + 0x32,0x2e,0x76,0x69,0x65,0x77,0x5f,0x6d,0x61,0x74,0x72,0x69,0x78,0x5b,0x30,0x5d, + 0x2e,0x78,0x79,0x7a,0x2c,0x20,0x5f,0x31,0x32,0x2e,0x76,0x69,0x65,0x77,0x5f,0x6d, + 0x61,0x74,0x72,0x69,0x78,0x5b,0x31,0x5d,0x2e,0x78,0x79,0x7a,0x2c,0x20,0x5f,0x31, + 0x32,0x2e,0x76,0x69,0x65,0x77,0x5f,0x6d,0x61,0x74,0x72,0x69,0x78,0x5b,0x32,0x5d, + 0x2e,0x78,0x79,0x7a,0x29,0x20,0x2a,0x20,0x69,0x6e,0x2e,0x6e,0x6f,0x72,0x6d,0x61, + 0x6c,0x2e,0x78,0x79,0x7a,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20, + 0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x6f,0x75,0x74,0x3b,0x0a,0x7d,0x0a,0x0a, + 0x00, ]; /* #include @@ -416,10 +536,19 @@ gbuffer_shader_desc :: (backend: sg_backend) -> sg_shader_desc { desc.attrs[3].glsl_name = "instance"; desc.uniform_blocks[0].stage = .VERTEX; desc.uniform_blocks[0].layout = .STD140; - desc.uniform_blocks[0].size = 128; - desc.uniform_blocks[0].glsl_uniforms[0].type = .FLOAT4; - desc.uniform_blocks[0].glsl_uniforms[0].array_count = 8; - desc.uniform_blocks[0].glsl_uniforms[0].glsl_name = "gbuffer_vs_params"; + desc.uniform_blocks[0].size = 144; + desc.uniform_blocks[0].glsl_uniforms[0].type = .MAT4; + desc.uniform_blocks[0].glsl_uniforms[0].array_count = 0; + desc.uniform_blocks[0].glsl_uniforms[0].glsl_name = "_12.mvp"; + desc.uniform_blocks[0].glsl_uniforms[1].type = .MAT4; + desc.uniform_blocks[0].glsl_uniforms[1].array_count = 0; + desc.uniform_blocks[0].glsl_uniforms[1].glsl_name = "_12.view_matrix"; + desc.uniform_blocks[0].glsl_uniforms[2].type = .INT; + desc.uniform_blocks[0].glsl_uniforms[2].array_count = 0; + desc.uniform_blocks[0].glsl_uniforms[2].glsl_name = "_12.isGround"; + desc.uniform_blocks[0].glsl_uniforms[3].type = .FLOAT; + desc.uniform_blocks[0].glsl_uniforms[3].array_count = 0; + desc.uniform_blocks[0].glsl_uniforms[3].glsl_name = "_12.planeHeight"; case .GLES3; desc.vertex_func.source = xx *vs_g_source_glsl300es; desc.vertex_func.entry = "main"; @@ -435,10 +564,19 @@ gbuffer_shader_desc :: (backend: sg_backend) -> sg_shader_desc { desc.attrs[3].glsl_name = "instance"; desc.uniform_blocks[0].stage = .VERTEX; desc.uniform_blocks[0].layout = .STD140; - desc.uniform_blocks[0].size = 128; - desc.uniform_blocks[0].glsl_uniforms[0].type = .FLOAT4; - desc.uniform_blocks[0].glsl_uniforms[0].array_count = 8; - desc.uniform_blocks[0].glsl_uniforms[0].glsl_name = "gbuffer_vs_params"; + desc.uniform_blocks[0].size = 144; + desc.uniform_blocks[0].glsl_uniforms[0].type = .MAT4; + desc.uniform_blocks[0].glsl_uniforms[0].array_count = 0; + desc.uniform_blocks[0].glsl_uniforms[0].glsl_name = "_12.mvp"; + desc.uniform_blocks[0].glsl_uniforms[1].type = .MAT4; + desc.uniform_blocks[0].glsl_uniforms[1].array_count = 0; + desc.uniform_blocks[0].glsl_uniforms[1].glsl_name = "_12.view_matrix"; + desc.uniform_blocks[0].glsl_uniforms[2].type = .INT; + desc.uniform_blocks[0].glsl_uniforms[2].array_count = 0; + desc.uniform_blocks[0].glsl_uniforms[2].glsl_name = "_12.isGround"; + desc.uniform_blocks[0].glsl_uniforms[3].type = .FLOAT; + desc.uniform_blocks[0].glsl_uniforms[3].array_count = 0; + desc.uniform_blocks[0].glsl_uniforms[3].glsl_name = "_12.planeHeight"; case .METAL_MACOS; desc.vertex_func.source = xx *vs_g_source_metal_macos; desc.vertex_func.entry = "main0"; @@ -450,7 +588,7 @@ gbuffer_shader_desc :: (backend: sg_backend) -> sg_shader_desc { desc.attrs[3].base_type = .FLOAT; desc.uniform_blocks[0].stage = .VERTEX; desc.uniform_blocks[0].layout = .STD140; - desc.uniform_blocks[0].size = 128; + desc.uniform_blocks[0].size = 144; desc.uniform_blocks[0].msl_buffer_n = 0; } return desc; diff --git a/src/shaders/jai/shader_mix.jai b/src/shaders/jai/shader_mix.jai new file mode 100644 index 0000000..c1dec2b --- /dev/null +++ b/src/shaders/jai/shader_mix.jai @@ -0,0 +1,574 @@ +/* + #version:1# (machine generated, don't edit!) + + Generated by sokol-shdc (https://github.com/floooh/sokol-tools) + + Cmdline: + sokol-shdc -i shader_mix.glsl -o ./jai/shader_mix.jai -l glsl430:glsl300es:metal_macos -f sokol_jai + + Overview: + ========= + Shader program: 'mix': + Get shader desc: mix_shader_desc(sg_query_backend()) + Vertex Shader: vs_mix + Fragment Shader: fs_mix + Attributes: + ATTR_mix_position => 0 + ATTR_mix_uv => 1 + Bindings: + Uniform block 'mix_fs_params': + Jai struct: Mix_Fs_Params + Bind slot: UB_mix_fs_params => 1 + Image 'mixtex_a': + Image type: ._2D + Sample type: .FLOAT + Multisampled: false + Bind slot: IMG_mixtex_a => 0 + Image 'mixtex_b': + Image type: ._2D + Sample type: .FLOAT + Multisampled: false + Bind slot: IMG_mixtex_b => 1 + Image 'mixtex_c': + Image type: ._2D + Sample type: .FLOAT + Multisampled: false + Bind slot: IMG_mixtex_c => 2 + Sampler 'mixsmp': + Type: .FILTERING + Bind slot: SMP_mixsmp => 0 +*/ +ATTR_mix_position :: 0; +ATTR_mix_uv :: 1; +UB_mix_fs_params :: 1; +IMG_mixtex_a :: 0; +IMG_mixtex_b :: 1; +IMG_mixtex_c :: 2; +SMP_mixsmp :: 0; +Mix_Fs_Params :: struct { + op: s32; + dof_min: float; + dof_max: float; + dof_point: float; +}; +/* + #version 430 + + layout(location = 0) in vec2 position; + layout(location = 0) out vec2 texcoord; + layout(location = 1) in vec2 uv; + + void main() + { + gl_Position = vec4(position, 0.5, 1.0); + texcoord = uv; + } + +*/ +vs_mix_source_glsl430 := u8.[ + 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x34,0x33,0x30,0x0a,0x0a,0x6c,0x61, + 0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20, + 0x30,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x32,0x20,0x70,0x6f,0x73,0x69,0x74, + 0x69,0x6f,0x6e,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61, + 0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29,0x20,0x6f,0x75,0x74,0x20,0x76,0x65, + 0x63,0x32,0x20,0x74,0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x3b,0x0a,0x6c,0x61,0x79, + 0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x31, + 0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x32,0x20,0x75,0x76,0x3b,0x0a,0x0a,0x76, + 0x6f,0x69,0x64,0x20,0x6d,0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20, + 0x20,0x67,0x6c,0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x76, + 0x65,0x63,0x34,0x28,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x2c,0x20,0x30,0x2e, + 0x35,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x74,0x65,0x78, + 0x63,0x6f,0x6f,0x72,0x64,0x20,0x3d,0x20,0x75,0x76,0x3b,0x0a,0x7d,0x0a,0x0a,0x00, + +]; +/* + #version 430 + + struct mix_fs_params + { + int op; + float dof_min; + float dof_max; + float dof_point; + }; + + uniform mix_fs_params _10; + + layout(binding = 16) uniform sampler2D mixtex_b_mixsmp; + layout(binding = 17) uniform sampler2D mixtex_a_mixsmp; + layout(binding = 18) uniform sampler2D mixtex_c_mixsmp; + + layout(location = 0) in vec2 texcoord; + layout(location = 0) out vec4 frag_color; + + void main() + { + if (_10.op == 0) + { + frag_color = vec4(mix(texture(mixtex_b_mixsmp, texcoord).xyz, texture(mixtex_a_mixsmp, texcoord).xyz, vec3(smoothstep(_10.dof_min, _10.dof_max, abs(texture(mixtex_c_mixsmp, texcoord).z + _10.dof_point)))), 1.0); + } + else + { + frag_color = vec4(1.0); + } + } + +*/ +fs_mix_source_glsl430 := u8.[ + 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x34,0x33,0x30,0x0a,0x0a,0x73,0x74, + 0x72,0x75,0x63,0x74,0x20,0x6d,0x69,0x78,0x5f,0x66,0x73,0x5f,0x70,0x61,0x72,0x61, + 0x6d,0x73,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x70,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x64,0x6f,0x66,0x5f,0x6d, + 0x69,0x6e,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x64,0x6f, + 0x66,0x5f,0x6d,0x61,0x78,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74, + 0x20,0x64,0x6f,0x66,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a, + 0x75,0x6e,0x69,0x66,0x6f,0x72,0x6d,0x20,0x6d,0x69,0x78,0x5f,0x66,0x73,0x5f,0x70, + 0x61,0x72,0x61,0x6d,0x73,0x20,0x5f,0x31,0x30,0x3b,0x0a,0x0a,0x6c,0x61,0x79,0x6f, + 0x75,0x74,0x28,0x62,0x69,0x6e,0x64,0x69,0x6e,0x67,0x20,0x3d,0x20,0x31,0x36,0x29, + 0x20,0x75,0x6e,0x69,0x66,0x6f,0x72,0x6d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72, + 0x32,0x44,0x20,0x6d,0x69,0x78,0x74,0x65,0x78,0x5f,0x62,0x5f,0x6d,0x69,0x78,0x73, + 0x6d,0x70,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x62,0x69,0x6e,0x64,0x69, + 0x6e,0x67,0x20,0x3d,0x20,0x31,0x37,0x29,0x20,0x75,0x6e,0x69,0x66,0x6f,0x72,0x6d, + 0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x32,0x44,0x20,0x6d,0x69,0x78,0x74,0x65, + 0x78,0x5f,0x61,0x5f,0x6d,0x69,0x78,0x73,0x6d,0x70,0x3b,0x0a,0x6c,0x61,0x79,0x6f, + 0x75,0x74,0x28,0x62,0x69,0x6e,0x64,0x69,0x6e,0x67,0x20,0x3d,0x20,0x31,0x38,0x29, + 0x20,0x75,0x6e,0x69,0x66,0x6f,0x72,0x6d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72, + 0x32,0x44,0x20,0x6d,0x69,0x78,0x74,0x65,0x78,0x5f,0x63,0x5f,0x6d,0x69,0x78,0x73, + 0x6d,0x70,0x3b,0x0a,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61, + 0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63, + 0x32,0x20,0x74,0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x3b,0x0a,0x6c,0x61,0x79,0x6f, + 0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29, + 0x20,0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x34,0x20,0x66,0x72,0x61,0x67,0x5f,0x63, + 0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x0a,0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x69,0x6e, + 0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x31,0x30, + 0x2e,0x6f,0x70,0x20,0x3d,0x3d,0x20,0x30,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c, + 0x6f,0x72,0x20,0x3d,0x20,0x76,0x65,0x63,0x34,0x28,0x6d,0x69,0x78,0x28,0x74,0x65, + 0x78,0x74,0x75,0x72,0x65,0x28,0x6d,0x69,0x78,0x74,0x65,0x78,0x5f,0x62,0x5f,0x6d, + 0x69,0x78,0x73,0x6d,0x70,0x2c,0x20,0x74,0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x29, + 0x2e,0x78,0x79,0x7a,0x2c,0x20,0x74,0x65,0x78,0x74,0x75,0x72,0x65,0x28,0x6d,0x69, + 0x78,0x74,0x65,0x78,0x5f,0x61,0x5f,0x6d,0x69,0x78,0x73,0x6d,0x70,0x2c,0x20,0x74, + 0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x29,0x2e,0x78,0x79,0x7a,0x2c,0x20,0x76,0x65, + 0x63,0x33,0x28,0x73,0x6d,0x6f,0x6f,0x74,0x68,0x73,0x74,0x65,0x70,0x28,0x5f,0x31, + 0x30,0x2e,0x64,0x6f,0x66,0x5f,0x6d,0x69,0x6e,0x2c,0x20,0x5f,0x31,0x30,0x2e,0x64, + 0x6f,0x66,0x5f,0x6d,0x61,0x78,0x2c,0x20,0x61,0x62,0x73,0x28,0x74,0x65,0x78,0x74, + 0x75,0x72,0x65,0x28,0x6d,0x69,0x78,0x74,0x65,0x78,0x5f,0x63,0x5f,0x6d,0x69,0x78, + 0x73,0x6d,0x70,0x2c,0x20,0x74,0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x29,0x2e,0x7a, + 0x20,0x2b,0x20,0x5f,0x31,0x30,0x2e,0x64,0x6f,0x66,0x5f,0x70,0x6f,0x69,0x6e,0x74, + 0x29,0x29,0x29,0x29,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,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,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f, + 0x6c,0x6f,0x72,0x20,0x3d,0x20,0x76,0x65,0x63,0x34,0x28,0x31,0x2e,0x30,0x29,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x7d,0x0a,0x0a,0x00, +]; +/* + #version 300 es + + layout(location = 0) in vec2 position; + out vec2 texcoord; + layout(location = 1) in vec2 uv; + + void main() + { + gl_Position = vec4(position, 0.5, 1.0); + texcoord = uv; + } + +*/ +vs_mix_source_glsl300es := u8.[ + 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x33,0x30,0x30,0x20,0x65,0x73,0x0a, + 0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e, + 0x20,0x3d,0x20,0x30,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x32,0x20,0x70,0x6f, + 0x73,0x69,0x74,0x69,0x6f,0x6e,0x3b,0x0a,0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x32, + 0x20,0x74,0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75, + 0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x31,0x29,0x20, + 0x69,0x6e,0x20,0x76,0x65,0x63,0x32,0x20,0x75,0x76,0x3b,0x0a,0x0a,0x76,0x6f,0x69, + 0x64,0x20,0x6d,0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x67, + 0x6c,0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x76,0x65,0x63, + 0x34,0x28,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x2c,0x20,0x30,0x2e,0x35,0x2c, + 0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x74,0x65,0x78,0x63,0x6f, + 0x6f,0x72,0x64,0x20,0x3d,0x20,0x75,0x76,0x3b,0x0a,0x7d,0x0a,0x0a,0x00, +]; +/* + #version 300 es + precision mediump float; + precision highp int; + + struct mix_fs_params + { + int op; + highp float dof_min; + highp float dof_max; + highp float dof_point; + }; + + uniform mix_fs_params _10; + + uniform highp sampler2D mixtex_b_mixsmp; + uniform highp sampler2D mixtex_a_mixsmp; + uniform highp sampler2D mixtex_c_mixsmp; + + in highp vec2 texcoord; + layout(location = 0) out highp vec4 frag_color; + + void main() + { + if (_10.op == 0) + { + frag_color = vec4(mix(texture(mixtex_b_mixsmp, texcoord).xyz, texture(mixtex_a_mixsmp, texcoord).xyz, vec3(smoothstep(_10.dof_min, _10.dof_max, abs(texture(mixtex_c_mixsmp, texcoord).z + _10.dof_point)))), 1.0); + } + else + { + frag_color = vec4(1.0); + } + } + +*/ +fs_mix_source_glsl300es := u8.[ + 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x33,0x30,0x30,0x20,0x65,0x73,0x0a, + 0x70,0x72,0x65,0x63,0x69,0x73,0x69,0x6f,0x6e,0x20,0x6d,0x65,0x64,0x69,0x75,0x6d, + 0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x3b,0x0a,0x70,0x72,0x65,0x63,0x69,0x73,0x69, + 0x6f,0x6e,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x69,0x6e,0x74,0x3b,0x0a,0x0a,0x73, + 0x74,0x72,0x75,0x63,0x74,0x20,0x6d,0x69,0x78,0x5f,0x66,0x73,0x5f,0x70,0x61,0x72, + 0x61,0x6d,0x73,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x70, + 0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61, + 0x74,0x20,0x64,0x6f,0x66,0x5f,0x6d,0x69,0x6e,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68, + 0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x64,0x6f,0x66,0x5f,0x6d, + 0x61,0x78,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c, + 0x6f,0x61,0x74,0x20,0x64,0x6f,0x66,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x3b,0x0a,0x7d, + 0x3b,0x0a,0x0a,0x75,0x6e,0x69,0x66,0x6f,0x72,0x6d,0x20,0x6d,0x69,0x78,0x5f,0x66, + 0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x20,0x5f,0x31,0x30,0x3b,0x0a,0x0a,0x75, + 0x6e,0x69,0x66,0x6f,0x72,0x6d,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x73,0x61,0x6d, + 0x70,0x6c,0x65,0x72,0x32,0x44,0x20,0x6d,0x69,0x78,0x74,0x65,0x78,0x5f,0x62,0x5f, + 0x6d,0x69,0x78,0x73,0x6d,0x70,0x3b,0x0a,0x75,0x6e,0x69,0x66,0x6f,0x72,0x6d,0x20, + 0x68,0x69,0x67,0x68,0x70,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x32,0x44,0x20, + 0x6d,0x69,0x78,0x74,0x65,0x78,0x5f,0x61,0x5f,0x6d,0x69,0x78,0x73,0x6d,0x70,0x3b, + 0x0a,0x75,0x6e,0x69,0x66,0x6f,0x72,0x6d,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x73, + 0x61,0x6d,0x70,0x6c,0x65,0x72,0x32,0x44,0x20,0x6d,0x69,0x78,0x74,0x65,0x78,0x5f, + 0x63,0x5f,0x6d,0x69,0x78,0x73,0x6d,0x70,0x3b,0x0a,0x0a,0x69,0x6e,0x20,0x68,0x69, + 0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x32,0x20,0x74,0x65,0x78,0x63,0x6f,0x6f,0x72, + 0x64,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69, + 0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29,0x20,0x6f,0x75,0x74,0x20,0x68,0x69,0x67,0x68, + 0x70,0x20,0x76,0x65,0x63,0x34,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f, + 0x72,0x3b,0x0a,0x0a,0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x69,0x6e,0x28,0x29,0x0a, + 0x7b,0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x31,0x30,0x2e,0x6f,0x70, + 0x20,0x3d,0x3d,0x20,0x30,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20, + 0x3d,0x20,0x76,0x65,0x63,0x34,0x28,0x6d,0x69,0x78,0x28,0x74,0x65,0x78,0x74,0x75, + 0x72,0x65,0x28,0x6d,0x69,0x78,0x74,0x65,0x78,0x5f,0x62,0x5f,0x6d,0x69,0x78,0x73, + 0x6d,0x70,0x2c,0x20,0x74,0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x29,0x2e,0x78,0x79, + 0x7a,0x2c,0x20,0x74,0x65,0x78,0x74,0x75,0x72,0x65,0x28,0x6d,0x69,0x78,0x74,0x65, + 0x78,0x5f,0x61,0x5f,0x6d,0x69,0x78,0x73,0x6d,0x70,0x2c,0x20,0x74,0x65,0x78,0x63, + 0x6f,0x6f,0x72,0x64,0x29,0x2e,0x78,0x79,0x7a,0x2c,0x20,0x76,0x65,0x63,0x33,0x28, + 0x73,0x6d,0x6f,0x6f,0x74,0x68,0x73,0x74,0x65,0x70,0x28,0x5f,0x31,0x30,0x2e,0x64, + 0x6f,0x66,0x5f,0x6d,0x69,0x6e,0x2c,0x20,0x5f,0x31,0x30,0x2e,0x64,0x6f,0x66,0x5f, + 0x6d,0x61,0x78,0x2c,0x20,0x61,0x62,0x73,0x28,0x74,0x65,0x78,0x74,0x75,0x72,0x65, + 0x28,0x6d,0x69,0x78,0x74,0x65,0x78,0x5f,0x63,0x5f,0x6d,0x69,0x78,0x73,0x6d,0x70, + 0x2c,0x20,0x74,0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x29,0x2e,0x7a,0x20,0x2b,0x20, + 0x5f,0x31,0x30,0x2e,0x64,0x6f,0x66,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x29,0x29,0x29, + 0x29,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,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,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72, + 0x20,0x3d,0x20,0x76,0x65,0x63,0x34,0x28,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x7d,0x0a,0x7d,0x0a,0x0a,0x00, +]; +/* + #include + #include + + using namespace metal; + + struct main0_out + { + float2 texcoord [[user(locn0)]]; + float4 gl_Position [[position]]; + }; + + struct main0_in + { + float2 position [[attribute(0)]]; + float2 uv [[attribute(1)]]; + }; + + vertex main0_out main0(main0_in in [[stage_in]]) + { + main0_out out = {}; + out.gl_Position = float4(in.position, 0.5, 1.0); + out.texcoord = in.uv; + return out; + } + +*/ +vs_mix_source_metal_macos := u8.[ + 0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x20,0x3c,0x6d,0x65,0x74,0x61,0x6c,0x5f, + 0x73,0x74,0x64,0x6c,0x69,0x62,0x3e,0x0a,0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65, + 0x20,0x3c,0x73,0x69,0x6d,0x64,0x2f,0x73,0x69,0x6d,0x64,0x2e,0x68,0x3e,0x0a,0x0a, + 0x75,0x73,0x69,0x6e,0x67,0x20,0x6e,0x61,0x6d,0x65,0x73,0x70,0x61,0x63,0x65,0x20, + 0x6d,0x65,0x74,0x61,0x6c,0x3b,0x0a,0x0a,0x73,0x74,0x72,0x75,0x63,0x74,0x20,0x6d, + 0x61,0x69,0x6e,0x30,0x5f,0x6f,0x75,0x74,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66, + 0x6c,0x6f,0x61,0x74,0x32,0x20,0x74,0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x20,0x5b, + 0x5b,0x75,0x73,0x65,0x72,0x28,0x6c,0x6f,0x63,0x6e,0x30,0x29,0x5d,0x5d,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x67,0x6c,0x5f,0x50,0x6f, + 0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x5b,0x5b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f, + 0x6e,0x5d,0x5d,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a,0x73,0x74,0x72,0x75,0x63,0x74,0x20, + 0x6d,0x61,0x69,0x6e,0x30,0x5f,0x69,0x6e,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66, + 0x6c,0x6f,0x61,0x74,0x32,0x20,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x5b, + 0x5b,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x28,0x30,0x29,0x5d,0x5d,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x20,0x75,0x76,0x20,0x5b, + 0x5b,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x28,0x31,0x29,0x5d,0x5d,0x3b, + 0x0a,0x7d,0x3b,0x0a,0x0a,0x76,0x65,0x72,0x74,0x65,0x78,0x20,0x6d,0x61,0x69,0x6e, + 0x30,0x5f,0x6f,0x75,0x74,0x20,0x6d,0x61,0x69,0x6e,0x30,0x28,0x6d,0x61,0x69,0x6e, + 0x30,0x5f,0x69,0x6e,0x20,0x69,0x6e,0x20,0x5b,0x5b,0x73,0x74,0x61,0x67,0x65,0x5f, + 0x69,0x6e,0x5d,0x5d,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x6d,0x61,0x69,0x6e, + 0x30,0x5f,0x6f,0x75,0x74,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x7b,0x7d,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x67,0x6c,0x5f,0x50,0x6f,0x73,0x69,0x74, + 0x69,0x6f,0x6e,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x69,0x6e,0x2e, + 0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x2c,0x20,0x30,0x2e,0x35,0x2c,0x20,0x31, + 0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x74,0x65,0x78, + 0x63,0x6f,0x6f,0x72,0x64,0x20,0x3d,0x20,0x69,0x6e,0x2e,0x75,0x76,0x3b,0x0a,0x20, + 0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x6f,0x75,0x74,0x3b,0x0a,0x7d, + 0x0a,0x0a,0x00, +]; +/* + #include + #include + + using namespace metal; + + struct mix_fs_params + { + int op; + float dof_min; + float dof_max; + float dof_point; + }; + + struct main0_out + { + float4 frag_color [[color(0)]]; + }; + + struct main0_in + { + float2 texcoord [[user(locn0)]]; + }; + + fragment main0_out main0(main0_in in [[stage_in]], constant mix_fs_params& _10 [[buffer(0)]], texture2d mixtex_a [[texture(0)]], texture2d mixtex_b [[texture(1)]], texture2d mixtex_c [[texture(2)]], sampler mixsmp [[sampler(0)]]) + { + main0_out out = {}; + if (_10.op == 0) + { + out.frag_color = float4(mix(mixtex_b.sample(mixsmp, in.texcoord).xyz, mixtex_a.sample(mixsmp, in.texcoord).xyz, float3(smoothstep(_10.dof_min, _10.dof_max, abs(mixtex_c.sample(mixsmp, in.texcoord).z + _10.dof_point)))), 1.0); + } + else + { + out.frag_color = float4(1.0); + } + return out; + } + +*/ +fs_mix_source_metal_macos := u8.[ + 0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x20,0x3c,0x6d,0x65,0x74,0x61,0x6c,0x5f, + 0x73,0x74,0x64,0x6c,0x69,0x62,0x3e,0x0a,0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65, + 0x20,0x3c,0x73,0x69,0x6d,0x64,0x2f,0x73,0x69,0x6d,0x64,0x2e,0x68,0x3e,0x0a,0x0a, + 0x75,0x73,0x69,0x6e,0x67,0x20,0x6e,0x61,0x6d,0x65,0x73,0x70,0x61,0x63,0x65,0x20, + 0x6d,0x65,0x74,0x61,0x6c,0x3b,0x0a,0x0a,0x73,0x74,0x72,0x75,0x63,0x74,0x20,0x6d, + 0x69,0x78,0x5f,0x66,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x0a,0x7b,0x0a,0x20, + 0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x70,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66, + 0x6c,0x6f,0x61,0x74,0x20,0x64,0x6f,0x66,0x5f,0x6d,0x69,0x6e,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x64,0x6f,0x66,0x5f,0x6d,0x61,0x78,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x64,0x6f,0x66,0x5f,0x70, + 0x6f,0x69,0x6e,0x74,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a,0x73,0x74,0x72,0x75,0x63,0x74, + 0x20,0x6d,0x61,0x69,0x6e,0x30,0x5f,0x6f,0x75,0x74,0x0a,0x7b,0x0a,0x20,0x20,0x20, + 0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c, + 0x6f,0x72,0x20,0x5b,0x5b,0x63,0x6f,0x6c,0x6f,0x72,0x28,0x30,0x29,0x5d,0x5d,0x3b, + 0x0a,0x7d,0x3b,0x0a,0x0a,0x73,0x74,0x72,0x75,0x63,0x74,0x20,0x6d,0x61,0x69,0x6e, + 0x30,0x5f,0x69,0x6e,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74, + 0x32,0x20,0x74,0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x20,0x5b,0x5b,0x75,0x73,0x65, + 0x72,0x28,0x6c,0x6f,0x63,0x6e,0x30,0x29,0x5d,0x5d,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a, + 0x66,0x72,0x61,0x67,0x6d,0x65,0x6e,0x74,0x20,0x6d,0x61,0x69,0x6e,0x30,0x5f,0x6f, + 0x75,0x74,0x20,0x6d,0x61,0x69,0x6e,0x30,0x28,0x6d,0x61,0x69,0x6e,0x30,0x5f,0x69, + 0x6e,0x20,0x69,0x6e,0x20,0x5b,0x5b,0x73,0x74,0x61,0x67,0x65,0x5f,0x69,0x6e,0x5d, + 0x5d,0x2c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x6d,0x69,0x78,0x5f, + 0x66,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x26,0x20,0x5f,0x31,0x30,0x20,0x5b, + 0x5b,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x30,0x29,0x5d,0x5d,0x2c,0x20,0x74,0x65, + 0x78,0x74,0x75,0x72,0x65,0x32,0x64,0x3c,0x66,0x6c,0x6f,0x61,0x74,0x3e,0x20,0x6d, + 0x69,0x78,0x74,0x65,0x78,0x5f,0x61,0x20,0x5b,0x5b,0x74,0x65,0x78,0x74,0x75,0x72, + 0x65,0x28,0x30,0x29,0x5d,0x5d,0x2c,0x20,0x74,0x65,0x78,0x74,0x75,0x72,0x65,0x32, + 0x64,0x3c,0x66,0x6c,0x6f,0x61,0x74,0x3e,0x20,0x6d,0x69,0x78,0x74,0x65,0x78,0x5f, + 0x62,0x20,0x5b,0x5b,0x74,0x65,0x78,0x74,0x75,0x72,0x65,0x28,0x31,0x29,0x5d,0x5d, + 0x2c,0x20,0x74,0x65,0x78,0x74,0x75,0x72,0x65,0x32,0x64,0x3c,0x66,0x6c,0x6f,0x61, + 0x74,0x3e,0x20,0x6d,0x69,0x78,0x74,0x65,0x78,0x5f,0x63,0x20,0x5b,0x5b,0x74,0x65, + 0x78,0x74,0x75,0x72,0x65,0x28,0x32,0x29,0x5d,0x5d,0x2c,0x20,0x73,0x61,0x6d,0x70, + 0x6c,0x65,0x72,0x20,0x6d,0x69,0x78,0x73,0x6d,0x70,0x20,0x5b,0x5b,0x73,0x61,0x6d, + 0x70,0x6c,0x65,0x72,0x28,0x30,0x29,0x5d,0x5d,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20, + 0x20,0x6d,0x61,0x69,0x6e,0x30,0x5f,0x6f,0x75,0x74,0x20,0x6f,0x75,0x74,0x20,0x3d, + 0x20,0x7b,0x7d,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x31,0x30, + 0x2e,0x6f,0x70,0x20,0x3d,0x3d,0x20,0x30,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x66,0x72,0x61,0x67, + 0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28, + 0x6d,0x69,0x78,0x28,0x6d,0x69,0x78,0x74,0x65,0x78,0x5f,0x62,0x2e,0x73,0x61,0x6d, + 0x70,0x6c,0x65,0x28,0x6d,0x69,0x78,0x73,0x6d,0x70,0x2c,0x20,0x69,0x6e,0x2e,0x74, + 0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x29,0x2e,0x78,0x79,0x7a,0x2c,0x20,0x6d,0x69, + 0x78,0x74,0x65,0x78,0x5f,0x61,0x2e,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x6d,0x69, + 0x78,0x73,0x6d,0x70,0x2c,0x20,0x69,0x6e,0x2e,0x74,0x65,0x78,0x63,0x6f,0x6f,0x72, + 0x64,0x29,0x2e,0x78,0x79,0x7a,0x2c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x28,0x73, + 0x6d,0x6f,0x6f,0x74,0x68,0x73,0x74,0x65,0x70,0x28,0x5f,0x31,0x30,0x2e,0x64,0x6f, + 0x66,0x5f,0x6d,0x69,0x6e,0x2c,0x20,0x5f,0x31,0x30,0x2e,0x64,0x6f,0x66,0x5f,0x6d, + 0x61,0x78,0x2c,0x20,0x61,0x62,0x73,0x28,0x6d,0x69,0x78,0x74,0x65,0x78,0x5f,0x63, + 0x2e,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x6d,0x69,0x78,0x73,0x6d,0x70,0x2c,0x20, + 0x69,0x6e,0x2e,0x74,0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x29,0x2e,0x7a,0x20,0x2b, + 0x20,0x5f,0x31,0x30,0x2e,0x64,0x6f,0x66,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x29,0x29, + 0x29,0x29,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,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,0x6f,0x75,0x74,0x2e,0x66,0x72,0x61,0x67,0x5f, + 0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x31, + 0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x72, + 0x65,0x74,0x75,0x72,0x6e,0x20,0x6f,0x75,0x74,0x3b,0x0a,0x7d,0x0a,0x0a,0x00, +]; +mix_shader_desc :: (backend: sg_backend) -> sg_shader_desc { + desc: sg_shader_desc; + desc.label = "mix_shader"; + if backend == { + case .GLCORE; + desc.vertex_func.source = xx *vs_mix_source_glsl430; + desc.vertex_func.entry = "main"; + desc.fragment_func.source = xx *fs_mix_source_glsl430; + desc.fragment_func.entry = "main"; + desc.attrs[0].base_type = .FLOAT; + desc.attrs[0].glsl_name = "position"; + desc.attrs[1].base_type = .FLOAT; + desc.attrs[1].glsl_name = "uv"; + desc.uniform_blocks[1].stage = .FRAGMENT; + desc.uniform_blocks[1].layout = .STD140; + desc.uniform_blocks[1].size = 16; + desc.uniform_blocks[1].glsl_uniforms[0].type = .INT; + desc.uniform_blocks[1].glsl_uniforms[0].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[0].glsl_name = "_10.op"; + desc.uniform_blocks[1].glsl_uniforms[1].type = .FLOAT; + desc.uniform_blocks[1].glsl_uniforms[1].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[1].glsl_name = "_10.dof_min"; + desc.uniform_blocks[1].glsl_uniforms[2].type = .FLOAT; + desc.uniform_blocks[1].glsl_uniforms[2].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[2].glsl_name = "_10.dof_max"; + desc.uniform_blocks[1].glsl_uniforms[3].type = .FLOAT; + desc.uniform_blocks[1].glsl_uniforms[3].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[3].glsl_name = "_10.dof_point"; + desc.images[0].stage = .FRAGMENT; + desc.images[0].multisampled = false; + desc.images[0].image_type = ._2D; + desc.images[0].sample_type = .FLOAT; + desc.images[1].stage = .FRAGMENT; + desc.images[1].multisampled = false; + desc.images[1].image_type = ._2D; + desc.images[1].sample_type = .FLOAT; + desc.images[2].stage = .FRAGMENT; + desc.images[2].multisampled = false; + desc.images[2].image_type = ._2D; + desc.images[2].sample_type = .FLOAT; + desc.samplers[0].stage = .FRAGMENT; + desc.samplers[0].sampler_type = .FILTERING; + desc.image_sampler_pairs[0].stage = .FRAGMENT; + desc.image_sampler_pairs[0].image_slot = 1; + desc.image_sampler_pairs[0].sampler_slot = 0; + desc.image_sampler_pairs[0].glsl_name = "mixtex_b_mixsmp"; + desc.image_sampler_pairs[1].stage = .FRAGMENT; + desc.image_sampler_pairs[1].image_slot = 0; + desc.image_sampler_pairs[1].sampler_slot = 0; + desc.image_sampler_pairs[1].glsl_name = "mixtex_a_mixsmp"; + desc.image_sampler_pairs[2].stage = .FRAGMENT; + desc.image_sampler_pairs[2].image_slot = 2; + desc.image_sampler_pairs[2].sampler_slot = 0; + desc.image_sampler_pairs[2].glsl_name = "mixtex_c_mixsmp"; + case .GLES3; + desc.vertex_func.source = xx *vs_mix_source_glsl300es; + desc.vertex_func.entry = "main"; + desc.fragment_func.source = xx *fs_mix_source_glsl300es; + desc.fragment_func.entry = "main"; + desc.attrs[0].base_type = .FLOAT; + desc.attrs[0].glsl_name = "position"; + desc.attrs[1].base_type = .FLOAT; + desc.attrs[1].glsl_name = "uv"; + desc.uniform_blocks[1].stage = .FRAGMENT; + desc.uniform_blocks[1].layout = .STD140; + desc.uniform_blocks[1].size = 16; + desc.uniform_blocks[1].glsl_uniforms[0].type = .INT; + desc.uniform_blocks[1].glsl_uniforms[0].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[0].glsl_name = "_10.op"; + desc.uniform_blocks[1].glsl_uniforms[1].type = .FLOAT; + desc.uniform_blocks[1].glsl_uniforms[1].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[1].glsl_name = "_10.dof_min"; + desc.uniform_blocks[1].glsl_uniforms[2].type = .FLOAT; + desc.uniform_blocks[1].glsl_uniforms[2].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[2].glsl_name = "_10.dof_max"; + desc.uniform_blocks[1].glsl_uniforms[3].type = .FLOAT; + desc.uniform_blocks[1].glsl_uniforms[3].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[3].glsl_name = "_10.dof_point"; + desc.images[0].stage = .FRAGMENT; + desc.images[0].multisampled = false; + desc.images[0].image_type = ._2D; + desc.images[0].sample_type = .FLOAT; + desc.images[1].stage = .FRAGMENT; + desc.images[1].multisampled = false; + desc.images[1].image_type = ._2D; + desc.images[1].sample_type = .FLOAT; + desc.images[2].stage = .FRAGMENT; + desc.images[2].multisampled = false; + desc.images[2].image_type = ._2D; + desc.images[2].sample_type = .FLOAT; + desc.samplers[0].stage = .FRAGMENT; + desc.samplers[0].sampler_type = .FILTERING; + desc.image_sampler_pairs[0].stage = .FRAGMENT; + desc.image_sampler_pairs[0].image_slot = 1; + desc.image_sampler_pairs[0].sampler_slot = 0; + desc.image_sampler_pairs[0].glsl_name = "mixtex_b_mixsmp"; + desc.image_sampler_pairs[1].stage = .FRAGMENT; + desc.image_sampler_pairs[1].image_slot = 0; + desc.image_sampler_pairs[1].sampler_slot = 0; + desc.image_sampler_pairs[1].glsl_name = "mixtex_a_mixsmp"; + desc.image_sampler_pairs[2].stage = .FRAGMENT; + desc.image_sampler_pairs[2].image_slot = 2; + desc.image_sampler_pairs[2].sampler_slot = 0; + desc.image_sampler_pairs[2].glsl_name = "mixtex_c_mixsmp"; + case .METAL_MACOS; + desc.vertex_func.source = xx *vs_mix_source_metal_macos; + desc.vertex_func.entry = "main0"; + desc.fragment_func.source = xx *fs_mix_source_metal_macos; + desc.fragment_func.entry = "main0"; + desc.attrs[0].base_type = .FLOAT; + desc.attrs[1].base_type = .FLOAT; + desc.uniform_blocks[1].stage = .FRAGMENT; + desc.uniform_blocks[1].layout = .STD140; + desc.uniform_blocks[1].size = 16; + desc.uniform_blocks[1].msl_buffer_n = 0; + desc.images[0].stage = .FRAGMENT; + desc.images[0].multisampled = false; + desc.images[0].image_type = ._2D; + desc.images[0].sample_type = .FLOAT; + desc.images[0].msl_texture_n = 0; + desc.images[1].stage = .FRAGMENT; + desc.images[1].multisampled = false; + desc.images[1].image_type = ._2D; + desc.images[1].sample_type = .FLOAT; + desc.images[1].msl_texture_n = 1; + desc.images[2].stage = .FRAGMENT; + desc.images[2].multisampled = false; + desc.images[2].image_type = ._2D; + desc.images[2].sample_type = .FLOAT; + desc.images[2].msl_texture_n = 2; + desc.samplers[0].stage = .FRAGMENT; + desc.samplers[0].sampler_type = .FILTERING; + desc.samplers[0].msl_sampler_n = 0; + desc.image_sampler_pairs[0].stage = .FRAGMENT; + desc.image_sampler_pairs[0].image_slot = 1; + desc.image_sampler_pairs[0].sampler_slot = 0; + desc.image_sampler_pairs[1].stage = .FRAGMENT; + desc.image_sampler_pairs[1].image_slot = 0; + desc.image_sampler_pairs[1].sampler_slot = 0; + desc.image_sampler_pairs[2].stage = .FRAGMENT; + desc.image_sampler_pairs[2].image_slot = 2; + desc.image_sampler_pairs[2].sampler_slot = 0; + } + return desc; +} diff --git a/src/shaders/jai/shader_op.jai b/src/shaders/jai/shader_op.jai index 160c782..7be8dde 100644 --- a/src/shaders/jai/shader_op.jai +++ b/src/shaders/jai/shader_op.jai @@ -16,6 +16,9 @@ ATTR_op_position => 0 ATTR_op_uv => 1 Bindings: + Uniform block 'op_fs_params': + Jai struct: Op_Fs_Params + Bind slot: UB_op_fs_params => 1 Image 'optex': Image type: ._2D Sample type: .FLOAT @@ -27,8 +30,17 @@ */ ATTR_op_position :: 0; ATTR_op_uv :: 1; +UB_op_fs_params :: 1; IMG_optex :: 0; SMP_opsmp :: 0; +Op_Fs_Params :: struct { + blur_size: s32; + op: s32; + separation: float; + dilate_min: float; + dilate_max: float; + _: [12]u8; +}; /* #version 430 @@ -62,6 +74,17 @@ vs_op_source_glsl430 := u8.[ /* #version 430 + struct op_fs_params + { + int blur_size; + int op; + float separation; + float dilate_min; + float dilate_max; + }; + + uniform op_fs_params _10; + layout(binding = 16) uniform sampler2D optex_opsmp; layout(location = 0) in vec2 texcoord; @@ -69,54 +92,254 @@ vs_op_source_glsl430 := u8.[ void main() { - vec2 _28 = vec2(1.0) / vec2(textureSize(optex_opsmp, 0)); - float result = 0.0; - for (int x = -2; x < 2; x++) + if (_10.op == 2) { - for (int y = -2; y < 2; y++) + vec2 _40 = vec2(1.0) / vec2(textureSize(optex_opsmp, 0)); + vec3 result = vec3(0.0); + int _50 = -_10.blur_size; + for (int x = _50; x < _10.blur_size; x++) { - result += texture(optex_opsmp, texcoord + (vec2(float(x), float(y)) * _28)).x; + for (int y = _50; y < _10.blur_size; y++) + { + result += texture(optex_opsmp, texcoord + (vec2(float(x), float(y)) * _40)).xyz; + } + } + frag_color = vec4(result / vec3(float(((_10.blur_size * 2) * _10.blur_size) * 2)), 1.0); + } + else + { + if (_10.op == 1) + { + vec2 _137 = vec2(textureSize(optex_opsmp, 0)); + frag_color = texture(optex_opsmp, gl_FragCoord.xy / _137); + if (_10.blur_size <= 0) + { + return; + } + float mx = 0.0; + vec4 cmx = frag_color; + int _163 = -_10.blur_size; + for (int i = _163; i <= _10.blur_size; i++) + { + for (int j = _163; j <= _10.blur_size; j++) + { + if (!(distance(vec2(float(i), float(j)), vec2(0.0)) <= float(_10.blur_size))) + { + continue; + } + vec4 _218 = texture(optex_opsmp, (gl_FragCoord.xy + (vec2(float(i), float(j)) * _10.separation)) / _137); + float _226 = dot(_218.xyz, vec3(0.300000011920928955078125, 0.589999973773956298828125, 0.10999999940395355224609375)); + if (_226 > mx) + { + mx = _226; + cmx = _218; + } + } + } + vec4 _238 = frag_color; + vec3 _247 = mix(_238.xyz, cmx.xyz, vec3(smoothstep(_10.dilate_min, _10.dilate_max, mx))); + frag_color.x = _247.x; + frag_color.y = _247.y; + frag_color.z = _247.z; + } + else + { + vec2 _268 = vec2(1.0) / vec2(textureSize(optex_opsmp, 0)); + float result_1 = 0.0; + int _273 = -_10.blur_size; + for (int x_1 = _273; x_1 < _10.blur_size; x_1++) + { + for (int y_1 = _273; y_1 < _10.blur_size; y_1++) + { + result_1 += texture(optex_opsmp, texcoord + (vec2(float(x_1), float(y_1)) * _268)).x; + } + } + float _327 = result_1 / float(((_10.blur_size * 2) * _10.blur_size) * 2); + frag_color = vec4(_327, _327, _327, 1.0); } } - float _84 = result * 0.0625; - frag_color = vec4(_84, _84, _84, 1.0); } */ fs_op_source_glsl430 := u8.[ - 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x34,0x33,0x30,0x0a,0x0a,0x6c,0x61, - 0x79,0x6f,0x75,0x74,0x28,0x62,0x69,0x6e,0x64,0x69,0x6e,0x67,0x20,0x3d,0x20,0x31, - 0x36,0x29,0x20,0x75,0x6e,0x69,0x66,0x6f,0x72,0x6d,0x20,0x73,0x61,0x6d,0x70,0x6c, - 0x65,0x72,0x32,0x44,0x20,0x6f,0x70,0x74,0x65,0x78,0x5f,0x6f,0x70,0x73,0x6d,0x70, - 0x3b,0x0a,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69, - 0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x32,0x20, - 0x74,0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74, - 0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29,0x20,0x6f, - 0x75,0x74,0x20,0x76,0x65,0x63,0x34,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c, - 0x6f,0x72,0x3b,0x0a,0x0a,0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x69,0x6e,0x28,0x29, - 0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x32,0x20,0x5f,0x32,0x38,0x20, - 0x3d,0x20,0x76,0x65,0x63,0x32,0x28,0x31,0x2e,0x30,0x29,0x20,0x2f,0x20,0x76,0x65, - 0x63,0x32,0x28,0x74,0x65,0x78,0x74,0x75,0x72,0x65,0x53,0x69,0x7a,0x65,0x28,0x6f, - 0x70,0x74,0x65,0x78,0x5f,0x6f,0x70,0x73,0x6d,0x70,0x2c,0x20,0x30,0x29,0x29,0x3b, - 0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x72,0x65,0x73,0x75,0x6c, - 0x74,0x20,0x3d,0x20,0x30,0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6f,0x72, - 0x20,0x28,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x2d,0x32,0x3b,0x20,0x78,0x20, - 0x3c,0x20,0x32,0x3b,0x20,0x78,0x2b,0x2b,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74, - 0x20,0x79,0x20,0x3d,0x20,0x2d,0x32,0x3b,0x20,0x79,0x20,0x3c,0x20,0x32,0x3b,0x20, - 0x79,0x2b,0x2b,0x29,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c, - 0x74,0x20,0x2b,0x3d,0x20,0x74,0x65,0x78,0x74,0x75,0x72,0x65,0x28,0x6f,0x70,0x74, - 0x65,0x78,0x5f,0x6f,0x70,0x73,0x6d,0x70,0x2c,0x20,0x74,0x65,0x78,0x63,0x6f,0x6f, - 0x72,0x64,0x20,0x2b,0x20,0x28,0x76,0x65,0x63,0x32,0x28,0x66,0x6c,0x6f,0x61,0x74, - 0x28,0x78,0x29,0x2c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x28,0x79,0x29,0x29,0x20,0x2a, - 0x20,0x5f,0x32,0x38,0x29,0x29,0x2e,0x78,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c, - 0x6f,0x61,0x74,0x20,0x5f,0x38,0x34,0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74, - 0x20,0x2a,0x20,0x30,0x2e,0x30,0x36,0x32,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66, - 0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x76,0x65,0x63,0x34, - 0x28,0x5f,0x38,0x34,0x2c,0x20,0x5f,0x38,0x34,0x2c,0x20,0x5f,0x38,0x34,0x2c,0x20, - 0x31,0x2e,0x30,0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x00, + 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x34,0x33,0x30,0x0a,0x0a,0x73,0x74, + 0x72,0x75,0x63,0x74,0x20,0x6f,0x70,0x5f,0x66,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d, + 0x73,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x62,0x6c,0x75,0x72, + 0x5f,0x73,0x69,0x7a,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f, + 0x70,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x73,0x65,0x70, + 0x61,0x72,0x61,0x74,0x69,0x6f,0x6e,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f, + 0x61,0x74,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x6d,0x69,0x6e,0x3b,0x0a,0x20, + 0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f, + 0x6d,0x61,0x78,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a,0x75,0x6e,0x69,0x66,0x6f,0x72,0x6d, + 0x20,0x6f,0x70,0x5f,0x66,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x20,0x5f,0x31, + 0x30,0x3b,0x0a,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x62,0x69,0x6e,0x64,0x69, + 0x6e,0x67,0x20,0x3d,0x20,0x31,0x36,0x29,0x20,0x75,0x6e,0x69,0x66,0x6f,0x72,0x6d, + 0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x32,0x44,0x20,0x6f,0x70,0x74,0x65,0x78, + 0x5f,0x6f,0x70,0x73,0x6d,0x70,0x3b,0x0a,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28, + 0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29,0x20,0x69,0x6e, + 0x20,0x76,0x65,0x63,0x32,0x20,0x74,0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x3b,0x0a, + 0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20, + 0x3d,0x20,0x30,0x29,0x20,0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x34,0x20,0x66,0x72, + 0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x0a,0x76,0x6f,0x69,0x64,0x20, + 0x6d,0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20, + 0x28,0x5f,0x31,0x30,0x2e,0x6f,0x70,0x20,0x3d,0x3d,0x20,0x32,0x29,0x0a,0x20,0x20, + 0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x32, + 0x20,0x5f,0x34,0x30,0x20,0x3d,0x20,0x76,0x65,0x63,0x32,0x28,0x31,0x2e,0x30,0x29, + 0x20,0x2f,0x20,0x76,0x65,0x63,0x32,0x28,0x74,0x65,0x78,0x74,0x75,0x72,0x65,0x53, + 0x69,0x7a,0x65,0x28,0x6f,0x70,0x74,0x65,0x78,0x5f,0x6f,0x70,0x73,0x6d,0x70,0x2c, + 0x20,0x30,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x65, + 0x63,0x33,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x76,0x65,0x63,0x33, + 0x28,0x30,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69, + 0x6e,0x74,0x20,0x5f,0x35,0x30,0x20,0x3d,0x20,0x2d,0x5f,0x31,0x30,0x2e,0x62,0x6c, + 0x75,0x72,0x5f,0x73,0x69,0x7a,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x5f,0x35, + 0x30,0x3b,0x20,0x78,0x20,0x3c,0x20,0x5f,0x31,0x30,0x2e,0x62,0x6c,0x75,0x72,0x5f, + 0x73,0x69,0x7a,0x65,0x3b,0x20,0x78,0x2b,0x2b,0x29,0x0a,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x5f,0x35, + 0x30,0x3b,0x20,0x79,0x20,0x3c,0x20,0x5f,0x31,0x30,0x2e,0x62,0x6c,0x75,0x72,0x5f, + 0x73,0x69,0x7a,0x65,0x3b,0x20,0x79,0x2b,0x2b,0x29,0x0a,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20, + 0x2b,0x3d,0x20,0x74,0x65,0x78,0x74,0x75,0x72,0x65,0x28,0x6f,0x70,0x74,0x65,0x78, + 0x5f,0x6f,0x70,0x73,0x6d,0x70,0x2c,0x20,0x74,0x65,0x78,0x63,0x6f,0x6f,0x72,0x64, + 0x20,0x2b,0x20,0x28,0x76,0x65,0x63,0x32,0x28,0x66,0x6c,0x6f,0x61,0x74,0x28,0x78, + 0x29,0x2c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x28,0x79,0x29,0x29,0x20,0x2a,0x20,0x5f, + 0x34,0x30,0x29,0x29,0x2e,0x78,0x79,0x7a,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x72,0x61,0x67,0x5f,0x63, + 0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x76,0x65,0x63,0x34,0x28,0x72,0x65,0x73,0x75, + 0x6c,0x74,0x20,0x2f,0x20,0x76,0x65,0x63,0x33,0x28,0x66,0x6c,0x6f,0x61,0x74,0x28, + 0x28,0x28,0x5f,0x31,0x30,0x2e,0x62,0x6c,0x75,0x72,0x5f,0x73,0x69,0x7a,0x65,0x20, + 0x2a,0x20,0x32,0x29,0x20,0x2a,0x20,0x5f,0x31,0x30,0x2e,0x62,0x6c,0x75,0x72,0x5f, + 0x73,0x69,0x7a,0x65,0x29,0x20,0x2a,0x20,0x32,0x29,0x29,0x2c,0x20,0x31,0x2e,0x30, + 0x29,0x3b,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, + 0x69,0x66,0x20,0x28,0x5f,0x31,0x30,0x2e,0x6f,0x70,0x20,0x3d,0x3d,0x20,0x31,0x29, + 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x32,0x20,0x5f,0x31,0x33,0x37, + 0x20,0x3d,0x20,0x76,0x65,0x63,0x32,0x28,0x74,0x65,0x78,0x74,0x75,0x72,0x65,0x53, + 0x69,0x7a,0x65,0x28,0x6f,0x70,0x74,0x65,0x78,0x5f,0x6f,0x70,0x73,0x6d,0x70,0x2c, + 0x20,0x30,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x74, + 0x65,0x78,0x74,0x75,0x72,0x65,0x28,0x6f,0x70,0x74,0x65,0x78,0x5f,0x6f,0x70,0x73, + 0x6d,0x70,0x2c,0x20,0x67,0x6c,0x5f,0x46,0x72,0x61,0x67,0x43,0x6f,0x6f,0x72,0x64, + 0x2e,0x78,0x79,0x20,0x2f,0x20,0x5f,0x31,0x33,0x37,0x29,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x31,0x30, + 0x2e,0x62,0x6c,0x75,0x72,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3c,0x3d,0x20,0x30,0x29, + 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72, + 0x65,0x74,0x75,0x72,0x6e,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x6d,0x78,0x20,0x3d,0x20,0x30,0x2e,0x30,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x65,0x63, + 0x34,0x20,0x63,0x6d,0x78,0x20,0x3d,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c, + 0x6f,0x72,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x69,0x6e,0x74,0x20,0x5f,0x31,0x36,0x33,0x20,0x3d,0x20,0x2d,0x5f,0x31,0x30,0x2e, + 0x62,0x6c,0x75,0x72,0x5f,0x73,0x69,0x7a,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20, + 0x69,0x20,0x3d,0x20,0x5f,0x31,0x36,0x33,0x3b,0x20,0x69,0x20,0x3c,0x3d,0x20,0x5f, + 0x31,0x30,0x2e,0x62,0x6c,0x75,0x72,0x5f,0x73,0x69,0x7a,0x65,0x3b,0x20,0x69,0x2b, + 0x2b,0x29,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b, + 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6a,0x20,0x3d,0x20,0x5f,0x31, + 0x36,0x33,0x3b,0x20,0x6a,0x20,0x3c,0x3d,0x20,0x5f,0x31,0x30,0x2e,0x62,0x6c,0x75, + 0x72,0x5f,0x73,0x69,0x7a,0x65,0x3b,0x20,0x6a,0x2b,0x2b,0x29,0x0a,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x21,0x28,0x64,0x69,0x73,0x74,0x61,0x6e,0x63, + 0x65,0x28,0x76,0x65,0x63,0x32,0x28,0x66,0x6c,0x6f,0x61,0x74,0x28,0x69,0x29,0x2c, + 0x20,0x66,0x6c,0x6f,0x61,0x74,0x28,0x6a,0x29,0x29,0x2c,0x20,0x76,0x65,0x63,0x32, + 0x28,0x30,0x2e,0x30,0x29,0x29,0x20,0x3c,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x28, + 0x5f,0x31,0x30,0x2e,0x62,0x6c,0x75,0x72,0x5f,0x73,0x69,0x7a,0x65,0x29,0x29,0x29, + 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63, + 0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x76,0x65,0x63,0x34,0x20,0x5f,0x32,0x31,0x38,0x20,0x3d,0x20,0x74, + 0x65,0x78,0x74,0x75,0x72,0x65,0x28,0x6f,0x70,0x74,0x65,0x78,0x5f,0x6f,0x70,0x73, + 0x6d,0x70,0x2c,0x20,0x28,0x67,0x6c,0x5f,0x46,0x72,0x61,0x67,0x43,0x6f,0x6f,0x72, + 0x64,0x2e,0x78,0x79,0x20,0x2b,0x20,0x28,0x76,0x65,0x63,0x32,0x28,0x66,0x6c,0x6f, + 0x61,0x74,0x28,0x69,0x29,0x2c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x28,0x6a,0x29,0x29, + 0x20,0x2a,0x20,0x5f,0x31,0x30,0x2e,0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x69,0x6f, + 0x6e,0x29,0x29,0x20,0x2f,0x20,0x5f,0x31,0x33,0x37,0x29,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x32,0x32,0x36,0x20,0x3d,0x20,0x64,0x6f, + 0x74,0x28,0x5f,0x32,0x31,0x38,0x2e,0x78,0x79,0x7a,0x2c,0x20,0x76,0x65,0x63,0x33, + 0x28,0x30,0x2e,0x33,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x31,0x39,0x32,0x30,0x39, + 0x32,0x38,0x39,0x35,0x35,0x30,0x37,0x38,0x31,0x32,0x35,0x2c,0x20,0x30,0x2e,0x35, + 0x38,0x39,0x39,0x39,0x39,0x39,0x37,0x33,0x37,0x37,0x33,0x39,0x35,0x36,0x32,0x39, + 0x38,0x38,0x32,0x38,0x31,0x32,0x35,0x2c,0x20,0x30,0x2e,0x31,0x30,0x39,0x39,0x39, + 0x39,0x39,0x39,0x39,0x34,0x30,0x33,0x39,0x35,0x33,0x35,0x35,0x32,0x32,0x34,0x36, + 0x30,0x39,0x33,0x37,0x35,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20, + 0x28,0x5f,0x32,0x32,0x36,0x20,0x3e,0x20,0x6d,0x78,0x29,0x0a,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x78,0x20,0x3d,0x20,0x5f, + 0x32,0x32,0x36,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6d,0x78, + 0x20,0x3d,0x20,0x5f,0x32,0x31,0x38,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d, + 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x34,0x20, + 0x5f,0x32,0x33,0x38,0x20,0x3d,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f, + 0x72,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76, + 0x65,0x63,0x33,0x20,0x5f,0x32,0x34,0x37,0x20,0x3d,0x20,0x6d,0x69,0x78,0x28,0x5f, + 0x32,0x33,0x38,0x2e,0x78,0x79,0x7a,0x2c,0x20,0x63,0x6d,0x78,0x2e,0x78,0x79,0x7a, + 0x2c,0x20,0x76,0x65,0x63,0x33,0x28,0x73,0x6d,0x6f,0x6f,0x74,0x68,0x73,0x74,0x65, + 0x70,0x28,0x5f,0x31,0x30,0x2e,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x6d,0x69,0x6e, + 0x2c,0x20,0x5f,0x31,0x30,0x2e,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x6d,0x61,0x78, + 0x2c,0x20,0x6d,0x78,0x29,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x2e, + 0x78,0x20,0x3d,0x20,0x5f,0x32,0x34,0x37,0x2e,0x78,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c, + 0x6f,0x72,0x2e,0x79,0x20,0x3d,0x20,0x5f,0x32,0x34,0x37,0x2e,0x79,0x3b,0x0a,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x72,0x61,0x67,0x5f, + 0x63,0x6f,0x6c,0x6f,0x72,0x2e,0x7a,0x20,0x3d,0x20,0x5f,0x32,0x34,0x37,0x2e,0x7a, + 0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76, + 0x65,0x63,0x32,0x20,0x5f,0x32,0x36,0x38,0x20,0x3d,0x20,0x76,0x65,0x63,0x32,0x28, + 0x31,0x2e,0x30,0x29,0x20,0x2f,0x20,0x76,0x65,0x63,0x32,0x28,0x74,0x65,0x78,0x74, + 0x75,0x72,0x65,0x53,0x69,0x7a,0x65,0x28,0x6f,0x70,0x74,0x65,0x78,0x5f,0x6f,0x70, + 0x73,0x6d,0x70,0x2c,0x20,0x30,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x72,0x65,0x73,0x75, + 0x6c,0x74,0x5f,0x31,0x20,0x3d,0x20,0x30,0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x5f,0x32,0x37,0x33, + 0x20,0x3d,0x20,0x2d,0x5f,0x31,0x30,0x2e,0x62,0x6c,0x75,0x72,0x5f,0x73,0x69,0x7a, + 0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66, + 0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x78,0x5f,0x31,0x20,0x3d,0x20,0x5f,0x32, + 0x37,0x33,0x3b,0x20,0x78,0x5f,0x31,0x20,0x3c,0x20,0x5f,0x31,0x30,0x2e,0x62,0x6c, + 0x75,0x72,0x5f,0x73,0x69,0x7a,0x65,0x3b,0x20,0x78,0x5f,0x31,0x2b,0x2b,0x29,0x0a, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f, + 0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x79,0x5f,0x31,0x20,0x3d,0x20,0x5f,0x32,0x37, + 0x33,0x3b,0x20,0x79,0x5f,0x31,0x20,0x3c,0x20,0x5f,0x31,0x30,0x2e,0x62,0x6c,0x75, + 0x72,0x5f,0x73,0x69,0x7a,0x65,0x3b,0x20,0x79,0x5f,0x31,0x2b,0x2b,0x29,0x0a,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b, + 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x5f,0x31,0x20,0x2b,0x3d, + 0x20,0x74,0x65,0x78,0x74,0x75,0x72,0x65,0x28,0x6f,0x70,0x74,0x65,0x78,0x5f,0x6f, + 0x70,0x73,0x6d,0x70,0x2c,0x20,0x74,0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x20,0x2b, + 0x20,0x28,0x76,0x65,0x63,0x32,0x28,0x66,0x6c,0x6f,0x61,0x74,0x28,0x78,0x5f,0x31, + 0x29,0x2c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x28,0x79,0x5f,0x31,0x29,0x29,0x20,0x2a, + 0x20,0x5f,0x32,0x36,0x38,0x29,0x29,0x2e,0x78,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x33,0x32, + 0x37,0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x5f,0x31,0x20,0x2f,0x20,0x66, + 0x6c,0x6f,0x61,0x74,0x28,0x28,0x28,0x5f,0x31,0x30,0x2e,0x62,0x6c,0x75,0x72,0x5f, + 0x73,0x69,0x7a,0x65,0x20,0x2a,0x20,0x32,0x29,0x20,0x2a,0x20,0x5f,0x31,0x30,0x2e, + 0x62,0x6c,0x75,0x72,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x2a,0x20,0x32,0x29,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x72,0x61, + 0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x76,0x65,0x63,0x34,0x28,0x5f, + 0x33,0x32,0x37,0x2c,0x20,0x5f,0x33,0x32,0x37,0x2c,0x20,0x5f,0x33,0x32,0x37,0x2c, + 0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d, + 0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x7d,0x0a,0x0a,0x00, ]; /* #version 300 es @@ -151,6 +374,17 @@ vs_op_source_glsl300es := u8.[ precision mediump float; precision highp int; + struct op_fs_params + { + int blur_size; + int op; + highp float separation; + highp float dilate_min; + highp float dilate_max; + }; + + uniform op_fs_params _10; + uniform highp sampler2D optex_opsmp; in highp vec2 texcoord; @@ -158,17 +392,72 @@ vs_op_source_glsl300es := u8.[ void main() { - highp vec2 _28 = vec2(1.0) / vec2(textureSize(optex_opsmp, 0)); - highp float result = 0.0; - for (int x = -2; x < 2; x++) + if (_10.op == 2) { - for (int y = -2; y < 2; y++) + highp vec2 _40 = vec2(1.0) / vec2(textureSize(optex_opsmp, 0)); + highp vec3 result = vec3(0.0); + int _50 = -_10.blur_size; + for (int x = _50; x < _10.blur_size; x++) { - result += texture(optex_opsmp, texcoord + (vec2(float(x), float(y)) * _28)).x; + for (int y = _50; y < _10.blur_size; y++) + { + result += texture(optex_opsmp, texcoord + (vec2(float(x), float(y)) * _40)).xyz; + } + } + frag_color = vec4(result / vec3(float(((_10.blur_size * 2) * _10.blur_size) * 2)), 1.0); + } + else + { + if (_10.op == 1) + { + highp vec2 _137 = vec2(textureSize(optex_opsmp, 0)); + frag_color = texture(optex_opsmp, gl_FragCoord.xy / _137); + if (_10.blur_size <= 0) + { + return; + } + highp float mx = 0.0; + highp vec4 cmx = frag_color; + int _163 = -_10.blur_size; + for (int i = _163; i <= _10.blur_size; i++) + { + for (int j = _163; j <= _10.blur_size; j++) + { + if (!(distance(vec2(float(i), float(j)), vec2(0.0)) <= float(_10.blur_size))) + { + continue; + } + highp vec4 _218 = texture(optex_opsmp, (gl_FragCoord.xy + (vec2(float(i), float(j)) * _10.separation)) / _137); + highp float _226 = dot(_218.xyz, vec3(0.300000011920928955078125, 0.589999973773956298828125, 0.10999999940395355224609375)); + if (_226 > mx) + { + mx = _226; + cmx = _218; + } + } + } + highp vec4 _238 = frag_color; + highp vec3 _247 = mix(_238.xyz, cmx.xyz, vec3(smoothstep(_10.dilate_min, _10.dilate_max, mx))); + frag_color.x = _247.x; + frag_color.y = _247.y; + frag_color.z = _247.z; + } + else + { + highp vec2 _268 = vec2(1.0) / vec2(textureSize(optex_opsmp, 0)); + highp float result_1 = 0.0; + int _273 = -_10.blur_size; + for (int x_1 = _273; x_1 < _10.blur_size; x_1++) + { + for (int y_1 = _273; y_1 < _10.blur_size; y_1++) + { + result_1 += texture(optex_opsmp, texcoord + (vec2(float(x_1), float(y_1)) * _268)).x; + } + } + highp float _327 = result_1 / float(((_10.blur_size * 2) * _10.blur_size) * 2); + frag_color = vec4(_327, _327, _327, 1.0); } } - highp float _84 = result * 0.0625; - frag_color = vec4(_84, _84, _84, 1.0); } */ @@ -176,39 +465,188 @@ fs_op_source_glsl300es := u8.[ 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x33,0x30,0x30,0x20,0x65,0x73,0x0a, 0x70,0x72,0x65,0x63,0x69,0x73,0x69,0x6f,0x6e,0x20,0x6d,0x65,0x64,0x69,0x75,0x6d, 0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x3b,0x0a,0x70,0x72,0x65,0x63,0x69,0x73,0x69, - 0x6f,0x6e,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x69,0x6e,0x74,0x3b,0x0a,0x0a,0x75, - 0x6e,0x69,0x66,0x6f,0x72,0x6d,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x73,0x61,0x6d, - 0x70,0x6c,0x65,0x72,0x32,0x44,0x20,0x6f,0x70,0x74,0x65,0x78,0x5f,0x6f,0x70,0x73, - 0x6d,0x70,0x3b,0x0a,0x0a,0x69,0x6e,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65, - 0x63,0x32,0x20,0x74,0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x3b,0x0a,0x6c,0x61,0x79, - 0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30, - 0x29,0x20,0x6f,0x75,0x74,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x34, - 0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x0a,0x76,0x6f, - 0x69,0x64,0x20,0x6d,0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20, - 0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x32,0x20,0x5f,0x32,0x38,0x20,0x3d, - 0x20,0x76,0x65,0x63,0x32,0x28,0x31,0x2e,0x30,0x29,0x20,0x2f,0x20,0x76,0x65,0x63, - 0x32,0x28,0x74,0x65,0x78,0x74,0x75,0x72,0x65,0x53,0x69,0x7a,0x65,0x28,0x6f,0x70, - 0x74,0x65,0x78,0x5f,0x6f,0x70,0x73,0x6d,0x70,0x2c,0x20,0x30,0x29,0x29,0x3b,0x0a, + 0x6f,0x6e,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x69,0x6e,0x74,0x3b,0x0a,0x0a,0x73, + 0x74,0x72,0x75,0x63,0x74,0x20,0x6f,0x70,0x5f,0x66,0x73,0x5f,0x70,0x61,0x72,0x61, + 0x6d,0x73,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x62,0x6c,0x75, + 0x72,0x5f,0x73,0x69,0x7a,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20, + 0x6f,0x70,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c, + 0x6f,0x61,0x74,0x20,0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x69,0x6f,0x6e,0x3b,0x0a, 0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20, - 0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x30,0x2e,0x30,0x3b,0x0a,0x20,0x20, - 0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x2d, - 0x32,0x3b,0x20,0x78,0x20,0x3c,0x20,0x32,0x3b,0x20,0x78,0x2b,0x2b,0x29,0x0a,0x20, - 0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72, - 0x20,0x28,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x2d,0x32,0x3b,0x20,0x79,0x20, - 0x3c,0x20,0x32,0x3b,0x20,0x79,0x2b,0x2b,0x29,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x6d,0x69,0x6e,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x64,0x69,0x6c,0x61, + 0x74,0x65,0x5f,0x6d,0x61,0x78,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a,0x75,0x6e,0x69,0x66, + 0x6f,0x72,0x6d,0x20,0x6f,0x70,0x5f,0x66,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73, + 0x20,0x5f,0x31,0x30,0x3b,0x0a,0x0a,0x75,0x6e,0x69,0x66,0x6f,0x72,0x6d,0x20,0x68, + 0x69,0x67,0x68,0x70,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x32,0x44,0x20,0x6f, + 0x70,0x74,0x65,0x78,0x5f,0x6f,0x70,0x73,0x6d,0x70,0x3b,0x0a,0x0a,0x69,0x6e,0x20, + 0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x32,0x20,0x74,0x65,0x78,0x63,0x6f, + 0x6f,0x72,0x64,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61, + 0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29,0x20,0x6f,0x75,0x74,0x20,0x68,0x69, + 0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x34,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f, + 0x6c,0x6f,0x72,0x3b,0x0a,0x0a,0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x69,0x6e,0x28, + 0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x31,0x30,0x2e, + 0x6f,0x70,0x20,0x3d,0x3d,0x20,0x32,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63, + 0x32,0x20,0x5f,0x34,0x30,0x20,0x3d,0x20,0x76,0x65,0x63,0x32,0x28,0x31,0x2e,0x30, + 0x29,0x20,0x2f,0x20,0x76,0x65,0x63,0x32,0x28,0x74,0x65,0x78,0x74,0x75,0x72,0x65, + 0x53,0x69,0x7a,0x65,0x28,0x6f,0x70,0x74,0x65,0x78,0x5f,0x6f,0x70,0x73,0x6d,0x70, + 0x2c,0x20,0x30,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68, + 0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x72,0x65,0x73,0x75,0x6c,0x74, + 0x20,0x3d,0x20,0x76,0x65,0x63,0x33,0x28,0x30,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x5f,0x35,0x30,0x20,0x3d,0x20, + 0x2d,0x5f,0x31,0x30,0x2e,0x62,0x6c,0x75,0x72,0x5f,0x73,0x69,0x7a,0x65,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74, + 0x20,0x78,0x20,0x3d,0x20,0x5f,0x35,0x30,0x3b,0x20,0x78,0x20,0x3c,0x20,0x5f,0x31, + 0x30,0x2e,0x62,0x6c,0x75,0x72,0x5f,0x73,0x69,0x7a,0x65,0x3b,0x20,0x78,0x2b,0x2b, + 0x29,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74, + 0x20,0x79,0x20,0x3d,0x20,0x5f,0x35,0x30,0x3b,0x20,0x79,0x20,0x3c,0x20,0x5f,0x31, + 0x30,0x2e,0x62,0x6c,0x75,0x72,0x5f,0x73,0x69,0x7a,0x65,0x3b,0x20,0x79,0x2b,0x2b, + 0x29,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x2b,0x3d,0x20,0x74,0x65,0x78,0x74,0x75,0x72, 0x65,0x28,0x6f,0x70,0x74,0x65,0x78,0x5f,0x6f,0x70,0x73,0x6d,0x70,0x2c,0x20,0x74, 0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x20,0x2b,0x20,0x28,0x76,0x65,0x63,0x32,0x28, 0x66,0x6c,0x6f,0x61,0x74,0x28,0x78,0x29,0x2c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x28, - 0x79,0x29,0x29,0x20,0x2a,0x20,0x5f,0x32,0x38,0x29,0x29,0x2e,0x78,0x3b,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20, - 0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f, - 0x38,0x34,0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x2a,0x20,0x30,0x2e, - 0x30,0x36,0x32,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x72,0x61,0x67,0x5f,0x63, - 0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x76,0x65,0x63,0x34,0x28,0x5f,0x38,0x34,0x2c, - 0x20,0x5f,0x38,0x34,0x2c,0x20,0x5f,0x38,0x34,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b, - 0x0a,0x7d,0x0a,0x0a,0x00, + 0x79,0x29,0x29,0x20,0x2a,0x20,0x5f,0x34,0x30,0x29,0x29,0x2e,0x78,0x79,0x7a,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x76,0x65, + 0x63,0x34,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x2f,0x20,0x76,0x65,0x63,0x33, + 0x28,0x66,0x6c,0x6f,0x61,0x74,0x28,0x28,0x28,0x5f,0x31,0x30,0x2e,0x62,0x6c,0x75, + 0x72,0x5f,0x73,0x69,0x7a,0x65,0x20,0x2a,0x20,0x32,0x29,0x20,0x2a,0x20,0x5f,0x31, + 0x30,0x2e,0x62,0x6c,0x75,0x72,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x2a,0x20,0x32, + 0x29,0x29,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,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,0x69,0x66,0x20,0x28,0x5f,0x31,0x30,0x2e,0x6f, + 0x70,0x20,0x3d,0x3d,0x20,0x31,0x29,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x69, + 0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x32,0x20,0x5f,0x31,0x33,0x37,0x20,0x3d,0x20, + 0x76,0x65,0x63,0x32,0x28,0x74,0x65,0x78,0x74,0x75,0x72,0x65,0x53,0x69,0x7a,0x65, + 0x28,0x6f,0x70,0x74,0x65,0x78,0x5f,0x6f,0x70,0x73,0x6d,0x70,0x2c,0x20,0x30,0x29, + 0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66, + 0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x74,0x65,0x78,0x74, + 0x75,0x72,0x65,0x28,0x6f,0x70,0x74,0x65,0x78,0x5f,0x6f,0x70,0x73,0x6d,0x70,0x2c, + 0x20,0x67,0x6c,0x5f,0x46,0x72,0x61,0x67,0x43,0x6f,0x6f,0x72,0x64,0x2e,0x78,0x79, + 0x20,0x2f,0x20,0x5f,0x31,0x33,0x37,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x31,0x30,0x2e,0x62,0x6c, + 0x75,0x72,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3c,0x3d,0x20,0x30,0x29,0x0a,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75, + 0x72,0x6e,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x69, + 0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x6d,0x78,0x20,0x3d,0x20,0x30, + 0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x34,0x20,0x63,0x6d,0x78,0x20,0x3d, + 0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x5f,0x31,0x36, + 0x33,0x20,0x3d,0x20,0x2d,0x5f,0x31,0x30,0x2e,0x62,0x6c,0x75,0x72,0x5f,0x73,0x69, + 0x7a,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x5f,0x31,0x36, + 0x33,0x3b,0x20,0x69,0x20,0x3c,0x3d,0x20,0x5f,0x31,0x30,0x2e,0x62,0x6c,0x75,0x72, + 0x5f,0x73,0x69,0x7a,0x65,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x0a,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69, + 0x6e,0x74,0x20,0x6a,0x20,0x3d,0x20,0x5f,0x31,0x36,0x33,0x3b,0x20,0x6a,0x20,0x3c, + 0x3d,0x20,0x5f,0x31,0x30,0x2e,0x62,0x6c,0x75,0x72,0x5f,0x73,0x69,0x7a,0x65,0x3b, + 0x20,0x6a,0x2b,0x2b,0x29,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28, + 0x21,0x28,0x64,0x69,0x73,0x74,0x61,0x6e,0x63,0x65,0x28,0x76,0x65,0x63,0x32,0x28, + 0x66,0x6c,0x6f,0x61,0x74,0x28,0x69,0x29,0x2c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x28, + 0x6a,0x29,0x29,0x2c,0x20,0x76,0x65,0x63,0x32,0x28,0x30,0x2e,0x30,0x29,0x29,0x20, + 0x3c,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x28,0x5f,0x31,0x30,0x2e,0x62,0x6c,0x75, + 0x72,0x5f,0x73,0x69,0x7a,0x65,0x29,0x29,0x29,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65, + 0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68, + 0x70,0x20,0x76,0x65,0x63,0x34,0x20,0x5f,0x32,0x31,0x38,0x20,0x3d,0x20,0x74,0x65, + 0x78,0x74,0x75,0x72,0x65,0x28,0x6f,0x70,0x74,0x65,0x78,0x5f,0x6f,0x70,0x73,0x6d, + 0x70,0x2c,0x20,0x28,0x67,0x6c,0x5f,0x46,0x72,0x61,0x67,0x43,0x6f,0x6f,0x72,0x64, + 0x2e,0x78,0x79,0x20,0x2b,0x20,0x28,0x76,0x65,0x63,0x32,0x28,0x66,0x6c,0x6f,0x61, + 0x74,0x28,0x69,0x29,0x2c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x28,0x6a,0x29,0x29,0x20, + 0x2a,0x20,0x5f,0x31,0x30,0x2e,0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x69,0x6f,0x6e, + 0x29,0x29,0x20,0x2f,0x20,0x5f,0x31,0x33,0x37,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x32,0x32,0x36, + 0x20,0x3d,0x20,0x64,0x6f,0x74,0x28,0x5f,0x32,0x31,0x38,0x2e,0x78,0x79,0x7a,0x2c, + 0x20,0x76,0x65,0x63,0x33,0x28,0x30,0x2e,0x33,0x30,0x30,0x30,0x30,0x30,0x30,0x31, + 0x31,0x39,0x32,0x30,0x39,0x32,0x38,0x39,0x35,0x35,0x30,0x37,0x38,0x31,0x32,0x35, + 0x2c,0x20,0x30,0x2e,0x35,0x38,0x39,0x39,0x39,0x39,0x39,0x37,0x33,0x37,0x37,0x33, + 0x39,0x35,0x36,0x32,0x39,0x38,0x38,0x32,0x38,0x31,0x32,0x35,0x2c,0x20,0x30,0x2e, + 0x31,0x30,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x34,0x30,0x33,0x39,0x35,0x33,0x35, + 0x35,0x32,0x32,0x34,0x36,0x30,0x39,0x33,0x37,0x35,0x29,0x29,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x32,0x32,0x36,0x20,0x3e,0x20,0x6d,0x78,0x29, + 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d, + 0x78,0x20,0x3d,0x20,0x5f,0x32,0x32,0x36,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x63,0x6d,0x78,0x20,0x3d,0x20,0x5f,0x32,0x31,0x38,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x34,0x20,0x5f,0x32,0x33,0x38,0x20, + 0x3d,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20, + 0x76,0x65,0x63,0x33,0x20,0x5f,0x32,0x34,0x37,0x20,0x3d,0x20,0x6d,0x69,0x78,0x28, + 0x5f,0x32,0x33,0x38,0x2e,0x78,0x79,0x7a,0x2c,0x20,0x63,0x6d,0x78,0x2e,0x78,0x79, + 0x7a,0x2c,0x20,0x76,0x65,0x63,0x33,0x28,0x73,0x6d,0x6f,0x6f,0x74,0x68,0x73,0x74, + 0x65,0x70,0x28,0x5f,0x31,0x30,0x2e,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x6d,0x69, + 0x6e,0x2c,0x20,0x5f,0x31,0x30,0x2e,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x6d,0x61, + 0x78,0x2c,0x20,0x6d,0x78,0x29,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72, + 0x2e,0x78,0x20,0x3d,0x20,0x5f,0x32,0x34,0x37,0x2e,0x78,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f, + 0x6c,0x6f,0x72,0x2e,0x79,0x20,0x3d,0x20,0x5f,0x32,0x34,0x37,0x2e,0x79,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x72,0x61,0x67, + 0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x2e,0x7a,0x20,0x3d,0x20,0x5f,0x32,0x34,0x37,0x2e, + 0x7a,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x32,0x20,0x5f,0x32,0x36,0x38,0x20, + 0x3d,0x20,0x76,0x65,0x63,0x32,0x28,0x31,0x2e,0x30,0x29,0x20,0x2f,0x20,0x76,0x65, + 0x63,0x32,0x28,0x74,0x65,0x78,0x74,0x75,0x72,0x65,0x53,0x69,0x7a,0x65,0x28,0x6f, + 0x70,0x74,0x65,0x78,0x5f,0x6f,0x70,0x73,0x6d,0x70,0x2c,0x20,0x30,0x29,0x29,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x69,0x67, + 0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x5f, + 0x31,0x20,0x3d,0x20,0x30,0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x5f,0x32,0x37,0x33,0x20,0x3d,0x20, + 0x2d,0x5f,0x31,0x30,0x2e,0x62,0x6c,0x75,0x72,0x5f,0x73,0x69,0x7a,0x65,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20, + 0x28,0x69,0x6e,0x74,0x20,0x78,0x5f,0x31,0x20,0x3d,0x20,0x5f,0x32,0x37,0x33,0x3b, + 0x20,0x78,0x5f,0x31,0x20,0x3c,0x20,0x5f,0x31,0x30,0x2e,0x62,0x6c,0x75,0x72,0x5f, + 0x73,0x69,0x7a,0x65,0x3b,0x20,0x78,0x5f,0x31,0x2b,0x2b,0x29,0x0a,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28, + 0x69,0x6e,0x74,0x20,0x79,0x5f,0x31,0x20,0x3d,0x20,0x5f,0x32,0x37,0x33,0x3b,0x20, + 0x79,0x5f,0x31,0x20,0x3c,0x20,0x5f,0x31,0x30,0x2e,0x62,0x6c,0x75,0x72,0x5f,0x73, + 0x69,0x7a,0x65,0x3b,0x20,0x79,0x5f,0x31,0x2b,0x2b,0x29,0x0a,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x5f,0x31,0x20,0x2b,0x3d,0x20,0x74,0x65, + 0x78,0x74,0x75,0x72,0x65,0x28,0x6f,0x70,0x74,0x65,0x78,0x5f,0x6f,0x70,0x73,0x6d, + 0x70,0x2c,0x20,0x74,0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x20,0x2b,0x20,0x28,0x76, + 0x65,0x63,0x32,0x28,0x66,0x6c,0x6f,0x61,0x74,0x28,0x78,0x5f,0x31,0x29,0x2c,0x20, + 0x66,0x6c,0x6f,0x61,0x74,0x28,0x79,0x5f,0x31,0x29,0x29,0x20,0x2a,0x20,0x5f,0x32, + 0x36,0x38,0x29,0x29,0x2e,0x78,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20, + 0x5f,0x33,0x32,0x37,0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x5f,0x31,0x20, + 0x2f,0x20,0x66,0x6c,0x6f,0x61,0x74,0x28,0x28,0x28,0x5f,0x31,0x30,0x2e,0x62,0x6c, + 0x75,0x72,0x5f,0x73,0x69,0x7a,0x65,0x20,0x2a,0x20,0x32,0x29,0x20,0x2a,0x20,0x5f, + 0x31,0x30,0x2e,0x62,0x6c,0x75,0x72,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x2a,0x20, + 0x32,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x76,0x65,0x63, + 0x34,0x28,0x5f,0x33,0x32,0x37,0x2c,0x20,0x5f,0x33,0x32,0x37,0x2c,0x20,0x5f,0x33, + 0x32,0x37,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x7d,0x0a,0x0a,0x00, ]; /* #include @@ -273,6 +711,15 @@ vs_op_source_metal_macos := u8.[ using namespace metal; + struct op_fs_params + { + int blur_size; + int op; + float separation; + float dilate_min; + float dilate_max; + }; + struct main0_out { float4 frag_color [[color(0)]]; @@ -283,20 +730,75 @@ vs_op_source_metal_macos := u8.[ float2 texcoord [[user(locn0)]]; }; - fragment main0_out main0(main0_in in [[stage_in]], texture2d optex [[texture(0)]], sampler opsmp [[sampler(0)]]) + fragment main0_out main0(main0_in in [[stage_in]], constant op_fs_params& _10 [[buffer(0)]], texture2d optex [[texture(0)]], sampler opsmp [[sampler(0)]], float4 gl_FragCoord [[position]]) { main0_out out = {}; - float2 _28 = float2(1.0) / float2(int2(optex.get_width(), optex.get_height())); - float result = 0.0; - for (int x = -2; x < 2; x++) + if (_10.op == 2) { - for (int y = -2; y < 2; y++) + float2 _40 = float2(1.0) / float2(int2(optex.get_width(), optex.get_height())); + float3 result = float3(0.0); + int _50 = -_10.blur_size; + for (int x = _50; x < _10.blur_size; x++) { - result += optex.sample(opsmp, (in.texcoord + (float2(float(x), float(y)) * _28))).x; + for (int y = _50; y < _10.blur_size; y++) + { + result += optex.sample(opsmp, (in.texcoord + (float2(float(x), float(y)) * _40))).xyz; + } + } + out.frag_color = float4(result / float3(float(((_10.blur_size * 2) * _10.blur_size) * 2)), 1.0); + } + else + { + if (_10.op == 1) + { + float2 _137 = float2(int2(optex.get_width(), optex.get_height())); + out.frag_color = optex.sample(opsmp, (gl_FragCoord.xy / _137)); + if (_10.blur_size <= 0) + { + return out; + } + float mx = 0.0; + float4 cmx = out.frag_color; + int _163 = -_10.blur_size; + for (int i = _163; i <= _10.blur_size; i++) + { + for (int j = _163; j <= _10.blur_size; j++) + { + if (!(distance(float2(float(i), float(j)), float2(0.0)) <= float(_10.blur_size))) + { + continue; + } + float4 _218 = optex.sample(opsmp, ((gl_FragCoord.xy + (float2(float(i), float(j)) * _10.separation)) / _137)); + float _226 = dot(_218.xyz, float3(0.300000011920928955078125, 0.589999973773956298828125, 0.10999999940395355224609375)); + if (_226 > mx) + { + mx = _226; + cmx = _218; + } + } + } + float4 _238 = out.frag_color; + float3 _247 = mix(_238.xyz, cmx.xyz, float3(smoothstep(_10.dilate_min, _10.dilate_max, mx))); + out.frag_color.x = _247.x; + out.frag_color.y = _247.y; + out.frag_color.z = _247.z; + } + else + { + float2 _268 = float2(1.0) / float2(int2(optex.get_width(), optex.get_height())); + float result_1 = 0.0; + int _273 = -_10.blur_size; + for (int x_1 = _273; x_1 < _10.blur_size; x_1++) + { + for (int y_1 = _273; y_1 < _10.blur_size; y_1++) + { + result_1 += optex.sample(opsmp, (in.texcoord + (float2(float(x_1), float(y_1)) * _268))).x; + } + } + float _327 = result_1 / float(((_10.blur_size * 2) * _10.blur_size) * 2); + out.frag_color = float4(_327, _327, _327, 1.0); } } - float _84 = result * 0.0625; - out.frag_color = float4(_84, _84, _84, 1.0); return out; } @@ -306,49 +808,204 @@ fs_op_source_metal_macos := u8.[ 0x73,0x74,0x64,0x6c,0x69,0x62,0x3e,0x0a,0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65, 0x20,0x3c,0x73,0x69,0x6d,0x64,0x2f,0x73,0x69,0x6d,0x64,0x2e,0x68,0x3e,0x0a,0x0a, 0x75,0x73,0x69,0x6e,0x67,0x20,0x6e,0x61,0x6d,0x65,0x73,0x70,0x61,0x63,0x65,0x20, - 0x6d,0x65,0x74,0x61,0x6c,0x3b,0x0a,0x0a,0x73,0x74,0x72,0x75,0x63,0x74,0x20,0x6d, - 0x61,0x69,0x6e,0x30,0x5f,0x6f,0x75,0x74,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66, - 0x6c,0x6f,0x61,0x74,0x34,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72, - 0x20,0x5b,0x5b,0x63,0x6f,0x6c,0x6f,0x72,0x28,0x30,0x29,0x5d,0x5d,0x3b,0x0a,0x7d, + 0x6d,0x65,0x74,0x61,0x6c,0x3b,0x0a,0x0a,0x73,0x74,0x72,0x75,0x63,0x74,0x20,0x6f, + 0x70,0x5f,0x66,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x0a,0x7b,0x0a,0x20,0x20, + 0x20,0x20,0x69,0x6e,0x74,0x20,0x62,0x6c,0x75,0x72,0x5f,0x73,0x69,0x7a,0x65,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x70,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x69,0x6f, + 0x6e,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x64,0x69,0x6c, + 0x61,0x74,0x65,0x5f,0x6d,0x69,0x6e,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f, + 0x61,0x74,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x6d,0x61,0x78,0x3b,0x0a,0x7d, 0x3b,0x0a,0x0a,0x73,0x74,0x72,0x75,0x63,0x74,0x20,0x6d,0x61,0x69,0x6e,0x30,0x5f, - 0x69,0x6e,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x20, - 0x74,0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x20,0x5b,0x5b,0x75,0x73,0x65,0x72,0x28, - 0x6c,0x6f,0x63,0x6e,0x30,0x29,0x5d,0x5d,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a,0x66,0x72, - 0x61,0x67,0x6d,0x65,0x6e,0x74,0x20,0x6d,0x61,0x69,0x6e,0x30,0x5f,0x6f,0x75,0x74, - 0x20,0x6d,0x61,0x69,0x6e,0x30,0x28,0x6d,0x61,0x69,0x6e,0x30,0x5f,0x69,0x6e,0x20, - 0x69,0x6e,0x20,0x5b,0x5b,0x73,0x74,0x61,0x67,0x65,0x5f,0x69,0x6e,0x5d,0x5d,0x2c, - 0x20,0x74,0x65,0x78,0x74,0x75,0x72,0x65,0x32,0x64,0x3c,0x66,0x6c,0x6f,0x61,0x74, - 0x3e,0x20,0x6f,0x70,0x74,0x65,0x78,0x20,0x5b,0x5b,0x74,0x65,0x78,0x74,0x75,0x72, - 0x65,0x28,0x30,0x29,0x5d,0x5d,0x2c,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x20, - 0x6f,0x70,0x73,0x6d,0x70,0x20,0x5b,0x5b,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x28, - 0x30,0x29,0x5d,0x5d,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x6d,0x61,0x69,0x6e, - 0x30,0x5f,0x6f,0x75,0x74,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x7b,0x7d,0x3b,0x0a, - 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x20,0x5f,0x32,0x38,0x20,0x3d, - 0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x28,0x31,0x2e,0x30,0x29,0x20,0x2f,0x20,0x66, - 0x6c,0x6f,0x61,0x74,0x32,0x28,0x69,0x6e,0x74,0x32,0x28,0x6f,0x70,0x74,0x65,0x78, - 0x2e,0x67,0x65,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x28,0x29,0x2c,0x20,0x6f,0x70, - 0x74,0x65,0x78,0x2e,0x67,0x65,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x28,0x29, - 0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x72,0x65, - 0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x30,0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20, - 0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x2d,0x32,0x3b, - 0x20,0x78,0x20,0x3c,0x20,0x32,0x3b,0x20,0x78,0x2b,0x2b,0x29,0x0a,0x20,0x20,0x20, - 0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28, - 0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x2d,0x32,0x3b,0x20,0x79,0x20,0x3c,0x20, - 0x32,0x3b,0x20,0x79,0x2b,0x2b,0x29,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65, - 0x73,0x75,0x6c,0x74,0x20,0x2b,0x3d,0x20,0x6f,0x70,0x74,0x65,0x78,0x2e,0x73,0x61, - 0x6d,0x70,0x6c,0x65,0x28,0x6f,0x70,0x73,0x6d,0x70,0x2c,0x20,0x28,0x69,0x6e,0x2e, - 0x74,0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x20,0x2b,0x20,0x28,0x66,0x6c,0x6f,0x61, - 0x74,0x32,0x28,0x66,0x6c,0x6f,0x61,0x74,0x28,0x78,0x29,0x2c,0x20,0x66,0x6c,0x6f, - 0x61,0x74,0x28,0x79,0x29,0x29,0x20,0x2a,0x20,0x5f,0x32,0x38,0x29,0x29,0x29,0x2e, - 0x78,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20, - 0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x38,0x34, - 0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x2a,0x20,0x30,0x2e,0x30,0x36, - 0x32,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x66,0x72,0x61,0x67, + 0x6f,0x75,0x74,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34, + 0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x5b,0x5b,0x63,0x6f, + 0x6c,0x6f,0x72,0x28,0x30,0x29,0x5d,0x5d,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a,0x73,0x74, + 0x72,0x75,0x63,0x74,0x20,0x6d,0x61,0x69,0x6e,0x30,0x5f,0x69,0x6e,0x0a,0x7b,0x0a, + 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x20,0x74,0x65,0x78,0x63,0x6f, + 0x6f,0x72,0x64,0x20,0x5b,0x5b,0x75,0x73,0x65,0x72,0x28,0x6c,0x6f,0x63,0x6e,0x30, + 0x29,0x5d,0x5d,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a,0x66,0x72,0x61,0x67,0x6d,0x65,0x6e, + 0x74,0x20,0x6d,0x61,0x69,0x6e,0x30,0x5f,0x6f,0x75,0x74,0x20,0x6d,0x61,0x69,0x6e, + 0x30,0x28,0x6d,0x61,0x69,0x6e,0x30,0x5f,0x69,0x6e,0x20,0x69,0x6e,0x20,0x5b,0x5b, + 0x73,0x74,0x61,0x67,0x65,0x5f,0x69,0x6e,0x5d,0x5d,0x2c,0x20,0x63,0x6f,0x6e,0x73, + 0x74,0x61,0x6e,0x74,0x20,0x6f,0x70,0x5f,0x66,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d, + 0x73,0x26,0x20,0x5f,0x31,0x30,0x20,0x5b,0x5b,0x62,0x75,0x66,0x66,0x65,0x72,0x28, + 0x30,0x29,0x5d,0x5d,0x2c,0x20,0x74,0x65,0x78,0x74,0x75,0x72,0x65,0x32,0x64,0x3c, + 0x66,0x6c,0x6f,0x61,0x74,0x3e,0x20,0x6f,0x70,0x74,0x65,0x78,0x20,0x5b,0x5b,0x74, + 0x65,0x78,0x74,0x75,0x72,0x65,0x28,0x30,0x29,0x5d,0x5d,0x2c,0x20,0x73,0x61,0x6d, + 0x70,0x6c,0x65,0x72,0x20,0x6f,0x70,0x73,0x6d,0x70,0x20,0x5b,0x5b,0x73,0x61,0x6d, + 0x70,0x6c,0x65,0x72,0x28,0x30,0x29,0x5d,0x5d,0x2c,0x20,0x66,0x6c,0x6f,0x61,0x74, + 0x34,0x20,0x67,0x6c,0x5f,0x46,0x72,0x61,0x67,0x43,0x6f,0x6f,0x72,0x64,0x20,0x5b, + 0x5b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x5d,0x5d,0x29,0x0a,0x7b,0x0a,0x20, + 0x20,0x20,0x20,0x6d,0x61,0x69,0x6e,0x30,0x5f,0x6f,0x75,0x74,0x20,0x6f,0x75,0x74, + 0x20,0x3d,0x20,0x7b,0x7d,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f, + 0x31,0x30,0x2e,0x6f,0x70,0x20,0x3d,0x3d,0x20,0x32,0x29,0x0a,0x20,0x20,0x20,0x20, + 0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32, + 0x20,0x5f,0x34,0x30,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x28,0x31,0x2e, + 0x30,0x29,0x20,0x2f,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x28,0x69,0x6e,0x74,0x32, + 0x28,0x6f,0x70,0x74,0x65,0x78,0x2e,0x67,0x65,0x74,0x5f,0x77,0x69,0x64,0x74,0x68, + 0x28,0x29,0x2c,0x20,0x6f,0x70,0x74,0x65,0x78,0x2e,0x67,0x65,0x74,0x5f,0x68,0x65, + 0x69,0x67,0x68,0x74,0x28,0x29,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20, + 0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x28,0x30,0x2e,0x30,0x29,0x3b,0x0a,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x5f,0x35,0x30,0x20,0x3d, + 0x20,0x2d,0x5f,0x31,0x30,0x2e,0x62,0x6c,0x75,0x72,0x5f,0x73,0x69,0x7a,0x65,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e, + 0x74,0x20,0x78,0x20,0x3d,0x20,0x5f,0x35,0x30,0x3b,0x20,0x78,0x20,0x3c,0x20,0x5f, + 0x31,0x30,0x2e,0x62,0x6c,0x75,0x72,0x5f,0x73,0x69,0x7a,0x65,0x3b,0x20,0x78,0x2b, + 0x2b,0x29,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e, + 0x74,0x20,0x79,0x20,0x3d,0x20,0x5f,0x35,0x30,0x3b,0x20,0x79,0x20,0x3c,0x20,0x5f, + 0x31,0x30,0x2e,0x62,0x6c,0x75,0x72,0x5f,0x73,0x69,0x7a,0x65,0x3b,0x20,0x79,0x2b, + 0x2b,0x29,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b, + 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x2b,0x3d,0x20,0x6f,0x70,0x74,0x65,0x78, + 0x2e,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x6f,0x70,0x73,0x6d,0x70,0x2c,0x20,0x28, + 0x69,0x6e,0x2e,0x74,0x65,0x78,0x63,0x6f,0x6f,0x72,0x64,0x20,0x2b,0x20,0x28,0x66, + 0x6c,0x6f,0x61,0x74,0x32,0x28,0x66,0x6c,0x6f,0x61,0x74,0x28,0x78,0x29,0x2c,0x20, + 0x66,0x6c,0x6f,0x61,0x74,0x28,0x79,0x29,0x29,0x20,0x2a,0x20,0x5f,0x34,0x30,0x29, + 0x29,0x29,0x2e,0x78,0x79,0x7a,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x66,0x72,0x61,0x67, 0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28, - 0x5f,0x38,0x34,0x2c,0x20,0x5f,0x38,0x34,0x2c,0x20,0x5f,0x38,0x34,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, + 0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x2f,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x28, + 0x66,0x6c,0x6f,0x61,0x74,0x28,0x28,0x28,0x5f,0x31,0x30,0x2e,0x62,0x6c,0x75,0x72, + 0x5f,0x73,0x69,0x7a,0x65,0x20,0x2a,0x20,0x32,0x29,0x20,0x2a,0x20,0x5f,0x31,0x30, + 0x2e,0x62,0x6c,0x75,0x72,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x2a,0x20,0x32,0x29, + 0x29,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,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,0x69,0x66,0x20,0x28,0x5f,0x31,0x30,0x2e,0x6f,0x70, + 0x20,0x3d,0x3d,0x20,0x31,0x29,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b, + 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f, + 0x61,0x74,0x32,0x20,0x5f,0x31,0x33,0x37,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74, + 0x32,0x28,0x69,0x6e,0x74,0x32,0x28,0x6f,0x70,0x74,0x65,0x78,0x2e,0x67,0x65,0x74, + 0x5f,0x77,0x69,0x64,0x74,0x68,0x28,0x29,0x2c,0x20,0x6f,0x70,0x74,0x65,0x78,0x2e, + 0x67,0x65,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x28,0x29,0x29,0x29,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e, + 0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x6f,0x70,0x74, + 0x65,0x78,0x2e,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x6f,0x70,0x73,0x6d,0x70,0x2c, + 0x20,0x28,0x67,0x6c,0x5f,0x46,0x72,0x61,0x67,0x43,0x6f,0x6f,0x72,0x64,0x2e,0x78, + 0x79,0x20,0x2f,0x20,0x5f,0x31,0x33,0x37,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x31,0x30,0x2e, + 0x62,0x6c,0x75,0x72,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3c,0x3d,0x20,0x30,0x29,0x0a, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65, + 0x74,0x75,0x72,0x6e,0x20,0x6f,0x75,0x74,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x6d,0x78,0x20,0x3d,0x20,0x30, + 0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x63,0x6d,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74, + 0x2e,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x5f,0x31,0x36, + 0x33,0x20,0x3d,0x20,0x2d,0x5f,0x31,0x30,0x2e,0x62,0x6c,0x75,0x72,0x5f,0x73,0x69, + 0x7a,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x5f,0x31,0x36, + 0x33,0x3b,0x20,0x69,0x20,0x3c,0x3d,0x20,0x5f,0x31,0x30,0x2e,0x62,0x6c,0x75,0x72, + 0x5f,0x73,0x69,0x7a,0x65,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x0a,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69, + 0x6e,0x74,0x20,0x6a,0x20,0x3d,0x20,0x5f,0x31,0x36,0x33,0x3b,0x20,0x6a,0x20,0x3c, + 0x3d,0x20,0x5f,0x31,0x30,0x2e,0x62,0x6c,0x75,0x72,0x5f,0x73,0x69,0x7a,0x65,0x3b, + 0x20,0x6a,0x2b,0x2b,0x29,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28, + 0x21,0x28,0x64,0x69,0x73,0x74,0x61,0x6e,0x63,0x65,0x28,0x66,0x6c,0x6f,0x61,0x74, + 0x32,0x28,0x66,0x6c,0x6f,0x61,0x74,0x28,0x69,0x29,0x2c,0x20,0x66,0x6c,0x6f,0x61, + 0x74,0x28,0x6a,0x29,0x29,0x2c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x28,0x30,0x2e, + 0x30,0x29,0x29,0x20,0x3c,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x28,0x5f,0x31,0x30, + 0x2e,0x62,0x6c,0x75,0x72,0x5f,0x73,0x69,0x7a,0x65,0x29,0x29,0x29,0x0a,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74, + 0x69,0x6e,0x75,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x5f,0x32,0x31,0x38,0x20,0x3d,0x20,0x6f,0x70, + 0x74,0x65,0x78,0x2e,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x6f,0x70,0x73,0x6d,0x70, + 0x2c,0x20,0x28,0x28,0x67,0x6c,0x5f,0x46,0x72,0x61,0x67,0x43,0x6f,0x6f,0x72,0x64, + 0x2e,0x78,0x79,0x20,0x2b,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x32,0x28,0x66,0x6c, + 0x6f,0x61,0x74,0x28,0x69,0x29,0x2c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x28,0x6a,0x29, + 0x29,0x20,0x2a,0x20,0x5f,0x31,0x30,0x2e,0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x69, + 0x6f,0x6e,0x29,0x29,0x20,0x2f,0x20,0x5f,0x31,0x33,0x37,0x29,0x29,0x3b,0x0a,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x32,0x32,0x36,0x20,0x3d,0x20, + 0x64,0x6f,0x74,0x28,0x5f,0x32,0x31,0x38,0x2e,0x78,0x79,0x7a,0x2c,0x20,0x66,0x6c, + 0x6f,0x61,0x74,0x33,0x28,0x30,0x2e,0x33,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x31, + 0x39,0x32,0x30,0x39,0x32,0x38,0x39,0x35,0x35,0x30,0x37,0x38,0x31,0x32,0x35,0x2c, + 0x20,0x30,0x2e,0x35,0x38,0x39,0x39,0x39,0x39,0x39,0x37,0x33,0x37,0x37,0x33,0x39, + 0x35,0x36,0x32,0x39,0x38,0x38,0x32,0x38,0x31,0x32,0x35,0x2c,0x20,0x30,0x2e,0x31, + 0x30,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x34,0x30,0x33,0x39,0x35,0x33,0x35,0x35, + 0x32,0x32,0x34,0x36,0x30,0x39,0x33,0x37,0x35,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x69,0x66,0x20,0x28,0x5f,0x32,0x32,0x36,0x20,0x3e,0x20,0x6d,0x78,0x29,0x0a, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x78, + 0x20,0x3d,0x20,0x5f,0x32,0x32,0x36,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x63,0x6d,0x78,0x20,0x3d,0x20,0x5f,0x32,0x31,0x38,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66, + 0x6c,0x6f,0x61,0x74,0x34,0x20,0x5f,0x32,0x33,0x38,0x20,0x3d,0x20,0x6f,0x75,0x74, + 0x2e,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20, + 0x5f,0x32,0x34,0x37,0x20,0x3d,0x20,0x6d,0x69,0x78,0x28,0x5f,0x32,0x33,0x38,0x2e, + 0x78,0x79,0x7a,0x2c,0x20,0x63,0x6d,0x78,0x2e,0x78,0x79,0x7a,0x2c,0x20,0x66,0x6c, + 0x6f,0x61,0x74,0x33,0x28,0x73,0x6d,0x6f,0x6f,0x74,0x68,0x73,0x74,0x65,0x70,0x28, + 0x5f,0x31,0x30,0x2e,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x6d,0x69,0x6e,0x2c,0x20, + 0x5f,0x31,0x30,0x2e,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x6d,0x61,0x78,0x2c,0x20, + 0x6d,0x78,0x29,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f, + 0x72,0x2e,0x78,0x20,0x3d,0x20,0x5f,0x32,0x34,0x37,0x2e,0x78,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x66,0x72, + 0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x2e,0x79,0x20,0x3d,0x20,0x5f,0x32,0x34, + 0x37,0x2e,0x79,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x6f,0x75,0x74,0x2e,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x2e, + 0x7a,0x20,0x3d,0x20,0x5f,0x32,0x34,0x37,0x2e,0x7a,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6c, + 0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x20, + 0x5f,0x32,0x36,0x38,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x28,0x31,0x2e, + 0x30,0x29,0x20,0x2f,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x28,0x69,0x6e,0x74,0x32, + 0x28,0x6f,0x70,0x74,0x65,0x78,0x2e,0x67,0x65,0x74,0x5f,0x77,0x69,0x64,0x74,0x68, + 0x28,0x29,0x2c,0x20,0x6f,0x70,0x74,0x65,0x78,0x2e,0x67,0x65,0x74,0x5f,0x68,0x65, + 0x69,0x67,0x68,0x74,0x28,0x29,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x72,0x65,0x73,0x75, + 0x6c,0x74,0x5f,0x31,0x20,0x3d,0x20,0x30,0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x5f,0x32,0x37,0x33, + 0x20,0x3d,0x20,0x2d,0x5f,0x31,0x30,0x2e,0x62,0x6c,0x75,0x72,0x5f,0x73,0x69,0x7a, + 0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66, + 0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x78,0x5f,0x31,0x20,0x3d,0x20,0x5f,0x32, + 0x37,0x33,0x3b,0x20,0x78,0x5f,0x31,0x20,0x3c,0x20,0x5f,0x31,0x30,0x2e,0x62,0x6c, + 0x75,0x72,0x5f,0x73,0x69,0x7a,0x65,0x3b,0x20,0x78,0x5f,0x31,0x2b,0x2b,0x29,0x0a, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f, + 0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x79,0x5f,0x31,0x20,0x3d,0x20,0x5f,0x32,0x37, + 0x33,0x3b,0x20,0x79,0x5f,0x31,0x20,0x3c,0x20,0x5f,0x31,0x30,0x2e,0x62,0x6c,0x75, + 0x72,0x5f,0x73,0x69,0x7a,0x65,0x3b,0x20,0x79,0x5f,0x31,0x2b,0x2b,0x29,0x0a,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b, + 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x5f,0x31,0x20,0x2b,0x3d, + 0x20,0x6f,0x70,0x74,0x65,0x78,0x2e,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x6f,0x70, + 0x73,0x6d,0x70,0x2c,0x20,0x28,0x69,0x6e,0x2e,0x74,0x65,0x78,0x63,0x6f,0x6f,0x72, + 0x64,0x20,0x2b,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x32,0x28,0x66,0x6c,0x6f,0x61, + 0x74,0x28,0x78,0x5f,0x31,0x29,0x2c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x28,0x79,0x5f, + 0x31,0x29,0x29,0x20,0x2a,0x20,0x5f,0x32,0x36,0x38,0x29,0x29,0x29,0x2e,0x78,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d, + 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f, + 0x61,0x74,0x20,0x5f,0x33,0x32,0x37,0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74, + 0x5f,0x31,0x20,0x2f,0x20,0x66,0x6c,0x6f,0x61,0x74,0x28,0x28,0x28,0x5f,0x31,0x30, + 0x2e,0x62,0x6c,0x75,0x72,0x5f,0x73,0x69,0x7a,0x65,0x20,0x2a,0x20,0x32,0x29,0x20, + 0x2a,0x20,0x5f,0x31,0x30,0x2e,0x62,0x6c,0x75,0x72,0x5f,0x73,0x69,0x7a,0x65,0x29, + 0x20,0x2a,0x20,0x32,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f, + 0x72,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x5f,0x33,0x32,0x37,0x2c, + 0x20,0x5f,0x33,0x32,0x37,0x2c,0x20,0x5f,0x33,0x32,0x37,0x2c,0x20,0x31,0x2e,0x30, + 0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20, + 0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x6f,0x75, + 0x74,0x3b,0x0a,0x7d,0x0a,0x0a,0x00, ]; op_shader_desc :: (backend: sg_backend) -> sg_shader_desc { desc: sg_shader_desc; @@ -363,6 +1020,24 @@ op_shader_desc :: (backend: sg_backend) -> sg_shader_desc { desc.attrs[0].glsl_name = "position"; desc.attrs[1].base_type = .FLOAT; desc.attrs[1].glsl_name = "uv"; + desc.uniform_blocks[1].stage = .FRAGMENT; + desc.uniform_blocks[1].layout = .STD140; + desc.uniform_blocks[1].size = 32; + desc.uniform_blocks[1].glsl_uniforms[0].type = .INT; + desc.uniform_blocks[1].glsl_uniforms[0].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[0].glsl_name = "_10.blur_size"; + desc.uniform_blocks[1].glsl_uniforms[1].type = .INT; + desc.uniform_blocks[1].glsl_uniforms[1].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[1].glsl_name = "_10.op"; + desc.uniform_blocks[1].glsl_uniforms[2].type = .FLOAT; + desc.uniform_blocks[1].glsl_uniforms[2].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[2].glsl_name = "_10.separation"; + desc.uniform_blocks[1].glsl_uniforms[3].type = .FLOAT; + desc.uniform_blocks[1].glsl_uniforms[3].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[3].glsl_name = "_10.dilate_min"; + desc.uniform_blocks[1].glsl_uniforms[4].type = .FLOAT; + desc.uniform_blocks[1].glsl_uniforms[4].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[4].glsl_name = "_10.dilate_max"; desc.images[0].stage = .FRAGMENT; desc.images[0].multisampled = false; desc.images[0].image_type = ._2D; @@ -382,6 +1057,24 @@ op_shader_desc :: (backend: sg_backend) -> sg_shader_desc { desc.attrs[0].glsl_name = "position"; desc.attrs[1].base_type = .FLOAT; desc.attrs[1].glsl_name = "uv"; + desc.uniform_blocks[1].stage = .FRAGMENT; + desc.uniform_blocks[1].layout = .STD140; + desc.uniform_blocks[1].size = 32; + desc.uniform_blocks[1].glsl_uniforms[0].type = .INT; + desc.uniform_blocks[1].glsl_uniforms[0].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[0].glsl_name = "_10.blur_size"; + desc.uniform_blocks[1].glsl_uniforms[1].type = .INT; + desc.uniform_blocks[1].glsl_uniforms[1].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[1].glsl_name = "_10.op"; + desc.uniform_blocks[1].glsl_uniforms[2].type = .FLOAT; + desc.uniform_blocks[1].glsl_uniforms[2].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[2].glsl_name = "_10.separation"; + desc.uniform_blocks[1].glsl_uniforms[3].type = .FLOAT; + desc.uniform_blocks[1].glsl_uniforms[3].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[3].glsl_name = "_10.dilate_min"; + desc.uniform_blocks[1].glsl_uniforms[4].type = .FLOAT; + desc.uniform_blocks[1].glsl_uniforms[4].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[4].glsl_name = "_10.dilate_max"; desc.images[0].stage = .FRAGMENT; desc.images[0].multisampled = false; desc.images[0].image_type = ._2D; @@ -399,6 +1092,10 @@ op_shader_desc :: (backend: sg_backend) -> sg_shader_desc { desc.fragment_func.entry = "main0"; desc.attrs[0].base_type = .FLOAT; desc.attrs[1].base_type = .FLOAT; + desc.uniform_blocks[1].stage = .FRAGMENT; + desc.uniform_blocks[1].layout = .STD140; + desc.uniform_blocks[1].size = 32; + desc.uniform_blocks[1].msl_buffer_n = 0; desc.images[0].stage = .FRAGMENT; desc.images[0].multisampled = false; desc.images[0].image_type = ._2D; diff --git a/src/shaders/shader_gbuffer.glsl b/src/shaders/shader_gbuffer.glsl index de348be..5d6a820 100644 --- a/src/shaders/shader_gbuffer.glsl +++ b/src/shaders/shader_gbuffer.glsl @@ -2,6 +2,8 @@ layout(binding=0) uniform gbuffer_vs_params { mat4 mvp; mat4 view_matrix; + int isGround; + float planeHeight; }; in vec4 position; @@ -13,12 +15,20 @@ out vec3 view_space_pos; out vec3 view_space_normal; void main() { - vec4 world_pos = vec4(position.xyz + instance.xyz, 1.0); - vec4 view_pos_4 = view_matrix * world_pos; - - gl_Position = mvp * world_pos; - view_space_pos = view_pos_4.xyz; - view_space_normal = mat3(view_matrix) * normal.xyz; + if (isGround == 1) { + vec4 world_pos = vec4(position.x * 100.0, planeHeight, position.z * 100.0, 1.0); + vec4 view_pos_4 = view_matrix * world_pos; + gl_Position = mvp * world_pos; + view_space_pos = view_pos_4.xyz; + view_space_normal = mat3(view_matrix) * normal.xyz; + } else { + vec4 world_pos = vec4(position.xyz + instance.xyz, 1.0); + vec4 view_pos_4 = view_matrix * world_pos; + gl_Position = mvp * world_pos; + view_space_pos = view_pos_4.xyz; + view_space_normal = mat3(view_matrix) * normal.xyz; + + } } @end diff --git a/src/shaders/shader_mix.glsl b/src/shaders/shader_mix.glsl new file mode 100644 index 0000000..4228765 --- /dev/null +++ b/src/shaders/shader_mix.glsl @@ -0,0 +1,49 @@ +@vs vs_mix +in vec2 position; +in vec2 uv; + +out vec2 texcoord; + +void main() { + gl_Position = vec4(position, 0.5, 1.0); + texcoord = uv; +} +@end + +@fs fs_mix +in vec2 texcoord; +out vec4 frag_color; + +layout(binding=1) uniform mix_fs_params { + int op; + float dof_min; + float dof_max; + float dof_point; + /* + List of mixs: + 0. blur for ssao + 1. dilate. + 2. normal blur + */ +}; + +layout(binding = 0) uniform texture2D mixtex_a; +layout(binding = 1) uniform texture2D mixtex_b; +layout(binding = 2) uniform texture2D mixtex_c; +layout(binding = 0) uniform sampler mixsmp; + +void main() { + if(op == 0) { + vec2 texelSize = 1.0 / vec2(textureSize(sampler2D(mixtex_a, mixsmp), 0)); + vec3 in_focus = texture(sampler2D(mixtex_b, mixsmp), texcoord).rgb; + vec3 out_focus = texture(sampler2D(mixtex_a, mixsmp), texcoord).rgb; + vec4 position = texture(sampler2D(mixtex_c, mixsmp), texcoord); + float blur = smoothstep(dof_min, dof_max, abs(position.z + dof_point)); + frag_color = vec4(mix(in_focus, out_focus, blur), 1.0); + } else { + frag_color = vec4(1.0); + } +} +@end + +@program mix vs_mix fs_mix diff --git a/src/shaders/shader_op.glsl b/src/shaders/shader_op.glsl index 5368138..5885c7b 100644 --- a/src/shaders/shader_op.glsl +++ b/src/shaders/shader_op.glsl @@ -14,21 +14,69 @@ void main() { in vec2 texcoord; out vec4 frag_color; +layout(binding=1) uniform op_fs_params { + int blur_size; + int op; + float separation; + float dilate_min; + float dilate_max; + /* + List of ops: + 0. blur for ssao + 1. dilate. + 2. normal blur + */ +}; + layout(binding = 0) uniform texture2D optex; layout(binding = 0) uniform sampler opsmp; void main() { - vec2 texelSize = 1.0 / vec2(textureSize(sampler2D(optex, opsmp), 0)); - float result = 0.0; - for (int x = -2; x < 2; ++x) - { - for (int y = -2; y < 2; ++y) + if(op == 2) { + vec2 texelSize = 1.0 / vec2(textureSize(sampler2D(optex, opsmp), 0)); + vec3 result = vec3(0.0); + for (int x = -blur_size; x < blur_size; ++x) { - vec2 offset = vec2(float(x), float(y)) * texelSize; - result += texture(sampler2D(optex, opsmp), texcoord + offset).r; + for (int y = -blur_size; y < blur_size; ++y) + { + vec2 offset = vec2(float(x), float(y)) * texelSize; + result += texture(sampler2D(optex, opsmp), texcoord + offset).xyz; + } } + frag_color = vec4((result / (blur_size*2 * blur_size*2)), 1.0); + } + else if(op == 1) { + float minThreshold = dilate_min; + float maxThreshold = dilate_max; + vec2 texSize = textureSize(sampler2D(optex, opsmp), 0).xy; + vec2 fragCoord = gl_FragCoord.xy; + frag_color = texture(sampler2D(optex, opsmp), fragCoord / texSize); + if (blur_size <= 0) { return; } + float mx = 0.0; + vec4 cmx = frag_color; + for (int i = -blur_size; i <= blur_size; ++i) { + for (int j = -blur_size; j <= blur_size; ++j) { + if (!(distance(vec2(i, j), vec2(0, 0)) <= blur_size)) { continue; } + vec4 c = texture(sampler2D(optex,opsmp),(gl_FragCoord.xy + (vec2(i, j) * separation)) / texSize); + float mxt = dot(c.rgb, vec3(0.3, 0.59, 0.11)); + if (mxt > mx) { + mx = mxt; + cmx = c; + } + } + } + frag_color.rgb = mix(frag_color.rgb, cmx.rgb, smoothstep(minThreshold, maxThreshold, mx)); + } else { + vec2 texelSize = 1.0 / vec2(textureSize(sampler2D(optex, opsmp), 0)); + float result = 0.0; + for (int x = -blur_size; x < blur_size; ++x) { + for (int y = -blur_size; y < blur_size; ++y) { + vec2 offset = vec2(float(x), float(y)) * texelSize; + result += texture(sampler2D(optex, opsmp), texcoord + offset).r; + } + } + frag_color = vec4(vec3(result / (blur_size*2 * blur_size*2)), 1.0); } - frag_color = vec4(vec3(result / (4.0 * 4.0)), 1.0); } @end diff --git a/trueno/trueno.xcodeproj/project.xcworkspace/xcuserdata/tuomas.katajisto.xcuserdatad/UserInterfaceState.xcuserstate b/trueno/trueno.xcodeproj/project.xcworkspace/xcuserdata/tuomas.katajisto.xcuserdatad/UserInterfaceState.xcuserstate index a1fe4b1d9b2496f9e6df3ccb22f25df236cea76b..cea6e6546c87b92b13b7f647b10391aecc7eeaf2 100644 GIT binary patch delta 17312 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 IKAV;Q4^I;YSpWb4 delta 17940 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 L^%V5|?y&iP!5jFE