From d8d77b8dabb2abc3e4d01793adb0bf1386ab30a5 Mon Sep 17 00:00:00 2001 From: luboslenco Date: Wed, 12 Feb 2025 19:43:34 +0100 Subject: [PATCH] Only use envmap for lighting --- armorcore/sources/ts/const_data.ts | 11 -- armorcore/sources/ts/uniforms.ts | 48 +---- armorlab/sources/make_mesh.ts | 23 +-- armorpaint/assets/keymap_presets/blender.json | 1 - armorpaint/sources/make_mesh.ts | 23 +-- armorsculpt/sources/make_mesh.ts | 23 +-- base/assets/ltc_mag.arm | Bin 16402 -> 0 bytes base/assets/ltc_mat.arm | Bin 65568 -> 0 bytes base/assets/shader_datas.arm | Bin 23663 -> 23269 bytes base/shaders/deferred_light.frag.glsl | 168 ------------------ base/sources/camera.ts | 11 -- base/sources/keymap.ts | 1 - base/sources/strings.ts | 110 ------------ base/sources/ui_menu.ts | 40 ----- base/sources/uniforms_ext.ts | 12 -- base/sources/util_render.ts | 9 - base/sources/viewport.ts | 2 - 17 files changed, 4 insertions(+), 478 deletions(-) delete mode 100644 base/assets/ltc_mag.arm delete mode 100644 base/assets/ltc_mat.arm diff --git a/armorcore/sources/ts/const_data.ts b/armorcore/sources/ts/const_data.ts index 6d2a93e6..cac64e30 100644 --- a/armorcore/sources/ts/const_data.ts +++ b/armorcore/sources/ts/const_data.ts @@ -59,14 +59,3 @@ function const_data_create_skydome_data() { } g4_index_buffer_unlock(const_data_skydome_ib); } - -let const_data_ltc_mat_tex: image_t = null; -let const_data_ltc_mag_tex: image_t = null; -function const_data_init_ltc() { - // Real-Time Polygonal-Light Shading with Linearly Transformed Cosines - // https://eheitzresearch.wordpress.com/415-2/ - let ltc_mat: buffer_t = data_get_blob("ltc_mat.arm"); - let ltc_mag: buffer_t = data_get_blob("ltc_mag.arm"); - const_data_ltc_mat_tex = image_from_bytes(armpack_decode(ltc_mat), 64, 64, tex_format_t.RGBA128); - const_data_ltc_mag_tex = image_from_bytes(armpack_decode(ltc_mag), 64, 64, tex_format_t.R32); -} diff --git a/armorcore/sources/ts/uniforms.ts b/armorcore/sources/ts/uniforms.ts index 89c0f859..34b0b542 100644 --- a/armorcore/sources/ts/uniforms.ts +++ b/armorcore/sources/ts/uniforms.ts @@ -17,28 +17,6 @@ let uniforms_i32_links: (o: object_t, md: material_data_t, s: string)=>i32 = nul let uniforms_pos_unpack: f32 = 1.0; let uniforms_tex_unpack: f32 = 1.0; -let uniforms_light_size_x: f32 = 3.0; -let uniforms_light_size_y: f32 = 0.005; -let uniforms_light_strength: f32 = 1.0; -let uniforms_light_world: mat4_t = mat4_create( - 0.9502051472663879, - -0.19612328708171844, - 0.24216893315315247, - 0.7578424215316772, - 0.3094223141670227, - 0.6860249638557434, - -0.658504068851471, - -2.0724263191223145, - -0.03698595613241196, - 0.7006464004516602, - 0.7125493884086609, - 1.9363592863082886, - 0, - 0, - 0, - 1 -); - function uniforms_set_context_consts(context: shader_context_t, bind_params: string[]) { if (context.constants != null) { for (let i: i32 = 0; i < context.constants.length; ++i) { @@ -234,31 +212,7 @@ function uniforms_set_context_const(location: kinc_const_loc_t, c: shader_const_ else if (c.type == "vec3") { let v: vec4_t = vec4_nan(); - if (c.link == "_light_area0") { - let sx: f32 = uniforms_light_size_x * uniforms_light_strength * 0.25; - let sy: f32 = uniforms_light_size_y * uniforms_light_strength * 0.25; - v = vec4_create(-sx, sy, 0.0); - v = vec4_apply_mat(v, uniforms_light_world); - } - else if (c.link == "_light_area1") { - let sx: f32 = uniforms_light_size_x * uniforms_light_strength * 0.25; - let sy: f32 = uniforms_light_size_y * uniforms_light_strength * 0.25; - v = vec4_create(sx, sy, 0.0); - v = vec4_apply_mat(v, uniforms_light_world); - } - else if (c.link == "_light_area2") { - let sx: f32 = uniforms_light_size_x * uniforms_light_strength * 0.25; - let sy: f32 = uniforms_light_size_y * uniforms_light_strength * 0.25; - v = vec4_create(sx, -sy, 0.0); - v = vec4_apply_mat(v, uniforms_light_world); - } - else if (c.link == "_light_area3") { - let sx: f32 = uniforms_light_size_x * uniforms_light_strength * 0.25; - let sy: f32 = uniforms_light_size_y * uniforms_light_strength * 0.25; - v = vec4_create(-sx, -sy, 0.0); - v = vec4_apply_mat(v, uniforms_light_world); - } - else if (c.link == "_camera_pos") { + if (c.link == "_camera_pos") { v = vec4_create(transform_world_x(camera.base.transform), transform_world_y(camera.base.transform), transform_world_z(camera.base.transform)); } else if (c.link == "_camera_look") { diff --git a/armorlab/sources/make_mesh.ts b/armorlab/sources/make_mesh.ts index 77154585..7ccadc77 100644 --- a/armorlab/sources/make_mesh.ts +++ b/armorlab/sources/make_mesh.ts @@ -98,8 +98,6 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte if (context_raw.viewport_mode == viewport_mode_t.LIT && context_raw.render_mode == render_mode_t.FORWARD) { node_shader_add_uniform(frag, "sampler2D senvmap_brdf", "$brdf.k"); node_shader_add_uniform(frag, "sampler2D senvmap_radiance", "_envmap_radiance"); - node_shader_add_uniform(frag, "sampler2D sltc_mat", "_ltc_mat"); - node_shader_add_uniform(frag, "sampler2D sltc_mag", "_ltc_mag"); } node_shader_add_shared_sampler(frag, "sampler2D texpaint"); @@ -176,31 +174,12 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_write(frag, "float envlod = roughness * float(envmap_num_mipmaps);"); node_shader_add_function(frag, str_envmap_equirect); node_shader_write(frag, "vec3 prefiltered_color = textureLod(senvmap_radiance, envmap_equirect(wreflect, envmap_data.x), envlod).rgb;"); - node_shader_add_uniform(frag, "vec3 light_area0", "_light_area0"); - node_shader_add_uniform(frag, "vec3 light_area1", "_light_area1"); - node_shader_add_uniform(frag, "vec3 light_area2", "_light_area2"); - node_shader_add_uniform(frag, "vec3 light_area3", "_light_area3"); - node_shader_add_function(frag, str_ltc_evaluate); - node_shader_write(frag, "const float LUT_SIZE = 64.0;"); - node_shader_write(frag, "const float LUT_SCALE = (LUT_SIZE - 1.0) / LUT_SIZE;"); - node_shader_write(frag, "const float LUT_BIAS = 0.5 / LUT_SIZE;"); - node_shader_write(frag, "float theta = acos(dotnv);"); - node_shader_write(frag, "vec2 tuv = vec2(roughness, theta / (0.5 * 3.14159265));"); - node_shader_write(frag, "tuv = tuv * LUT_SCALE + LUT_BIAS;"); - node_shader_write(frag, "vec4 t = textureLod(sltc_mat, tuv, 0.0);"); - node_shader_write(frag, "mat3 minv = mat3(vec3(1.0, 0.0, t.y), vec3(0.0, t.z, 0.0), vec3(t.w, 0.0, t.x));"); - node_shader_write(frag, "float ltcspec = ltc_evaluate(n, vvec, dotnv, wposition, minv, light_area0, light_area1, light_area2, light_area3);"); - node_shader_write(frag, "ltcspec *= textureLod(sltc_mag, tuv, 0.0).a;"); - node_shader_write(frag, "mat3 mident = mat3(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0);"); - node_shader_write(frag, "float ltcdiff = ltc_evaluate(n, vvec, dotnv, wposition, mident, light_area0, light_area1, light_area2, light_area3);"); - node_shader_write(frag, "vec3 direct = albedo * ltcdiff + ltcspec * 0.05;"); - node_shader_add_uniform(frag, "vec4 shirr[7]", "_envmap_irradiance"); node_shader_add_function(frag, str_sh_irradiance()); node_shader_write(frag, "vec3 indirect = albedo * (sh_irradiance(vec3(n.x * envmap_data.z - n.y * envmap_data.y, n.x * envmap_data.y + n.y * envmap_data.z, n.z), shirr) / 3.14159265);"); node_shader_write(frag, "indirect += prefiltered_color * (f0 * env_brdf.x + env_brdf.y) * 1.5;"); node_shader_write(frag, "indirect *= envmap_data.w * occlusion;"); - node_shader_write(frag, "frag_color[1] = vec4(direct + indirect, 1.0);"); + node_shader_write(frag, "frag_color[1] = vec4(indirect, 1.0);"); } else { // Deferred, Pathtraced node_shader_write(frag, "frag_color[1] = vec4(basecol, occlusion);"); diff --git a/armorpaint/assets/keymap_presets/blender.json b/armorpaint/assets/keymap_presets/blender.json index 3b44c740..67f8e249 100644 --- a/armorpaint/assets/keymap_presets/blender.json +++ b/armorpaint/assets/keymap_presets/blender.json @@ -3,6 +3,5 @@ "action_rotate": "middle", "action_pan": "shift+middle", "action_zoom": "ctrl+middle", - "rotate_light": "shift+right", "rotate_envmap": "ctrl+right" } diff --git a/armorpaint/sources/make_mesh.ts b/armorpaint/sources/make_mesh.ts index 078a7fdd..a7af3b09 100644 --- a/armorpaint/sources/make_mesh.ts +++ b/armorpaint/sources/make_mesh.ts @@ -161,8 +161,6 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte texture_count += 4; node_shader_add_uniform(frag, "sampler2D senvmap_brdf", "$brdf.k"); node_shader_add_uniform(frag, "sampler2D senvmap_radiance", "_envmap_radiance"); - node_shader_add_uniform(frag, "sampler2D sltc_mat", "_ltc_mat"); - node_shader_add_uniform(frag, "sampler2D sltc_mag", "_ltc_mag"); } // Get layers for this pass @@ -393,31 +391,12 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_write(frag, "float envlod = roughness * float(envmap_num_mipmaps);"); node_shader_add_function(frag, str_envmap_equirect); node_shader_write(frag, "vec3 prefiltered_color = textureLod(senvmap_radiance, envmap_equirect(wreflect, envmap_data.x), envlod).rgb;"); - node_shader_add_uniform(frag, "vec3 light_area0", "_light_area0"); - node_shader_add_uniform(frag, "vec3 light_area1", "_light_area1"); - node_shader_add_uniform(frag, "vec3 light_area2", "_light_area2"); - node_shader_add_uniform(frag, "vec3 light_area3", "_light_area3"); - node_shader_add_function(frag, str_ltc_evaluate); - node_shader_write(frag, "const float LUT_SIZE = 64.0;"); - node_shader_write(frag, "const float LUT_SCALE = (LUT_SIZE - 1.0) / LUT_SIZE;"); - node_shader_write(frag, "const float LUT_BIAS = 0.5 / LUT_SIZE;"); - node_shader_write(frag, "float theta = acos(dotnv);"); - node_shader_write(frag, "vec2 tuv = vec2(roughness, theta / (0.5 * 3.14159265));"); - node_shader_write(frag, "tuv = tuv * LUT_SCALE + LUT_BIAS;"); - node_shader_write(frag, "vec4 t = textureLod(sltc_mat, tuv, 0.0);"); - node_shader_write(frag, "mat3 minv = mat3(vec3(1.0, 0.0, t.y), vec3(0.0, t.z, 0.0), vec3(t.w, 0.0, t.x));"); - node_shader_write(frag, "float ltcspec = ltc_evaluate(n, vvec, dotnv, wposition, minv, light_area0, light_area1, light_area2, light_area3);"); - node_shader_write(frag, "ltcspec *= textureLod(sltc_mag, tuv, 0.0).a;"); - node_shader_write(frag, "mat3 mident = mat3(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0);"); - node_shader_write(frag, "float ltcdiff = ltc_evaluate(n, vvec, dotnv, wposition, mident, light_area0, light_area1, light_area2, light_area3);"); - node_shader_write(frag, "vec3 direct = albedo * ltcdiff + ltcspec * 0.05;"); - node_shader_add_uniform(frag, "vec4 shirr[7]", "_envmap_irradiance"); node_shader_add_function(frag, str_sh_irradiance()); node_shader_write(frag, "vec3 indirect = albedo * (sh_irradiance(vec3(n.x * envmap_data.z - n.y * envmap_data.y, n.x * envmap_data.y + n.y * envmap_data.z, n.z), shirr) / 3.14159265);"); node_shader_write(frag, "indirect += prefiltered_color * (f0 * env_brdf.x + env_brdf.y) * 1.5;"); node_shader_write(frag, "indirect *= envmap_data.w * occlusion;"); - node_shader_write(frag, "frag_color[1] = vec4(direct + indirect, 1.0);"); + node_shader_write(frag, "frag_color[1] = vec4(indirect, 1.0);"); } else { // Deferred, Pathtraced if (make_material_emis_used) { diff --git a/armorsculpt/sources/make_mesh.ts b/armorsculpt/sources/make_mesh.ts index 20be76bd..5afaf8ee 100644 --- a/armorsculpt/sources/make_mesh.ts +++ b/armorsculpt/sources/make_mesh.ts @@ -119,8 +119,6 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte texture_count += 4; node_shader_add_uniform(frag, "sampler2D senvmap_brdf", "$brdf.k"); node_shader_add_uniform(frag, "sampler2D senvmap_radiance", "_envmap_radiance"); - node_shader_add_uniform(frag, "sampler2D sltc_mat", "_ltc_mat"); - node_shader_add_uniform(frag, "sampler2D sltc_mag", "_ltc_mag"); } // Get layers for this pass @@ -278,31 +276,12 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_write(frag, "float envlod = roughness * float(envmap_num_mipmaps);"); node_shader_add_function(frag, str_envmap_equirect); node_shader_write(frag, "vec3 prefiltered_color = textureLod(senvmap_radiance, envmap_equirect(wreflect, envmap_data.x), envlod).rgb;"); - node_shader_add_uniform(frag, "vec3 light_area0", "_light_area0"); - node_shader_add_uniform(frag, "vec3 light_area1", "_light_area1"); - node_shader_add_uniform(frag, "vec3 light_area2", "_light_area2"); - node_shader_add_uniform(frag, "vec3 light_area3", "_light_area3"); - node_shader_add_function(frag, str_ltc_evaluate); - node_shader_write(frag, "const float LUT_SIZE = 64.0;"); - node_shader_write(frag, "const float LUT_SCALE = (LUT_SIZE - 1.0) / LUT_SIZE;"); - node_shader_write(frag, "const float LUT_BIAS = 0.5 / LUT_SIZE;"); - node_shader_write(frag, "float theta = acos(dotnv);"); - node_shader_write(frag, "vec2 tuv = vec2(roughness, theta / (0.5 * 3.14159265));"); - node_shader_write(frag, "tuv = tuv * LUT_SCALE + LUT_BIAS;"); - node_shader_write(frag, "vec4 t = textureLod(sltc_mat, tuv, 0.0);"); - node_shader_write(frag, "mat3 minv = mat3(vec3(1.0, 0.0, t.y), vec3(0.0, t.z, 0.0), vec3(t.w, 0.0, t.x));"); - node_shader_write(frag, "float ltcspec = ltc_evaluate(n, vvec, dotnv, wposition, minv, light_area0, light_area1, light_area2, light_area3);"); - node_shader_write(frag, "ltcspec *= textureLod(sltc_mag, tuv, 0.0).a;"); - node_shader_write(frag, "mat3 mident = mat3(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0);"); - node_shader_write(frag, "float ltcdiff = ltc_evaluate(n, vvec, dotnv, wposition, mident, light_area0, light_area1, light_area2, light_area3);"); - node_shader_write(frag, "vec3 direct = albedo * ltcdiff + ltcspec * 0.05;"); - node_shader_add_uniform(frag, "vec4 shirr[7]", "_envmap_irradiance"); node_shader_add_function(frag, str_sh_irradiance()); node_shader_write(frag, "vec3 indirect = albedo * (sh_irradiance(vec3(n.x * envmap_data.z - n.y * envmap_data.y, n.x * envmap_data.y + n.y * envmap_data.z, n.z), shirr) / 3.14159265);"); node_shader_write(frag, "indirect += prefiltered_color * (f0 * env_brdf.x + env_brdf.y) * 1.5;"); node_shader_write(frag, "indirect *= envmap_data.w * occlusion;"); - node_shader_write(frag, "frag_color[1] = vec4(direct + indirect, 1.0);"); + node_shader_write(frag, "frag_color[1] = vec4(indirect, 1.0);"); } else { // Deferred, Pathtraced if (make_material_emis_used) { diff --git a/base/assets/ltc_mag.arm b/base/assets/ltc_mag.arm deleted file mode 100644 index d8931120b8a95f32dd883a016acf6f347e8e4e59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16402 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 diff --git a/base/assets/ltc_mat.arm b/base/assets/ltc_mat.arm deleted file mode 100644 index 8c2c1e004bc82827f81da653d9566e5fbc49624a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65568 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 diff --git a/base/shaders/deferred_light.frag.glsl b/base/shaders/deferred_light.frag.glsl index e26f7eab..038d6bc4 100644 --- a/base/shaders/deferred_light.frag.glsl +++ b/base/shaders/deferred_light.frag.glsl @@ -16,12 +16,6 @@ uniform sampler2D ssaotex; uniform vec2 camera_proj; uniform vec3 eye; uniform vec3 eye_look; -uniform vec3 light_area0; -uniform vec3 light_area1; -uniform vec3 light_area2; -uniform vec3 light_area3; -uniform sampler2D sltc_mat; -uniform sampler2D sltc_mag; #include "std/gbuffer.glsl" #include "std/brdf.glsl" @@ -32,167 +26,6 @@ in vec2 tex_coord; in vec3 view_ray; out vec4 frag_color; -const float LUT_SIZE = 64.0; -const float LUT_SCALE = (LUT_SIZE - 1.0) / LUT_SIZE; -const float LUT_BIAS = 0.5 / LUT_SIZE; - -float integrate_edge(vec3 v1, vec3 v2) { - float cos_theta = dot(v1, v2); - float theta = acos(cos_theta); - float res = cross(v1, v2).z * ((theta > 0.001) ? theta / sin(theta) : 1.0); - return res; -} - -float ltc_evaluate(vec3 N, vec3 V, float dotnv, vec3 P, mat3 Minv, vec3 points0, vec3 points1, vec3 points2, vec3 points3) { - // Construct orthonormal basis around N - vec3 T1, T2; - T1 = normalize(V - N * dotnv); - T2 = cross(N, T1); - - // Rotate area light in (T1, T2, R) basis - Minv = mul(transpose(mat3(T1, T2, N)), Minv); - - // Polygon (allocate 5 vertices for clipping) - vec3 L0 = mul((points0 - P), Minv); - vec3 L1 = mul((points1 - P), Minv); - vec3 L2 = mul((points2 - P), Minv); - vec3 L3 = mul((points3 - P), Minv); - vec3 L4 = vec3(0.0, 0.0, 0.0); - - int n = 0; - // Detect clipping config - int config = 0; - if (L0.z > 0.0) config += 1; - if (L1.z > 0.0) config += 2; - if (L2.z > 0.0) config += 4; - if (L3.z > 0.0) config += 8; - - // Clip - if (config == 0) { - // Clip all - } - else if (config == 1) { // V1 clip V2 V3 V4 - n = 3; - L1 = -L1.z * L0 + L0.z * L1; - L2 = -L3.z * L0 + L0.z * L3; - } - else if (config == 2) { // V2 clip V1 V3 V4 - n = 3; - L0 = -L0.z * L1 + L1.z * L0; - L2 = -L2.z * L1 + L1.z * L2; - } - else if (config == 3) { // V1 V2 clip V3 V4 - n = 4; - L2 = -L2.z * L1 + L1.z * L2; - L3 = -L3.z * L0 + L0.z * L3; - } - else if (config == 4) { // V3 clip V1 V2 V4 - n = 3; - L0 = -L3.z * L2 + L2.z * L3; - L1 = -L1.z * L2 + L2.z * L1; - } - else if (config == 5) { // V1 V3 clip V2 V4) impossible - n = 0; - } - else if (config == 6) { // V2 V3 clip V1 V4 - n = 4; - L0 = -L0.z * L1 + L1.z * L0; - L3 = -L3.z * L2 + L2.z * L3; - } - else if (config == 7) { // V1 V2 V3 clip V4 - n = 5; - L4 = -L3.z * L0 + L0.z * L3; - L3 = -L3.z * L2 + L2.z * L3; - } - else if (config == 8) { // V4 clip V1 V2 V3 - n = 3; - L0 = -L0.z * L3 + L3.z * L0; - L1 = -L2.z * L3 + L3.z * L2; - L2 = L3; - } - else if (config == 9) { // V1 V4 clip V2 V3 - n = 4; - L1 = -L1.z * L0 + L0.z * L1; - L2 = -L2.z * L3 + L3.z * L2; - } - else if (config == 10) { // V2 V4 clip V1 V3) impossible - n = 0; - } - else if (config == 11) { // V1 V2 V4 clip V3 - n = 5; - L4 = L3; - L3 = -L2.z * L3 + L3.z * L2; - L2 = -L2.z * L1 + L1.z * L2; - } - else if (config == 12) { // V3 V4 clip V1 V2 - n = 4; - L1 = -L1.z * L2 + L2.z * L1; - L0 = -L0.z * L3 + L3.z * L0; - } - else if (config == 13) { // V1 V3 V4 clip V2 - n = 5; - L4 = L3; - L3 = L2; - L2 = -L1.z * L2 + L2.z * L1; - L1 = -L1.z * L0 + L0.z * L1; - } - else if (config == 14) { // V2 V3 V4 clip V1 - n = 5; - L4 = -L0.z * L3 + L3.z * L0; - L0 = -L0.z * L1 + L1.z * L0; - } - else if (config == 15) { // V1 V2 V3 V4 - n = 4; - } - - if (n == 0) return 0.0; - if (n == 3) L3 = L0; - if (n == 4) L4 = L0; - - // Project onto sphere - L0 = normalize(L0); - L1 = normalize(L1); - L2 = normalize(L2); - L3 = normalize(L3); - L4 = normalize(L4); - - // Integrate - float sum = 0.0; - - sum += integrate_edge(L0, L1); - sum += integrate_edge(L1, L2); - sum += integrate_edge(L2, L3); - - if (n >= 4) sum += integrate_edge(L3, L4); - if (n == 5) sum += integrate_edge(L4, L0); - - return max(0.0, -sum); -} - -vec3 sample_light(const vec3 p, const vec3 n, const vec3 v, const float dotnv, - const vec3 albedo, const float rough, const vec3 f0, const float occ - ) { - float theta = acos(dotnv); - vec2 tuv = vec2(rough, theta / (0.5 * PI)); - tuv = tuv * LUT_SCALE + LUT_BIAS; - vec4 t = textureLod(sltc_mat, tuv, 0.0); - mat3 inv = mat3( - vec3(1.0, 0.0, t.y), - vec3(0.0, t.z, 0.0), - vec3(t.w, 0.0, t.x)); - float ltcspec = ltc_evaluate(n, v, dotnv, p, inv, light_area0, light_area1, light_area2, light_area3); - ltcspec *= textureLod(sltc_mag, tuv, 0.0).a; - - mat3 m1 = mat3( - vec3(1.0, 0.0, 0.0), - vec3(0.0, 1.0, 0.0), - vec3(0.0, 0.0, 1.0)); - float ltcdiff = ltc_evaluate(n, v, dotnv, p, m1, light_area0, light_area1, light_area2, light_area3); - vec3 direct = albedo * ltcdiff + ltcspec * 0.05; - direct *= vec3(1000.0, 1000.0, 1000.0); - return direct; -} - void main() { vec4 g0 = textureLod(gbuffer0, tex_coord, 0.0); // Normal.xy, roughness, metallic/matid @@ -242,6 +75,5 @@ void main() { albedo = vec3(0.0, 0.0, 0.0); } - frag_color.rgb += sample_light(p, n, v, dotnv, albedo, roughness, f0, occ); frag_color.a = 1.0; // Mark as opaque } diff --git a/base/sources/camera.ts b/base/sources/camera.ts index 002f9f3d..1108fe61 100644 --- a/base/sources/camera.ts +++ b/base/sources/camera.ts @@ -49,7 +49,6 @@ function camera_update() { operator_shortcut(map_get(config_keymap, "action_zoom"), shortcut_type_t.STARTED) || operator_shortcut(map_get(config_keymap, "action_pan"), shortcut_type_t.STARTED) || operator_shortcut(map_get(config_keymap, "rotate_envmap"), shortcut_type_t.STARTED) || - operator_shortcut(map_get(config_keymap, "rotate_light"), shortcut_type_t.STARTED) || (mouse_started("right") && !modif) || (mouse_started("middle") && !modif) || (mouse_wheel_delta != 0 && !modif_key)) { @@ -59,7 +58,6 @@ function camera_update() { !operator_shortcut(map_get(config_keymap, "action_zoom"), shortcut_type_t.DOWN) && !operator_shortcut(map_get(config_keymap, "action_pan"), shortcut_type_t.DOWN) && !operator_shortcut(map_get(config_keymap, "rotate_envmap"), shortcut_type_t.DOWN) && - !operator_shortcut(map_get(config_keymap, "rotate_light"), shortcut_type_t.DOWN) && !(mouse_down("right") && !modif) && !(mouse_down("middle") && !modif) && (mouse_wheel_delta == 0 && !modif_key)) { @@ -174,15 +172,6 @@ function camera_update() { transform_rotate(camera.base.transform, camera_object_right(camera), -mouse_movement_y / 200 * config_raw.camera_rotation_speed); } - if (operator_shortcut(map_get(config_keymap, "rotate_light"), shortcut_type_t.DOWN)) { - camera_redraws = 2; - let pi2: f32 = math_pi() * 2.0; - let mx: f32 = mouse_movement_x / 100; - context_raw.light_angle = math_fmod(context_raw.light_angle + math_fmod(mx, pi2) + pi2, pi2); - let m: mat4_t = mat4_rot_z(mx); - uniforms_light_world = mat4_mult_mat(uniforms_light_world, m); - } - if (operator_shortcut(map_get(config_keymap, "rotate_envmap"), shortcut_type_t.DOWN)) { camera_redraws = 2; context_raw.envmap_angle -= mouse_movement_x / 100; diff --git a/base/sources/keymap.ts b/base/sources/keymap.ts index c422d2d9..38c50a38 100644 --- a/base/sources/keymap.ts +++ b/base/sources/keymap.ts @@ -33,7 +33,6 @@ function keymap_get_default(): map_t { map_set(keymap, "action_rotate", "alt+left"); map_set(keymap, "action_pan", "alt+middle"); map_set(keymap, "action_zoom", "alt+right"); - map_set(keymap, "rotate_light", "shift+middle"); map_set(keymap, "rotate_envmap", "ctrl+middle"); map_set(keymap, "set_clone_source", "alt"); map_set(keymap, "stencil_transform", "ctrl"); diff --git a/base/sources/strings.ts b/base/sources/strings.ts index 38b425e7..d052f073 100644 --- a/base/sources/strings.ts +++ b/base/sources/strings.ts @@ -367,116 +367,6 @@ vec2 envmap_equirect(const vec3 normal, const float angle) { \ } \ "; -// Linearly Transformed Cosines -// https://eheitzresearch.wordpress.com/415-2/ -let str_ltc_evaluate: string = " \ -float integrate_edge(vec3 v1, vec3 v2) { \ - float cos_theta = dot(v1, v2); \ - float theta = acos(cos_theta); \ - float res = cross(v1, v2).z * ((theta > 0.001) ? theta / sin(theta) : 1.0); \ - return res; \ -} \ -float ltc_evaluate(vec3 N, vec3 V, float dotnv, vec3 P, mat3 Minv, vec3 points0, vec3 points1, vec3 points2, vec3 points3) { \ - vec3 T1 = normalize(V - N * dotnv); \ - vec3 T2 = cross(N, T1); \ - Minv = mul(transpose(mat3(T1, T2, N)), Minv); \ - vec3 L0 = mul((points0 - P), Minv); \ - vec3 L1 = mul((points1 - P), Minv); \ - vec3 L2 = mul((points2 - P), Minv); \ - vec3 L3 = mul((points3 - P), Minv); \ - vec3 L4 = vec3(0.0, 0.0, 0.0); \ - int n = 0; \ - int config = 0; \ - if (L0.z > 0.0) config += 1; \ - if (L1.z > 0.0) config += 2; \ - if (L2.z > 0.0) config += 4; \ - if (L3.z > 0.0) config += 8; \ - if (config == 0) {} \ - else if (config == 1) { \ - n = 3; \ - L1 = -L1.z * L0 + L0.z * L1; \ - L2 = -L3.z * L0 + L0.z * L3; \ - } \ - else if (config == 2) { \ - n = 3; \ - L0 = -L0.z * L1 + L1.z * L0; \ - L2 = -L2.z * L1 + L1.z * L2; \ - } \ - else if (config == 3) { \ - n = 4; \ - L2 = -L2.z * L1 + L1.z * L2; \ - L3 = -L3.z * L0 + L0.z * L3; \ - } \ - else if (config == 4) { \ - n = 3; \ - L0 = -L3.z * L2 + L2.z * L3; \ - L1 = -L1.z * L2 + L2.z * L1; \ - } \ - else if (config == 5) { n = 0; } \ - else if (config == 6) { \ - n = 4; \ - L0 = -L0.z * L1 + L1.z * L0; \ - L3 = -L3.z * L2 + L2.z * L3; \ - } \ - else if (config == 7) { \ - n = 5; \ - L4 = -L3.z * L0 + L0.z * L3; \ - L3 = -L3.z * L2 + L2.z * L3; \ - } \ - else if (config == 8) { \ - n = 3; \ - L0 = -L0.z * L3 + L3.z * L0; \ - L1 = -L2.z * L3 + L3.z * L2; \ - L2 = L3; \ - } \ - else if (config == 9) { \ - n = 4; \ - L1 = -L1.z * L0 + L0.z * L1; \ - L2 = -L2.z * L3 + L3.z * L2; \ - } \ - else if (config == 10) { n = 0; } \ - else if (config == 11) { \ - n = 5; \ - L4 = L3; \ - L3 = -L2.z * L3 + L3.z * L2; \ - L2 = -L2.z * L1 + L1.z * L2; \ - } \ - else if (config == 12) { \ - n = 4; \ - L1 = -L1.z * L2 + L2.z * L1; \ - L0 = -L0.z * L3 + L3.z * L0; \ - } \ - else if (config == 13) { \ - n = 5; \ - L4 = L3; \ - L3 = L2; \ - L2 = -L1.z * L2 + L2.z * L1; \ - L1 = -L1.z * L0 + L0.z * L1; \ - } \ - else if (config == 14) { \ - n = 5; \ - L4 = -L0.z * L3 + L3.z * L0; \ - L0 = -L0.z * L1 + L1.z * L0; \ - } \ - else if (config == 15) { n = 4; } \ - if (n == 0) return 0.0; \ - if (n == 3) L3 = L0; \ - if (n == 4) L4 = L0; \ - L0 = normalize(L0); \ - L1 = normalize(L1); \ - L2 = normalize(L2); \ - L3 = normalize(L3); \ - L4 = normalize(L4); \ - float sum = 0.0; \ - sum += integrate_edge(L0, L1); \ - sum += integrate_edge(L1, L2); \ - sum += integrate_edge(L2, L3); \ - if (n >= 4) sum += integrate_edge(L3, L4); \ - if (n == 5) sum += integrate_edge(L4, L0); \ - return max(0.0, -sum); \ -} \ -"; - let str_get_pos_nor_from_depth: string = " \ vec3 get_pos_from_depth(vec2 uv, mat4 invVP, textureArg(gbufferD)) { \n\ #ifdef GLSL \n\ diff --git a/base/sources/ui_menu.ts b/base/sources/ui_menu.ts index 78f3c978..a07a7bcf 100644 --- a/base/sources/ui_menu.ts +++ b/base/sources/ui_menu.ts @@ -196,46 +196,6 @@ function ui_menu_render() { context_raw.ddirty = 2; } - let lhandle: ui_handle_t = ui_handle(__ID__); - lhandle.value = uniforms_light_strength; - lhandle.value = math_floor(lhandle.value * 100) / 100; - ui_menu_align(ui); - uniforms_light_strength = ui_slider(lhandle, tr("Light"), 0.0, 4.0, true); - if (lhandle.changed) { - context_raw.ddirty = 2; - } - - let lahandle: ui_handle_t = ui_handle(__ID__); - lahandle.value = context_raw.light_angle / math_pi() * 180; - ui_menu_align(ui); - let new_angle: f32 = ui_slider(lahandle, tr("Light Angle"), 0.0, 360.0, true, 1) / 180 * math_pi(); - if (ui.is_hovered) { - let vars: map_t = map_create(); - map_set(vars, "shortcut", map_get(config_keymap, "rotate_light")); - ui_tooltip(tr("{shortcut} and move mouse", vars)); - } - let ldiff: f32 = new_angle - context_raw.light_angle; - if (math_abs(ldiff) > 0.005) { - if (new_angle < 0) { - new_angle += (math_floor(-new_angle / (2 * math_pi())) + 1) * 2 * math_pi(); - } - else if (new_angle > 2 * math_pi()) { - new_angle -= math_floor(new_angle / (2 * math_pi())) * 2 * math_pi(); - } - context_raw.light_angle = new_angle; - let m: mat4_t = mat4_rot_z(ldiff); - uniforms_light_world = mat4_mult_mat(uniforms_light_world, m); - context_raw.ddirty = 2; - } - - let sxhandle: ui_handle_t = ui_handle(__ID__); - sxhandle.value = uniforms_light_size_x; - ui_menu_align(ui); - uniforms_light_size_x = ui_slider(sxhandle, tr("Light Size"), 0.0, 4.0, true); - if (sxhandle.changed) { - context_raw.ddirty = 2; - } - ///if (is_paint || is_sculpt) let split_view_handle: ui_handle_t = ui_handle(__ID__); if (split_view_handle.init) { diff --git a/base/sources/uniforms_ext.ts b/base/sources/uniforms_ext.ts index 2efef9c1..dae025ea 100644 --- a/base/sources/uniforms_ext.ts +++ b/base/sources/uniforms_ext.ts @@ -329,18 +329,6 @@ function uniforms_ext_tex_link(object: object_t, mat: material_data_t, link: str let rt: render_target_t = map_get(render_path_render_targets, "texpaint_pack_undo" + i); return rt._image; } - else if (link == "_ltc_mat") { - if (const_data_ltc_mat_tex == null) { - const_data_init_ltc(); - } - return const_data_ltc_mat_tex; - } - else if (link == "_ltc_mag") { - if (const_data_ltc_mag_tex == null) { - const_data_init_ltc(); - } - return const_data_ltc_mag_tex; - } else if (link == "_texcolorid") { if (project_assets.length == 0) { let rt: render_target_t = map_get(render_path_render_targets, "empty_white"); diff --git a/base/sources/util_render.ts b/base/sources/util_render.ts index 70531974..09de897e 100644 --- a/base/sources/util_render.ts +++ b/base/sources/util_render.ts @@ -31,10 +31,6 @@ function util_render_make_material_preview() { scene_camera.data.fov = 0.92; viewport_update_camera_type(camera_type_t.PERSPECTIVE); - - let _light_strength: f32 = uniforms_light_strength; - uniforms_light_strength = 0; - let probe: world_data_t = scene_world; let _probe_strength: f32 = probe.strength; probe.strength = 7; @@ -73,7 +69,6 @@ function util_render_make_material_preview() { camera_object_build_proj(scene_camera); camera_object_build_mat(scene_camera); - uniforms_light_strength = _light_strength; probe.strength = _probe_strength; context_raw.envmap_angle = _envmap_angle; context_raw.brush_scale = _brush_scale; @@ -110,8 +105,6 @@ function util_render_make_decal_preview() { let saved_fov: f32 = scene_camera.data.fov; scene_camera.data.fov = 0.92; viewport_update_camera_type(camera_type_t.PERSPECTIVE); - let _light_strength: f32 = uniforms_light_strength; - uniforms_light_strength = 0.0; scene_world._.envmap = context_raw.preview_envmap; // No resize @@ -141,8 +134,6 @@ function util_render_make_decal_preview() { camera_object_build_proj(scene_camera); camera_object_build_mat(scene_camera); - uniforms_light_strength = _light_strength; - scene_world._.envmap = context_raw.show_envmap ? context_raw.saved_envmap : context_raw.empty_envmap; make_material_parse_mesh_material(); diff --git a/base/sources/viewport.ts b/base/sources/viewport.ts index 4a61c47e..30520154 100644 --- a/base/sources/viewport.ts +++ b/base/sources/viewport.ts @@ -79,7 +79,6 @@ function viewport_update_camera_type(camera_type: i32) { let cam: camera_object_t = scene_cameras[0]; if (camera_type == camera_type_t.PERSPECTIVE) { cam.data.ortho = null; - uniforms_light_strength = 1.0; } else { let f32a: f32_array_t = f32_array_create(4); @@ -89,7 +88,6 @@ function viewport_update_camera_type(camera_type: i32) { f32a[2] = -2 * f * (app_h() / app_w()); f32a[3] = 2 * f * (app_h() / app_w()); cam.data.ortho = f32a; - uniforms_light_strength = 0.0; } camera_object_build_proj(cam); context_raw.ddirty = 2;