From e90a4495e714c30bd608383916c72f6b442cc299 Mon Sep 17 00:00:00 2001 From: katajisto Date: Mon, 21 Jul 2025 22:47:31 +0300 Subject: [PATCH] Work --- build.sh | 2 +- resources/lut.png | Bin 0 -> 35823 bytes src/arbtri.jai | 19 +- src/editor/iprof.jai | 2 + src/editor/trile_editor.jai | 10 +- src/load.jai | 6 +- src/main.jai | 4 +- src/shaders/jai/shader_trixel.jai | 1194 ++++++++++++++++++++++++----- src/shaders/shader_trixel.glsl | 102 ++- src/trile.jai | 2 +- src/world.jai | 26 +- 11 files changed, 1131 insertions(+), 236 deletions(-) create mode 100644 resources/lut.png diff --git a/build.sh b/build.sh index e23d233..3c2663e 100755 --- a/build.sh +++ b/build.sh @@ -4,5 +4,5 @@ cd src/shaders/ ./compile_shaders.sh cd .. cd .. -jai-linux -x64 first.jai +jai -x64 first.jai ./first diff --git a/resources/lut.png b/resources/lut.png new file mode 100644 index 0000000000000000000000000000000000000000..56c98467505ceb3869d1d3b263aaa8a61346cc29 GIT binary patch literal 35823 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 P00000NkvXXu0mjfgP-`N literal 0 HcmV?d00001 diff --git a/src/arbtri.jai b/src/arbtri.jai index cb35cfd..ac4486e 100644 --- a/src/arbtri.jai +++ b/src/arbtri.jai @@ -61,21 +61,22 @@ arb_tri_add :: (tri: Arb_Tri) { array_add(*arbTriState.trilist, tri); } +transform_to_screen_x :: (coord: float) -> float { + w, h := get_window_size(); + return (coord / cast(float) w) * 2.0 - 1.0; +} + +transform_to_screen_y :: (coord: float) -> float { + w, h := get_window_size(); + return (coord / cast(float) h) * 2.0 - 1.0; +} + arb_tri_flush :: () { if !arbTriState.active { return; } - transform_to_screen_x :: (coord: float) -> float { - w, h := get_window_size(); - return (coord / cast(float) w) * 2.0 - 1.0; - } - - transform_to_screen_y :: (coord: float) -> float { - w, h := get_window_size(); - return (coord / cast(float) h) * 2.0 - 1.0; - } arbTriState.active = false; diff --git a/src/editor/iprof.jai b/src/editor/iprof.jai index d5ab804..825d9be 100644 --- a/src/editor/iprof.jai +++ b/src/editor/iprof.jai @@ -69,6 +69,8 @@ init_profiler :: () { iprof_conf.text_width = text_width; iprof_conf.draw_rectangle = draw_rectangle_prof; iprof_conf.draw_line = draw_line; + iprof_conf.graph_begin = graph_begin; + iprof_conf.graph_end = graph_end; } draw_profiler :: () { diff --git a/src/editor/trile_editor.jai b/src/editor/trile_editor.jai index 176e26c..723be9e 100644 --- a/src/editor/trile_editor.jai +++ b/src/editor/trile_editor.jai @@ -240,7 +240,12 @@ draw_trile :: () { mvp := create_viewproj(*cam); vs_params : Vs_Params; vs_params.mvp = mvp.floats; + vs_params.camera = cam.position.component; + world_conf : Trixel_World_Config; + wc : *World_Config = *(World_Config.{}); + world_config_to_shader_type(wc, *world_conf); + trixels : [4096]Position_Color; min_distance : float = 999.0; @@ -272,8 +277,6 @@ draw_trile :: () { for y: 0..15 { for z: 0..15 { if current_trile.trixels[x][y][z].empty then continue; - hit := does_ray_hit_cube(ray, .{ .{x * TRIXEL_SIZE, y * TRIXEL_SIZE, z * TRIXEL_SIZE}, .{TRIXEL_SIZE, TRIXEL_SIZE, TRIXEL_SIZE}}); - trixels[trixel_count].pos.x = x * (1.0 / 16.0) + TRIXEL_SIZE_HALF; trixels[trixel_count].pos.y = y * (1.0 / 16.0) + TRIXEL_SIZE_HALF; @@ -287,7 +290,7 @@ draw_trile :: () { trixel_color = .{1.0, 0.0, 0.0}; } - trixels[trixel_count].col = .{trixel_color.x, trixel_color.y, trixel_color.z, 1.0}; + trixels[trixel_count].col = .{trixel_color.x, trixel_color.y, trixel_color.z, material_encode_to_float(current_trile.trixels[x][y][z].material)}; trixel_count += 1; } } @@ -301,6 +304,7 @@ draw_trile :: () { sg_apply_pipeline(gPipelines.trixel.pipeline); sg_apply_bindings(*gPipelines.trixel.bind); sg_apply_uniforms(UB_vs_params, *(sg_range.{ ptr = *vs_params, size = size_of(type_of(vs_params)) })); + sg_apply_uniforms(UB_trixel_world_config, *(sg_range.{ptr = *world_conf, size = size_of(type_of(world_conf))})); sg_draw(0, 36, trixel_count); } diff --git a/src/load.jai b/src/load.jai index 0a796ef..ddaadad 100644 --- a/src/load.jai +++ b/src/load.jai @@ -1,15 +1,14 @@ MAX_FILE_SIZE :: 200_000; buf : [MAX_FILE_SIZE]u8; -mandatory_done : bool = false; +mandatory_loads_left : s32 = 0; init_after_mandatory_done : bool = false; mandatory_loads_done :: () -> bool { - return mandatory_done; + return mandatory_loads_left <= 0; } init_font_loads :: () { - print("SENDING LOAD!!!!\n"); sfetch_send(*(sfetch_request_t.{ path = "./resources/DroidSerif-Regular.ttf".data, callback = fontcb, @@ -22,7 +21,6 @@ init_font_loads :: () { fontcb :: (res: *sfetch_response_t) #c_call { push_context,defer_pop default_context; - print("RDY! Finished? % Fetched? % \n", res.fetched, res.finished); state.font_default.fons_font = fonsAddFontMem(state.fons, "sans", res.data.ptr, xx res.data.size, 0); ui_init_font_fields(*state.font_default); mandatory_done = true; diff --git a/src/main.jai b/src/main.jai index deb7333..db3bbe3 100644 --- a/src/main.jai +++ b/src/main.jai @@ -1,4 +1,4 @@ -#import "Basic"; +#import "Basic"()(MEMORY_DEBUGGER=true); #import "Math"; #import "Input"; #import "Hash_Table"; @@ -131,7 +131,7 @@ frame :: () { input_per_frame_event_and_flag_update(); - memory_visualizer_per_frame_update(); + // memory_visualizer_per_frame_update(); profiler_update(); reset_temporary_storage(); diff --git a/src/shaders/jai/shader_trixel.jai b/src/shaders/jai/shader_trixel.jai index ed6b81b..da977ae 100644 --- a/src/shaders/jai/shader_trixel.jai +++ b/src/shaders/jai/shader_trixel.jai @@ -21,19 +21,47 @@ Uniform block 'vs_params': Jai struct: Vs_Params Bind slot: UB_vs_params => 0 + Uniform block 'trixel_world_config': + Jai struct: Trixel_World_Config + Bind slot: UB_trixel_world_config => 1 */ ATTR_trixel_position :: 0; ATTR_trixel_normal :: 1; ATTR_trixel_inst :: 2; ATTR_trixel_inst_col :: 3; UB_vs_params :: 0; +UB_trixel_world_config :: 1; Vs_Params :: struct { mvp: [16]float; + camera: [3]float; + _: [4]u8; +}; +Trixel_World_Config :: struct { + skyBase: [3]float; + _: [4]u8; + skyTop: [3]float; + _: [4]u8; + sunDisk: [3]float; + _: [4]u8; + horizonHalo: [3]float; + _: [4]u8; + sunHalo: [3]float; + _: [4]u8; + sunLightColor: [3]float; + _: [4]u8; + sunPosition: [3]float; + sunIntensity: float; + hasClouds: s32; + hasPlane: s32; + planeHeight: float; + planeType: s32; + time: float; + _: [12]u8; }; /* #version 430 - uniform vec4 vs_params[4]; + uniform vec4 vs_params[5]; layout(location = 2) in vec4 inst; layout(location = 0) in vec4 position; layout(location = 1) out vec4 fnormal; @@ -41,6 +69,7 @@ Vs_Params :: struct { layout(location = 0) out vec4 color; layout(location = 3) in vec4 inst_col; layout(location = 2) out vec4 pos; + layout(location = 3) out vec3 cam; void main() { @@ -48,13 +77,14 @@ Vs_Params :: struct { fnormal = normal; color = inst_col; pos = gl_Position; + cam = vs_params[4].xyz; } */ vs_trixel_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,0x76,0x73,0x5f,0x70,0x61, - 0x72,0x61,0x6d,0x73,0x5b,0x34,0x5d,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28, + 0x72,0x61,0x6d,0x73,0x5b,0x35,0x5d,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,0x69,0x6e,0x73,0x74,0x3b,0x0a,0x6c,0x61,0x79,0x6f, 0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29, @@ -70,75 +100,284 @@ vs_trixel_source_glsl430 := u8.[ 0x69,0x6f,0x6e,0x20,0x3d,0x20,0x33,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x34, 0x20,0x69,0x6e,0x73,0x74,0x5f,0x63,0x6f,0x6c,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75, 0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x32,0x29,0x20, - 0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x34,0x20,0x70,0x6f,0x73,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,0x6d, - 0x61,0x74,0x34,0x28,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x30,0x5d, - 0x2c,0x20,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x31,0x5d,0x2c,0x20, - 0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x32,0x5d,0x2c,0x20,0x76,0x73, - 0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x33,0x5d,0x29,0x20,0x2a,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,0x2e,0x78,0x79,0x7a,0x2c,0x20,0x31,0x2e,0x30,0x29, - 0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20,0x3d,0x20, - 0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x3b,0x0a,0x20,0x20,0x20,0x20,0x63,0x6f,0x6c,0x6f, - 0x72,0x20,0x3d,0x20,0x69,0x6e,0x73,0x74,0x5f,0x63,0x6f,0x6c,0x3b,0x0a,0x20,0x20, - 0x20,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x67,0x6c,0x5f,0x50,0x6f,0x73,0x69,0x74, - 0x69,0x6f,0x6e,0x3b,0x0a,0x7d,0x0a,0x0a,0x00, + 0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x34,0x20,0x70,0x6f,0x73,0x3b,0x0a,0x6c,0x61, + 0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20, + 0x33,0x29,0x20,0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x33,0x20,0x63,0x61,0x6d,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,0x6d,0x61,0x74,0x34,0x28,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73, + 0x5b,0x30,0x5d,0x2c,0x20,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x31, + 0x5d,0x2c,0x20,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x32,0x5d,0x2c, + 0x20,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x33,0x5d,0x29,0x20,0x2a, + 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,0x2e,0x78,0x79,0x7a,0x2c,0x20,0x31, + 0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6e,0x6f,0x72,0x6d,0x61,0x6c, + 0x20,0x3d,0x20,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x3b,0x0a,0x20,0x20,0x20,0x20,0x63, + 0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x69,0x6e,0x73,0x74,0x5f,0x63,0x6f,0x6c,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x67,0x6c,0x5f,0x50,0x6f, + 0x73,0x69,0x74,0x69,0x6f,0x6e,0x3b,0x0a,0x20,0x20,0x20,0x20,0x63,0x61,0x6d,0x20, + 0x3d,0x20,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x34,0x5d,0x2e,0x78, + 0x79,0x7a,0x3b,0x0a,0x7d,0x0a,0x0a,0x00, ]; /* #version 430 + struct trixel_world_config + { + vec3 skyBase; + vec3 skyTop; + vec3 sunDisk; + vec3 horizonHalo; + vec3 sunHalo; + vec3 sunLightColor; + vec3 sunPosition; + float sunIntensity; + int hasClouds; + int hasPlane; + float planeHeight; + int planeType; + float time; + }; + + uniform trixel_world_config _200; + layout(location = 0) in vec4 color; - layout(location = 2) in vec4 pos; layout(location = 1) in vec4 fnormal; + layout(location = 3) in vec3 cam; + layout(location = 2) in vec4 pos; layout(location = 0) out vec4 frag_color; + vec3 fresnelSchlick(float cosTheta, vec3 F0) + { + return F0 + ((vec3(1.0) - F0) * pow(clamp(1.0 - cosTheta, 0.0, 1.0), 5.0)); + } + + float DistributionGGX(vec3 N, vec3 H, float roughness) + { + float _36 = roughness * roughness; + float _40 = _36 * _36; + float _46 = max(dot(N, H), 0.0); + float _59 = ((_46 * _46) * (_40 - 1.0)) + 1.0; + return _40 / ((3.141285419464111328125 * _59) * _59); + } + + float GeometrySchlickGGX(float NdotV, float roughness) + { + float _72 = roughness + 1.0; + float _78 = (_72 * _72) * 0.125; + return NdotV / ((NdotV * (1.0 - _78)) + _78); + } + + float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness) + { + float param = max(dot(N, V), 0.0); + float param_1 = roughness; + float param_2 = max(dot(N, L), 0.0); + float param_3 = roughness; + return GeometrySchlickGGX(param_2, param_3) * GeometrySchlickGGX(param, param_1); + } + void main() { - frag_color = vec4(((color.xyz * 0.300000011920928955078125) + ((color.xyz * max(0.0, dot(normalize(vec3(5.0, 5.0, 2.0) - pos.xyz), fnormal.xyz))) * 0.5)) + (((color.xyz * max(0.0, dot(normalize(vec3(-5.0, -2.0, -2.0) - pos.xyz), fnormal.xyz))) * 0.300000011920928955078125) * vec3(1.0, 0.699999988079071044921875, 0.699999988079071044921875)), 1.0); + int _150 = int(round(color.w * 255.0)); + float _172 = max(float((_150 >> 5) & 7) * 0.14285714924335479736328125, 0.0500000007450580596923828125); + float _178 = float((_150 >> 3) & 3) * 0.3333333432674407958984375; + vec3 light = color.xyz * 0.300000011920928955078125; + vec3 _187 = normalize(fnormal.xyz); + vec3 _196 = normalize(cam - pos.xyz); + vec3 _205 = normalize(_200.sunPosition); + vec3 _210 = normalize(_196 + _205); + float param = max(dot(_210, _196), 0.0); + vec3 param_1 = mix(vec3(0.039999999105930328369140625), color.xyz, vec3(_178)); + vec3 _227 = fresnelSchlick(param, param_1); + vec3 param_2 = _187; + vec3 param_3 = _210; + float param_4 = _172; + vec3 param_5 = _187; + vec3 param_6 = _196; + vec3 param_7 = _205; + float param_8 = _172; + float _262 = max(dot(_187, _205), 0.0); + vec3 _294 = light; + vec3 _295 = _294 + ((((((vec3(1.0) - _227) * (1.0 - _178)) * color.xyz) * vec3(0.3183410167694091796875)) + ((_227 * (DistributionGGX(param_2, param_3, param_4) * GeometrySmith(param_5, param_6, param_7, param_8))) / vec3(((4.0 * max(dot(_187, _196), 0.0)) * _262) + 9.9999997473787516355514526367188e-05))) * _262); + light = _295; + frag_color = vec4(_295, 1.0); } */ fs_trixel_source_glsl430 := u8.[ - 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x34,0x33,0x30,0x0a,0x0a,0x6c,0x61, + 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x34,0x33,0x30,0x0a,0x0a,0x73,0x74, + 0x72,0x75,0x63,0x74,0x20,0x74,0x72,0x69,0x78,0x65,0x6c,0x5f,0x77,0x6f,0x72,0x6c, + 0x64,0x5f,0x63,0x6f,0x6e,0x66,0x69,0x67,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x76, + 0x65,0x63,0x33,0x20,0x73,0x6b,0x79,0x42,0x61,0x73,0x65,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x76,0x65,0x63,0x33,0x20,0x73,0x6b,0x79,0x54,0x6f,0x70,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x76,0x65,0x63,0x33,0x20,0x73,0x75,0x6e,0x44,0x69,0x73,0x6b,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20,0x68,0x6f,0x72,0x69,0x7a,0x6f,0x6e, + 0x48,0x61,0x6c,0x6f,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20,0x73, + 0x75,0x6e,0x48,0x61,0x6c,0x6f,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33, + 0x20,0x73,0x75,0x6e,0x4c,0x69,0x67,0x68,0x74,0x43,0x6f,0x6c,0x6f,0x72,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20,0x73,0x75,0x6e,0x50,0x6f,0x73,0x69, + 0x74,0x69,0x6f,0x6e,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20, + 0x73,0x75,0x6e,0x49,0x6e,0x74,0x65,0x6e,0x73,0x69,0x74,0x79,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x69,0x6e,0x74,0x20,0x68,0x61,0x73,0x43,0x6c,0x6f,0x75,0x64,0x73,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x68,0x61,0x73,0x50,0x6c,0x61,0x6e, + 0x65,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,0x20,0x20,0x20,0x20,0x69,0x6e, + 0x74,0x20,0x70,0x6c,0x61,0x6e,0x65,0x54,0x79,0x70,0x65,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x74,0x69,0x6d,0x65,0x3b,0x0a,0x7d,0x3b,0x0a, + 0x0a,0x75,0x6e,0x69,0x66,0x6f,0x72,0x6d,0x20,0x74,0x72,0x69,0x78,0x65,0x6c,0x5f, + 0x77,0x6f,0x72,0x6c,0x64,0x5f,0x63,0x6f,0x6e,0x66,0x69,0x67,0x20,0x5f,0x32,0x30, + 0x30,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,0x63,0x6f,0x6c,0x6f,0x72,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,0x66,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, - 0x30,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x34,0x20,0x63,0x6f,0x6c,0x6f,0x72, + 0x33,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x33,0x20,0x63,0x61,0x6d,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,0x70,0x6f,0x73, 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,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,0x69,0x6e,0x20,0x76,0x65,0x63,0x34, - 0x20,0x66,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,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,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f, - 0x72,0x20,0x3d,0x20,0x76,0x65,0x63,0x34,0x28,0x28,0x28,0x63,0x6f,0x6c,0x6f,0x72, - 0x2e,0x78,0x79,0x7a,0x20,0x2a,0x20,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,0x29,0x20,0x2b,0x20,0x28,0x28,0x63,0x6f,0x6c,0x6f,0x72,0x2e,0x78,0x79,0x7a, - 0x20,0x2a,0x20,0x6d,0x61,0x78,0x28,0x30,0x2e,0x30,0x2c,0x20,0x64,0x6f,0x74,0x28, - 0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x69,0x7a,0x65,0x28,0x76,0x65,0x63,0x33,0x28,0x35, - 0x2e,0x30,0x2c,0x20,0x35,0x2e,0x30,0x2c,0x20,0x32,0x2e,0x30,0x29,0x20,0x2d,0x20, - 0x70,0x6f,0x73,0x2e,0x78,0x79,0x7a,0x29,0x2c,0x20,0x66,0x6e,0x6f,0x72,0x6d,0x61, - 0x6c,0x2e,0x78,0x79,0x7a,0x29,0x29,0x29,0x20,0x2a,0x20,0x30,0x2e,0x35,0x29,0x29, - 0x20,0x2b,0x20,0x28,0x28,0x28,0x63,0x6f,0x6c,0x6f,0x72,0x2e,0x78,0x79,0x7a,0x20, - 0x2a,0x20,0x6d,0x61,0x78,0x28,0x30,0x2e,0x30,0x2c,0x20,0x64,0x6f,0x74,0x28,0x6e, - 0x6f,0x72,0x6d,0x61,0x6c,0x69,0x7a,0x65,0x28,0x76,0x65,0x63,0x33,0x28,0x2d,0x35, - 0x2e,0x30,0x2c,0x20,0x2d,0x32,0x2e,0x30,0x2c,0x20,0x2d,0x32,0x2e,0x30,0x29,0x20, - 0x2d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x79,0x7a,0x29,0x2c,0x20,0x66,0x6e,0x6f,0x72, - 0x6d,0x61,0x6c,0x2e,0x78,0x79,0x7a,0x29,0x29,0x29,0x20,0x2a,0x20,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,0x29,0x20,0x2a,0x20,0x76,0x65,0x63,0x33,0x28, - 0x31,0x2e,0x30,0x2c,0x20,0x30,0x2e,0x36,0x39,0x39,0x39,0x39,0x39,0x39,0x38,0x38, - 0x30,0x37,0x39,0x30,0x37,0x31,0x30,0x34,0x34,0x39,0x32,0x31,0x38,0x37,0x35,0x2c, - 0x20,0x30,0x2e,0x36,0x39,0x39,0x39,0x39,0x39,0x39,0x38,0x38,0x30,0x37,0x39,0x30, - 0x37,0x31,0x30,0x34,0x34,0x39,0x32,0x31,0x38,0x37,0x35,0x29,0x29,0x2c,0x20,0x31, - 0x2e,0x30,0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x00, + 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,0x65,0x63, + 0x33,0x20,0x66,0x72,0x65,0x73,0x6e,0x65,0x6c,0x53,0x63,0x68,0x6c,0x69,0x63,0x6b, + 0x28,0x66,0x6c,0x6f,0x61,0x74,0x20,0x63,0x6f,0x73,0x54,0x68,0x65,0x74,0x61,0x2c, + 0x20,0x76,0x65,0x63,0x33,0x20,0x46,0x30,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20, + 0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x46,0x30,0x20,0x2b,0x20,0x28,0x28,0x76,0x65, + 0x63,0x33,0x28,0x31,0x2e,0x30,0x29,0x20,0x2d,0x20,0x46,0x30,0x29,0x20,0x2a,0x20, + 0x70,0x6f,0x77,0x28,0x63,0x6c,0x61,0x6d,0x70,0x28,0x31,0x2e,0x30,0x20,0x2d,0x20, + 0x63,0x6f,0x73,0x54,0x68,0x65,0x74,0x61,0x2c,0x20,0x30,0x2e,0x30,0x2c,0x20,0x31, + 0x2e,0x30,0x29,0x2c,0x20,0x35,0x2e,0x30,0x29,0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x66, + 0x6c,0x6f,0x61,0x74,0x20,0x44,0x69,0x73,0x74,0x72,0x69,0x62,0x75,0x74,0x69,0x6f, + 0x6e,0x47,0x47,0x58,0x28,0x76,0x65,0x63,0x33,0x20,0x4e,0x2c,0x20,0x76,0x65,0x63, + 0x33,0x20,0x48,0x2c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x72,0x6f,0x75,0x67,0x68, + 0x6e,0x65,0x73,0x73,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61, + 0x74,0x20,0x5f,0x33,0x36,0x20,0x3d,0x20,0x72,0x6f,0x75,0x67,0x68,0x6e,0x65,0x73, + 0x73,0x20,0x2a,0x20,0x72,0x6f,0x75,0x67,0x68,0x6e,0x65,0x73,0x73,0x3b,0x0a,0x20, + 0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x34,0x30,0x20,0x3d,0x20,0x5f, + 0x33,0x36,0x20,0x2a,0x20,0x5f,0x33,0x36,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c, + 0x6f,0x61,0x74,0x20,0x5f,0x34,0x36,0x20,0x3d,0x20,0x6d,0x61,0x78,0x28,0x64,0x6f, + 0x74,0x28,0x4e,0x2c,0x20,0x48,0x29,0x2c,0x20,0x30,0x2e,0x30,0x29,0x3b,0x0a,0x20, + 0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x35,0x39,0x20,0x3d,0x20,0x28, + 0x28,0x5f,0x34,0x36,0x20,0x2a,0x20,0x5f,0x34,0x36,0x29,0x20,0x2a,0x20,0x28,0x5f, + 0x34,0x30,0x20,0x2d,0x20,0x31,0x2e,0x30,0x29,0x29,0x20,0x2b,0x20,0x31,0x2e,0x30, + 0x3b,0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x5f,0x34,0x30, + 0x20,0x2f,0x20,0x28,0x28,0x33,0x2e,0x31,0x34,0x31,0x32,0x38,0x35,0x34,0x31,0x39, + 0x34,0x36,0x34,0x31,0x31,0x31,0x33,0x32,0x38,0x31,0x32,0x35,0x20,0x2a,0x20,0x5f, + 0x35,0x39,0x29,0x20,0x2a,0x20,0x5f,0x35,0x39,0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x66, + 0x6c,0x6f,0x61,0x74,0x20,0x47,0x65,0x6f,0x6d,0x65,0x74,0x72,0x79,0x53,0x63,0x68, + 0x6c,0x69,0x63,0x6b,0x47,0x47,0x58,0x28,0x66,0x6c,0x6f,0x61,0x74,0x20,0x4e,0x64, + 0x6f,0x74,0x56,0x2c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x72,0x6f,0x75,0x67,0x68, + 0x6e,0x65,0x73,0x73,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61, + 0x74,0x20,0x5f,0x37,0x32,0x20,0x3d,0x20,0x72,0x6f,0x75,0x67,0x68,0x6e,0x65,0x73, + 0x73,0x20,0x2b,0x20,0x31,0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f, + 0x61,0x74,0x20,0x5f,0x37,0x38,0x20,0x3d,0x20,0x28,0x5f,0x37,0x32,0x20,0x2a,0x20, + 0x5f,0x37,0x32,0x29,0x20,0x2a,0x20,0x30,0x2e,0x31,0x32,0x35,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x4e,0x64,0x6f,0x74,0x56,0x20,0x2f, + 0x20,0x28,0x28,0x4e,0x64,0x6f,0x74,0x56,0x20,0x2a,0x20,0x28,0x31,0x2e,0x30,0x20, + 0x2d,0x20,0x5f,0x37,0x38,0x29,0x29,0x20,0x2b,0x20,0x5f,0x37,0x38,0x29,0x3b,0x0a, + 0x7d,0x0a,0x0a,0x66,0x6c,0x6f,0x61,0x74,0x20,0x47,0x65,0x6f,0x6d,0x65,0x74,0x72, + 0x79,0x53,0x6d,0x69,0x74,0x68,0x28,0x76,0x65,0x63,0x33,0x20,0x4e,0x2c,0x20,0x76, + 0x65,0x63,0x33,0x20,0x56,0x2c,0x20,0x76,0x65,0x63,0x33,0x20,0x4c,0x2c,0x20,0x66, + 0x6c,0x6f,0x61,0x74,0x20,0x72,0x6f,0x75,0x67,0x68,0x6e,0x65,0x73,0x73,0x29,0x0a, + 0x7b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61, + 0x6d,0x20,0x3d,0x20,0x6d,0x61,0x78,0x28,0x64,0x6f,0x74,0x28,0x4e,0x2c,0x20,0x56, + 0x29,0x2c,0x20,0x30,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f, + 0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x20,0x3d,0x20,0x72,0x6f,0x75, + 0x67,0x68,0x6e,0x65,0x73,0x73,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61, + 0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x32,0x20,0x3d,0x20,0x6d,0x61,0x78,0x28, + 0x64,0x6f,0x74,0x28,0x4e,0x2c,0x20,0x4c,0x29,0x2c,0x20,0x30,0x2e,0x30,0x29,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d, + 0x5f,0x33,0x20,0x3d,0x20,0x72,0x6f,0x75,0x67,0x68,0x6e,0x65,0x73,0x73,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x47,0x65,0x6f,0x6d,0x65, + 0x74,0x72,0x79,0x53,0x63,0x68,0x6c,0x69,0x63,0x6b,0x47,0x47,0x58,0x28,0x70,0x61, + 0x72,0x61,0x6d,0x5f,0x32,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x33,0x29,0x20, + 0x2a,0x20,0x47,0x65,0x6f,0x6d,0x65,0x74,0x72,0x79,0x53,0x63,0x68,0x6c,0x69,0x63, + 0x6b,0x47,0x47,0x58,0x28,0x70,0x61,0x72,0x61,0x6d,0x2c,0x20,0x70,0x61,0x72,0x61, + 0x6d,0x5f,0x31,0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x76,0x6f,0x69,0x64,0x20,0x6d,0x61, + 0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x5f, + 0x31,0x35,0x30,0x20,0x3d,0x20,0x69,0x6e,0x74,0x28,0x72,0x6f,0x75,0x6e,0x64,0x28, + 0x63,0x6f,0x6c,0x6f,0x72,0x2e,0x77,0x20,0x2a,0x20,0x32,0x35,0x35,0x2e,0x30,0x29, + 0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x31,0x37, + 0x32,0x20,0x3d,0x20,0x6d,0x61,0x78,0x28,0x66,0x6c,0x6f,0x61,0x74,0x28,0x28,0x5f, + 0x31,0x35,0x30,0x20,0x3e,0x3e,0x20,0x35,0x29,0x20,0x26,0x20,0x37,0x29,0x20,0x2a, + 0x20,0x30,0x2e,0x31,0x34,0x32,0x38,0x35,0x37,0x31,0x34,0x39,0x32,0x34,0x33,0x33, + 0x35,0x34,0x37,0x39,0x37,0x33,0x36,0x33,0x32,0x38,0x31,0x32,0x35,0x2c,0x20,0x30, + 0x2e,0x30,0x35,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x37,0x34,0x35,0x30,0x35,0x38, + 0x30,0x35,0x39,0x36,0x39,0x32,0x33,0x38,0x32,0x38,0x31,0x32,0x35,0x29,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x31,0x37,0x38,0x20,0x3d, + 0x20,0x66,0x6c,0x6f,0x61,0x74,0x28,0x28,0x5f,0x31,0x35,0x30,0x20,0x3e,0x3e,0x20, + 0x33,0x29,0x20,0x26,0x20,0x33,0x29,0x20,0x2a,0x20,0x30,0x2e,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x34,0x33,0x32,0x36,0x37,0x34,0x34,0x30,0x37,0x39,0x35,0x38,0x39, + 0x38,0x34,0x33,0x37,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20, + 0x6c,0x69,0x67,0x68,0x74,0x20,0x3d,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x2e,0x78,0x79, + 0x7a,0x20,0x2a,0x20,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,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20,0x5f,0x31,0x38,0x37,0x20,0x3d,0x20, + 0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x69,0x7a,0x65,0x28,0x66,0x6e,0x6f,0x72,0x6d,0x61, + 0x6c,0x2e,0x78,0x79,0x7a,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33, + 0x20,0x5f,0x31,0x39,0x36,0x20,0x3d,0x20,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x69,0x7a, + 0x65,0x28,0x63,0x61,0x6d,0x20,0x2d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x79,0x7a,0x29, + 0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20,0x5f,0x32,0x30,0x35,0x20, + 0x3d,0x20,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x69,0x7a,0x65,0x28,0x5f,0x32,0x30,0x30, + 0x2e,0x73,0x75,0x6e,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x29,0x3b,0x0a,0x20, + 0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20,0x5f,0x32,0x31,0x30,0x20,0x3d,0x20,0x6e, + 0x6f,0x72,0x6d,0x61,0x6c,0x69,0x7a,0x65,0x28,0x5f,0x31,0x39,0x36,0x20,0x2b,0x20, + 0x5f,0x32,0x30,0x35,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74, + 0x20,0x70,0x61,0x72,0x61,0x6d,0x20,0x3d,0x20,0x6d,0x61,0x78,0x28,0x64,0x6f,0x74, + 0x28,0x5f,0x32,0x31,0x30,0x2c,0x20,0x5f,0x31,0x39,0x36,0x29,0x2c,0x20,0x30,0x2e, + 0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20,0x70,0x61,0x72, + 0x61,0x6d,0x5f,0x31,0x20,0x3d,0x20,0x6d,0x69,0x78,0x28,0x76,0x65,0x63,0x33,0x28, + 0x30,0x2e,0x30,0x33,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x31,0x30,0x35,0x39,0x33, + 0x30,0x33,0x32,0x38,0x33,0x36,0x39,0x31,0x34,0x30,0x36,0x32,0x35,0x29,0x2c,0x20, + 0x63,0x6f,0x6c,0x6f,0x72,0x2e,0x78,0x79,0x7a,0x2c,0x20,0x76,0x65,0x63,0x33,0x28, + 0x5f,0x31,0x37,0x38,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33, + 0x20,0x5f,0x32,0x32,0x37,0x20,0x3d,0x20,0x66,0x72,0x65,0x73,0x6e,0x65,0x6c,0x53, + 0x63,0x68,0x6c,0x69,0x63,0x6b,0x28,0x70,0x61,0x72,0x61,0x6d,0x2c,0x20,0x70,0x61, + 0x72,0x61,0x6d,0x5f,0x31,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33, + 0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x32,0x20,0x3d,0x20,0x5f,0x31,0x38,0x37,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f, + 0x33,0x20,0x3d,0x20,0x5f,0x32,0x31,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c, + 0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x34,0x20,0x3d,0x20,0x5f,0x31, + 0x37,0x32,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20,0x70,0x61,0x72, + 0x61,0x6d,0x5f,0x35,0x20,0x3d,0x20,0x5f,0x31,0x38,0x37,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x76,0x65,0x63,0x33,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x36,0x20,0x3d,0x20, + 0x5f,0x31,0x39,0x36,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20,0x70, + 0x61,0x72,0x61,0x6d,0x5f,0x37,0x20,0x3d,0x20,0x5f,0x32,0x30,0x35,0x3b,0x0a,0x20, + 0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x38, + 0x20,0x3d,0x20,0x5f,0x31,0x37,0x32,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f, + 0x61,0x74,0x20,0x5f,0x32,0x36,0x32,0x20,0x3d,0x20,0x6d,0x61,0x78,0x28,0x64,0x6f, + 0x74,0x28,0x5f,0x31,0x38,0x37,0x2c,0x20,0x5f,0x32,0x30,0x35,0x29,0x2c,0x20,0x30, + 0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20,0x5f,0x32, + 0x39,0x34,0x20,0x3d,0x20,0x6c,0x69,0x67,0x68,0x74,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x76,0x65,0x63,0x33,0x20,0x5f,0x32,0x39,0x35,0x20,0x3d,0x20,0x5f,0x32,0x39,0x34, + 0x20,0x2b,0x20,0x28,0x28,0x28,0x28,0x28,0x28,0x76,0x65,0x63,0x33,0x28,0x31,0x2e, + 0x30,0x29,0x20,0x2d,0x20,0x5f,0x32,0x32,0x37,0x29,0x20,0x2a,0x20,0x28,0x31,0x2e, + 0x30,0x20,0x2d,0x20,0x5f,0x31,0x37,0x38,0x29,0x29,0x20,0x2a,0x20,0x63,0x6f,0x6c, + 0x6f,0x72,0x2e,0x78,0x79,0x7a,0x29,0x20,0x2a,0x20,0x76,0x65,0x63,0x33,0x28,0x30, + 0x2e,0x33,0x31,0x38,0x33,0x34,0x31,0x30,0x31,0x36,0x37,0x36,0x39,0x34,0x30,0x39, + 0x31,0x37,0x39,0x36,0x38,0x37,0x35,0x29,0x29,0x20,0x2b,0x20,0x28,0x28,0x5f,0x32, + 0x32,0x37,0x20,0x2a,0x20,0x28,0x44,0x69,0x73,0x74,0x72,0x69,0x62,0x75,0x74,0x69, + 0x6f,0x6e,0x47,0x47,0x58,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x32,0x2c,0x20,0x70, + 0x61,0x72,0x61,0x6d,0x5f,0x33,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x34,0x29, + 0x20,0x2a,0x20,0x47,0x65,0x6f,0x6d,0x65,0x74,0x72,0x79,0x53,0x6d,0x69,0x74,0x68, + 0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x35,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f, + 0x36,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x37,0x2c,0x20,0x70,0x61,0x72,0x61, + 0x6d,0x5f,0x38,0x29,0x29,0x29,0x20,0x2f,0x20,0x76,0x65,0x63,0x33,0x28,0x28,0x28, + 0x34,0x2e,0x30,0x20,0x2a,0x20,0x6d,0x61,0x78,0x28,0x64,0x6f,0x74,0x28,0x5f,0x31, + 0x38,0x37,0x2c,0x20,0x5f,0x31,0x39,0x36,0x29,0x2c,0x20,0x30,0x2e,0x30,0x29,0x29, + 0x20,0x2a,0x20,0x5f,0x32,0x36,0x32,0x29,0x20,0x2b,0x20,0x39,0x2e,0x39,0x39,0x39, + 0x39,0x39,0x39,0x37,0x34,0x37,0x33,0x37,0x38,0x37,0x35,0x31,0x36,0x33,0x35,0x35, + 0x35,0x31,0x34,0x35,0x32,0x36,0x33,0x36,0x37,0x31,0x38,0x38,0x65,0x2d,0x30,0x35, + 0x29,0x29,0x29,0x20,0x2a,0x20,0x5f,0x32,0x36,0x32,0x29,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x6c,0x69,0x67,0x68,0x74,0x20,0x3d,0x20,0x5f,0x32,0x39,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,0x32,0x39,0x35,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b, + 0x0a,0x7d,0x0a,0x0a,0x00, ]; /* #version 300 es - uniform vec4 vs_params[4]; + uniform vec4 vs_params[5]; layout(location = 2) in vec4 inst; layout(location = 0) in vec4 position; out vec4 fnormal; @@ -146,6 +385,7 @@ fs_trixel_source_glsl430 := u8.[ out vec4 color; layout(location = 3) in vec4 inst_col; out vec4 pos; + out vec3 cam; void main() { @@ -153,13 +393,14 @@ fs_trixel_source_glsl430 := u8.[ fnormal = normal; color = inst_col; pos = gl_Position; + cam = vs_params[4].xyz; } */ vs_trixel_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,0x76,0x73, - 0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x34,0x5d,0x3b,0x0a,0x6c,0x61,0x79,0x6f, + 0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x35,0x5d,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,0x69,0x6e,0x73,0x74,0x3b,0x0a,0x6c, 0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d, @@ -172,33 +413,108 @@ vs_trixel_source_glsl300es := u8.[ 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,0x5f,0x63, 0x6f,0x6c,0x3b,0x0a,0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x34,0x20,0x70,0x6f,0x73, - 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,0x6d,0x61,0x74,0x34,0x28,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d, - 0x73,0x5b,0x30,0x5d,0x2c,0x20,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b, - 0x31,0x5d,0x2c,0x20,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x32,0x5d, - 0x2c,0x20,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x33,0x5d,0x29,0x20, - 0x2a,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,0x2e,0x78,0x79,0x7a,0x2c,0x20, - 0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6e,0x6f,0x72,0x6d,0x61, - 0x6c,0x20,0x3d,0x20,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x3b,0x0a,0x20,0x20,0x20,0x20, - 0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x69,0x6e,0x73,0x74,0x5f,0x63,0x6f,0x6c, - 0x3b,0x0a,0x20,0x20,0x20,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x67,0x6c,0x5f,0x50, - 0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3b,0x0a,0x7d,0x0a,0x0a,0x00, + 0x3b,0x0a,0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x33,0x20,0x63,0x61,0x6d,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,0x6d,0x61,0x74,0x34,0x28,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b, + 0x30,0x5d,0x2c,0x20,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x31,0x5d, + 0x2c,0x20,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x32,0x5d,0x2c,0x20, + 0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x33,0x5d,0x29,0x20,0x2a,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,0x2e,0x78,0x79,0x7a,0x2c,0x20,0x31,0x2e, + 0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20, + 0x3d,0x20,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x3b,0x0a,0x20,0x20,0x20,0x20,0x63,0x6f, + 0x6c,0x6f,0x72,0x20,0x3d,0x20,0x69,0x6e,0x73,0x74,0x5f,0x63,0x6f,0x6c,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x67,0x6c,0x5f,0x50,0x6f,0x73, + 0x69,0x74,0x69,0x6f,0x6e,0x3b,0x0a,0x20,0x20,0x20,0x20,0x63,0x61,0x6d,0x20,0x3d, + 0x20,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x34,0x5d,0x2e,0x78,0x79, + 0x7a,0x3b,0x0a,0x7d,0x0a,0x0a,0x00, ]; /* #version 300 es precision mediump float; precision highp int; + struct trixel_world_config + { + highp vec3 skyBase; + highp vec3 skyTop; + highp vec3 sunDisk; + highp vec3 horizonHalo; + highp vec3 sunHalo; + highp vec3 sunLightColor; + highp vec3 sunPosition; + highp float sunIntensity; + int hasClouds; + int hasPlane; + highp float planeHeight; + int planeType; + highp float time; + }; + + uniform trixel_world_config _200; + in highp vec4 color; - in highp vec4 pos; in highp vec4 fnormal; + in highp vec3 cam; + in highp vec4 pos; layout(location = 0) out highp vec4 frag_color; + highp vec3 fresnelSchlick(highp float cosTheta, highp vec3 F0) + { + return F0 + ((vec3(1.0) - F0) * pow(clamp(1.0 - cosTheta, 0.0, 1.0), 5.0)); + } + + highp float DistributionGGX(highp vec3 N, highp vec3 H, highp float roughness) + { + highp float _36 = roughness * roughness; + highp float _40 = _36 * _36; + highp float _46 = max(dot(N, H), 0.0); + highp float _59 = ((_46 * _46) * (_40 - 1.0)) + 1.0; + return _40 / ((3.141285419464111328125 * _59) * _59); + } + + highp float GeometrySchlickGGX(highp float NdotV, highp float roughness) + { + highp float _72 = roughness + 1.0; + highp float _78 = (_72 * _72) * 0.125; + return NdotV / ((NdotV * (1.0 - _78)) + _78); + } + + highp float GeometrySmith(highp vec3 N, highp vec3 V, highp vec3 L, highp float roughness) + { + highp float param = max(dot(N, V), 0.0); + highp float param_1 = roughness; + highp float param_2 = max(dot(N, L), 0.0); + highp float param_3 = roughness; + return GeometrySchlickGGX(param_2, param_3) * GeometrySchlickGGX(param, param_1); + } + void main() { - frag_color = vec4(((color.xyz * 0.300000011920928955078125) + ((color.xyz * max(0.0, dot(normalize(vec3(5.0, 5.0, 2.0) - pos.xyz), fnormal.xyz))) * 0.5)) + (((color.xyz * max(0.0, dot(normalize(vec3(-5.0, -2.0, -2.0) - pos.xyz), fnormal.xyz))) * 0.300000011920928955078125) * vec3(1.0, 0.699999988079071044921875, 0.699999988079071044921875)), 1.0); + int _150 = int(round(color.w * 255.0)); + highp float _172 = max(float((_150 >> 5) & 7) * 0.14285714924335479736328125, 0.0500000007450580596923828125); + highp float _178 = float((_150 >> 3) & 3) * 0.3333333432674407958984375; + highp vec3 light = color.xyz * 0.300000011920928955078125; + highp vec3 _187 = normalize(fnormal.xyz); + highp vec3 _196 = normalize(cam - pos.xyz); + highp vec3 _205 = normalize(_200.sunPosition); + highp vec3 _210 = normalize(_196 + _205); + highp float param = max(dot(_210, _196), 0.0); + highp vec3 param_1 = mix(vec3(0.039999999105930328369140625), color.xyz, vec3(_178)); + highp vec3 _227 = fresnelSchlick(param, param_1); + highp vec3 param_2 = _187; + highp vec3 param_3 = _210; + highp float param_4 = _172; + highp vec3 param_5 = _187; + highp vec3 param_6 = _196; + highp vec3 param_7 = _205; + highp float param_8 = _172; + highp float _262 = max(dot(_187, _205), 0.0); + highp vec3 _294 = light; + highp vec3 _295 = _294 + ((((((vec3(1.0) - _227) * (1.0 - _178)) * color.xyz) * vec3(0.3183410167694091796875)) + ((_227 * (DistributionGGX(param_2, param_3, param_4) * GeometrySmith(param_5, param_6, param_7, param_8))) / vec3(((4.0 * max(dot(_187, _196), 0.0)) * _262) + 9.9999997473787516355514526367188e-05))) * _262); + light = _295; + frag_color = vec4(_295, 1.0); } */ @@ -206,38 +522,190 @@ fs_trixel_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,0x69, - 0x6e,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x34,0x20,0x63,0x6f,0x6c, - 0x6f,0x72,0x3b,0x0a,0x69,0x6e,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63, - 0x34,0x20,0x70,0x6f,0x73,0x3b,0x0a,0x69,0x6e,0x20,0x68,0x69,0x67,0x68,0x70,0x20, - 0x76,0x65,0x63,0x34,0x20,0x66,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, - 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,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x76,0x65, - 0x63,0x34,0x28,0x28,0x28,0x63,0x6f,0x6c,0x6f,0x72,0x2e,0x78,0x79,0x7a,0x20,0x2a, - 0x20,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,0x29,0x20,0x2b,0x20,0x28, - 0x28,0x63,0x6f,0x6c,0x6f,0x72,0x2e,0x78,0x79,0x7a,0x20,0x2a,0x20,0x6d,0x61,0x78, - 0x28,0x30,0x2e,0x30,0x2c,0x20,0x64,0x6f,0x74,0x28,0x6e,0x6f,0x72,0x6d,0x61,0x6c, - 0x69,0x7a,0x65,0x28,0x76,0x65,0x63,0x33,0x28,0x35,0x2e,0x30,0x2c,0x20,0x35,0x2e, - 0x30,0x2c,0x20,0x32,0x2e,0x30,0x29,0x20,0x2d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x79, - 0x7a,0x29,0x2c,0x20,0x66,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x2e,0x78,0x79,0x7a,0x29, - 0x29,0x29,0x20,0x2a,0x20,0x30,0x2e,0x35,0x29,0x29,0x20,0x2b,0x20,0x28,0x28,0x28, - 0x63,0x6f,0x6c,0x6f,0x72,0x2e,0x78,0x79,0x7a,0x20,0x2a,0x20,0x6d,0x61,0x78,0x28, - 0x30,0x2e,0x30,0x2c,0x20,0x64,0x6f,0x74,0x28,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x69, - 0x7a,0x65,0x28,0x76,0x65,0x63,0x33,0x28,0x2d,0x35,0x2e,0x30,0x2c,0x20,0x2d,0x32, - 0x2e,0x30,0x2c,0x20,0x2d,0x32,0x2e,0x30,0x29,0x20,0x2d,0x20,0x70,0x6f,0x73,0x2e, - 0x78,0x79,0x7a,0x29,0x2c,0x20,0x66,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x2e,0x78,0x79, - 0x7a,0x29,0x29,0x29,0x20,0x2a,0x20,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,0x29,0x20,0x2a,0x20,0x76,0x65,0x63,0x33,0x28,0x31,0x2e,0x30,0x2c,0x20,0x30, - 0x2e,0x36,0x39,0x39,0x39,0x39,0x39,0x39,0x38,0x38,0x30,0x37,0x39,0x30,0x37,0x31, - 0x30,0x34,0x34,0x39,0x32,0x31,0x38,0x37,0x35,0x2c,0x20,0x30,0x2e,0x36,0x39,0x39, - 0x39,0x39,0x39,0x39,0x38,0x38,0x30,0x37,0x39,0x30,0x37,0x31,0x30,0x34,0x34,0x39, - 0x32,0x31,0x38,0x37,0x35,0x29,0x29,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x7d, - 0x0a,0x0a,0x00, + 0x6f,0x6e,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x69,0x6e,0x74,0x3b,0x0a,0x0a,0x73, + 0x74,0x72,0x75,0x63,0x74,0x20,0x74,0x72,0x69,0x78,0x65,0x6c,0x5f,0x77,0x6f,0x72, + 0x6c,0x64,0x5f,0x63,0x6f,0x6e,0x66,0x69,0x67,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20, + 0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x73,0x6b,0x79,0x42,0x61, + 0x73,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65, + 0x63,0x33,0x20,0x73,0x6b,0x79,0x54,0x6f,0x70,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68, + 0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x73,0x75,0x6e,0x44,0x69,0x73, + 0x6b,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63, + 0x33,0x20,0x68,0x6f,0x72,0x69,0x7a,0x6f,0x6e,0x48,0x61,0x6c,0x6f,0x3b,0x0a,0x20, + 0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x73,0x75, + 0x6e,0x48,0x61,0x6c,0x6f,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70, + 0x20,0x76,0x65,0x63,0x33,0x20,0x73,0x75,0x6e,0x4c,0x69,0x67,0x68,0x74,0x43,0x6f, + 0x6c,0x6f,0x72,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76, + 0x65,0x63,0x33,0x20,0x73,0x75,0x6e,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74, + 0x20,0x73,0x75,0x6e,0x49,0x6e,0x74,0x65,0x6e,0x73,0x69,0x74,0x79,0x3b,0x0a,0x20, + 0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x68,0x61,0x73,0x43,0x6c,0x6f,0x75,0x64,0x73, + 0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x68,0x61,0x73,0x50,0x6c,0x61, + 0x6e,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c, + 0x6f,0x61,0x74,0x20,0x70,0x6c,0x61,0x6e,0x65,0x48,0x65,0x69,0x67,0x68,0x74,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x70,0x6c,0x61,0x6e,0x65,0x54,0x79, + 0x70,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c, + 0x6f,0x61,0x74,0x20,0x74,0x69,0x6d,0x65,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a,0x75,0x6e, + 0x69,0x66,0x6f,0x72,0x6d,0x20,0x74,0x72,0x69,0x78,0x65,0x6c,0x5f,0x77,0x6f,0x72, + 0x6c,0x64,0x5f,0x63,0x6f,0x6e,0x66,0x69,0x67,0x20,0x5f,0x32,0x30,0x30,0x3b,0x0a, + 0x0a,0x69,0x6e,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x34,0x20,0x63, + 0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x69,0x6e,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76, + 0x65,0x63,0x34,0x20,0x66,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x3b,0x0a,0x69,0x6e,0x20, + 0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x63,0x61,0x6d,0x3b,0x0a, + 0x69,0x6e,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x34,0x20,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,0x68,0x69,0x67,0x68, + 0x70,0x20,0x76,0x65,0x63,0x34,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f, + 0x72,0x3b,0x0a,0x0a,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x66, + 0x72,0x65,0x73,0x6e,0x65,0x6c,0x53,0x63,0x68,0x6c,0x69,0x63,0x6b,0x28,0x68,0x69, + 0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x63,0x6f,0x73,0x54,0x68,0x65, + 0x74,0x61,0x2c,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x46, + 0x30,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20, + 0x46,0x30,0x20,0x2b,0x20,0x28,0x28,0x76,0x65,0x63,0x33,0x28,0x31,0x2e,0x30,0x29, + 0x20,0x2d,0x20,0x46,0x30,0x29,0x20,0x2a,0x20,0x70,0x6f,0x77,0x28,0x63,0x6c,0x61, + 0x6d,0x70,0x28,0x31,0x2e,0x30,0x20,0x2d,0x20,0x63,0x6f,0x73,0x54,0x68,0x65,0x74, + 0x61,0x2c,0x20,0x30,0x2e,0x30,0x2c,0x20,0x31,0x2e,0x30,0x29,0x2c,0x20,0x35,0x2e, + 0x30,0x29,0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c, + 0x6f,0x61,0x74,0x20,0x44,0x69,0x73,0x74,0x72,0x69,0x62,0x75,0x74,0x69,0x6f,0x6e, + 0x47,0x47,0x58,0x28,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x4e, + 0x2c,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x48,0x2c,0x20, + 0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x72,0x6f,0x75,0x67, + 0x68,0x6e,0x65,0x73,0x73,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67, + 0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x33,0x36,0x20,0x3d,0x20,0x72, + 0x6f,0x75,0x67,0x68,0x6e,0x65,0x73,0x73,0x20,0x2a,0x20,0x72,0x6f,0x75,0x67,0x68, + 0x6e,0x65,0x73,0x73,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20, + 0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x34,0x30,0x20,0x3d,0x20,0x5f,0x33,0x36,0x20, + 0x2a,0x20,0x5f,0x33,0x36,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70, + 0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x34,0x36,0x20,0x3d,0x20,0x6d,0x61,0x78, + 0x28,0x64,0x6f,0x74,0x28,0x4e,0x2c,0x20,0x48,0x29,0x2c,0x20,0x30,0x2e,0x30,0x29, + 0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61, + 0x74,0x20,0x5f,0x35,0x39,0x20,0x3d,0x20,0x28,0x28,0x5f,0x34,0x36,0x20,0x2a,0x20, + 0x5f,0x34,0x36,0x29,0x20,0x2a,0x20,0x28,0x5f,0x34,0x30,0x20,0x2d,0x20,0x31,0x2e, + 0x30,0x29,0x29,0x20,0x2b,0x20,0x31,0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x72, + 0x65,0x74,0x75,0x72,0x6e,0x20,0x5f,0x34,0x30,0x20,0x2f,0x20,0x28,0x28,0x33,0x2e, + 0x31,0x34,0x31,0x32,0x38,0x35,0x34,0x31,0x39,0x34,0x36,0x34,0x31,0x31,0x31,0x33, + 0x32,0x38,0x31,0x32,0x35,0x20,0x2a,0x20,0x5f,0x35,0x39,0x29,0x20,0x2a,0x20,0x5f, + 0x35,0x39,0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c, + 0x6f,0x61,0x74,0x20,0x47,0x65,0x6f,0x6d,0x65,0x74,0x72,0x79,0x53,0x63,0x68,0x6c, + 0x69,0x63,0x6b,0x47,0x47,0x58,0x28,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f, + 0x61,0x74,0x20,0x4e,0x64,0x6f,0x74,0x56,0x2c,0x20,0x68,0x69,0x67,0x68,0x70,0x20, + 0x66,0x6c,0x6f,0x61,0x74,0x20,0x72,0x6f,0x75,0x67,0x68,0x6e,0x65,0x73,0x73,0x29, + 0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f, + 0x61,0x74,0x20,0x5f,0x37,0x32,0x20,0x3d,0x20,0x72,0x6f,0x75,0x67,0x68,0x6e,0x65, + 0x73,0x73,0x20,0x2b,0x20,0x31,0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69, + 0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x37,0x38,0x20,0x3d,0x20, + 0x28,0x5f,0x37,0x32,0x20,0x2a,0x20,0x5f,0x37,0x32,0x29,0x20,0x2a,0x20,0x30,0x2e, + 0x31,0x32,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20, + 0x4e,0x64,0x6f,0x74,0x56,0x20,0x2f,0x20,0x28,0x28,0x4e,0x64,0x6f,0x74,0x56,0x20, + 0x2a,0x20,0x28,0x31,0x2e,0x30,0x20,0x2d,0x20,0x5f,0x37,0x38,0x29,0x29,0x20,0x2b, + 0x20,0x5f,0x37,0x38,0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x68,0x69,0x67,0x68,0x70,0x20, + 0x66,0x6c,0x6f,0x61,0x74,0x20,0x47,0x65,0x6f,0x6d,0x65,0x74,0x72,0x79,0x53,0x6d, + 0x69,0x74,0x68,0x28,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x4e, + 0x2c,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x56,0x2c,0x20, + 0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x4c,0x2c,0x20,0x68,0x69, + 0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x72,0x6f,0x75,0x67,0x68,0x6e, + 0x65,0x73,0x73,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70, + 0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x20,0x3d,0x20,0x6d, + 0x61,0x78,0x28,0x64,0x6f,0x74,0x28,0x4e,0x2c,0x20,0x56,0x29,0x2c,0x20,0x30,0x2e, + 0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c, + 0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x20,0x3d,0x20,0x72,0x6f, + 0x75,0x67,0x68,0x6e,0x65,0x73,0x73,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67, + 0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x32, + 0x20,0x3d,0x20,0x6d,0x61,0x78,0x28,0x64,0x6f,0x74,0x28,0x4e,0x2c,0x20,0x4c,0x29, + 0x2c,0x20,0x30,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68, + 0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x33,0x20, + 0x3d,0x20,0x72,0x6f,0x75,0x67,0x68,0x6e,0x65,0x73,0x73,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x47,0x65,0x6f,0x6d,0x65,0x74,0x72,0x79, + 0x53,0x63,0x68,0x6c,0x69,0x63,0x6b,0x47,0x47,0x58,0x28,0x70,0x61,0x72,0x61,0x6d, + 0x5f,0x32,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x33,0x29,0x20,0x2a,0x20,0x47, + 0x65,0x6f,0x6d,0x65,0x74,0x72,0x79,0x53,0x63,0x68,0x6c,0x69,0x63,0x6b,0x47,0x47, + 0x58,0x28,0x70,0x61,0x72,0x61,0x6d,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31, + 0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x69,0x6e,0x28, + 0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x5f,0x31,0x35,0x30, + 0x20,0x3d,0x20,0x69,0x6e,0x74,0x28,0x72,0x6f,0x75,0x6e,0x64,0x28,0x63,0x6f,0x6c, + 0x6f,0x72,0x2e,0x77,0x20,0x2a,0x20,0x32,0x35,0x35,0x2e,0x30,0x29,0x29,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20, + 0x5f,0x31,0x37,0x32,0x20,0x3d,0x20,0x6d,0x61,0x78,0x28,0x66,0x6c,0x6f,0x61,0x74, + 0x28,0x28,0x5f,0x31,0x35,0x30,0x20,0x3e,0x3e,0x20,0x35,0x29,0x20,0x26,0x20,0x37, + 0x29,0x20,0x2a,0x20,0x30,0x2e,0x31,0x34,0x32,0x38,0x35,0x37,0x31,0x34,0x39,0x32, + 0x34,0x33,0x33,0x35,0x34,0x37,0x39,0x37,0x33,0x36,0x33,0x32,0x38,0x31,0x32,0x35, + 0x2c,0x20,0x30,0x2e,0x30,0x35,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x37,0x34,0x35, + 0x30,0x35,0x38,0x30,0x35,0x39,0x36,0x39,0x32,0x33,0x38,0x32,0x38,0x31,0x32,0x35, + 0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f, + 0x61,0x74,0x20,0x5f,0x31,0x37,0x38,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x28, + 0x28,0x5f,0x31,0x35,0x30,0x20,0x3e,0x3e,0x20,0x33,0x29,0x20,0x26,0x20,0x33,0x29, + 0x20,0x2a,0x20,0x30,0x2e,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x34,0x33,0x32,0x36, + 0x37,0x34,0x34,0x30,0x37,0x39,0x35,0x38,0x39,0x38,0x34,0x33,0x37,0x35,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x6c, + 0x69,0x67,0x68,0x74,0x20,0x3d,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x2e,0x78,0x79,0x7a, + 0x20,0x2a,0x20,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,0x3b,0x0a,0x20, + 0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x5f,0x31, + 0x38,0x37,0x20,0x3d,0x20,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x69,0x7a,0x65,0x28,0x66, + 0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x2e,0x78,0x79,0x7a,0x29,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x5f,0x31,0x39,0x36, + 0x20,0x3d,0x20,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x69,0x7a,0x65,0x28,0x63,0x61,0x6d, + 0x20,0x2d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x79,0x7a,0x29,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x5f,0x32,0x30,0x35, + 0x20,0x3d,0x20,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x69,0x7a,0x65,0x28,0x5f,0x32,0x30, + 0x30,0x2e,0x73,0x75,0x6e,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x29,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x5f, + 0x32,0x31,0x30,0x20,0x3d,0x20,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x69,0x7a,0x65,0x28, + 0x5f,0x31,0x39,0x36,0x20,0x2b,0x20,0x5f,0x32,0x30,0x35,0x29,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61, + 0x72,0x61,0x6d,0x20,0x3d,0x20,0x6d,0x61,0x78,0x28,0x64,0x6f,0x74,0x28,0x5f,0x32, + 0x31,0x30,0x2c,0x20,0x5f,0x31,0x39,0x36,0x29,0x2c,0x20,0x30,0x2e,0x30,0x29,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20, + 0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x20,0x3d,0x20,0x6d,0x69,0x78,0x28,0x76,0x65, + 0x63,0x33,0x28,0x30,0x2e,0x30,0x33,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x31,0x30, + 0x35,0x39,0x33,0x30,0x33,0x32,0x38,0x33,0x36,0x39,0x31,0x34,0x30,0x36,0x32,0x35, + 0x29,0x2c,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x2e,0x78,0x79,0x7a,0x2c,0x20,0x76,0x65, + 0x63,0x33,0x28,0x5f,0x31,0x37,0x38,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68, + 0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x5f,0x32,0x32,0x37,0x20,0x3d, + 0x20,0x66,0x72,0x65,0x73,0x6e,0x65,0x6c,0x53,0x63,0x68,0x6c,0x69,0x63,0x6b,0x28, + 0x70,0x61,0x72,0x61,0x6d,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x29,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20, + 0x70,0x61,0x72,0x61,0x6d,0x5f,0x32,0x20,0x3d,0x20,0x5f,0x31,0x38,0x37,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x70, + 0x61,0x72,0x61,0x6d,0x5f,0x33,0x20,0x3d,0x20,0x5f,0x32,0x31,0x30,0x3b,0x0a,0x20, + 0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70, + 0x61,0x72,0x61,0x6d,0x5f,0x34,0x20,0x3d,0x20,0x5f,0x31,0x37,0x32,0x3b,0x0a,0x20, + 0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x70,0x61, + 0x72,0x61,0x6d,0x5f,0x35,0x20,0x3d,0x20,0x5f,0x31,0x38,0x37,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x70,0x61,0x72, + 0x61,0x6d,0x5f,0x36,0x20,0x3d,0x20,0x5f,0x31,0x39,0x36,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x70,0x61,0x72,0x61, + 0x6d,0x5f,0x37,0x20,0x3d,0x20,0x5f,0x32,0x30,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61, + 0x6d,0x5f,0x38,0x20,0x3d,0x20,0x5f,0x31,0x37,0x32,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x32,0x36,0x32, + 0x20,0x3d,0x20,0x6d,0x61,0x78,0x28,0x64,0x6f,0x74,0x28,0x5f,0x31,0x38,0x37,0x2c, + 0x20,0x5f,0x32,0x30,0x35,0x29,0x2c,0x20,0x30,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x5f,0x32,0x39, + 0x34,0x20,0x3d,0x20,0x6c,0x69,0x67,0x68,0x74,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68, + 0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x5f,0x32,0x39,0x35,0x20,0x3d, + 0x20,0x5f,0x32,0x39,0x34,0x20,0x2b,0x20,0x28,0x28,0x28,0x28,0x28,0x28,0x76,0x65, + 0x63,0x33,0x28,0x31,0x2e,0x30,0x29,0x20,0x2d,0x20,0x5f,0x32,0x32,0x37,0x29,0x20, + 0x2a,0x20,0x28,0x31,0x2e,0x30,0x20,0x2d,0x20,0x5f,0x31,0x37,0x38,0x29,0x29,0x20, + 0x2a,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x2e,0x78,0x79,0x7a,0x29,0x20,0x2a,0x20,0x76, + 0x65,0x63,0x33,0x28,0x30,0x2e,0x33,0x31,0x38,0x33,0x34,0x31,0x30,0x31,0x36,0x37, + 0x36,0x39,0x34,0x30,0x39,0x31,0x37,0x39,0x36,0x38,0x37,0x35,0x29,0x29,0x20,0x2b, + 0x20,0x28,0x28,0x5f,0x32,0x32,0x37,0x20,0x2a,0x20,0x28,0x44,0x69,0x73,0x74,0x72, + 0x69,0x62,0x75,0x74,0x69,0x6f,0x6e,0x47,0x47,0x58,0x28,0x70,0x61,0x72,0x61,0x6d, + 0x5f,0x32,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x33,0x2c,0x20,0x70,0x61,0x72, + 0x61,0x6d,0x5f,0x34,0x29,0x20,0x2a,0x20,0x47,0x65,0x6f,0x6d,0x65,0x74,0x72,0x79, + 0x53,0x6d,0x69,0x74,0x68,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x35,0x2c,0x20,0x70, + 0x61,0x72,0x61,0x6d,0x5f,0x36,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x37,0x2c, + 0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x38,0x29,0x29,0x29,0x20,0x2f,0x20,0x76,0x65, + 0x63,0x33,0x28,0x28,0x28,0x34,0x2e,0x30,0x20,0x2a,0x20,0x6d,0x61,0x78,0x28,0x64, + 0x6f,0x74,0x28,0x5f,0x31,0x38,0x37,0x2c,0x20,0x5f,0x31,0x39,0x36,0x29,0x2c,0x20, + 0x30,0x2e,0x30,0x29,0x29,0x20,0x2a,0x20,0x5f,0x32,0x36,0x32,0x29,0x20,0x2b,0x20, + 0x39,0x2e,0x39,0x39,0x39,0x39,0x39,0x39,0x37,0x34,0x37,0x33,0x37,0x38,0x37,0x35, + 0x31,0x36,0x33,0x35,0x35,0x35,0x31,0x34,0x35,0x32,0x36,0x33,0x36,0x37,0x31,0x38, + 0x38,0x65,0x2d,0x30,0x35,0x29,0x29,0x29,0x20,0x2a,0x20,0x5f,0x32,0x36,0x32,0x29, + 0x3b,0x0a,0x20,0x20,0x20,0x20,0x6c,0x69,0x67,0x68,0x74,0x20,0x3d,0x20,0x5f,0x32, + 0x39,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,0x32,0x39,0x35,0x2c,0x20, + 0x31,0x2e,0x30,0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x00, ]; /* #include @@ -248,6 +716,7 @@ fs_trixel_source_glsl300es := u8.[ struct vs_params { float4x4 mvp; + float3 camera; }; struct main0_out @@ -255,6 +724,7 @@ fs_trixel_source_glsl300es := u8.[ float4 color [[user(locn0)]]; float4 fnormal [[user(locn1)]]; float4 pos [[user(locn2)]]; + float3 cam [[user(locn3)]]; float4 gl_Position [[position]]; }; @@ -273,6 +743,7 @@ fs_trixel_source_glsl300es := u8.[ out.fnormal = in.normal; out.color = in.inst_col; out.pos = out.gl_Position; + out.cam = _26.camera; return out; } @@ -284,54 +755,78 @@ vs_trixel_source_metal_macos := u8.[ 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,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,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,0x63, - 0x6f,0x6c,0x6f,0x72,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,0x66,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,0x70,0x6f,0x73,0x20,0x5b,0x5b,0x75,0x73,0x65,0x72,0x28, - 0x6c,0x6f,0x63,0x6e,0x32,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,0x20,0x5b, - 0x5b,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x28,0x32,0x29,0x5d,0x5d,0x3b, - 0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69,0x6e,0x73,0x74, - 0x5f,0x63,0x6f,0x6c,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,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x26,0x20, - 0x5f,0x32,0x36,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,0x6f,0x75,0x74,0x2e,0x67,0x6c,0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e, - 0x20,0x3d,0x20,0x5f,0x32,0x36,0x2e,0x6d,0x76,0x70,0x20,0x2a,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,0x2e,0x78,0x79, - 0x7a,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x6f,0x75,0x74, - 0x2e,0x66,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20,0x3d,0x20,0x69,0x6e,0x2e,0x6e,0x6f, - 0x72,0x6d,0x61,0x6c,0x3b,0x0a,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x63,0x6f, - 0x6c,0x6f,0x72,0x20,0x3d,0x20,0x69,0x6e,0x2e,0x69,0x6e,0x73,0x74,0x5f,0x63,0x6f, - 0x6c,0x3b,0x0a,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x70,0x6f,0x73,0x20,0x3d, - 0x20,0x6f,0x75,0x74,0x2e,0x67,0x6c,0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e, - 0x3b,0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x6f,0x75,0x74, - 0x3b,0x0a,0x7d,0x0a,0x0a,0x00, + 0x6c,0x6f,0x61,0x74,0x34,0x78,0x34,0x20,0x6d,0x76,0x70,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x63,0x61,0x6d,0x65,0x72,0x61,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,0x63,0x6f,0x6c,0x6f,0x72,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,0x66,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,0x70,0x6f,0x73,0x20,0x5b,0x5b,0x75,0x73, + 0x65,0x72,0x28,0x6c,0x6f,0x63,0x6e,0x32,0x29,0x5d,0x5d,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x63,0x61,0x6d,0x20,0x5b,0x5b,0x75,0x73, + 0x65,0x72,0x28,0x6c,0x6f,0x63,0x6e,0x33,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,0x20,0x5b,0x5b,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x28,0x32,0x29, + 0x5d,0x5d,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69, + 0x6e,0x73,0x74,0x5f,0x63,0x6f,0x6c,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,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d, + 0x73,0x26,0x20,0x5f,0x32,0x36,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,0x6f,0x75,0x74,0x2e,0x67,0x6c,0x5f,0x50,0x6f,0x73,0x69,0x74, + 0x69,0x6f,0x6e,0x20,0x3d,0x20,0x5f,0x32,0x36,0x2e,0x6d,0x76,0x70,0x20,0x2a,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, + 0x2e,0x78,0x79,0x7a,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x6f,0x75,0x74,0x2e,0x66,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20,0x3d,0x20,0x69,0x6e, + 0x2e,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x3b,0x0a,0x20,0x20,0x20,0x20,0x6f,0x75,0x74, + 0x2e,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x69,0x6e,0x2e,0x69,0x6e,0x73,0x74, + 0x5f,0x63,0x6f,0x6c,0x3b,0x0a,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x70,0x6f, + 0x73,0x20,0x3d,0x20,0x6f,0x75,0x74,0x2e,0x67,0x6c,0x5f,0x50,0x6f,0x73,0x69,0x74, + 0x69,0x6f,0x6e,0x3b,0x0a,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x63,0x61,0x6d, + 0x20,0x3d,0x20,0x5f,0x32,0x36,0x2e,0x63,0x61,0x6d,0x65,0x72,0x61,0x3b,0x0a,0x20, + 0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x6f,0x75,0x74,0x3b,0x0a,0x7d, + 0x0a,0x0a,0x00, ]; /* + #pragma clang diagnostic ignored "-Wmissing-prototypes" + #include #include using namespace metal; + struct trixel_world_config + { + float3 skyBase; + float3 skyTop; + float3 sunDisk; + float3 horizonHalo; + float3 sunHalo; + float3 sunLightColor; + packed_float3 sunPosition; + float sunIntensity; + int hasClouds; + int hasPlane; + float planeHeight; + int planeType; + float time; + }; + struct main0_out { float4 frag_color [[color(0)]]; @@ -342,65 +837,288 @@ vs_trixel_source_metal_macos := u8.[ float4 color [[user(locn0)]]; float4 fnormal [[user(locn1)]]; float4 pos [[user(locn2)]]; + float3 cam [[user(locn3)]]; }; - fragment main0_out main0(main0_in in [[stage_in]]) + static inline __attribute__((always_inline)) + float3 fresnelSchlick(thread const float& cosTheta, thread const float3& F0) + { + return F0 + ((float3(1.0) - F0) * powr(fast::clamp(1.0 - cosTheta, 0.0, 1.0), 5.0)); + } + + static inline __attribute__((always_inline)) + float DistributionGGX(thread const float3& N, thread const float3& H, thread const float& roughness) + { + float _36 = roughness * roughness; + float _40 = _36 * _36; + float _46 = fast::max(dot(N, H), 0.0); + float _59 = ((_46 * _46) * (_40 - 1.0)) + 1.0; + return _40 / ((3.141285419464111328125 * _59) * _59); + } + + static inline __attribute__((always_inline)) + float GeometrySchlickGGX(thread const float& NdotV, thread const float& roughness) + { + float _72 = roughness + 1.0; + float _78 = (_72 * _72) * 0.125; + return NdotV / ((NdotV * (1.0 - _78)) + _78); + } + + static inline __attribute__((always_inline)) + float GeometrySmith(thread const float3& N, thread const float3& V, thread const float3& L, thread const float& roughness) + { + float param = fast::max(dot(N, V), 0.0); + float param_1 = roughness; + float param_2 = fast::max(dot(N, L), 0.0); + float param_3 = roughness; + return GeometrySchlickGGX(param_2, param_3) * GeometrySchlickGGX(param, param_1); + } + + fragment main0_out main0(main0_in in [[stage_in]], constant trixel_world_config& _200 [[buffer(0)]]) { main0_out out = {}; - out.frag_color = float4(((in.color.xyz * 0.300000011920928955078125) + ((in.color.xyz * fast::max(0.0, dot(fast::normalize(float3(5.0, 5.0, 2.0) - in.pos.xyz), in.fnormal.xyz))) * 0.5)) + (((in.color.xyz * fast::max(0.0, dot(fast::normalize(float3(-5.0, -2.0, -2.0) - in.pos.xyz), in.fnormal.xyz))) * 0.300000011920928955078125) * float3(1.0, 0.699999988079071044921875, 0.699999988079071044921875)), 1.0); + int _150 = int(round(in.color.w * 255.0)); + float _172 = fast::max(float((_150 >> 5) & 7) * 0.14285714924335479736328125, 0.0500000007450580596923828125); + float _178 = float((_150 >> 3) & 3) * 0.3333333432674407958984375; + float3 light = in.color.xyz * 0.300000011920928955078125; + float3 _187 = fast::normalize(in.fnormal.xyz); + float3 _196 = fast::normalize(in.cam - in.pos.xyz); + float3 _205 = fast::normalize(float3(_200.sunPosition)); + float3 _210 = fast::normalize(_196 + _205); + float param = fast::max(dot(_210, _196), 0.0); + float3 param_1 = mix(float3(0.039999999105930328369140625), in.color.xyz, float3(_178)); + float3 _227 = fresnelSchlick(param, param_1); + float3 param_2 = _187; + float3 param_3 = _210; + float param_4 = _172; + float3 param_5 = _187; + float3 param_6 = _196; + float3 param_7 = _205; + float param_8 = _172; + float _262 = fast::max(dot(_187, _205), 0.0); + float3 _294 = light; + float3 _295 = _294 + ((((((float3(1.0) - _227) * (1.0 - _178)) * in.color.xyz) * float3(0.3183410167694091796875)) + ((_227 * (DistributionGGX(param_2, param_3, param_4) * GeometrySmith(param_5, param_6, param_7, param_8))) / float3(((4.0 * fast::max(dot(_187, _196), 0.0)) * _262) + 9.9999997473787516355514526367188e-05))) * _262); + light = _295; + out.frag_color = float4(_295, 1.0); return out; } */ fs_trixel_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,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,0x34,0x20, - 0x63,0x6f,0x6c,0x6f,0x72,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,0x66,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,0x70,0x6f,0x73,0x20,0x5b,0x5b,0x75,0x73,0x65,0x72, - 0x28,0x6c,0x6f,0x63,0x6e,0x32,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, - 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,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d, - 0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x28,0x28,0x69,0x6e,0x2e,0x63,0x6f,0x6c, - 0x6f,0x72,0x2e,0x78,0x79,0x7a,0x20,0x2a,0x20,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,0x29,0x20,0x2b,0x20,0x28,0x28,0x69,0x6e,0x2e,0x63,0x6f,0x6c,0x6f, - 0x72,0x2e,0x78,0x79,0x7a,0x20,0x2a,0x20,0x66,0x61,0x73,0x74,0x3a,0x3a,0x6d,0x61, - 0x78,0x28,0x30,0x2e,0x30,0x2c,0x20,0x64,0x6f,0x74,0x28,0x66,0x61,0x73,0x74,0x3a, - 0x3a,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x69,0x7a,0x65,0x28,0x66,0x6c,0x6f,0x61,0x74, - 0x33,0x28,0x35,0x2e,0x30,0x2c,0x20,0x35,0x2e,0x30,0x2c,0x20,0x32,0x2e,0x30,0x29, - 0x20,0x2d,0x20,0x69,0x6e,0x2e,0x70,0x6f,0x73,0x2e,0x78,0x79,0x7a,0x29,0x2c,0x20, - 0x69,0x6e,0x2e,0x66,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x2e,0x78,0x79,0x7a,0x29,0x29, - 0x29,0x20,0x2a,0x20,0x30,0x2e,0x35,0x29,0x29,0x20,0x2b,0x20,0x28,0x28,0x28,0x69, - 0x6e,0x2e,0x63,0x6f,0x6c,0x6f,0x72,0x2e,0x78,0x79,0x7a,0x20,0x2a,0x20,0x66,0x61, - 0x73,0x74,0x3a,0x3a,0x6d,0x61,0x78,0x28,0x30,0x2e,0x30,0x2c,0x20,0x64,0x6f,0x74, - 0x28,0x66,0x61,0x73,0x74,0x3a,0x3a,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x69,0x7a,0x65, - 0x28,0x66,0x6c,0x6f,0x61,0x74,0x33,0x28,0x2d,0x35,0x2e,0x30,0x2c,0x20,0x2d,0x32, - 0x2e,0x30,0x2c,0x20,0x2d,0x32,0x2e,0x30,0x29,0x20,0x2d,0x20,0x69,0x6e,0x2e,0x70, - 0x6f,0x73,0x2e,0x78,0x79,0x7a,0x29,0x2c,0x20,0x69,0x6e,0x2e,0x66,0x6e,0x6f,0x72, - 0x6d,0x61,0x6c,0x2e,0x78,0x79,0x7a,0x29,0x29,0x29,0x20,0x2a,0x20,0x30,0x2e,0x33, + 0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x63,0x6c,0x61,0x6e,0x67,0x20,0x64,0x69, + 0x61,0x67,0x6e,0x6f,0x73,0x74,0x69,0x63,0x20,0x69,0x67,0x6e,0x6f,0x72,0x65,0x64, + 0x20,0x22,0x2d,0x57,0x6d,0x69,0x73,0x73,0x69,0x6e,0x67,0x2d,0x70,0x72,0x6f,0x74, + 0x6f,0x74,0x79,0x70,0x65,0x73,0x22,0x0a,0x0a,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,0x74,0x72,0x69,0x78,0x65,0x6c,0x5f,0x77, + 0x6f,0x72,0x6c,0x64,0x5f,0x63,0x6f,0x6e,0x66,0x69,0x67,0x0a,0x7b,0x0a,0x20,0x20, + 0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x73,0x6b,0x79,0x42,0x61,0x73,0x65, + 0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x73,0x6b,0x79, + 0x54,0x6f,0x70,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20, + 0x73,0x75,0x6e,0x44,0x69,0x73,0x6b,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f, + 0x61,0x74,0x33,0x20,0x68,0x6f,0x72,0x69,0x7a,0x6f,0x6e,0x48,0x61,0x6c,0x6f,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x73,0x75,0x6e,0x48, + 0x61,0x6c,0x6f,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20, + 0x73,0x75,0x6e,0x4c,0x69,0x67,0x68,0x74,0x43,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x20, + 0x20,0x20,0x20,0x70,0x61,0x63,0x6b,0x65,0x64,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x33, + 0x20,0x73,0x75,0x6e,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x73,0x75,0x6e,0x49,0x6e,0x74,0x65,0x6e, + 0x73,0x69,0x74,0x79,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x68,0x61, + 0x73,0x43,0x6c,0x6f,0x75,0x64,0x73,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x6e,0x74, + 0x20,0x68,0x61,0x73,0x50,0x6c,0x61,0x6e,0x65,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,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x70,0x6c,0x61,0x6e,0x65,0x54, + 0x79,0x70,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x74, + 0x69,0x6d,0x65,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,0x34, + 0x20,0x63,0x6f,0x6c,0x6f,0x72,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,0x66,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,0x70,0x6f,0x73,0x20,0x5b,0x5b,0x75,0x73,0x65, + 0x72,0x28,0x6c,0x6f,0x63,0x6e,0x32,0x29,0x5d,0x5d,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x63,0x61,0x6d,0x20,0x5b,0x5b,0x75,0x73,0x65, + 0x72,0x28,0x6c,0x6f,0x63,0x6e,0x33,0x29,0x5d,0x5d,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a, + 0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x20,0x5f,0x5f, + 0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x61,0x6c,0x77, + 0x61,0x79,0x73,0x5f,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x29,0x29,0x0a,0x66,0x6c,0x6f, + 0x61,0x74,0x33,0x20,0x66,0x72,0x65,0x73,0x6e,0x65,0x6c,0x53,0x63,0x68,0x6c,0x69, + 0x63,0x6b,0x28,0x74,0x68,0x72,0x65,0x61,0x64,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20, + 0x66,0x6c,0x6f,0x61,0x74,0x26,0x20,0x63,0x6f,0x73,0x54,0x68,0x65,0x74,0x61,0x2c, + 0x20,0x74,0x68,0x72,0x65,0x61,0x64,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c, + 0x6f,0x61,0x74,0x33,0x26,0x20,0x46,0x30,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20, + 0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x46,0x30,0x20,0x2b,0x20,0x28,0x28,0x66,0x6c, + 0x6f,0x61,0x74,0x33,0x28,0x31,0x2e,0x30,0x29,0x20,0x2d,0x20,0x46,0x30,0x29,0x20, + 0x2a,0x20,0x70,0x6f,0x77,0x72,0x28,0x66,0x61,0x73,0x74,0x3a,0x3a,0x63,0x6c,0x61, + 0x6d,0x70,0x28,0x31,0x2e,0x30,0x20,0x2d,0x20,0x63,0x6f,0x73,0x54,0x68,0x65,0x74, + 0x61,0x2c,0x20,0x30,0x2e,0x30,0x2c,0x20,0x31,0x2e,0x30,0x29,0x2c,0x20,0x35,0x2e, + 0x30,0x29,0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x69, + 0x6e,0x6c,0x69,0x6e,0x65,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74, + 0x65,0x5f,0x5f,0x28,0x28,0x61,0x6c,0x77,0x61,0x79,0x73,0x5f,0x69,0x6e,0x6c,0x69, + 0x6e,0x65,0x29,0x29,0x0a,0x66,0x6c,0x6f,0x61,0x74,0x20,0x44,0x69,0x73,0x74,0x72, + 0x69,0x62,0x75,0x74,0x69,0x6f,0x6e,0x47,0x47,0x58,0x28,0x74,0x68,0x72,0x65,0x61, + 0x64,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x26,0x20, + 0x4e,0x2c,0x20,0x74,0x68,0x72,0x65,0x61,0x64,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20, + 0x66,0x6c,0x6f,0x61,0x74,0x33,0x26,0x20,0x48,0x2c,0x20,0x74,0x68,0x72,0x65,0x61, + 0x64,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x26,0x20,0x72, + 0x6f,0x75,0x67,0x68,0x6e,0x65,0x73,0x73,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20, + 0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x33,0x36,0x20,0x3d,0x20,0x72,0x6f,0x75,0x67, + 0x68,0x6e,0x65,0x73,0x73,0x20,0x2a,0x20,0x72,0x6f,0x75,0x67,0x68,0x6e,0x65,0x73, + 0x73,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x34,0x30, + 0x20,0x3d,0x20,0x5f,0x33,0x36,0x20,0x2a,0x20,0x5f,0x33,0x36,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x34,0x36,0x20,0x3d,0x20,0x66,0x61, + 0x73,0x74,0x3a,0x3a,0x6d,0x61,0x78,0x28,0x64,0x6f,0x74,0x28,0x4e,0x2c,0x20,0x48, + 0x29,0x2c,0x20,0x30,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f, + 0x61,0x74,0x20,0x5f,0x35,0x39,0x20,0x3d,0x20,0x28,0x28,0x5f,0x34,0x36,0x20,0x2a, + 0x20,0x5f,0x34,0x36,0x29,0x20,0x2a,0x20,0x28,0x5f,0x34,0x30,0x20,0x2d,0x20,0x31, + 0x2e,0x30,0x29,0x29,0x20,0x2b,0x20,0x31,0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x5f,0x34,0x30,0x20,0x2f,0x20,0x28,0x28,0x33, + 0x2e,0x31,0x34,0x31,0x32,0x38,0x35,0x34,0x31,0x39,0x34,0x36,0x34,0x31,0x31,0x31, + 0x33,0x32,0x38,0x31,0x32,0x35,0x20,0x2a,0x20,0x5f,0x35,0x39,0x29,0x20,0x2a,0x20, + 0x5f,0x35,0x39,0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x73,0x74,0x61,0x74,0x69,0x63,0x20, + 0x69,0x6e,0x6c,0x69,0x6e,0x65,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75, + 0x74,0x65,0x5f,0x5f,0x28,0x28,0x61,0x6c,0x77,0x61,0x79,0x73,0x5f,0x69,0x6e,0x6c, + 0x69,0x6e,0x65,0x29,0x29,0x0a,0x66,0x6c,0x6f,0x61,0x74,0x20,0x47,0x65,0x6f,0x6d, + 0x65,0x74,0x72,0x79,0x53,0x63,0x68,0x6c,0x69,0x63,0x6b,0x47,0x47,0x58,0x28,0x74, + 0x68,0x72,0x65,0x61,0x64,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61, + 0x74,0x26,0x20,0x4e,0x64,0x6f,0x74,0x56,0x2c,0x20,0x74,0x68,0x72,0x65,0x61,0x64, + 0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x26,0x20,0x72,0x6f, + 0x75,0x67,0x68,0x6e,0x65,0x73,0x73,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66, + 0x6c,0x6f,0x61,0x74,0x20,0x5f,0x37,0x32,0x20,0x3d,0x20,0x72,0x6f,0x75,0x67,0x68, + 0x6e,0x65,0x73,0x73,0x20,0x2b,0x20,0x31,0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x37,0x38,0x20,0x3d,0x20,0x28,0x5f,0x37,0x32, + 0x20,0x2a,0x20,0x5f,0x37,0x32,0x29,0x20,0x2a,0x20,0x30,0x2e,0x31,0x32,0x35,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x4e,0x64,0x6f,0x74, + 0x56,0x20,0x2f,0x20,0x28,0x28,0x4e,0x64,0x6f,0x74,0x56,0x20,0x2a,0x20,0x28,0x31, + 0x2e,0x30,0x20,0x2d,0x20,0x5f,0x37,0x38,0x29,0x29,0x20,0x2b,0x20,0x5f,0x37,0x38, + 0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x69,0x6e,0x6c, + 0x69,0x6e,0x65,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f, + 0x5f,0x28,0x28,0x61,0x6c,0x77,0x61,0x79,0x73,0x5f,0x69,0x6e,0x6c,0x69,0x6e,0x65, + 0x29,0x29,0x0a,0x66,0x6c,0x6f,0x61,0x74,0x20,0x47,0x65,0x6f,0x6d,0x65,0x74,0x72, + 0x79,0x53,0x6d,0x69,0x74,0x68,0x28,0x74,0x68,0x72,0x65,0x61,0x64,0x20,0x63,0x6f, + 0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x26,0x20,0x4e,0x2c,0x20,0x74, + 0x68,0x72,0x65,0x61,0x64,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61, + 0x74,0x33,0x26,0x20,0x56,0x2c,0x20,0x74,0x68,0x72,0x65,0x61,0x64,0x20,0x63,0x6f, + 0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x26,0x20,0x4c,0x2c,0x20,0x74, + 0x68,0x72,0x65,0x61,0x64,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61, + 0x74,0x26,0x20,0x72,0x6f,0x75,0x67,0x68,0x6e,0x65,0x73,0x73,0x29,0x0a,0x7b,0x0a, + 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x20, + 0x3d,0x20,0x66,0x61,0x73,0x74,0x3a,0x3a,0x6d,0x61,0x78,0x28,0x64,0x6f,0x74,0x28, + 0x4e,0x2c,0x20,0x56,0x29,0x2c,0x20,0x30,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x20,0x3d, + 0x20,0x72,0x6f,0x75,0x67,0x68,0x6e,0x65,0x73,0x73,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x32,0x20,0x3d,0x20, + 0x66,0x61,0x73,0x74,0x3a,0x3a,0x6d,0x61,0x78,0x28,0x64,0x6f,0x74,0x28,0x4e,0x2c, + 0x20,0x4c,0x29,0x2c,0x20,0x30,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66, + 0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x33,0x20,0x3d,0x20,0x72, + 0x6f,0x75,0x67,0x68,0x6e,0x65,0x73,0x73,0x3b,0x0a,0x20,0x20,0x20,0x20,0x72,0x65, + 0x74,0x75,0x72,0x6e,0x20,0x47,0x65,0x6f,0x6d,0x65,0x74,0x72,0x79,0x53,0x63,0x68, + 0x6c,0x69,0x63,0x6b,0x47,0x47,0x58,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x32,0x2c, + 0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x33,0x29,0x20,0x2a,0x20,0x47,0x65,0x6f,0x6d, + 0x65,0x74,0x72,0x79,0x53,0x63,0x68,0x6c,0x69,0x63,0x6b,0x47,0x47,0x58,0x28,0x70, + 0x61,0x72,0x61,0x6d,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x29,0x3b,0x0a, + 0x7d,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,0x74, + 0x72,0x69,0x78,0x65,0x6c,0x5f,0x77,0x6f,0x72,0x6c,0x64,0x5f,0x63,0x6f,0x6e,0x66, + 0x69,0x67,0x26,0x20,0x5f,0x32,0x30,0x30,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,0x6e,0x74,0x20,0x5f,0x31,0x35,0x30,0x20,0x3d, + 0x20,0x69,0x6e,0x74,0x28,0x72,0x6f,0x75,0x6e,0x64,0x28,0x69,0x6e,0x2e,0x63,0x6f, + 0x6c,0x6f,0x72,0x2e,0x77,0x20,0x2a,0x20,0x32,0x35,0x35,0x2e,0x30,0x29,0x29,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x31,0x37,0x32,0x20, + 0x3d,0x20,0x66,0x61,0x73,0x74,0x3a,0x3a,0x6d,0x61,0x78,0x28,0x66,0x6c,0x6f,0x61, + 0x74,0x28,0x28,0x5f,0x31,0x35,0x30,0x20,0x3e,0x3e,0x20,0x35,0x29,0x20,0x26,0x20, + 0x37,0x29,0x20,0x2a,0x20,0x30,0x2e,0x31,0x34,0x32,0x38,0x35,0x37,0x31,0x34,0x39, + 0x32,0x34,0x33,0x33,0x35,0x34,0x37,0x39,0x37,0x33,0x36,0x33,0x32,0x38,0x31,0x32, + 0x35,0x2c,0x20,0x30,0x2e,0x30,0x35,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x37,0x34, + 0x35,0x30,0x35,0x38,0x30,0x35,0x39,0x36,0x39,0x32,0x33,0x38,0x32,0x38,0x31,0x32, + 0x35,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x31, + 0x37,0x38,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x28,0x28,0x5f,0x31,0x35,0x30, + 0x20,0x3e,0x3e,0x20,0x33,0x29,0x20,0x26,0x20,0x33,0x29,0x20,0x2a,0x20,0x30,0x2e, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x34,0x33,0x32,0x36,0x37,0x34,0x34,0x30,0x37, + 0x39,0x35,0x38,0x39,0x38,0x34,0x33,0x37,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66, + 0x6c,0x6f,0x61,0x74,0x33,0x20,0x6c,0x69,0x67,0x68,0x74,0x20,0x3d,0x20,0x69,0x6e, + 0x2e,0x63,0x6f,0x6c,0x6f,0x72,0x2e,0x78,0x79,0x7a,0x20,0x2a,0x20,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,0x29,0x20,0x2a,0x20,0x66,0x6c,0x6f,0x61,0x74, - 0x33,0x28,0x31,0x2e,0x30,0x2c,0x20,0x30,0x2e,0x36,0x39,0x39,0x39,0x39,0x39,0x39, - 0x38,0x38,0x30,0x37,0x39,0x30,0x37,0x31,0x30,0x34,0x34,0x39,0x32,0x31,0x38,0x37, - 0x35,0x2c,0x20,0x30,0x2e,0x36,0x39,0x39,0x39,0x39,0x39,0x39,0x38,0x38,0x30,0x37, - 0x39,0x30,0x37,0x31,0x30,0x34,0x34,0x39,0x32,0x31,0x38,0x37,0x35,0x29,0x29,0x2c, - 0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72, - 0x6e,0x20,0x6f,0x75,0x74,0x3b,0x0a,0x7d,0x0a,0x0a,0x00, + 0x35,0x30,0x37,0x38,0x31,0x32,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f, + 0x61,0x74,0x33,0x20,0x5f,0x31,0x38,0x37,0x20,0x3d,0x20,0x66,0x61,0x73,0x74,0x3a, + 0x3a,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x69,0x7a,0x65,0x28,0x69,0x6e,0x2e,0x66,0x6e, + 0x6f,0x72,0x6d,0x61,0x6c,0x2e,0x78,0x79,0x7a,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x5f,0x31,0x39,0x36,0x20,0x3d,0x20,0x66,0x61, + 0x73,0x74,0x3a,0x3a,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x69,0x7a,0x65,0x28,0x69,0x6e, + 0x2e,0x63,0x61,0x6d,0x20,0x2d,0x20,0x69,0x6e,0x2e,0x70,0x6f,0x73,0x2e,0x78,0x79, + 0x7a,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x5f, + 0x32,0x30,0x35,0x20,0x3d,0x20,0x66,0x61,0x73,0x74,0x3a,0x3a,0x6e,0x6f,0x72,0x6d, + 0x61,0x6c,0x69,0x7a,0x65,0x28,0x66,0x6c,0x6f,0x61,0x74,0x33,0x28,0x5f,0x32,0x30, + 0x30,0x2e,0x73,0x75,0x6e,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x29,0x29,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x5f,0x32,0x31,0x30, + 0x20,0x3d,0x20,0x66,0x61,0x73,0x74,0x3a,0x3a,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x69, + 0x7a,0x65,0x28,0x5f,0x31,0x39,0x36,0x20,0x2b,0x20,0x5f,0x32,0x30,0x35,0x29,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d, + 0x20,0x3d,0x20,0x66,0x61,0x73,0x74,0x3a,0x3a,0x6d,0x61,0x78,0x28,0x64,0x6f,0x74, + 0x28,0x5f,0x32,0x31,0x30,0x2c,0x20,0x5f,0x31,0x39,0x36,0x29,0x2c,0x20,0x30,0x2e, + 0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x70, + 0x61,0x72,0x61,0x6d,0x5f,0x31,0x20,0x3d,0x20,0x6d,0x69,0x78,0x28,0x66,0x6c,0x6f, + 0x61,0x74,0x33,0x28,0x30,0x2e,0x30,0x33,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x31, + 0x30,0x35,0x39,0x33,0x30,0x33,0x32,0x38,0x33,0x36,0x39,0x31,0x34,0x30,0x36,0x32, + 0x35,0x29,0x2c,0x20,0x69,0x6e,0x2e,0x63,0x6f,0x6c,0x6f,0x72,0x2e,0x78,0x79,0x7a, + 0x2c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x28,0x5f,0x31,0x37,0x38,0x29,0x29,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x5f,0x32,0x32,0x37, + 0x20,0x3d,0x20,0x66,0x72,0x65,0x73,0x6e,0x65,0x6c,0x53,0x63,0x68,0x6c,0x69,0x63, + 0x6b,0x28,0x70,0x61,0x72,0x61,0x6d,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31, + 0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x70,0x61, + 0x72,0x61,0x6d,0x5f,0x32,0x20,0x3d,0x20,0x5f,0x31,0x38,0x37,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x33, + 0x20,0x3d,0x20,0x5f,0x32,0x31,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f, + 0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x34,0x20,0x3d,0x20,0x5f,0x31,0x37, + 0x32,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x70,0x61, + 0x72,0x61,0x6d,0x5f,0x35,0x20,0x3d,0x20,0x5f,0x31,0x38,0x37,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x36, + 0x20,0x3d,0x20,0x5f,0x31,0x39,0x36,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f, + 0x61,0x74,0x33,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x37,0x20,0x3d,0x20,0x5f,0x32, + 0x30,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61, + 0x72,0x61,0x6d,0x5f,0x38,0x20,0x3d,0x20,0x5f,0x31,0x37,0x32,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x32,0x36,0x32,0x20,0x3d,0x20,0x66, + 0x61,0x73,0x74,0x3a,0x3a,0x6d,0x61,0x78,0x28,0x64,0x6f,0x74,0x28,0x5f,0x31,0x38, + 0x37,0x2c,0x20,0x5f,0x32,0x30,0x35,0x29,0x2c,0x20,0x30,0x2e,0x30,0x29,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x5f,0x32,0x39,0x34,0x20, + 0x3d,0x20,0x6c,0x69,0x67,0x68,0x74,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f, + 0x61,0x74,0x33,0x20,0x5f,0x32,0x39,0x35,0x20,0x3d,0x20,0x5f,0x32,0x39,0x34,0x20, + 0x2b,0x20,0x28,0x28,0x28,0x28,0x28,0x28,0x66,0x6c,0x6f,0x61,0x74,0x33,0x28,0x31, + 0x2e,0x30,0x29,0x20,0x2d,0x20,0x5f,0x32,0x32,0x37,0x29,0x20,0x2a,0x20,0x28,0x31, + 0x2e,0x30,0x20,0x2d,0x20,0x5f,0x31,0x37,0x38,0x29,0x29,0x20,0x2a,0x20,0x69,0x6e, + 0x2e,0x63,0x6f,0x6c,0x6f,0x72,0x2e,0x78,0x79,0x7a,0x29,0x20,0x2a,0x20,0x66,0x6c, + 0x6f,0x61,0x74,0x33,0x28,0x30,0x2e,0x33,0x31,0x38,0x33,0x34,0x31,0x30,0x31,0x36, + 0x37,0x36,0x39,0x34,0x30,0x39,0x31,0x37,0x39,0x36,0x38,0x37,0x35,0x29,0x29,0x20, + 0x2b,0x20,0x28,0x28,0x5f,0x32,0x32,0x37,0x20,0x2a,0x20,0x28,0x44,0x69,0x73,0x74, + 0x72,0x69,0x62,0x75,0x74,0x69,0x6f,0x6e,0x47,0x47,0x58,0x28,0x70,0x61,0x72,0x61, + 0x6d,0x5f,0x32,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x33,0x2c,0x20,0x70,0x61, + 0x72,0x61,0x6d,0x5f,0x34,0x29,0x20,0x2a,0x20,0x47,0x65,0x6f,0x6d,0x65,0x74,0x72, + 0x79,0x53,0x6d,0x69,0x74,0x68,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x35,0x2c,0x20, + 0x70,0x61,0x72,0x61,0x6d,0x5f,0x36,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x37, + 0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x38,0x29,0x29,0x29,0x20,0x2f,0x20,0x66, + 0x6c,0x6f,0x61,0x74,0x33,0x28,0x28,0x28,0x34,0x2e,0x30,0x20,0x2a,0x20,0x66,0x61, + 0x73,0x74,0x3a,0x3a,0x6d,0x61,0x78,0x28,0x64,0x6f,0x74,0x28,0x5f,0x31,0x38,0x37, + 0x2c,0x20,0x5f,0x31,0x39,0x36,0x29,0x2c,0x20,0x30,0x2e,0x30,0x29,0x29,0x20,0x2a, + 0x20,0x5f,0x32,0x36,0x32,0x29,0x20,0x2b,0x20,0x39,0x2e,0x39,0x39,0x39,0x39,0x39, + 0x39,0x37,0x34,0x37,0x33,0x37,0x38,0x37,0x35,0x31,0x36,0x33,0x35,0x35,0x35,0x31, + 0x34,0x35,0x32,0x36,0x33,0x36,0x37,0x31,0x38,0x38,0x65,0x2d,0x30,0x35,0x29,0x29, + 0x29,0x20,0x2a,0x20,0x5f,0x32,0x36,0x32,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x6c, + 0x69,0x67,0x68,0x74,0x20,0x3d,0x20,0x5f,0x32,0x39,0x35,0x3b,0x0a,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,0x32,0x39,0x35,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, ]; trixel_shader_desc :: (backend: sg_backend) -> sg_shader_desc { desc: sg_shader_desc; @@ -421,10 +1139,52 @@ trixel_shader_desc :: (backend: sg_backend) -> sg_shader_desc { desc.attrs[3].glsl_name = "inst_col"; desc.uniform_blocks[0].stage = .VERTEX; desc.uniform_blocks[0].layout = .STD140; - desc.uniform_blocks[0].size = 64; + desc.uniform_blocks[0].size = 80; desc.uniform_blocks[0].glsl_uniforms[0].type = .FLOAT4; - desc.uniform_blocks[0].glsl_uniforms[0].array_count = 4; + desc.uniform_blocks[0].glsl_uniforms[0].array_count = 5; desc.uniform_blocks[0].glsl_uniforms[0].glsl_name = "vs_params"; + desc.uniform_blocks[1].stage = .FRAGMENT; + desc.uniform_blocks[1].layout = .STD140; + desc.uniform_blocks[1].size = 144; + desc.uniform_blocks[1].glsl_uniforms[0].type = .FLOAT3; + desc.uniform_blocks[1].glsl_uniforms[0].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[0].glsl_name = "_200.skyBase"; + desc.uniform_blocks[1].glsl_uniforms[1].type = .FLOAT3; + desc.uniform_blocks[1].glsl_uniforms[1].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[1].glsl_name = "_200.skyTop"; + desc.uniform_blocks[1].glsl_uniforms[2].type = .FLOAT3; + desc.uniform_blocks[1].glsl_uniforms[2].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[2].glsl_name = "_200.sunDisk"; + desc.uniform_blocks[1].glsl_uniforms[3].type = .FLOAT3; + desc.uniform_blocks[1].glsl_uniforms[3].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[3].glsl_name = "_200.horizonHalo"; + desc.uniform_blocks[1].glsl_uniforms[4].type = .FLOAT3; + desc.uniform_blocks[1].glsl_uniforms[4].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[4].glsl_name = "_200.sunHalo"; + desc.uniform_blocks[1].glsl_uniforms[5].type = .FLOAT3; + desc.uniform_blocks[1].glsl_uniforms[5].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[5].glsl_name = "_200.sunLightColor"; + desc.uniform_blocks[1].glsl_uniforms[6].type = .FLOAT3; + desc.uniform_blocks[1].glsl_uniforms[6].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[6].glsl_name = "_200.sunPosition"; + desc.uniform_blocks[1].glsl_uniforms[7].type = .FLOAT; + desc.uniform_blocks[1].glsl_uniforms[7].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[7].glsl_name = "_200.sunIntensity"; + desc.uniform_blocks[1].glsl_uniforms[8].type = .INT; + desc.uniform_blocks[1].glsl_uniforms[8].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[8].glsl_name = "_200.hasClouds"; + desc.uniform_blocks[1].glsl_uniforms[9].type = .INT; + desc.uniform_blocks[1].glsl_uniforms[9].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[9].glsl_name = "_200.hasPlane"; + desc.uniform_blocks[1].glsl_uniforms[10].type = .FLOAT; + desc.uniform_blocks[1].glsl_uniforms[10].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[10].glsl_name = "_200.planeHeight"; + desc.uniform_blocks[1].glsl_uniforms[11].type = .INT; + desc.uniform_blocks[1].glsl_uniforms[11].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[11].glsl_name = "_200.planeType"; + desc.uniform_blocks[1].glsl_uniforms[12].type = .FLOAT; + desc.uniform_blocks[1].glsl_uniforms[12].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[12].glsl_name = "_200.time"; case .GLES3; desc.vertex_func.source = xx *vs_trixel_source_glsl300es; desc.vertex_func.entry = "main"; @@ -440,10 +1200,52 @@ trixel_shader_desc :: (backend: sg_backend) -> sg_shader_desc { desc.attrs[3].glsl_name = "inst_col"; desc.uniform_blocks[0].stage = .VERTEX; desc.uniform_blocks[0].layout = .STD140; - desc.uniform_blocks[0].size = 64; + desc.uniform_blocks[0].size = 80; desc.uniform_blocks[0].glsl_uniforms[0].type = .FLOAT4; - desc.uniform_blocks[0].glsl_uniforms[0].array_count = 4; + desc.uniform_blocks[0].glsl_uniforms[0].array_count = 5; desc.uniform_blocks[0].glsl_uniforms[0].glsl_name = "vs_params"; + desc.uniform_blocks[1].stage = .FRAGMENT; + desc.uniform_blocks[1].layout = .STD140; + desc.uniform_blocks[1].size = 144; + desc.uniform_blocks[1].glsl_uniforms[0].type = .FLOAT3; + desc.uniform_blocks[1].glsl_uniforms[0].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[0].glsl_name = "_200.skyBase"; + desc.uniform_blocks[1].glsl_uniforms[1].type = .FLOAT3; + desc.uniform_blocks[1].glsl_uniforms[1].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[1].glsl_name = "_200.skyTop"; + desc.uniform_blocks[1].glsl_uniforms[2].type = .FLOAT3; + desc.uniform_blocks[1].glsl_uniforms[2].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[2].glsl_name = "_200.sunDisk"; + desc.uniform_blocks[1].glsl_uniforms[3].type = .FLOAT3; + desc.uniform_blocks[1].glsl_uniforms[3].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[3].glsl_name = "_200.horizonHalo"; + desc.uniform_blocks[1].glsl_uniforms[4].type = .FLOAT3; + desc.uniform_blocks[1].glsl_uniforms[4].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[4].glsl_name = "_200.sunHalo"; + desc.uniform_blocks[1].glsl_uniforms[5].type = .FLOAT3; + desc.uniform_blocks[1].glsl_uniforms[5].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[5].glsl_name = "_200.sunLightColor"; + desc.uniform_blocks[1].glsl_uniforms[6].type = .FLOAT3; + desc.uniform_blocks[1].glsl_uniforms[6].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[6].glsl_name = "_200.sunPosition"; + desc.uniform_blocks[1].glsl_uniforms[7].type = .FLOAT; + desc.uniform_blocks[1].glsl_uniforms[7].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[7].glsl_name = "_200.sunIntensity"; + desc.uniform_blocks[1].glsl_uniforms[8].type = .INT; + desc.uniform_blocks[1].glsl_uniforms[8].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[8].glsl_name = "_200.hasClouds"; + desc.uniform_blocks[1].glsl_uniforms[9].type = .INT; + desc.uniform_blocks[1].glsl_uniforms[9].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[9].glsl_name = "_200.hasPlane"; + desc.uniform_blocks[1].glsl_uniforms[10].type = .FLOAT; + desc.uniform_blocks[1].glsl_uniforms[10].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[10].glsl_name = "_200.planeHeight"; + desc.uniform_blocks[1].glsl_uniforms[11].type = .INT; + desc.uniform_blocks[1].glsl_uniforms[11].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[11].glsl_name = "_200.planeType"; + desc.uniform_blocks[1].glsl_uniforms[12].type = .FLOAT; + desc.uniform_blocks[1].glsl_uniforms[12].array_count = 0; + desc.uniform_blocks[1].glsl_uniforms[12].glsl_name = "_200.time"; case .METAL_MACOS; desc.vertex_func.source = xx *vs_trixel_source_metal_macos; desc.vertex_func.entry = "main0"; @@ -455,8 +1257,12 @@ trixel_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 = 64; + desc.uniform_blocks[0].size = 80; desc.uniform_blocks[0].msl_buffer_n = 0; + desc.uniform_blocks[1].stage = .FRAGMENT; + desc.uniform_blocks[1].layout = .STD140; + desc.uniform_blocks[1].size = 144; + desc.uniform_blocks[1].msl_buffer_n = 0; } return desc; } diff --git a/src/shaders/shader_trixel.glsl b/src/shaders/shader_trixel.glsl index dc6a405..1ca85b7 100644 --- a/src/shaders/shader_trixel.glsl +++ b/src/shaders/shader_trixel.glsl @@ -7,12 +7,13 @@ in vec4 inst_col; layout(binding=0) uniform vs_params { mat4 mvp; + vec3 camera; }; - out vec4 color; out vec4 fnormal; out vec4 pos; +out vec3 cam; void main() { vec3 instancepos = inst.xyz; @@ -20,30 +21,107 @@ void main() { fnormal = normal; color = inst_col; pos = gl_Position; + cam = camera; } @end @fs fs_trixel + +layout(binding=1) uniform trixel_world_config { + vec3 skyBase; + vec3 skyTop; + vec3 sunDisk; + vec3 horizonHalo; + vec3 sunHalo; + vec3 sunLightColor; + vec3 sunPosition; + float sunIntensity; + + int hasClouds; + + int hasPlane; + float planeHeight; + int planeType; + + float time; +}; + in vec4 color; in vec4 fnormal; in vec4 pos; +in vec3 cam; out vec4 frag_color; +const float PI = 3.1412854; + + +float DistributionGGX(vec3 N, vec3 H, float roughness) { + float a = roughness*roughness; + float a2 = a*a; + float NdotH = max(dot(N, H), 0.0); + float NdotH2 = NdotH*NdotH; + float num = a2; + float denom = (NdotH2 * (a2 - 1.0) + 1.0); + denom = PI * denom * denom; + return num / denom; +} + +float GeometrySchlickGGX(float NdotV, float roughness) { + float r = (roughness + 1.0); + float k = (r*r) / 8.0; + float num = NdotV; + float denom = NdotV * (1.0 - k) + k; + return num / denom; +} + +float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness) { + float NdotV = max(dot(N, V), 0.0); + float NdotL = max(dot(N, L), 0.0); + float ggx2 = GeometrySchlickGGX(NdotV, roughness); + float ggx1 = GeometrySchlickGGX(NdotL, roughness); + return ggx1 * ggx2; +} + + +vec3 fresnelSchlick(float cosTheta, vec3 F0) { + return F0 + (1.0 - F0) * pow(clamp(1.0 - cosTheta, 0.0, 1.0), 5.0); +} void main() { - - // 2 lights. - vec3 light1 = vec3(5.0, 5.0, 2.0); - vec3 light2 = vec3(-5.0, -2.0, -2.0); - + // Get the material info. vec3 albedo = color.xyz; - vec3 light = 0.3 * albedo; + int packedMaterial = int(round(color.w*255.0)); + float emittance = float((packedMaterial >> 1) & 0x3) / 3.0; + int roughnessInt = (packedMaterial >> 5) & 0x7; + float roughness = max(float(roughnessInt) / 7.0, 0.05); + float metallic = float((packedMaterial >> 3) & 0x3) / 3.0; - vec3 light1dir = normalize(light1 - pos.xyz); - vec3 light2dir = normalize(light2 - pos.xyz); - light += max(0.0, dot(light1dir, fnormal.xyz)) * albedo * 0.5; - light += max(0.0, dot(light2dir, fnormal.xyz)) * albedo * 0.3 * vec3(1.0, 0.7, 0.7); - frag_color = vec4(light, 1.0); + // Ambient light. + vec3 light = 0.3 * albedo; + + // // Make emitting things look bright. + // if(emittance > 0.01) return vec4(albedo, 1.0); + + vec3 N = normalize(fnormal.xyz); + vec3 V = normalize(cam - pos.xyz); + vec3 L = normalize(sunPosition); + vec3 H = normalize(V + L); + + vec3 F0 = vec3(0.04); + F0 = mix(F0, albedo, metallic); + vec3 F = fresnelSchlick(max(dot(H,V), 0.0), F0); + float NDF = DistributionGGX(N, H, roughness); + float G = GeometrySmith(N, V, L, roughness); + vec3 numerator = NDF * G * F; + float denominator = 4.0 * max(dot(N, V), 0.0) * max(dot(N, L), 0.0) + 0.0001; + vec3 specular = numerator / denominator; + float NdotL = max(dot(N, L), 0.0); + vec3 kD = vec3(1.0) - F; + kD *= 1.0 - metallic; + + light += (kD * albedo / PI + specular) * NdotL * vec3(1.0, 1.0, 1.0); + + frag_color = vec4(vec3(light), 1.0); } @end diff --git a/src/trile.jai b/src/trile.jai index 9b338f8..646c6d7 100644 --- a/src/trile.jai +++ b/src/trile.jai @@ -94,7 +94,7 @@ material_to_rgba :: (mat: Material) -> (r: u8, g: u8, b: u8, a: u8) { r : u8 = cast(u8) (mat.color.x * 255.0); g : u8 = cast(u8) (mat.color.y * 255.0); b : u8 = cast(u8) (mat.color.z * 255.0); - a : u8 = material_encode_to_char(mat); // @ToDo: Do actual material value encode here. + a : u8 = material_encode_to_char(mat); return r,g,b,a; } diff --git a/src/world.jai b/src/world.jai index 347bc75..749fd74 100644 --- a/src/world.jai +++ b/src/world.jai @@ -5,23 +5,29 @@ World_Config :: struct { horizonHalo : Vector3 = .{1.0, 1.0, 1.0}; sunHalo : Vector3 = .{1.0, 1.0, 1.0}; sunLightColor : Vector3 = .{1.0, 1.0, 1.0}; - sunPosition : Vector3 = #run normalize(Vector3.{0.5, 0.5, 0.5}); + sunPosition : Vector3 = #run normalize(Vector3.{0.2, 0.3, 0.4}); sunIntensity : float = 2.0; - hasClouds : int = 1; + hasClouds : s32 = 1; - hasPlane : int = 0; + hasPlane : s32 = 0; planeHeight : float = 0.0; - planeType : int = 0; + planeType : s32 = 0; } +// Copies over all the fields of our world config into a given shader type. +// Requires that the shader type has all of the fields the world config has. world_config_to_shader_type :: (wc: *World_Config, data: *$T) { - data.skyBase = wc.skyBase.component; - data.skyTop = wc.skyTop.component; - data.sunDisk = wc.sunDisk.component; - data.horizonHalo = wc.horizonHalo.component; - data.sunHalo = wc.sunHalo.component; - data.time = cast(float) get_time(); + generate_copy_code :: () -> string { + builder : String_Builder; + ti := type_info(World_Config); + for ti.members { + if it.type == type_info(Vector3) then print_to_builder(*builder, "data.% = wc.%.component;\n", it.name, it.name); + else print_to_builder(*builder, "data.% = wc.%;\n", it.name, it.name); + } + return builder_to_string(*builder); + } + #insert #run generate_copy_code(); } IVector3 :: struct {