diff --git a/armorforge/Sources/tab_objects.ts b/armorforge/Sources/tab_objects.ts index 7101ab52..37d02cc7 100644 --- a/armorforge/Sources/tab_objects.ts +++ b/armorforge/Sources/tab_objects.ts @@ -61,7 +61,7 @@ function tab_objects_draw(htab: zui_handle_t) { } line_counter++; - // Undo applied offset for row drawing caused by endElement() in Zui.hx + // Undo applied offset for row drawing caused by end_element() ui._y -= zui_ELEMENT_OFFSET(ui); if (ui.is_released) { @@ -125,7 +125,7 @@ function tab_objects_draw(htab: zui_handle_t) { // ui.unindent(); } - if (zui_panel(zui_handle("tabobjects_2", {selected: true}), 'Properties')) { + if (zui_panel(zui_handle("tabobjects_2", {selected: true}), "Properties")) { // ui.indent(); if (context_context_raw.selected_object != null) { diff --git a/armorlab/Sources/make_material.ts b/armorlab/Sources/make_material.ts index 7a40535d..e951e633 100644 --- a/armorlab/Sources/make_material.ts +++ b/armorlab/Sources/make_material.ts @@ -119,7 +119,7 @@ function make_material_get_displace_strength(): f32 { function make_material_voxelgi_half_extents(): string { let ext = context_raw.vxao_ext; - return `const vec3 voxelgiHalfExtents = vec3(${ext}, ${ext}, ${ext});`; + return "const vec3 voxelgiHalfExtents = vec3(" + ext + ", " + ext + ", " + ext + ");"; } function make_material_delete_context(c: shader_context_t) { diff --git a/armorlab/Sources/make_mesh.ts b/armorlab/Sources/make_mesh.ts index ac82f6f4..83de14c8 100644 --- a/armorlab/Sources/make_mesh.ts +++ b/armorlab/Sources/make_mesh.ts @@ -16,215 +16,215 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): NodeShaderContext let frag = node_shader_context_make_frag(con_mesh); frag.ins = vert.outs; - node_shader_add_out(vert, 'vec2 texCoord'); + node_shader_add_out(vert, "vec2 texCoord"); frag.wvpposition = true; - node_shader_add_out(vert, 'vec4 prevwvpposition'); - node_shader_add_uniform(vert, 'mat4 VP', '_view_proj_matrix'); - node_shader_add_uniform(vert, 'mat4 prevWVP', '_prev_world_view_proj_matrix'); + node_shader_add_out(vert, "vec4 prevwvpposition"); + node_shader_add_uniform(vert, "mat4 VP", "_view_proj_matrix"); + node_shader_add_uniform(vert, "mat4 prevWVP", "_prev_world_view_proj_matrix"); vert.wposition = true; - let textureCount = 0; - let displaceStrength = make_material_get_displace_strength(); - if (make_material_height_used && displaceStrength > 0.0) { + let texture_count = 0; + let displace_strength = make_material_get_displace_strength(); + if (make_material_height_used && displace_strength > 0.0) { vert.n = true; - node_shader_write(vert, 'float height = 0.0;'); - let numLayers = 1; - node_shader_write(vert, `wposition += wnormal * vec3(height, height, height) * vec3(${displaceStrength}, ${displaceStrength}, ${displaceStrength});`); + node_shader_write(vert, "float height = 0.0;"); + let num_layers = 1; + node_shader_write(vert, "wposition += wnormal * vec3(height, height, height) * vec3(" + displace_strength +", " + displace_strength + ", " + displace_strength + ");"); } - node_shader_write(vert, 'gl_Position = mul(vec4(wposition.xyz, 1.0), VP);'); - let brushScale = context_raw.brush_scale; - node_shader_add_uniform(vert, 'float texScale', '_tex_unpack'); - node_shader_write(vert, `texCoord = tex * ${brushScale} * texScale;`); - if (make_material_height_used && displaceStrength > 0) { - node_shader_add_uniform(vert, 'mat4 invW', '_inv_world_matrix'); - node_shader_write(vert, 'prevwvpposition = mul(mul(vec4(wposition, 1.0), invW), prevWVP);'); + node_shader_write(vert, "gl_Position = mul(vec4(wposition.xyz, 1.0), VP);"); + let brush_scale = context_raw.brush_scale; + node_shader_add_uniform(vert, "float texScale", "_tex_unpack"); + node_shader_write(vert, "texCoord = tex * " + brush_scale + " * texScale;"); + if (make_material_height_used && displace_strength > 0) { + node_shader_add_uniform(vert, "mat4 invW", "_inv_world_matrix"); + node_shader_write(vert, "prevwvpposition = mul(mul(vec4(wposition, 1.0), invW), prevWVP);"); } else { - node_shader_write(vert, 'prevwvpposition = mul(vec4(pos.xyz, 1.0), prevWVP);'); + node_shader_write(vert, "prevwvpposition = mul(vec4(pos.xyz, 1.0), prevWVP);"); } - node_shader_add_out(frag, 'vec4 fragColor[3]'); + node_shader_add_out(frag, "vec4 fragColor[3]"); frag.n = true; node_shader_add_function(frag, str_pack_float_int16); node_shader_add_function(frag, str_octahedron_wrap); node_shader_add_function(frag, str_cotangent_frame); - node_shader_write(frag, 'vec3 basecol = vec3(0.0, 0.0, 0.0);'); - node_shader_write(frag, 'float roughness = 0.0;'); - node_shader_write(frag, 'float metallic = 0.0;'); - node_shader_write(frag, 'float occlusion = 1.0;'); - node_shader_write(frag, 'float opacity = 1.0;'); - node_shader_write(frag, 'float matid = 0.0;'); - node_shader_write(frag, 'vec3 ntex = vec3(0.5, 0.5, 1.0);'); - node_shader_write(frag, 'float height = 0.0;'); + node_shader_write(frag, "vec3 basecol = vec3(0.0, 0.0, 0.0);"); + node_shader_write(frag, "float roughness = 0.0;"); + node_shader_write(frag, "float metallic = 0.0;"); + node_shader_write(frag, "float occlusion = 1.0;"); + node_shader_write(frag, "float opacity = 1.0;"); + node_shader_write(frag, "float matid = 0.0;"); + node_shader_write(frag, "vec3 ntex = vec3(0.5, 0.5, 1.0);"); + node_shader_write(frag, "float height = 0.0;"); - node_shader_write(frag, 'vec4 texpaint_sample = vec4(0.0, 0.0, 0.0, 1.0);'); - node_shader_write(frag, 'vec4 texpaint_nor_sample;'); - node_shader_write(frag, 'vec4 texpaint_pack_sample;'); - node_shader_write(frag, 'float texpaint_opac;'); + node_shader_write(frag, "vec4 texpaint_sample = vec4(0.0, 0.0, 0.0, 1.0);"); + node_shader_write(frag, "vec4 texpaint_nor_sample;"); + node_shader_write(frag, "vec4 texpaint_pack_sample;"); + node_shader_write(frag, "float texpaint_opac;"); if (make_material_height_used) { - node_shader_write(frag, 'float height0 = 0.0;'); - node_shader_write(frag, 'float height1 = 0.0;'); - node_shader_write(frag, 'float height2 = 0.0;'); - node_shader_write(frag, 'float height3 = 0.0;'); + node_shader_write(frag, "float height0 = 0.0;"); + node_shader_write(frag, "float height1 = 0.0;"); + node_shader_write(frag, "float height2 = 0.0;"); + node_shader_write(frag, "float height3 = 0.0;"); } if (context_raw.viewport_mode == viewport_mode_t.LIT && context_raw.render_mode == render_mode_t.FORWARD) { - node_shader_add_uniform(frag, 'sampler2D senvmapBrdf', "$brdf.k"); - node_shader_add_uniform(frag, 'sampler2D senvmapRadiance', '_envmap_radiance'); - node_shader_add_uniform(frag, 'sampler2D sltcMat', '_ltcMat'); - node_shader_add_uniform(frag, 'sampler2D sltcMag', '_ltcMag'); + node_shader_add_uniform(frag, "sampler2D senvmapBrdf", "$brdf.k"); + node_shader_add_uniform(frag, "sampler2D senvmapRadiance", "_envmap_radiance"); + node_shader_add_uniform(frag, "sampler2D sltcMat", "_ltcMat"); + node_shader_add_uniform(frag, "sampler2D sltcMag", "_ltcMag"); } - node_shader_add_shared_sampler(frag, 'sampler2D texpaint'); - node_shader_write(frag, 'texpaint_sample = textureLodShared(texpaint' + ', texCoord, 0.0);'); - node_shader_write(frag, 'texpaint_opac = texpaint_sample.a;'); + node_shader_add_shared_sampler(frag, "sampler2D texpaint"); + node_shader_write(frag, "texpaint_sample = textureLodShared(texpaint" + ", texCoord, 0.0);"); + node_shader_write(frag, "texpaint_opac = texpaint_sample.a;"); - node_shader_write(frag, 'basecol = texpaint_sample.rgb * texpaint_opac;'); + node_shader_write(frag, "basecol = texpaint_sample.rgb * texpaint_opac;"); - node_shader_add_shared_sampler(frag, 'sampler2D texpaint_nor'); - node_shader_write(frag, 'texpaint_nor_sample = textureLodShared(texpaint_nor' + ', texCoord, 0.0);'); + node_shader_add_shared_sampler(frag, "sampler2D texpaint_nor"); + node_shader_write(frag, "texpaint_nor_sample = textureLodShared(texpaint_nor" + ", texCoord, 0.0);"); - node_shader_write(frag, 'ntex = mix(ntex, texpaint_nor_sample.rgb, texpaint_opac);'); + node_shader_write(frag, "ntex = mix(ntex, texpaint_nor_sample.rgb, texpaint_opac);"); - node_shader_add_shared_sampler(frag, 'sampler2D texpaint_pack'); - node_shader_write(frag, 'texpaint_pack_sample = textureLodShared(texpaint_pack' + ', texCoord, 0.0);'); + node_shader_add_shared_sampler(frag, "sampler2D texpaint_pack"); + node_shader_write(frag, "texpaint_pack_sample = textureLodShared(texpaint_pack" + ", texCoord, 0.0);"); - node_shader_write(frag, 'occlusion = mix(occlusion, texpaint_pack_sample.r, texpaint_opac);'); + node_shader_write(frag, "occlusion = mix(occlusion, texpaint_pack_sample.r, texpaint_opac);"); - node_shader_write(frag, 'roughness = mix(roughness, texpaint_pack_sample.g, texpaint_opac);'); + node_shader_write(frag, "roughness = mix(roughness, texpaint_pack_sample.g, texpaint_opac);"); - node_shader_write(frag, 'metallic = mix(metallic, texpaint_pack_sample.b, texpaint_opac);'); + node_shader_write(frag, "metallic = mix(metallic, texpaint_pack_sample.b, texpaint_opac);"); - node_shader_write(frag, 'height = texpaint_pack_sample.a * texpaint_opac;'); + node_shader_write(frag, "height = texpaint_pack_sample.a * texpaint_opac;"); // if (l.paintHeight && heightUsed) { // let assign = l.paintHeightBlend ? "+=" : "="; - // node_shader_write(frag, `height ${assign} texpaint_pack_sample.a * texpaint_opac;`); - // node_shader_write(frag, '{'); - // node_shader_add_uniform(frag, 'vec2 texpaintSize', '_texpaintSize'); - // node_shader_write(frag, 'float tex_step = 1.0 / texpaintSize.x;'); - // node_shader_write(frag, `height0 ${assign} textureLodShared(texpaint_pack` + ', vec2(texCoord.x - tex_step, texCoord.y), 0.0).a * texpaint_opac;'); - // node_shader_write(frag, `height1 ${assign} textureLodShared(texpaint_pack` + ', vec2(texCoord.x + tex_step, texCoord.y), 0.0).a * texpaint_opac;'); - // node_shader_write(frag, `height2 ${assign} textureLodShared(texpaint_pack` + ', vec2(texCoord.x, texCoord.y - tex_step), 0.0).a * texpaint_opac;'); - // node_shader_write(frag, `height3 ${assign} textureLodShared(texpaint_pack` + ', vec2(texCoord.x, texCoord.y + tex_step), 0.0).a * texpaint_opac;'); - // node_shader_write(frag, '}'); + // node_shader_write(frag, "height " + assign + " texpaint_pack_sample.a * texpaint_opac;"); + // node_shader_write(frag, "{"); + // node_shader_add_uniform(frag, "vec2 texpaintSize", "_texpaintSize"); + // node_shader_write(frag, "float tex_step = 1.0 / texpaintSize.x;"); + // node_shader_write(frag, "height0 " + assign + " textureLodShared(texpaint_pack" + ", vec2(texCoord.x - tex_step, texCoord.y), 0.0).a * texpaint_opac;"); + // node_shader_write(frag, "height1 " + assign + " textureLodShared(texpaint_pack" + ", vec2(texCoord.x + tex_step, texCoord.y), 0.0).a * texpaint_opac;"); + // node_shader_write(frag, "height2 " + assign + " textureLodShared(texpaint_pack" + ", vec2(texCoord.x, texCoord.y - tex_step), 0.0).a * texpaint_opac;"); + // node_shader_write(frag, "height3 " + assign + " textureLodShared(texpaint_pack" + ", vec2(texCoord.x, texCoord.y + tex_step), 0.0).a * texpaint_opac;"); + // node_shader_write(frag, "}"); // } if (make_material_height_used) { - node_shader_write(frag, 'if (height > 0.0) {'); - node_shader_write(frag, 'float height_dx = height0 - height1;'); - node_shader_write(frag, 'float height_dy = height2 - height3;'); + node_shader_write(frag, "if (height > 0.0) {"); + node_shader_write(frag, "float height_dx = height0 - height1;"); + node_shader_write(frag, "float height_dy = height2 - height3;"); // Whiteout blend - node_shader_write(frag, 'vec3 n1 = ntex * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0);'); - node_shader_write(frag, 'vec3 n2 = normalize(vec3(height_dx * 16.0, height_dy * 16.0, 1.0));'); - node_shader_write(frag, 'ntex = normalize(vec3(n1.xy + n2.xy, n1.z * n2.z)) * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5);'); - node_shader_write(frag, '}'); + node_shader_write(frag, "vec3 n1 = ntex * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0);"); + node_shader_write(frag, "vec3 n2 = normalize(vec3(height_dx * 16.0, height_dy * 16.0, 1.0));"); + node_shader_write(frag, "ntex = normalize(vec3(n1.xy + n2.xy, n1.z * n2.z)) * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5);"); + node_shader_write(frag, "}"); } frag.vvec = true; ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, 'mat3 TBN = cotangentFrame(n, vVec, texCoord);'); + node_shader_write(frag, "mat3 TBN = cotangentFrame(n, vVec, texCoord);"); ///else - node_shader_write(frag, 'mat3 TBN = cotangentFrame(n, -vVec, texCoord);'); + node_shader_write(frag, "mat3 TBN = cotangentFrame(n, -vVec, texCoord);"); ///end - node_shader_write(frag, 'n = ntex * 2.0 - 1.0;'); - node_shader_write(frag, 'n.y = -n.y;'); - node_shader_write(frag, 'n = normalize(mul(n, TBN));'); + node_shader_write(frag, "n = ntex * 2.0 - 1.0;"); + node_shader_write(frag, "n.y = -n.y;"); + node_shader_write(frag, "n = normalize(mul(n, TBN));"); if (context_raw.viewport_mode == viewport_mode_t.LIT || context_raw.viewport_mode == viewport_mode_t.PATH_TRACE) { - node_shader_write(frag, 'basecol = pow(basecol, vec3(2.2, 2.2, 2.2));'); + node_shader_write(frag, "basecol = pow(basecol, vec3(2.2, 2.2, 2.2));"); if (context_raw.viewport_shader != null) { let color = context_raw.viewport_shader(frag); - node_shader_write(frag, `fragColor[1] = vec4(${color}, 1.0);`); + node_shader_write(frag, "fragColor[1] = vec4(" + color + ", 1.0);"); } else if (context_raw.render_mode == render_mode_t.FORWARD && context_raw.viewport_mode != viewport_mode_t.PATH_TRACE) { frag.wposition = true; - node_shader_write(frag, 'vec3 albedo = mix(basecol, vec3(0.0, 0.0, 0.0), metallic);'); - node_shader_write(frag, 'vec3 f0 = mix(vec3(0.04, 0.04, 0.04), basecol, metallic);'); + node_shader_write(frag, "vec3 albedo = mix(basecol, vec3(0.0, 0.0, 0.0), metallic);"); + node_shader_write(frag, "vec3 f0 = mix(vec3(0.04, 0.04, 0.04), basecol, metallic);"); frag.vvec = true; - node_shader_write(frag, 'float dotNV = max(0.0, dot(n, vVec));'); - node_shader_write(frag, 'vec2 envBRDF = texelFetch(senvmapBrdf, ivec2(vec2(roughness, 1.0 - dotNV) * 256.0), 0).xy;'); - node_shader_add_uniform(frag, 'int envmapNumMipmaps', '_envmap_num_mipmaps'); - node_shader_add_uniform(frag, 'vec4 envmapData', '_envmapData'); // angle, sin(angle), cos(angle), strength - node_shader_write(frag, 'vec3 wreflect = reflect(-vVec, n);'); - node_shader_write(frag, 'float envlod = roughness * float(envmapNumMipmaps);'); + node_shader_write(frag, "float dotNV = max(0.0, dot(n, vVec));"); + node_shader_write(frag, "vec2 envBRDF = texelFetch(senvmapBrdf, ivec2(vec2(roughness, 1.0 - dotNV) * 256.0), 0).xy;"); + node_shader_add_uniform(frag, "int envmapNumMipmaps", "_envmap_num_mipmaps"); + node_shader_add_uniform(frag, "vec4 envmapData", "_envmapData"); // angle, sin(angle), cos(angle), strength + node_shader_write(frag, "vec3 wreflect = reflect(-vVec, n);"); + node_shader_write(frag, "float envlod = roughness * float(envmapNumMipmaps);"); node_shader_add_function(frag, str_envmap_equirect); - node_shader_write(frag, 'vec3 prefilteredColor = textureLod(senvmapRadiance, envMapEquirect(wreflect, envmapData.x), envlod).rgb;'); - node_shader_add_uniform(frag, 'vec3 lightArea0', '_light_area0'); - node_shader_add_uniform(frag, 'vec3 lightArea1', '_light_area1'); - node_shader_add_uniform(frag, 'vec3 lightArea2', '_light_area2'); - node_shader_add_uniform(frag, 'vec3 lightArea3', '_light_area3'); + node_shader_write(frag, "vec3 prefilteredColor = textureLod(senvmapRadiance, envMapEquirect(wreflect, envmapData.x), envlod).rgb;"); + node_shader_add_uniform(frag, "vec3 lightArea0", "_light_area0"); + node_shader_add_uniform(frag, "vec3 lightArea1", "_light_area1"); + node_shader_add_uniform(frag, "vec3 lightArea2", "_light_area2"); + node_shader_add_uniform(frag, "vec3 lightArea3", "_light_area3"); node_shader_add_function(frag, str_ltc_evaluate); - node_shader_add_uniform(frag, 'vec3 lightPos', '_point_pos'); - node_shader_add_uniform(frag, 'vec3 lightColor', '_point_color'); - node_shader_write(frag, 'float ldist = distance(wposition, lightPos);'); - 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(sltcMat, 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 = ltcEvaluate(n, vVec, dotNV, wposition, minv, lightArea0, lightArea1, lightArea2, lightArea3);'); - node_shader_write(frag, 'ltcspec *= textureLod(sltcMag, 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 = ltcEvaluate(n, vVec, dotNV, wposition, mident, lightArea0, lightArea1, lightArea2, lightArea3);'); - node_shader_write(frag, 'vec3 direct = albedo * ltcdiff + ltcspec * 0.05;'); - node_shader_write(frag, 'direct *= lightColor * (1.0 / (ldist * ldist));'); + node_shader_add_uniform(frag, "vec3 lightPos", "_point_pos"); + node_shader_add_uniform(frag, "vec3 lightColor", "_point_color"); + node_shader_write(frag, "float ldist = distance(wposition, lightPos);"); + 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(sltcMat, 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 = ltcEvaluate(n, vVec, dotNV, wposition, minv, lightArea0, lightArea1, lightArea2, lightArea3);"); + node_shader_write(frag, "ltcspec *= textureLod(sltcMag, 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 = ltcEvaluate(n, vVec, dotNV, wposition, mident, lightArea0, lightArea1, lightArea2, lightArea3);"); + node_shader_write(frag, "vec3 direct = albedo * ltcdiff + ltcspec * 0.05;"); + node_shader_write(frag, "direct *= lightColor * (1.0 / (ldist * ldist));"); - node_shader_add_uniform(frag, 'vec4 shirr[7]', '_envmap_irradiance'); + 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 * (shIrradiance(vec3(n.x * envmapData.z - n.y * envmapData.y, n.x * envmapData.y + n.y * envmapData.z, n.z), shirr) / 3.14159265);'); - node_shader_write(frag, 'indirect += prefilteredColor * (f0 * envBRDF.x + envBRDF.y) * 1.5;'); - node_shader_write(frag, 'indirect *= envmapData.w * occlusion;'); - node_shader_write(frag, 'fragColor[1] = vec4(direct + indirect, 1.0);'); + node_shader_write(frag, "vec3 indirect = albedo * (shIrradiance(vec3(n.x * envmapData.z - n.y * envmapData.y, n.x * envmapData.y + n.y * envmapData.z, n.z), shirr) / 3.14159265);"); + node_shader_write(frag, "indirect += prefilteredColor * (f0 * envBRDF.x + envBRDF.y) * 1.5;"); + node_shader_write(frag, "indirect *= envmapData.w * occlusion;"); + node_shader_write(frag, "fragColor[1] = vec4(direct + indirect, 1.0);"); } else { // Deferred, Pathtraced - node_shader_write(frag, 'fragColor[1] = vec4(basecol, occlusion);'); + node_shader_write(frag, "fragColor[1] = vec4(basecol, occlusion);"); } } else if (context_raw.viewport_mode == viewport_mode_t.BASE_COLOR) { - node_shader_write(frag, 'fragColor[1] = vec4(basecol, 1.0);'); + node_shader_write(frag, "fragColor[1] = vec4(basecol, 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.NORMAL_MAP) { - node_shader_write(frag, 'fragColor[1] = vec4(ntex.rgb, 1.0);'); + node_shader_write(frag, "fragColor[1] = vec4(ntex.rgb, 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.OCCLUSION) { - node_shader_write(frag, 'fragColor[1] = vec4(vec3(occlusion, occlusion, occlusion), 1.0);'); + node_shader_write(frag, "fragColor[1] = vec4(vec3(occlusion, occlusion, occlusion), 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.ROUGHNESS) { - node_shader_write(frag, 'fragColor[1] = vec4(vec3(roughness, roughness, roughness), 1.0);'); + node_shader_write(frag, "fragColor[1] = vec4(vec3(roughness, roughness, roughness), 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.METALLIC) { - node_shader_write(frag, 'fragColor[1] = vec4(vec3(metallic, metallic, metallic), 1.0);'); + node_shader_write(frag, "fragColor[1] = vec4(vec3(metallic, metallic, metallic), 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.OPACITY) { - node_shader_write(frag, 'fragColor[1] = vec4(vec3(texpaint_sample.a, texpaint_sample.a, texpaint_sample.a), 1.0);'); + node_shader_write(frag, "fragColor[1] = vec4(vec3(texpaint_sample.a, texpaint_sample.a, texpaint_sample.a), 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.HEIGHT) { - node_shader_write(frag, 'fragColor[1] = vec4(vec3(height, height, height), 1.0);'); + node_shader_write(frag, "fragColor[1] = vec4(vec3(height, height, height), 1.0);"); } else { - node_shader_write(frag, 'fragColor[1] = vec4(1.0, 0.0, 1.0, 1.0);'); // Pink + node_shader_write(frag, "fragColor[1] = vec4(1.0, 0.0, 1.0, 1.0);"); // Pink } if (context_raw.viewport_mode != viewport_mode_t.LIT && context_raw.viewport_mode != viewport_mode_t.PATH_TRACE) { - node_shader_write(frag, 'fragColor[1].rgb = pow(fragColor[1].rgb, vec3(2.2, 2.2, 2.2));'); + node_shader_write(frag, "fragColor[1].rgb = pow(fragColor[1].rgb, vec3(2.2, 2.2, 2.2));"); } - node_shader_write(frag, 'n /= (abs(n.x) + abs(n.y) + abs(n.z));'); - node_shader_write(frag, 'n.xy = n.z >= 0.0 ? n.xy : octahedronWrap(n.xy);'); - node_shader_write(frag, 'fragColor[0] = vec4(n.xy, roughness, packFloatInt16(metallic, uint(int(matid * 255.0) % 3)));'); + node_shader_write(frag, "n /= (abs(n.x) + abs(n.y) + abs(n.z));"); + node_shader_write(frag, "n.xy = n.z >= 0.0 ? n.xy : octahedronWrap(n.xy);"); + node_shader_write(frag, "fragColor[0] = vec4(n.xy, roughness, packFloatInt16(metallic, uint(int(matid * 255.0) % 3)));"); - node_shader_write(frag, 'vec2 posa = (wvpposition.xy / wvpposition.w) * 0.5 + 0.5;'); - node_shader_write(frag, 'vec2 posb = (prevwvpposition.xy / prevwvpposition.w) * 0.5 + 0.5;'); - node_shader_write(frag, 'fragColor[2] = vec4(posa - posb, texCoord.xy);'); + node_shader_write(frag, "vec2 posa = (wvpposition.xy / wvpposition.w) * 0.5 + 0.5;"); + node_shader_write(frag, "vec2 posb = (prevwvpposition.xy / prevwvpposition.w) * 0.5 + 0.5;"); + node_shader_write(frag, "fragColor[2] = vec4(posa - posb, texCoord.xy);"); parser_material_finalize(con_mesh); con_mesh.data.shader_from_source = true; diff --git a/armorlab/Sources/make_paint.ts b/armorlab/Sources/make_paint.ts index 550b2431..1958d96a 100644 --- a/armorlab/Sources/make_paint.ts +++ b/armorlab/Sources/make_paint.ts @@ -24,26 +24,26 @@ function make_paint_run(data: material_t, matcon: material_context_t): NodeShade if (context_raw.tool == workspace_tool_t.PICKER) { // Mangle vertices to form full screen triangle - node_shader_write(vert, 'gl_Position = vec4(-1.0 + float((gl_VertexID & 1) << 2), -1.0 + float((gl_VertexID & 2) << 1), 0.0, 1.0);'); + node_shader_write(vert, "gl_Position = vec4(-1.0 + float((gl_VertexID & 1) << 2), -1.0 + float((gl_VertexID & 2) << 1), 0.0, 1.0);"); - node_shader_add_uniform(frag, 'sampler2D gbuffer2'); - node_shader_add_uniform(frag, 'vec2 gbufferSize', '_gbufferSize'); - node_shader_add_uniform(frag, 'vec4 inp', '_inputBrush'); + node_shader_add_uniform(frag, "sampler2D gbuffer2"); + node_shader_add_uniform(frag, "vec2 gbufferSize", "_gbufferSize"); + node_shader_add_uniform(frag, "vec4 inp", "_inputBrush"); ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, 'vec2 texCoordInp = texelFetch(gbuffer2, ivec2(inp.x * gbufferSize.x, inp.y * gbufferSize.y), 0).ba;'); + node_shader_write(frag, "vec2 texCoordInp = texelFetch(gbuffer2, ivec2(inp.x * gbufferSize.x, inp.y * gbufferSize.y), 0).ba;"); ///else - node_shader_write(frag, 'vec2 texCoordInp = texelFetch(gbuffer2, ivec2(inp.x * gbufferSize.x, (1.0 - inp.y) * gbufferSize.y), 0).ba;'); + node_shader_write(frag, "vec2 texCoordInp = texelFetch(gbuffer2, ivec2(inp.x * gbufferSize.x, (1.0 - inp.y) * gbufferSize.y), 0).ba;"); ///end - node_shader_add_out(frag, 'vec4 fragColor[4]'); - node_shader_add_uniform(frag, 'sampler2D texpaint'); - node_shader_add_uniform(frag, 'sampler2D texpaint_nor'); - node_shader_add_uniform(frag, 'sampler2D texpaint_pack'); - node_shader_write(frag, 'fragColor[0] = textureLod(texpaint, texCoordInp, 0.0);'); - node_shader_write(frag, 'fragColor[1] = textureLod(texpaint_nor, texCoordInp, 0.0);'); - node_shader_write(frag, 'fragColor[2] = textureLod(texpaint_pack, texCoordInp, 0.0);'); - node_shader_write(frag, 'fragColor[3].rg = texCoordInp.xy;'); + node_shader_add_out(frag, "vec4 fragColor[4]"); + node_shader_add_uniform(frag, "sampler2D texpaint"); + node_shader_add_uniform(frag, "sampler2D texpaint_nor"); + node_shader_add_uniform(frag, "sampler2D texpaint_pack"); + node_shader_write(frag, "fragColor[0] = textureLod(texpaint, texCoordInp, 0.0);"); + node_shader_write(frag, "fragColor[1] = textureLod(texpaint_nor, texCoordInp, 0.0);"); + node_shader_write(frag, "fragColor[2] = textureLod(texpaint_pack, texCoordInp, 0.0);"); + node_shader_write(frag, "fragColor[3].rg = texCoordInp.xy;"); con_paint.data.shader_from_source = true; con_paint.data.vertex_shader = node_shader_get(vert); con_paint.data.fragment_shader = node_shader_get(frag); @@ -51,218 +51,218 @@ function make_paint_run(data: material_t, matcon: material_context_t): NodeShade } ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(vert, 'vec2 tpos = vec2(tex.x * 2.0 - 1.0, (1.0 - tex.y) * 2.0 - 1.0);'); - // node_shader_write(vert, 'vec2 tpos = vec2(frac(tex.x * texScale) * 2.0 - 1.0, (1.0 - frac(tex.y * texScale)) * 2.0 - 1.0);'); // 3D View + node_shader_write(vert, "vec2 tpos = vec2(tex.x * 2.0 - 1.0, (1.0 - tex.y) * 2.0 - 1.0);"); + // node_shader_write(vert, "vec2 tpos = vec2(frac(tex.x * texScale) * 2.0 - 1.0, (1.0 - frac(tex.y * texScale)) * 2.0 - 1.0);"); // 3D View ///else - node_shader_write(vert, 'vec2 tpos = vec2(tex.xy * 2.0 - 1.0);'); + node_shader_write(vert, "vec2 tpos = vec2(tex.xy * 2.0 - 1.0);"); ///end - node_shader_write(vert, 'gl_Position = vec4(tpos, 0.0, 1.0);'); + node_shader_write(vert, "gl_Position = vec4(tpos, 0.0, 1.0);"); - node_shader_add_uniform(vert, 'mat4 WVP', '_world_view_proj_matrix'); + node_shader_add_uniform(vert, "mat4 WVP", "_world_view_proj_matrix"); - node_shader_add_out(vert, 'vec4 ndc'); - node_shader_write_attrib(vert, 'ndc = mul(vec4(pos.xyz, 1.0), WVP);'); + node_shader_add_out(vert, "vec4 ndc"); + node_shader_write_attrib(vert, "ndc = mul(vec4(pos.xyz, 1.0), WVP);"); - node_shader_write_attrib(frag, 'vec3 sp = vec3((ndc.xyz / ndc.w) * 0.5 + 0.5);'); - node_shader_write_attrib(frag, 'sp.y = 1.0 - sp.y;'); - node_shader_write_attrib(frag, 'sp.z -= 0.0001;'); // small bias + node_shader_write_attrib(frag, "vec3 sp = vec3((ndc.xyz / ndc.w) * 0.5 + 0.5);"); + node_shader_write_attrib(frag, "sp.y = 1.0 - sp.y;"); + node_shader_write_attrib(frag, "sp.z -= 0.0001;"); // small bias - node_shader_add_uniform(frag, 'vec4 inp', '_inputBrush'); - node_shader_add_uniform(frag, 'vec4 inplast', '_inputBrushLast'); - node_shader_add_uniform(frag, 'float aspectRatio', '_aspect_ratio_window'); - node_shader_write(frag, 'vec2 bsp = sp.xy * 2.0 - 1.0;'); - node_shader_write(frag, 'bsp.x *= aspectRatio;'); - node_shader_write(frag, 'bsp = bsp * 0.5 + 0.5;'); + node_shader_add_uniform(frag, "vec4 inp", "_inputBrush"); + node_shader_add_uniform(frag, "vec4 inplast", "_inputBrushLast"); + node_shader_add_uniform(frag, "float aspectRatio", "_aspect_ratio_window"); + node_shader_write(frag, "vec2 bsp = sp.xy * 2.0 - 1.0;"); + node_shader_write(frag, "bsp.x *= aspectRatio;"); + node_shader_write(frag, "bsp = bsp * 0.5 + 0.5;"); - node_shader_add_uniform(frag, 'sampler2D gbufferD'); + node_shader_add_uniform(frag, "sampler2D gbufferD"); - node_shader_add_out(frag, 'vec4 fragColor[4]'); + node_shader_add_out(frag, "vec4 fragColor[4]"); - node_shader_add_uniform(frag, 'float brushRadius', '_brushRadius'); - node_shader_add_uniform(frag, 'float brushOpacity', '_brushOpacity'); - node_shader_add_uniform(frag, 'float brushHardness', '_brushHardness'); + node_shader_add_uniform(frag, "float brushRadius", "_brushRadius"); + node_shader_add_uniform(frag, "float brushOpacity", "_brushOpacity"); + node_shader_add_uniform(frag, "float brushHardness", "_brushHardness"); if (context_raw.tool == workspace_tool_t.ERASER || context_raw.tool == workspace_tool_t.CLONE || context_raw.tool == workspace_tool_t.BLUR || context_raw.tool == workspace_tool_t.SMUDGE) { - node_shader_write(frag, 'float dist = 0.0;'); + node_shader_write(frag, "float dist = 0.0;"); ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, 'float depth = textureLod(gbufferD, inp.xy, 0.0).r;'); + node_shader_write(frag, "float depth = textureLod(gbufferD, inp.xy, 0.0).r;"); ///else - node_shader_write(frag, 'float depth = textureLod(gbufferD, vec2(inp.x, 1.0 - inp.y), 0.0).r;'); + node_shader_write(frag, "float depth = textureLod(gbufferD, vec2(inp.x, 1.0 - inp.y), 0.0).r;"); ///end - node_shader_add_uniform(frag, 'mat4 invVP', '_inv_view_proj_matrix'); - node_shader_write(frag, 'vec4 winp = vec4(vec2(inp.x, 1.0 - inp.y) * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0);'); - node_shader_write(frag, 'winp = mul(winp, invVP);'); - node_shader_write(frag, 'winp.xyz /= winp.w;'); + node_shader_add_uniform(frag, "mat4 invVP", "_inv_view_proj_matrix"); + node_shader_write(frag, "vec4 winp = vec4(vec2(inp.x, 1.0 - inp.y) * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0);"); + node_shader_write(frag, "winp = mul(winp, invVP);"); + node_shader_write(frag, "winp.xyz /= winp.w;"); frag.wposition = true; ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, 'float depthlast = textureLod(gbufferD, inplast.xy, 0.0).r;'); + node_shader_write(frag, "float depthlast = textureLod(gbufferD, inplast.xy, 0.0).r;"); ///else - node_shader_write(frag, 'float depthlast = textureLod(gbufferD, vec2(inplast.x, 1.0 - inplast.y), 0.0).r;'); + node_shader_write(frag, "float depthlast = textureLod(gbufferD, vec2(inplast.x, 1.0 - inplast.y), 0.0).r;"); ///end - node_shader_write(frag, 'vec4 winplast = vec4(vec2(inplast.x, 1.0 - inplast.y) * 2.0 - 1.0, depthlast * 2.0 - 1.0, 1.0);'); - node_shader_write(frag, 'winplast = mul(winplast, invVP);'); - node_shader_write(frag, 'winplast.xyz /= winplast.w;'); + node_shader_write(frag, "vec4 winplast = vec4(vec2(inplast.x, 1.0 - inplast.y) * 2.0 - 1.0, depthlast * 2.0 - 1.0, 1.0);"); + node_shader_write(frag, "winplast = mul(winplast, invVP);"); + node_shader_write(frag, "winplast.xyz /= winplast.w;"); - node_shader_write(frag, 'vec3 pa = wposition - winp.xyz;'); - node_shader_write(frag, 'vec3 ba = winplast.xyz - winp.xyz;'); + node_shader_write(frag, "vec3 pa = wposition - winp.xyz;"); + node_shader_write(frag, "vec3 ba = winplast.xyz - winp.xyz;"); // Capsule - node_shader_write(frag, 'float h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);'); - node_shader_write(frag, 'dist = length(pa - ba * h);'); + node_shader_write(frag, "float h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);"); + node_shader_write(frag, "dist = length(pa - ba * h);"); - node_shader_write(frag, 'if (dist > brushRadius) discard;'); + node_shader_write(frag, "if (dist > brushRadius) discard;"); } - // node_shader_add_uniform(vert, 'float brushScale', '_brushScale'); - // node_shader_add_uniform(vert, 'float texScale', '_tex_unpack'); - // node_shader_add_out(vert, 'vec2 texCoord'); - // node_shader_write(vert, 'texCoord = tex * brushScale * texScale;'); + // node_shader_add_uniform(vert, "float brushScale", "_brushScale"); + // node_shader_add_uniform(vert, "float texScale", "_tex_unpack"); + // node_shader_add_out(vert, "vec2 texCoord"); + // node_shader_write(vert, "texCoord = tex * brushScale * texScale;"); if (context_raw.tool == workspace_tool_t.CLONE || context_raw.tool == workspace_tool_t.BLUR || context_raw.tool == workspace_tool_t.SMUDGE) { - node_shader_add_uniform(frag, 'sampler2D BLUR'); - node_shader_add_uniform(frag, 'vec2 SMUDGE', '_gbufferSize'); - node_shader_add_uniform(frag, 'sampler2D texpaint_undo', '_texpaint_undo'); - node_shader_add_uniform(frag, 'sampler2D texpaint_nor_undo', '_texpaint_nor_undo'); - node_shader_add_uniform(frag, 'sampler2D texpaint_pack_undo', '_texpaint_pack_undo'); + node_shader_add_uniform(frag, "sampler2D BLUR"); + node_shader_add_uniform(frag, "vec2 SMUDGE", "_gbufferSize"); + node_shader_add_uniform(frag, "sampler2D texpaint_undo", "_texpaint_undo"); + node_shader_add_uniform(frag, "sampler2D texpaint_nor_undo", "_texpaint_nor_undo"); + node_shader_add_uniform(frag, "sampler2D texpaint_pack_undo", "_texpaint_pack_undo"); if (context_raw.tool == workspace_tool_t.CLONE) { - // node_shader_add_uniform(frag, 'vec2 BLUR', '_cloneDelta'); + // node_shader_add_uniform(frag, "vec2 BLUR", "_cloneDelta"); // ///if (krom_direct3d11 || SMUDGE || krom_metal || krom_vulkan) - // node_shader_write(frag, 'vec2 texCoordInp = texelFetch(gbuffer2, ivec2((sp.xy + cloneDelta) * gbufferSize), 0).ba;'); + // node_shader_write(frag, "vec2 texCoordInp = texelFetch(gbuffer2, ivec2((sp.xy + cloneDelta) * gbufferSize), 0).ba;"); // ///else - // node_shader_write(frag, 'vec2 texCoordInp = texelFetch(gbuffer2, ivec2((sp.x + cloneDelta.x) * gbufferSize.x, (1.0 - (sp.y + cloneDelta.y)) * gbufferSize.y), 0).ba;'); + // node_shader_write(frag, "vec2 texCoordInp = texelFetch(gbuffer2, ivec2((sp.x + cloneDelta.x) * gbufferSize.x, (1.0 - (sp.y + cloneDelta.y)) * gbufferSize.y), 0).ba;"); // ///end - // node_shader_write(frag, 'vec3 texpaint_pack_sample = textureLod(texpaint_pack_undo, texCoordInp, 0.0).rgb;'); - // let base = 'textureLod(texpaint_undo, texCoordInp, 0.0).rgb'; - // let rough = 'texpaint_pack_sample.g'; - // let met = 'texpaint_pack_sample.b'; - // let occ = 'texpaint_pack_sample.r'; - // let nortan = 'textureLod(texpaint_nor_undo, texCoordInp, 0.0).rgb'; - // let height = '0.0'; - // let opac = '1.0'; - // node_shader_write(frag, `vec3 basecol = ${base};`); - // node_shader_write(frag, `float roughness = ${rough};`); - // node_shader_write(frag, `float metallic = ${met};`); - // node_shader_write(frag, `float occlusion = ${occ};`); - // node_shader_write(frag, `vec3 nortan = ${nortan};`); - // node_shader_write(frag, `float height = ${height};`); - // node_shader_write(frag, `float mat_opacity = ${opac};`); - // node_shader_write(frag, 'float opacity = mat_opacity * brushOpacity;'); + // node_shader_write(frag, "vec3 texpaint_pack_sample = textureLod(texpaint_pack_undo, texCoordInp, 0.0).rgb;"); + // let base = "textureLod(texpaint_undo, texCoordInp, 0.0).rgb"; + // let rough = "texpaint_pack_sample.g"; + // let met = "texpaint_pack_sample.b"; + // let occ = "texpaint_pack_sample.r"; + // let nortan = "textureLod(texpaint_nor_undo, texCoordInp, 0.0).rgb"; + // let height = "0.0"; + // let opac = "1.0"; + // node_shader_write(frag, "vec3 basecol = " + base + ";"); + // node_shader_write(frag, "float roughness = " + rough + ";"); + // node_shader_write(frag, "float metallic = " + met + ";"); + // node_shader_write(frag, "float occlusion = " + occ + ";"); + // node_shader_write(frag, "vec3 nortan = " + nortan + ";"); + // node_shader_write(frag, "float height = " + height + ";"); + // node_shader_write(frag, "float mat_opacity = " + opac + ";"); + // node_shader_write(frag, "float opacity = mat_opacity * brushOpacity;"); } else { // Blur // ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - // node_shader_write(frag, 'vec2 texCoordInp = texelFetch(gbuffer2, ivec2(sp.x * gbufferSize.x, sp.y * gbufferSize.y), 0).ba;'); + // node_shader_write(frag, "vec2 texCoordInp = texelFetch(gbuffer2, ivec2(sp.x * gbufferSize.x, sp.y * gbufferSize.y), 0).ba;"); // ///else - // node_shader_write(frag, 'vec2 texCoordInp = texelFetch(gbuffer2, ivec2(sp.x * gbufferSize.x, (1.0 - sp.y) * gbufferSize.y), 0).ba;'); + // node_shader_write(frag, "vec2 texCoordInp = texelFetch(gbuffer2, ivec2(sp.x * gbufferSize.x, (1.0 - sp.y) * gbufferSize.y), 0).ba;"); // ///end - // node_shader_write(frag, 'vec3 basecol = vec3(0.0, 0.0, 0.0);'); - // node_shader_write(frag, 'float roughness = 0.0;'); - // node_shader_write(frag, 'float metallic = 0.0;'); - // node_shader_write(frag, 'float occlusion = 0.0;'); - // node_shader_write(frag, 'vec3 nortan = vec3(0.0, 0.0, 0.0);'); - // node_shader_write(frag, 'float height = 0.0;'); - // node_shader_write(frag, 'float mat_opacity = 1.0;'); - // node_shader_write(frag, 'float opacity = 0.0;'); + // node_shader_write(frag, "vec3 basecol = vec3(0.0, 0.0, 0.0);"); + // node_shader_write(frag, "float roughness = 0.0;"); + // node_shader_write(frag, "float metallic = 0.0;"); + // node_shader_write(frag, "float occlusion = 0.0;"); + // node_shader_write(frag, "vec3 nortan = vec3(0.0, 0.0, 0.0);"); + // node_shader_write(frag, "float height = 0.0;"); + // node_shader_write(frag, "float mat_opacity = 1.0;"); + // node_shader_write(frag, "float opacity = 0.0;"); - // node_shader_add_uniform(frag, 'vec2 texpaintSize', '_texpaintSize'); - // node_shader_write(frag, 'float blur_step = 1.0 / texpaintSize.x;'); + // node_shader_add_uniform(frag, "vec2 texpaintSize", "_texpaintSize"); + // node_shader_write(frag, "float blur_step = 1.0 / texpaintSize.x;"); // if (context_raw.blurDirectional) { // ///if (krom_direct3d11 || krom_direct3d12 || krom_metal) - // node_shader_write(frag, 'const float blur_weight[7] = {1.0 / 28.0, 2.0 / 28.0, 3.0 / 28.0, 4.0 / 28.0, 5.0 / 28.0, 6.0 / 28.0, 7.0 / 28.0};'); + // node_shader_write(frag, "const float blur_weight[7] = {1.0 / 28.0, 2.0 / 28.0, 3.0 / 28.0, 4.0 / 28.0, 5.0 / 28.0, 6.0 / 28.0, 7.0 / 28.0};"); // ///else - // node_shader_write(frag, 'const float blur_weight[7] = float[](1.0 / 28.0, 2.0 / 28.0, 3.0 / 28.0, 4.0 / 28.0, 5.0 / 28.0, 6.0 / 28.0, 7.0 / 28.0);'); + // node_shader_write(frag, "const float blur_weight[7] = float[](1.0 / 28.0, 2.0 / 28.0, 3.0 / 28.0, 4.0 / 28.0, 5.0 / 28.0, 6.0 / 28.0, 7.0 / 28.0);"); // ///end - // node_shader_add_uniform(frag, 'vec3 brushDirection', '_brushDirection'); - // node_shader_write(frag, 'vec2 blur_direction = brushDirection.yx;'); - // node_shader_write(frag, 'for (int i = 0; i < 7; ++i) {'); + // node_shader_add_uniform(frag, "vec3 brushDirection", "_brushDirection"); + // node_shader_write(frag, "vec2 blur_direction = brushDirection.yx;"); + // node_shader_write(frag, "for (int i = 0; i < 7; ++i) {"); // ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - // node_shader_write(frag, 'vec2 texCoordInp2 = texelFetch(gbuffer2, ivec2((sp.x + blur_direction.x * blur_step * float(i)) * gbufferSize.x, (sp.y + blur_direction.y * blur_step * float(i)) * gbufferSize.y), 0).ba;'); + // node_shader_write(frag, "vec2 texCoordInp2 = texelFetch(gbuffer2, ivec2((sp.x + blur_direction.x * blur_step * float(i)) * gbufferSize.x, (sp.y + blur_direction.y * blur_step * float(i)) * gbufferSize.y), 0).ba;"); // ///else - // node_shader_write(frag, 'vec2 texCoordInp2 = texelFetch(gbuffer2, ivec2((sp.x + blur_direction.x * blur_step * float(i)) * gbufferSize.x, (1.0 - (sp.y + blur_direction.y * blur_step * float(i))) * gbufferSize.y), 0).ba;'); + // node_shader_write(frag, "vec2 texCoordInp2 = texelFetch(gbuffer2, ivec2((sp.x + blur_direction.x * blur_step * float(i)) * gbufferSize.x, (1.0 - (sp.y + blur_direction.y * blur_step * float(i))) * gbufferSize.y), 0).ba;"); // ///end - // node_shader_write(frag, 'vec4 texpaint_sample = texture(texpaint_undo, texCoordInp2);'); - // node_shader_write(frag, 'opacity += texpaint_sample.a * blur_weight[i];'); - // node_shader_write(frag, 'basecol += texpaint_sample.rgb * blur_weight[i];'); - // node_shader_write(frag, 'vec4 texpaint_pack_sample = texture(texpaint_pack_undo, texCoordInp2) * blur_weight[i];'); - // node_shader_write(frag, 'roughness += texpaint_pack_sample.g;'); - // node_shader_write(frag, 'metallic += texpaint_pack_sample.b;'); - // node_shader_write(frag, 'occlusion += texpaint_pack_sample.r;'); - // node_shader_write(frag, 'height += texpaint_pack_sample.a;'); - // node_shader_write(frag, 'nortan += texture(texpaint_nor_undo, texCoordInp2).rgb * blur_weight[i];'); - // node_shader_write(frag, '}'); + // node_shader_write(frag, "vec4 texpaint_sample = texture(texpaint_undo, texCoordInp2);"); + // node_shader_write(frag, "opacity += texpaint_sample.a * blur_weight[i];"); + // node_shader_write(frag, "basecol += texpaint_sample.rgb * blur_weight[i];"); + // node_shader_write(frag, "vec4 texpaint_pack_sample = texture(texpaint_pack_undo, texCoordInp2) * blur_weight[i];"); + // node_shader_write(frag, "roughness += texpaint_pack_sample.g;"); + // node_shader_write(frag, "metallic += texpaint_pack_sample.b;"); + // node_shader_write(frag, "occlusion += texpaint_pack_sample.r;"); + // node_shader_write(frag, "height += texpaint_pack_sample.a;"); + // node_shader_write(frag, "nortan += texture(texpaint_nor_undo, texCoordInp2).rgb * blur_weight[i];"); + // node_shader_write(frag, "}"); // } // else { // ///if (krom_direct3d11 || krom_direct3d12 || krom_metal) - // node_shader_write(frag, 'const float blur_weight[15] = {0.034619 / 2.0, 0.044859 / 2.0, 0.055857 / 2.0, 0.066833 / 2.0, 0.076841 / 2.0, 0.084894 / 2.0, 0.090126 / 2.0, 0.09194 / 2.0, 0.090126 / 2.0, 0.084894 / 2.0, 0.076841 / 2.0, 0.066833 / 2.0, 0.055857 / 2.0, 0.044859 / 2.0, 0.034619 / 2.0};'); + // node_shader_write(frag, "const float blur_weight[15] = {0.034619 / 2.0, 0.044859 / 2.0, 0.055857 / 2.0, 0.066833 / 2.0, 0.076841 / 2.0, 0.084894 / 2.0, 0.090126 / 2.0, 0.09194 / 2.0, 0.090126 / 2.0, 0.084894 / 2.0, 0.076841 / 2.0, 0.066833 / 2.0, 0.055857 / 2.0, 0.044859 / 2.0, 0.034619 / 2.0};"); // ///else - // node_shader_write(frag, 'const float blur_weight[15] = float[](0.034619 / 2.0, 0.044859 / 2.0, 0.055857 / 2.0, 0.066833 / 2.0, 0.076841 / 2.0, 0.084894 / 2.0, 0.090126 / 2.0, 0.09194 / 2.0, 0.090126 / 2.0, 0.084894 / 2.0, 0.076841 / 2.0, 0.066833 / 2.0, 0.055857 / 2.0, 0.044859 / 2.0, 0.034619 / 2.0);'); + // node_shader_write(frag, "const float blur_weight[15] = float[](0.034619 / 2.0, 0.044859 / 2.0, 0.055857 / 2.0, 0.066833 / 2.0, 0.076841 / 2.0, 0.084894 / 2.0, 0.090126 / 2.0, 0.09194 / 2.0, 0.090126 / 2.0, 0.084894 / 2.0, 0.076841 / 2.0, 0.066833 / 2.0, 0.055857 / 2.0, 0.044859 / 2.0, 0.034619 / 2.0);"); // ///end // // X - // node_shader_write(frag, 'for (int i = -7; i <= 7; ++i) {'); - // node_shader_write(frag, 'vec4 texpaint_sample = texture(texpaint_undo, texCoordInp + vec2(blur_step * float(i), 0.0));'); - // node_shader_write(frag, 'opacity += texpaint_sample.a * blur_weight[i + 7];'); - // node_shader_write(frag, 'basecol += texpaint_sample.rgb * blur_weight[i + 7];'); - // node_shader_write(frag, 'vec4 texpaint_pack_sample = texture(texpaint_pack_undo, texCoordInp + vec2(blur_step * float(i), 0.0)) * blur_weight[i + 7];'); - // node_shader_write(frag, 'roughness += texpaint_pack_sample.g;'); - // node_shader_write(frag, 'metallic += texpaint_pack_sample.b;'); - // node_shader_write(frag, 'occlusion += texpaint_pack_sample.r;'); - // node_shader_write(frag, 'height += texpaint_pack_sample.a;'); - // node_shader_write(frag, 'nortan += texture(texpaint_nor_undo, texCoordInp + vec2(blur_step * float(i), 0.0)).rgb * blur_weight[i + 7];'); - // node_shader_write(frag, '}'); + // node_shader_write(frag, "for (int i = -7; i <= 7; ++i) {"); + // node_shader_write(frag, "vec4 texpaint_sample = texture(texpaint_undo, texCoordInp + vec2(blur_step * float(i), 0.0));"); + // node_shader_write(frag, "opacity += texpaint_sample.a * blur_weight[i + 7];"); + // node_shader_write(frag, "basecol += texpaint_sample.rgb * blur_weight[i + 7];"); + // node_shader_write(frag, "vec4 texpaint_pack_sample = texture(texpaint_pack_undo, texCoordInp + vec2(blur_step * float(i), 0.0)) * blur_weight[i + 7];"); + // node_shader_write(frag, "roughness += texpaint_pack_sample.g;"); + // node_shader_write(frag, "metallic += texpaint_pack_sample.b;"); + // node_shader_write(frag, "occlusion += texpaint_pack_sample.r;"); + // node_shader_write(frag, "height += texpaint_pack_sample.a;"); + // node_shader_write(frag, "nortan += texture(texpaint_nor_undo, texCoordInp + vec2(blur_step * float(i), 0.0)).rgb * blur_weight[i + 7];"); + // node_shader_write(frag, "}"); // // Y - // node_shader_write(frag, 'for (int j = -7; j <= 7; ++j) {'); - // node_shader_write(frag, 'vec4 texpaint_sample = texture(texpaint_undo, texCoordInp + vec2(0.0, blur_step * float(j)));'); - // node_shader_write(frag, 'opacity += texpaint_sample.a * blur_weight[j + 7];'); - // node_shader_write(frag, 'basecol += texpaint_sample.rgb * blur_weight[j + 7];'); - // node_shader_write(frag, 'vec4 texpaint_pack_sample = texture(texpaint_pack_undo, texCoordInp + vec2(0.0, blur_step * float(j))) * blur_weight[j + 7];'); - // node_shader_write(frag, 'roughness += texpaint_pack_sample.g;'); - // node_shader_write(frag, 'metallic += texpaint_pack_sample.b;'); - // node_shader_write(frag, 'occlusion += texpaint_pack_sample.r;'); - // node_shader_write(frag, 'height += texpaint_pack_sample.a;'); - // node_shader_write(frag, 'nortan += texture(texpaint_nor_undo, texCoordInp + vec2(0.0, blur_step * float(j))).rgb * blur_weight[j + 7];'); - // node_shader_write(frag, '}'); + // node_shader_write(frag, "for (int j = -7; j <= 7; ++j) {"); + // node_shader_write(frag, "vec4 texpaint_sample = texture(texpaint_undo, texCoordInp + vec2(0.0, blur_step * float(j)));"); + // node_shader_write(frag, "opacity += texpaint_sample.a * blur_weight[j + 7];"); + // node_shader_write(frag, "basecol += texpaint_sample.rgb * blur_weight[j + 7];"); + // node_shader_write(frag, "vec4 texpaint_pack_sample = texture(texpaint_pack_undo, texCoordInp + vec2(0.0, blur_step * float(j))) * blur_weight[j + 7];"); + // node_shader_write(frag, "roughness += texpaint_pack_sample.g;"); + // node_shader_write(frag, "metallic += texpaint_pack_sample.b;"); + // node_shader_write(frag, "occlusion += texpaint_pack_sample.r;"); + // node_shader_write(frag, "height += texpaint_pack_sample.a;"); + // node_shader_write(frag, "nortan += texture(texpaint_nor_undo, texCoordInp + vec2(0.0, blur_step * float(j))).rgb * blur_weight[j + 7];"); + // node_shader_write(frag, "}"); // } - // node_shader_write(frag, 'opacity *= brushOpacity;'); + // node_shader_write(frag, "opacity *= brushOpacity;"); } } - node_shader_write(frag, 'float opacity = 1.0;'); - node_shader_write(frag, 'if (opacity == 0.0) discard;'); + node_shader_write(frag, "float opacity = 1.0;"); + node_shader_write(frag, "if (opacity == 0.0) discard;"); - node_shader_write(frag, 'float str = clamp((brushRadius - dist) * brushHardness * 400.0, 0.0, 1.0) * opacity;'); + node_shader_write(frag, "float str = clamp((brushRadius - dist) * brushHardness * 400.0, 0.0, 1.0) * opacity;"); // Manual blending to preserve memory frag.wvpposition = true; - node_shader_write(frag, 'vec2 sample_tc = vec2(wvpposition.xy / wvpposition.w) * 0.5 + 0.5;'); + node_shader_write(frag, "vec2 sample_tc = vec2(wvpposition.xy / wvpposition.w) * 0.5 + 0.5;"); ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, 'sample_tc.y = 1.0 - sample_tc.y;'); + node_shader_write(frag, "sample_tc.y = 1.0 - sample_tc.y;"); ///end - node_shader_add_uniform(frag, 'sampler2D paintmask'); - node_shader_write(frag, 'float sample_mask = textureLod(paintmask, sample_tc, 0.0).r;'); - node_shader_write(frag, 'str = max(str, sample_mask);'); + node_shader_add_uniform(frag, "sampler2D paintmask"); + node_shader_write(frag, "float sample_mask = textureLod(paintmask, sample_tc, 0.0).r;"); + node_shader_write(frag, "str = max(str, sample_mask);"); - node_shader_add_uniform(frag, 'sampler2D texpaint_undo', '_texpaint_undo'); - node_shader_write(frag, 'vec4 sample_undo = textureLod(texpaint_undo, sample_tc, 0.0);'); + node_shader_add_uniform(frag, "sampler2D texpaint_undo", "_texpaint_undo"); + node_shader_write(frag, "vec4 sample_undo = textureLod(texpaint_undo, sample_tc, 0.0);"); if (context_raw.tool == workspace_tool_t.ERASER) { - // node_shader_write(frag, 'fragColor[0] = vec4(mix(sample_undo.rgb, vec3(0.0, 0.0, 0.0), str), sample_undo.a - str);'); - node_shader_write(frag, 'fragColor[0] = vec4(0.0, 0.0, 0.0, 0.0);'); - node_shader_write(frag, 'fragColor[1] = vec4(0.5, 0.5, 1.0, 0.0);'); - node_shader_write(frag, 'fragColor[2] = vec4(1.0, 0.0, 0.0, 0.0);'); + // node_shader_write(frag, "fragColor[0] = vec4(mix(sample_undo.rgb, vec3(0.0, 0.0, 0.0), str), sample_undo.a - str);"); + node_shader_write(frag, "fragColor[0] = vec4(0.0, 0.0, 0.0, 0.0);"); + node_shader_write(frag, "fragColor[1] = vec4(0.5, 0.5, 1.0, 0.0);"); + node_shader_write(frag, "fragColor[2] = vec4(1.0, 0.0, 0.0, 0.0);"); } - node_shader_write(frag, 'fragColor[3] = vec4(str, 0.0, 0.0, 1.0);'); + node_shader_write(frag, "fragColor[3] = vec4(str, 0.0, 0.0, 1.0);"); parser_material_finalize(con_paint); parser_material_sample_keep_aspect = false; diff --git a/armorlab/Sources/nodes_brush.ts b/armorlab/Sources/nodes_brush.ts index 667821de..32118504 100644 --- a/armorlab/Sources/nodes_brush.ts +++ b/armorlab/Sources/nodes_brush.ts @@ -1,11 +1,11 @@ -/// -/// -/// -/// -/// -/// -/// -/// +/// +/// +/// +/// +/// +/// +/// +/// let nodes_brush_categories: string[] = [_tr("Input"), _tr("Model")]; diff --git a/armorpaint/Sources/make_bake.ts b/armorpaint/Sources/make_bake.ts index 48feb51a..96e1436a 100644 --- a/armorpaint/Sources/make_bake.ts +++ b/armorpaint/Sources/make_bake.ts @@ -8,29 +8,29 @@ function make_bake_run(con: node_shader_context_t, vert: node_shader_t, frag: no frag.vvec = true; node_shader_add_function(frag, str_cotangent_frame); ///if krom_direct3d11 - node_shader_write(frag, 'mat3 TBN = cotangentFrame(n, vVec, texCoord);'); + node_shader_write(frag, "mat3 TBN = cotangentFrame(n, vVec, texCoord);"); ///else - node_shader_write(frag, 'mat3 TBN = cotangentFrame(n, -vVec, texCoord);'); + node_shader_write(frag, "mat3 TBN = cotangentFrame(n, -vVec, texCoord);"); ///end - node_shader_write(frag, 'n = nortan * 2.0 - 1.0;'); - node_shader_write(frag, 'n.y = -n.y;'); - node_shader_write(frag, 'n = normalize(mul(n, TBN));'); + node_shader_write(frag, "n = nortan * 2.0 - 1.0;"); + node_shader_write(frag, "n.y = -n.y;"); + node_shader_write(frag, "n = normalize(mul(n, TBN));"); node_shader_write(frag, make_material_voxelgi_half_extents()); - node_shader_write(frag, 'vec3 voxpos = wposition / voxelgiHalfExtents;'); - node_shader_add_uniform(frag, 'sampler3D voxels'); + node_shader_write(frag, "vec3 voxpos = wposition / voxelgiHalfExtents;"); + node_shader_add_uniform(frag, "sampler3D voxels"); node_shader_add_function(frag, str_trace_ao); frag.n = true; let strength: f32 = context_raw.bake_ao_strength; let radius: f32 = context_raw.bake_ao_radius; let offset: f32 = context_raw.bake_ao_offset; - node_shader_write(frag, `float ao = traceAO(voxpos, n, ${radius}, ${offset}) * ${strength};`); + node_shader_write(frag, "float ao = traceAO(voxpos, n, " + radius + ", " + offset + ") * " + strength + ";"); if (context_raw.bake_axis != bake_axis_t.XYZ) { let axis: string = make_bake_axis_string(context_raw.bake_axis); - node_shader_write(frag, `ao *= dot(n, ${axis});`); + node_shader_write(frag, "ao *= dot(n, " + axis + ");"); } - node_shader_write(frag, 'ao = 1.0 - ao;'); - node_shader_write(frag, 'fragColor[0] = vec4(ao, ao, ao, 1.0);'); + node_shader_write(frag, "ao = 1.0 - ao;"); + node_shader_write(frag, "fragColor[0] = vec4(ao, ao, ao, 1.0);"); ///end } else if (context_raw.bake_type == bake_type_t.CURVATURE) { @@ -38,100 +38,100 @@ function make_bake_run(con: node_shader_context_t, vert: node_shader_t, frag: no let strength: string = pass ? parser_material_bake_passthrough_strength : context_raw.bake_curv_strength + ""; let radius: string = pass ? parser_material_bake_passthrough_radius : context_raw.bake_curv_radius + ""; let offset: string = pass ? parser_material_bake_passthrough_offset : context_raw.bake_curv_offset + ""; - strength = `float(${strength})`; - radius = `float(${radius})`; - offset = `float(${offset})`; + strength = "float(" + strength + ")"; + radius = "float(" + radius + ")"; + offset = "float(" + offset + ")"; frag.n = true; - node_shader_write(frag, 'vec3 dx = dFdx(n);'); - node_shader_write(frag, 'vec3 dy = dFdy(n);'); - node_shader_write(frag, 'float curvature = max(dot(dx, dx), dot(dy, dy));'); - node_shader_write(frag, 'curvature = clamp(pow(curvature, (1.0 / ' + radius + ') * 0.25) * ' + strength + ' * 2.0 + ' + offset + ' / 10.0, 0.0, 1.0);'); + node_shader_write(frag, "vec3 dx = dFdx(n);"); + node_shader_write(frag, "vec3 dy = dFdy(n);"); + node_shader_write(frag, "float curvature = max(dot(dx, dx), dot(dy, dy));"); + node_shader_write(frag, "curvature = clamp(pow(curvature, (1.0 / " + radius + ") * 0.25) * " + strength + " * 2.0 + " + offset + " / 10.0, 0.0, 1.0);"); if (context_raw.bake_axis != bake_axis_t.XYZ) { let axis: string = make_bake_axis_string(context_raw.bake_axis); - node_shader_write(frag, `curvature *= dot(n, ${axis});`); + node_shader_write(frag, "curvature *= dot(n, " + axis + ");"); } - node_shader_write(frag, 'fragColor[0] = vec4(curvature, curvature, curvature, 1.0);'); + node_shader_write(frag, "fragColor[0] = vec4(curvature, curvature, curvature, 1.0);"); } else if (context_raw.bake_type == bake_type_t.NORMAL) { // Tangent frag.n = true; - node_shader_add_uniform(frag, 'sampler2D texpaint_undo', '_texpaint_undo'); // Baked high-poly normals - node_shader_write(frag, 'vec3 n0 = textureLod(texpaint_undo, texCoord, 0.0).rgb * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0);'); + node_shader_add_uniform(frag, "sampler2D texpaint_undo", "_texpaint_undo"); // Baked high-poly normals + node_shader_write(frag, "vec3 n0 = textureLod(texpaint_undo, texCoord, 0.0).rgb * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0);"); node_shader_add_function(frag, str_cotangent_frame); - node_shader_write(frag, 'mat3 invTBN = transpose(cotangentFrame(n, n, texCoord));'); - node_shader_write(frag, 'vec3 res = normalize(mul(n0, invTBN)) * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5);'); - node_shader_write(frag, 'fragColor[0] = vec4(res, 1.0);'); + node_shader_write(frag, "mat3 invTBN = transpose(cotangentFrame(n, n, texCoord));"); + node_shader_write(frag, "vec3 res = normalize(mul(n0, invTBN)) * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5);"); + node_shader_write(frag, "fragColor[0] = vec4(res, 1.0);"); } else if (context_raw.bake_type == bake_type_t.NORMAL_OBJECT) { frag.n = true; - node_shader_write(frag, 'fragColor[0] = vec4(n * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5), 1.0);'); + node_shader_write(frag, "fragColor[0] = vec4(n * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5), 1.0);"); if (context_raw.bake_up_axis == bake_up_axis_t.Y) { - node_shader_write(frag, 'fragColor[0].rgb = vec3(fragColor[0].r, fragColor[0].b, 1.0 - fragColor[0].g);'); + node_shader_write(frag, "fragColor[0].rgb = vec3(fragColor[0].r, fragColor[0].b, 1.0 - fragColor[0].g);"); } } else if (context_raw.bake_type == bake_type_t.HEIGHT) { frag.wposition = true; - node_shader_add_uniform(frag, 'sampler2D texpaint_undo', '_texpaint_undo'); // Baked high-poly positions - node_shader_write(frag, 'vec3 wpos0 = textureLod(texpaint_undo, texCoord, 0.0).rgb * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0);'); - node_shader_write(frag, 'float res = distance(wpos0, wposition) * 10.0;'); - node_shader_write(frag, 'fragColor[0] = vec4(res, res, res, 1.0);'); + node_shader_add_uniform(frag, "sampler2D texpaint_undo", "_texpaint_undo"); // Baked high-poly positions + node_shader_write(frag, "vec3 wpos0 = textureLod(texpaint_undo, texCoord, 0.0).rgb * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0);"); + node_shader_write(frag, "float res = distance(wpos0, wposition) * 10.0;"); + node_shader_write(frag, "fragColor[0] = vec4(res, res, res, 1.0);"); } else if (context_raw.bake_type == bake_type_t.DERIVATIVE) { - node_shader_add_uniform(frag, 'sampler2D texpaint_undo', '_texpaint_undo'); // Baked height - node_shader_write(frag, 'vec2 texDx = dFdx(texCoord);'); - node_shader_write(frag, 'vec2 texDy = dFdy(texCoord);'); - node_shader_write(frag, 'float h0 = textureLod(texpaint_undo, texCoord, 0.0).r * 100;'); - node_shader_write(frag, 'float h1 = textureLod(texpaint_undo, texCoord + texDx, 0.0).r * 100;'); - node_shader_write(frag, 'float h2 = textureLod(texpaint_undo, texCoord + texDy, 0.0).r * 100;'); - node_shader_write(frag, 'fragColor[0] = vec4((h1 - h0) * 0.5 + 0.5, (h2 - h0) * 0.5 + 0.5, 0.0, 1.0);'); + node_shader_add_uniform(frag, "sampler2D texpaint_undo", "_texpaint_undo"); // Baked height + node_shader_write(frag, "vec2 texDx = dFdx(texCoord);"); + node_shader_write(frag, "vec2 texDy = dFdy(texCoord);"); + node_shader_write(frag, "float h0 = textureLod(texpaint_undo, texCoord, 0.0).r * 100;"); + node_shader_write(frag, "float h1 = textureLod(texpaint_undo, texCoord + texDx, 0.0).r * 100;"); + node_shader_write(frag, "float h2 = textureLod(texpaint_undo, texCoord + texDy, 0.0).r * 100;"); + node_shader_write(frag, "fragColor[0] = vec4((h1 - h0) * 0.5 + 0.5, (h2 - h0) * 0.5 + 0.5, 0.0, 1.0);"); } else if (context_raw.bake_type == bake_type_t.POSITION) { frag.wposition = true; - node_shader_write(frag, 'fragColor[0] = vec4(wposition * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5), 1.0);'); + node_shader_write(frag, "fragColor[0] = vec4(wposition * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5), 1.0);"); if (context_raw.bake_up_axis == bake_up_axis_t.Y) { - node_shader_write(frag, 'fragColor[0].rgb = vec3(fragColor[0].r, fragColor[0].b, 1.0 - fragColor[0].g);'); + node_shader_write(frag, "fragColor[0].rgb = vec3(fragColor[0].r, fragColor[0].b, 1.0 - fragColor[0].g);"); } } else if (context_raw.bake_type == bake_type_t.TEXCOORD) { - node_shader_write(frag, 'fragColor[0] = vec4(texCoord.xy, 0.0, 1.0);'); + node_shader_write(frag, "fragColor[0] = vec4(texCoord.xy, 0.0, 1.0);"); } else if (context_raw.bake_type == bake_type_t.MATERIALID) { - node_shader_add_uniform(frag, 'sampler2D texpaint_nor_undo', '_texpaint_nor_undo'); - node_shader_write(frag, 'float sample_matid = textureLod(texpaint_nor_undo, texCoord, 0.0).a + 1.0 / 255.0;'); - node_shader_write(frag, 'float matid_r = fract(sin(dot(vec2(sample_matid, sample_matid * 20.0), vec2(12.9898, 78.233))) * 43758.5453);'); - node_shader_write(frag, 'float matid_g = fract(sin(dot(vec2(sample_matid * 20.0, sample_matid), vec2(12.9898, 78.233))) * 43758.5453);'); - node_shader_write(frag, 'float matid_b = fract(sin(dot(vec2(sample_matid, sample_matid * 40.0), vec2(12.9898, 78.233))) * 43758.5453);'); - node_shader_write(frag, 'fragColor[0] = vec4(matid_r, matid_g, matid_b, 1.0);'); + node_shader_add_uniform(frag, "sampler2D texpaint_nor_undo", "_texpaint_nor_undo"); + node_shader_write(frag, "float sample_matid = textureLod(texpaint_nor_undo, texCoord, 0.0).a + 1.0 / 255.0;"); + node_shader_write(frag, "float matid_r = fract(sin(dot(vec2(sample_matid, sample_matid * 20.0), vec2(12.9898, 78.233))) * 43758.5453);"); + node_shader_write(frag, "float matid_g = fract(sin(dot(vec2(sample_matid * 20.0, sample_matid), vec2(12.9898, 78.233))) * 43758.5453);"); + node_shader_write(frag, "float matid_b = fract(sin(dot(vec2(sample_matid, sample_matid * 40.0), vec2(12.9898, 78.233))) * 43758.5453);"); + node_shader_write(frag, "fragColor[0] = vec4(matid_r, matid_g, matid_b, 1.0);"); } else if (context_raw.bake_type == bake_type_t.OBJECTID) { - node_shader_add_uniform(frag, 'float objectId', '_objectId'); - node_shader_write(frag, 'float obid = objectId + 1.0 / 255.0;'); - node_shader_write(frag, 'float id_r = fract(sin(dot(vec2(obid, obid * 20.0), vec2(12.9898, 78.233))) * 43758.5453);'); - node_shader_write(frag, 'float id_g = fract(sin(dot(vec2(obid * 20.0, obid), vec2(12.9898, 78.233))) * 43758.5453);'); - node_shader_write(frag, 'float id_b = fract(sin(dot(vec2(obid, obid * 40.0), vec2(12.9898, 78.233))) * 43758.5453);'); - node_shader_write(frag, 'fragColor[0] = vec4(id_r, id_g, id_b, 1.0);'); + node_shader_add_uniform(frag, "float objectId", "_objectId"); + node_shader_write(frag, "float obid = objectId + 1.0 / 255.0;"); + node_shader_write(frag, "float id_r = fract(sin(dot(vec2(obid, obid * 20.0), vec2(12.9898, 78.233))) * 43758.5453);"); + node_shader_write(frag, "float id_g = fract(sin(dot(vec2(obid * 20.0, obid), vec2(12.9898, 78.233))) * 43758.5453);"); + node_shader_write(frag, "float id_b = fract(sin(dot(vec2(obid, obid * 40.0), vec2(12.9898, 78.233))) * 43758.5453);"); + node_shader_write(frag, "fragColor[0] = vec4(id_r, id_g, id_b, 1.0);"); } else if (context_raw.bake_type == bake_type_t.VERTEX_COLOR) { if (con.allow_vcols) { node_shader_context_add_elem(con, "col", "short4norm"); - node_shader_write(frag, 'fragColor[0] = vec4(vcolor.r, vcolor.g, vcolor.b, 1.0);'); + node_shader_write(frag, "fragColor[0] = vec4(vcolor.r, vcolor.g, vcolor.b, 1.0);"); } else { - node_shader_write(frag, 'fragColor[0] = vec4(1.0, 1.0, 1.0, 1.0);'); + node_shader_write(frag, "fragColor[0] = vec4(1.0, 1.0, 1.0, 1.0);"); } } } function make_bake_position_normal(vert: node_shader_t, frag: node_shader_t) { - node_shader_add_out(vert, 'vec3 position'); - node_shader_add_out(vert, 'vec3 normal'); - node_shader_add_uniform(vert, 'mat4 W', '_world_matrix'); - node_shader_write(vert, 'position = vec4(mul(vec4(pos.xyz, 1.0), W)).xyz;'); - node_shader_write(vert, 'normal = vec3(nor.xy, pos.w);'); - node_shader_write(vert, 'vec2 tpos = vec2(tex.x * 2.0 - 1.0, (1.0 - tex.y) * 2.0 - 1.0);'); - node_shader_write(vert, 'gl_Position = vec4(tpos, 0.0, 1.0);'); - node_shader_add_out(frag, 'vec4 fragColor[2]'); - node_shader_write(frag, 'fragColor[0] = vec4(position, 1.0);'); - node_shader_write(frag, 'fragColor[1] = vec4(normal, 1.0);'); + node_shader_add_out(vert, "vec3 position"); + node_shader_add_out(vert, "vec3 normal"); + node_shader_add_uniform(vert, "mat4 W", "_world_matrix"); + node_shader_write(vert, "position = vec4(mul(vec4(pos.xyz, 1.0), W)).xyz;"); + node_shader_write(vert, "normal = vec3(nor.xy, pos.w);"); + node_shader_write(vert, "vec2 tpos = vec2(tex.x * 2.0 - 1.0, (1.0 - tex.y) * 2.0 - 1.0);"); + node_shader_write(vert, "gl_Position = vec4(tpos, 0.0, 1.0);"); + node_shader_add_out(frag, "vec4 fragColor[2]"); + node_shader_write(frag, "fragColor[0] = vec4(position, 1.0);"); + node_shader_write(frag, "fragColor[1] = vec4(normal, 1.0);"); } function make_bake_set_color_writes(con_paint: node_shader_context_t) { diff --git a/armorpaint/Sources/make_blur.ts b/armorpaint/Sources/make_blur.ts index 1d2c8a1c..f790ae6d 100644 --- a/armorpaint/Sources/make_blur.ts +++ b/armorpaint/Sources/make_blur.ts @@ -1,89 +1,89 @@ function make_blur_run(vert: node_shader_t, frag: node_shader_t) { ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, 'vec2 texCoordInp = texelFetch(gbuffer2, ivec2(sp.x * gbufferSize.x, sp.y * gbufferSize.y), 0).ba;'); + node_shader_write(frag, "vec2 texCoordInp = texelFetch(gbuffer2, ivec2(sp.x * gbufferSize.x, sp.y * gbufferSize.y), 0).ba;"); ///else - node_shader_write(frag, 'vec2 texCoordInp = texelFetch(gbuffer2, ivec2(sp.x * gbufferSize.x, (1.0 - sp.y) * gbufferSize.y), 0).ba;'); + node_shader_write(frag, "vec2 texCoordInp = texelFetch(gbuffer2, ivec2(sp.x * gbufferSize.x, (1.0 - sp.y) * gbufferSize.y), 0).ba;"); ///end - node_shader_write(frag, 'vec3 basecol = vec3(0.0, 0.0, 0.0);'); - node_shader_write(frag, 'float roughness = 0.0;'); - node_shader_write(frag, 'float metallic = 0.0;'); - node_shader_write(frag, 'float occlusion = 0.0;'); - node_shader_write(frag, 'vec3 nortan = vec3(0.0, 0.0, 0.0);'); - node_shader_write(frag, 'float height = 0.0;'); - node_shader_write(frag, 'float mat_opacity = 1.0;'); + node_shader_write(frag, "vec3 basecol = vec3(0.0, 0.0, 0.0);"); + node_shader_write(frag, "float roughness = 0.0;"); + node_shader_write(frag, "float metallic = 0.0;"); + node_shader_write(frag, "float occlusion = 0.0;"); + node_shader_write(frag, "vec3 nortan = vec3(0.0, 0.0, 0.0);"); + node_shader_write(frag, "float height = 0.0;"); + node_shader_write(frag, "float mat_opacity = 1.0;"); let is_mask: bool = slot_layer_is_mask(context_raw.layer); if (is_mask) { - node_shader_write(frag, 'float opacity = 1.0;'); + node_shader_write(frag, "float opacity = 1.0;"); } else { - node_shader_write(frag, 'float opacity = 0.0;'); + node_shader_write(frag, "float opacity = 0.0;"); } if (context_raw.material.paint_emis) { - node_shader_write(frag, 'float emis = 0.0;'); + node_shader_write(frag, "float emis = 0.0;"); } if (context_raw.material.paint_subs) { - node_shader_write(frag, 'float subs = 0.0;'); + node_shader_write(frag, "float subs = 0.0;"); } - node_shader_add_uniform(frag, 'vec2 texpaintSize', '_texpaintSize'); - node_shader_write(frag, 'float blur_step = 1.0 / texpaintSize.x;'); + node_shader_add_uniform(frag, "vec2 texpaintSize", "_texpaintSize"); + node_shader_write(frag, "float blur_step = 1.0 / texpaintSize.x;"); if (context_raw.tool == workspace_tool_t.SMUDGE) { ///if (krom_direct3d11 || krom_direct3d12 || krom_metal) - node_shader_write(frag, 'const float blur_weight[7] = {1.0 / 28.0, 2.0 / 28.0, 3.0 / 28.0, 4.0 / 28.0, 5.0 / 28.0, 6.0 / 28.0, 7.0 / 28.0};'); + node_shader_write(frag, "const float blur_weight[7] = {1.0 / 28.0, 2.0 / 28.0, 3.0 / 28.0, 4.0 / 28.0, 5.0 / 28.0, 6.0 / 28.0, 7.0 / 28.0};"); ///else - node_shader_write(frag, 'const float blur_weight[7] = float[](1.0 / 28.0, 2.0 / 28.0, 3.0 / 28.0, 4.0 / 28.0, 5.0 / 28.0, 6.0 / 28.0, 7.0 / 28.0);'); + node_shader_write(frag, "const float blur_weight[7] = float[](1.0 / 28.0, 2.0 / 28.0, 3.0 / 28.0, 4.0 / 28.0, 5.0 / 28.0, 6.0 / 28.0, 7.0 / 28.0);"); ///end - node_shader_add_uniform(frag, 'vec3 brushDirection', '_brushDirection'); - node_shader_write(frag, 'vec2 blur_direction = brushDirection.yx;'); - node_shader_write(frag, 'for (int i = 0; i < 7; ++i) {'); + node_shader_add_uniform(frag, "vec3 brushDirection", "_brushDirection"); + node_shader_write(frag, "vec2 blur_direction = brushDirection.yx;"); + node_shader_write(frag, "for (int i = 0; i < 7; ++i) {"); ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, 'vec2 texCoordInp2 = texelFetch(gbuffer2, ivec2((sp.x + blur_direction.x * blur_step * float(i)) * gbufferSize.x, (sp.y + blur_direction.y * blur_step * float(i)) * gbufferSize.y), 0).ba;'); + node_shader_write(frag, "vec2 texCoordInp2 = texelFetch(gbuffer2, ivec2((sp.x + blur_direction.x * blur_step * float(i)) * gbufferSize.x, (sp.y + blur_direction.y * blur_step * float(i)) * gbufferSize.y), 0).ba;"); ///else - node_shader_write(frag, 'vec2 texCoordInp2 = texelFetch(gbuffer2, ivec2((sp.x + blur_direction.x * blur_step * float(i)) * gbufferSize.x, (1.0 - (sp.y + blur_direction.y * blur_step * float(i))) * gbufferSize.y), 0).ba;'); + node_shader_write(frag, "vec2 texCoordInp2 = texelFetch(gbuffer2, ivec2((sp.x + blur_direction.x * blur_step * float(i)) * gbufferSize.x, (1.0 - (sp.y + blur_direction.y * blur_step * float(i))) * gbufferSize.y), 0).ba;"); ///end - node_shader_write(frag, 'vec4 texpaint_sample = texture(texpaint_undo, texCoordInp2);'); - node_shader_write(frag, 'opacity += texpaint_sample.a * blur_weight[i];'); - node_shader_write(frag, 'basecol += texpaint_sample.rgb * blur_weight[i];'); - node_shader_write(frag, 'vec4 texpaint_pack_sample = texture(texpaint_pack_undo, texCoordInp2) * blur_weight[i];'); - node_shader_write(frag, 'roughness += texpaint_pack_sample.g;'); - node_shader_write(frag, 'metallic += texpaint_pack_sample.b;'); - node_shader_write(frag, 'occlusion += texpaint_pack_sample.r;'); - node_shader_write(frag, 'height += texpaint_pack_sample.a;'); - node_shader_write(frag, 'nortan += texture(texpaint_nor_undo, texCoordInp2).rgb * blur_weight[i];'); - node_shader_write(frag, '}'); + node_shader_write(frag, "vec4 texpaint_sample = texture(texpaint_undo, texCoordInp2);"); + node_shader_write(frag, "opacity += texpaint_sample.a * blur_weight[i];"); + node_shader_write(frag, "basecol += texpaint_sample.rgb * blur_weight[i];"); + node_shader_write(frag, "vec4 texpaint_pack_sample = texture(texpaint_pack_undo, texCoordInp2) * blur_weight[i];"); + node_shader_write(frag, "roughness += texpaint_pack_sample.g;"); + node_shader_write(frag, "metallic += texpaint_pack_sample.b;"); + node_shader_write(frag, "occlusion += texpaint_pack_sample.r;"); + node_shader_write(frag, "height += texpaint_pack_sample.a;"); + node_shader_write(frag, "nortan += texture(texpaint_nor_undo, texCoordInp2).rgb * blur_weight[i];"); + node_shader_write(frag, "}"); } else { ///if (krom_direct3d11 || krom_direct3d12 || krom_metal) - node_shader_write(frag, 'const float blur_weight[15] = {0.034619 / 2.0, 0.044859 / 2.0, 0.055857 / 2.0, 0.066833 / 2.0, 0.076841 / 2.0, 0.084894 / 2.0, 0.090126 / 2.0, 0.09194 / 2.0, 0.090126 / 2.0, 0.084894 / 2.0, 0.076841 / 2.0, 0.066833 / 2.0, 0.055857 / 2.0, 0.044859 / 2.0, 0.034619 / 2.0};'); + node_shader_write(frag, "const float blur_weight[15] = {0.034619 / 2.0, 0.044859 / 2.0, 0.055857 / 2.0, 0.066833 / 2.0, 0.076841 / 2.0, 0.084894 / 2.0, 0.090126 / 2.0, 0.09194 / 2.0, 0.090126 / 2.0, 0.084894 / 2.0, 0.076841 / 2.0, 0.066833 / 2.0, 0.055857 / 2.0, 0.044859 / 2.0, 0.034619 / 2.0};"); ///else - node_shader_write(frag, 'const float blur_weight[15] = float[](0.034619 / 2.0, 0.044859 / 2.0, 0.055857 / 2.0, 0.066833 / 2.0, 0.076841 / 2.0, 0.084894 / 2.0, 0.090126 / 2.0, 0.09194 / 2.0, 0.090126 / 2.0, 0.084894 / 2.0, 0.076841 / 2.0, 0.066833 / 2.0, 0.055857 / 2.0, 0.044859 / 2.0, 0.034619 / 2.0);'); + node_shader_write(frag, "const float blur_weight[15] = float[](0.034619 / 2.0, 0.044859 / 2.0, 0.055857 / 2.0, 0.066833 / 2.0, 0.076841 / 2.0, 0.084894 / 2.0, 0.090126 / 2.0, 0.09194 / 2.0, 0.090126 / 2.0, 0.084894 / 2.0, 0.076841 / 2.0, 0.066833 / 2.0, 0.055857 / 2.0, 0.044859 / 2.0, 0.034619 / 2.0);"); ///end // X - node_shader_write(frag, 'for (int i = -7; i <= 7; ++i) {'); - node_shader_write(frag, 'vec4 texpaint_sample = texture(texpaint_undo, texCoordInp + vec2(blur_step * float(i), 0.0));'); - node_shader_write(frag, 'opacity += texpaint_sample.a * blur_weight[i + 7];'); - node_shader_write(frag, 'basecol += texpaint_sample.rgb * blur_weight[i + 7];'); - node_shader_write(frag, 'vec4 texpaint_pack_sample = texture(texpaint_pack_undo, texCoordInp + vec2(blur_step * float(i), 0.0)) * blur_weight[i + 7];'); - node_shader_write(frag, 'roughness += texpaint_pack_sample.g;'); - node_shader_write(frag, 'metallic += texpaint_pack_sample.b;'); - node_shader_write(frag, 'occlusion += texpaint_pack_sample.r;'); - node_shader_write(frag, 'height += texpaint_pack_sample.a;'); - node_shader_write(frag, 'nortan += texture(texpaint_nor_undo, texCoordInp + vec2(blur_step * float(i), 0.0)).rgb * blur_weight[i + 7];'); - node_shader_write(frag, '}'); + node_shader_write(frag, "for (int i = -7; i <= 7; ++i) {"); + node_shader_write(frag, "vec4 texpaint_sample = texture(texpaint_undo, texCoordInp + vec2(blur_step * float(i), 0.0));"); + node_shader_write(frag, "opacity += texpaint_sample.a * blur_weight[i + 7];"); + node_shader_write(frag, "basecol += texpaint_sample.rgb * blur_weight[i + 7];"); + node_shader_write(frag, "vec4 texpaint_pack_sample = texture(texpaint_pack_undo, texCoordInp + vec2(blur_step * float(i), 0.0)) * blur_weight[i + 7];"); + node_shader_write(frag, "roughness += texpaint_pack_sample.g;"); + node_shader_write(frag, "metallic += texpaint_pack_sample.b;"); + node_shader_write(frag, "occlusion += texpaint_pack_sample.r;"); + node_shader_write(frag, "height += texpaint_pack_sample.a;"); + node_shader_write(frag, "nortan += texture(texpaint_nor_undo, texCoordInp + vec2(blur_step * float(i), 0.0)).rgb * blur_weight[i + 7];"); + node_shader_write(frag, "}"); // Y - node_shader_write(frag, 'for (int j = -7; j <= 7; ++j) {'); - node_shader_write(frag, 'vec4 texpaint_sample = texture(texpaint_undo, texCoordInp + vec2(0.0, blur_step * float(j)));'); - node_shader_write(frag, 'opacity += texpaint_sample.a * blur_weight[j + 7];'); - node_shader_write(frag, 'basecol += texpaint_sample.rgb * blur_weight[j + 7];'); - node_shader_write(frag, 'vec4 texpaint_pack_sample = texture(texpaint_pack_undo, texCoordInp + vec2(0.0, blur_step * float(j))) * blur_weight[j + 7];'); - node_shader_write(frag, 'roughness += texpaint_pack_sample.g;'); - node_shader_write(frag, 'metallic += texpaint_pack_sample.b;'); - node_shader_write(frag, 'occlusion += texpaint_pack_sample.r;'); - node_shader_write(frag, 'height += texpaint_pack_sample.a;'); - node_shader_write(frag, 'nortan += texture(texpaint_nor_undo, texCoordInp + vec2(0.0, blur_step * float(j))).rgb * blur_weight[j + 7];'); - node_shader_write(frag, '}'); + node_shader_write(frag, "for (int j = -7; j <= 7; ++j) {"); + node_shader_write(frag, "vec4 texpaint_sample = texture(texpaint_undo, texCoordInp + vec2(0.0, blur_step * float(j)));"); + node_shader_write(frag, "opacity += texpaint_sample.a * blur_weight[j + 7];"); + node_shader_write(frag, "basecol += texpaint_sample.rgb * blur_weight[j + 7];"); + node_shader_write(frag, "vec4 texpaint_pack_sample = texture(texpaint_pack_undo, texCoordInp + vec2(0.0, blur_step * float(j))) * blur_weight[j + 7];"); + node_shader_write(frag, "roughness += texpaint_pack_sample.g;"); + node_shader_write(frag, "metallic += texpaint_pack_sample.b;"); + node_shader_write(frag, "occlusion += texpaint_pack_sample.r;"); + node_shader_write(frag, "height += texpaint_pack_sample.a;"); + node_shader_write(frag, "nortan += texture(texpaint_nor_undo, texCoordInp + vec2(0.0, blur_step * float(j))).rgb * blur_weight[j + 7];"); + node_shader_write(frag, "}"); } - node_shader_write(frag, 'opacity *= brushOpacity;'); + node_shader_write(frag, "opacity *= brushOpacity;"); } diff --git a/armorpaint/Sources/make_brush.ts b/armorpaint/Sources/make_brush.ts index 0657bdbc..b2b8a955 100644 --- a/armorpaint/Sources/make_brush.ts +++ b/armorpaint/Sources/make_brush.ts @@ -1,7 +1,7 @@ function make_brush_run(vert: node_shader_t, frag: node_shader_t) { - node_shader_write(frag, 'float dist = 0.0;'); + node_shader_write(frag, "float dist = 0.0;"); if (context_raw.tool == workspace_tool_t.PARTICLE) { return; @@ -10,88 +10,88 @@ function make_brush_run(vert: node_shader_t, frag: node_shader_t) { let fill_layer: bool = context_raw.layer.fill_layer != null; let decal: bool = context_raw.tool == workspace_tool_t.DECAL || context_raw.tool == workspace_tool_t.TEXT; if (decal && !fill_layer) { - node_shader_write(frag, 'if (decalMask.z > 0.0) {'); + node_shader_write(frag, "if (decalMask.z > 0.0) {"); } if (config_raw.brush_3d) { ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, 'float depth = textureLod(gbufferD, inp.xy, 0.0).r;'); + node_shader_write(frag, "float depth = textureLod(gbufferD, inp.xy, 0.0).r;"); ///else - node_shader_write(frag, 'float depth = textureLod(gbufferD, vec2(inp.x, 1.0 - inp.y), 0.0).r;'); + node_shader_write(frag, "float depth = textureLod(gbufferD, vec2(inp.x, 1.0 - inp.y), 0.0).r;"); ///end - node_shader_add_uniform(frag, 'mat4 invVP', '_inv_view_proj_matrix'); - node_shader_write(frag, 'vec4 winp = vec4(vec2(inp.x, 1.0 - inp.y) * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0);'); - node_shader_write(frag, 'winp = mul(winp, invVP);'); - node_shader_write(frag, 'winp.xyz /= winp.w;'); + node_shader_add_uniform(frag, "mat4 invVP", "_inv_view_proj_matrix"); + node_shader_write(frag, "vec4 winp = vec4(vec2(inp.x, 1.0 - inp.y) * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0);"); + node_shader_write(frag, "winp = mul(winp, invVP);"); + node_shader_write(frag, "winp.xyz /= winp.w;"); frag.wposition = true; if (config_raw.brush_angle_reject || context_raw.xray) { node_shader_add_function(frag, str_octahedron_wrap); - node_shader_add_uniform(frag, 'sampler2D gbuffer0'); + node_shader_add_uniform(frag, "sampler2D gbuffer0"); ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, 'vec2 g0 = textureLod(gbuffer0, inp.xy, 0.0).rg;'); + node_shader_write(frag, "vec2 g0 = textureLod(gbuffer0, inp.xy, 0.0).rg;"); ///else - node_shader_write(frag, 'vec2 g0 = textureLod(gbuffer0, vec2(inp.x, 1.0 - inp.y), 0.0).rg;'); + node_shader_write(frag, "vec2 g0 = textureLod(gbuffer0, vec2(inp.x, 1.0 - inp.y), 0.0).rg;"); ///end - node_shader_write(frag, 'vec3 wn;'); - node_shader_write(frag, 'wn.z = 1.0 - abs(g0.x) - abs(g0.y);'); - node_shader_write(frag, 'wn.xy = wn.z >= 0.0 ? g0.xy : octahedronWrap(g0.xy);'); - node_shader_write(frag, 'wn = normalize(wn);'); - node_shader_write(frag, 'float planeDist = dot(wn, winp.xyz - wposition);'); + node_shader_write(frag, "vec3 wn;"); + node_shader_write(frag, "wn.z = 1.0 - abs(g0.x) - abs(g0.y);"); + node_shader_write(frag, "wn.xy = wn.z >= 0.0 ? g0.xy : octahedronWrap(g0.xy);"); + node_shader_write(frag, "wn = normalize(wn);"); + node_shader_write(frag, "float planeDist = dot(wn, winp.xyz - wposition);"); if (config_raw.brush_angle_reject && !context_raw.xray) { - node_shader_write(frag, 'if (planeDist < -0.01) discard;'); + node_shader_write(frag, "if (planeDist < -0.01) discard;"); frag.n = true; let angle: f32 = context_raw.brush_angle_reject_dot; - node_shader_write(frag, `if (dot(wn, n) < ${angle}) discard;`); + node_shader_write(frag, "if (dot(wn, n) < " + angle + ") discard;"); } } ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, 'float depthlast = textureLod(gbufferD, inplast.xy, 0.0).r;'); + node_shader_write(frag, "float depthlast = textureLod(gbufferD, inplast.xy, 0.0).r;"); ///else - node_shader_write(frag, 'float depthlast = textureLod(gbufferD, vec2(inplast.x, 1.0 - inplast.y), 0.0).r;'); + node_shader_write(frag, "float depthlast = textureLod(gbufferD, vec2(inplast.x, 1.0 - inplast.y), 0.0).r;"); ///end - node_shader_write(frag, 'vec4 winplast = vec4(vec2(inplast.x, 1.0 - inplast.y) * 2.0 - 1.0, depthlast * 2.0 - 1.0, 1.0);'); - node_shader_write(frag, 'winplast = mul(winplast, invVP);'); - node_shader_write(frag, 'winplast.xyz /= winplast.w;'); + node_shader_write(frag, "vec4 winplast = vec4(vec2(inplast.x, 1.0 - inplast.y) * 2.0 - 1.0, depthlast * 2.0 - 1.0, 1.0);"); + node_shader_write(frag, "winplast = mul(winplast, invVP);"); + node_shader_write(frag, "winplast.xyz /= winplast.w;"); - node_shader_write(frag, 'vec3 pa = wposition - winp.xyz;'); + node_shader_write(frag, "vec3 pa = wposition - winp.xyz;"); if (context_raw.xray) { - node_shader_write(frag, 'pa += wn * vec3(planeDist, planeDist, planeDist);'); + node_shader_write(frag, "pa += wn * vec3(planeDist, planeDist, planeDist);"); } - node_shader_write(frag, 'vec3 ba = winplast.xyz - winp.xyz;'); + node_shader_write(frag, "vec3 ba = winplast.xyz - winp.xyz;"); if (context_raw.brush_lazy_radius > 0 && context_raw.brush_lazy_step > 0) { // Sphere - node_shader_write(frag, 'dist = distance(wposition, winp.xyz);'); + node_shader_write(frag, "dist = distance(wposition, winp.xyz);"); } else { // Capsule - node_shader_write(frag, 'float h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);'); - node_shader_write(frag, 'dist = length(pa - ba * h);'); + node_shader_write(frag, "float h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);"); + node_shader_write(frag, "dist = length(pa - ba * h);"); } } else { // !brush3d - node_shader_write(frag, 'vec2 binp = inp.xy * 2.0 - 1.0;'); - node_shader_write(frag, 'binp.x *= aspectRatio;'); - node_shader_write(frag, 'binp = binp * 0.5 + 0.5;'); + node_shader_write(frag, "vec2 binp = inp.xy * 2.0 - 1.0;"); + node_shader_write(frag, "binp.x *= aspectRatio;"); + node_shader_write(frag, "binp = binp * 0.5 + 0.5;"); - node_shader_write(frag, 'vec2 binplast = inplast.xy * 2.0 - 1.0;'); - node_shader_write(frag, 'binplast.x *= aspectRatio;'); - node_shader_write(frag, 'binplast = binplast * 0.5 + 0.5;'); + node_shader_write(frag, "vec2 binplast = inplast.xy * 2.0 - 1.0;"); + node_shader_write(frag, "binplast.x *= aspectRatio;"); + node_shader_write(frag, "binplast = binplast * 0.5 + 0.5;"); - node_shader_write(frag, 'vec2 pa = bsp.xy - binp.xy;'); - node_shader_write(frag, 'vec2 ba = binplast.xy - binp.xy;'); - node_shader_write(frag, 'float h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);'); - node_shader_write(frag, 'dist = length(pa - ba * h);'); + node_shader_write(frag, "vec2 pa = bsp.xy - binp.xy;"); + node_shader_write(frag, "vec2 ba = binplast.xy - binp.xy;"); + node_shader_write(frag, "float h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);"); + node_shader_write(frag, "dist = length(pa - ba * h);"); } - node_shader_write(frag, 'if (dist > brushRadius) discard;'); + node_shader_write(frag, "if (dist > brushRadius) discard;"); if (decal && !fill_layer) { - node_shader_write(frag, '}'); + node_shader_write(frag, "}"); } } diff --git a/armorpaint/Sources/make_clone.ts b/armorpaint/Sources/make_clone.ts index 3d1144a7..1e17ab6c 100644 --- a/armorpaint/Sources/make_clone.ts +++ b/armorpaint/Sources/make_clone.ts @@ -1,32 +1,32 @@ function make_clone_run(vert: node_shader_t, frag: node_shader_t) { - node_shader_add_uniform(frag, 'vec2 cloneDelta', '_cloneDelta'); + node_shader_add_uniform(frag, "vec2 cloneDelta", "_cloneDelta"); ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, 'vec2 texCoordInp = texelFetch(gbuffer2, ivec2((sp.xy + cloneDelta) * gbufferSize), 0).ba;'); + node_shader_write(frag, "vec2 texCoordInp = texelFetch(gbuffer2, ivec2((sp.xy + cloneDelta) * gbufferSize), 0).ba;"); ///else - node_shader_write(frag, 'vec2 texCoordInp = texelFetch(gbuffer2, ivec2((sp.x + cloneDelta.x) * gbufferSize.x, (1.0 - (sp.y + cloneDelta.y)) * gbufferSize.y), 0).ba;'); + node_shader_write(frag, "vec2 texCoordInp = texelFetch(gbuffer2, ivec2((sp.x + cloneDelta.x) * gbufferSize.x, (1.0 - (sp.y + cloneDelta.y)) * gbufferSize.y), 0).ba;"); ///end - node_shader_write(frag, 'vec3 texpaint_pack_sample = textureLod(texpaint_pack_undo, texCoordInp, 0.0).rgb;'); - let base: string = 'textureLod(texpaint_undo, texCoordInp, 0.0).rgb'; - let rough: string = 'texpaint_pack_sample.g'; - let met: string = 'texpaint_pack_sample.b'; - let occ: string = 'texpaint_pack_sample.r'; - let nortan: string = 'textureLod(texpaint_nor_undo, texCoordInp, 0.0).rgb'; - let height: string = '0.0'; - let opac: string = '1.0'; - node_shader_write(frag, `vec3 basecol = ${base};`); - node_shader_write(frag, `float roughness = ${rough};`); - node_shader_write(frag, `float metallic = ${met};`); - node_shader_write(frag, `float occlusion = ${occ};`); - node_shader_write(frag, `vec3 nortan = ${nortan};`); - node_shader_write(frag, `float height = ${height};`); - node_shader_write(frag, `float mat_opacity = ${opac};`); - node_shader_write(frag, 'float opacity = mat_opacity * brushOpacity;'); + node_shader_write(frag, "vec3 texpaint_pack_sample = textureLod(texpaint_pack_undo, texCoordInp, 0.0).rgb;"); + let base: string = "textureLod(texpaint_undo, texCoordInp, 0.0).rgb"; + let rough: string = "texpaint_pack_sample.g"; + let met: string = "texpaint_pack_sample.b"; + let occ: string = "texpaint_pack_sample.r"; + let nortan: string = "textureLod(texpaint_nor_undo, texCoordInp, 0.0).rgb"; + let height: string = "0.0"; + let opac: string = "1.0"; + node_shader_write(frag, "vec3 basecol = " + base + ";"); + node_shader_write(frag, "float roughness = " + rough + ";"); + node_shader_write(frag, "float metallic = " + met + ";"); + node_shader_write(frag, "float occlusion = " + occ + ";"); + node_shader_write(frag, "vec3 nortan = " + nortan + ";"); + node_shader_write(frag, "float height = " + height + ";"); + node_shader_write(frag, "float mat_opacity = " + opac + ";"); + node_shader_write(frag, "float opacity = mat_opacity * brushOpacity;"); if (context_raw.material.paint_emis) { - node_shader_write(frag, 'float emis = 0.0;'); + node_shader_write(frag, "float emis = 0.0;"); } if (context_raw.material.paint_subs) { - node_shader_write(frag, 'float subs = 0.0;'); + node_shader_write(frag, "float subs = 0.0;"); } } diff --git a/armorpaint/Sources/make_colorid_picker.ts b/armorpaint/Sources/make_colorid_picker.ts index 76d2f8d8..97fc4709 100644 --- a/armorpaint/Sources/make_colorid_picker.ts +++ b/armorpaint/Sources/make_colorid_picker.ts @@ -1,43 +1,43 @@ function make_colorid_picker_run(vert: node_shader_t, frag: node_shader_t) { // Mangle vertices to form full screen triangle - node_shader_write(vert, 'gl_Position = vec4(-1.0 + float((gl_VertexID & 1) << 2), -1.0 + float((gl_VertexID & 2) << 1), 0.0, 1.0);'); + node_shader_write(vert, "gl_Position = vec4(-1.0 + float((gl_VertexID & 1) << 2), -1.0 + float((gl_VertexID & 2) << 1), 0.0, 1.0);"); - node_shader_add_uniform(frag, 'sampler2D gbuffer2'); - node_shader_add_uniform(frag, 'vec2 gbufferSize', '_gbufferSize'); - node_shader_add_uniform(frag, 'vec4 inp', '_inputBrush'); + node_shader_add_uniform(frag, "sampler2D gbuffer2"); + node_shader_add_uniform(frag, "vec2 gbufferSize", "_gbufferSize"); + node_shader_add_uniform(frag, "vec4 inp", "_inputBrush"); ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, 'vec2 texCoordInp = texelFetch(gbuffer2, ivec2(inp.x * gbufferSize.x, inp.y * gbufferSize.y), 0).ba;'); + node_shader_write(frag, "vec2 texCoordInp = texelFetch(gbuffer2, ivec2(inp.x * gbufferSize.x, inp.y * gbufferSize.y), 0).ba;"); ///else - node_shader_write(frag, 'vec2 texCoordInp = texelFetch(gbuffer2, ivec2(inp.x * gbufferSize.x, (1.0 - inp.y) * gbufferSize.y), 0).ba;'); + node_shader_write(frag, "vec2 texCoordInp = texelFetch(gbuffer2, ivec2(inp.x * gbufferSize.x, (1.0 - inp.y) * gbufferSize.y), 0).ba;"); ///end if (context_raw.tool == workspace_tool_t.COLORID) { - node_shader_add_out(frag, 'vec4 fragColor'); - node_shader_add_uniform(frag, 'sampler2D texcolorid', '_texcolorid'); - node_shader_write(frag, 'vec3 idcol = textureLod(texcolorid, texCoordInp, 0.0).rgb;'); - node_shader_write(frag, 'fragColor = vec4(idcol, 1.0);'); + node_shader_add_out(frag, "vec4 fragColor"); + node_shader_add_uniform(frag, "sampler2D texcolorid", "_texcolorid"); + node_shader_write(frag, "vec3 idcol = textureLod(texcolorid, texCoordInp, 0.0).rgb;"); + node_shader_write(frag, "fragColor = vec4(idcol, 1.0);"); } else if (context_raw.tool == workspace_tool_t.PICKER || context_raw.tool == workspace_tool_t.MATERIAL) { if (context_raw.pick_pos_nor_tex) { - node_shader_add_out(frag, 'vec4 fragColor[2]'); - node_shader_add_uniform(frag, 'sampler2D gbufferD'); - node_shader_add_uniform(frag, 'mat4 invVP', '_inv_view_proj_matrix'); + node_shader_add_out(frag, "vec4 fragColor[2]"); + node_shader_add_uniform(frag, "sampler2D gbufferD"); + node_shader_add_uniform(frag, "mat4 invVP", "_inv_view_proj_matrix"); node_shader_add_function(frag, str_get_pos_from_depth); node_shader_add_function(frag, str_get_nor_from_depth); - node_shader_write(frag, 'fragColor[0] = vec4(get_pos_from_depth(vec2(inp.x, 1.0 - inp.y), invVP, texturePass(gbufferD)), texCoordInp.x);'); - node_shader_write(frag, 'fragColor[1] = vec4(get_nor_from_depth(fragColor[0].rgb, vec2(inp.x, 1.0 - inp.y), invVP, vec2(1.0, 1.0) / gbufferSize, texturePass(gbufferD)), texCoordInp.y);'); + node_shader_write(frag, "fragColor[0] = vec4(get_pos_from_depth(vec2(inp.x, 1.0 - inp.y), invVP, texturePass(gbufferD)), texCoordInp.x);"); + node_shader_write(frag, "fragColor[1] = vec4(get_nor_from_depth(fragColor[0].rgb, vec2(inp.x, 1.0 - inp.y), invVP, vec2(1.0, 1.0) / gbufferSize, texturePass(gbufferD)), texCoordInp.y);"); } else { - node_shader_add_out(frag, 'vec4 fragColor[4]'); - node_shader_add_uniform(frag, 'sampler2D texpaint'); - node_shader_add_uniform(frag, 'sampler2D texpaint_nor'); - node_shader_add_uniform(frag, 'sampler2D texpaint_pack'); - node_shader_write(frag, 'fragColor[0] = textureLod(texpaint, texCoordInp, 0.0);'); - node_shader_write(frag, 'fragColor[1] = textureLod(texpaint_nor, texCoordInp, 0.0);'); - node_shader_write(frag, 'fragColor[2] = textureLod(texpaint_pack, texCoordInp, 0.0);'); - node_shader_write(frag, 'fragColor[3].rg = texCoordInp.xy;'); + node_shader_add_out(frag, "vec4 fragColor[4]"); + node_shader_add_uniform(frag, "sampler2D texpaint"); + node_shader_add_uniform(frag, "sampler2D texpaint_nor"); + node_shader_add_uniform(frag, "sampler2D texpaint_pack"); + node_shader_write(frag, "fragColor[0] = textureLod(texpaint, texCoordInp, 0.0);"); + node_shader_write(frag, "fragColor[1] = textureLod(texpaint_nor, texCoordInp, 0.0);"); + node_shader_write(frag, "fragColor[2] = textureLod(texpaint_pack, texCoordInp, 0.0);"); + node_shader_write(frag, "fragColor[3].rg = texCoordInp.xy;"); } } } diff --git a/armorpaint/Sources/make_discard.ts b/armorpaint/Sources/make_discard.ts index 597766a5..dcef2400 100644 --- a/armorpaint/Sources/make_discard.ts +++ b/armorpaint/Sources/make_discard.ts @@ -1,47 +1,47 @@ function make_discard_color_id(vert: node_shader_t, frag: node_shader_t) { - node_shader_add_uniform(frag, 'sampler2D texpaint_colorid'); // 1x1 picker - node_shader_add_uniform(frag, 'sampler2D texcolorid', '_texcolorid'); // color map - node_shader_write(frag, 'vec3 colorid_c1 = texelFetch(texpaint_colorid, ivec2(0, 0), 0).rgb;'); - node_shader_write(frag, 'vec3 colorid_c2 = textureLod(texcolorid, texCoordPick, 0).rgb;'); + node_shader_add_uniform(frag, "sampler2D texpaint_colorid"); // 1x1 picker + node_shader_add_uniform(frag, "sampler2D texcolorid", "_texcolorid"); // color map + node_shader_write(frag, "vec3 colorid_c1 = texelFetch(texpaint_colorid, ivec2(0, 0), 0).rgb;"); + node_shader_write(frag, "vec3 colorid_c2 = textureLod(texcolorid, texCoordPick, 0).rgb;"); ///if (krom_direct3d11 || krom_direct3d12 || krom_metal) - node_shader_write(frag, 'if (any(colorid_c1 != colorid_c2)) discard;'); + node_shader_write(frag, "if (any(colorid_c1 != colorid_c2)) discard;"); ///else - node_shader_write(frag, 'if (colorid_c1 != colorid_c2) discard;'); + node_shader_write(frag, "if (colorid_c1 != colorid_c2) discard;"); ///end } function make_discard_face(vert: node_shader_t, frag: node_shader_t) { - node_shader_add_uniform(frag, 'sampler2D gbuffer2'); - node_shader_add_uniform(frag, 'sampler2D textrianglemap', '_textrianglemap'); - node_shader_add_uniform(frag, 'vec2 textrianglemapSize', '_texpaintSize'); - node_shader_add_uniform(frag, 'vec2 gbufferSize', '_gbufferSize'); + node_shader_add_uniform(frag, "sampler2D gbuffer2"); + node_shader_add_uniform(frag, "sampler2D textrianglemap", "_textrianglemap"); + node_shader_add_uniform(frag, "vec2 textrianglemapSize", "_texpaintSize"); + node_shader_add_uniform(frag, "vec2 gbufferSize", "_gbufferSize"); ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, 'vec2 texCoordInp = texelFetch(gbuffer2, ivec2(inp.x * gbufferSize.x, inp.y * gbufferSize.y), 0).ba;'); + node_shader_write(frag, "vec2 texCoordInp = texelFetch(gbuffer2, ivec2(inp.x * gbufferSize.x, inp.y * gbufferSize.y), 0).ba;"); ///else - node_shader_write(frag, 'vec2 texCoordInp = texelFetch(gbuffer2, ivec2(inp.x * gbufferSize.x, (1.0 - inp.y) * gbufferSize.y), 0).ba;'); + node_shader_write(frag, "vec2 texCoordInp = texelFetch(gbuffer2, ivec2(inp.x * gbufferSize.x, (1.0 - inp.y) * gbufferSize.y), 0).ba;"); ///end - node_shader_write(frag, 'vec4 face_c1 = texelFetch(textrianglemap, ivec2(texCoordInp * textrianglemapSize), 0);'); - node_shader_write(frag, 'vec4 face_c2 = textureLod(textrianglemap, texCoordPick, 0);'); + node_shader_write(frag, "vec4 face_c1 = texelFetch(textrianglemap, ivec2(texCoordInp * textrianglemapSize), 0);"); + node_shader_write(frag, "vec4 face_c2 = textureLod(textrianglemap, texCoordPick, 0);"); ///if (krom_direct3d11 || krom_direct3d12 || krom_metal) - node_shader_write(frag, 'if (any(face_c1 != face_c2)) discard;'); + node_shader_write(frag, "if (any(face_c1 != face_c2)) discard;"); ///else - node_shader_write(frag, 'if (face_c1 != face_c2) discard;'); + node_shader_write(frag, "if (face_c1 != face_c2) discard;"); ///end } function make_discard_uv_island(vert: node_shader_t, frag: node_shader_t) { - node_shader_add_uniform(frag, 'sampler2D texuvislandmap', '_texuvislandmap'); - node_shader_write(frag, 'if (textureLod(texuvislandmap, texCoordPick, 0).r == 0.0) discard;'); + node_shader_add_uniform(frag, "sampler2D texuvislandmap", "_texuvislandmap"); + node_shader_write(frag, "if (textureLod(texuvislandmap, texCoordPick, 0).r == 0.0) discard;"); } function make_discard_material_id(vert: node_shader_t, frag: node_shader_t) { frag.wvpposition = true; - node_shader_write(frag, 'vec2 picker_sample_tc = vec2(wvpposition.x / wvpposition.w, wvpposition.y / wvpposition.w) * 0.5 + 0.5;'); + node_shader_write(frag, "vec2 picker_sample_tc = vec2(wvpposition.x / wvpposition.w, wvpposition.y / wvpposition.w) * 0.5 + 0.5;"); ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, 'picker_sample_tc.y = 1.0 - picker_sample_tc.y;'); + node_shader_write(frag, "picker_sample_tc.y = 1.0 - picker_sample_tc.y;"); ///end - node_shader_add_uniform(frag, 'sampler2D texpaint_nor_undo', '_texpaint_nor_undo'); + node_shader_add_uniform(frag, "sampler2D texpaint_nor_undo", "_texpaint_nor_undo"); let matid: i32 = context_raw.materialid_picked / 255; - node_shader_write(frag, `if (${matid} != textureLod(texpaint_nor_undo, picker_sample_tc, 0.0).a) discard;`); + node_shader_write(frag, "if (" + matid + " != textureLod(texpaint_nor_undo, picker_sample_tc, 0.0).a) discard;"); } diff --git a/armorpaint/Sources/make_material.ts b/armorpaint/Sources/make_material.ts index 153a298a..7a25b801 100644 --- a/armorpaint/Sources/make_material.ts +++ b/armorpaint/Sources/make_material.ts @@ -406,114 +406,114 @@ function make_material_parse_brush() { function make_material_blend_mode(frag: node_shader_t, blending: i32, cola: string, colb: string, opac: string): string { if (blending == blend_type_t.MIX) { - return `mix(${cola}, ${colb}, ${opac})`; + return "mix(" + cola + ", " + colb + ", " + opac + ")"; } else if (blending == blend_type_t.DARKEN) { - return `mix(${cola}, min(${cola}, ${colb}), ${opac})`; + return "mix(" + cola + ", min(" + cola + ", " + colb + "), " + opac + ")"; } else if (blending == blend_type_t.MULTIPLY) { - return `mix(${cola}, ${cola} * ${colb}, ${opac})`; + return "mix(" + cola + ", " + cola + " * " + colb + ", " + opac + ")"; } else if (blending == blend_type_t.BURN) { - return `mix(${cola}, vec3(1.0, 1.0, 1.0) - (vec3(1.0, 1.0, 1.0) - ${cola}) / ${colb}, ${opac})`; + return "mix(" + cola + ", vec3(1.0, 1.0, 1.0) - (vec3(1.0, 1.0, 1.0) - " + cola + ") / " + colb + ", " + opac + ")"; } else if (blending == blend_type_t.LIGHTEN) { - return `max(${cola}, ${colb} * ${opac})`; + return "max(" + cola + ", " + colb + " * " + opac + ")"; } else if (blending == blend_type_t.SCREEN) { - return `(vec3(1.0, 1.0, 1.0) - (vec3(1.0 - ${opac}, 1.0 - ${opac}, 1.0 - ${opac}) + ${opac} * (vec3(1.0, 1.0, 1.0) - ${colb})) * (vec3(1.0, 1.0, 1.0) - ${cola}))`; + return "(vec3(1.0, 1.0, 1.0) - (vec3(1.0 - " + opac + ", 1.0 - " + opac + ", 1.0 - " + opac + ") + " + opac + " * (vec3(1.0, 1.0, 1.0) - " + colb + ")) * (vec3(1.0, 1.0, 1.0) - " + cola + "))"; } else if (blending == blend_type_t.DODGE) { - return `mix(${cola}, ${cola} / (vec3(1.0, 1.0, 1.0) - ${colb}), ${opac})`; + return "mix(" + cola + ", " + cola + " / (vec3(1.0, 1.0, 1.0) - " + colb + "), " + opac + ")"; } else if (blending == blend_type_t.ADD) { - return `mix(${cola}, ${cola} + ${colb}, ${opac})`; + return "mix(" + cola + ", " + cola + " + " + colb + ", " + opac + ")"; } else if (blending == blend_type_t.OVERLAY) { - return `mix(${cola}, vec3( - ${cola}.r < 0.5 ? 2.0 * ${cola}.r * ${colb}.r : 1.0 - 2.0 * (1.0 - ${cola}.r) * (1.0 - ${colb}.r), - ${cola}.g < 0.5 ? 2.0 * ${cola}.g * ${colb}.g : 1.0 - 2.0 * (1.0 - ${cola}.g) * (1.0 - ${colb}.g), - ${cola}.b < 0.5 ? 2.0 * ${cola}.b * ${colb}.b : 1.0 - 2.0 * (1.0 - ${cola}.b) * (1.0 - ${colb}.b) - ), ${opac})`; + return "mix(" + cola + ", vec3( \ + " + cola + ".r < 0.5 ? 2.0 * " + cola + ".r * " + colb + ".r : 1.0 - 2.0 * (1.0 - " + cola + ".r) * (1.0 - " + colb + ".r), \ + " + cola + ".g < 0.5 ? 2.0 * " + cola + ".g * " + colb + ".g : 1.0 - 2.0 * (1.0 - " + cola + ".g) * (1.0 - " + colb + ".g), \ + " + cola + ".b < 0.5 ? 2.0 * " + cola + ".b * " + colb + ".b : 1.0 - 2.0 * (1.0 - " + cola + ".b) * (1.0 - " + colb + ".b) \ + ), " + opac + ")"; } else if (blending == blend_type_t.SOFT_LIGHT) { - return `((1.0 - ${opac}) * ${cola} + ${opac} * ((vec3(1.0, 1.0, 1.0) - ${cola}) * ${colb} * ${cola} + ${cola} * (vec3(1.0, 1.0, 1.0) - (vec3(1.0, 1.0, 1.0) - ${colb}) * (vec3(1.0, 1.0, 1.0) - ${cola}))))`; + return "((1.0 - " + opac + ") * " + cola + " + " + opac + " * ((vec3(1.0, 1.0, 1.0) - " + cola + ") * " + colb + " * " + cola + " + " + cola + " * (vec3(1.0, 1.0, 1.0) - (vec3(1.0, 1.0, 1.0) - " + colb + ") * (vec3(1.0, 1.0, 1.0) - " + cola + "))))"; } else if (blending == blend_type_t.LINEAR_LIGHT) { - return `(${cola} + ${opac} * (vec3(2.0, 2.0, 2.0) * (${colb} - vec3(0.5, 0.5, 0.5))))`; + return "(" + cola + " + " + opac + " * (vec3(2.0, 2.0, 2.0) * (" + colb + " - vec3(0.5, 0.5, 0.5))))"; } else if (blending == blend_type_t.DIFFERENCE) { - return `mix(${cola}, abs(${cola} - ${colb}), ${opac})`; + return "mix(" + cola + ", abs(" + cola + " - " + colb + "), " + opac + ")"; } else if (blending == blend_type_t.SUBTRACT) { - return `mix(${cola}, ${cola} - ${colb}, ${opac})`; + return "mix(" + cola + ", " + cola + " - " + colb + ", " + opac + ")"; } else if (blending == blend_type_t.DIVIDE) { - return `vec3(1.0 - ${opac}, 1.0 - ${opac}, 1.0 - ${opac}) * ${cola} + vec3(${opac}, ${opac}, ${opac}) * ${cola} / ${colb}`; + return "vec3(1.0 - " + opac + ", 1.0 - " + opac + ", 1.0 - " + opac + ") * " + cola + " + vec3(" + opac + ", " + opac + ", " + opac + ") * " + cola + " / " + colb + ""; } else if (blending == blend_type_t.HUE) { node_shader_add_function(frag, str_hue_sat); - return `mix(${cola}, hsv_to_rgb(vec3(rgb_to_hsv(${colb}).r, rgb_to_hsv(${cola}).g, rgb_to_hsv(${cola}).b)), ${opac})`; + return "mix(" + cola + ", hsv_to_rgb(vec3(rgb_to_hsv(" + colb + ").r, rgb_to_hsv(" + cola + ").g, rgb_to_hsv(" + cola + ").b)), " + opac + ")"; } else if (blending == blend_type_t.SATURATION) { node_shader_add_function(frag, str_hue_sat); - return `mix(${cola}, hsv_to_rgb(vec3(rgb_to_hsv(${cola}).r, rgb_to_hsv(${colb}).g, rgb_to_hsv(${cola}).b)), ${opac})`; + return "mix(" + cola + ", hsv_to_rgb(vec3(rgb_to_hsv(" + cola + ").r, rgb_to_hsv(" + colb + ").g, rgb_to_hsv(" + cola + ").b)), " + opac + ")"; } else if (blending == blend_type_t.COLOR) { node_shader_add_function(frag, str_hue_sat); - return `mix(${cola}, hsv_to_rgb(vec3(rgb_to_hsv(${colb}).r, rgb_to_hsv(${colb}).g, rgb_to_hsv(${cola}).b)), ${opac})`; + return "mix(" + cola + ", hsv_to_rgb(vec3(rgb_to_hsv(" + colb + ").r, rgb_to_hsv(" + colb + ").g, rgb_to_hsv(" + cola + ").b)), " + opac + ")"; } else { // BlendValue node_shader_add_function(frag, str_hue_sat); - return `mix(${cola}, hsv_to_rgb(vec3(rgb_to_hsv(${cola}).r, rgb_to_hsv(${cola}).g, rgb_to_hsv(${colb}).b)), ${opac})`; + return "mix(" + cola + ", hsv_to_rgb(vec3(rgb_to_hsv(" + cola + ").r, rgb_to_hsv(" + cola + ").g, rgb_to_hsv(" + colb + ").b)), " + opac + ")"; } } function make_material_blend_mode_mask(frag: node_shader_t, blending: i32, cola: string, colb: string, opac: string): string { if (blending == blend_type_t.MIX) { - return `mix(${cola}, ${colb}, ${opac})`; + return "mix(" + cola + ", " + colb + ", " + opac + ")"; } else if (blending == blend_type_t.DARKEN) { - return `mix(${cola}, min(${cola}, ${colb}), ${opac})`; + return "mix(" + cola + ", min(" + cola + ", " + colb + "), " + opac + ")"; } else if (blending == blend_type_t.MULTIPLY) { - return `mix(${cola}, ${cola} * ${colb}, ${opac})`; + return "mix(" + cola + ", " + cola + " * " + colb + ", " + opac + ")"; } else if (blending == blend_type_t.BURN) { - return `mix(${cola}, 1.0 - (1.0 - ${cola}) / ${colb}, ${opac})`; + return "mix(" + cola + ", 1.0 - (1.0 - " + cola + ") / " + colb + ", " + opac + ")"; } else if (blending == blend_type_t.LIGHTEN) { - return `max(${cola}, ${colb} * ${opac})`; + return "max(" + cola + ", " + colb + " * " + opac + ")"; } else if (blending == blend_type_t.SCREEN) { - return `(1.0 - ((1.0 - ${opac}) + ${opac} * (1.0 - ${colb})) * (1.0 - ${cola}))`; + return "(1.0 - ((1.0 - " + opac + ") + " + opac + " * (1.0 - " + colb + ")) * (1.0 - " + cola + "))"; } else if (blending == blend_type_t.DODGE) { - return `mix(${cola}, ${cola} / (1.0 - ${colb}), ${opac})`; + return "mix(" + cola + ", " + cola + " / (1.0 - " + colb + "), " + opac + ")"; } else if (blending == blend_type_t.ADD) { - return `mix(${cola}, ${cola} + ${colb}, ${opac})`; + return "mix(" + cola + ", " + cola + " + " + colb + ", " + opac + ")"; } else if (blending == blend_type_t.OVERLAY) { - return `mix(${cola}, ${cola} < 0.5 ? 2.0 * ${cola} * ${colb} : 1.0 - 2.0 * (1.0 - ${cola}) * (1.0 - ${colb}), ${opac})`; + return "mix(" + cola + ", " + cola + " < 0.5 ? 2.0 * " + cola + " * " + colb + " : 1.0 - 2.0 * (1.0 - " + cola + ") * (1.0 - " + colb + "), " + opac + ")"; } else if (blending == blend_type_t.SOFT_LIGHT) { - return `((1.0 - ${opac}) * ${cola} + ${opac} * ((1.0 - ${cola}) * ${colb} * ${cola} + ${cola} * (1.0 - (1.0 - ${colb}) * (1.0 - ${cola}))))`; + return "((1.0 - " + opac + ") * " + cola + " + " + opac + " * ((1.0 - " + cola + ") * " + colb + " * " + cola + " + " + cola + " * (1.0 - (1.0 - " + colb + ") * (1.0 - " + cola + "))))"; } else if (blending == blend_type_t.LINEAR_LIGHT) { - return `(${cola} + ${opac} * (2.0 * (${colb} - 0.5)))`; + return "(" + cola + " + " + opac + " * (2.0 * (" + colb + " - 0.5)))"; } else if (blending == blend_type_t.DIFFERENCE) { - return `mix(${cola}, abs(${cola} - ${colb}), ${opac})`; + return "mix(" + cola + ", abs(" + cola + " - " + colb + "), " + opac + ")"; } else if (blending == blend_type_t.SUBTRACT) { - return `mix(${cola}, ${cola} - ${colb}, ${opac})`; + return "mix(" + cola + ", " + cola + " - " + colb + ", " + opac + ")"; } else if (blending == blend_type_t.DIVIDE) { - return `(1.0 - ${opac}) * ${cola} + ${opac} * ${cola} / ${colb}`; + return "(1.0 - " + opac + ") * " + cola + " + " + opac + " * " + cola + " / " + colb + ""; } else { // BlendHue, BlendSaturation, BlendColor, BlendValue - return `mix(${cola}, ${colb}, ${opac})`; + return "mix(" + cola + ", " + colb + ", " + opac + ")"; } } @@ -524,7 +524,7 @@ function make_material_get_displace_strength(): f32 { function make_material_voxelgi_half_extents(): string { let ext: f32 = context_raw.vxao_ext; - return `const vec3 voxelgiHalfExtents = vec3(${ext}, ${ext}, ${ext});`; + return "const vec3 voxelgiHalfExtents = vec3(" + ext + ", " + ext + ", " + ext + ");"; } function make_material_delete_context(c: shader_context_t) { diff --git a/armorpaint/Sources/make_mesh.ts b/armorpaint/Sources/make_mesh.ts index 9c8ae6d3..c9b8dfe3 100644 --- a/armorpaint/Sources/make_mesh.ts +++ b/armorpaint/Sources/make_mesh.ts @@ -17,18 +17,18 @@ function make_mesh_run(data: material_t, layerPass = 0): node_shader_context_t { let frag: node_shader_t = node_shader_context_make_frag(con_mesh); frag.ins = vert.outs; - node_shader_add_out(vert, 'vec2 texCoord'); + node_shader_add_out(vert, "vec2 texCoord"); frag.wvpposition = true; - node_shader_add_out(vert, 'vec4 prevwvpposition'); - node_shader_add_uniform(vert, 'mat4 VP', '_view_proj_matrix'); - node_shader_add_uniform(vert, 'mat4 prevWVP', '_prev_world_view_proj_matrix'); + node_shader_add_out(vert, "vec4 prevwvpposition"); + node_shader_add_uniform(vert, "mat4 VP", "_view_proj_matrix"); + node_shader_add_uniform(vert, "mat4 prevWVP", "_prev_world_view_proj_matrix"); vert.wposition = true; let texture_count: i32 = 0; let displace_strength: f32 = make_material_get_displace_strength(); if (make_material_height_used && displace_strength > 0.0) { vert.n = true; - node_shader_write(vert, 'float height = 0.0;'); + node_shader_write(vert, "float height = 0.0;"); let num_layers: i32 = 0; for (let i: i32 = 0; i < project_layers.length; ++i) { let l: slot_layer_t = project_layers[i]; @@ -40,8 +40,8 @@ function make_mesh_run(data: material_t, layerPass = 0): node_shader_context_t { } num_layers++; texture_count++; - node_shader_add_uniform(vert, 'sampler2D texpaint_pack_vert' + l.id, '_texpaint_pack_vert' + l.id); - node_shader_write(vert, 'height += textureLod(texpaint_pack_vert' + l.id + ', tex, 0.0).a;'); + node_shader_add_uniform(vert, "sampler2D texpaint_pack_vert" + l.id, "_texpaint_pack_vert" + l.id); + node_shader_write(vert, "height += textureLod(texpaint_pack_vert" + l.id + ", tex, 0.0).a;"); let masks: slot_layer_t[] = slot_layer_get_masks(l); if (masks != null) { for (let i: i32 = 0; i < masks.length; ++i) { @@ -50,83 +50,83 @@ function make_mesh_run(data: material_t, layerPass = 0): node_shader_context_t { continue; } texture_count++; - node_shader_add_uniform(vert, 'sampler2D texpaint_vert' + m.id, '_texpaint_vert' + m.id); - node_shader_write(vert, 'height *= textureLod(texpaint_vert' + m.id + ', tex, 0.0).r;'); + node_shader_add_uniform(vert, "sampler2D texpaint_vert" + m.id, "_texpaint_vert" + m.id); + node_shader_write(vert, "height *= textureLod(texpaint_vert" + m.id + ", tex, 0.0).r;"); } } } - node_shader_write(vert, `wposition += wnormal * vec3(height, height, height) * vec3(${displace_strength}, ${displace_strength}, ${displace_strength});`); + node_shader_write(vert, "wposition += wnormal * vec3(height, height, height) * vec3(" + displace_strength + ", " + displace_strength + ", " + displace_strength + ");"); } - node_shader_write(vert, 'gl_Position = mul(vec4(wposition.xyz, 1.0), VP);'); - node_shader_write(vert, 'texCoord = tex;'); + node_shader_write(vert, "gl_Position = mul(vec4(wposition.xyz, 1.0), VP);"); + node_shader_write(vert, "texCoord = tex;"); if (make_material_height_used && displace_strength > 0) { - node_shader_add_uniform(vert, 'mat4 invW', '_inv_world_matrix'); - node_shader_write(vert, 'prevwvpposition = mul(mul(vec4(wposition, 1.0), invW), prevWVP);'); + node_shader_add_uniform(vert, "mat4 invW", "_inv_world_matrix"); + node_shader_write(vert, "prevwvpposition = mul(mul(vec4(wposition, 1.0), invW), prevWVP);"); } else { - node_shader_write(vert, 'prevwvpposition = mul(vec4(pos.xyz, 1.0), prevWVP);'); + node_shader_write(vert, "prevwvpposition = mul(vec4(pos.xyz, 1.0), prevWVP);"); } - node_shader_add_out(frag, 'vec4 fragColor[3]'); + node_shader_add_out(frag, "vec4 fragColor[3]"); frag.n = true; node_shader_add_function(frag, str_pack_float_int16); if (context_raw.tool == workspace_tool_t.COLORID) { texture_count++; - node_shader_add_uniform(frag, 'sampler2D texcolorid', '_texcolorid'); - node_shader_write(frag, 'fragColor[0] = vec4(n.xy, 1.0, packFloatInt16(0.0, uint(0)));'); - node_shader_write(frag, 'vec3 idcol = pow(textureLod(texcolorid, texCoord, 0.0).rgb, vec3(2.2, 2.2, 2.2));'); - node_shader_write(frag, 'fragColor[1] = vec4(idcol.rgb, 1.0);'); // occ + node_shader_add_uniform(frag, "sampler2D texcolorid", "_texcolorid"); + node_shader_write(frag, "fragColor[0] = vec4(n.xy, 1.0, packFloatInt16(0.0, uint(0)));"); + node_shader_write(frag, "vec3 idcol = pow(textureLod(texcolorid, texCoord, 0.0).rgb, vec3(2.2, 2.2, 2.2));"); + node_shader_write(frag, "fragColor[1] = vec4(idcol.rgb, 1.0);"); // occ } else { node_shader_add_function(frag, str_octahedron_wrap); node_shader_add_function(frag, str_cotangent_frame); if (layerPass > 0) { - node_shader_add_uniform(frag, 'sampler2D gbuffer0'); - node_shader_add_uniform(frag, 'sampler2D gbuffer1'); - node_shader_add_uniform(frag, 'sampler2D gbuffer2'); - node_shader_write(frag, 'vec2 fragcoord = (wvpposition.xy / wvpposition.w) * 0.5 + 0.5;'); + node_shader_add_uniform(frag, "sampler2D gbuffer0"); + node_shader_add_uniform(frag, "sampler2D gbuffer1"); + node_shader_add_uniform(frag, "sampler2D gbuffer2"); + node_shader_write(frag, "vec2 fragcoord = (wvpposition.xy / wvpposition.w) * 0.5 + 0.5;"); ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, 'fragcoord.y = 1.0 - fragcoord.y;'); + node_shader_write(frag, "fragcoord.y = 1.0 - fragcoord.y;"); ///end - node_shader_write(frag, 'vec4 gbuffer0_sample = textureLod(gbuffer0, fragcoord, 0.0);'); - node_shader_write(frag, 'vec4 gbuffer1_sample = textureLod(gbuffer1, fragcoord, 0.0);'); - node_shader_write(frag, 'vec4 gbuffer2_sample = textureLod(gbuffer2, fragcoord, 0.0);'); - node_shader_write(frag, 'vec3 basecol = gbuffer0_sample.rgb;'); - node_shader_write(frag, 'float roughness = gbuffer2_sample.g;'); - node_shader_write(frag, 'float metallic = gbuffer2_sample.b;'); - node_shader_write(frag, 'float occlusion = gbuffer2_sample.r;'); - node_shader_write(frag, 'float opacity = 1.0;//gbuffer0_sample.a;'); - node_shader_write(frag, 'float matid = gbuffer1_sample.a;'); - node_shader_write(frag, 'vec3 ntex = gbuffer1_sample.rgb;'); - node_shader_write(frag, 'float height = gbuffer2_sample.a;'); + node_shader_write(frag, "vec4 gbuffer0_sample = textureLod(gbuffer0, fragcoord, 0.0);"); + node_shader_write(frag, "vec4 gbuffer1_sample = textureLod(gbuffer1, fragcoord, 0.0);"); + node_shader_write(frag, "vec4 gbuffer2_sample = textureLod(gbuffer2, fragcoord, 0.0);"); + node_shader_write(frag, "vec3 basecol = gbuffer0_sample.rgb;"); + node_shader_write(frag, "float roughness = gbuffer2_sample.g;"); + node_shader_write(frag, "float metallic = gbuffer2_sample.b;"); + node_shader_write(frag, "float occlusion = gbuffer2_sample.r;"); + node_shader_write(frag, "float opacity = 1.0;//gbuffer0_sample.a;"); + node_shader_write(frag, "float matid = gbuffer1_sample.a;"); + node_shader_write(frag, "vec3 ntex = gbuffer1_sample.rgb;"); + node_shader_write(frag, "float height = gbuffer2_sample.a;"); } else { - node_shader_write(frag, 'vec3 basecol = vec3(0.0, 0.0, 0.0);'); - node_shader_write(frag, 'float roughness = 0.0;'); - node_shader_write(frag, 'float metallic = 0.0;'); - node_shader_write(frag, 'float occlusion = 1.0;'); - node_shader_write(frag, 'float opacity = 1.0;'); - node_shader_write(frag, 'float matid = 0.0;'); - node_shader_write(frag, 'vec3 ntex = vec3(0.5, 0.5, 1.0);'); - node_shader_write(frag, 'float height = 0.0;'); + node_shader_write(frag, "vec3 basecol = vec3(0.0, 0.0, 0.0);"); + node_shader_write(frag, "float roughness = 0.0;"); + node_shader_write(frag, "float metallic = 0.0;"); + node_shader_write(frag, "float occlusion = 1.0;"); + node_shader_write(frag, "float opacity = 1.0;"); + node_shader_write(frag, "float matid = 0.0;"); + node_shader_write(frag, "vec3 ntex = vec3(0.5, 0.5, 1.0);"); + node_shader_write(frag, "float height = 0.0;"); } - node_shader_write(frag, 'vec4 texpaint_sample = vec4(0.0, 0.0, 0.0, 1.0);'); - node_shader_write(frag, 'vec4 texpaint_nor_sample;'); - node_shader_write(frag, 'vec4 texpaint_pack_sample;'); - node_shader_write(frag, 'float texpaint_opac;'); + node_shader_write(frag, "vec4 texpaint_sample = vec4(0.0, 0.0, 0.0, 1.0);"); + node_shader_write(frag, "vec4 texpaint_nor_sample;"); + node_shader_write(frag, "vec4 texpaint_pack_sample;"); + node_shader_write(frag, "float texpaint_opac;"); if (make_material_height_used) { - node_shader_write(frag, 'float height0 = 0.0;'); - node_shader_write(frag, 'float height1 = 0.0;'); - node_shader_write(frag, 'float height2 = 0.0;'); - node_shader_write(frag, 'float height3 = 0.0;'); + node_shader_write(frag, "float height0 = 0.0;"); + node_shader_write(frag, "float height1 = 0.0;"); + node_shader_write(frag, "float height2 = 0.0;"); + node_shader_write(frag, "float height3 = 0.0;"); } if (context_raw.draw_wireframe) { texture_count++; - node_shader_add_uniform(frag, 'sampler2D texuvmap', '_texuvmap'); + node_shader_add_uniform(frag, "sampler2D texuvmap", "_texuvmap"); } if (context_raw.viewport_mode == viewport_mode_t.MASK && slot_layer_get_masks(context_raw.layer) != null) { @@ -136,16 +136,16 @@ function make_mesh_run(data: material_t, layerPass = 0): node_shader_context_t { continue; } texture_count++; - node_shader_add_uniform(frag, 'sampler2D texpaint_view_mask' + m.id, '_texpaint' + array_index_of(project_layers, m)); + node_shader_add_uniform(frag, "sampler2D texpaint_view_mask" + m.id, "_texpaint" + array_index_of(project_layers, m)); } } if (context_raw.viewport_mode == viewport_mode_t.LIT && context_raw.render_mode == render_mode_t.FORWARD) { texture_count += 4; - node_shader_add_uniform(frag, 'sampler2D senvmapBrdf', "$brdf.k"); - node_shader_add_uniform(frag, 'sampler2D senvmapRadiance', '_envmap_radiance'); - node_shader_add_uniform(frag, 'sampler2D sltcMat', '_ltcMat'); - node_shader_add_uniform(frag, 'sampler2D sltcMag', '_ltcMag'); + node_shader_add_uniform(frag, "sampler2D senvmapBrdf", "$brdf.k"); + node_shader_add_uniform(frag, "sampler2D senvmapRadiance", "_envmap_radiance"); + node_shader_add_uniform(frag, "sampler2D sltcMat", "_ltcMat"); + node_shader_add_uniform(frag, "sampler2D sltcMag", "_ltcMag"); } // Get layers for this pass @@ -182,30 +182,30 @@ function make_mesh_run(data: material_t, layerPass = 0): node_shader_context_t { for (let i: i32 = 0; i < layers.length; ++i) { let l: slot_layer_t = layers[i]; if (slot_layer_get_object_mask(l) > 0) { - node_shader_add_uniform(frag, 'int uid', '_uid'); + node_shader_add_uniform(frag, "int uid", "_uid"); if (slot_layer_get_object_mask(l) > project_paint_objects.length) { // Atlas let visibles: mesh_object_t[] = project_get_atlas_objects(slot_layer_get_object_mask(l)); - node_shader_write(frag, 'if ('); + node_shader_write(frag, "if ("); for (let i: i32 = 0; i < visibles.length; ++i) { if (i > 0) { - node_shader_write(frag, ' || '); + node_shader_write(frag, " || "); } - node_shader_write(frag, `${visibles[i].base.uid} == uid`); + node_shader_write(frag, visibles[i].base.uid + " == uid"); } - node_shader_write(frag, ') {'); + node_shader_write(frag, ") {"); } else { // Object mask let uid: i32 = project_paint_objects[slot_layer_get_object_mask(l) - 1].base.uid; - node_shader_write(frag, `if (${uid} == uid) {`); + node_shader_write(frag, "if (" + uid + " == uid) {"); } } - node_shader_add_shared_sampler(frag, 'sampler2D texpaint' + l.id); - node_shader_write(frag, 'texpaint_sample = textureLodShared(texpaint' + l.id + ', texCoord, 0.0);'); - node_shader_write(frag, 'texpaint_opac = texpaint_sample.a;'); + node_shader_add_shared_sampler(frag, "sampler2D texpaint" + l.id); + node_shader_write(frag, "texpaint_sample = textureLodShared(texpaint" + l.id + ", texCoord, 0.0);"); + node_shader_write(frag, "texpaint_opac = texpaint_sample.a;"); // ///if (krom_direct3d12 || krom_vulkan) // if (raw.viewportMode == ViewLit) { - // write(frag, 'if (texpaint_opac < 0.1) discard;'); + // write(frag, "if (texpaint_opac < 0.1) discard;"); // } // ///end @@ -220,122 +220,122 @@ function make_mesh_run(data: material_t, layerPass = 0): node_shader_context_t { } } if (has_visible) { - let texpaint_mask: string = 'texpaint_mask' + l.id; - node_shader_write(frag, `float ${texpaint_mask} = 0.0;`); + let texpaint_mask: string = "texpaint_mask" + l.id; + node_shader_write(frag, "float " + texpaint_mask + " = 0.0;"); for (let i: i32 = 0; i < masks.length; ++i) { let m: slot_layer_t = masks[i]; if (!slot_layer_is_visible(m)) { continue; } - node_shader_add_shared_sampler(frag, 'sampler2D texpaint' + m.id); - node_shader_write(frag, '{'); // Group mask is sampled across multiple layers - node_shader_write(frag, 'float texpaint_mask_sample' + m.id + ' = textureLodShared(texpaint' + m.id + ', texCoord, 0.0).r;'); - node_shader_write(frag, `${texpaint_mask} = ` + make_material_blend_mode_mask(frag, m.blending, `${texpaint_mask}`, 'texpaint_mask_sample' + m.id, 'float(' + slot_layer_get_opacity(m) + ')') + ';'); - node_shader_write(frag, '}'); + node_shader_add_shared_sampler(frag, "sampler2D texpaint" + m.id); + node_shader_write(frag, "{"); // Group mask is sampled across multiple layers + node_shader_write(frag, "float texpaint_mask_sample" + m.id + " = textureLodShared(texpaint" + m.id + ", texCoord, 0.0).r;"); + node_shader_write(frag, texpaint_mask + " = " + make_material_blend_mode_mask(frag, m.blending, texpaint_mask, "texpaint_mask_sample" + m.id, "float(" + slot_layer_get_opacity(m) + ")") + ";"); + node_shader_write(frag, "}"); } - node_shader_write(frag, `texpaint_opac *= clamp(${texpaint_mask}, 0.0, 1.0);`); + node_shader_write(frag, "texpaint_opac *= clamp(" + texpaint_mask + ", 0.0, 1.0);"); } } if (slot_layer_get_opacity(l) < 1) { - node_shader_write(frag, `texpaint_opac *= ${slot_layer_get_opacity(l)};`); + node_shader_write(frag, "texpaint_opac *= " + slot_layer_get_opacity(l) + ";"); } if (l.paint_base) { if (l == project_layers[0]) { - node_shader_write(frag, 'basecol = texpaint_sample.rgb * texpaint_opac;'); + node_shader_write(frag, "basecol = texpaint_sample.rgb * texpaint_opac;"); } else { - node_shader_write(frag, 'basecol = ' + make_material_blend_mode(frag, l.blending, 'basecol', 'texpaint_sample.rgb', 'texpaint_opac') + ';'); + node_shader_write(frag, "basecol = " + make_material_blend_mode(frag, l.blending, "basecol", "texpaint_sample.rgb", "texpaint_opac") + ";"); } } if (l.paint_nor || make_material_emis_used) { - node_shader_add_shared_sampler(frag, 'sampler2D texpaint_nor' + l.id); - node_shader_write(frag, 'texpaint_nor_sample = textureLodShared(texpaint_nor' + l.id + ', texCoord, 0.0);'); + node_shader_add_shared_sampler(frag, "sampler2D texpaint_nor" + l.id); + node_shader_write(frag, "texpaint_nor_sample = textureLodShared(texpaint_nor" + l.id + ", texCoord, 0.0);"); if (make_material_emis_used) { - node_shader_write(frag, 'if (texpaint_opac > 0.0) matid = texpaint_nor_sample.a;'); + node_shader_write(frag, "if (texpaint_opac > 0.0) matid = texpaint_nor_sample.a;"); } if (l.paint_nor) { if (l.paint_nor_blend) { // Whiteout blend - node_shader_write(frag, '{'); - node_shader_write(frag, 'vec3 n1 = ntex * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0);'); - node_shader_write(frag, 'vec3 n2 = mix(vec3(0.5, 0.5, 1.0), texpaint_nor_sample.rgb, texpaint_opac) * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0);'); - node_shader_write(frag, 'ntex = normalize(vec3(n1.xy + n2.xy, n1.z * n2.z)) * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5);'); - node_shader_write(frag, '}'); + node_shader_write(frag, "{"); + node_shader_write(frag, "vec3 n1 = ntex * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0);"); + node_shader_write(frag, "vec3 n2 = mix(vec3(0.5, 0.5, 1.0), texpaint_nor_sample.rgb, texpaint_opac) * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0);"); + node_shader_write(frag, "ntex = normalize(vec3(n1.xy + n2.xy, n1.z * n2.z)) * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5);"); + node_shader_write(frag, "}"); } else { - node_shader_write(frag, 'ntex = mix(ntex, texpaint_nor_sample.rgb, texpaint_opac);'); + node_shader_write(frag, "ntex = mix(ntex, texpaint_nor_sample.rgb, texpaint_opac);"); } } } if (l.paint_occ || l.paint_rough || l.paint_met || (l.paint_height && make_material_height_used)) { - node_shader_add_shared_sampler(frag, 'sampler2D texpaint_pack' + l.id); - node_shader_write(frag, 'texpaint_pack_sample = textureLodShared(texpaint_pack' + l.id + ', texCoord, 0.0);'); + node_shader_add_shared_sampler(frag, "sampler2D texpaint_pack" + l.id); + node_shader_write(frag, "texpaint_pack_sample = textureLodShared(texpaint_pack" + l.id + ", texCoord, 0.0);"); if (l.paint_occ) { - node_shader_write(frag, 'occlusion = mix(occlusion, texpaint_pack_sample.r, texpaint_opac);'); + node_shader_write(frag, "occlusion = mix(occlusion, texpaint_pack_sample.r, texpaint_opac);"); } if (l.paint_rough) { - node_shader_write(frag, 'roughness = mix(roughness, texpaint_pack_sample.g, texpaint_opac);'); + node_shader_write(frag, "roughness = mix(roughness, texpaint_pack_sample.g, texpaint_opac);"); } if (l.paint_met) { - node_shader_write(frag, 'metallic = mix(metallic, texpaint_pack_sample.b, texpaint_opac);'); + node_shader_write(frag, "metallic = mix(metallic, texpaint_pack_sample.b, texpaint_opac);"); } if (l.paint_height && make_material_height_used) { let assign: string = l.paint_height_blend ? "+=" : "="; - node_shader_write(frag, `height ${assign} texpaint_pack_sample.a * texpaint_opac;`); - node_shader_write(frag, '{'); - node_shader_add_uniform(frag, 'vec2 texpaintSize', '_texpaintSize'); - node_shader_write(frag, 'float tex_step = 1.0 / texpaintSize.x;'); - node_shader_write(frag, `height0 ${assign} textureLodShared(texpaint_pack` + l.id + ', vec2(texCoord.x - tex_step, texCoord.y), 0.0).a * texpaint_opac;'); - node_shader_write(frag, `height1 ${assign} textureLodShared(texpaint_pack` + l.id + ', vec2(texCoord.x + tex_step, texCoord.y), 0.0).a * texpaint_opac;'); - node_shader_write(frag, `height2 ${assign} textureLodShared(texpaint_pack` + l.id + ', vec2(texCoord.x, texCoord.y - tex_step), 0.0).a * texpaint_opac;'); - node_shader_write(frag, `height3 ${assign} textureLodShared(texpaint_pack` + l.id + ', vec2(texCoord.x, texCoord.y + tex_step), 0.0).a * texpaint_opac;'); - node_shader_write(frag, '}'); + node_shader_write(frag, "height " + assign + " texpaint_pack_sample.a * texpaint_opac;"); + node_shader_write(frag, "{"); + node_shader_add_uniform(frag, "vec2 texpaintSize", "_texpaintSize"); + node_shader_write(frag, "float tex_step = 1.0 / texpaintSize.x;"); + node_shader_write(frag, "height0 " + assign + " textureLodShared(texpaint_pack" + l.id + ", vec2(texCoord.x - tex_step, texCoord.y), 0.0).a * texpaint_opac;"); + node_shader_write(frag, "height1 " + assign + " textureLodShared(texpaint_pack" + l.id + ", vec2(texCoord.x + tex_step, texCoord.y), 0.0).a * texpaint_opac;"); + node_shader_write(frag, "height2 " + assign + " textureLodShared(texpaint_pack" + l.id + ", vec2(texCoord.x, texCoord.y - tex_step), 0.0).a * texpaint_opac;"); + node_shader_write(frag, "height3 " + assign + " textureLodShared(texpaint_pack" + l.id + ", vec2(texCoord.x, texCoord.y + tex_step), 0.0).a * texpaint_opac;"); + node_shader_write(frag, "}"); } } if (slot_layer_get_object_mask(l) > 0) { - node_shader_write(frag, '}'); + node_shader_write(frag, "}"); } } if (last_pass && context_raw.draw_texels) { - node_shader_add_uniform(frag, 'vec2 texpaintSize', '_texpaintSize'); - node_shader_write(frag, 'vec2 texel0 = texCoord * texpaintSize * 0.01;'); - node_shader_write(frag, 'vec2 texel1 = texCoord * texpaintSize * 0.1;'); - node_shader_write(frag, 'vec2 texel2 = texCoord * texpaintSize;'); - node_shader_write(frag, 'basecol *= max(float(mod(int(texel0.x), 2.0) == mod(int(texel0.y), 2.0)), 0.9);'); - node_shader_write(frag, 'basecol *= max(float(mod(int(texel1.x), 2.0) == mod(int(texel1.y), 2.0)), 0.9);'); - node_shader_write(frag, 'basecol *= max(float(mod(int(texel2.x), 2.0) == mod(int(texel2.y), 2.0)), 0.9);'); + node_shader_add_uniform(frag, "vec2 texpaintSize", "_texpaintSize"); + node_shader_write(frag, "vec2 texel0 = texCoord * texpaintSize * 0.01;"); + node_shader_write(frag, "vec2 texel1 = texCoord * texpaintSize * 0.1;"); + node_shader_write(frag, "vec2 texel2 = texCoord * texpaintSize;"); + node_shader_write(frag, "basecol *= max(float(mod(int(texel0.x), 2.0) == mod(int(texel0.y), 2.0)), 0.9);"); + node_shader_write(frag, "basecol *= max(float(mod(int(texel1.x), 2.0) == mod(int(texel1.y), 2.0)), 0.9);"); + node_shader_write(frag, "basecol *= max(float(mod(int(texel2.x), 2.0) == mod(int(texel2.y), 2.0)), 0.9);"); } if (last_pass && context_raw.draw_wireframe) { - node_shader_write(frag, 'basecol *= 1.0 - textureLod(texuvmap, texCoord, 0.0).r;'); + node_shader_write(frag, "basecol *= 1.0 - textureLod(texuvmap, texCoord, 0.0).r;"); } if (make_material_height_used) { - node_shader_write(frag, 'if (height > 0.0) {'); - // write(frag, 'float height_dx = dFdx(height * 16.0);'); - // write(frag, 'float height_dy = dFdy(height * 16.0);'); - node_shader_write(frag, 'float height_dx = height0 - height1;'); - node_shader_write(frag, 'float height_dy = height2 - height3;'); + node_shader_write(frag, "if (height > 0.0) {"); + // write(frag, "float height_dx = dFdx(height * 16.0);"); + // write(frag, "float height_dy = dFdy(height * 16.0);"); + node_shader_write(frag, "float height_dx = height0 - height1;"); + node_shader_write(frag, "float height_dy = height2 - height3;"); // Whiteout blend - node_shader_write(frag, 'vec3 n1 = ntex * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0);'); - node_shader_write(frag, 'vec3 n2 = normalize(vec3(height_dx * 16.0, height_dy * 16.0, 1.0));'); - node_shader_write(frag, 'ntex = normalize(vec3(n1.xy + n2.xy, n1.z * n2.z)) * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5);'); - node_shader_write(frag, '}'); + node_shader_write(frag, "vec3 n1 = ntex * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0);"); + node_shader_write(frag, "vec3 n2 = normalize(vec3(height_dx * 16.0, height_dy * 16.0, 1.0));"); + node_shader_write(frag, "ntex = normalize(vec3(n1.xy + n2.xy, n1.z * n2.z)) * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5);"); + node_shader_write(frag, "}"); } if (!last_pass) { - node_shader_write(frag, 'fragColor[0] = vec4(basecol, opacity);'); - node_shader_write(frag, 'fragColor[1] = vec4(ntex, matid);'); - node_shader_write(frag, 'fragColor[2] = vec4(occlusion, roughness, metallic, height);'); + node_shader_write(frag, "fragColor[0] = vec4(basecol, opacity);"); + node_shader_write(frag, "fragColor[1] = vec4(ntex, matid);"); + node_shader_write(frag, "fragColor[2] = vec4(occlusion, roughness, metallic, height);"); parser_material_finalize(con_mesh); con_mesh.data.shader_from_source = true; con_mesh.data.vertex_shader = node_shader_get(vert); @@ -345,157 +345,157 @@ function make_mesh_run(data: material_t, layerPass = 0): node_shader_context_t { frag.vvec = true; ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, 'mat3 TBN = cotangentFrame(n, vVec, texCoord);'); + node_shader_write(frag, "mat3 TBN = cotangentFrame(n, vVec, texCoord);"); ///else - node_shader_write(frag, 'mat3 TBN = cotangentFrame(n, -vVec, texCoord);'); + node_shader_write(frag, "mat3 TBN = cotangentFrame(n, -vVec, texCoord);"); ///end - node_shader_write(frag, 'n = ntex * 2.0 - 1.0;'); - node_shader_write(frag, 'n.y = -n.y;'); - node_shader_write(frag, 'n = normalize(mul(n, TBN));'); + node_shader_write(frag, "n = ntex * 2.0 - 1.0;"); + node_shader_write(frag, "n.y = -n.y;"); + node_shader_write(frag, "n = normalize(mul(n, TBN));"); if (context_raw.viewport_mode == viewport_mode_t.LIT || context_raw.viewport_mode == viewport_mode_t.PATH_TRACE) { - node_shader_write(frag, 'basecol = pow(basecol, vec3(2.2, 2.2, 2.2));'); + node_shader_write(frag, "basecol = pow(basecol, vec3(2.2, 2.2, 2.2));"); if (context_raw.viewport_shader != null) { let color: string = context_raw.viewport_shader(frag); - node_shader_write(frag, `fragColor[1] = vec4(${color}, 1.0);`); + node_shader_write(frag, "fragColor[1] = vec4(" + color + ", 1.0);"); } else if (context_raw.render_mode == render_mode_t.FORWARD && context_raw.viewport_mode != viewport_mode_t.PATH_TRACE) { frag.wposition = true; - node_shader_write(frag, 'vec3 albedo = mix(basecol, vec3(0.0, 0.0, 0.0), metallic);'); - node_shader_write(frag, 'vec3 f0 = mix(vec3(0.04, 0.04, 0.04), basecol, metallic);'); + node_shader_write(frag, "vec3 albedo = mix(basecol, vec3(0.0, 0.0, 0.0), metallic);"); + node_shader_write(frag, "vec3 f0 = mix(vec3(0.04, 0.04, 0.04), basecol, metallic);"); frag.vvec = true; - node_shader_write(frag, 'float dotNV = max(0.0, dot(n, vVec));'); - node_shader_write(frag, 'vec2 envBRDF = texelFetch(senvmapBrdf, ivec2(vec2(roughness, 1.0 - dotNV) * 256.0), 0).xy;'); - node_shader_add_uniform(frag, 'int envmapNumMipmaps', '_envmap_num_mipmaps'); - node_shader_add_uniform(frag, 'vec4 envmapData', '_envmapData'); // angle, sin(angle), cos(angle), strength - node_shader_write(frag, 'vec3 wreflect = reflect(-vVec, n);'); - node_shader_write(frag, 'float envlod = roughness * float(envmapNumMipmaps);'); + node_shader_write(frag, "float dotNV = max(0.0, dot(n, vVec));"); + node_shader_write(frag, "vec2 envBRDF = texelFetch(senvmapBrdf, ivec2(vec2(roughness, 1.0 - dotNV) * 256.0), 0).xy;"); + node_shader_add_uniform(frag, "int envmapNumMipmaps", "_envmap_num_mipmaps"); + node_shader_add_uniform(frag, "vec4 envmapData", "_envmapData"); // angle, sin(angle), cos(angle), strength + node_shader_write(frag, "vec3 wreflect = reflect(-vVec, n);"); + node_shader_write(frag, "float envlod = roughness * float(envmapNumMipmaps);"); node_shader_add_function(frag, str_envmap_equirect); - node_shader_write(frag, 'vec3 prefilteredColor = textureLod(senvmapRadiance, envMapEquirect(wreflect, envmapData.x), envlod).rgb;'); - node_shader_add_uniform(frag, 'vec3 lightArea0', '_light_area0'); - node_shader_add_uniform(frag, 'vec3 lightArea1', '_light_area1'); - node_shader_add_uniform(frag, 'vec3 lightArea2', '_light_area2'); - node_shader_add_uniform(frag, 'vec3 lightArea3', '_light_area3'); + node_shader_write(frag, "vec3 prefilteredColor = textureLod(senvmapRadiance, envMapEquirect(wreflect, envmapData.x), envlod).rgb;"); + node_shader_add_uniform(frag, "vec3 lightArea0", "_light_area0"); + node_shader_add_uniform(frag, "vec3 lightArea1", "_light_area1"); + node_shader_add_uniform(frag, "vec3 lightArea2", "_light_area2"); + node_shader_add_uniform(frag, "vec3 lightArea3", "_light_area3"); node_shader_add_function(frag, str_ltc_evaluate); - node_shader_add_uniform(frag, 'vec3 lightPos', '_point_pos'); - node_shader_add_uniform(frag, 'vec3 lightColor', '_point_color'); - // write(frag, 'float dotNL = max(dot(n, normalize(lightPos - wposition)), 0.0);'); - // write(frag, 'vec3 direct = albedo * dotNL;'); - node_shader_write(frag, 'float ldist = distance(wposition, lightPos);'); - 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(sltcMat, 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 = ltcEvaluate(n, vVec, dotNV, wposition, minv, lightArea0, lightArea1, lightArea2, lightArea3);'); - node_shader_write(frag, 'ltcspec *= textureLod(sltcMag, 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 = ltcEvaluate(n, vVec, dotNV, wposition, mident, lightArea0, lightArea1, lightArea2, lightArea3);'); - node_shader_write(frag, 'vec3 direct = albedo * ltcdiff + ltcspec * 0.05;'); - node_shader_write(frag, 'direct *= lightColor * (1.0 / (ldist * ldist));'); + node_shader_add_uniform(frag, "vec3 lightPos", "_point_pos"); + node_shader_add_uniform(frag, "vec3 lightColor", "_point_color"); + // write(frag, "float dotNL = max(dot(n, normalize(lightPos - wposition)), 0.0);"); + // write(frag, "vec3 direct = albedo * dotNL;"); + node_shader_write(frag, "float ldist = distance(wposition, lightPos);"); + 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(sltcMat, 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 = ltcEvaluate(n, vVec, dotNV, wposition, minv, lightArea0, lightArea1, lightArea2, lightArea3);"); + node_shader_write(frag, "ltcspec *= textureLod(sltcMag, 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 = ltcEvaluate(n, vVec, dotNV, wposition, mident, lightArea0, lightArea1, lightArea2, lightArea3);"); + node_shader_write(frag, "vec3 direct = albedo * ltcdiff + ltcspec * 0.05;"); + node_shader_write(frag, "direct *= lightColor * (1.0 / (ldist * ldist));"); - node_shader_add_uniform(frag, 'vec4 shirr[7]', '_envmap_irradiance'); + 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 * (shIrradiance(vec3(n.x * envmapData.z - n.y * envmapData.y, n.x * envmapData.y + n.y * envmapData.z, n.z), shirr) / 3.14159265);'); - node_shader_write(frag, 'indirect += prefilteredColor * (f0 * envBRDF.x + envBRDF.y) * 1.5;'); - node_shader_write(frag, 'indirect *= envmapData.w * occlusion;'); - node_shader_write(frag, 'fragColor[1] = vec4(direct + indirect, 1.0);'); + node_shader_write(frag, "vec3 indirect = albedo * (shIrradiance(vec3(n.x * envmapData.z - n.y * envmapData.y, n.x * envmapData.y + n.y * envmapData.z, n.z), shirr) / 3.14159265);"); + node_shader_write(frag, "indirect += prefilteredColor * (f0 * envBRDF.x + envBRDF.y) * 1.5;"); + node_shader_write(frag, "indirect *= envmapData.w * occlusion;"); + node_shader_write(frag, "fragColor[1] = vec4(direct + indirect, 1.0);"); } else { // Deferred, Pathtraced if (make_material_emis_used) { - node_shader_write(frag, 'if (int(matid * 255.0) % 3 == 1) basecol *= 10.0;'); // Boost for bloom + node_shader_write(frag, "if (int(matid * 255.0) % 3 == 1) basecol *= 10.0;"); // Boost for bloom } - node_shader_write(frag, 'fragColor[1] = vec4(basecol, occlusion);'); + node_shader_write(frag, "fragColor[1] = vec4(basecol, occlusion);"); } } else if (context_raw.viewport_mode == viewport_mode_t.BASE_COLOR && context_raw.layer.paint_base) { - node_shader_write(frag, 'fragColor[1] = vec4(basecol, 1.0);'); + node_shader_write(frag, "fragColor[1] = vec4(basecol, 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.NORMAL_MAP && context_raw.layer.paint_nor) { - node_shader_write(frag, 'fragColor[1] = vec4(ntex.rgb, 1.0);'); + node_shader_write(frag, "fragColor[1] = vec4(ntex.rgb, 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.OCCLUSION && context_raw.layer.paint_occ) { - node_shader_write(frag, 'fragColor[1] = vec4(vec3(occlusion, occlusion, occlusion), 1.0);'); + node_shader_write(frag, "fragColor[1] = vec4(vec3(occlusion, occlusion, occlusion), 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.ROUGHNESS && context_raw.layer.paint_rough) { - node_shader_write(frag, 'fragColor[1] = vec4(vec3(roughness, roughness, roughness), 1.0);'); + node_shader_write(frag, "fragColor[1] = vec4(vec3(roughness, roughness, roughness), 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.METALLIC && context_raw.layer.paint_met) { - node_shader_write(frag, 'fragColor[1] = vec4(vec3(metallic, metallic, metallic), 1.0);'); + node_shader_write(frag, "fragColor[1] = vec4(vec3(metallic, metallic, metallic), 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.OPACITY && context_raw.layer.paint_opac) { - node_shader_write(frag, 'fragColor[1] = vec4(vec3(texpaint_sample.a, texpaint_sample.a, texpaint_sample.a), 1.0);'); + node_shader_write(frag, "fragColor[1] = vec4(vec3(texpaint_sample.a, texpaint_sample.a, texpaint_sample.a), 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.HEIGHT && context_raw.layer.paint_height) { - node_shader_write(frag, 'fragColor[1] = vec4(vec3(height, height, height), 1.0);'); + node_shader_write(frag, "fragColor[1] = vec4(vec3(height, height, height), 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.EMISSION) { - node_shader_write(frag, 'float emis = int(matid * 255.0) % 3 == 1 ? 1.0 : 0.0;'); - node_shader_write(frag, 'fragColor[1] = vec4(vec3(emis, emis, emis), 1.0);'); + node_shader_write(frag, "float emis = int(matid * 255.0) % 3 == 1 ? 1.0 : 0.0;"); + node_shader_write(frag, "fragColor[1] = vec4(vec3(emis, emis, emis), 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.SUBSURFACE) { - node_shader_write(frag, 'float subs = int(matid * 255.0) % 3 == 2 ? 1.0 : 0.0;'); - node_shader_write(frag, 'fragColor[1] = vec4(vec3(subs, subs, subs), 1.0);'); + node_shader_write(frag, "float subs = int(matid * 255.0) % 3 == 2 ? 1.0 : 0.0;"); + node_shader_write(frag, "fragColor[1] = vec4(vec3(subs, subs, subs), 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.TEXCOORD) { - node_shader_write(frag, 'fragColor[1] = vec4(texCoord, 0.0, 1.0);'); + node_shader_write(frag, "fragColor[1] = vec4(texCoord, 0.0, 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.OBJECT_NORMAL) { frag.nattr = true; - node_shader_write(frag, 'fragColor[1] = vec4(nAttr, 1.0);'); + node_shader_write(frag, "fragColor[1] = vec4(nAttr, 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.MATERIAL_ID) { - node_shader_add_shared_sampler(frag, 'sampler2D texpaint_nor' + context_raw.layer.id); - node_shader_add_uniform(frag, 'vec2 texpaintSize', '_texpaintSize'); - node_shader_write(frag, 'float sample_matid = texelFetch(texpaint_nor' + context_raw.layer.id + ', ivec2(texCoord * texpaintSize), 0).a + 1.0 / 255.0;'); - node_shader_write(frag, 'float matid_r = fract(sin(dot(vec2(sample_matid, sample_matid * 20.0), vec2(12.9898, 78.233))) * 43758.5453);'); - node_shader_write(frag, 'float matid_g = fract(sin(dot(vec2(sample_matid * 20.0, sample_matid), vec2(12.9898, 78.233))) * 43758.5453);'); - node_shader_write(frag, 'float matid_b = fract(sin(dot(vec2(sample_matid, sample_matid * 40.0), vec2(12.9898, 78.233))) * 43758.5453);'); - node_shader_write(frag, 'fragColor[1] = vec4(matid_r, matid_g, matid_b, 1.0);'); + node_shader_add_shared_sampler(frag, "sampler2D texpaint_nor" + context_raw.layer.id); + node_shader_add_uniform(frag, "vec2 texpaintSize", "_texpaintSize"); + node_shader_write(frag, "float sample_matid = texelFetch(texpaint_nor" + context_raw.layer.id + ", ivec2(texCoord * texpaintSize), 0).a + 1.0 / 255.0;"); + node_shader_write(frag, "float matid_r = fract(sin(dot(vec2(sample_matid, sample_matid * 20.0), vec2(12.9898, 78.233))) * 43758.5453);"); + node_shader_write(frag, "float matid_g = fract(sin(dot(vec2(sample_matid * 20.0, sample_matid), vec2(12.9898, 78.233))) * 43758.5453);"); + node_shader_write(frag, "float matid_b = fract(sin(dot(vec2(sample_matid, sample_matid * 40.0), vec2(12.9898, 78.233))) * 43758.5453);"); + node_shader_write(frag, "fragColor[1] = vec4(matid_r, matid_g, matid_b, 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.OBJECT_ID) { - node_shader_add_uniform(frag, 'float objectId', '_objectId'); - node_shader_write(frag, 'float obid = objectId + 1.0 / 255.0;'); - node_shader_write(frag, 'float id_r = fract(sin(dot(vec2(obid, obid * 20.0), vec2(12.9898, 78.233))) * 43758.5453);'); - node_shader_write(frag, 'float id_g = fract(sin(dot(vec2(obid * 20.0, obid), vec2(12.9898, 78.233))) * 43758.5453);'); - node_shader_write(frag, 'float id_b = fract(sin(dot(vec2(obid, obid * 40.0), vec2(12.9898, 78.233))) * 43758.5453);'); - node_shader_write(frag, 'fragColor[1] = vec4(id_r, id_g, id_b, 1.0);'); + node_shader_add_uniform(frag, "float objectId", "_objectId"); + node_shader_write(frag, "float obid = objectId + 1.0 / 255.0;"); + node_shader_write(frag, "float id_r = fract(sin(dot(vec2(obid, obid * 20.0), vec2(12.9898, 78.233))) * 43758.5453);"); + node_shader_write(frag, "float id_g = fract(sin(dot(vec2(obid * 20.0, obid), vec2(12.9898, 78.233))) * 43758.5453);"); + node_shader_write(frag, "float id_b = fract(sin(dot(vec2(obid, obid * 40.0), vec2(12.9898, 78.233))) * 43758.5453);"); + node_shader_write(frag, "fragColor[1] = vec4(id_r, id_g, id_b, 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.MASK && (slot_layer_get_masks(context_raw.layer) != null || slot_layer_is_mask(context_raw.layer))) { if (slot_layer_is_mask(context_raw.layer)) { - node_shader_write(frag, 'float mask_view = textureLodShared(texpaint' + context_raw.layer.id + ', texCoord, 0.0).r;'); + node_shader_write(frag, "float mask_view = textureLodShared(texpaint" + context_raw.layer.id + ", texCoord, 0.0).r;"); } else { - node_shader_write(frag, 'float mask_view = 0.0;'); + node_shader_write(frag, "float mask_view = 0.0;"); for (let i: i32 = 0; i < slot_layer_get_masks(context_raw.layer).length; ++i) { let m: slot_layer_t = slot_layer_get_masks(context_raw.layer)[i]; if (!slot_layer_is_visible(m)) continue; - node_shader_write(frag, 'float mask_sample' + m.id + ' = textureLodShared(texpaint_view_mask' + m.id + ', texCoord, 0.0).r;'); - node_shader_write(frag, 'mask_view = ' + make_material_blend_mode_mask(frag, m.blending, 'mask_view', 'mask_sample' + m.id, 'float(' + slot_layer_get_opacity(m) + ')') + ';'); + node_shader_write(frag, "float mask_sample" + m.id + " = textureLodShared(texpaint_view_mask" + m.id + ", texCoord, 0.0).r;"); + node_shader_write(frag, "mask_view = " + make_material_blend_mode_mask(frag, m.blending, "mask_view", "mask_sample" + m.id, "float(" + slot_layer_get_opacity(m) + ")") + ";"); } } - node_shader_write(frag, 'fragColor[1] = vec4(mask_view, mask_view, mask_view, 1.0);'); + node_shader_write(frag, "fragColor[1] = vec4(mask_view, mask_view, mask_view, 1.0);"); } else { - node_shader_write(frag, 'fragColor[1] = vec4(1.0, 0.0, 1.0, 1.0);'); // Pink + node_shader_write(frag, "fragColor[1] = vec4(1.0, 0.0, 1.0, 1.0);"); // Pink } if (context_raw.viewport_mode != viewport_mode_t.LIT && context_raw.viewport_mode != viewport_mode_t.PATH_TRACE) { - node_shader_write(frag, 'fragColor[1].rgb = pow(fragColor[1].rgb, vec3(2.2, 2.2, 2.2));'); + node_shader_write(frag, "fragColor[1].rgb = pow(fragColor[1].rgb, vec3(2.2, 2.2, 2.2));"); } - node_shader_write(frag, 'n /= (abs(n.x) + abs(n.y) + abs(n.z));'); - node_shader_write(frag, 'n.xy = n.z >= 0.0 ? n.xy : octahedronWrap(n.xy);'); - node_shader_write(frag, 'fragColor[0] = vec4(n.xy, roughness, packFloatInt16(metallic, uint(int(matid * 255.0) % 3)));'); + node_shader_write(frag, "n /= (abs(n.x) + abs(n.y) + abs(n.z));"); + node_shader_write(frag, "n.xy = n.z >= 0.0 ? n.xy : octahedronWrap(n.xy);"); + node_shader_write(frag, "fragColor[0] = vec4(n.xy, roughness, packFloatInt16(metallic, uint(int(matid * 255.0) % 3)));"); } - node_shader_write(frag, 'vec2 posa = (wvpposition.xy / wvpposition.w) * 0.5 + 0.5;'); - node_shader_write(frag, 'vec2 posb = (prevwvpposition.xy / prevwvpposition.w) * 0.5 + 0.5;'); - node_shader_write(frag, 'fragColor[2] = vec4(posa - posb, texCoord.xy);'); + node_shader_write(frag, "vec2 posa = (wvpposition.xy / wvpposition.w) * 0.5 + 0.5;"); + node_shader_write(frag, "vec2 posb = (prevwvpposition.xy / prevwvpposition.w) * 0.5 + 0.5;"); + node_shader_write(frag, "fragColor[2] = vec4(posa - posb, texCoord.xy);"); parser_material_finalize(con_mesh); con_mesh.data.shader_from_source = true; diff --git a/armorpaint/Sources/make_mesh_preview.ts b/armorpaint/Sources/make_mesh_preview.ts index 317350cc..7e8c7fcf 100644 --- a/armorpaint/Sources/make_mesh_preview.ts +++ b/armorpaint/Sources/make_mesh_preview.ts @@ -22,28 +22,28 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no let skin: bool = mesh_data_get_vertex_array(context_raw.paint_object.data, "bone") != null; if (skin) { pos = "spos"; - node_shader_context_add_elem(con_mesh, "bone", 'short4norm'); - node_shader_context_add_elem(con_mesh, "weight", 'short4norm'); + node_shader_context_add_elem(con_mesh, "bone", "short4norm"); + node_shader_context_add_elem(con_mesh, "weight", "short4norm"); node_shader_add_function(vert, str_get_skinning_dual_quat); - node_shader_add_uniform(vert, 'vec4 skinBones[128 * 2]', '_skin_bones'); - node_shader_add_uniform(vert, 'float posUnpack', '_pos_unpack'); - node_shader_write_attrib(vert, 'vec4 skinA;'); - node_shader_write_attrib(vert, 'vec4 skinB;'); - node_shader_write_attrib(vert, 'getSkinningDualQuat(ivec4(bone * 32767), weight, skinA, skinB);'); - node_shader_write_attrib(vert, 'vec3 spos = pos.xyz;'); - node_shader_write_attrib(vert, 'spos.xyz *= posUnpack;'); - node_shader_write_attrib(vert, 'spos.xyz += 2.0 * cross(skinA.xyz, cross(skinA.xyz, spos.xyz) + skinA.w * spos.xyz);'); - node_shader_write_attrib(vert, 'spos.xyz += 2.0 * (skinA.w * skinB.xyz - skinB.w * skinA.xyz + cross(skinA.xyz, skinB.xyz));'); - node_shader_write_attrib(vert, 'spos.xyz /= posUnpack;'); + node_shader_add_uniform(vert, "vec4 skinBones[128 * 2]", "_skin_bones"); + node_shader_add_uniform(vert, "float posUnpack", "_pos_unpack"); + node_shader_write_attrib(vert, "vec4 skinA;"); + node_shader_write_attrib(vert, "vec4 skinB;"); + node_shader_write_attrib(vert, "getSkinningDualQuat(ivec4(bone * 32767), weight, skinA, skinB);"); + node_shader_write_attrib(vert, "vec3 spos = pos.xyz;"); + node_shader_write_attrib(vert, "spos.xyz *= posUnpack;"); + node_shader_write_attrib(vert, "spos.xyz += 2.0 * cross(skinA.xyz, cross(skinA.xyz, spos.xyz) + skinA.w * spos.xyz);"); + node_shader_write_attrib(vert, "spos.xyz += 2.0 * (skinA.w * skinB.xyz - skinB.w * skinA.xyz + cross(skinA.xyz, skinB.xyz));"); + node_shader_write_attrib(vert, "spos.xyz /= posUnpack;"); } ///end - node_shader_add_uniform(vert, 'mat4 WVP', '_world_view_proj_matrix'); - node_shader_write_attrib(vert, `gl_Position = mul(vec4(${pos}.xyz, 1.0), WVP);`); + node_shader_add_uniform(vert, "mat4 WVP", "_world_view_proj_matrix"); + node_shader_write_attrib(vert, "gl_Position = mul(vec4(" + pos + ".xyz, 1.0), WVP);"); let brush_scale: string = (context_raw.brush_scale * context_raw.brush_nodes_scale) + ""; - node_shader_add_out(vert, 'vec2 texCoord'); - node_shader_write_attrib(vert, `texCoord = tex * float(${brush_scale});`); + node_shader_add_out(vert, "vec2 texCoord"); + node_shader_write_attrib(vert, "texCoord = tex * float(" + brush_scale + ");"); let decal: bool = context_raw.decal_preview; parser_material_sample_keep_aspect = decal; @@ -61,36 +61,36 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no let opac: string = sout.out_opacity; let height: string = sout.out_height; let nortan: string = parser_material_out_normaltan; - node_shader_write(frag, `vec3 basecol = pow(${base}, vec3(2.2, 2.2, 2.2));`); - node_shader_write(frag, `float roughness = ${rough};`); - node_shader_write(frag, `float metallic = ${met};`); - node_shader_write(frag, `float occlusion = ${occ};`); - node_shader_write(frag, `float opacity = ${opac};`); - node_shader_write(frag, `vec3 nortan = ${nortan};`); - node_shader_write(frag, `float height = ${height};`); + node_shader_write(frag, "vec3 basecol = pow(" + base + ", vec3(2.2, 2.2, 2.2));"); + node_shader_write(frag, "float roughness = " + rough + ";"); + node_shader_write(frag, "float metallic = " + met + ";"); + node_shader_write(frag, "float occlusion = " + occ + ";"); + node_shader_write(frag, "float opacity = " + opac + ";"); + node_shader_write(frag, "vec3 nortan = " + nortan + ";"); + node_shader_write(frag, "float height = " + height + ";"); // parse_height_as_channel = false; - // write(vert, `float vheight = ${height};`); - // add_out(vert, 'float height'); - // write(vert, 'height = vheight;'); + // write(vert, "float vheight = " + height + ";"); + // add_out(vert, "float height"); + // write(vert, "height = vheight;"); // let displaceStrength: f32 = 0.1; // if (heightUsed && displaceStrength > 0.0) { - // write(vert, `vec3 pos2 = ${pos}.xyz + vec3(nor.xy, pos.w) * vec3(${height}, ${height}, ${height}) * vec3(${displaceStrength}, ${displaceStrength}, ${displaceStrength});`); - // write(vert, 'gl_Position = mul(vec4(pos2.xyz, 1.0), WVP);'); + // write(vert, "vec3 pos2 = " + pos + ".xyz + vec3(nor.xy, pos.w) * vec3(" + height + ", " + height + ", " + height + ") * vec3(" + displaceStrength + ", " + displaceStrength + ", " + displaceStrength + ");"); + // write(vert, "gl_Position = mul(vec4(pos2.xyz, 1.0), WVP);"); // } if (decal) { if (context_raw.tool == workspace_tool_t.TEXT) { - node_shader_add_uniform(frag, 'sampler2D textexttool', '_textexttool'); - node_shader_write(frag, `opacity *= textureLod(textexttool, texCoord / float(${brush_scale}), 0.0).r;`); + node_shader_add_uniform(frag, "sampler2D textexttool", "_textexttool"); + node_shader_write(frag, "opacity *= textureLod(textexttool, texCoord / float(" + brush_scale + "), 0.0).r;"); } } if (decal) { let opac: f32 = make_mesh_preview_opacity_discard_decal; - node_shader_write(frag, `if (opacity < ${opac}) discard;`); + node_shader_write(frag, "if (opacity < " + opac + ") discard;"); } - node_shader_add_out(frag, 'vec4 fragColor[3]'); + node_shader_add_out(frag, "vec4 fragColor[3]"); frag.n = true; node_shader_add_function(frag, str_pack_float_int16); @@ -98,16 +98,16 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no node_shader_add_function(frag, str_octahedron_wrap); if (make_material_height_used) { - node_shader_write(frag, 'if (height > 0.0) {'); - node_shader_write(frag, 'float height_dx = dFdx(height * 2.0);'); - node_shader_write(frag, 'float height_dy = dFdy(height * 2.0);'); - // write(frag, 'float height_dx = height0 - height1;'); - // write(frag, 'float height_dy = height2 - height3;'); + node_shader_write(frag, "if (height > 0.0) {"); + node_shader_write(frag, "float height_dx = dFdx(height * 2.0);"); + node_shader_write(frag, "float height_dy = dFdy(height * 2.0);"); + // write(frag, "float height_dx = height0 - height1;"); + // write(frag, "float height_dy = height2 - height3;"); // Whiteout blend - node_shader_write(frag, 'vec3 n1 = nortan * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0);'); - node_shader_write(frag, 'vec3 n2 = normalize(vec3(height_dx * 16.0, height_dy * 16.0, 1.0));'); - node_shader_write(frag, 'nortan = normalize(vec3(n1.xy + n2.xy, n1.z * n2.z)) * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5);'); - node_shader_write(frag, '}'); + node_shader_write(frag, "vec3 n1 = nortan * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0);"); + node_shader_write(frag, "vec3 n2 = normalize(vec3(height_dx * 16.0, height_dy * 16.0, 1.0));"); + node_shader_write(frag, "nortan = normalize(vec3(n1.xy + n2.xy, n1.z * n2.z)) * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5);"); + node_shader_write(frag, "}"); } // Apply normal channel @@ -117,34 +117,34 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no else { frag.vvec = true; ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, 'mat3 TBN = cotangentFrame(n, vVec, texCoord);'); + node_shader_write(frag, "mat3 TBN = cotangentFrame(n, vVec, texCoord);"); ///else - node_shader_write(frag, 'mat3 TBN = cotangentFrame(n, -vVec, texCoord);'); + node_shader_write(frag, "mat3 TBN = cotangentFrame(n, -vVec, texCoord);"); ///end - node_shader_write(frag, 'n = nortan * 2.0 - 1.0;'); - node_shader_write(frag, 'n.y = -n.y;'); - node_shader_write(frag, 'n = normalize(mul(n, TBN));'); + node_shader_write(frag, "n = nortan * 2.0 - 1.0;"); + node_shader_write(frag, "n.y = -n.y;"); + node_shader_write(frag, "n = normalize(mul(n, TBN));"); } - node_shader_write(frag, 'n /= (abs(n.x) + abs(n.y) + abs(n.z));'); - node_shader_write(frag, 'n.xy = n.z >= 0.0 ? n.xy : octahedronWrap(n.xy);'); + node_shader_write(frag, "n /= (abs(n.x) + abs(n.y) + abs(n.z));"); + node_shader_write(frag, "n.xy = n.z >= 0.0 ? n.xy : octahedronWrap(n.xy);"); // uint matid = 0; if (decal) { - node_shader_write(frag, 'fragColor[0] = vec4(n.x, n.y, roughness, packFloatInt16(metallic, uint(0)));'); // metallic/matid - node_shader_write(frag, 'fragColor[1] = vec4(basecol, occlusion);'); + node_shader_write(frag, "fragColor[0] = vec4(n.x, n.y, roughness, packFloatInt16(metallic, uint(0)));"); // metallic/matid + node_shader_write(frag, "fragColor[1] = vec4(basecol, occlusion);"); } else { - node_shader_write(frag, 'fragColor[0] = vec4(n.x, n.y, mix(1.0, roughness, opacity), packFloatInt16(mix(1.0, metallic, opacity), uint(0)));'); // metallic/matid - node_shader_write(frag, 'fragColor[1] = vec4(mix(vec3(0.0, 0.0, 0.0), basecol, opacity), occlusion);'); + node_shader_write(frag, "fragColor[0] = vec4(n.x, n.y, mix(1.0, roughness, opacity), packFloatInt16(mix(1.0, metallic, opacity), uint(0)));"); // metallic/matid + node_shader_write(frag, "fragColor[1] = vec4(mix(vec3(0.0, 0.0, 0.0), basecol, opacity), occlusion);"); } - node_shader_write(frag, 'fragColor[2] = vec4(0.0, 0.0, 0.0, 0.0);'); // veloc + node_shader_write(frag, "fragColor[2] = vec4(0.0, 0.0, 0.0, 0.0);"); // veloc parser_material_finalize(con_mesh); ///if arm_skin if (skin) { - node_shader_write(vert, 'wnormal = normalize(mul(vec3(nor.xy, pos.w) + 2.0 * cross(skinA.xyz, cross(skinA.xyz, vec3(nor.xy, pos.w)) + skinA.w * vec3(nor.xy, pos.w)), N));'); + node_shader_write(vert, "wnormal = normalize(mul(vec3(nor.xy, pos.w) + 2.0 * cross(skinA.xyz, cross(skinA.xyz, vec3(nor.xy, pos.w)) + skinA.w * vec3(nor.xy, pos.w)), N));"); } ///end diff --git a/armorpaint/Sources/make_node_preview.ts b/armorpaint/Sources/make_node_preview.ts index 976c2303..f00bda01 100644 --- a/armorpaint/Sources/make_node_preview.ts +++ b/armorpaint/Sources/make_node_preview.ts @@ -15,12 +15,12 @@ function make_node_preview_run(data: material_t, matcon: material_context_t, nod let frag: node_shader_t = node_shader_context_make_frag(con_mesh); frag.ins = vert.outs; - node_shader_write_attrib(vert, 'gl_Position = vec4(pos.xy * 3.0, 0.0, 1.0);'); // Pos unpack - node_shader_write_attrib(vert, 'const vec2 madd = vec2(0.5, 0.5);'); - node_shader_add_out(vert, 'vec2 texCoord'); - node_shader_write_attrib(vert, 'texCoord = gl_Position.xy * madd + madd;'); + node_shader_write_attrib(vert, "gl_Position = vec4(pos.xy * 3.0, 0.0, 1.0);"); // Pos unpack + node_shader_write_attrib(vert, "const vec2 madd = vec2(0.5, 0.5);"); + node_shader_add_out(vert, "vec2 texCoord"); + node_shader_write_attrib(vert, "texCoord = gl_Position.xy * madd + madd;"); ///if (!krom_opengl) - node_shader_write_attrib(vert, 'texCoord.y = 1.0 - texCoord.y;'); + node_shader_write_attrib(vert, "texCoord.y = 1.0 - texCoord.y;"); ///end parser_material_init(); @@ -50,13 +50,13 @@ function make_node_preview_run(data: material_t, matcon: material_context_t, nod } array_remove(links, link); - node_shader_add_out(frag, 'vec4 fragColor'); - node_shader_write(frag, `vec3 basecol = ${res};`); - node_shader_write(frag, 'fragColor = vec4(basecol.rgb, 1.0);'); + node_shader_add_out(frag, "vec4 fragColor"); + node_shader_write(frag, "vec3 basecol = " + res + ";"); + node_shader_write(frag, "fragColor = vec4(basecol.rgb, 1.0);"); // frag.ndcpos = true; - // add_out(vert, 'vec4 ndc'); - // write_attrib(vert, 'ndc = vec4(gl_Position.xyz * vec3(0.5, 0.5, 0.0) + vec3(0.5, 0.5, 0.0), 1.0);'); + // add_out(vert, "vec4 ndc"); + // write_attrib(vert, "ndc = vec4(gl_Position.xyz * vec3(0.5, 0.5, 0.0) + vec3(0.5, 0.5, 0.0), 1.0);"); parser_material_finalize(con_mesh); diff --git a/armorpaint/Sources/make_paint.ts b/armorpaint/Sources/make_paint.ts index 78d71698..f69829e7 100644 --- a/armorpaint/Sources/make_paint.ts +++ b/armorpaint/Sources/make_paint.ts @@ -31,7 +31,7 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad con_paint.data.color_writes_green = [true, true, true, true]; con_paint.data.color_writes_blue = [true, true, true, true]; con_paint.data.color_writes_alpha = [true, true, true, true]; - con_paint.allow_vcols = mesh_data_get_vertex_array(context_raw.paint_object.data, 'col') != null; + con_paint.allow_vcols = mesh_data_get_vertex_array(context_raw.paint_object.data, "col") != null; let vert: node_shader_t = node_shader_context_make_vert(con_paint); let frag: node_shader_t = node_shader_context_make_frag(con_paint); @@ -65,47 +65,47 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad let decal: bool = context_raw.tool == workspace_tool_t.DECAL || context_raw.tool == workspace_tool_t.TEXT; ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(vert, 'vec2 tpos = vec2(tex.x * 2.0 - 1.0, (1.0 - tex.y) * 2.0 - 1.0);'); + node_shader_write(vert, "vec2 tpos = vec2(tex.x * 2.0 - 1.0, (1.0 - tex.y) * 2.0 - 1.0);"); ///else - node_shader_write(vert, 'vec2 tpos = vec2(tex.xy * 2.0 - 1.0);'); + node_shader_write(vert, "vec2 tpos = vec2(tex.xy * 2.0 - 1.0);"); ///end - node_shader_write(vert, 'gl_Position = vec4(tpos, 0.0, 1.0);'); + node_shader_write(vert, "gl_Position = vec4(tpos, 0.0, 1.0);"); let decal_layer: bool = context_raw.layer.fill_layer != null && context_raw.layer.uv_type == uv_type_t.PROJECT; if (decal_layer) { - node_shader_add_uniform(vert, 'mat4 WVP', '_decalLayerMatrix'); + node_shader_add_uniform(vert, "mat4 WVP", "_decalLayerMatrix"); } else { - node_shader_add_uniform(vert, 'mat4 WVP', '_world_view_proj_matrix'); + node_shader_add_uniform(vert, "mat4 WVP", "_world_view_proj_matrix"); } - node_shader_add_out(vert, 'vec4 ndc'); - node_shader_write_attrib(vert, 'ndc = mul(vec4(pos.xyz, 1.0), WVP);'); + node_shader_add_out(vert, "vec4 ndc"); + node_shader_write_attrib(vert, "ndc = mul(vec4(pos.xyz, 1.0), WVP);"); - node_shader_write_attrib(frag, 'vec3 sp = vec3((ndc.xyz / ndc.w) * 0.5 + 0.5);'); - node_shader_write_attrib(frag, 'sp.y = 1.0 - sp.y;'); - node_shader_write_attrib(frag, 'sp.z -= 0.0001;'); // small bias + node_shader_write_attrib(frag, "vec3 sp = vec3((ndc.xyz / ndc.w) * 0.5 + 0.5);"); + node_shader_write_attrib(frag, "sp.y = 1.0 - sp.y;"); + node_shader_write_attrib(frag, "sp.z -= 0.0001;"); // small bias let uv_type: uv_type_t = context_raw.layer.fill_layer != null ? context_raw.layer.uv_type : context_raw.brush_paint; if (uv_type == uv_type_t.PROJECT) { frag.ndcpos = true; } - node_shader_add_uniform(frag, 'vec4 inp', '_inputBrush'); - node_shader_add_uniform(frag, 'vec4 inplast', '_inputBrushLast'); - node_shader_add_uniform(frag, 'float aspectRatio', '_aspect_ratio_window'); - node_shader_write(frag, 'vec2 bsp = sp.xy * 2.0 - 1.0;'); - node_shader_write(frag, 'bsp.x *= aspectRatio;'); - node_shader_write(frag, 'bsp = bsp * 0.5 + 0.5;'); + node_shader_add_uniform(frag, "vec4 inp", "_inputBrush"); + node_shader_add_uniform(frag, "vec4 inplast", "_inputBrushLast"); + node_shader_add_uniform(frag, "float aspectRatio", "_aspect_ratio_window"); + node_shader_write(frag, "vec2 bsp = sp.xy * 2.0 - 1.0;"); + node_shader_write(frag, "bsp.x *= aspectRatio;"); + node_shader_write(frag, "bsp = bsp * 0.5 + 0.5;"); - node_shader_add_uniform(frag, 'sampler2D gbufferD'); + node_shader_add_uniform(frag, "sampler2D gbufferD"); - node_shader_add_out(frag, 'vec4 fragColor[4]'); + node_shader_add_out(frag, "vec4 fragColor[4]"); - node_shader_add_uniform(frag, 'float brushRadius', '_brushRadius'); - node_shader_add_uniform(frag, 'float brushOpacity', '_brushOpacity'); - node_shader_add_uniform(frag, 'float brushHardness', '_brushHardness'); + node_shader_add_uniform(frag, "float brushRadius", "_brushRadius"); + node_shader_add_uniform(frag, "float brushOpacity", "_brushOpacity"); + node_shader_add_uniform(frag, "float brushHardness", "_brushHardness"); if (context_raw.tool == workspace_tool_t.BRUSH || context_raw.tool == workspace_tool_t.ERASER || @@ -130,42 +130,42 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad if (depth_reject) { ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, 'if (sp.z > textureLod(gbufferD, sp.xy, 0.0).r + 0.0005) discard;'); + node_shader_write(frag, "if (sp.z > textureLod(gbufferD, sp.xy, 0.0).r + 0.0005) discard;"); ///else - node_shader_write(frag, 'if (sp.z > textureLod(gbufferD, vec2(sp.x, 1.0 - sp.y), 0.0).r + 0.0005) discard;'); + node_shader_write(frag, "if (sp.z > textureLod(gbufferD, vec2(sp.x, 1.0 - sp.y), 0.0).r + 0.0005) discard;"); ///end } make_brush_run(vert, frag); } else { // Fill, Bake - node_shader_write(frag, 'float dist = 0.0;'); + node_shader_write(frag, "float dist = 0.0;"); let angle_fill: bool = context_raw.tool == workspace_tool_t.FILL && context_raw.fill_type_handle.position == fill_type_t.ANGLE; if (angle_fill) { node_shader_add_function(frag, str_octahedron_wrap); - node_shader_add_uniform(frag, 'sampler2D gbuffer0'); - node_shader_write(frag, 'vec2 g0 = textureLod(gbuffer0, inp.xy, 0.0).rg;'); - node_shader_write(frag, 'vec3 wn;'); - node_shader_write(frag, 'wn.z = 1.0 - abs(g0.x) - abs(g0.y);'); - node_shader_write(frag, 'wn.xy = wn.z >= 0.0 ? g0.xy : octahedronWrap(g0.xy);'); - node_shader_write(frag, 'wn = normalize(wn);'); + node_shader_add_uniform(frag, "sampler2D gbuffer0"); + node_shader_write(frag, "vec2 g0 = textureLod(gbuffer0, inp.xy, 0.0).rg;"); + node_shader_write(frag, "vec3 wn;"); + node_shader_write(frag, "wn.z = 1.0 - abs(g0.x) - abs(g0.y);"); + node_shader_write(frag, "wn.xy = wn.z >= 0.0 ? g0.xy : octahedronWrap(g0.xy);"); + node_shader_write(frag, "wn = normalize(wn);"); frag.n = true; let angle: f32 = context_raw.brush_angle_reject_dot; - node_shader_write(frag, `if (dot(wn, n) < ${angle}) discard;`); + node_shader_write(frag, "if (dot(wn, n) < " + angle + ") discard;"); } let stencil_fill: bool = context_raw.tool == workspace_tool_t.FILL && context_raw.brush_stencil_image != null; if (stencil_fill) { ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, 'if (sp.z > textureLod(gbufferD, sp.xy, 0.0).r + 0.0005) discard;'); + node_shader_write(frag, "if (sp.z > textureLod(gbufferD, sp.xy, 0.0).r + 0.0005) discard;"); ///else - node_shader_write(frag, 'if (sp.z > textureLod(gbufferD, vec2(sp.x, 1.0 - sp.y), 0.0).r + 0.0005) discard;'); + node_shader_write(frag, "if (sp.z > textureLod(gbufferD, vec2(sp.x, 1.0 - sp.y), 0.0).r + 0.0005) discard;"); ///end } } if (context_raw.colorid_picked || face_fill || uv_island_fill) { - node_shader_add_out(vert, 'vec2 texCoordPick'); - node_shader_write(vert, 'texCoordPick = tex;'); + node_shader_add_out(vert, "vec2 texCoordPick"); + node_shader_write(vert, "texCoordPick = tex;"); if (context_raw.colorid_picked) { make_discard_color_id(vert, frag); } @@ -184,11 +184,11 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad make_texcoord_run(vert, frag); if (context_raw.tool == workspace_tool_t.CLONE || context_raw.tool == workspace_tool_t.BLUR || context_raw.tool == workspace_tool_t.SMUDGE) { - node_shader_add_uniform(frag, 'sampler2D gbuffer2'); - node_shader_add_uniform(frag, 'vec2 gbufferSize', '_gbufferSize'); - node_shader_add_uniform(frag, 'sampler2D texpaint_undo', '_texpaint_undo'); - node_shader_add_uniform(frag, 'sampler2D texpaint_nor_undo', '_texpaint_nor_undo'); - node_shader_add_uniform(frag, 'sampler2D texpaint_pack_undo', '_texpaint_pack_undo'); + node_shader_add_uniform(frag, "sampler2D gbuffer2"); + node_shader_add_uniform(frag, "vec2 gbufferSize", "_gbufferSize"); + node_shader_add_uniform(frag, "sampler2D texpaint_undo", "_texpaint_undo"); + node_shader_add_uniform(frag, "sampler2D texpaint_nor_undo", "_texpaint_nor_undo"); + node_shader_add_uniform(frag, "sampler2D texpaint_pack_undo", "_texpaint_pack_undo"); if (context_raw.tool == workspace_tool_t.CLONE) { make_clone_run(vert, frag); @@ -205,7 +205,7 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad let uv_type: uv_type_t = context_raw.layer.fill_layer != null ? context_raw.layer.uv_type : context_raw.brush_paint; parser_material_triplanar = uv_type == uv_type_t.TRIPLANAR && !decal; parser_material_sample_keep_aspect = decal; - parser_material_sample_uv_scale = 'brushScale'; + parser_material_sample_uv_scale = "brushScale"; let sout: shader_out_t = parser_material_parse(ui_nodes_get_canvas_material(), con_paint, vert, frag, matcon); parser_material_parse_emission = false; parser_material_parse_subsurface = false; @@ -220,22 +220,22 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad let opac: string = sout.out_opacity; let emis: string = sout.out_emission; let subs: string = sout.out_subsurface; - node_shader_write(frag, `vec3 basecol = ${base};`); - node_shader_write(frag, `float roughness = ${rough};`); - node_shader_write(frag, `float metallic = ${met};`); - node_shader_write(frag, `float occlusion = ${occ};`); - node_shader_write(frag, `vec3 nortan = ${nortan};`); - node_shader_write(frag, `float height = ${height};`); - node_shader_write(frag, `float mat_opacity = ${opac};`); - node_shader_write(frag, 'float opacity = mat_opacity;'); + node_shader_write(frag, "vec3 basecol = " + base + ";"); + node_shader_write(frag, "float roughness = " + rough + ";"); + node_shader_write(frag, "float metallic = " + met + ";"); + node_shader_write(frag, "float occlusion = " + occ + ";"); + node_shader_write(frag, "vec3 nortan = " + nortan + ";"); + node_shader_write(frag, "float height = " + height + ";"); + node_shader_write(frag, "float mat_opacity = " + opac + ";"); + node_shader_write(frag, "float opacity = mat_opacity;"); if (context_raw.layer.fill_layer == null) { - node_shader_write(frag, 'opacity *= brushOpacity;'); + node_shader_write(frag, "opacity *= brushOpacity;"); } if (context_raw.material.paint_emis) { - node_shader_write(frag, `float emis = ${emis};`); + node_shader_write(frag, "float emis = " + emis + ";"); } if (context_raw.material.paint_subs) { - node_shader_write(frag, `float subs = ${subs};`); + node_shader_write(frag, "float subs = " + subs + ";"); } if (parse_float(height) != 0.0 && !make_material_height_used) { make_material_height_used = true; @@ -251,18 +251,18 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad } if (context_raw.brush_mask_image != null && context_raw.tool == workspace_tool_t.DECAL) { - node_shader_add_uniform(frag, 'sampler2D texbrushmask', '_texbrushmask'); - node_shader_write(frag, 'vec4 mask_sample = textureLod(texbrushmask, uvsp, 0.0);'); + node_shader_add_uniform(frag, "sampler2D texbrushmask", "_texbrushmask"); + node_shader_write(frag, "vec4 mask_sample = textureLod(texbrushmask, uvsp, 0.0);"); if (context_raw.brush_mask_image_is_alpha) { - node_shader_write(frag, 'opacity *= mask_sample.a;'); + node_shader_write(frag, "opacity *= mask_sample.a;"); } else { - node_shader_write(frag, 'opacity *= mask_sample.r * mask_sample.a;'); + node_shader_write(frag, "opacity *= mask_sample.r * mask_sample.a;"); } } else if (context_raw.tool == workspace_tool_t.TEXT) { - node_shader_add_uniform(frag, 'sampler2D textexttool', '_textexttool'); - node_shader_write(frag, 'opacity *= textureLod(textexttool, uvsp, 0.0).r;'); + node_shader_add_uniform(frag, "sampler2D textexttool", "_textexttool"); + node_shader_write(frag, "opacity *= textureLod(textexttool, uvsp, 0.0).r;"); } if (context_raw.brush_stencil_image != null && ( @@ -274,124 +274,124 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad context_raw.tool == workspace_tool_t.SMUDGE || context_raw.tool == workspace_tool_t.PARTICLE || decal)) { - node_shader_add_uniform(frag, 'sampler2D texbrushstencil', '_texbrushstencil'); - node_shader_add_uniform(frag, 'vec4 stencilTransform', '_stencilTransform'); - node_shader_write(frag, 'vec2 stencil_uv = vec2((sp.xy - stencilTransform.xy) / stencilTransform.z * vec2(aspectRatio, 1.0));'); - node_shader_write(frag, 'vec2 stencil_size = vec2(textureSize(texbrushstencil, 0));'); - node_shader_write(frag, 'float stencil_ratio = stencil_size.y / stencil_size.x;'); - node_shader_write(frag, 'stencil_uv -= vec2(0.5 / stencil_ratio, 0.5);'); - node_shader_write(frag, `stencil_uv = vec2(stencil_uv.x * cos(stencilTransform.w) - stencil_uv.y * sin(stencilTransform.w), - stencil_uv.x * sin(stencilTransform.w) + stencil_uv.y * cos(stencilTransform.w));`); - node_shader_write(frag, 'stencil_uv += vec2(0.5 / stencil_ratio, 0.5);'); - node_shader_write(frag, 'stencil_uv.x *= stencil_ratio;'); - node_shader_write(frag, 'if (stencil_uv.x < 0 || stencil_uv.x > 1 || stencil_uv.y < 0 || stencil_uv.y > 1) discard;'); - node_shader_write(frag, 'vec4 texbrushstencil_sample = textureLod(texbrushstencil, stencil_uv, 0.0);'); + node_shader_add_uniform(frag, "sampler2D texbrushstencil", "_texbrushstencil"); + node_shader_add_uniform(frag, "vec4 stencilTransform", "_stencilTransform"); + node_shader_write(frag, "vec2 stencil_uv = vec2((sp.xy - stencilTransform.xy) / stencilTransform.z * vec2(aspectRatio, 1.0));"); + node_shader_write(frag, "vec2 stencil_size = vec2(textureSize(texbrushstencil, 0));"); + node_shader_write(frag, "float stencil_ratio = stencil_size.y / stencil_size.x;"); + node_shader_write(frag, "stencil_uv -= vec2(0.5 / stencil_ratio, 0.5);"); + node_shader_write(frag, "stencil_uv = vec2(stencil_uv.x * cos(stencilTransform.w) - stencil_uv.y * sin(stencilTransform.w),\ + stencil_uv.x * sin(stencilTransform.w) + stencil_uv.y * cos(stencilTransform.w));"); + node_shader_write(frag, "stencil_uv += vec2(0.5 / stencil_ratio, 0.5);"); + node_shader_write(frag, "stencil_uv.x *= stencil_ratio;"); + node_shader_write(frag, "if (stencil_uv.x < 0 || stencil_uv.x > 1 || stencil_uv.y < 0 || stencil_uv.y > 1) discard;"); + node_shader_write(frag, "vec4 texbrushstencil_sample = textureLod(texbrushstencil, stencil_uv, 0.0);"); if (context_raw.brush_stencil_image_is_alpha) { - node_shader_write(frag, 'opacity *= texbrushstencil_sample.a;'); + node_shader_write(frag, "opacity *= texbrushstencil_sample.a;"); } else { - node_shader_write(frag, 'opacity *= texbrushstencil_sample.r * texbrushstencil_sample.a;'); + node_shader_write(frag, "opacity *= texbrushstencil_sample.r * texbrushstencil_sample.a;"); } } if (context_raw.brush_mask_image != null && (context_raw.tool == workspace_tool_t.BRUSH || context_raw.tool == workspace_tool_t.ERASER)) { - node_shader_add_uniform(frag, 'sampler2D texbrushmask', '_texbrushmask'); - node_shader_write(frag, 'vec2 binp_mask = inp.xy * 2.0 - 1.0;'); - node_shader_write(frag, 'binp_mask.x *= aspectRatio;'); - node_shader_write(frag, 'binp_mask = binp_mask * 0.5 + 0.5;'); - node_shader_write(frag, 'vec2 pa_mask = bsp.xy - binp_mask.xy;'); + node_shader_add_uniform(frag, "sampler2D texbrushmask", "_texbrushmask"); + node_shader_write(frag, "vec2 binp_mask = inp.xy * 2.0 - 1.0;"); + node_shader_write(frag, "binp_mask.x *= aspectRatio;"); + node_shader_write(frag, "binp_mask = binp_mask * 0.5 + 0.5;"); + node_shader_write(frag, "vec2 pa_mask = bsp.xy - binp_mask.xy;"); if (context_raw.brush_directional) { - node_shader_add_uniform(frag, 'vec3 brushDirection', '_brushDirection'); - node_shader_write(frag, 'if (brushDirection.z == 0.0) discard;'); - node_shader_write(frag, 'pa_mask = vec2(pa_mask.x * brushDirection.x - pa_mask.y * brushDirection.y, pa_mask.x * brushDirection.y + pa_mask.y * brushDirection.x);'); + node_shader_add_uniform(frag, "vec3 brushDirection", "_brushDirection"); + node_shader_write(frag, "if (brushDirection.z == 0.0) discard;"); + node_shader_write(frag, "pa_mask = vec2(pa_mask.x * brushDirection.x - pa_mask.y * brushDirection.y, pa_mask.x * brushDirection.y + pa_mask.y * brushDirection.x);"); } let angle: f32 = context_raw.brush_angle + context_raw.brush_nodes_angle; if (angle != 0.0) { - node_shader_add_uniform(frag, 'vec2 brushAngle', '_brushAngle'); - node_shader_write(frag, 'pa_mask.xy = vec2(pa_mask.x * brushAngle.x - pa_mask.y * brushAngle.y, pa_mask.x * brushAngle.y + pa_mask.y * brushAngle.x);'); + node_shader_add_uniform(frag, "vec2 brushAngle", "_brushAngle"); + node_shader_write(frag, "pa_mask.xy = vec2(pa_mask.x * brushAngle.x - pa_mask.y * brushAngle.y, pa_mask.x * brushAngle.y + pa_mask.y * brushAngle.x);"); } - node_shader_write(frag, 'pa_mask /= brushRadius;'); + node_shader_write(frag, "pa_mask /= brushRadius;"); if (config_raw.brush_3d) { - node_shader_add_uniform(frag, 'vec3 eye', '_camera_pos'); - node_shader_write(frag, 'pa_mask *= distance(eye, winp.xyz) / 1.5;'); + node_shader_add_uniform(frag, "vec3 eye", "_camera_pos"); + node_shader_write(frag, "pa_mask *= distance(eye, winp.xyz) / 1.5;"); } - node_shader_write(frag, 'pa_mask = pa_mask.xy * 0.5 + 0.5;'); - node_shader_write(frag, 'vec4 mask_sample = textureLod(texbrushmask, pa_mask, 0.0);'); + node_shader_write(frag, "pa_mask = pa_mask.xy * 0.5 + 0.5;"); + node_shader_write(frag, "vec4 mask_sample = textureLod(texbrushmask, pa_mask, 0.0);"); if (context_raw.brush_mask_image_is_alpha) { - node_shader_write(frag, 'opacity *= mask_sample.a;'); + node_shader_write(frag, "opacity *= mask_sample.a;"); } else { - node_shader_write(frag, 'opacity *= mask_sample.r * mask_sample.a;'); + node_shader_write(frag, "opacity *= mask_sample.r * mask_sample.a;"); } } - node_shader_write(frag, 'if (opacity == 0.0) discard;'); + node_shader_write(frag, "if (opacity == 0.0) discard;"); if (context_raw.tool == workspace_tool_t.PARTICLE) { // Particle mask make_particle_mask(vert, frag); } else { // Brush cursor mask - node_shader_write(frag, 'float str = clamp((brushRadius - dist) * brushHardness * 400.0, 0.0, 1.0) * opacity;'); + node_shader_write(frag, "float str = clamp((brushRadius - dist) * brushHardness * 400.0, 0.0, 1.0) * opacity;"); } // Manual blending to preserve memory frag.wvpposition = true; - node_shader_write(frag, 'vec2 sample_tc = vec2(wvpposition.xy / wvpposition.w) * 0.5 + 0.5;'); + node_shader_write(frag, "vec2 sample_tc = vec2(wvpposition.xy / wvpposition.w) * 0.5 + 0.5;"); ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, 'sample_tc.y = 1.0 - sample_tc.y;'); + node_shader_write(frag, "sample_tc.y = 1.0 - sample_tc.y;"); ///end - node_shader_add_uniform(frag, 'sampler2D paintmask'); - node_shader_write(frag, 'float sample_mask = textureLod(paintmask, sample_tc, 0.0).r;'); - node_shader_write(frag, 'str = max(str, sample_mask);'); - // write(frag, 'str = clamp(str + sample_mask, 0.0, 1.0);'); + node_shader_add_uniform(frag, "sampler2D paintmask"); + node_shader_write(frag, "float sample_mask = textureLod(paintmask, sample_tc, 0.0).r;"); + node_shader_write(frag, "str = max(str, sample_mask);"); + // write(frag, "str = clamp(str + sample_mask, 0.0, 1.0);"); - node_shader_add_uniform(frag, 'sampler2D texpaint_undo', '_texpaint_undo'); - node_shader_write(frag, 'vec4 sample_undo = textureLod(texpaint_undo, sample_tc, 0.0);'); + node_shader_add_uniform(frag, "sampler2D texpaint_undo", "_texpaint_undo"); + node_shader_write(frag, "vec4 sample_undo = textureLod(texpaint_undo, sample_tc, 0.0);"); let matid: f32 = context_raw.material.id / 255; if (context_raw.picker_mask_handle.position == picker_mask_t.MATERIAL) { matid = context_raw.materialid_picked / 255; // Keep existing material id in place when mask is set } let matid_string: string = parser_material_vec1(matid * 3.0); - node_shader_write(frag, `float matid = ${matid_string};`); + node_shader_write(frag, "float matid = " + matid_string + ";"); // matid % 3 == 0 - normal, 1 - emission, 2 - subsurface if (context_raw.material.paint_emis) { - node_shader_write(frag, 'if (emis > 0.0) {'); - node_shader_write(frag, ' matid += 1.0 / 255.0;'); - node_shader_write(frag, ' if (str == 0.0) discard;'); - node_shader_write(frag, '}'); + node_shader_write(frag, "if (emis > 0.0) {"); + node_shader_write(frag, " matid += 1.0 / 255.0;"); + node_shader_write(frag, " if (str == 0.0) discard;"); + node_shader_write(frag, "}"); } else if (context_raw.material.paint_subs) { - node_shader_write(frag, 'if (subs > 0.0) {'); - node_shader_write(frag, ' matid += 2.0 / 255.0;'); - node_shader_write(frag, ' if (str == 0.0) discard;'); - node_shader_write(frag, '}'); + node_shader_write(frag, "if (subs > 0.0) {"); + node_shader_write(frag, " matid += 2.0 / 255.0;"); + node_shader_write(frag, " if (str == 0.0) discard;"); + node_shader_write(frag, "}"); } let is_mask: bool = slot_layer_is_mask(context_raw.layer); let layered: bool = context_raw.layer != project_layers[0]; if (layered && !is_mask) { if (context_raw.tool == workspace_tool_t.ERASER) { - node_shader_write(frag, 'fragColor[0] = vec4(mix(sample_undo.rgb, vec3(0.0, 0.0, 0.0), str), sample_undo.a - str);'); - node_shader_write(frag, 'nortan = vec3(0.5, 0.5, 1.0);'); - node_shader_write(frag, 'occlusion = 1.0;'); - node_shader_write(frag, 'roughness = 0.0;'); - node_shader_write(frag, 'metallic = 0.0;'); - node_shader_write(frag, 'matid = 0.0;'); + node_shader_write(frag, "fragColor[0] = vec4(mix(sample_undo.rgb, vec3(0.0, 0.0, 0.0), str), sample_undo.a - str);"); + node_shader_write(frag, "nortan = vec3(0.5, 0.5, 1.0);"); + node_shader_write(frag, "occlusion = 1.0;"); + node_shader_write(frag, "roughness = 0.0;"); + node_shader_write(frag, "metallic = 0.0;"); + node_shader_write(frag, "matid = 0.0;"); } else if (context_raw.tool == workspace_tool_t.PARTICLE || decal || context_raw.brush_mask_image != null) { - node_shader_write(frag, 'fragColor[0] = vec4(' + make_material_blend_mode(frag, context_raw.brush_blending, 'sample_undo.rgb', 'basecol', 'str') + ', max(str, sample_undo.a));'); + node_shader_write(frag, "fragColor[0] = vec4(" + make_material_blend_mode(frag, context_raw.brush_blending, "sample_undo.rgb", "basecol", "str") + ", max(str, sample_undo.a));"); } else { if (context_raw.layer.fill_layer != null) { - node_shader_write(frag, 'fragColor[0] = vec4(' + make_material_blend_mode(frag, context_raw.brush_blending, 'sample_undo.rgb', 'basecol', 'opacity') + ', mat_opacity);'); + node_shader_write(frag, "fragColor[0] = vec4(" + make_material_blend_mode(frag, context_raw.brush_blending, "sample_undo.rgb", "basecol", "opacity") + ", mat_opacity);"); } else { - node_shader_write(frag, 'fragColor[0] = vec4(' + make_material_blend_mode(frag, context_raw.brush_blending, 'sample_undo.rgb', 'basecol', 'opacity') + ', max(str, sample_undo.a));'); + node_shader_write(frag, "fragColor[0] = vec4(" + make_material_blend_mode(frag, context_raw.brush_blending, "sample_undo.rgb", "basecol", "opacity") + ", max(str, sample_undo.a));"); } } - node_shader_write(frag, 'fragColor[1] = vec4(nortan, matid);'); + node_shader_write(frag, "fragColor[1] = vec4(nortan, matid);"); let height: string = "0.0"; if (context_raw.material.paint_height && make_material_height_used) { @@ -399,36 +399,36 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad } if (decal) { - node_shader_add_uniform(frag, 'sampler2D texpaint_pack_undo', '_texpaint_pack_undo'); - node_shader_write(frag, 'vec4 sample_pack_undo = textureLod(texpaint_pack_undo, sample_tc, 0.0);'); - node_shader_write(frag, `fragColor[2] = mix(sample_pack_undo, vec4(occlusion, roughness, metallic, ${height}), str);`); + node_shader_add_uniform(frag, "sampler2D texpaint_pack_undo", "_texpaint_pack_undo"); + node_shader_write(frag, "vec4 sample_pack_undo = textureLod(texpaint_pack_undo, sample_tc, 0.0);"); + node_shader_write(frag, "fragColor[2] = mix(sample_pack_undo, vec4(occlusion, roughness, metallic, " + height + "), str);"); } else { - node_shader_write(frag, `fragColor[2] = vec4(occlusion, roughness, metallic, ${height});`); + node_shader_write(frag, "fragColor[2] = vec4(occlusion, roughness, metallic, " + height + ");"); } } else { if (context_raw.tool == workspace_tool_t.ERASER) { - node_shader_write(frag, 'fragColor[0] = vec4(mix(sample_undo.rgb, vec3(0.0, 0.0, 0.0), str), sample_undo.a - str);'); - node_shader_write(frag, 'fragColor[1] = vec4(0.5, 0.5, 1.0, 0.0);'); - node_shader_write(frag, 'fragColor[2] = vec4(1.0, 0.0, 0.0, 0.0);'); + node_shader_write(frag, "fragColor[0] = vec4(mix(sample_undo.rgb, vec3(0.0, 0.0, 0.0), str), sample_undo.a - str);"); + node_shader_write(frag, "fragColor[1] = vec4(0.5, 0.5, 1.0, 0.0);"); + node_shader_write(frag, "fragColor[2] = vec4(1.0, 0.0, 0.0, 0.0);"); } else { - node_shader_add_uniform(frag, 'sampler2D texpaint_nor_undo', '_texpaint_nor_undo'); - node_shader_add_uniform(frag, 'sampler2D texpaint_pack_undo', '_texpaint_pack_undo'); - node_shader_write(frag, 'vec4 sample_nor_undo = textureLod(texpaint_nor_undo, sample_tc, 0.0);'); - node_shader_write(frag, 'vec4 sample_pack_undo = textureLod(texpaint_pack_undo, sample_tc, 0.0);'); - node_shader_write(frag, 'fragColor[0] = vec4(' + make_material_blend_mode(frag, context_raw.brush_blending, 'sample_undo.rgb', 'basecol', 'str') + ', max(str, sample_undo.a));'); - node_shader_write(frag, 'fragColor[1] = vec4(mix(sample_nor_undo.rgb, nortan, str), matid);'); + node_shader_add_uniform(frag, "sampler2D texpaint_nor_undo", "_texpaint_nor_undo"); + node_shader_add_uniform(frag, "sampler2D texpaint_pack_undo", "_texpaint_pack_undo"); + node_shader_write(frag, "vec4 sample_nor_undo = textureLod(texpaint_nor_undo, sample_tc, 0.0);"); + node_shader_write(frag, "vec4 sample_pack_undo = textureLod(texpaint_pack_undo, sample_tc, 0.0);"); + node_shader_write(frag, "fragColor[0] = vec4(" + make_material_blend_mode(frag, context_raw.brush_blending, "sample_undo.rgb", "basecol", "str") + ", max(str, sample_undo.a));"); + node_shader_write(frag, "fragColor[1] = vec4(mix(sample_nor_undo.rgb, nortan, str), matid);"); if (context_raw.material.paint_height && make_material_height_used) { - node_shader_write(frag, 'fragColor[2] = mix(sample_pack_undo, vec4(occlusion, roughness, metallic, height), str);'); + node_shader_write(frag, "fragColor[2] = mix(sample_pack_undo, vec4(occlusion, roughness, metallic, height), str);"); } else { - node_shader_write(frag, 'fragColor[2] = vec4(mix(sample_pack_undo.rgb, vec3(occlusion, roughness, metallic), str), 0.0);'); + node_shader_write(frag, "fragColor[2] = vec4(mix(sample_pack_undo.rgb, vec3(occlusion, roughness, metallic), str), 0.0);"); } } } - node_shader_write(frag, 'fragColor[3] = vec4(str, 0.0, 0.0, 1.0);'); + node_shader_write(frag, "fragColor[3] = vec4(str, 0.0, 0.0, 1.0);"); if (!context_raw.material.paint_base) { con_paint.data.color_writes_red[0] = false; @@ -459,7 +459,7 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad // Base color only as mask if (is_mask) { // TODO: Apply opacity into base - // write(frag, 'fragColor[0].rgb *= fragColor[0].a;'); + // write(frag, "fragColor[0].rgb *= fragColor[0].a;"); con_paint.data.color_writes_green[0] = false; con_paint.data.color_writes_blue[0] = false; con_paint.data.color_writes_alpha[0] = false; diff --git a/armorpaint/Sources/make_particle.ts b/armorpaint/Sources/make_particle.ts index e735ba1c..5d1d26c8 100644 --- a/armorpaint/Sources/make_particle.ts +++ b/armorpaint/Sources/make_particle.ts @@ -14,66 +14,66 @@ function make_particle_run(data: material_t): node_shader_context_t { let frag: node_shader_t = node_shader_context_make_frag(con_part); frag.ins = vert.outs; - node_shader_write_attrib(vert, 'vec4 spos = vec4(pos.xyz, 1.0);'); + node_shader_write_attrib(vert, "vec4 spos = vec4(pos.xyz, 1.0);"); - node_shader_add_uniform(vert, 'float brushRadius', '_brushRadius'); - node_shader_write_attrib(vert, 'vec3 emitFrom = vec3(fhash(gl_InstanceID), fhash(gl_InstanceID * 2), fhash(gl_InstanceID * 3));'); - node_shader_write_attrib(vert, 'emitFrom = emitFrom * brushRadius - brushRadius / 2.0;'); - node_shader_write_attrib(vert, 'spos.xyz += emitFrom * vec3(256.0, 256.0, 256.0);'); + node_shader_add_uniform(vert, "float brushRadius", "_brushRadius"); + node_shader_write_attrib(vert, "vec3 emitFrom = vec3(fhash(gl_InstanceID), fhash(gl_InstanceID * 2), fhash(gl_InstanceID * 3));"); + node_shader_write_attrib(vert, "emitFrom = emitFrom * brushRadius - brushRadius / 2.0;"); + node_shader_write_attrib(vert, "spos.xyz += emitFrom * vec3(256.0, 256.0, 256.0);"); - node_shader_add_uniform(vert, 'mat4 pd', '_particle_data'); + node_shader_add_uniform(vert, "mat4 pd", "_particle_data"); let str_tex_hash: string = "float fhash(int n) { return fract(sin(float(n)) * 43758.5453); }\n"; node_shader_add_function(vert, str_tex_hash); - node_shader_add_out(vert, 'float p_age'); - node_shader_write(vert, 'p_age = pd[3][3] - float(gl_InstanceID) * pd[0][1];'); - node_shader_write(vert, 'p_age -= p_age * fhash(gl_InstanceID) * pd[2][3];'); + node_shader_add_out(vert, "float p_age"); + node_shader_write(vert, "p_age = pd[3][3] - float(gl_InstanceID) * pd[0][1];"); + node_shader_write(vert, "p_age -= p_age * fhash(gl_InstanceID) * pd[2][3];"); - node_shader_write(vert, 'if (pd[0][0] > 0.0 && p_age < 0.0) p_age += float(int(-p_age / pd[0][0]) + 1) * pd[0][0];'); + node_shader_write(vert, "if (pd[0][0] > 0.0 && p_age < 0.0) p_age += float(int(-p_age / pd[0][0]) + 1) * pd[0][0];"); - node_shader_add_out(vert, 'float p_lifetime'); - node_shader_write(vert, 'p_lifetime = pd[0][2];'); - node_shader_write(vert, 'if (p_age < 0.0 || p_age > p_lifetime) {'); - // write(vert, 'SPIRV_Cross_Output stage_output;'); - // write(vert, 'stage_output.svpos /= 0.0;'); - // write(vert, 'return stage_output;'); - node_shader_write(vert, 'spos /= 0.0;'); - node_shader_write(vert, '}'); + node_shader_add_out(vert, "float p_lifetime"); + node_shader_write(vert, "p_lifetime = pd[0][2];"); + node_shader_write(vert, "if (p_age < 0.0 || p_age > p_lifetime) {"); + // write(vert, "SPIRV_Cross_Output stage_output;"); + // write(vert, "stage_output.svpos /= 0.0;"); + // write(vert, "return stage_output;"); + node_shader_write(vert, "spos /= 0.0;"); + node_shader_write(vert, "}"); - node_shader_add_out(vert, 'vec3 p_velocity'); - node_shader_write(vert, 'p_velocity = vec3(pd[1][0], pd[1][1], pd[1][2]);'); - node_shader_write(vert, 'p_velocity.x += fhash(gl_InstanceID) * pd[1][3] - pd[1][3] / 2.0;'); - node_shader_write(vert, 'p_velocity.y += fhash(gl_InstanceID + int(pd[0][3])) * pd[1][3] - pd[1][3] / 2.0;'); - node_shader_write(vert, 'p_velocity.z += fhash(gl_InstanceID + 2 * int(pd[0][3])) * pd[1][3] - pd[1][3] / 2.0;'); - node_shader_write(vert, 'p_velocity.x += (pd[2][0] * p_age) / 5.0;'); - node_shader_write(vert, 'p_velocity.y += (pd[2][1] * p_age) / 5.0;'); - node_shader_write(vert, 'p_velocity.z += (pd[2][2] * p_age) / 5.0;'); + node_shader_add_out(vert, "vec3 p_velocity"); + node_shader_write(vert, "p_velocity = vec3(pd[1][0], pd[1][1], pd[1][2]);"); + node_shader_write(vert, "p_velocity.x += fhash(gl_InstanceID) * pd[1][3] - pd[1][3] / 2.0;"); + node_shader_write(vert, "p_velocity.y += fhash(gl_InstanceID + int(pd[0][3])) * pd[1][3] - pd[1][3] / 2.0;"); + node_shader_write(vert, "p_velocity.z += fhash(gl_InstanceID + 2 * int(pd[0][3])) * pd[1][3] - pd[1][3] / 2.0;"); + node_shader_write(vert, "p_velocity.x += (pd[2][0] * p_age) / 5.0;"); + node_shader_write(vert, "p_velocity.y += (pd[2][1] * p_age) / 5.0;"); + node_shader_write(vert, "p_velocity.z += (pd[2][2] * p_age) / 5.0;"); - node_shader_add_out(vert, 'vec3 p_location'); - node_shader_write(vert, 'p_location = p_velocity * p_age;'); - node_shader_write(vert, 'spos.xyz += p_location;'); - node_shader_write(vert, 'spos.xyz *= vec3(0.01, 0.01, 0.01);'); + node_shader_add_out(vert, "vec3 p_location"); + node_shader_write(vert, "p_location = p_velocity * p_age;"); + node_shader_write(vert, "spos.xyz += p_location;"); + node_shader_write(vert, "spos.xyz *= vec3(0.01, 0.01, 0.01);"); - node_shader_add_uniform(vert, 'mat4 WVP', '_world_view_proj_matrix'); - node_shader_write(vert, 'gl_Position = mul(spos, WVP);'); + node_shader_add_uniform(vert, "mat4 WVP", "_world_view_proj_matrix"); + node_shader_write(vert, "gl_Position = mul(spos, WVP);"); - node_shader_add_uniform(vert, 'vec4 inp', '_inputBrush'); - node_shader_write(vert, 'vec2 binp = vec2(inp.x, 1.0 - inp.y);'); - node_shader_write(vert, 'binp = binp * 2.0 - 1.0;'); - node_shader_write(vert, 'binp *= gl_Position.w;'); - node_shader_write(vert, 'gl_Position.xy += binp;'); + node_shader_add_uniform(vert, "vec4 inp", "_inputBrush"); + node_shader_write(vert, "vec2 binp = vec2(inp.x, 1.0 - inp.y);"); + node_shader_write(vert, "binp = binp * 2.0 - 1.0;"); + node_shader_write(vert, "binp *= gl_Position.w;"); + node_shader_write(vert, "gl_Position.xy += binp;"); - node_shader_add_out(vert, 'float p_fade'); - node_shader_write(vert, 'p_fade = sin(min((p_age / 8.0) * 3.141592, 3.141592));'); + node_shader_add_out(vert, "float p_fade"); + node_shader_write(vert, "p_fade = sin(min((p_age / 8.0) * 3.141592, 3.141592));"); - node_shader_add_out(frag, 'float fragColor'); - node_shader_write(frag, 'fragColor = p_fade;'); + node_shader_add_out(frag, "float fragColor"); + node_shader_write(frag, "fragColor = p_fade;"); - // add_out(vert, 'vec4 wvpposition'); - // write(vert, 'wvpposition = gl_Position;'); - // write(frag, 'vec2 texCoord = wvpposition.xy / wvpposition.w;'); - // add_uniform(frag, 'sampler2D gbufferD'); - // write(frag, 'fragColor *= 1.0 - clamp(distance(textureLod(gbufferD, texCoord, 0.0).r, wvpposition.z), 0.0, 1.0);'); + // add_out(vert, "vec4 wvpposition"); + // write(vert, "wvpposition = gl_Position;"); + // write(frag, "vec2 texCoord = wvpposition.xy / wvpposition.w;"); + // add_uniform(frag, "sampler2D gbufferD"); + // write(frag, "fragColor *= 1.0 - clamp(distance(textureLod(gbufferD, texCoord, 0.0).r, wvpposition.z), 0.0, 1.0);"); // Material.finalize(con_part); con_part.data.shader_from_source = true; @@ -86,30 +86,30 @@ function make_particle_run(data: material_t): node_shader_context_t { function make_particle_mask(vert: node_shader_t, frag: node_shader_t) { ///if arm_physics if (context_raw.particle_physics) { - node_shader_add_out(vert, 'vec4 wpos'); - node_shader_add_uniform(vert, 'mat4 W', '_world_matrix'); - node_shader_write_attrib(vert, 'wpos = mul(vec4(pos.xyz, 1.0), W);'); - node_shader_add_uniform(frag, 'vec3 particleHit', '_particleHit'); - node_shader_add_uniform(frag, 'vec3 particleHitLast', '_particleHitLast'); + node_shader_add_out(vert, "vec4 wpos"); + node_shader_add_uniform(vert, "mat4 W", "_world_matrix"); + node_shader_write_attrib(vert, "wpos = mul(vec4(pos.xyz, 1.0), W);"); + node_shader_add_uniform(frag, "vec3 particleHit", "_particleHit"); + node_shader_add_uniform(frag, "vec3 particleHitLast", "_particleHitLast"); - node_shader_write(frag, 'vec3 pa = wpos.xyz - particleHit;'); - node_shader_write(frag, 'vec3 ba = particleHitLast - particleHit;'); - node_shader_write(frag, 'float h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);'); - node_shader_write(frag, 'dist = length(pa - ba * h) * 10.0;'); - // write(frag, 'dist = distance(particleHit, wpos.xyz) * 10.0;'); + node_shader_write(frag, "vec3 pa = wpos.xyz - particleHit;"); + node_shader_write(frag, "vec3 ba = particleHitLast - particleHit;"); + node_shader_write(frag, "float h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);"); + node_shader_write(frag, "dist = length(pa - ba * h) * 10.0;"); + // write(frag, "dist = distance(particleHit, wpos.xyz) * 10.0;"); - node_shader_write(frag, 'if (dist > 1.0) discard;'); - node_shader_write(frag, 'float str = clamp(pow(1.0 / dist * brushHardness * 0.2, 4.0), 0.0, 1.0) * opacity;'); - node_shader_write(frag, 'if (particleHit.x == 0.0 && particleHit.y == 0.0 && particleHit.z == 0.0) str = 0.0;'); - node_shader_write(frag, 'if (str == 0.0) discard;'); + node_shader_write(frag, "if (dist > 1.0) discard;"); + node_shader_write(frag, "float str = clamp(pow(1.0 / dist * brushHardness * 0.2, 4.0), 0.0, 1.0) * opacity;"); + node_shader_write(frag, "if (particleHit.x == 0.0 && particleHit.y == 0.0 && particleHit.z == 0.0) str = 0.0;"); + node_shader_write(frag, "if (str == 0.0) discard;"); return; } ///end - node_shader_add_uniform(frag, 'sampler2D texparticle', '_texparticle'); + node_shader_add_uniform(frag, "sampler2D texparticle", "_texparticle"); ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, 'float str = textureLod(texparticle, sp.xy, 0.0).r;'); + node_shader_write(frag, "float str = textureLod(texparticle, sp.xy, 0.0).r;"); ///else - node_shader_write(frag, 'float str = textureLod(texparticle, vec2(sp.x, (1.0 - sp.y)), 0.0).r;'); + node_shader_write(frag, "float str = textureLod(texparticle, vec2(sp.x, (1.0 - sp.y)), 0.0).r;"); ///end } diff --git a/armorpaint/Sources/make_texcoord.ts b/armorpaint/Sources/make_texcoord.ts index b1e05feb..a76d9592 100644 --- a/armorpaint/Sources/make_texcoord.ts +++ b/armorpaint/Sources/make_texcoord.ts @@ -8,89 +8,89 @@ function make_texcoord_run(vert: node_shader_t, frag: node_shader_t) { let uv_angle: f32 = fill_layer ? context_raw.layer.angle : angle; if (uv_type == uv_type_t.PROJECT || decal) { // TexCoords - project - node_shader_add_uniform(frag, 'float brushScale', '_brushScale'); - node_shader_write_attrib(frag, 'vec2 uvsp = sp.xy;'); + node_shader_add_uniform(frag, "float brushScale", "_brushScale"); + node_shader_write_attrib(frag, "vec2 uvsp = sp.xy;"); if (fill_layer) { // Decal layer - node_shader_write_attrib(frag, 'if (uvsp.x < 0.0 || uvsp.y < 0.0 || uvsp.x > 1.0 || uvsp.y > 1.0) discard;'); + node_shader_write_attrib(frag, "if (uvsp.x < 0.0 || uvsp.y < 0.0 || uvsp.x > 1.0 || uvsp.y > 1.0) discard;"); if (uv_angle != 0.0) { - node_shader_add_uniform(frag, 'vec2 brushAngle', '_brushAngle'); - node_shader_write_attrib(frag, 'uvsp = vec2(uvsp.x * brushAngle.x - uvsp.y * brushAngle.y, uvsp.x * brushAngle.y + uvsp.y * brushAngle.x);'); + node_shader_add_uniform(frag, "vec2 brushAngle", "_brushAngle"); + node_shader_write_attrib(frag, "uvsp = vec2(uvsp.x * brushAngle.x - uvsp.y * brushAngle.y, uvsp.x * brushAngle.y + uvsp.y * brushAngle.x);"); } frag.n = true; - node_shader_add_uniform(frag, 'vec3 decalLayerNor', '_decalLayerNor'); + node_shader_add_uniform(frag, "vec3 decalLayerNor", "_decalLayerNor"); let dot_angle: f32 = context_raw.brush_angle_reject_dot; - node_shader_write(frag, `if (abs(dot(n, decalLayerNor) - 1.0) > ${dot_angle}) discard;`); + node_shader_write(frag, "if (abs(dot(n, decalLayerNor) - 1.0) > " + dot_angle + ") discard;"); frag.wposition = true; - node_shader_add_uniform(frag, 'vec3 decalLayerLoc', '_decalLayerLoc'); - node_shader_add_uniform(frag, 'float decalLayerDim', '_decalLayerDim'); - node_shader_write_attrib(frag, 'if (abs(dot(decalLayerNor, decalLayerLoc - wposition)) > decalLayerDim) discard;'); + node_shader_add_uniform(frag, "vec3 decalLayerLoc", "_decalLayerLoc"); + node_shader_add_uniform(frag, "float decalLayerDim", "_decalLayerDim"); + node_shader_write_attrib(frag, "if (abs(dot(decalLayerNor, decalLayerLoc - wposition)) > decalLayerDim) discard;"); } else if (decal) { - node_shader_add_uniform(frag, 'vec4 decalMask', '_decalMask'); - node_shader_write_attrib(frag, 'uvsp -= decalMask.xy;'); - node_shader_write_attrib(frag, 'uvsp.x *= aspectRatio;'); - node_shader_write_attrib(frag, 'uvsp *= 0.21 / (decalMask.w * 0.9);'); // Decal radius + node_shader_add_uniform(frag, "vec4 decalMask", "_decalMask"); + node_shader_write_attrib(frag, "uvsp -= decalMask.xy;"); + node_shader_write_attrib(frag, "uvsp.x *= aspectRatio;"); + node_shader_write_attrib(frag, "uvsp *= 0.21 / (decalMask.w * 0.9);"); // Decal radius if (context_raw.brush_directional) { - node_shader_add_uniform(frag, 'vec3 brushDirection', '_brushDirection'); - node_shader_write_attrib(frag, 'if (brushDirection.z == 0.0) discard;'); - node_shader_write_attrib(frag, 'uvsp = vec2(uvsp.x * brushDirection.x - uvsp.y * brushDirection.y, uvsp.x * brushDirection.y + uvsp.y * brushDirection.x);'); + node_shader_add_uniform(frag, "vec3 brushDirection", "_brushDirection"); + node_shader_write_attrib(frag, "if (brushDirection.z == 0.0) discard;"); + node_shader_write_attrib(frag, "uvsp = vec2(uvsp.x * brushDirection.x - uvsp.y * brushDirection.y, uvsp.x * brushDirection.y + uvsp.y * brushDirection.x);"); } if (uv_angle != 0.0) { - node_shader_add_uniform(frag, 'vec2 brushAngle', '_brushAngle'); - node_shader_write_attrib(frag, 'uvsp = vec2(uvsp.x * brushAngle.x - uvsp.y * brushAngle.y, uvsp.x * brushAngle.y + uvsp.y * brushAngle.x);'); + node_shader_add_uniform(frag, "vec2 brushAngle", "_brushAngle"); + node_shader_write_attrib(frag, "uvsp = vec2(uvsp.x * brushAngle.x - uvsp.y * brushAngle.y, uvsp.x * brushAngle.y + uvsp.y * brushAngle.x);"); } - node_shader_add_uniform(frag, 'float brushScaleX', '_brushScaleX'); - node_shader_write_attrib(frag, 'uvsp.x *= brushScaleX;'); + node_shader_add_uniform(frag, "float brushScaleX", "_brushScaleX"); + node_shader_write_attrib(frag, "uvsp.x *= brushScaleX;"); - node_shader_write_attrib(frag, 'uvsp += vec2(0.5, 0.5);'); + node_shader_write_attrib(frag, "uvsp += vec2(0.5, 0.5);"); - node_shader_write_attrib(frag, 'if (uvsp.x < 0.0 || uvsp.y < 0.0 || uvsp.x > 1.0 || uvsp.y > 1.0) discard;'); + node_shader_write_attrib(frag, "if (uvsp.x < 0.0 || uvsp.y < 0.0 || uvsp.x > 1.0 || uvsp.y > 1.0) discard;"); } else { - node_shader_write_attrib(frag, 'uvsp.x *= aspectRatio;'); + node_shader_write_attrib(frag, "uvsp.x *= aspectRatio;"); if (uv_angle != 0.0) { - node_shader_add_uniform(frag, 'vec2 brushAngle', '_brushAngle'); - node_shader_write_attrib(frag, 'uvsp = vec2(uvsp.x * brushAngle.x - uvsp.y * brushAngle.y, uvsp.x * brushAngle.y + uvsp.y * brushAngle.x);'); + node_shader_add_uniform(frag, "vec2 brushAngle", "_brushAngle"); + node_shader_write_attrib(frag, "uvsp = vec2(uvsp.x * brushAngle.x - uvsp.y * brushAngle.y, uvsp.x * brushAngle.y + uvsp.y * brushAngle.x);"); } } - node_shader_write_attrib(frag, 'vec2 texCoord = uvsp * brushScale;'); + node_shader_write_attrib(frag, "vec2 texCoord = uvsp * brushScale;"); } else if (uv_type == uv_type_t.UVMAP) { // TexCoords - uvmap - node_shader_add_uniform(vert, 'float brushScale', '_brushScale'); - node_shader_add_out(vert, 'vec2 texCoord'); - node_shader_write(vert, 'texCoord = tex * brushScale;'); + node_shader_add_uniform(vert, "float brushScale", "_brushScale"); + node_shader_add_out(vert, "vec2 texCoord"); + node_shader_write(vert, "texCoord = tex * brushScale;"); if (uv_angle > 0.0) { - node_shader_add_uniform(vert, 'vec2 brushAngle', '_brushAngle'); - node_shader_write(vert, 'texCoord = vec2(texCoord.x * brushAngle.x - texCoord.y * brushAngle.y, texCoord.x * brushAngle.y + texCoord.y * brushAngle.x);'); + node_shader_add_uniform(vert, "vec2 brushAngle", "_brushAngle"); + node_shader_write(vert, "texCoord = vec2(texCoord.x * brushAngle.x - texCoord.y * brushAngle.y, texCoord.x * brushAngle.y + texCoord.y * brushAngle.x);"); } } else { // TexCoords - triplanar frag.wposition = true; frag.n = true; - node_shader_add_uniform(frag, 'float brushScale', '_brushScale'); - node_shader_write_attrib(frag, 'vec3 triWeight = wnormal * wnormal;'); // n * n - node_shader_write_attrib(frag, 'float triMax = max(triWeight.x, max(triWeight.y, triWeight.z));'); - node_shader_write_attrib(frag, 'triWeight = max(triWeight - triMax * 0.75, 0.0);'); - node_shader_write_attrib(frag, 'vec3 texCoordBlend = triWeight * (1.0 / (triWeight.x + triWeight.y + triWeight.z));'); - node_shader_write_attrib(frag, 'vec2 texCoord = wposition.yz * brushScale * 0.5;'); - node_shader_write_attrib(frag, 'vec2 texCoord1 = wposition.xz * brushScale * 0.5;'); - node_shader_write_attrib(frag, 'vec2 texCoord2 = wposition.xy * brushScale * 0.5;'); + node_shader_add_uniform(frag, "float brushScale", "_brushScale"); + node_shader_write_attrib(frag, "vec3 triWeight = wnormal * wnormal;"); // n * n + node_shader_write_attrib(frag, "float triMax = max(triWeight.x, max(triWeight.y, triWeight.z));"); + node_shader_write_attrib(frag, "triWeight = max(triWeight - triMax * 0.75, 0.0);"); + node_shader_write_attrib(frag, "vec3 texCoordBlend = triWeight * (1.0 / (triWeight.x + triWeight.y + triWeight.z));"); + node_shader_write_attrib(frag, "vec2 texCoord = wposition.yz * brushScale * 0.5;"); + node_shader_write_attrib(frag, "vec2 texCoord1 = wposition.xz * brushScale * 0.5;"); + node_shader_write_attrib(frag, "vec2 texCoord2 = wposition.xy * brushScale * 0.5;"); if (uv_angle != 0.0) { - node_shader_add_uniform(frag, 'vec2 brushAngle', '_brushAngle'); - node_shader_write_attrib(frag, 'texCoord = vec2(texCoord.x * brushAngle.x - texCoord.y * brushAngle.y, texCoord.x * brushAngle.y + texCoord.y * brushAngle.x);'); - node_shader_write_attrib(frag, 'texCoord1 = vec2(texCoord1.x * brushAngle.x - texCoord1.y * brushAngle.y, texCoord1.x * brushAngle.y + texCoord1.y * brushAngle.x);'); - node_shader_write_attrib(frag, 'texCoord2 = vec2(texCoord2.x * brushAngle.x - texCoord2.y * brushAngle.y, texCoord2.x * brushAngle.y + texCoord2.y * brushAngle.x);'); + node_shader_add_uniform(frag, "vec2 brushAngle", "_brushAngle"); + node_shader_write_attrib(frag, "texCoord = vec2(texCoord.x * brushAngle.x - texCoord.y * brushAngle.y, texCoord.x * brushAngle.y + texCoord.y * brushAngle.x);"); + node_shader_write_attrib(frag, "texCoord1 = vec2(texCoord1.x * brushAngle.x - texCoord1.y * brushAngle.y, texCoord1.x * brushAngle.y + texCoord1.y * brushAngle.x);"); + node_shader_write_attrib(frag, "texCoord2 = vec2(texCoord2.x * brushAngle.x - texCoord2.y * brushAngle.y, texCoord2.x * brushAngle.y + texCoord2.y * brushAngle.x);"); } } } diff --git a/armorpaint/Sources/nodes_brush.ts b/armorpaint/Sources/nodes_brush.ts index d7fcd644..2446cb23 100644 --- a/armorpaint/Sources/nodes_brush.ts +++ b/armorpaint/Sources/nodes_brush.ts @@ -1,5 +1,5 @@ -/// -/// +/// +/// let nodes_brush_categories = [_tr("Nodes")]; diff --git a/armorpaint/Sources/tab_layers.ts b/armorpaint/Sources/tab_layers.ts index 8531c526..fe6a56a0 100644 --- a/armorpaint/Sources/tab_layers.ts +++ b/armorpaint/Sources/tab_layers.ts @@ -55,7 +55,7 @@ function tab_layers_button_2d_view() { ui_base_show_2d_view(view_2d_type_t.LAYER); } else if (ui.is_hovered) { - zui_tooltip(tr("Show 2D View") + ` (${config_keymap.toggle_2d_view})`); + zui_tooltip(tr("Show 2D View") + " (" + config_keymap.toggle_2d_view + ")"); } } @@ -216,7 +216,7 @@ function tab_layers_remap_layer_pointers(nodes: zui_node_t[], pointer_map: map_t let n: zui_node_t = nodes[i]; if (n.type == "LAYER" || n.type == "LAYER_MASK") { let i: any = n.buttons[0].default_value; - if (pointer_map.has(i)) { + if (map_get(pointer_map, i) != null) { n.buttons[0].default_value = map_get(pointer_map, i); } } diff --git a/armorsculpt/Sources/make_brush.ts b/armorsculpt/Sources/make_brush.ts index f7a6ca3a..930d2fc2 100644 --- a/armorsculpt/Sources/make_brush.ts +++ b/armorsculpt/Sources/make_brush.ts @@ -1,36 +1,36 @@ function make_brush_run(vert: NodeShaderRaw, frag: NodeShaderRaw) { - node_shader_write(frag, 'float dist = 0.0;'); + node_shader_write(frag, "float dist = 0.0;"); if (config_raw.brush_3d) { ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, 'float depth = textureLod(gbufferD, inp.xy, 0.0).r;'); + node_shader_write(frag, "float depth = textureLod(gbufferD, inp.xy, 0.0).r;"); ///else - node_shader_write(frag, 'float depth = textureLod(gbufferD, vec2(inp.x, 1.0 - inp.y), 0.0).r;'); + node_shader_write(frag, "float depth = textureLod(gbufferD, vec2(inp.x, 1.0 - inp.y), 0.0).r;"); ///end - node_shader_add_uniform(frag, 'mat4 invVP', '_inv_view_proj_matrix'); - node_shader_write(frag, 'vec4 winp = vec4(vec2(inp.x, 1.0 - inp.y) * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0);'); - node_shader_write(frag, 'winp = mul(winp, invVP);'); - node_shader_write(frag, 'winp.xyz /= winp.w;'); + node_shader_add_uniform(frag, "mat4 invVP", "_inv_view_proj_matrix"); + node_shader_write(frag, "vec4 winp = vec4(vec2(inp.x, 1.0 - inp.y) * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0);"); + node_shader_write(frag, "winp = mul(winp, invVP);"); + node_shader_write(frag, "winp.xyz /= winp.w;"); - node_shader_add_uniform(frag, 'mat4 W', '_world_matrix'); + node_shader_add_uniform(frag, "mat4 W", "_world_matrix"); - node_shader_write_attrib(frag, 'vec3 wposition = mul(texelFetch(texpaint_undo, ivec2(texCoord.x * textureSize(texpaint_undo, 0).x, texCoord.y * textureSize(texpaint_undo, 0).y), 0), W).xyz;'); + node_shader_write_attrib(frag, "vec3 wposition = mul(texelFetch(texpaint_undo, ivec2(texCoord.x * textureSize(texpaint_undo, 0).x, texCoord.y * textureSize(texpaint_undo, 0).y), 0), W).xyz;"); ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, 'float depthlast = textureLod(gbufferD, inplast.xy, 0.0).r;'); + node_shader_write(frag, "float depthlast = textureLod(gbufferD, inplast.xy, 0.0).r;"); ///else - node_shader_write(frag, 'float depthlast = textureLod(gbufferD, vec2(inplast.x, 1.0 - inplast.y), 0.0).r;'); + node_shader_write(frag, "float depthlast = textureLod(gbufferD, vec2(inplast.x, 1.0 - inplast.y), 0.0).r;"); ///end - node_shader_write(frag, 'vec4 winplast = vec4(vec2(inplast.x, 1.0 - inplast.y) * 2.0 - 1.0, depthlast * 2.0 - 1.0, 1.0);'); - node_shader_write(frag, 'winplast = mul(winplast, invVP);'); - node_shader_write(frag, 'winplast.xyz /= winplast.w;'); + node_shader_write(frag, "vec4 winplast = vec4(vec2(inplast.x, 1.0 - inplast.y) * 2.0 - 1.0, depthlast * 2.0 - 1.0, 1.0);"); + node_shader_write(frag, "winplast = mul(winplast, invVP);"); + node_shader_write(frag, "winplast.xyz /= winplast.w;"); - node_shader_write(frag, 'dist = distance(wposition, winp.xyz);'); + node_shader_write(frag, "dist = distance(wposition, winp.xyz);"); } - node_shader_write(frag, 'if (dist > brushRadius) discard;'); + node_shader_write(frag, "if (dist > brushRadius) discard;"); } diff --git a/armorsculpt/Sources/make_material.ts b/armorsculpt/Sources/make_material.ts index 2dfc0b6f..60f5ff4a 100644 --- a/armorsculpt/Sources/make_material.ts +++ b/armorsculpt/Sources/make_material.ts @@ -366,7 +366,7 @@ function make_material_get_displace_strength(): f32 { function make_material_voxelgi_half_extents(): string { let ext = context_raw.vxao_ext; - return `const vec3 voxelgiHalfExtents = vec3(${ext}, ${ext}, ${ext});`; + return "const vec3 voxelgiHalfExtents = vec3(" + ext + ", " + ext + ", " + ext + ");"; } function make_material_delete_context(c: shader_context_t) { diff --git a/armorsculpt/Sources/make_mesh.ts b/armorsculpt/Sources/make_mesh.ts index d8eb866b..17a3884a 100644 --- a/armorsculpt/Sources/make_mesh.ts +++ b/armorsculpt/Sources/make_mesh.ts @@ -17,96 +17,96 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): NodeShaderContext let frag = node_shader_context_make_frag(con_mesh); frag.ins = vert.outs; - node_shader_add_out(vert, 'vec2 texCoord'); + node_shader_add_out(vert, "vec2 texCoord"); frag.wvpposition = true; - node_shader_add_out(vert, 'vec4 prevwvpposition'); - node_shader_add_uniform(vert, 'mat4 VP', '_view_proj_matrix'); - node_shader_add_uniform(vert, 'mat4 prevWVP', '_prev_world_view_proj_matrix'); + node_shader_add_out(vert, "vec4 prevwvpposition"); + node_shader_add_uniform(vert, "mat4 VP", "_view_proj_matrix"); + node_shader_add_uniform(vert, "mat4 prevWVP", "_prev_world_view_proj_matrix"); vert.wposition = true; let texture_count: i32 = 0; - node_shader_add_uniform(vert, 'mat4 WVP', '_world_view_proj_matrix'); - node_shader_add_uniform(vert, 'sampler2D texpaint_vert', '_texpaint_vert' + project_layers[0].id); - node_shader_write(vert, 'vec3 meshpos = texelFetch(texpaint_vert, ivec2(gl_VertexID % textureSize(texpaint_vert, 0).x, gl_VertexID / textureSize(texpaint_vert, 0).y), 0).xyz;'); + node_shader_add_uniform(vert, "mat4 WVP", "_world_view_proj_matrix"); + node_shader_add_uniform(vert, "sampler2D texpaint_vert", "_texpaint_vert" + project_layers[0].id); + node_shader_write(vert, "vec3 meshpos = texelFetch(texpaint_vert, ivec2(gl_VertexID % textureSize(texpaint_vert, 0).x, gl_VertexID / textureSize(texpaint_vert, 0).y), 0).xyz;"); // + pos.xyz * 0.000001 - node_shader_write(vert, 'gl_Position = mul(vec4(meshpos.xyz, 1.0), WVP);'); + node_shader_write(vert, "gl_Position = mul(vec4(meshpos.xyz, 1.0), WVP);"); - node_shader_write(vert, 'texCoord = vec2(0.0, 0.0);'); + node_shader_write(vert, "texCoord = vec2(0.0, 0.0);"); - node_shader_write(vert, 'prevwvpposition = mul(vec4(pos.xyz, 1.0), prevWVP);'); + node_shader_write(vert, "prevwvpposition = mul(vec4(pos.xyz, 1.0), prevWVP);"); - node_shader_add_out(frag, 'vec4 fragColor[3]'); + node_shader_add_out(frag, "vec4 fragColor[3]"); node_shader_add_uniform(vert, "mat3 N", "_normal_matrix"); node_shader_add_out(vert, "vec3 wnormal"); - node_shader_write_attrib(vert, 'int baseVertex0 = gl_VertexID - (gl_VertexID % 3);'); - node_shader_write_attrib(vert, 'int baseVertex1 = baseVertex0 + 1;'); - node_shader_write_attrib(vert, 'int baseVertex2 = baseVertex0 + 2;'); - node_shader_write_attrib(vert, 'vec3 meshpos0 = texelFetch(texpaint_vert, ivec2(baseVertex0 % textureSize(texpaint_vert, 0).x, baseVertex0 / textureSize(texpaint_vert, 0).y), 0).xyz;'); - node_shader_write_attrib(vert, 'vec3 meshpos1 = texelFetch(texpaint_vert, ivec2(baseVertex1 % textureSize(texpaint_vert, 0).x, baseVertex1 / textureSize(texpaint_vert, 0).y), 0).xyz;'); - node_shader_write_attrib(vert, 'vec3 meshpos2 = texelFetch(texpaint_vert, ivec2(baseVertex2 % textureSize(texpaint_vert, 0).x, baseVertex2 / textureSize(texpaint_vert, 0).y), 0).xyz;'); - node_shader_write_attrib(vert, 'vec3 meshnor = normalize(cross(meshpos2 - meshpos1, meshpos0 - meshpos1));'); - node_shader_write_attrib(vert, 'wnormal = mul(meshnor, N);'); - node_shader_write_attrib(frag, 'vec3 n = normalize(wnormal);'); + node_shader_write_attrib(vert, "int baseVertex0 = gl_VertexID - (gl_VertexID % 3);"); + node_shader_write_attrib(vert, "int baseVertex1 = baseVertex0 + 1;"); + node_shader_write_attrib(vert, "int baseVertex2 = baseVertex0 + 2;"); + node_shader_write_attrib(vert, "vec3 meshpos0 = texelFetch(texpaint_vert, ivec2(baseVertex0 % textureSize(texpaint_vert, 0).x, baseVertex0 / textureSize(texpaint_vert, 0).y), 0).xyz;"); + node_shader_write_attrib(vert, "vec3 meshpos1 = texelFetch(texpaint_vert, ivec2(baseVertex1 % textureSize(texpaint_vert, 0).x, baseVertex1 / textureSize(texpaint_vert, 0).y), 0).xyz;"); + node_shader_write_attrib(vert, "vec3 meshpos2 = texelFetch(texpaint_vert, ivec2(baseVertex2 % textureSize(texpaint_vert, 0).x, baseVertex2 / textureSize(texpaint_vert, 0).y), 0).xyz;"); + node_shader_write_attrib(vert, "vec3 meshnor = normalize(cross(meshpos2 - meshpos1, meshpos0 - meshpos1));"); + node_shader_write_attrib(vert, "wnormal = mul(meshnor, N);"); + node_shader_write_attrib(frag, "vec3 n = normalize(wnormal);"); node_shader_add_function(frag, str_pack_float_int16); node_shader_add_function(frag, str_octahedron_wrap); node_shader_add_function(frag, str_cotangent_frame); if (layer_pass > 0) { - node_shader_add_uniform(frag, 'sampler2D gbuffer0'); - node_shader_add_uniform(frag, 'sampler2D gbuffer1'); - node_shader_add_uniform(frag, 'sampler2D gbuffer2'); - node_shader_write(frag, 'vec2 fragcoord = (wvpposition.xy / wvpposition.w) * 0.5 + 0.5;'); + node_shader_add_uniform(frag, "sampler2D gbuffer0"); + node_shader_add_uniform(frag, "sampler2D gbuffer1"); + node_shader_add_uniform(frag, "sampler2D gbuffer2"); + node_shader_write(frag, "vec2 fragcoord = (wvpposition.xy / wvpposition.w) * 0.5 + 0.5;"); ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, 'fragcoord.y = 1.0 - fragcoord.y;'); + node_shader_write(frag, "fragcoord.y = 1.0 - fragcoord.y;"); ///end - node_shader_write(frag, 'vec4 gbuffer0_sample = textureLod(gbuffer0, fragcoord, 0.0);'); - node_shader_write(frag, 'vec4 gbuffer1_sample = textureLod(gbuffer1, fragcoord, 0.0);'); - node_shader_write(frag, 'vec4 gbuffer2_sample = textureLod(gbuffer2, fragcoord, 0.0);'); - node_shader_write(frag, 'vec3 basecol = gbuffer0_sample.rgb;'); - node_shader_write(frag, 'float roughness = gbuffer2_sample.g;'); - node_shader_write(frag, 'float metallic = gbuffer2_sample.b;'); - node_shader_write(frag, 'float occlusion = gbuffer2_sample.r;'); - node_shader_write(frag, 'float opacity = 1.0;//gbuffer0_sample.a;'); - node_shader_write(frag, 'float matid = gbuffer1_sample.a;'); - node_shader_write(frag, 'vec3 ntex = gbuffer1_sample.rgb;'); - node_shader_write(frag, 'float height = gbuffer2_sample.a;'); + node_shader_write(frag, "vec4 gbuffer0_sample = textureLod(gbuffer0, fragcoord, 0.0);"); + node_shader_write(frag, "vec4 gbuffer1_sample = textureLod(gbuffer1, fragcoord, 0.0);"); + node_shader_write(frag, "vec4 gbuffer2_sample = textureLod(gbuffer2, fragcoord, 0.0);"); + node_shader_write(frag, "vec3 basecol = gbuffer0_sample.rgb;"); + node_shader_write(frag, "float roughness = gbuffer2_sample.g;"); + node_shader_write(frag, "float metallic = gbuffer2_sample.b;"); + node_shader_write(frag, "float occlusion = gbuffer2_sample.r;"); + node_shader_write(frag, "float opacity = 1.0;//gbuffer0_sample.a;"); + node_shader_write(frag, "float matid = gbuffer1_sample.a;"); + node_shader_write(frag, "vec3 ntex = gbuffer1_sample.rgb;"); + node_shader_write(frag, "float height = gbuffer2_sample.a;"); } else { - node_shader_write(frag, 'vec3 basecol = vec3(0.0, 0.0, 0.0);'); - node_shader_write(frag, 'float roughness = 0.3;'); - node_shader_write(frag, 'float metallic = 0.0;'); - node_shader_write(frag, 'float occlusion = 1.0;'); - node_shader_write(frag, 'float opacity = 1.0;'); - node_shader_write(frag, 'float matid = 0.0;'); - node_shader_write(frag, 'vec3 ntex = vec3(0.5, 0.5, 1.0);'); - node_shader_write(frag, 'float height = 0.0;'); + node_shader_write(frag, "vec3 basecol = vec3(0.0, 0.0, 0.0);"); + node_shader_write(frag, "float roughness = 0.3;"); + node_shader_write(frag, "float metallic = 0.0;"); + node_shader_write(frag, "float occlusion = 1.0;"); + node_shader_write(frag, "float opacity = 1.0;"); + node_shader_write(frag, "float matid = 0.0;"); + node_shader_write(frag, "vec3 ntex = vec3(0.5, 0.5, 1.0);"); + node_shader_write(frag, "float height = 0.0;"); } - node_shader_write(frag, 'vec4 texpaint_sample = vec4(0.0, 0.0, 0.0, 1.0);'); - node_shader_write(frag, 'vec4 texpaint_nor_sample;'); - node_shader_write(frag, 'vec4 texpaint_pack_sample;'); - node_shader_write(frag, 'float texpaint_opac;'); + node_shader_write(frag, "vec4 texpaint_sample = vec4(0.0, 0.0, 0.0, 1.0);"); + node_shader_write(frag, "vec4 texpaint_nor_sample;"); + node_shader_write(frag, "vec4 texpaint_pack_sample;"); + node_shader_write(frag, "float texpaint_opac;"); if (make_material_height_used) { - node_shader_write(frag, 'float height0 = 0.0;'); - node_shader_write(frag, 'float height1 = 0.0;'); - node_shader_write(frag, 'float height2 = 0.0;'); - node_shader_write(frag, 'float height3 = 0.0;'); + node_shader_write(frag, "float height0 = 0.0;"); + node_shader_write(frag, "float height1 = 0.0;"); + node_shader_write(frag, "float height2 = 0.0;"); + node_shader_write(frag, "float height3 = 0.0;"); } if (context_raw.draw_wireframe) { texture_count++; - node_shader_add_uniform(frag, 'sampler2D texuvmap', '_texuvmap'); + node_shader_add_uniform(frag, "sampler2D texuvmap", "_texuvmap"); } if (context_raw.viewport_mode == viewport_mode_t.LIT && context_raw.render_mode == render_mode_t.FORWARD) { texture_count += 4; - node_shader_add_uniform(frag, 'sampler2D senvmapBrdf', "$brdf.k"); - node_shader_add_uniform(frag, 'sampler2D senvmapRadiance', '_envmap_radiance'); - node_shader_add_uniform(frag, 'sampler2D sltcMat', '_ltcMat'); - node_shader_add_uniform(frag, 'sampler2D sltcMag', '_ltcMag'); + node_shader_add_uniform(frag, "sampler2D senvmapBrdf", "$brdf.k"); + node_shader_add_uniform(frag, "sampler2D senvmapRadiance", "_envmap_radiance"); + node_shader_add_uniform(frag, "sampler2D sltcMat", "_ltcMat"); + node_shader_add_uniform(frag, "sampler2D sltcMag", "_ltcMag"); } // Get layers for this pass @@ -139,27 +139,27 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): NodeShaderContext for (let i: i32 = 0; i < layers.length; ++i) { let l = layers[i]; if (slot_layer_get_object_mask(l) > 0) { - node_shader_add_uniform(frag, 'int uid', '_uid'); + node_shader_add_uniform(frag, "int uid", "_uid"); if (slot_layer_get_object_mask(l) > project_paint_objects.length) { // Atlas let visibles = project_get_atlas_objects(slot_layer_get_object_mask(l)); - node_shader_write(frag, 'if ('); + node_shader_write(frag, "if ("); for (let i: i32 = 0; i < visibles.length; ++i) { if (i > 0) { - node_shader_write(frag, ' || '); + node_shader_write(frag, " || "); } - node_shader_write(frag, `${visibles[i].base.uid} == uid`); + node_shader_write(frag, visibles[i].base.uid + " == uid"); } - node_shader_write(frag, ') {'); + node_shader_write(frag, ") {"); } else { // Object mask let uid = project_paint_objects[slot_layer_get_object_mask(l) - 1].base.uid; - node_shader_write(frag, `if (${uid} == uid) {`); + node_shader_write(frag, "if (" + uid + " == uid) {"); } } - node_shader_add_shared_sampler(frag, 'sampler2D texpaint' + l.id); - node_shader_write(frag, 'texpaint_sample = vec4(0.8, 0.8, 0.8, 1.0);'); - node_shader_write(frag, 'texpaint_opac = texpaint_sample.a;'); + node_shader_add_shared_sampler(frag, "sampler2D texpaint" + l.id); + node_shader_write(frag, "texpaint_sample = vec4(0.8, 0.8, 0.8, 1.0);"); + node_shader_write(frag, "texpaint_opac = texpaint_sample.a;"); let masks = slot_layer_get_masks(l); if (masks != null) { @@ -172,61 +172,61 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): NodeShaderContext } } if (has_visible) { - let texpaint_mask = 'texpaint_mask' + l.id; - node_shader_write(frag, `float ${texpaint_mask} = 0.0;`); + let texpaint_mask = "texpaint_mask" + l.id; + node_shader_write(frag, "float " + texpaint_mask + " = 0.0;"); for (let i: i32 = 0; i < masks.length; ++i) { let m = masks[i]; if (!slot_layer_is_visible(m)) continue; - node_shader_add_shared_sampler(frag, 'sampler2D texpaint' + m.id); - node_shader_write(frag, '{'); // Group mask is sampled across multiple layers - node_shader_write(frag, 'float texpaint_mask_sample' + m.id + ' = textureLodShared(texpaint' + m.id + ', texCoord, 0.0).r;'); - node_shader_write(frag, '}'); + node_shader_add_shared_sampler(frag, "sampler2D texpaint" + m.id); + node_shader_write(frag, "{"); // Group mask is sampled across multiple layers + node_shader_write(frag, "float texpaint_mask_sample" + m.id + " = textureLodShared(texpaint" + m.id + ", texCoord, 0.0).r;"); + node_shader_write(frag, "}"); } - node_shader_write(frag, `texpaint_opac *= clamp(${texpaint_mask}, 0.0, 1.0);`); + node_shader_write(frag, "texpaint_opac *= clamp(" + texpaint_mask + ", 0.0, 1.0);"); } } if (slot_layer_get_opacity(l) < 1) { - node_shader_write(frag, `texpaint_opac *= ${slot_layer_get_opacity(l)};`); + node_shader_write(frag, "texpaint_opac *= " + slot_layer_get_opacity(l) + ";"); } if (l == project_layers[0]) { - node_shader_write(frag, 'basecol = vec3(0.8, 0.8, 0.8);// texpaint_sample.rgb * texpaint_opac;'); + node_shader_write(frag, "basecol = vec3(0.8, 0.8, 0.8);// texpaint_sample.rgb * texpaint_opac;"); } if (slot_layer_get_object_mask(l) > 0) { - node_shader_write(frag, '}'); + node_shader_write(frag, "}"); } if (last_pass && context_raw.draw_texels) { - node_shader_add_uniform(frag, 'vec2 texpaintSize', '_texpaintSize'); - node_shader_write(frag, 'vec2 texel0 = texCoord * texpaintSize * 0.01;'); - node_shader_write(frag, 'vec2 texel1 = texCoord * texpaintSize * 0.1;'); - node_shader_write(frag, 'vec2 texel2 = texCoord * texpaintSize;'); - node_shader_write(frag, 'basecol *= max(float(mod(int(texel0.x), 2.0) == mod(int(texel0.y), 2.0)), 0.9);'); - node_shader_write(frag, 'basecol *= max(float(mod(int(texel1.x), 2.0) == mod(int(texel1.y), 2.0)), 0.9);'); - node_shader_write(frag, 'basecol *= max(float(mod(int(texel2.x), 2.0) == mod(int(texel2.y), 2.0)), 0.9);'); + node_shader_add_uniform(frag, "vec2 texpaintSize", "_texpaintSize"); + node_shader_write(frag, "vec2 texel0 = texCoord * texpaintSize * 0.01;"); + node_shader_write(frag, "vec2 texel1 = texCoord * texpaintSize * 0.1;"); + node_shader_write(frag, "vec2 texel2 = texCoord * texpaintSize;"); + node_shader_write(frag, "basecol *= max(float(mod(int(texel0.x), 2.0) == mod(int(texel0.y), 2.0)), 0.9);"); + node_shader_write(frag, "basecol *= max(float(mod(int(texel1.x), 2.0) == mod(int(texel1.y), 2.0)), 0.9);"); + node_shader_write(frag, "basecol *= max(float(mod(int(texel2.x), 2.0) == mod(int(texel2.y), 2.0)), 0.9);"); } if (last_pass && context_raw.draw_wireframe) { - node_shader_write(frag, 'basecol *= 1.0 - textureLod(texuvmap, texCoord, 0.0).r;'); + node_shader_write(frag, "basecol *= 1.0 - textureLod(texuvmap, texCoord, 0.0).r;"); } if (make_material_height_used) { - node_shader_write(frag, 'if (height > 0.0) {'); - node_shader_write(frag, 'float height_dx = height0 - height1;'); - node_shader_write(frag, 'float height_dy = height2 - height3;'); + node_shader_write(frag, "if (height > 0.0) {"); + node_shader_write(frag, "float height_dx = height0 - height1;"); + node_shader_write(frag, "float height_dy = height2 - height3;"); // Whiteout blend - node_shader_write(frag, 'vec3 n1 = ntex * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0);'); - node_shader_write(frag, 'vec3 n2 = normalize(vec3(height_dx * 16.0, height_dy * 16.0, 1.0));'); - node_shader_write(frag, 'ntex = normalize(vec3(n1.xy + n2.xy, n1.z * n2.z)) * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5);'); - node_shader_write(frag, '}'); + node_shader_write(frag, "vec3 n1 = ntex * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0);"); + node_shader_write(frag, "vec3 n2 = normalize(vec3(height_dx * 16.0, height_dy * 16.0, 1.0));"); + node_shader_write(frag, "ntex = normalize(vec3(n1.xy + n2.xy, n1.z * n2.z)) * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5);"); + node_shader_write(frag, "}"); } if (!last_pass) { - node_shader_write(frag, 'fragColor[0] = vec4(basecol, opacity);'); - node_shader_write(frag, 'fragColor[1] = vec4(ntex, matid);'); - node_shader_write(frag, 'fragColor[2] = vec4(occlusion, roughness, metallic, height);'); + node_shader_write(frag, "fragColor[0] = vec4(basecol, opacity);"); + node_shader_write(frag, "fragColor[1] = vec4(ntex, matid);"); + node_shader_write(frag, "fragColor[2] = vec4(occlusion, roughness, metallic, height);"); parser_material_finalize(con_mesh); con_mesh.data.shader_from_source = true; con_mesh.data.vertex_shader = node_shader_get(vert); @@ -236,100 +236,100 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): NodeShaderContext frag.vvec = true; ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, 'mat3 TBN = cotangentFrame(n, vVec, texCoord);'); + node_shader_write(frag, "mat3 TBN = cotangentFrame(n, vVec, texCoord);"); ///else - node_shader_write(frag, 'mat3 TBN = cotangentFrame(n, -vVec, texCoord);'); + node_shader_write(frag, "mat3 TBN = cotangentFrame(n, -vVec, texCoord);"); ///end - node_shader_write(frag, 'n = ntex * 2.0 - 1.0;'); - node_shader_write(frag, 'n.y = -n.y;'); - node_shader_write(frag, 'n = normalize(mul(n, TBN));'); + node_shader_write(frag, "n = ntex * 2.0 - 1.0;"); + node_shader_write(frag, "n.y = -n.y;"); + node_shader_write(frag, "n = normalize(mul(n, TBN));"); if (context_raw.viewport_mode == viewport_mode_t.LIT) { - node_shader_write(frag, 'basecol = pow(basecol, vec3(2.2, 2.2, 2.2));'); + node_shader_write(frag, "basecol = pow(basecol, vec3(2.2, 2.2, 2.2));"); if (context_raw.viewport_shader != null) { let color = context_raw.viewport_shader(frag); - node_shader_write(frag, `fragColor[1] = vec4(${color}, 1.0);`); + node_shader_write(frag, "fragColor[1] = vec4(" + color + ", 1.0);"); } else if (context_raw.render_mode == render_mode_t.FORWARD) { frag.wposition = true; - node_shader_write(frag, 'vec3 albedo = mix(basecol, vec3(0.0, 0.0, 0.0), metallic);'); - node_shader_write(frag, 'vec3 f0 = mix(vec3(0.04, 0.04, 0.04), basecol, metallic);'); + node_shader_write(frag, "vec3 albedo = mix(basecol, vec3(0.0, 0.0, 0.0), metallic);"); + node_shader_write(frag, "vec3 f0 = mix(vec3(0.04, 0.04, 0.04), basecol, metallic);"); frag.vvec = true; - node_shader_write(frag, 'float dotNV = max(0.0, dot(n, vVec));'); - node_shader_write(frag, 'vec2 envBRDF = texelFetch(senvmapBrdf, ivec2(vec2(roughness, 1.0 - dotNV) * 256.0), 0).xy;'); - node_shader_add_uniform(frag, 'int envmapNumMipmaps', '_envmap_num_mipmaps'); - node_shader_add_uniform(frag, 'vec4 envmapData', '_envmapData'); // angle, sin(angle), cos(angle), strength - node_shader_write(frag, 'vec3 wreflect = reflect(-vVec, n);'); - node_shader_write(frag, 'float envlod = roughness * float(envmapNumMipmaps);'); + node_shader_write(frag, "float dotNV = max(0.0, dot(n, vVec));"); + node_shader_write(frag, "vec2 envBRDF = texelFetch(senvmapBrdf, ivec2(vec2(roughness, 1.0 - dotNV) * 256.0), 0).xy;"); + node_shader_add_uniform(frag, "int envmapNumMipmaps", "_envmap_num_mipmaps"); + node_shader_add_uniform(frag, "vec4 envmapData", "_envmapData"); // angle, sin(angle), cos(angle), strength + node_shader_write(frag, "vec3 wreflect = reflect(-vVec, n);"); + node_shader_write(frag, "float envlod = roughness * float(envmapNumMipmaps);"); node_shader_add_function(frag, str_envmap_equirect); - node_shader_write(frag, 'vec3 prefilteredColor = textureLod(senvmapRadiance, envMapEquirect(wreflect, envmapData.x), envlod).rgb;'); - node_shader_add_uniform(frag, 'vec3 lightArea0', '_light_area0'); - node_shader_add_uniform(frag, 'vec3 lightArea1', '_light_area1'); - node_shader_add_uniform(frag, 'vec3 lightArea2', '_light_area2'); - node_shader_add_uniform(frag, 'vec3 lightArea3', '_light_area3'); + node_shader_write(frag, "vec3 prefilteredColor = textureLod(senvmapRadiance, envMapEquirect(wreflect, envmapData.x), envlod).rgb;"); + node_shader_add_uniform(frag, "vec3 lightArea0", "_light_area0"); + node_shader_add_uniform(frag, "vec3 lightArea1", "_light_area1"); + node_shader_add_uniform(frag, "vec3 lightArea2", "_light_area2"); + node_shader_add_uniform(frag, "vec3 lightArea3", "_light_area3"); node_shader_add_function(frag, str_ltc_evaluate); - node_shader_add_uniform(frag, 'vec3 lightPos', '_point_pos'); - node_shader_add_uniform(frag, 'vec3 lightColor', '_point_color'); - node_shader_write(frag, 'float ldist = distance(wposition, lightPos);'); - 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(sltcMat, 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 = ltcEvaluate(n, vVec, dotNV, wposition, minv, lightArea0, lightArea1, lightArea2, lightArea3);'); - node_shader_write(frag, 'ltcspec *= textureLod(sltcMag, 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 = ltcEvaluate(n, vVec, dotNV, wposition, mident, lightArea0, lightArea1, lightArea2, lightArea3);'); - node_shader_write(frag, 'vec3 direct = albedo * ltcdiff + ltcspec * 0.05;'); - node_shader_write(frag, 'direct *= lightColor * (1.0 / (ldist * ldist));'); + node_shader_add_uniform(frag, "vec3 lightPos", "_point_pos"); + node_shader_add_uniform(frag, "vec3 lightColor", "_point_color"); + node_shader_write(frag, "float ldist = distance(wposition, lightPos);"); + 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(sltcMat, 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 = ltcEvaluate(n, vVec, dotNV, wposition, minv, lightArea0, lightArea1, lightArea2, lightArea3);"); + node_shader_write(frag, "ltcspec *= textureLod(sltcMag, 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 = ltcEvaluate(n, vVec, dotNV, wposition, mident, lightArea0, lightArea1, lightArea2, lightArea3);"); + node_shader_write(frag, "vec3 direct = albedo * ltcdiff + ltcspec * 0.05;"); + node_shader_write(frag, "direct *= lightColor * (1.0 / (ldist * ldist));"); - node_shader_add_uniform(frag, 'vec4 shirr[7]', '_envmap_irradiance'); + 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 * (shIrradiance(vec3(n.x * envmapData.z - n.y * envmapData.y, n.x * envmapData.y + n.y * envmapData.z, n.z), shirr) / 3.14159265);'); - node_shader_write(frag, 'indirect += prefilteredColor * (f0 * envBRDF.x + envBRDF.y) * 1.5;'); - node_shader_write(frag, 'indirect *= envmapData.w * occlusion;'); - node_shader_write(frag, 'fragColor[1] = vec4(direct + indirect, 1.0);'); + node_shader_write(frag, "vec3 indirect = albedo * (shIrradiance(vec3(n.x * envmapData.z - n.y * envmapData.y, n.x * envmapData.y + n.y * envmapData.z, n.z), shirr) / 3.14159265);"); + node_shader_write(frag, "indirect += prefilteredColor * (f0 * envBRDF.x + envBRDF.y) * 1.5;"); + node_shader_write(frag, "indirect *= envmapData.w * occlusion;"); + node_shader_write(frag, "fragColor[1] = vec4(direct + indirect, 1.0);"); } else { // Deferred, Pathtraced if (make_material_emis_used) { - node_shader_write(frag, 'if (int(matid * 255.0) % 3 == 1) basecol *= 10.0;'); // Boost for bloom + node_shader_write(frag, "if (int(matid * 255.0) % 3 == 1) basecol *= 10.0;"); // Boost for bloom } - node_shader_write(frag, 'fragColor[1] = vec4(basecol, occlusion);'); + node_shader_write(frag, "fragColor[1] = vec4(basecol, occlusion);"); } } else if (context_raw.viewport_mode == viewport_mode_t.OBJECT_NORMAL) { frag.nattr = true; - node_shader_write(frag, 'fragColor[1] = vec4(nAttr, 1.0);'); + node_shader_write(frag, "fragColor[1] = vec4(nAttr, 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.OBJECT_ID) { - node_shader_add_uniform(frag, 'float objectId', '_objectId'); - node_shader_write(frag, 'float obid = objectId + 1.0 / 255.0;'); - node_shader_write(frag, 'float id_r = fract(sin(dot(vec2(obid, obid * 20.0), vec2(12.9898, 78.233))) * 43758.5453);'); - node_shader_write(frag, 'float id_g = fract(sin(dot(vec2(obid * 20.0, obid), vec2(12.9898, 78.233))) * 43758.5453);'); - node_shader_write(frag, 'float id_b = fract(sin(dot(vec2(obid, obid * 40.0), vec2(12.9898, 78.233))) * 43758.5453);'); - node_shader_write(frag, 'fragColor[1] = vec4(id_r, id_g, id_b, 1.0);'); + node_shader_add_uniform(frag, "float objectId", "_objectId"); + node_shader_write(frag, "float obid = objectId + 1.0 / 255.0;"); + node_shader_write(frag, "float id_r = fract(sin(dot(vec2(obid, obid * 20.0), vec2(12.9898, 78.233))) * 43758.5453);"); + node_shader_write(frag, "float id_g = fract(sin(dot(vec2(obid * 20.0, obid), vec2(12.9898, 78.233))) * 43758.5453);"); + node_shader_write(frag, "float id_b = fract(sin(dot(vec2(obid, obid * 40.0), vec2(12.9898, 78.233))) * 43758.5453);"); + node_shader_write(frag, "fragColor[1] = vec4(id_r, id_g, id_b, 1.0);"); } else { - node_shader_write(frag, 'fragColor[1] = vec4(1.0, 0.0, 1.0, 1.0);'); // Pink + node_shader_write(frag, "fragColor[1] = vec4(1.0, 0.0, 1.0, 1.0);"); // Pink } if (context_raw.viewport_mode != viewport_mode_t.LIT && context_raw.viewport_mode != viewport_mode_t.PATH_TRACE) { - node_shader_write(frag, 'fragColor[1].rgb = pow(fragColor[1].rgb, vec3(2.2, 2.2, 2.2));'); + node_shader_write(frag, "fragColor[1].rgb = pow(fragColor[1].rgb, vec3(2.2, 2.2, 2.2));"); } - node_shader_write(frag, 'n /= (abs(n.x) + abs(n.y) + abs(n.z));'); - node_shader_write(frag, 'n.xy = n.z >= 0.0 ? n.xy : octahedronWrap(n.xy);'); - node_shader_write(frag, 'fragColor[0] = vec4(n.xy, roughness, packFloatInt16(metallic, uint(int(matid * 255.0) % 3)));'); + node_shader_write(frag, "n /= (abs(n.x) + abs(n.y) + abs(n.z));"); + node_shader_write(frag, "n.xy = n.z >= 0.0 ? n.xy : octahedronWrap(n.xy);"); + node_shader_write(frag, "fragColor[0] = vec4(n.xy, roughness, packFloatInt16(metallic, uint(int(matid * 255.0) % 3)));"); } - node_shader_write(frag, 'vec2 posa = (wvpposition.xy / wvpposition.w) * 0.5 + 0.5;'); - node_shader_write(frag, 'vec2 posb = (prevwvpposition.xy / prevwvpposition.w) * 0.5 + 0.5;'); - node_shader_write(frag, 'fragColor[2] = vec4(posa - posb, texCoord.xy);'); + node_shader_write(frag, "vec2 posa = (wvpposition.xy / wvpposition.w) * 0.5 + 0.5;"); + node_shader_write(frag, "vec2 posb = (prevwvpposition.xy / prevwvpposition.w) * 0.5 + 0.5;"); + node_shader_write(frag, "fragColor[2] = vec4(posa - posb, texCoord.xy);"); parser_material_finalize(con_mesh); con_mesh.data.shader_from_source = true; diff --git a/armorsculpt/Sources/make_mesh_preview.ts b/armorsculpt/Sources/make_mesh_preview.ts index 2d9ea63f..6ca10c43 100644 --- a/armorsculpt/Sources/make_mesh_preview.ts +++ b/armorsculpt/Sources/make_mesh_preview.ts @@ -22,28 +22,28 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): No let skin = mesh_data_get_vertex_array(context_raw.paint_object.data, "bone") != null; if (skin) { pos = "spos"; - node_shader_context_add_elem(con_mesh, "bone", 'short4norm'); - node_shader_context_add_elem(con_mesh, "weight", 'short4norm'); + node_shader_context_add_elem(con_mesh, "bone", "short4norm"); + node_shader_context_add_elem(con_mesh, "weight", "short4norm"); node_shader_add_function(vert, str_get_skinning_dual_quat); - node_shader_add_uniform(vert, 'vec4 skinBones[128 * 2]', '_skin_bones'); - node_shader_add_uniform(vert, 'float posUnpack', '_pos_unpack'); - node_shader_write_attrib(vert, 'vec4 skinA;'); - node_shader_write_attrib(vert, 'vec4 skinB;'); - node_shader_write_attrib(vert, 'getSkinningDualQuat(ivec4(bone * 32767), weight, skinA, skinB);'); - node_shader_write_attrib(vert, 'vec3 spos = pos.xyz;'); - node_shader_write_attrib(vert, 'spos.xyz *= posUnpack;'); - node_shader_write_attrib(vert, 'spos.xyz += 2.0 * cross(skinA.xyz, cross(skinA.xyz, spos.xyz) + skinA.w * spos.xyz);'); - node_shader_write_attrib(vert, 'spos.xyz += 2.0 * (skinA.w * skinB.xyz - skinB.w * skinA.xyz + cross(skinA.xyz, skinB.xyz));'); - node_shader_write_attrib(vert, 'spos.xyz /= posUnpack;'); + node_shader_add_uniform(vert, "vec4 skinBones[128 * 2]", "_skin_bones"); + node_shader_add_uniform(vert, "float posUnpack", "_pos_unpack"); + node_shader_write_attrib(vert, "vec4 skinA;"); + node_shader_write_attrib(vert, "vec4 skinB;"); + node_shader_write_attrib(vert, "getSkinningDualQuat(ivec4(bone * 32767), weight, skinA, skinB);"); + node_shader_write_attrib(vert, "vec3 spos = pos.xyz;"); + node_shader_write_attrib(vert, "spos.xyz *= posUnpack;"); + node_shader_write_attrib(vert, "spos.xyz += 2.0 * cross(skinA.xyz, cross(skinA.xyz, spos.xyz) + skinA.w * spos.xyz);"); + node_shader_write_attrib(vert, "spos.xyz += 2.0 * (skinA.w * skinB.xyz - skinB.w * skinA.xyz + cross(skinA.xyz, skinB.xyz));"); + node_shader_write_attrib(vert, "spos.xyz /= posUnpack;"); } ///end - node_shader_add_uniform(vert, 'mat4 WVP', '_world_view_proj_matrix'); - node_shader_write_attrib(vert, `gl_Position = mul(vec4(${pos}.xyz, 1.0), WVP);`); + node_shader_add_uniform(vert, "mat4 WVP", "_world_view_proj_matrix"); + node_shader_write_attrib(vert, "gl_Position = mul(vec4(" + pos + ".xyz, 1.0), WVP);"); let brush_scale = (context_raw.brush_scale * context_raw.brush_nodes_scale) + ""; - node_shader_add_out(vert, 'vec2 texCoord'); - node_shader_write_attrib(vert, `texCoord = tex * float(${brush_scale});`); + node_shader_add_out(vert, "vec2 texCoord"); + node_shader_write_attrib(vert, "texCoord = tex * float(" + brush_scale + ");"); let decal = context_raw.decal_preview; parser_material_sample_keep_aspect = decal; @@ -61,36 +61,36 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): No let opac = "0.0";//sout.out_opacity; let height = "0.0";//sout.out_height; let nortan = "vec3(1.0, 1.0, 1.0)";//parser_material_out_normaltan; - node_shader_write(frag, `vec3 basecol = pow(${base}, vec3(2.2, 2.2, 2.2));`); - node_shader_write(frag, `float roughness = ${rough};`); - node_shader_write(frag, `float metallic = ${met};`); - node_shader_write(frag, `float occlusion = ${occ};`); - node_shader_write(frag, `float opacity = ${opac};`); - node_shader_write(frag, `vec3 nortan = ${nortan};`); - node_shader_write(frag, `float height = ${height};`); + node_shader_write(frag, "vec3 basecol = pow(" + base + ", vec3(2.2, 2.2, 2.2));"); + node_shader_write(frag, "float roughness = " + rough + ";"); + node_shader_write(frag, "float metallic = " + met + ";"); + node_shader_write(frag, "float occlusion = " + occ + ";"); + node_shader_write(frag, "float opacity = " + opac + ";"); + node_shader_write(frag, "vec3 nortan = " + nortan + ";"); + node_shader_write(frag, "float height = " + height + ";"); // parser_material_parse_height_as_channel = false; - // node_shader_write(vert, `float vheight = ${height};`); - // node_shader_add_out(vert, 'float height'); - // node_shader_write(vert, 'height = vheight;'); - // let displaceStrength = 0.1; - // if (heightUsed && displaceStrength > 0.0) { - // node_shader_write(vert, `vec3 pos2 = ${pos}.xyz + vec3(nor.xy, pos.w) * vec3(${height}, ${height}, ${height}) * vec3(${displaceStrength}, ${displaceStrength}, ${displaceStrength});`); - // node_shader_write(vert, 'gl_Position = mul(vec4(pos2.xyz, 1.0), WVP);'); + // node_shader_write(vert, "float vheight = " + height + ";"); + // node_shader_add_out(vert, "float height"); + // node_shader_write(vert, "height = vheight;"); + // let displace_strength = 0.1; + // if (heightUsed && displace_strength > 0.0) { + // node_shader_write(vert, "vec3 pos2 = " + pos + ".xyz + vec3(nor.xy, pos.w) * vec3(" + height + ", " + height + ", " + height + ") * vec3(" + displace_strength + ", " + displace_strength + ", " + displace_strength + ");"); + // node_shader_write(vert, "gl_Position = mul(vec4(pos2.xyz, 1.0), WVP);"); // } if (decal) { if (context_raw.tool == workspace_tool_t.TEXT) { - node_shader_add_uniform(frag, 'sampler2D textexttool', '_textexttool'); - node_shader_write(frag, `opacity *= textureLod(textexttool, texCoord / float(${brush_scale}), 0.0).r;`); + node_shader_add_uniform(frag, "sampler2D textexttool", "_textexttool"); + node_shader_write(frag, "opacity *= textureLod(textexttool, texCoord / float(" + brush_scale + "), 0.0).r;"); } } if (decal) { let opac = make_mesh_preview_opacity_discard_decal; - node_shader_write(frag, `if (opacity < ${opac}) discard;`); + node_shader_write(frag, "if (opacity < " + opac + ") discard;"); } - node_shader_add_out(frag, 'vec4 fragColor[3]'); + node_shader_add_out(frag, "vec4 fragColor[3]"); frag.n = true; node_shader_add_function(frag, str_pack_float_int16); @@ -98,16 +98,16 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): No node_shader_add_function(frag, str_octahedron_wrap); if (make_material_height_used) { - node_shader_write(frag, 'if (height > 0.0) {'); - node_shader_write(frag, 'float height_dx = dFdx(height * 2.0);'); - node_shader_write(frag, 'float height_dy = dFdy(height * 2.0);'); - // node_shader_write(frag, 'float height_dx = height0 - height1;'); - // node_shader_write(frag, 'float height_dy = height2 - height3;'); + node_shader_write(frag, "if (height > 0.0) {"); + node_shader_write(frag, "float height_dx = dFdx(height * 2.0);"); + node_shader_write(frag, "float height_dy = dFdy(height * 2.0);"); + // node_shader_write(frag, "float height_dx = height0 - height1;"); + // node_shader_write(frag, "float height_dy = height2 - height3;"); // Whiteout blend - node_shader_write(frag, 'vec3 n1 = nortan * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0);'); - node_shader_write(frag, 'vec3 n2 = normalize(vec3(height_dx * 16.0, height_dy * 16.0, 1.0));'); - node_shader_write(frag, 'nortan = normalize(vec3(n1.xy + n2.xy, n1.z * n2.z)) * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5);'); - node_shader_write(frag, '}'); + node_shader_write(frag, "vec3 n1 = nortan * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0);"); + node_shader_write(frag, "vec3 n2 = normalize(vec3(height_dx * 16.0, height_dy * 16.0, 1.0));"); + node_shader_write(frag, "nortan = normalize(vec3(n1.xy + n2.xy, n1.z * n2.z)) * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5);"); + node_shader_write(frag, "}"); } // Apply normal channel @@ -117,34 +117,34 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): No else { frag.vvec = true; ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, 'mat3 TBN = cotangentFrame(n, vVec, texCoord);'); + node_shader_write(frag, "mat3 TBN = cotangentFrame(n, vVec, texCoord);"); ///else - node_shader_write(frag, 'mat3 TBN = cotangentFrame(n, -vVec, texCoord);'); + node_shader_write(frag, "mat3 TBN = cotangentFrame(n, -vVec, texCoord);"); ///end - node_shader_write(frag, 'n = nortan * 2.0 - 1.0;'); - node_shader_write(frag, 'n.y = -n.y;'); - node_shader_write(frag, 'n = normalize(mul(n, TBN));'); + node_shader_write(frag, "n = nortan * 2.0 - 1.0;"); + node_shader_write(frag, "n.y = -n.y;"); + node_shader_write(frag, "n = normalize(mul(n, TBN));"); } - node_shader_write(frag, 'n /= (abs(n.x) + abs(n.y) + abs(n.z));'); - node_shader_write(frag, 'n.xy = n.z >= 0.0 ? n.xy : octahedronWrap(n.xy);'); + node_shader_write(frag, "n /= (abs(n.x) + abs(n.y) + abs(n.z));"); + node_shader_write(frag, "n.xy = n.z >= 0.0 ? n.xy : octahedronWrap(n.xy);"); // uint matid = 0; if (decal) { - node_shader_write(frag, 'fragColor[0] = vec4(n.x, n.y, roughness, packFloatInt16(metallic, uint(0)));'); // metallic/matid - node_shader_write(frag, 'fragColor[1] = vec4(basecol, occlusion);'); + node_shader_write(frag, "fragColor[0] = vec4(n.x, n.y, roughness, packFloatInt16(metallic, uint(0)));"); // metallic/matid + node_shader_write(frag, "fragColor[1] = vec4(basecol, occlusion);"); } else { - node_shader_write(frag, 'fragColor[0] = vec4(n.x, n.y, mix(1.0, roughness, opacity), packFloatInt16(mix(1.0, metallic, opacity), uint(0)));'); // metallic/matid - node_shader_write(frag, 'fragColor[1] = vec4(mix(vec3(0.0, 0.0, 0.0), basecol, opacity), occlusion);'); + node_shader_write(frag, "fragColor[0] = vec4(n.x, n.y, mix(1.0, roughness, opacity), packFloatInt16(mix(1.0, metallic, opacity), uint(0)));"); // metallic/matid + node_shader_write(frag, "fragColor[1] = vec4(mix(vec3(0.0, 0.0, 0.0), basecol, opacity), occlusion);"); } - node_shader_write(frag, 'fragColor[2] = vec4(0.0, 0.0, 0.0, 0.0);'); // veloc + node_shader_write(frag, "fragColor[2] = vec4(0.0, 0.0, 0.0, 0.0);"); // veloc parser_material_finalize(con_mesh); ///if arm_skin if (skin) { - node_shader_write(vert, 'wnormal = normalize(mul(vec3(nor.xy, pos.w) + 2.0 * cross(skinA.xyz, cross(skinA.xyz, vec3(nor.xy, pos.w)) + skinA.w * vec3(nor.xy, pos.w)), N));'); + node_shader_write(vert, "wnormal = normalize(mul(vec3(nor.xy, pos.w) + 2.0 * cross(skinA.xyz, cross(skinA.xyz, vec3(nor.xy, pos.w)) + skinA.w * vec3(nor.xy, pos.w)), N));"); } ///end diff --git a/armorsculpt/Sources/make_sculpt.ts b/armorsculpt/Sources/make_sculpt.ts index 25f9e537..a866f698 100644 --- a/armorsculpt/Sources/make_sculpt.ts +++ b/armorsculpt/Sources/make_sculpt.ts @@ -24,24 +24,24 @@ function make_sculpt_run(data: material_t, matcon: material_context_t): NodeShad let faceFill = context_raw.tool == workspace_tool_t.FILL && context_raw.fill_type_handle.position == fill_type_t.FACE; let decal = context_raw.tool == workspace_tool_t.DECAL || context_raw.tool == workspace_tool_t.TEXT; - node_shader_add_out(vert, 'vec2 texCoord'); - node_shader_write(vert, 'const vec2 madd = vec2(0.5, 0.5);'); - node_shader_write(vert, 'texCoord = pos.xy * madd + madd;'); + node_shader_add_out(vert, "vec2 texCoord"); + node_shader_write(vert, "const vec2 madd = vec2(0.5, 0.5);"); + node_shader_write(vert, "texCoord = pos.xy * madd + madd;"); ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(vert, 'texCoord.y = 1.0 - texCoord.y;'); + node_shader_write(vert, "texCoord.y = 1.0 - texCoord.y;"); ///end - node_shader_write(vert, 'gl_Position = vec4(pos.xy, 0.0, 1.0);'); + node_shader_write(vert, "gl_Position = vec4(pos.xy, 0.0, 1.0);"); - node_shader_add_uniform(frag, 'vec4 inp', '_inputBrush'); - node_shader_add_uniform(frag, 'vec4 inplast', '_inputBrushLast'); + node_shader_add_uniform(frag, "vec4 inp", "_inputBrush"); + node_shader_add_uniform(frag, "vec4 inplast", "_inputBrushLast"); - node_shader_add_uniform(frag, 'sampler2D gbufferD'); + node_shader_add_uniform(frag, "sampler2D gbufferD"); - node_shader_add_out(frag, 'vec4 fragColor[2]'); + node_shader_add_out(frag, "vec4 fragColor[2]"); - node_shader_add_uniform(frag, 'float brushRadius', '_brushRadius'); - node_shader_add_uniform(frag, 'float brushOpacity', '_brushOpacity'); - node_shader_add_uniform(frag, 'float brushHardness', '_brushHardness'); + node_shader_add_uniform(frag, "float brushRadius", "_brushRadius"); + node_shader_add_uniform(frag, "float brushOpacity", "_brushOpacity"); + node_shader_add_uniform(frag, "float brushHardness", "_brushHardness"); if (context_raw.tool == workspace_tool_t.BRUSH || context_raw.tool == workspace_tool_t.ERASER || @@ -56,28 +56,28 @@ function make_sculpt_run(data: material_t, matcon: material_context_t): NodeShad make_brush_run(vert, frag); } - node_shader_write(frag, 'vec3 basecol = vec3(1.0, 1.0, 1.0);'); - node_shader_write(frag, 'float opacity = 1.0;'); - node_shader_write(frag, 'if (opacity == 0.0) discard;'); + node_shader_write(frag, "vec3 basecol = vec3(1.0, 1.0, 1.0);"); + node_shader_write(frag, "float opacity = 1.0;"); + node_shader_write(frag, "if (opacity == 0.0) discard;"); - node_shader_write(frag, 'float str = clamp((brushRadius - dist) * brushHardness * 400.0, 0.0, 1.0) * opacity;'); + node_shader_write(frag, "float str = clamp((brushRadius - dist) * brushHardness * 400.0, 0.0, 1.0) * opacity;"); - node_shader_add_uniform(frag, 'sampler2D texpaint_undo', '_texpaint_undo'); - node_shader_write(frag, 'vec4 sample_undo = textureLod(texpaint_undo, texCoord, 0.0);'); + node_shader_add_uniform(frag, "sampler2D texpaint_undo", "_texpaint_undo"); + node_shader_write(frag, "vec4 sample_undo = textureLod(texpaint_undo, texCoord, 0.0);"); - node_shader_write(frag, 'if (sample_undo.r == 0 && sample_undo.g == 0 && sample_undo.b == 0) discard;'); + node_shader_write(frag, "if (sample_undo.r == 0 && sample_undo.g == 0 && sample_undo.b == 0) discard;"); node_shader_add_function(frag, str_octahedron_wrap); - node_shader_add_uniform(frag, 'sampler2D gbuffer0_undo'); - node_shader_write(frag, 'vec2 g0_undo = textureLod(gbuffer0_undo, inp.xy, 0.0).rg;'); - node_shader_write(frag, 'vec3 wn;'); - node_shader_write(frag, 'wn.z = 1.0 - abs(g0_undo.x) - abs(g0_undo.y);'); - node_shader_write(frag, 'wn.xy = wn.z >= 0.0 ? g0_undo.xy : octahedronWrap(g0_undo.xy);'); - node_shader_write(frag, 'vec3 n = normalize(wn);'); + node_shader_add_uniform(frag, "sampler2D gbuffer0_undo"); + node_shader_write(frag, "vec2 g0_undo = textureLod(gbuffer0_undo, inp.xy, 0.0).rg;"); + node_shader_write(frag, "vec3 wn;"); + node_shader_write(frag, "wn.z = 1.0 - abs(g0_undo.x) - abs(g0_undo.y);"); + node_shader_write(frag, "wn.xy = wn.z >= 0.0 ? g0_undo.xy : octahedronWrap(g0_undo.xy);"); + node_shader_write(frag, "vec3 n = normalize(wn);"); - node_shader_write(frag, 'fragColor[0] = vec4(sample_undo.rgb + n * 0.1 * str, 1.0);'); + node_shader_write(frag, "fragColor[0] = vec4(sample_undo.rgb + n * 0.1 * str, 1.0);"); - node_shader_write(frag, 'fragColor[1] = vec4(str, 0.0, 0.0, 1.0);'); + node_shader_write(frag, "fragColor[1] = vec4(str, 0.0, 0.0, 1.0);"); parser_material_finalize(con_paint); con_paint.data.shader_from_source = true; diff --git a/armorsculpt/Sources/tab_layers.ts b/armorsculpt/Sources/tab_layers.ts index 52f5d6b0..2f310c9e 100644 --- a/armorsculpt/Sources/tab_layers.ts +++ b/armorsculpt/Sources/tab_layers.ts @@ -95,7 +95,7 @@ function tab_layers_remap_layer_pointers(nodes: zui_node_t[], pointer_map: map_t let n = nodes[i]; if (n.type == "LAYER" || n.type == "LAYER_MASK") { let i = n.buttons[0].default_value; - if (pointer_map.has(i)) { + if (map_get(pointer_map, i) != null) { n.buttons[0].default_value = map_get(pointer_map, i); } } diff --git a/base/Sources/base.ts b/base/Sources/base.ts index df7c5371..f9d3e5d6 100644 --- a/base/Sources/base.ts +++ b/base/Sources/base.ts @@ -175,6 +175,79 @@ let base_default_keymap: any = { ///end }; +let base_keymap_keys: string[] = [ + "action_paint", + "action_rotate", + "action_pan", + "action_zoom", + "rotate_light", + "rotate_envmap", + "set_clone_source", + "stencil_transform", + "stencil_hide", + "brush_radius", + "brush_radius_decrease", + "brush_radius_increase", + "brush_ruler", + "file_new", + "file_open", + "file_open_recent", + "file_save", + "file_save_as", + "file_reimport_mesh", + "file_reimport_textures", + "file_import_assets", + "file_export_textures", + "file_export_textures_as", + "edit_undo", + "edit_redo", + "edit_prefs", + "view_reset", + "view_front", + "view_back", + "view_right", + "view_left", + "view_top", + "view_bottom", + "view_camera_type", + "view_orbit_left", + "view_orbit_right", + "view_orbit_up", + "view_orbit_down", + "view_orbit_opposite", + "view_zoom_in", + "view_zoom_out", + "view_distract_free", + "viewport_mode", + "toggle_node_editor", + "toggle_2d_view", + "toggle_browser", + "node_search", + "operator_search", + ///if (is_paint || is_sculpt) + "decal_mask", + "select_material", + "select_layer", + "brush_opacity", + "brush_angle", + "tool_brush", + "tool_eraser", + "tool_fill", + "tool_decal", + "tool_text", + "tool_clone", + "tool_blur", + "tool_smudge", + "tool_particle", + "tool_colorid", + "tool_picker", + "tool_bake", + "tool_gizmo", + "tool_material", + "swap_brush_eraser", + ///end +]; + function base_init() { base_last_window_width = sys_width(); base_last_window_height = sys_height(); diff --git a/base/Sources/box_export.ts b/base/Sources/box_export.ts index e9748223..bd2dab99 100644 --- a/base/Sources/box_export.ts +++ b/base/Sources/box_export.ts @@ -171,7 +171,7 @@ function box_export_tab_export_textures(ui: zui_t, title: string, bake_material: } } if (ui.is_hovered) { - zui_tooltip(tr("Export texture files") + ` (${config_keymap.file_export_textures})`); + zui_tooltip(tr("Export texture files") + " (" + config_keymap.file_export_textures + ")"); } } } @@ -470,12 +470,12 @@ function box_export_parse_preset() { function box_export_new_preset(name: string) { let template: string = -`{ -"textures": [ - { "name": "base", "channels": ["base_r", "base_g", "base_b", "1.0"], "color_space": "linear" } -] -} -`; +"{\ +\"textures\": [\ + { \"name\": \"base\", \"channels\": [\"base_r\", \"base_g\", \"base_b\", \"1.0\"], \"color_space\": \"linear\" }\ +]\ +}\ +"; if (!ends_with(name, ".json")) { name += ".json"; } diff --git a/base/Sources/box_preferences.ts b/base/Sources/box_preferences.ts index 8eaa1699..879736c7 100644 --- a/base/Sources/box_preferences.ts +++ b/base/Sources/box_preferences.ts @@ -609,10 +609,11 @@ function box_preferences_show() { zui_separator(8, false); - let i: i32 = 0; + let index: i32 = 0; ui.changed = false; - for (let key in config_keymap) { - let h: zui_handle_t = zui_nest(zui_handle("boxpreferences_53"), i++); + for (let i: i32 = 0; i < base_keymap_keys.length; ++i) { + let key: string = base_keymap_keys[i]; + let h: zui_handle_t = zui_nest(zui_handle("boxpreferences_53"), index++); h.text = config_keymap[key]; let text: string = zui_text_input(h, key, zui_align_t.LEFT); config_keymap[key] = text; @@ -632,16 +633,16 @@ function box_preferences_show() { let plugin_name: string = zui_text_input(zui_handle("boxpreferences_55", { text: "new_plugin" }), tr("Name")); if (zui_button(tr("OK")) || ui.is_return_down) { let template: string = -`let plugin = create(); -let h1 = zui_handle_create(); -plugin.draw_ui = function (ui) { - if (zui_panel(h1, 'New Plugin')) { - if (zui_button('Button')) { - console.error('Hello'); - } - } -} -`; +"let plugin = create();\ +let h1 = zui_handle_create();\ +plugin.draw_ui = function (ui) {\ + if (zui_panel(h1, \"New Plugin\")) {\ + if (zui_button(\"Button\")) {\ + console.error(\"Hello\");\ + }\ + }\ +}\ +"; if (!ends_with(plugin_name, ".js")) { plugin_name += ".js"; } diff --git a/base/Sources/box_projects.ts b/base/Sources/box_projects.ts index 12bdb742..93ad410c 100644 --- a/base/Sources/box_projects.ts +++ b/base/Sources/box_projects.ts @@ -98,7 +98,7 @@ function box_projects_tab(ui: zui_t) { ///if krom_ios let document_directory: string = krom_save_dialog("", ""); - document_directory = substring(document_directory, 0, document_directory.length - 8); // Strip /'untitled' + document_directory = substring(document_directory, 0, document_directory.length - 8); // Strip /"untitled" path = document_directory + path; ///end diff --git a/base/Sources/config.ts b/base/Sources/config.ts index 1ea0882a..8c6feed1 100644 --- a/base/Sources/config.ts +++ b/base/Sources/config.ts @@ -188,10 +188,11 @@ function config_load_keymap() { let blob: buffer_t = data_get_blob("keymap_presets/" + config_raw.keymap); config_keymap = json_parse(sys_buffer_to_string(blob)); // Fill in undefined keys with defaults - for (let field in base_default_keymap) { - if (!(field in config_keymap)) { + for (let i: i32 = 0; i < base_keymap_keys.length; ++i) { + let key: string = base_keymap_keys[i]; + if (!(key in config_keymap)) { let adefault_keymap: any = base_default_keymap; - config_keymap[field] = adefault_keymap[field]; + config_keymap[key] = adefault_keymap[key]; } } } diff --git a/base/Sources/export_texture.ts b/base/Sources/export_texture.ts index 98dc9be6..9e6bcb47 100644 --- a/base/Sources/export_texture.ts +++ b/base/Sources/export_texture.ts @@ -91,9 +91,9 @@ function export_texture_run(path: string, bake_material: bool = false) { ///end ///if krom_ios - console_info(tr("Textures exported") + " ('Files/On My iPad/" + manifest_title + "')"); + console_info(tr("Textures exported") + " (\"Files/On My iPad/" + manifest_title + "\")"); ///elseif krom_android - console_info(tr("Textures exported") + " ('Files/Internal storage/Pictures/" + manifest_title + "')"); + console_info(tr("Textures exported") + " (\"Files/Internal storage/Pictures/" + manifest_title + "\")"); ///else console_info(tr("Textures exported")); ///end diff --git a/base/Sources/file.ts b/base/Sources/file.ts index 63b1b628..28771ff7 100644 --- a/base/Sources/file.ts +++ b/base/Sources/file.ts @@ -36,20 +36,20 @@ function file_read_directory(path: string, folders_only: bool = false): string[] } function file_create_directory(path: string) { - krom_sys_command(file_cmd_mkdir + ' "' + path + '"'); + krom_sys_command(file_cmd_mkdir + " \"" + path + "\""); } function file_copy(srcPath: string, dst_path: string) { - krom_sys_command(file_cmd_copy + ' "' + srcPath + '" "' + dst_path + '"'); + krom_sys_command(file_cmd_copy + " \"" + srcPath + "\" \"" + dst_path + "\""); } function file_start(path: string) { ///if krom_windows - krom_sys_command('start "" "' + path + '"'); + krom_sys_command("start \"\" \"" + path + "\""); ///elseif krom_linux - krom_sys_command('xdg-open "' + path + '"'); + krom_sys_command("xdg-open \"" + path + "\""); ///else - krom_sys_command('open "' + path + '"'); + krom_sys_command("open \"" + path + "\""); ///end } @@ -74,10 +74,10 @@ function file_download(url: string, dstPath: string, done: ()=>void, size: i32 = done(); }); ///elseif krom_linux - krom_sys_command('wget -O "' + dstPath + '" "' + url + '"'); + krom_sys_command("wget -O \"" + dstPath + "\" \"" + url + "\""); done(); ///else - krom_sys_command('curl -L ' + url + ' -o "' + dstPath + '"'); + krom_sys_command("curl -L " + url + " -o \"" + dstPath + "\""); done(); ///end } diff --git a/base/Sources/import_blend_material.ts b/base/Sources/import_blend_material.ts index 9487c93d..fd482c22 100644 --- a/base/Sources/import_blend_material.ts +++ b/base/Sources/import_blend_material.ts @@ -121,7 +121,7 @@ function import_blend_material_run(path: string) { // Fill button values if (search == "teximage") { let img: any = bl_handle_get(node, "id", 0, "Image"); - let file: string = bl_handle_get(img, "name"); // '//desktop\logo.png' + let file: string = bl_handle_get(img, "name"); // "//desktop\logo.png" file = substring(file, 2, file.length); file = path_base_dir(path) + file; import_texture_run(file); diff --git a/base/Sources/make_voxel.ts b/base/Sources/make_voxel.ts index daa4df1b..b79af1fd 100644 --- a/base/Sources/make_voxel.ts +++ b/base/Sources/make_voxel.ts @@ -20,8 +20,8 @@ function make_voxel_run(data: shader_context_t) { // if (skin) { // g4_vertex_structure_add(structure, "bone", vertex_data_t.I16_4X_Normalized); // g4_vertex_structure_add(structure, "weight", vertex_data_t.I16_4X_Normalized); - // array_push(data.raw.vertex_elements, { name: "bone", data: 'short4norm' }); - // array_push(data.raw.vertex_elements, { name: "weight", data: 'short4norm' }); + // array_push(data.raw.vertex_elements, { name: "bone", data: "short4norm" }); + // array_push(data.raw.vertex_elements, { name: "weight", data: "short4norm" }); // } // ///end @@ -50,39 +50,39 @@ function make_voxel_run(data: shader_context_t) { function make_voxel_source(): string { let ds: f32 = make_material_get_displace_strength(); ///if krom_direct3d11 - return `#define vec3 float3 - uniform float4x4 W; - uniform float3x3 N; - Texture2D texpaint_pack; - SamplerState _texpaint_pack_sampler; - struct SPIRV_Cross_Input { float4 pos : TEXCOORD1; float2 nor : TEXCOORD0; float2 tex : TEXCOORD2; }; - struct SPIRV_Cross_Output { float4 svpos : SV_POSITION; }; - SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input) { - SPIRV_Cross_Output stage_output; - ${make_material_voxelgi_half_extents()} - stage_output.svpos.xyz = mul(float4(stage_input.pos.xyz, 1.0), W).xyz / voxelgiHalfExtents.xxx; - float3 wnormal = normalize(mul(float3(stage_input.nor.xy, stage_input.pos.w), N)); - float height = texpaint_pack.SampleLevel(_texpaint_pack_sampler, stage_input.tex, 0.0).a; - stage_output.svpos.xyz += wnormal * height.xxx * float3(${ds}, ${ds}, ${ds}); - stage_output.svpos.w = 1.0; - return stage_output; - }`; + return "#define vec3 float3 \ + uniform float4x4 W; \ + uniform float3x3 N; \ + Texture2D texpaint_pack; \ + SamplerState _texpaint_pack_sampler; \ + struct SPIRV_Cross_Input { float4 pos : TEXCOORD1; float2 nor : TEXCOORD0; float2 tex : TEXCOORD2; }; \ + struct SPIRV_Cross_Output { float4 svpos : SV_POSITION; }; \ + SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input) { \ + SPIRV_Cross_Output stage_output; \ + " + make_material_voxelgi_half_extents + ")} \ + stage_output.svpos.xyz = mul(float4(stage_input.pos.xyz, 1.0), W).xyz / voxelgiHalfExtents.xxx; \ + float3 wnormal = normalize(mul(float3(stage_input.nor.xy, stage_input.pos.w), N)); \ + float height = texpaint_pack.SampleLevel(_texpaint_pack_sampler, stage_input.tex, 0.0).a; \ + stage_output.svpos.xyz += wnormal * height.xxx * float3(" + ds + ", " + ds + ", " + ds + "); \ + stage_output.svpos.w = 1.0; \ + return stage_output; \ + }"; ///else - return `#version 450 - in vec4 pos; - in vec2 nor; - in vec2 tex; - out vec3 voxpositionGeom; - uniform mat4 W; - uniform mat3 N; - uniform sampler2D texpaint_pack; - void main() { - ${make_material_voxelgi_half_extents()} - voxpositionGeom = vec3(W * vec4(pos.xyz, 1.0)) / voxelgiHalfExtents; - vec3 wnormal = normalize(N * vec3(nor.xy, pos.w)); - float height = textureLod(texpaint_pack, tex, 0.0).a; - voxpositionGeom += wnormal * vec3(height) * vec3(${ds}); - }`; + return "#version 450 \ + in vec4 pos; \ + in vec2 nor; \ + in vec2 tex; \ + out vec3 voxpositionGeom; \ + uniform mat4 W; \ + uniform mat3 N; \ + uniform sampler2D texpaint_pack; \ + void main() { \ + " + make_material_voxelgi_half_extents + ")} \ + voxpositionGeom = vec3(W * vec4(pos.xyz, 1.0)) / voxelgiHalfExtents; \ + vec3 wnormal = normalize(N * vec3(nor.xy, pos.w)); \ + float height = textureLod(texpaint_pack, tex, 0.0).a; \ + voxpositionGeom += wnormal * vec3(height) * vec3(" + ds + "); \ + }"; ///end } ///end diff --git a/base/Sources/node_shader.ts b/base/Sources/node_shader.ts index d990ccd6..1ad8b96a 100644 --- a/base/Sources/node_shader.ts +++ b/base/Sources/node_shader.ts @@ -47,13 +47,13 @@ function node_shader_create(context: node_shader_context_t, shader_type: string) raw.shared_samplers = []; raw.uniforms = []; raw.functions = map_create(); - raw.main = ''; - raw.main_init = ''; - raw.main_end = ''; - raw.main_normal = ''; - raw.main_textures = ''; - raw.main_attribs = ''; - raw.header = ''; + raw.main = ""; + raw.main_init = ""; + raw.main_end = ""; + raw.main_normal = ""; + raw.main_textures = ""; + raw.main_attribs = ""; + raw.header = ""; raw.write_pre = false; raw.write_normal = 0; raw.write_textures = 0; @@ -74,23 +74,23 @@ function node_shader_add_out(raw: node_shader_t, s: string) { } function node_shader_add_uniform(raw: node_shader_t, s: string, link: string = null, included: bool = false) { - let ar: string[] = string_split(s, ' '); + let ar: string[] = string_split(s, " "); // layout(RGBA8) image3D voxels let utype: string = ar[ar.length - 2]; let uname: string = ar[ar.length - 1]; - if (starts_with(utype, 'sampler') || starts_with(utype, 'image') || starts_with(utype, 'uimage')) { - let is_image: bool = (starts_with(utype, 'image') || starts_with(utype, 'uimage')) ? true : false; + if (starts_with(utype, "sampler") || starts_with(utype, "image") || starts_with(utype, "uimage")) { + let is_image: bool = (starts_with(utype, "image") || starts_with(utype, "uimage")) ? true : false; node_shader_context_add_texture_unit(raw.context, utype, uname, link, is_image); } else { // Prefer vec4[] for d3d to avoid padding - if (ar[0] == 'float' && string_index_of(ar[1], '[') >= 0) { - ar[0] = 'floats'; - ar[1] = string_split(ar[1], '[')[0]; + if (ar[0] == "float" && string_index_of(ar[1], "[") >= 0) { + ar[0] = "floats"; + ar[1] = string_split(ar[1], "[")[0]; } - else if (ar[0] == 'vec4' && string_index_of(ar[1], '[') >= 0) { - ar[0] = 'floats'; - ar[1] = string_split(ar[1], '[')[0]; + else if (ar[0] == "vec4" && string_index_of(ar[1], "[") >= 0) { + ar[0] = "floats"; + ar[1] = string_split(ar[1], "[")[0]; } node_shader_context_add_constant(raw.context, ar[0], ar[1], link); } @@ -102,7 +102,7 @@ function node_shader_add_uniform(raw: node_shader_t, s: string, link: string = n function node_shader_add_shared_sampler(raw: node_shader_t, s: string) { if (array_index_of(raw.shared_samplers, s) == -1) { array_push(raw.shared_samplers, s); - let ar: string[] = string_split(s, ' '); + let ar: string[] = string_split(s, " "); // layout(RGBA8) sampler2D tex let utype: string = ar[ar.length - 2]; let uname: string = ar[ar.length - 1]; @@ -111,8 +111,8 @@ function node_shader_add_shared_sampler(raw: node_shader_t, s: string) { } function node_shader_add_function(raw: node_shader_t, s: string) { - let fname: string = string_split(s, '(')[0]; - if (raw.functions.has(fname)) { + let fname: string = string_split(s, "(")[0]; + if (map_get(raw.functions, fname) != null) { return; } map_set(raw.functions, fname, s); @@ -128,7 +128,7 @@ function node_shader_contains(raw: node_shader_t, s: string): bool { } function node_shader_write_init(raw: node_shader_t, s: string) { - raw.main_init = s + '\n' + raw.main_init; + raw.main_init = s + "\n" + raw.main_init; } function node_shader_write(raw: node_shader_t, s: string) { @@ -136,110 +136,110 @@ function node_shader_write(raw: node_shader_t, s: string) { return; } if (raw.write_textures > 0) { - raw.main_textures += s + '\n'; + raw.main_textures += s + "\n"; } else if (raw.write_normal > 0) { - raw.main_normal += s + '\n'; + raw.main_normal += s + "\n"; } else if (raw.write_pre) { - raw.main_init += s + '\n'; + raw.main_init += s + "\n"; } else { - raw.main += s + '\n'; + raw.main += s + "\n"; } } function node_shader_write_header(raw: node_shader_t, s: string) { - raw.header += s + '\n'; + raw.header += s + "\n"; } function node_shader_write_end(raw: node_shader_t, s: string) { - raw.main_end += s + '\n'; + raw.main_end += s + "\n"; } function node_shader_write_attrib(raw: node_shader_t, s: string) { - raw.main_attribs += s + '\n'; + raw.main_attribs += s + "\n"; } function node_shader_data_size(raw: node_shader_t, data: string): string { - if (data == 'float1') { - return '1'; + if (data == "float1") { + return "1"; } - else if (data == 'float2') { - return '2'; + else if (data == "float2") { + return "2"; } - else if (data == 'float3') { - return '3'; + else if (data == "float3") { + return "3"; } - else if (data == 'float4') { - return '4'; + else if (data == "float4") { + return "4"; } - else if (data == 'short2norm') { - return '2'; + else if (data == "short2norm") { + return "2"; } - else if (data == 'short4norm') { - return '4'; + else if (data == "short4norm") { + return "4"; } else { - return '1'; + return "1"; } } function node_shader_vstruct_to_vsin(raw: node_shader_t) { - // if self.shader_type != 'vert' or self.ins != [] or not self.vstruct_as_vsin: # Vertex structure as vertex shader input + // if self.shader_type != "vert" or self.ins != [] or not self.vstruct_as_vsin: # Vertex structure as vertex shader input // return let vs: vertex_element_t[] = raw.context.data.vertex_elements; for (let i: i32 = 0; i < vs.length; ++i) { let e: vertex_element_t = vs[i]; - node_shader_add_in(raw, 'vec' + node_shader_data_size(raw, e.data) + ' ' + e.name); + node_shader_add_in(raw, "vec" + node_shader_data_size(raw, e.data) + " " + e.name); } } ///if (krom_direct3d11 || krom_direct3d12) function node_shader_get_hlsl(raw: node_shader_t, shared_sampler: string): string { - let s: string = '#define HLSL\n'; - s += '#define textureArg(tex) Texture2D tex,SamplerState tex ## _sampler\n'; - s += '#define texturePass(tex) tex,tex ## _sampler\n'; - s += '#define sampler2D Texture2D\n'; - s += '#define sampler3D Texture3D\n'; - s += '#define texture(tex, coord) tex.Sample(tex ## _sampler, coord)\n'; - s += `#define textureShared(tex, coord) tex.Sample(${shared_sampler}, coord)\n`; - s += '#define textureLod(tex, coord, lod) tex.SampleLevel(tex ## _sampler, coord, lod)\n'; - s += `#define textureLodShared(tex, coord, lod) tex.SampleLevel(${shared_sampler}, coord, lod)\n`; - s += '#define texelFetch(tex, coord, lod) tex.Load(float3(coord.xy, lod))\n'; - s += 'uint2 _GetDimensions(Texture2D tex, uint lod) { uint x, y; tex.GetDimensions(x, y); return uint2(x, y); }\n'; - s += '#define textureSize _GetDimensions\n'; - s += '#define mod(a, b) (a % b)\n'; - s += '#define vec2 float2\n'; - s += '#define vec3 float3\n'; - s += '#define vec4 float4\n'; - s += '#define ivec2 int2\n'; - s += '#define ivec3 int3\n'; - s += '#define ivec4 int4\n'; - s += '#define mat2 float2x2\n'; - s += '#define mat3 float3x3\n'; - s += '#define mat4 float4x4\n'; - s += '#define dFdx ddx\n'; - s += '#define dFdy ddy\n'; - s += '#define inversesqrt rsqrt\n'; - s += '#define fract frac\n'; - s += '#define mix lerp\n'; - // s += '#define fma mad\n'; + let s: string = "#define HLSL\n"; + s += "#define textureArg(tex) Texture2D tex,SamplerState tex ## _sampler\n"; + s += "#define texturePass(tex) tex,tex ## _sampler\n"; + s += "#define sampler2D Texture2D\n"; + s += "#define sampler3D Texture3D\n"; + s += "#define texture(tex, coord) tex.Sample(tex ## _sampler, coord)\n"; + s += "#define textureShared(tex, coord) tex.Sample(" + shared_sampler + ", coord)\n"; + s += "#define textureLod(tex, coord, lod) tex.SampleLevel(tex ## _sampler, coord, lod)\n"; + s += "#define textureLodShared(tex, coord, lod) tex.SampleLevel(" + shared_sampler + ", coord, lod)\n"; + s += "#define texelFetch(tex, coord, lod) tex.Load(float3(coord.xy, lod))\n"; + s += "uint2 _GetDimensions(Texture2D tex, uint lod) { uint x, y; tex.GetDimensions(x, y); return uint2(x, y); }\n"; + s += "#define textureSize _GetDimensions\n"; + s += "#define mod(a, b) (a % b)\n"; + s += "#define vec2 float2\n"; + s += "#define vec3 float3\n"; + s += "#define vec4 float4\n"; + s += "#define ivec2 int2\n"; + s += "#define ivec3 int3\n"; + s += "#define ivec4 int4\n"; + s += "#define mat2 float2x2\n"; + s += "#define mat3 float3x3\n"; + s += "#define mat4 float4x4\n"; + s += "#define dFdx ddx\n"; + s += "#define dFdy ddy\n"; + s += "#define inversesqrt rsqrt\n"; + s += "#define fract frac\n"; + s += "#define mix lerp\n"; + // s += "#define fma mad\n"; s += raw.header; - let in_ext: string = ''; - let out_ext: string = ''; + let in_ext: string = ""; + let out_ext: string = ""; for (let i: i32 = 0; i < raw.includes.length; ++i) { let a: string = raw.includes[i]; - s += '#include "' + a + '"\n'; + s += "#include \"" + a + "\"\n"; } // Input structure let index: i32 = 0; if (raw.ins.length > 0) { - s += 'struct SPIRV_Cross_Input {\n'; + s += "struct SPIRV_Cross_Input {\n"; index = 0; array_sort(raw.ins, function (a, b): i32 { // Sort inputs by name @@ -247,113 +247,113 @@ function node_shader_get_hlsl(raw: node_shader_t, shared_sampler: string): strin }); for (let i: i32 = 0; i < raw.ins.length; ++i) { let a: string = raw.ins[i]; - s += `${a}${in_ext} : TEXCOORD${index};\n`; + s += a + in_ext + " : TEXCOORD" + index + ";\n"; index++; } // Built-ins - if (raw.shader_type == 'vert' && string_index_of(raw.main, "gl_VertexID") >= 0) { - s += 'uint gl_VertexID : SV_VertexID;\n'; - array_push(raw.ins, 'uint gl_VertexID'); + if (raw.shader_type == "vert" && string_index_of(raw.main, "gl_VertexID") >= 0) { + s += "uint gl_VertexID : SV_VertexID;\n"; + array_push(raw.ins, "uint gl_VertexID"); } - if (raw.shader_type == 'vert' && string_index_of(raw.main, "gl_InstanceID") >= 0) { - s += 'uint gl_InstanceID : SV_InstanceID;\n'; - array_push(raw.ins, 'uint gl_InstanceID'); + if (raw.shader_type == "vert" && string_index_of(raw.main, "gl_InstanceID") >= 0) { + s += "uint gl_InstanceID : SV_InstanceID;\n"; + array_push(raw.ins, "uint gl_InstanceID"); } - s += '};\n'; + s += "};\n"; } // Output structure let num: i32 = 0; - if (raw.outs.length > 0 || raw.shader_type == 'vert') { - s += 'struct SPIRV_Cross_Output {\n'; + if (raw.outs.length > 0 || raw.shader_type == "vert") { + s += "struct SPIRV_Cross_Output {\n"; array_sort(raw.outs, function (a, b): i32 { // Sort outputs by name return substring(a, 4, a.length) >= substring(b, 4, b.length) ? 1 : -1; }); index = 0; - if (raw.shader_type == 'vert') { + if (raw.shader_type == "vert") { for (let i: i32 = 0; i < raw.outs.length; ++i) { let a: string = raw.outs[i]; - s += `${a}${out_ext} : TEXCOORD${index};\n`; + s += a + out_ext + " : TEXCOORD" + index + ";\n"; index++; } - s += 'float4 svpos : SV_POSITION;\n'; + s += "float4 svpos : SV_POSITION;\n"; } else { let out: string = raw.outs[0]; // Multiple render targets - if (char_at(out, out.length - 1) == ']') { + if (char_at(out, out.length - 1) == "]") { num = parse_int(char_at(out, out.length - 2)); - s += `vec4 fragColor[${num}] : SV_TARGET0;\n`; + s += "vec4 fragColor[" + num + "] : SV_TARGET0;\n"; } else { - s += 'vec4 fragColor : SV_TARGET0;\n'; + s += "vec4 fragColor : SV_TARGET0;\n"; } } - s += '};\n'; + s += "};\n"; } for (let i: i32 = 0; i < raw.uniforms.length; ++i) { let a: string = raw.uniforms[i]; - s += 'uniform ' + a + ';\n'; - if (starts_with(a, 'sampler')) { - s += 'SamplerState ' + string_split(a, ' ')[1] + '_sampler;\n'; + s += "uniform " + a + ";\n"; + if (starts_with(a, "sampler")) { + s += "SamplerState " + string_split(a, " ")[1] + "_sampler;\n"; } } if (raw.shared_samplers.length > 0) { - for (let i: i32 = 0; o < raw.shared_samplers.length; ++i) { + for (let i: i32 = 0; i < raw.shared_samplers.length; ++i) { let a: string = raw.shared_samplers[i]; - s += 'uniform ' + a + ';\n'; + s += "uniform " + a + ";\n"; } - s += `SamplerState ${shared_sampler};\n`; + s += "SamplerState " + shared_sampler + ";\n"; } let values: string[] = map_to_array(raw.functions); for (let i: i32 = 0; i < values.length; ++i) { let f: string = values[i]; - s += f + '\n'; + s += f + "\n"; } // Begin main - if (raw.outs.length > 0 || raw.shader_type == 'vert') { + if (raw.outs.length > 0 || raw.shader_type == "vert") { if (raw.ins.length > 0) { - s += 'SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input) {\n'; + s += "SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input) {\n"; } else { - s += 'SPIRV_Cross_Output main() {\n'; + s += "SPIRV_Cross_Output main() {\n"; } } else { if (raw.ins.length > 0) { - s += 'void main(SPIRV_Cross_Input stage_input) {\n'; + s += "void main(SPIRV_Cross_Input stage_input) {\n"; } else { - s += 'void main() {\n'; + s += "void main() {\n"; } } // Declare inputs for (let i: i32 = 0; i < raw.ins.length; ++i) { let a: string = raw.ins[i]; - let b: string = substring(a, 5, a.length); // Remove type 'vec4 ' - s += `${a} = stage_input.${b};\n`; + let b: string = substring(a, 5, a.length); // Remove type "vec4 " + s += a + " = stage_input." + b + ";\n"; } - if (raw.shader_type == 'vert') { - s += 'vec4 gl_Position;\n'; + if (raw.shader_type == "vert") { + s += "vec4 gl_Position;\n"; for (let i: i32 = 0; i < raw.outs.length; ++i) { let a: string = raw.outs[i]; - s += `${a};\n`; + s += a + ";\n"; } } else { if (raw.outs.length > 0) { if (num > 0) { - s += `vec4 fragColor[${num}];\n`; + s += "vec4 fragColor[" + num + "];\n"; } else { - s += 'vec4 fragColor;\n'; + s += "vec4 fragColor;\n"; } } } @@ -366,71 +366,71 @@ function node_shader_get_hlsl(raw: node_shader_t, shared_sampler: string): strin s += raw.main_end; // Write output structure - if (raw.outs.length > 0 || raw.shader_type == 'vert') { - s += 'SPIRV_Cross_Output stage_output;\n'; - if (raw.shader_type == 'vert') { - s += 'gl_Position.z = (gl_Position.z + gl_Position.w) * 0.5;\n'; - s += 'stage_output.svpos = gl_Position;\n'; + if (raw.outs.length > 0 || raw.shader_type == "vert") { + s += "SPIRV_Cross_Output stage_output;\n"; + if (raw.shader_type == "vert") { + s += "gl_Position.z = (gl_Position.z + gl_Position.w) * 0.5;\n"; + s += "stage_output.svpos = gl_Position;\n"; for (let i: i32 = 0; i < raw.outs.length; ++i) { let a: string = raw.outs[i]; - let b: string = substring(a, 5, a.length); // Remove type 'vec4 ' - s += `stage_output.${b} = ${b};\n`; + let b: string = substring(a, 5, a.length); // Remove type "vec4 " + s += "stage_output." + b + " = " + b + ";\n"; } } else { if (num > 0) { for (let i: i32 = 0; i < num; ++i) { - s += `stage_output.fragColor[${i}] = fragColor[${i}];\n`; + s += "stage_output.fragColor[" + i + "] = fragColor[" + i + "];\n"; } } else { - s += 'stage_output.fragColor = fragColor;\n'; + s += "stage_output.fragColor = fragColor;\n"; } } - s += 'return stage_output;\n'; + s += "return stage_output;\n"; } - s += '}\n'; + s += "}\n"; return s; } ///end ///if krom_metal function node_shader_get_msl(raw: node_shader_t, shared_sampler: string): string { - let s: string = '#define METAL\n'; - s += '#include \n'; - s += '#include \n'; - s += 'using namespace metal;\n'; + let s: string = "#define METAL\n"; + s += "#include \n"; + s += "#include \n"; + s += "using namespace metal;\n"; - s += '#define textureArg(tex) texture2d tex,sampler tex ## _sampler\n'; - s += '#define texturePass(tex) tex,tex ## _sampler\n'; - s += '#define sampler2D texture2d\n'; - s += '#define sampler3D texture3d\n'; - s += '#define texture(tex, coord) tex.sample(tex ## _sampler, coord)\n'; - s += `#define textureShared(tex, coord) tex.sample(${shared_sampler}, coord)\n`; - s += '#define textureLod(tex, coord, lod) tex.sample(tex ## _sampler, coord, level(lod))\n'; - s += `#define textureLodShared(tex, coord, lod) tex.sample(${shared_sampler}, coord, level(lod))\n`; - s += '#define texelFetch(tex, coord, lod) tex.read(uint2(coord), uint(lod))\n'; - s += 'float2 _getDimensions(texture2d tex, uint lod) { return float2(tex.get_width(lod), tex.get_height(lod)); }\n'; - s += '#define textureSize _getDimensions\n'; - s += '#define mod(a, b) fmod(a, b)\n'; - s += '#define vec2 float2\n'; - s += '#define vec3 float3\n'; - s += '#define vec4 float4\n'; - s += '#define ivec2 int2\n'; - s += '#define ivec3 int3\n'; - s += '#define ivec4 int4\n'; - s += '#define mat2 float2x2\n'; - s += '#define mat3 float3x3\n'; - s += '#define mat4 float4x4\n'; - s += '#define dFdx dfdx\n'; - s += '#define dFdy dfdy\n'; - s += '#define inversesqrt rsqrt\n'; - s += '#define mul(a, b) b * a\n'; - s += '#define discard discard_fragment()\n'; + s += "#define textureArg(tex) texture2d tex,sampler tex ## _sampler\n"; + s += "#define texturePass(tex) tex,tex ## _sampler\n"; + s += "#define sampler2D texture2d\n"; + s += "#define sampler3D texture3d\n"; + s += "#define texture(tex, coord) tex.sample(tex ## _sampler, coord)\n"; + s += "#define textureShared(tex, coord) tex.sample(" + shared_sampler + ", coord)\n"; + s += "#define textureLod(tex, coord, lod) tex.sample(tex ## _sampler, coord, level(lod))\n"; + s += "#define textureLodShared(tex, coord, lod) tex.sample(" + shared_sampler + ", coord, level(lod))\n"; + s += "#define texelFetch(tex, coord, lod) tex.read(uint2(coord), uint(lod))\n"; + s += "float2 _getDimensions(texture2d tex, uint lod) { return float2(tex.get_width(lod), tex.get_height(lod)); }\n"; + s += "#define textureSize _getDimensions\n"; + s += "#define mod(a, b) fmod(a, b)\n"; + s += "#define vec2 float2\n"; + s += "#define vec3 float3\n"; + s += "#define vec4 float4\n"; + s += "#define ivec2 int2\n"; + s += "#define ivec3 int3\n"; + s += "#define ivec4 int4\n"; + s += "#define mat2 float2x2\n"; + s += "#define mat3 float3x3\n"; + s += "#define mat4 float4x4\n"; + s += "#define dFdx dfdx\n"; + s += "#define dFdy dfdy\n"; + s += "#define inversesqrt rsqrt\n"; + s += "#define mul(a, b) b * a\n"; + s += "#define discard discard_fragment()\n"; for (let i: i32 = 0; i < raw.includes.length; ++i) { let a: string = raw.includes[i]; - s += '#include "' + a + '"\n'; + s += "#include \"" + a + "\"\n"; } s += raw.header; @@ -438,163 +438,163 @@ function node_shader_get_msl(raw: node_shader_t, shared_sampler: string): string // Input structure let index: i32 = 0; //if (ins.length > 0) { - s += 'struct main_in {\n'; + s += "struct main_in {\n"; index = 0; array_sort(raw.ins, function (a, b): i32 { // Sort inputs by name return substring(a, 4, a.length) >= substring(b, 4, b.length) ? 1 : -1; }); - if (raw.shader_type == 'vert') { + if (raw.shader_type == "vert") { for (let i: i32 = 0; i < raw.ins.length; ++i) { let a: string = raw.ins[i]; - s += `${a} [[attribute(${index})]];\n`; + s += a + " [[attribute(" + index + ")]];\n"; index++; } } else { for (let i: i32 = 0; i < raw.ins.length; ++i) { let a: string = raw.ins[i]; - s += `${a} [[user(locn${index})]];\n`; + s += a + " [[user(locn" + index + ")]];\n"; index++; } } - s += '};\n'; + s += "};\n"; //} // Output structure let num: i32 = 0; - if (raw.outs.length > 0 || raw.shader_type == 'vert') { - s += 'struct main_out {\n'; + if (raw.outs.length > 0 || raw.shader_type == "vert") { + s += "struct main_out {\n"; array_sort(raw.outs, function (a, b): i32 { // Sort outputs by name return substring(a, 4, a.length) >= substring(b, 4, b.length) ? 1 : -1; }); index = 0; - if (raw.shader_type == 'vert') { + if (raw.shader_type == "vert") { for (let i: i32 = 0; i < raw.outs.length; ++i) { let a: string = raw.outs[i]; - s += `${a} [[user(locn${index})]];\n`; + s += a + " [[user(locn" + index + ")]];\n"; index++; } - s += 'float4 svpos [[position]];\n'; + s += "float4 svpos [[position]];\n"; } else { let out: string = raw.outs[0]; // Multiple render targets - if (char_at(out, out.length - 1) == ']') { + if (char_at(out, out.length - 1) == "]") { num = parse_int(char_at(out, out.length - 2)); for (let i: i32 = 0; i < num; ++i) { - s += `float4 fragColor_${i} [[color(${i})]];\n`; + s += "float4 fragColor_" + i + " [[color(" + i + ")]];\n"; } } else { - s += 'float4 fragColor [[color(0)]];\n'; + s += "float4 fragColor [[color(0)]];\n"; } } - s += '};\n'; + s += "};\n"; } let samplers: string[] = []; if (raw.uniforms.length > 0) { - s += 'struct main_uniforms {\n'; + s += "struct main_uniforms {\n"; for (let i: i32 = 0; i < raw.uniforms.length; ++i) { let a: string = raw.uniforms[i]; - if (starts_with(a, 'sampler')) { + if (starts_with(a, "sampler")) { array_push(samplers, a); } else { - s += a + ';\n'; + s += a + ";\n"; } } - s += '};\n'; + s += "};\n"; } let values: string[] = map_to_array(raw.functions); for (let i: i32 = 0; i < values.length; ++i) { let f: string = values[i]; - s += f + '\n'; + s += f + "\n"; } // Begin main declaration - s += '#undef texture\n'; + s += "#undef texture\n"; - s += raw.shader_type == 'vert' ? 'vertex ' : 'fragment '; - s += (raw.outs.length > 0 || raw.shader_type == 'vert') ? 'main_out ' : 'void '; - s += 'my_main('; + s += raw.shader_type == "vert" ? "vertex " : "fragment "; + s += (raw.outs.length > 0 || raw.shader_type == "vert") ? "main_out " : "void "; + s += "my_main("; //if (ins.length > 0) { - s += 'main_in in [[stage_in]]'; + s += "main_in in [[stage_in]]"; //} if (raw.uniforms.length > 0) { - let bufi: i32 = raw.shader_type == 'vert' ? 1 : 0; - s += `, constant main_uniforms& uniforms [[buffer(${bufi})]]`; + let bufi: i32 = raw.shader_type == "vert" ? 1 : 0; + s += ", constant main_uniforms& uniforms [[buffer(" + bufi + ")]]"; } if (samplers.length > 0) { for (let i: i32 = 0; i < samplers.length; ++i) { - s += `, ${samplers[i]} [[texture(${i})]]`; - s += ', sampler ' + string_split(samplers[i], ' ')[1] + `_sampler [[sampler(${i})]]`; + s += ", " + samplers[i] + " [[texture(" + i + ")]]"; + s += ", sampler " + string_split(samplers[i], " ")[1] + "_sampler [[sampler(" + i + ")]]"; } } if (raw.shared_samplers.length > 0) { for (let i: i32 = 0; i < raw.shared_samplers.length; ++i) { let index: i32 = samplers.length + i; - s += `, ${raw.shared_samplers[i]} [[texture(${index})]]`; + s += ", " + raw + "shared_samplers[i]} [[texture(" + index + ")]]"; } - s += `, sampler ${shared_sampler} [[sampler(${samplers.length})]]`; + s += ", sampler " + shared_sampler + " [[sampler(" + samplers + "length})]]"; } // Built-ins - if (raw.shader_type == 'vert' && string_index_of(raw.main, "gl_VertexID") >= 0) { - s += ', uint gl_VertexID [[vertex_id]]'; + if (raw.shader_type == "vert" && string_index_of(raw.main, "gl_VertexID") >= 0) { + s += ", uint gl_VertexID [[vertex_id]]"; } - if (raw.shader_type == 'vert' && string_index_of(raw.main, "gl_InstanceID") >= 0) { - s += ', uint gl_InstanceID [[instance_id]]'; + if (raw.shader_type == "vert" && string_index_of(raw.main, "gl_InstanceID") >= 0) { + s += ", uint gl_InstanceID [[instance_id]]"; } // End main declaration - s += ') {\n'; - s += '#define texture(tex, coord) tex.sample(tex ## _sampler, coord)\n'; + s += ") {\n"; + s += "#define texture(tex, coord) tex.sample(tex ## _sampler, coord)\n"; // Declare inputs for (let i: i32 = 0; i < raw.ins.length; ++i) { let a: string = raw.ins[i]; - let b: string = substring(a, 5, a.length); // Remove type 'vec4 ' - s += `${a} = in.${b};\n`; + let b: string = substring(a, 5, a.length); // Remove type "vec4 " + s += a + " = in." + b + ";\n"; } for (let i: i32 = 0; i < raw.uniforms.length; ++i) { let a: string = raw.uniforms[i]; - if (!starts_with(a, 'sampler')) { - let b: string = string_split(a, " ")[1]; // Remove type 'vec4 ' + if (!starts_with(a, "sampler")) { + let b: string = string_split(a, " ")[1]; // Remove type "vec4 " if (string_index_of(b, "[") >= 0) { b = substring(b, 0, string_index_of(b, "[")); let type: string = string_split(a, " ")[0]; - s += `constant ${type} *${b} = uniforms.${b};\n`; + s += "constant " + type + " *" + b + " = uniforms." + b + ";\n"; } else { - s += `${a} = uniforms.${b};\n`; + s += a + " = uniforms." + b + ";\n"; } } } - if (raw.shader_type == 'vert') { - s += 'vec4 gl_Position;\n'; + if (raw.shader_type == "vert") { + s += "vec4 gl_Position;\n"; for (let i: i32 = 0; i < raw.outs.length; ++i) { let a: string = raw.outs[i]; - s += `${a};\n`; + s += a + ";\n"; } } else { if (raw.outs.length > 0) { if (num > 0) { - s += `vec4 fragColor[${num}];\n`; + s += "vec4 fragColor[" + num + "];\n"; } else { - s += 'vec4 fragColor;\n'; + s += "vec4 fragColor;\n"; } } } @@ -607,30 +607,30 @@ function node_shader_get_msl(raw: node_shader_t, shared_sampler: string): string s += raw.main_end; // Write output structure - if (raw.outs.length > 0 || raw.shader_type == 'vert') { - s += 'main_out out = {};\n'; - if (raw.shader_type == 'vert') { - s += 'gl_Position.z = (gl_Position.z + gl_Position.w) * 0.5;\n'; - s += 'out.svpos = gl_Position;\n'; + if (raw.outs.length > 0 || raw.shader_type == "vert") { + s += "main_out out = {};\n"; + if (raw.shader_type == "vert") { + s += "gl_Position.z = (gl_Position.z + gl_Position.w) * 0.5;\n"; + s += "out.svpos = gl_Position;\n"; for (let i: i32 = 0; i < raw.outs.length; ++i) { let a: string = raw.outs[i]; - let b: string = string_split(a, " ")[1]; // Remove type 'vec4 ' - s += `out.${b} = ${b};\n`; + let b: string = string_split(a, " ")[1]; // Remove type "vec4 " + s += "out." + b + " = " + b + ";\n"; } } else { if (num > 0) { for (let i: i32 = 0; i < num; ++i) { - s += `out.fragColor_${i} = fragColor[${i}];\n`; + s += "out.fragColor_" + i + " = fragColor[" + i + "];\n"; } } else { - s += 'out.fragColor = fragColor;\n'; + s += "out.fragColor = fragColor;\n"; } } - s += 'return out;\n'; + s += "return out;\n"; } - s += '}\n'; + s += "}\n"; return s; } ///end @@ -638,63 +638,63 @@ function node_shader_get_msl(raw: node_shader_t, shared_sampler: string): string ///if (krom_opengl || krom_vulkan) function node_shader_get_glsl(raw: node_shader_t, shared_sampler: string, version_header: string): string { let s: string = version_header; - s += '#define textureArg(tex) sampler2D tex\n'; - s += '#define texturePass(tex) tex\n'; - s += '#define mul(a, b) b * a\n'; - s += '#define textureShared texture\n'; - s += '#define textureLodShared textureLod\n'; - s += '#define atan2(x, y) atan(y, x)\n'; + s += "#define textureArg(tex) sampler2D tex\n"; + s += "#define texturePass(tex) tex\n"; + s += "#define mul(a, b) b * a\n"; + s += "#define textureShared texture\n"; + s += "#define textureLodShared textureLod\n"; + s += "#define atan2(x, y) atan(y, x)\n"; s += raw.header; - let in_ext: string = ''; - let out_ext: string = ''; + let in_ext: string = ""; + let out_ext: string = ""; for (let i: i32 = 0; i < raw.includes.length; ++i) { let a: string = raw.includes[i]; - s += '#include "' + a + '"\n'; + s += "#include \"" + a + "\"\n"; } for (let i: i32 = 0; i < raw.ins.length; ++i) { let a: string = raw.ins[i]; - s += `in ${a}${in_ext};\n`; + s += "in " + a + in_ext + ";\n"; } for (let i: i32 = 0; i < raw.outs.length; ++i) { let a: string = raw.outs[i]; - s += `out ${a}${out_ext};\n`; + s += "out " + a + out_ext + ";\n"; } for (let i: i32 = 0; i < raw.uniforms.length; ++i) { let a: string = raw.uniforms[i]; - s += 'uniform ' + a + ';\n'; + s += "uniform " + a + ";\n"; } for (let i: i32 = 0; i < raw.shared_samplers.length; ++i) { let a: string = raw.shared_samplers[i]; - s += 'uniform ' + a + ';\n'; + s += "uniform " + a + ";\n"; } let values: string[] = map_to_array(raw.functions); for (let i: i32 = 0; i < values.length; ++i) { let f: string = values[i]; - s += f + '\n'; + s += f + "\n"; } - s += 'void main() {\n'; + s += "void main() {\n"; s += raw.main_attribs; s += raw.main_textures; s += raw.main_normal; s += raw.main_init; s += raw.main; s += raw.main_end; - s += '}\n'; + s += "}\n"; return s; } ///end function node_shader_get(raw: node_shader_t): string { - if (raw.shader_type == 'vert' && raw.vstruct_as_vsin) { + if (raw.shader_type == "vert" && raw.vstruct_as_vsin) { node_shader_vstruct_to_vsin(raw); } - let shared_sampler: string = 'shared_sampler'; + let shared_sampler: string = "shared_sampler"; if (raw.shared_samplers.length > 0) { - shared_sampler = string_split(raw.shared_samplers[0], ' ')[1] + '_sampler'; + shared_sampler = string_split(raw.shared_samplers[0], " ")[1] + "_sampler"; } ///if (krom_direct3d11 || krom_direct3d12) @@ -702,17 +702,17 @@ function node_shader_get(raw: node_shader_t): string { ///elseif krom_metal let s: string = node_shader_get_msl(raw, shared_sampler); ///elseif krom_vulkan - let version_header: string = '#version 450\n'; + let version_header: string = "#version 450\n"; let s: string = node_shader_get_glsl(raw, shared_sampler, version_header); ///elseif krom_android - let version_header: string = '#version 300 es\n'; - if (raw.shader_type == 'frag') { - version_header += 'precision highp float;\n'; - version_header += 'precision mediump int;\n'; + let version_header: string = "#version 300 es\n"; + if (raw.shader_type == "frag") { + version_header += "precision highp float;\n"; + version_header += "precision mediump int;\n"; } let s: string = node_shader_get_glsl(raw, shared_sampler, version_header); ///elseif krom_opengl - let version_header: string = '#version 330\n'; + let version_header: string = "#version 330\n"; let s: string = node_shader_get_glsl(raw, shared_sampler, version_header); ///end diff --git a/base/Sources/node_shader_context.ts b/base/Sources/node_shader_context.ts index b931a950..21029d7a 100644 --- a/base/Sources/node_shader_context.ts +++ b/base/Sources/node_shader_context.ts @@ -23,9 +23,9 @@ function node_shader_context_create(material: material_t, props: any): node_shad alpha_blend_source: props.alpha_blend_source, alpha_blend_destination: props.alpha_blend_destination, alpha_blend_operation: props.alpha_blend_operation, - fragment_shader: '', - vertex_shader: '', - vertex_elements: 'vertex_elements' in props ? props.vertex_elements : [ {name: "pos", data: 'short4norm'}, {name: "nor", data: 'short2norm'}], + fragment_shader: "", + vertex_shader: "", + vertex_elements: props.vertex_elements != null ? props.vertex_elements : [ {name: "pos", data: "short4norm"}, {name: "nor", data: "short2norm"}], color_attachments: props.color_attachments, depth_attachment: props.depth_attachment }; @@ -113,14 +113,14 @@ function node_shader_context_add_texture_unit(raw: node_shader_context_t, ctype: } function node_shader_context_make_vert(raw: node_shader_context_t): node_shader_t { - raw.data.vertex_shader = raw.material.name + '_' + raw.data.name + '.vert'; - raw.vert = node_shader_create(raw, 'vert'); + raw.data.vertex_shader = raw.material.name + "_" + raw.data.name + ".vert"; + raw.vert = node_shader_create(raw, "vert"); return raw.vert; } function node_shader_context_make_frag(raw: node_shader_context_t): node_shader_t { - raw.data.fragment_shader = raw.material.name + '_' + raw.data.name + '.frag'; - raw.frag = node_shader_create(raw, 'frag'); + raw.data.fragment_shader = raw.material.name + "_" + raw.data.name + ".frag"; + raw.frag = node_shader_create(raw, "frag"); return raw.frag; } diff --git a/base/Sources/operator.ts b/base/Sources/operator.ts index 19aa76f5..2c1cc93c 100644 --- a/base/Sources/operator.ts +++ b/base/Sources/operator.ts @@ -13,7 +13,8 @@ function operator_run(name: string) { function operator_update() { if (mouse_started_any() || keyboard_started_any()) { - for (let op in config_keymap) { + for (let i: i32 = 0; i < base_keymap_keys.length; ++i) { + let op: string = base_keymap_keys[i]; if (operator_shortcut(config_keymap[op])) { operator_run(op); } @@ -21,7 +22,7 @@ function operator_update() { } } -function operator_shortcut(s: string, type = shortcut_type_t.STARTED): bool { +function operator_shortcut(s: string, type: shortcut_type_t = shortcut_type_t.STARTED): bool { if (s == "") { return false; } diff --git a/base/Sources/parser_blend.ts b/base/Sources/parser_blend.ts index 75e75a91..5bea8a95 100644 --- a/base/Sources/parser_blend.ts +++ b/base/Sources/parser_blend.ts @@ -126,7 +126,7 @@ function parser_blend_parse(raw: blend_t) { // Memory address let addr: any = parser_blend_read_pointer(raw); - if (!raw.map.has(addr)) { + if (map_get(raw.map, addr) == null) { map_set(raw.map, addr, b); } @@ -426,7 +426,7 @@ function bl_handle_get(raw: bl_handle_t, name: string, index: i32 = 0, as_type: if (is_pointer) { raw.block.blend.pos = raw.block.pos + new_offset; let addr: any = parser_blend_read_pointer(raw.block.blend); - if (raw.block.blend.map.has(addr)) { + if (map_get(raw.block.blend.map, addr) != null) { h.block = map_get(raw.block.blend.map, addr); } else h.block = raw.block; diff --git a/base/Sources/parser_material.ts b/base/Sources/parser_material.ts index 62b2f2b9..a25af16b 100644 --- a/base/Sources/parser_material.ts +++ b/base/Sources/parser_material.ts @@ -148,14 +148,14 @@ function parser_material_parse(canvas: zui_node_canvas_t, _con: node_shader_cont let link: zui_node_link_t = { id: 99999, from_id: parser_material_start_node.id, from_socket: 0, to_id: -1, to_socket: -1 }; parser_material_write_result(link); return { - out_basecol: `vec3(0.0, 0.0, 0.0)`, - out_roughness: `0.0`, - out_metallic: `0.0`, - out_occlusion: `1.0`, - out_opacity: `1.0`, - out_height: `0.0`, - out_emission: `0.0`, - out_subsurface: `0.0` + out_basecol: "vec3(0.0, 0.0, 0.0)", + out_roughness: "0.0", + out_metallic: "0.0", + out_occlusion: "1.0", + out_opacity: "1.0", + out_height: "0.0", + out_emission: "0.0", + out_subsurface: "0.0" } } @@ -184,88 +184,88 @@ function parser_material_finalize(con: node_shader_context_t) { if (frag.bposition) { if (parser_material_triplanar) { - node_shader_write_attrib(frag, `vec3 bposition = vec3( - texCoord1.x * texCoordBlend.y + texCoord2.x * texCoordBlend.z, - texCoord.x * texCoordBlend.x + texCoord2.y * texCoordBlend.z, - texCoord.y * texCoordBlend.x + texCoord1.y * texCoordBlend.y);`); + node_shader_write_attrib(frag, "vec3 bposition = vec3(\ + texCoord1.x * texCoordBlend.y + texCoord2.x * texCoordBlend.z,\ + texCoord.x * texCoordBlend.x + texCoord2.y * texCoordBlend.z,\ + texCoord.y * texCoordBlend.x + texCoord1.y * texCoordBlend.y);"); } else if (frag.ndcpos) { node_shader_add_out(vert, "vec3 bposition"); - node_shader_write(vert, `bposition = (ndc.xyz / ndc.w);`); + node_shader_write(vert, "bposition = (ndc.xyz / ndc.w);"); } else { node_shader_add_out(vert, "vec3 bposition"); node_shader_add_uniform(vert, "vec3 dim", "_dim"); node_shader_add_uniform(vert, "vec3 hdim", "_half_dim"); - node_shader_write_attrib(vert, `bposition = (pos.xyz + hdim) / dim;`); + node_shader_write_attrib(vert, "bposition = (pos.xyz + hdim) / dim;"); } } if (frag.wposition) { node_shader_add_uniform(vert, "mat4 W", "_world_matrix"); node_shader_add_out(vert, "vec3 wposition"); - node_shader_write_attrib(vert, `wposition = vec4(mul(vec4(pos.xyz, 1.0), W)).xyz;`); + node_shader_write_attrib(vert, "wposition = vec4(mul(vec4(pos.xyz, 1.0), W)).xyz;"); } else if (vert.wposition) { node_shader_add_uniform(vert, "mat4 W", "_world_matrix"); - node_shader_write_attrib(vert, `vec3 wposition = vec4(mul(vec4(pos.xyz, 1.0), W)).xyz;`); + node_shader_write_attrib(vert, "vec3 wposition = vec4(mul(vec4(pos.xyz, 1.0), W)).xyz;"); } if (frag.vposition) { node_shader_add_uniform(vert, "mat4 WV", "_world_view_matrix"); node_shader_add_out(vert, "vec3 vposition"); - node_shader_write_attrib(vert, `vposition = vec4(mul(vec4(pos.xyz, 1.0), WV)).xyz;`); + node_shader_write_attrib(vert, "vposition = vec4(mul(vec4(pos.xyz, 1.0), WV)).xyz;"); } if (frag.mposition) { node_shader_add_out(vert, "vec3 mposition"); if (frag.ndcpos) { - node_shader_write(vert, `mposition = (ndc.xyz / ndc.w);`); + node_shader_write(vert, "mposition = (ndc.xyz / ndc.w);"); } else { - node_shader_write_attrib(vert, `mposition = pos.xyz;`); + node_shader_write_attrib(vert, "mposition = pos.xyz;"); } } if (frag.wtangent) { // NodeShaderadd_elem(con, "tang", "short4norm"); // add_uniform(vert, "mat3 N", "_normal_matrix"); node_shader_add_out(vert, "vec3 wtangent"); - // write_attrib(vert, `wtangent = normalize(mul(tang.xyz, N));`); - node_shader_write_attrib(vert, `wtangent = vec3(0.0, 0.0, 0.0);`); + // write_attrib(vert, "wtangent = normalize(mul(tang.xyz, N));"); + node_shader_write_attrib(vert, "wtangent = vec3(0.0, 0.0, 0.0);"); } if (frag.vvec_cam) { node_shader_add_uniform(vert, "mat4 WV", "_world_view_matrix"); node_shader_add_out(vert, "vec3 eyeDirCam"); - node_shader_write_attrib(vert, `eyeDirCam = vec4(mul(vec4(pos.xyz, 1.0), WV)).xyz; eyeDirCam.z *= -1.0;`); - node_shader_write_attrib(frag, `vec3 vVecCam = normalize(eyeDirCam);`); + node_shader_write_attrib(vert, "eyeDirCam = vec4(mul(vec4(pos.xyz, 1.0), WV)).xyz; eyeDirCam.z *= -1.0;"); + node_shader_write_attrib(frag, "vec3 vVecCam = normalize(eyeDirCam);"); } if (frag.vvec) { node_shader_add_uniform(vert, "vec3 eye", "_camera_pos"); node_shader_add_out(vert, "vec3 eyeDir"); - node_shader_write_attrib(vert, `eyeDir = eye - wposition;`); - node_shader_write_attrib(frag, `vec3 vVec = normalize(eyeDir);`); + node_shader_write_attrib(vert, "eyeDir = eye - wposition;"); + node_shader_write_attrib(frag, "vec3 vVec = normalize(eyeDir);"); } if (frag.n) { node_shader_add_uniform(vert, "mat3 N", "_normal_matrix"); node_shader_add_out(vert, "vec3 wnormal"); - node_shader_write_attrib(vert, `wnormal = mul(vec3(nor.xy, pos.w), N);`); - node_shader_write_attrib(frag, `vec3 n = normalize(wnormal);`); + node_shader_write_attrib(vert, "wnormal = mul(vec3(nor.xy, pos.w), N);"); + node_shader_write_attrib(frag, "vec3 n = normalize(wnormal);"); } else if (vert.n) { node_shader_add_uniform(vert, "mat3 N", "_normal_matrix"); - node_shader_write_attrib(vert, `vec3 wnormal = normalize(mul(vec3(nor.xy, pos.w), N));`); + node_shader_write_attrib(vert, "vec3 wnormal = normalize(mul(vec3(nor.xy, pos.w), N));"); } if (frag.nattr) { node_shader_add_out(vert, "vec3 nAttr"); - node_shader_write_attrib(vert, `nAttr = vec3(nor.xy, pos.w);`); + node_shader_write_attrib(vert, "nAttr = vec3(nor.xy, pos.w);"); } if (frag.dotnv) { - node_shader_write_attrib(frag, `float dotNV = max(dot(n, vVec), 0.0);`); + node_shader_write_attrib(frag, "float dotNV = max(dot(n, vVec), 0.0);"); } if (frag.wvpposition) { node_shader_add_out(vert, "vec4 wvpposition"); - node_shader_write_end(vert, `wvpposition = gl_Position;`); + node_shader_write_end(vert, "wvpposition = gl_Position;"); } - if (node_shader_context_is_elem(con, `col`)) { - node_shader_add_out(vert, `vec3 vcolor`); - node_shader_write_attrib(vert, `vcolor = col.rgb;`); + if (node_shader_context_is_elem(con, "col")) { + node_shader_add_out(vert, "vec3 vcolor"); + node_shader_write_attrib(vert, "vcolor = col.rgb;"); } } @@ -456,10 +456,10 @@ function parser_material_parse_vector_input(inp: zui_node_socket_t): string { } function parser_material_parse_vector(node: zui_node_t, socket: zui_node_socket_t): string { - if (node.type == `GROUP`) { + if (node.type == "GROUP") { return parser_material_parse_group(node, socket); } - else if (node.type == `GROUP_INPUT`) { + else if (node.type == "GROUP_INPUT") { return parser_material_parse_group_input(node, socket); } else if (node.type == "ATTRIBUTE") { @@ -497,7 +497,7 @@ function parser_material_parse_vector(node: zui_node_t, socket: zui_node_socket_ let col2: string = parser_material_parse_vector_input(node.inputs[2]); let col3: string = parser_material_parse_vector_input(node.inputs[3]); let scale: string = parser_material_parse_value_input(node.inputs[4]); - let res: string = `tex_brick(${co} * ${scale}, ${col1}, ${col2}, ${col3})`; + let res: string = "tex_brick(" + co + " * " + scale + ", " + col1 + ", " + col2 + ", " + col3 + ")"; return res; } else if (node.type == "TEX_CHECKER") { @@ -506,7 +506,7 @@ function parser_material_parse_vector(node: zui_node_t, socket: zui_node_socket_ let col1: string = parser_material_parse_vector_input(node.inputs[1]); let col2: string = parser_material_parse_vector_input(node.inputs[2]); let scale: string = parser_material_parse_value_input(node.inputs[3]); - let res: string = `tex_checker(${co}, ${col1}, ${col2}, ${scale})`; + let res: string = "tex_checker(" + co + ", " + col1 + ", " + col2 + ", " + scale + ")"; return res; } else if (node.type == "TEX_GRADIENT") { @@ -515,40 +515,40 @@ function parser_material_parse_vector(node: zui_node_t, socket: zui_node_socket_ let grad: string = but.data[but.default_value].toUpperCase(); grad = string_replace_all(grad, " ", "_"); let f: string = parser_material_get_gradient(grad, co); - let res: string = parser_material_to_vec3(`clamp(${f}, 0.0, 1.0)`); + let res: string = parser_material_to_vec3("clamp(" + f + ", 0.0, 1.0)"); return res; } else if (node.type == "TEX_IMAGE") { // Already fetched if (array_index_of(parser_material_parsed, parser_material_res_var_name(node, node.outputs[1])) >= 0) { // TODO: node.outputs[0] let varname: string = parser_material_store_var_name(node); - return `${varname}.rgb`; + return varname + ".rgb"; } let tex_name: string = parser_material_node_name(node); let tex: bind_tex_t = parser_material_make_texture(node, tex_name); if (tex != null) { let color_space: i32 = node.buttons[1].default_value; let texstore: string = parser_material_texture_store(node, tex, tex_name, color_space); - return `${texstore}.rgb`; + return texstore + ".rgb"; } else { let tex_store: string = parser_material_store_var_name(node); // Pink color for missing texture - node_shader_write(parser_material_curshader, `vec4 ${tex_store} = vec4(1.0, 0.0, 1.0, 1.0);`); - return `${tex_store}.rgb`; + node_shader_write(parser_material_curshader, "vec4 " + tex_store + " = vec4(1.0, 0.0, 1.0, 1.0);"); + return tex_store + ".rgb"; } } else if (node.type == "TEX_MAGIC") { node_shader_add_function(parser_material_curshader, str_tex_magic); let co: string = parser_material_get_coord(node); let scale: string = parser_material_parse_value_input(node.inputs[1]); - let res: string = `tex_magic(${co} * ${scale} * 4.0)`; + let res: string = "tex_magic(" + co + " * " + scale + " * 4.0)"; return res; } else if (node.type == "TEX_NOISE") { node_shader_add_function(parser_material_curshader, str_tex_noise); let co: string = parser_material_get_coord(node); let scale: string = parser_material_parse_value_input(node.inputs[1]); - let res: string = `vec3(tex_noise(${co} * ${scale}), tex_noise(${co} * ${scale} + 0.33), tex_noise(${co} * ${scale} + 0.66))`; + let res: string = "vec3(tex_noise(" + co + " * " + scale + "), tex_noise(" + co + " * " + scale + " + 0.33), tex_noise(" + co + " * " + scale + " + 0.66))"; return res; } else if (node.type == "TEX_VORONOI") { @@ -561,10 +561,10 @@ function parser_material_parse_vector(node: zui_node_t, socket: zui_node_socket_ coloring = string_replace_all(coloring, " ", "_"); let res: string = ""; if (coloring == "INTENSITY") { - res = parser_material_to_vec3(`tex_voronoi(${co} * ${scale}, texturePass(snoise256)).a`); + res = parser_material_to_vec3("tex_voronoi(" + co + " * " + scale + ", texturePass(snoise256)).a"); } else { // Cells - res = `tex_voronoi(${co} * ${scale}, texturePass(snoise256)).rgb`; + res = "tex_voronoi(" + co + " * " + scale + ", texturePass(snoise256)).rgb"; } return res; } @@ -572,7 +572,7 @@ function parser_material_parse_vector(node: zui_node_t, socket: zui_node_socket_ node_shader_add_function(parser_material_curshader, str_tex_wave); let co: string = parser_material_get_coord(node); let scale: string = parser_material_parse_value_input(node.inputs[1]); - let res: string = parser_material_to_vec3(`tex_wave_f(${co} * ${scale})`); + let res: string = parser_material_to_vec3("tex_wave_f(" + co + " * " + scale + ")"); return res; } else if (node.type == "BRIGHTCONTRAST") { @@ -580,12 +580,12 @@ function parser_material_parse_vector(node: zui_node_t, socket: zui_node_socket_ let bright: string = parser_material_parse_value_input(node.inputs[1]); let contr: string = parser_material_parse_value_input(node.inputs[2]); node_shader_add_function(parser_material_curshader, str_brightcontrast); - return `brightcontrast(${out_col}, ${bright}, ${contr})`; + return "brightcontrast(" + out_col + ", " + bright + ", " + contr + ")"; } else if (node.type == "GAMMA") { let out_col: string = parser_material_parse_vector_input(node.inputs[0]); let gamma: string = parser_material_parse_value_input(node.inputs[1]); - return `pow(${out_col}, ` + parser_material_to_vec3(`${gamma}`) + ")"; + return "pow(" + out_col + ", " + parser_material_to_vec3(gamma) + ")"; } else if (node.type == "DIRECT_WARP") { if (parser_material_warp_passthrough) { @@ -596,10 +596,10 @@ function parser_material_parse_vector(node: zui_node_t, socket: zui_node_socket_ let tex_name: string = "texwarp_" + parser_material_node_name(node); node_shader_add_uniform(parser_material_curshader, "sampler2D " + tex_name, "_" + tex_name); let store: string = parser_material_store_var_name(node); - node_shader_write(parser_material_curshader, `float ${store}_rad = ${angle} * (${math_pi()} / 180);`); - node_shader_write(parser_material_curshader, `float ${store}_x = cos(${store}_rad);`); - node_shader_write(parser_material_curshader, `float ${store}_y = sin(${store}_rad);`); - return `texture(${tex_name}, texCoord + vec2(${store}_x, ${store}_y) * ${mask}).rgb;`; + node_shader_write(parser_material_curshader, "float " + store + "_rad = " + angle + " * (" + math_pi() + " / 180);"); + node_shader_write(parser_material_curshader, "float " + store + "_x = cos(" + store + "_rad);"); + node_shader_write(parser_material_curshader, "float " + store + "_y = sin(" + store + "_rad);"); + return "texture(" + tex_name + ", texCoord + vec2(" + store + "_x, " + store + "_y) * " + mask + ").rgb;"; } else if (node.type == "BLUR") { if (parser_material_blur_passthrough) { @@ -609,18 +609,18 @@ function parser_material_parse_vector(node: zui_node_t, socket: zui_node_socket_ if (strength == "0.0") { return "vec3(0.0, 0.0, 0.0)"; } - let steps: string = `int(${strength} * 10 + 1)`; + let steps: string = "int(" + strength + " * 10 + 1)"; let tex_name: string = "texblur_" + parser_material_node_name(node); node_shader_add_uniform(parser_material_curshader, "sampler2D " + tex_name, "_" + tex_name); let store: string = parser_material_store_var_name(node); - node_shader_write(parser_material_curshader, `vec3 ${store}_res = vec3(0.0, 0.0, 0.0);`); - node_shader_write(parser_material_curshader, `for (int i = -${steps}; i <= ${steps}; ++i) {`); - node_shader_write(parser_material_curshader, `for (int j = -${steps}; j <= ${steps}; ++j) {`); - node_shader_write(parser_material_curshader, `${store}_res += texture(${tex_name}, texCoord + vec2(i, j) / vec2(textureSize(${tex_name}, 0))).rgb;`); - node_shader_write(parser_material_curshader, `}`); - node_shader_write(parser_material_curshader, `}`); - node_shader_write(parser_material_curshader, `${store}_res /= (${steps} * 2 + 1) * (${steps} * 2 + 1);`); - return `${store}_res`; + node_shader_write(parser_material_curshader, "vec3 " + store + "_res = vec3(0.0, 0.0, 0.0);"); + node_shader_write(parser_material_curshader, "for (int i = -" + steps + "; i <= " + steps + "; ++i) {"); + node_shader_write(parser_material_curshader, "for (int j = -" + steps + "; j <= " + steps + "; ++j) {"); + node_shader_write(parser_material_curshader, store + "_res += texture(" + tex_name + ", texCoord + vec2(i, j) / vec2(textureSize(" + tex_name + ", 0))).rgb;"); + node_shader_write(parser_material_curshader, "}"); + node_shader_write(parser_material_curshader, "}"); + node_shader_write(parser_material_curshader, store + "_res /= (" + steps + " * 2 + 1) * (" + steps + " * 2 + 1);"); + return store + "_res"; } else if (node.type == "HUE_SAT") { node_shader_add_function(parser_material_curshader, str_hue_sat); @@ -629,17 +629,17 @@ function parser_material_parse_vector(node: zui_node_t, socket: zui_node_socket_ let val: string = parser_material_parse_value_input(node.inputs[2]); let fac: string = parser_material_parse_value_input(node.inputs[3]); let col: string = parser_material_parse_vector_input(node.inputs[4]); - return `hue_sat(${col}, vec4(${hue}-0.5, ${sat}, ${val}, 1.0-${fac}))`; + return "hue_sat(" + col + ", vec4(" + hue + "-0.5, " + sat + ", " + val + ", 1.0-" + fac + "))"; } else if (node.type == "INVERT") { let fac: string = parser_material_parse_value_input(node.inputs[0]); let out_col: string = parser_material_parse_vector_input(node.inputs[1]); - return `mix(${out_col}, vec3(1.0, 1.0, 1.0) - (${out_col}), ${fac})`; + return "mix(" + out_col + ", vec3(1.0, 1.0, 1.0) - (" + out_col + "), " + fac + ")"; } else if (node.type == "MIX_RGB") { let fac: string = parser_material_parse_value_input(node.inputs[0]); let fac_var: string = parser_material_node_name(node) + "_fac"; - node_shader_write(parser_material_curshader, `float ${fac_var} = ${fac};`); + node_shader_write(parser_material_curshader, "float " + fac_var + " = " + fac + ";"); let col1: string = parser_material_parse_vector_input(node.inputs[1]); let col2: string = parser_material_parse_vector_input(node.inputs[2]); let but: zui_node_button_t = node.buttons[0]; // blend_type @@ -648,71 +648,71 @@ function parser_material_parse_vector(node: zui_node_t, socket: zui_node_socket_ let use_clamp: bool = node.buttons[1].default_value == true; let out_col: string = ""; if (blend == "MIX") { - out_col = `mix(${col1}, ${col2}, ${fac_var})`; + out_col = "mix(" + col1 + ", " + col2 + ", " + fac_var + ")"; } else if (blend == "DARKEN") { - out_col = `min(${col1}, ${col2} * ${fac_var})`; + out_col = "min(" + col1 + ", " + col2 + " * " + fac_var + ")"; } else if (blend == "MULTIPLY") { - out_col = `mix(${col1}, ${col1} * ${col2}, ${fac_var})`; + out_col = "mix(" + col1 + ", " + col1 + " * " + col2 + ", " + fac_var + ")"; } else if (blend == "BURN") { - out_col = `mix(${col1}, vec3(1.0, 1.0, 1.0) - (vec3(1.0, 1.0, 1.0) - ${col1}) / ${col2}, ${fac_var})`; + out_col = "mix(" + col1 + ", vec3(1.0, 1.0, 1.0) - (vec3(1.0, 1.0, 1.0) - " + col1 + ") / " + col2 + ", " + fac_var + ")"; } else if (blend == "LIGHTEN") { - out_col = `max(${col1}, ${col2} * ${fac_var})`; + out_col = "max(" + col1 + ", " + col2 + " * " + fac_var + ")"; } else if (blend == "SCREEN") { - out_col = `(vec3(1.0, 1.0, 1.0) - (` + parser_material_to_vec3(`1.0 - ${fac_var}`) + ` + ${fac_var} * (vec3(1.0, 1.0, 1.0) - ${col2})) * (vec3(1.0, 1.0, 1.0) - ${col1}))`; + out_col = "(vec3(1.0, 1.0, 1.0) - (" + parser_material_to_vec3("1.0 - " + fac_var + "") + " + " + fac_var + " * (vec3(1.0, 1.0, 1.0) - " + col2 + ")) * (vec3(1.0, 1.0, 1.0) - " + col1 + "))"; } else if (blend == "DODGE") { - out_col = `mix(${col1}, ${col1} / (vec3(1.0, 1.0, 1.0) - ${col2}), ${fac_var})`; + out_col = "mix(" + col1 + ", " + col1 + " / (vec3(1.0, 1.0, 1.0) - " + col2 + "), " + fac_var + ")"; } else if (blend == "ADD") { - out_col = `mix(${col1}, ${col1} + ${col2}, ${fac_var})`; + out_col = "mix(" + col1 + ", " + col1 + " + " + col2 + ", " + fac_var + ")"; } else if (blend == "OVERLAY") { - out_col = `mix(${col1}, vec3( - ${col1}.r < 0.5 ? 2.0 * ${col1}.r * ${col2}.r : 1.0 - 2.0 * (1.0 - ${col1}.r) * (1.0 - ${col2}.r), - ${col1}.g < 0.5 ? 2.0 * ${col1}.g * ${col2}.g : 1.0 - 2.0 * (1.0 - ${col1}.g) * (1.0 - ${col2}.g), - ${col1}.b < 0.5 ? 2.0 * ${col1}.b * ${col2}.b : 1.0 - 2.0 * (1.0 - ${col1}.b) * (1.0 - ${col2}.b) - ), ${fac_var})`; + out_col = "mix(" + col1 + ", vec3( \ + " + col1 + ".r < 0.5 ? 2.0 * " + col1 + ".r * " + col2 + ".r : 1.0 - 2.0 * (1.0 - " + col1 + ".r) * (1.0 - " + col2 + ".r), \ + " + col1 + ".g < 0.5 ? 2.0 * " + col1 + ".g * " + col2 + ".g : 1.0 - 2.0 * (1.0 - " + col1 + ".g) * (1.0 - " + col2 + ".g), \ + " + col1 + ".b < 0.5 ? 2.0 * " + col1 + ".b * " + col2 + ".b : 1.0 - 2.0 * (1.0 - " + col1 + ".b) * (1.0 - " + col2 + ".b) \ + ), " + fac_var + ")"; } else if (blend == "SOFT_LIGHT") { - out_col = `((1.0 - ${fac_var}) * ${col1} + ${fac_var} * ((vec3(1.0, 1.0, 1.0) - ${col1}) * ${col2} * ${col1} + ${col1} * (vec3(1.0, 1.0, 1.0) - (vec3(1.0, 1.0, 1.0) - ${col2}) * (vec3(1.0, 1.0, 1.0) - ${col1}))))`; + out_col = "((1.0 - " + fac_var + ") * " + col1 + " + " + fac_var + " * ((vec3(1.0, 1.0, 1.0) - " + col1 + ") * " + col2 + " * " + col1 + " + " + col1 + " * (vec3(1.0, 1.0, 1.0) - (vec3(1.0, 1.0, 1.0) - " + col2 + ") * (vec3(1.0, 1.0, 1.0) - " + col1 + "))))"; } else if (blend == "LINEAR_LIGHT") { - out_col = `(${col1} + ${fac_var} * (vec3(2.0, 2.0, 2.0) * (${col2} - vec3(0.5, 0.5, 0.5))))`; + out_col = "(" + col1 + " + " + fac_var + " * (vec3(2.0, 2.0, 2.0) * (" + col2 + " - vec3(0.5, 0.5, 0.5))))"; } else if (blend == "DIFFERENCE") { - out_col = `mix(${col1}, abs(${col1} - ${col2}), ${fac_var})`; + out_col = "mix(" + col1 + ", abs(" + col1 + " - " + col2 + "), " + fac_var + ")"; } else if (blend == "SUBTRACT") { - out_col = `mix(${col1}, ${col1} - ${col2}, ${fac_var})`; + out_col = "mix(" + col1 + ", " + col1 + " - " + col2 + ", " + fac_var + ")"; } else if (blend == "DIVIDE") { let eps: f32 = 0.000001; - col2 = `max(${col2}, vec3(${eps}, ${eps}, ${eps}))`; - out_col = "(" + parser_material_to_vec3(`(1.0 - ${fac_var}) * ${col1} + ${fac_var} * ${col1} / ${col2}`) + ")"; + col2 = "max(" + col2 + ", vec3(" + eps + ", " + eps + ", " + eps + "))"; + out_col = "(" + parser_material_to_vec3("(1.0 - " + fac_var + ") * " + col1 + " + " + fac_var + " * " + col1 + " / " + col2) + ")"; } else if (blend == "HUE") { node_shader_add_function(parser_material_curshader, str_hue_sat); - out_col = `mix(${col1}, hsv_to_rgb(vec3(rgb_to_hsv(${col2}).r, rgb_to_hsv(${col1}).g, rgb_to_hsv(${col1}).b)), ${fac_var})`; + out_col = "mix(" + col1 + ", hsv_to_rgb(vec3(rgb_to_hsv(" + col2 + ").r, rgb_to_hsv(" + col1 + ").g, rgb_to_hsv(" + col1 + ").b)), " + fac_var + ")"; } else if (blend == "SATURATION") { node_shader_add_function(parser_material_curshader, str_hue_sat); - out_col = `mix(${col1}, hsv_to_rgb(vec3(rgb_to_hsv(${col1}).r, rgb_to_hsv(${col2}).g, rgb_to_hsv(${col1}).b)), ${fac_var})`; + out_col = "mix(" + col1 + ", hsv_to_rgb(vec3(rgb_to_hsv(" + col1 + ").r, rgb_to_hsv(" + col2 + ").g, rgb_to_hsv(" + col1 + ").b)), " + fac_var + ")"; } else if (blend == "COLOR") { node_shader_add_function(parser_material_curshader, str_hue_sat); - out_col = `mix(${col1}, hsv_to_rgb(vec3(rgb_to_hsv(${col2}).r, rgb_to_hsv(${col2}).g, rgb_to_hsv(${col1}).b)), ${fac_var})`; + out_col = "mix(" + col1 + ", hsv_to_rgb(vec3(rgb_to_hsv(" + col2 + ").r, rgb_to_hsv(" + col2 + ").g, rgb_to_hsv(" + col1 + ").b)), " + fac_var + ")"; } else if (blend == "VALUE") { node_shader_add_function(parser_material_curshader, str_hue_sat); - out_col = `mix(${col1}, hsv_to_rgb(vec3(rgb_to_hsv(${col1}).r, rgb_to_hsv(${col1}).g, rgb_to_hsv(${col2}).b)), ${fac_var})`; + out_col = "mix(" + col1 + ", hsv_to_rgb(vec3(rgb_to_hsv(" + col1 + ").r, rgb_to_hsv(" + col1 + ").g, rgb_to_hsv(" + col2 + ").b)), " + fac_var + ")"; } if (use_clamp) { - return `clamp(${out_col}, vec3(0.0, 0.0, 0.0), vec3(1.0, 1.0, 1.0))`; + return "clamp(" + out_col + ", vec3(0.0, 0.0, 0.0), vec3(1.0, 1.0, 1.0))"; } else { return out_col; @@ -721,7 +721,7 @@ function parser_material_parse_vector(node: zui_node_t, socket: zui_node_socket_ else if (node.type == "QUANTIZE") { let strength: string = parser_material_parse_value_input(node.inputs[0]); let col: string = parser_material_parse_vector_input(node.inputs[1]); - return `(floor(100.0 * ${strength} * ${col}) / (100.0 * ${strength}))`; + return "(floor(100.0 * " + strength + " * " + col + ") / (100.0 * " + strength + "))"; } else if (node.type == "VALTORGB") { // ColorRamp let fac: string = parser_material_parse_value_input(node.inputs[0]); @@ -732,33 +732,33 @@ function parser_material_parse_vector(node: zui_node_t, socket: zui_node_socket_ } // Write cols array let cols_var: string = parser_material_node_name(node) + "_cols"; - node_shader_write(parser_material_curshader, `vec3 ${cols_var}[${elems.length}];`); // TODO: Make const + node_shader_write(parser_material_curshader, "vec3 " + cols_var + "[" + elems.length + "];"); // TODO: Make const for (let i: i32 = 0; i < elems.length; ++i) { - node_shader_write(parser_material_curshader, `${cols_var}[${i}] = ${parser_material_vec3(elems[i])};`); + node_shader_write(parser_material_curshader, cols_var + "[" + i + "] = " + parser_material_vec3(elems[i]) + ";"); } // Get index let fac_var: string = parser_material_node_name(node) + "_fac"; - node_shader_write(parser_material_curshader, `float ${fac_var} = ${fac};`); + node_shader_write(parser_material_curshader, "float " + fac_var + " = " + fac + ";"); let index: string = "0"; for (let i: i32 = 1; i < elems.length; ++i) { - index += ` + (${fac_var} > ${elems[i][4]} ? 1 : 0)`; + index += " + (" + fac_var + " > " + elems[i][4] + " ? 1 : 0)"; } // Write index let index_var: string = parser_material_node_name(node) + "_i"; - node_shader_write(parser_material_curshader, `int ${index_var} = ${index};`); + node_shader_write(parser_material_curshader, "int " + index_var + " = " + index + ";"); if (interp == "CONSTANT") { - return `${cols_var}[${index_var}]`; + return "" + cols_var + "[" + index_var + "]"; } else { // Linear // Write facs array let facs_var: string = parser_material_node_name(node) + "_facs"; - node_shader_write(parser_material_curshader, `float ${facs_var}[${elems.length}];`); // TODO: Make const + node_shader_write(parser_material_curshader, "float " + facs_var + "[" + elems + "length}];"); // TODO: Make const for (let i: i32 = 0; i < elems.length; ++i) { - node_shader_write(parser_material_curshader, `${facs_var}[${i}] = ${elems[i][4]};`); + node_shader_write(parser_material_curshader, facs_var + "[" + i + "] = " + elems[i][4] + ";"); } // Mix color // float f = (pos - start) * (1.0 / (finish - start)) - return `mix(${cols_var}[${index_var}], ${cols_var}[${index_var} + 1], (${fac_var} - ${facs_var}[${index_var}]) * (1.0 / (${facs_var}[${index_var} + 1] - ${facs_var}[${index_var}]) ))`; + return "mix(" + cols_var + "[" + index_var + "], " + cols_var + "[" + index_var + " + 1], (" + fac_var + " - " + facs_var + "[" + index_var + "]) * (1.0 / (" + facs_var + "[" + index_var + " + 1] - " + facs_var + "[" + index_var + "]) ))"; } } else if (node.type == "CURVE_VEC") { @@ -770,7 +770,7 @@ function parser_material_parse_vector(node: zui_node_t, socket: zui_node_socket_ let vc1: string = parser_material_vector_curve(name + "1", vec + ".y", curves[1]); let vc2: string = parser_material_vector_curve(name + "2", vec + ".z", curves[2]); // mapping.curves[0].points[0].handle_type // bezier curve - return `(vec3(${vc0}, ${vc1}, ${vc2}) * ${fac})`; + return "(vec3(" + vc0 + ", " + vc1 + ", " + vc2 + ") * " + fac + ")"; } else if (node.type == "CURVE_RGB") { // RGB Curves let fac: string = parser_material_parse_value_input(node.inputs[0]); @@ -784,26 +784,26 @@ function parser_material_parse_vector(node: zui_node_t, socket: zui_node_socket_ let vc3a: string = parser_material_vector_curve(name + "3a", vec + ".x", curves[3]); let vc3b: string = parser_material_vector_curve(name + "3b", vec + ".y", curves[3]); let vc3c: string = parser_material_vector_curve(name + "3c", vec + ".z", curves[3]); - return `(sqrt(vec3(${vc0}, ${vc1}, ${vc2}) * vec3(${vc3a}, ${vc3b}, ${vc3c})) * ${fac})`; + return "(sqrt(vec3(" + vc0 + ", " + vc1 + ", " + vc2 + ") * vec3(" + vc3a + ", " + vc3b + ", " + vc3c + ")) * " + fac + ")"; } else if (node.type == "COMBHSV") { node_shader_add_function(parser_material_curshader, str_hue_sat); let h: string = parser_material_parse_value_input(node.inputs[0]); let s: string = parser_material_parse_value_input(node.inputs[1]); let v: string = parser_material_parse_value_input(node.inputs[2]); - return `hsv_to_rgb(vec3(${h}, ${s}, ${v}))`; + return "hsv_to_rgb(vec3(" + h + ", " + s + ", " + v + "))"; } else if (node.type == "COMBRGB") { let r: string = parser_material_parse_value_input(node.inputs[0]); let g: string = parser_material_parse_value_input(node.inputs[1]); let b: string = parser_material_parse_value_input(node.inputs[2]); - return `vec3(${r}, ${g}, ${b})`; + return "vec3(" + r + ", " + g + ", " + b + ")"; } else if (node.type == "WAVELENGTH") { node_shader_add_function(parser_material_curshader, str_wavelength_to_rgb); let wl: string = parser_material_parse_value_input(node.inputs[0]); node_shader_add_function(parser_material_curshader, str_wavelength_to_rgb); - return `wavelength_to_rgb((${wl} - 450.0) / 150.0)`; + return "wavelength_to_rgb((" + wl + " - 450.0) / 150.0)"; } else if (node.type == "CAMERA") { parser_material_curshader.vvec_cam = true; @@ -943,38 +943,38 @@ function parser_material_parse_vector(node: zui_node_t, socket: zui_node_socket_ let height: string = parser_material_parse_value_input(node.inputs[2]); let nor: string = parser_material_parse_vector_input(node.inputs[3]); let sample_bump_res: string = parser_material_store_var_name(node) + "_bump"; - node_shader_write(parser_material_curshader, `float ${sample_bump_res}_x = dFdx(float(${height})) * (${strength}) * 16.0;`); - node_shader_write(parser_material_curshader, `float ${sample_bump_res}_y = dFdy(float(${height})) * (${strength}) * 16.0;`); - return `(normalize(vec3(${sample_bump_res}_x, ${sample_bump_res}_y, 1.0) + ${nor}) * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5))`; + node_shader_write(parser_material_curshader, "float " + sample_bump_res + "_x = dFdx(float(" + height + ")) * (" + strength + ") * 16.0;"); + node_shader_write(parser_material_curshader, "float " + sample_bump_res + "_y = dFdy(float(" + height + ")) * (" + strength + ") * 16.0;"); + return "(normalize(vec3(" + sample_bump_res + "_x, " + sample_bump_res + "_y, 1.0) + " + nor + ") * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5))"; } else if (node.type == "MAPPING") { let out: string = parser_material_parse_vector_input(node.inputs[0]); let node_translation: string = parser_material_parse_vector_input(node.inputs[1]); let node_rotation: string = parser_material_parse_vector_input(node.inputs[2]); let node_scale: string = parser_material_parse_vector_input(node.inputs[3]); - if (node_scale != `vec3(1, 1, 1)`) { - out = `(${out} * ${node_scale})`; + if (node_scale != "vec3(1, 1, 1)") { + out = "(" + out + " * " + node_scale + ")"; } - if (node_rotation != `vec3(0, 0, 0)`) { + if (node_rotation != "vec3(0, 0, 0)") { // ZYX rotation, Z axis for now.. - let a: string = `${node_rotation}.z * (3.1415926535 / 180)`; + let a: string = node_rotation + ".z * (3.1415926535 / 180)"; // x * cos(theta) - y * sin(theta) // x * sin(theta) + y * cos(theta) - out = `vec3(${out}.x * cos(${a}) - ${out}.y * sin(${a}), ${out}.x * sin(${a}) + ${out}.y * cos(${a}), 0.0)`; + out = "vec3(" + out + ".x * cos(" + a + ") - " + out + ".y * sin(" + a + "), " + out + ".x * sin(" + a + ") + " + out + ".y * cos(" + a + "), 0.0)"; } // if node.rotation[1] != 0.0: // a = node.rotation[1] - // out = `vec3({0}.x * {1} - {0}.z * {2}, {0}.x * {2} + {0}.z * {1}, 0.0)`.format(out, math_cos(a), math_sin(a)) + // out = "vec3({0}.x * {1} - {0}.z * {2}, {0}.x * {2} + {0}.z * {1}, 0.0)".format(out, math_cos(a), math_sin(a)) // if node.rotation[0] != 0.0: // a = node.rotation[0] - // out = `vec3({0}.y * {1} - {0}.z * {2}, {0}.y * {2} + {0}.z * {1}, 0.0)`.format(out, math_cos(a), math_sin(a)) - if (node_translation != `vec3(0, 0, 0)`) { - out = `(${out} + ${node_translation})`; + // out = "vec3({0}.y * {1} - {0}.z * {2}, {0}.y * {2} + {0}.z * {1}, 0.0)".format(out, math_cos(a), math_sin(a)) + if (node_translation != "vec3(0, 0, 0)") { + out = "(" + out + " + " + node_translation + ")"; } // if node.use_min: - // out = `max({0}, vec3({1}, {2}, {3}))`.format(out, node.min[0], node.min[1]) + // out = "max({0}, vec3({1}, {2}, {3}))".format(out, node.min[0], node.min[1]) // if node.use_max: - // out = `min({0}, vec3({1}, {2}, {3}))`.format(out, node.max[0], node.max[1]) + // out = "min({0}, vec3({1}, {2}, {3}))".format(out, node.max[0], node.max[1]) return out; } else if (node.type == "NORMAL") { @@ -984,7 +984,7 @@ function parser_material_parse_vector(node: zui_node_t, socket: zui_node_socket_ else if (socket == node.outputs[1]) { let nor: string = parser_material_parse_vector_input(node.inputs[0]); let norout: string = parser_material_vec3(node.outputs[0].default_value); - return parser_material_to_vec3(`dot(${norout}, ${nor})`); + return parser_material_to_vec3("dot(" + norout + ", " + nor + ")"); } } else if (node.type == "NORMAL_MAP") { @@ -992,11 +992,11 @@ function parser_material_parse_vector(node: zui_node_t, socket: zui_node_socket_ let norm: string = parser_material_parse_vector_input(node.inputs[1]); let store: string = parser_material_store_var_name(node); - node_shader_write(parser_material_curshader, `vec3 ${store}_texn = ${norm} * 2.0 - 1.0;`); - node_shader_write(parser_material_curshader, `${store}_texn.xy = ${strength} * ${store}_texn.xy;`); - node_shader_write(parser_material_curshader, `${store}_texn = normalize(${store}_texn);`); + node_shader_write(parser_material_curshader, "vec3 " + store + "_texn = " + norm + " * 2.0 - 1.0;"); + node_shader_write(parser_material_curshader, "" + store + "_texn.xy = " + strength + " * " + store + "_texn.xy;"); + node_shader_write(parser_material_curshader, "" + store + "_texn = normalize(" + store + "_texn);"); - return `(0.5 * ${store}_texn + 0.5)`; + return "(0.5 * " + store + "_texn + 0.5)"; } else if (node.type == "MIX_NORMAL_MAP") { let nm1: string = parser_material_parse_vector_input(node.inputs[0]); @@ -1006,22 +1006,22 @@ function parser_material_parse_vector(node: zui_node_t, socket: zui_node_socket_ blend = string_replace_all(blend, " ", "_"); let store: string = parser_material_store_var_name(node); - // The blending algorithms are based on the paper `Blending in Detail` by Colin Barré-Brisebois and Stephen Hill 2012 + // The blending algorithms are based on the paper "Blending in Detail" by Colin Barré-Brisebois and Stephen Hill 2012 // https://blog.selfshadow.com/publications/blending-in-detail/ if (blend == "PARTIAL_DERIVATIVE") { //partial derivate blending - node_shader_write(parser_material_curshader, `vec3 ${store}_n1 = ${nm1} * 2.0 - 1.0;`); - node_shader_write(parser_material_curshader, `vec3 ${store}_n2 = ${nm2} * 2.0 - 1.0;`); - return `0.5 * normalize(vec3(${store}_n1.xy * ${store}_n2.z + ${store}_n2.xy * ${store}_n1.z, ${store}_n1.z * ${store}_n2.z)) + 0.5;`; + node_shader_write(parser_material_curshader, "vec3 " + store + "_n1 = " + nm1 + " * 2.0 - 1.0;"); + node_shader_write(parser_material_curshader, "vec3 " + store + "_n2 = " + nm2 + " * 2.0 - 1.0;"); + return "0.5 * normalize(vec3(" + store + "_n1.xy * " + store + "_n2.z + " + store + "_n2.xy * " + store + "_n1.z, " + store + "_n1.z * " + store + "_n2.z)) + 0.5;"; } else if (blend == "WHITEOUT") { //whiteout blending - node_shader_write(parser_material_curshader, `vec3 ${store}_n1 = ${nm1} * 2.0 - 1.0;`); - node_shader_write(parser_material_curshader, `vec3 ${store}_n2 = ${nm2} * 2.0 - 1.0;`); - return `0.5 * normalize(vec3(${store}_n1.xy + ${store}_n2.xy, ${store}_n1.z * ${store}_n2.z)) + 0.5;`; + node_shader_write(parser_material_curshader, "vec3 " + store + "_n1 = " + nm1 + " * 2.0 - 1.0;"); + node_shader_write(parser_material_curshader, "vec3 " + store + "_n2 = " + nm2 + " * 2.0 - 1.0;"); + return "0.5 * normalize(vec3(" + store + "_n1.xy + " + store + "_n2.xy, " + store + "_n1.z * " + store + "_n2.z)) + 0.5;"; } else if (blend == "REORIENTED") { //reoriented normal mapping - node_shader_write(parser_material_curshader, `vec3 ${store}_n1 = ${nm1} * 2.0 - vec3(1.0, 1.0, 0.0);`); - node_shader_write(parser_material_curshader, `vec3 ${store}_n2 = ${nm2} * vec3(-2.0, -2.0, 2.0) - vec3(-1.0, -1.0, 1.0);`); - return `0.5 * normalize(${store}_n1 * dot(${store}_n1, ${store}_n2) - ${store}_n2 * ${store}_n1.z) + 0.5`; + node_shader_write(parser_material_curshader, "vec3 " + store + "_n1 = " + nm1 + " * 2.0 - vec3(1.0, 1.0, 0.0);"); + node_shader_write(parser_material_curshader, "vec3 " + store + "_n2 = " + nm2 + " * vec3(-2.0, -2.0, 2.0) - vec3(-1.0, -1.0, 1.0);"); + return "0.5 * normalize(" + store + "_n1 * dot(" + store + "_n1, " + store + "_n2) - " + store + "_n2 * " + store + "_n1.z) + 0.5"; } } else if (node.type == "VECT_TRANSFORM") { @@ -1035,7 +1035,7 @@ function parser_material_parse_vector(node: zui_node_t, socket: zui_node_socket_ let x: string = parser_material_parse_value_input(node.inputs[0]); let y: string = parser_material_parse_value_input(node.inputs[1]); let z: string = parser_material_parse_value_input(node.inputs[2]); - return `vec3(${x}, ${y}, ${z})`; + return "vec3(" + x + ", " + y + ", " + z + ")"; } else if (node.type == "VECT_MATH") { let vec1: string = parser_material_parse_vector_input(node.inputs[0]); @@ -1044,81 +1044,81 @@ function parser_material_parse_vector(node: zui_node_t, socket: zui_node_socket_ let op: string = but.data[but.default_value].toUpperCase(); op = string_replace_all(op, " ", "_"); if (op == "ADD") { - return `(${vec1} + ${vec2})`; + return "(" + vec1 + " + " + vec2 + ")"; } else if (op == "SUBTRACT") { - return `(${vec1} - ${vec2})`; + return "(" + vec1 + " - " + vec2 + ")"; } else if (op == "AVERAGE") { - return `((${vec1} + ${vec2}) / 2.0)`; + return "((" + vec1 + " + " + vec2 + ") / 2.0)"; } else if (op == "DOT_PRODUCT") { - return parser_material_to_vec3(`dot(${vec1}, ${vec2})`); + return parser_material_to_vec3("dot(" + vec1 + ", " + vec2 + ")"); } else if (op == "LENGTH") { - return parser_material_to_vec3(`length(${vec1})`); + return parser_material_to_vec3("length(" + vec1 + ")"); } else if (op == "DISTANCE") { - return parser_material_to_vec3(`distance(${vec1}, ${vec2})`); + return parser_material_to_vec3("distance(" + vec1 + ", " + vec2 + ")"); } else if (op == "CROSS_PRODUCT") { - return `cross(${vec1}, ${vec2})`; + return "cross(" + vec1 + ", " + vec2 + ")"; } else if (op == "NORMALIZE") { - return `normalize(${vec1})`; + return "normalize(" + vec1 + ")"; } else if (op == "MULTIPLY") { - return `(${vec1} * ${vec2})`; + return "(" + vec1 + " * " + vec2 + ")"; } else if (op == "DIVIDE") { - return `vec3(${vec1}.x / (${vec2}.x == 0 ? 0.000001 : ${vec2}.x), ${vec1}.y / (${vec2}.y == 0 ? 0.000001 : ${vec2}.y), ${vec1}.z / (${vec2}.z == 0 ? 0.000001 : ${vec2}.z))`; + return "vec3(" + vec1 + ".x / (" + vec2 + ".x == 0 ? 0.000001 : " + vec2 + ".x), " + vec1 + ".y / (" + vec2 + ".y == 0 ? 0.000001 : " + vec2 + ".y), " + vec1 + ".z / (" + vec2 + ".z == 0 ? 0.000001 : " + vec2 + ".z))"; } else if (op == "PROJECT") { - return `(dot(${vec1}, ${vec2}) / dot(${vec2}, ${vec2}) * ${vec2})`; + return "(dot(" + vec1 + ", " + vec2 + ") / dot(" + vec2 + ", " + vec2 + ") * " + vec2 + ")"; } else if (op == "REFLECT") { - return `reflect(${vec1}, normalize(${vec2}))`; + return "reflect(" + vec1 + ", normalize(" + vec2 + "))"; } else if (op == "SCALE") { - return `(${vec2}.x * ${vec1})`; + return "(" + vec2 + ".x * " + vec1 + ")"; } else if (op == "ABSOLUTE") { - return `abs(${vec1})`; + return "abs(" + vec1 + ")"; } else if (op == "MINIMUM") { - return `min(${vec1}, ${vec2})`; + return "min(" + vec1 + ", " + vec2 + ")"; } else if (op == "MAXIMUM") { - return `max(${vec1}, ${vec2})`; + return "max(" + vec1 + ", " + vec2 + ")"; } else if (op == "FLOOR") { - return `floor(${vec1})`; + return "floor(" + vec1 + ")"; } else if (op == "CEIL") { - return `ceil(${vec1})`; + return "ceil(" + vec1 + ")"; } else if (op == "FRACTION") { - return `fract(${vec1})`; + return "fract(" + vec1 + ")"; } else if (op == "MODULO") { - return `mod(${vec1}, ${vec2})`; + return "mod(" + vec1 + ", " + vec2 + ")"; } else if(op == "SNAP") { - return `(floor(${vec1} / ${vec2}) * ${vec2})`; + return "(floor(" + vec1 + " / " + vec2 + ") * " + vec2 + ")"; } else if (op == "SINE") { - return `sin(${vec1})`; + return "sin(" + vec1 + ")"; } else if (op == "COSINE") { - return `cos(${vec1})`; + return "cos(" + vec1 + ")"; } else if (op == "TANGENT") { - return `tan(${vec1})`; + return "tan(" + vec1 + ")"; } } else if (node.type == "Displacement") { let height: string = parser_material_parse_value_input(node.inputs[0]); - return parser_material_to_vec3(`${height}`); + return parser_material_to_vec3(height); } else if (map_get(parser_material_custom_nodes, node.type) != null) { return map_get(parser_material_custom_nodes, node.type)(node, socket); @@ -1130,20 +1130,20 @@ function parse_normal_map_color_input(inp: zui_node_socket_t) { parser_material_frag.write_normal++; parser_material_out_normaltan = parser_material_parse_vector_input(inp); if (!parser_material_arm_export_tangents) { - node_shader_write(parser_material_frag, `vec3 texn = (${parser_material_out_normaltan}) * 2.0 - 1.0;`); - node_shader_write(parser_material_frag, `texn.y = -texn.y;`); + node_shader_write(parser_material_frag, "vec3 texn = (" + parser_material_out_normaltan + ") * 2.0 - 1.0;"); + node_shader_write(parser_material_frag, "texn.y = -texn.y;"); if (!parser_material_cotangent_frame_written) { parser_material_cotangent_frame_written = true; node_shader_add_function(parser_material_frag, str_cotangent_frame); } parser_material_frag.n = true; ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(parser_material_frag, `mat3 TBN = cotangentFrame(n, vVec, texCoord);`); + node_shader_write(parser_material_frag, "mat3 TBN = cotangentFrame(n, vVec, texCoord);"); ///else - node_shader_write(parser_material_frag, `mat3 TBN = cotangentFrame(n, -vVec, texCoord);`); + node_shader_write(parser_material_frag, "mat3 TBN = cotangentFrame(n, -vVec, texCoord);"); ///end - node_shader_write(parser_material_frag, `n = mul(normalize(texn), TBN);`); + node_shader_write(parser_material_frag, "n = mul(normalize(texn), TBN);"); } parser_material_frag.write_normal--; } @@ -1160,10 +1160,10 @@ function parser_material_parse_value_input(inp: zui_node_socket_t, vector_as_gra let st: string = from_node.outputs[l.from_socket].type; if (st == "RGB" || st == "RGBA" || st == "VECTOR") { if (vector_as_grayscale) { - return `dot(${res_var}.rbg, vec3(0.299, 0.587, 0.114))`; + return "dot(" + res_var + ".rbg, vec3(0.299, 0.587, 0.114))"; } else { - return `${res_var}.x`; + return res_var + ".x"; } } else { // VALUE @@ -1176,10 +1176,10 @@ function parser_material_parse_value_input(inp: zui_node_socket_t, vector_as_gra } function parser_material_parse_value(node: zui_node_t, socket: zui_node_socket_t): string { - if (node.type == `GROUP`) { + if (node.type == "GROUP") { return parser_material_parse_group(node, socket); } - else if (node.type == `GROUP_INPUT`) { + else if (node.type == "GROUP_INPUT") { return parser_material_parse_group_input(node, socket); } else if (node.type == "ATTRIBUTE") { @@ -1190,7 +1190,7 @@ function parser_material_parse_value(node: zui_node_t, socket: zui_node_socket_t return "1.0"; } else if (node.type == "WIREFRAME") { - node_shader_add_uniform(parser_material_curshader, `sampler2D texuvmap`, `_texuvmap`); + node_shader_add_uniform(parser_material_curshader, "sampler2D texuvmap", "_texuvmap"); // let use_pixel_size: bool = node.buttons[0].default_value == "true"; // let pixel_size: f32 = parse_value_input(node.inputs[0]); return "textureLod(texuvmap, texCoord, 0.0).r"; @@ -1297,7 +1297,7 @@ function parser_material_parse_value(node: zui_node_t, socket: zui_node_socket_t else if (node.type == "FRESNEL") { let ior: string = parser_material_parse_value_input(node.inputs[0]); parser_material_curshader.dotnv = true; - return `pow(1.0 - dotNV, 7.25 / ${ior})`; + return "pow(1.0 - dotNV, 7.25 / " + ior + ")"; } else if (node.type == "NEW_GEOMETRY") { if (socket == node.outputs[6]) { // Backfacing @@ -1313,11 +1313,11 @@ function parser_material_parse_value(node: zui_node_t, socket: zui_node_socket_t let offset: f32 = 0.0; let store: string = parser_material_store_var_name(node); parser_material_curshader.n = true; - node_shader_write(parser_material_curshader, `vec3 ${store}_dx = dFdx(n);`); - node_shader_write(parser_material_curshader, `vec3 ${store}_dy = dFdy(n);`); - node_shader_write(parser_material_curshader, `float ${store}_curvature = max(dot(${store}_dx, ${store}_dx), dot(${store}_dy, ${store}_dy));`); - node_shader_write(parser_material_curshader, `${store}_curvature = clamp(pow(${store}_curvature, (1.0 / ` + radius + `) * 0.25) * ` + strength + ` * 2.0 + ` + offset + ` / 10.0, 0.0, 1.0);`); - return `${store}_curvature`; + node_shader_write(parser_material_curshader, "vec3 " + store + "_dx = dFdx(n);"); + node_shader_write(parser_material_curshader, "vec3 " + store + "_dy = dFdy(n);"); + node_shader_write(parser_material_curshader, "float " + store + "_curvature = max(dot(" + store + "_dx, " + store + "_dx), dot(" + store + "_dy, " + store + "_dy));"); + node_shader_write(parser_material_curshader, store + "_curvature = clamp(pow(" + store + "_curvature, (1.0 / " + radius + ") * 0.25) * " + strength + " * 2.0 + " + offset + " / 10.0, 0.0, 1.0);"); + return store + "_curvature"; } else if (socket == node.outputs[8]) { // Random Per Island return "0.0"; @@ -1330,11 +1330,11 @@ function parser_material_parse_value(node: zui_node_t, socket: zui_node_socket_t let blend: string = parser_material_parse_value_input(node.inputs[0]); if (socket == node.outputs[0]) { // Fresnel parser_material_curshader.dotnv = true; - return `clamp(pow(1.0 - dotNV, (1.0 - ${blend}) * 10.0), 0.0, 1.0)`; + return "clamp(pow(1.0 - dotNV, (1.0 - " + blend + ") * 10.0), 0.0, 1.0)"; } else if (socket == node.outputs[1]) { // Facing parser_material_curshader.dotnv = true; - return `((1.0 - dotNV) * ${blend})`; + return "((1.0 - dotNV) * " + blend + ")"; } } else if (node.type == "OBJECT_INFO") { @@ -1358,14 +1358,14 @@ function parser_material_parse_value(node: zui_node_t, socket: zui_node_socket_t node_shader_add_function(parser_material_curshader, str_tex_brick); let co: string = parser_material_get_coord(node); let scale: string = parser_material_parse_value_input(node.inputs[4]); - let res: string = `tex_brick_f(${co} * ${scale})`; + let res: string = "tex_brick_f(" + co + " * " + scale + ")"; return res; } else if (node.type == "TEX_CHECKER") { node_shader_add_function(parser_material_curshader, str_tex_checker); let co: string = parser_material_get_coord(node); let scale: string = parser_material_parse_value_input(node.inputs[3]); - let res: string = `tex_checker_f(${co}, ${scale})`; + let res: string = "tex_checker_f(" + co + ", " + scale + ")"; return res; } else if (node.type == "TEX_GRADIENT") { @@ -1374,42 +1374,42 @@ function parser_material_parse_value(node: zui_node_t, socket: zui_node_socket_t let grad: string = but.data[but.default_value].toUpperCase(); grad = string_replace_all(grad, " ", "_"); let f: string = parser_material_get_gradient(grad, co); - let res: string = `(clamp(${f}, 0.0, 1.0))`; + let res: string = "(clamp(" + f + ", 0.0, 1.0))"; return res; } else if (node.type == "TEX_IMAGE") { // Already fetched if (array_index_of(parser_material_parsed, parser_material_res_var_name(node, node.outputs[0])) >= 0) { // TODO: node.outputs[1] let varname: string = parser_material_store_var_name(node); - return `${varname}.a`; + return varname + ".a"; } let tex_name: string = parser_material_node_name(node); let tex: bind_tex_t = parser_material_make_texture(node, tex_name); if (tex != null) { let color_space: i32 = node.buttons[1].default_value; let texstore: string = parser_material_texture_store(node, tex, tex_name, color_space); - return `${texstore}.a`; + return texstore + ".a"; } } else if (node.type == "TEX_MAGIC") { node_shader_add_function(parser_material_curshader, str_tex_magic); let co: string = parser_material_get_coord(node); let scale: string = parser_material_parse_value_input(node.inputs[1]); - let res: string = `tex_magic_f(${co} * ${scale} * 4.0)`; + let res: string = "tex_magic_f(" + co + " * " + scale + " * 4.0)"; return res; } else if (node.type == "TEX_MUSGRAVE") { node_shader_add_function(parser_material_curshader, str_tex_musgrave); let co: string = parser_material_get_coord(node); let scale: string = parser_material_parse_value_input(node.inputs[1]); - let res: string = `tex_musgrave_f(${co} * ${scale} * 0.5)`; + let res: string = "tex_musgrave_f(" + co + " * " + scale + " * 0.5)"; return res; } else if (node.type == "TEX_NOISE") { node_shader_add_function(parser_material_curshader, str_tex_noise); let co: string = parser_material_get_coord(node); let scale: string = parser_material_parse_value_input(node.inputs[1]); - let res: string = `tex_noise(${co} * ${scale})`; + let res: string = "tex_noise(" + co + " * " + scale + ")"; return res; } else if (node.type == "TEX_VORONOI") { @@ -1422,10 +1422,10 @@ function parser_material_parse_value(node: zui_node_t, socket: zui_node_socket_t coloring = string_replace_all(coloring, " ", "_"); let res: string = ""; if (coloring == "INTENSITY") { - res = `tex_voronoi(${co} * ${scale}, texturePass(snoise256)).a`; + res = "tex_voronoi(" + co + " * " + scale + ", texturePass(snoise256)).a"; } else { // Cells - res = `tex_voronoi(${co} * ${scale}, texturePass(snoise256)).r`; + res = "tex_voronoi(" + co + " * " + scale + ", texturePass(snoise256)).r"; } return res; } @@ -1433,7 +1433,7 @@ function parser_material_parse_value(node: zui_node_t, socket: zui_node_socket_t node_shader_add_function(parser_material_curshader, str_tex_wave); let co: string = parser_material_get_coord(node); let scale: string = parser_material_parse_value_input(node.inputs[1]); - let res: string = `tex_wave_f(${co} * ${scale})`; + let res: string = "tex_wave_f(" + co + " * " + scale + ")"; return res; } else if (node.type == "BAKE_CURVATURE") { @@ -1446,20 +1446,20 @@ function parser_material_parse_value(node: zui_node_t, socket: zui_node_socket_t let tex_name: string = "texbake_" + parser_material_node_name(node); node_shader_add_uniform(parser_material_curshader, "sampler2D " + tex_name, "_" + tex_name); let store: string = parser_material_store_var_name(node); - node_shader_write(parser_material_curshader, `float ${store}_res = texture(${tex_name}, texCoord).r;`); - return `${store}_res`; + node_shader_write(parser_material_curshader, "float " + store + "_res = texture(" + tex_name + ", texCoord).r;"); + return store + "_res"; } else if (node.type == "NORMAL") { let nor: string = parser_material_parse_vector_input(node.inputs[0]); let norout: string = parser_material_vec3(node.outputs[0].default_value); - return `dot(${norout}, ${nor})`; + return "dot(" + norout + ", " + nor + ")"; } else if (node.type == "COLMASK") { let inputColor: string = parser_material_parse_vector_input(node.inputs[0]); let maskColor: string = parser_material_parse_vector_input(node.inputs[1]); let radius: string = parser_material_parse_value_input(node.inputs[2]); let fuzziness: string = parser_material_parse_value_input(node.inputs[3]); - return `clamp(1.0 - (distance(${inputColor}, ${maskColor}) - ${radius}) / max(${fuzziness}, ${parser_material_eps}), 0.0, 1.0)`; + return "clamp(1.0 - (distance(" + inputColor + ", " + maskColor + ") - " + radius + ") / max(" + fuzziness + ", " + parser_material_eps + "), 0.0, 1.0)"; } else if (node.type == "MATH") { let val1: string = parser_material_parse_value_input(node.inputs[0]); @@ -1470,113 +1470,113 @@ function parser_material_parse_value(node: zui_node_t, socket: zui_node_socket_t let use_clamp: bool = node.buttons[1].default_value == true; let out_val: string = ""; if (op == "ADD") { - out_val = `(${val1} + ${val2})`; + out_val = "(" + val1 + " + " + val2 + ")"; } else if (op == "SUBTRACT") { - out_val = `(${val1} - ${val2})`; + out_val = "(" + val1 + " - " + val2 + ")"; } else if (op == "MULTIPLY") { - out_val = `(${val1} * ${val2})`; + out_val = "(" + val1 + " * " + val2 + ")"; } else if (op == "DIVIDE") { - val2 = `(${val2} == 0.0 ? ${parser_material_eps} : ${val2})`; - out_val = `(${val1} / ${val2})`; + val2 = "(" + val2 + " == 0.0 ? " + parser_material_eps + " : " + val2 + ")"; + out_val = "(" + val1 + " / " + val2 + ")"; } else if (op == "POWER") { - out_val = `pow(${val1}, ${val2})`; + out_val = "pow(" + val1 + ", " + val2 + ")"; } else if (op == "LOGARITHM") { - out_val = `log(${val1})`; + out_val = "log(" + val1 + ")"; } else if (op == "SQUARE_ROOT") { - out_val = `sqrt(${val1})`; + out_val = "sqrt(" + val1 + ")"; } else if(op == "INVERSE_SQUARE_ROOT") { - out_val = `inversesqrt(${val1})`; + out_val = "inversesqrt(" + val1 + ")"; } else if (op == "EXPONENT") { - out_val = `exp(${val1})`; + out_val = "exp(" + val1 + ")"; } else if (op == "ABSOLUTE") { - out_val = `abs(${val1})`; + out_val = "abs(" + val1 + ")"; } else if (op == "MINIMUM") { - out_val = `min(${val1}, ${val2})`; + out_val = "min(" + val1 + ", " + val2 + ")"; } else if (op == "MAXIMUM") { - out_val = `max(${val1}, ${val2})`; + out_val = "max(" + val1 + ", " + val2 + ")"; } else if (op == "LESS_THAN") { - out_val = `float(${val1} < ${val2})`; + out_val = "float(" + val1 + " < " + val2 + ")"; } else if (op == "GREATER_THAN") { - out_val = `float(${val1} > ${val2})`; + out_val = "float(" + val1 + " > " + val2 + ")"; } else if (op == "SIGN") { - out_val = `sign(${val1})`; + out_val = "sign(" + val1 + ")"; } else if (op == "ROUND") { - out_val = `floor(${val1} + 0.5)`; + out_val = "floor(" + val1 + " + 0.5)"; } else if (op == "FLOOR") { - out_val = `floor(${val1})`; + out_val = "floor(" + val1 + ")"; } else if (op == "CEIL") { - out_val = `ceil(${val1})`; + out_val = "ceil(" + val1 + ")"; } else if(op == "SNAP") { - out_val = `(floor(${val1} / ${val2}) * ${val2})`; + out_val = "(floor(" + val1 + " / " + val2 + ") * " + val2 + ")"; } else if (op == "TRUNCATE") { - out_val = `trunc(${val1})`; + out_val = "trunc(" + val1 + ")"; } else if (op == "FRACTION") { - out_val = `fract(${val1})`; + out_val = "fract(" + val1 + ")"; } else if (op == "MODULO") { - out_val = `mod(${val1}, ${val2})`; + out_val = "mod(" + val1 + ", " + val2 + ")"; } else if (op == "PING-PONG") { - out_val = `((${val2} != 0.0) ? abs(fract((${val1} - ${val2}) / (${val2} * 2.0)) * ${val2} * 2.0 - ${val2}) : 0.0)`; + out_val = "((" + val2 + " != 0.0) ? abs(fract((" + val1 + " - " + val2 + ") / (" + val2 + " * 2.0)) * " + val2 + " * 2.0 - " + val2 + ") : 0.0)"; } else if (op == "SINE") { - out_val = `sin(${val1})`; + out_val = "sin(" + val1 + ")"; } else if (op == "COSINE") { - out_val = `cos(${val1})`; + out_val = "cos(" + val1 + ")"; } else if (op == "TANGENT") { - out_val = `tan(${val1})`; + out_val = "tan(" + val1 + ")"; } else if (op == "ARCSINE") { - out_val = `asin(${val1})`; + out_val = "asin(" + val1 + ")"; } else if (op == "ARCCOSINE") { - out_val = `acos(${val1})`; + out_val = "acos(" + val1 + ")"; } else if (op == "ARCTANGENT") { - out_val = `atan(${val1})`; + out_val = "atan(" + val1 + ")"; } else if (op == "ARCTAN2") { - out_val = `atan2(${val1}, ${val2})`; + out_val = "atan2(" + val1 + ", " + val2 + ")"; } else if (op == "HYPERBOLIC_SINE") { - out_val = `sinh(${val1})`; + out_val = "sinh(" + val1 + ")"; } else if (op == "HYPERBOLIC_COSINE") { - out_val = `cosh(${val1})`; + out_val = "cosh(" + val1 + ")"; } else if (op == "HYPERBOLIC_TANGENT") { - out_val = `tanh(${val1})`; + out_val = "tanh(" + val1 + ")"; } else if (op == "TO_RADIANS") { - out_val = `radians(${val1})`; + out_val = "radians(" + val1 + ")"; } else if (op == "TO_DEGREES") { - out_val = `degrees(${val1})`; + out_val = "degrees(" + val1 + ")"; } if (use_clamp) { - return `clamp(${out_val}, 0.0, 1.0)`; + return "clamp(" + out_val + ", 0.0, 1.0)"; } else { return out_val; @@ -1598,43 +1598,43 @@ function parser_material_parse_value(node: zui_node_t, socket: zui_node_socket_t } else if (node.type == "RGBTOBW") { let col: string = parser_material_parse_vector_input(node.inputs[0]); - return `(((${col}.r * 0.3 + ${col}.g * 0.59 + ${col}.b * 0.11) / 3.0) * 2.5)`; + return "(((" + col + ".r * 0.3 + " + col + ".g * 0.59 + " + col + ".b * 0.11) / 3.0) * 2.5)"; } else if (node.type == "SEPHSV") { node_shader_add_function(parser_material_curshader, str_hue_sat); let col: string = parser_material_parse_vector_input(node.inputs[0]); if (socket == node.outputs[0]) { - return `rgb_to_hsv(${col}).r`; + return "rgb_to_hsv(" + col + ").r"; } else if (socket == node.outputs[1]) { - return `rgb_to_hsv(${col}).g`; + return "rgb_to_hsv(" + col + ").g"; } else if (socket == node.outputs[2]) { - return `rgb_to_hsv(${col}).b`; + return "rgb_to_hsv(" + col + ").b"; } } else if (node.type == "SEPRGB") { let col: string = parser_material_parse_vector_input(node.inputs[0]); if (socket == node.outputs[0]) { - return `${col}.r`; + return col + ".r"; } else if (socket == node.outputs[1]) { - return `${col}.g`; + return col + ".g"; } else if (socket == node.outputs[2]) { - return `${col}.b`; + return col + ".b"; } } else if (node.type == "SEPXYZ") { let vec: string = parser_material_parse_vector_input(node.inputs[0]); if (socket == node.outputs[0]) { - return `${vec}.x`; + return vec + ".x"; } else if (socket == node.outputs[1]) { - return `${vec}.y`; + return vec + ".y"; } else if (socket == node.outputs[2]) { - return `${vec}.z`; + return vec + ".z"; } } else if (node.type == "VECT_MATH") { @@ -1644,13 +1644,13 @@ function parser_material_parse_value(node: zui_node_t, socket: zui_node_socket_t let op: string = but.data[but.default_value].toUpperCase(); op = string_replace_all(op, " ", "_"); if (op == "DOT_PRODUCT") { - return `dot(${vec1}, ${vec2})`; + return "dot(" + vec1 + ", " + vec2 + ")"; } else if (op == "LENGTH") { - return `length(${vec1})`; + return "length(" + vec1 + ")"; } else if (op == "DISTANCE") { - return `distance(${vec1}, ${vec2})`; + return "distance(" + vec1 + ", " + vec2 + ")"; } else { return "0.0"; @@ -1665,10 +1665,10 @@ function parser_material_parse_value(node: zui_node_t, socket: zui_node_socket_t op = string_replace_all(op, " ", "_"); if (op == "MIN_MAX") { - return `(clamp(${val}, ${min}, ${max}))`; + return "(clamp(" + val + ", " + min + ", " + max + "))"; } else if (op == "RANGE") { - return `(clamp(${val}, min(${min}, ${max}), max(${min}, ${max})))`; + return "(clamp(" + val + ", min(" + min + ", " + max + "), max(" + min + ", " + max + ")))"; } } else if (node.type == "MAPRANGE") { @@ -1680,10 +1680,10 @@ function parser_material_parse_value(node: zui_node_t, socket: zui_node_socket_t let use_clamp: bool = node.buttons[0].default_value == true; - let a: string = `((${tmin} - ${tmax}) / (${fmin} - ${fmax}))`; - let out_val: string = `(${a} * ${val} + ${tmin} - ${a} * ${fmin})`; + let a: string = "((" + tmin + " - " + tmax + ") / (" + fmin + " - " + fmax + "))"; + let out_val: string = "(" + a + " * " + val + " + " + tmin + " - " + a + " * " + fmin + ")"; if (use_clamp) { - return `(clamp(${out_val}, ${tmin}, ${tmax}))`; + return "(clamp(" + out_val + ", " + tmin + ", " + tmax + "))"; } else { return out_val; @@ -1707,7 +1707,7 @@ function parser_material_get_coord(node: zui_node_t): string { function parser_material_get_gradient(grad: string, co: string): string { if (grad == "LINEAR") { - return `${co}.x`; + return co + ".x"; } else if (grad == "QUADRATIC") { return "0.0"; @@ -1716,16 +1716,16 @@ function parser_material_get_gradient(grad: string, co: string): string { return "0.0"; } else if (grad == "DIAGONAL") { - return `(${co}.x + ${co}.y) * 0.5`; + return "(" + co + ".x + " + co + ".y) * 0.5"; } else if (grad == "RADIAL") { - return `atan2(${co}.x, ${co}.y) / (3.141592 * 2.0) + 0.5`; + return "atan2(" + co + ".x, " + co + ".y) / (3.141592 * 2.0) + 0.5"; } else if (grad == "QUADRATIC_SPHERE") { return "0.0"; } else { // "SPHERICAL" - return `max(1.0 - sqrt(${co}.x * ${co}.x + ${co}.y * ${co}.y + ${co}.z * ${co}.z), 0.0)`; + return "max(1.0 - sqrt(" + co + ".x * " + co + ".x + " + co + ".y * " + co + ".y + " + co + ".z * " + co + ".z), 0.0)"; } } @@ -1733,29 +1733,29 @@ function parser_material_vector_curve(name: string, fac: string, points: f32_arr // Write Ys array let ys_var: string = name + "_ys"; let num: i32 = points.length; - node_shader_write(parser_material_curshader, `float ${ys_var}[${num}];`); // TODO: Make const + node_shader_write(parser_material_curshader, "float " + ys_var + "[" + num + "];"); // TODO: Make const for (let i: i32 = 0; i < num; ++i) { - node_shader_write(parser_material_curshader, `${ys_var}[${i}] = ${points[i][1]};`); + node_shader_write(parser_material_curshader, ys_var + "[" + i + "] = " + points[i][1] + ";"); } // Get index let fac_var: string = name + "_fac"; - node_shader_write(parser_material_curshader, `float ${fac_var} = ${fac};`); + node_shader_write(parser_material_curshader, "float " + fac_var + " = " + fac + ";"); let index: string = "0"; for (let i: i32 = 1; i < num; ++i) { - index += ` + (${fac_var} > ${points[i][0]} ? 1 : 0)`; + index += " + (" + fac_var + " > " + points[i][0] + " ? 1 : 0)"; } // Write index let index_var: string = name + "_i"; - node_shader_write(parser_material_curshader, `int ${index_var} = ${index};`); + node_shader_write(parser_material_curshader, "int " + index_var + " = " + index + ";"); // Linear // Write Xs array let facs_var: string = name + "_xs"; - node_shader_write(parser_material_curshader, `float ${facs_var}[${num}];`); // TODO: Make const + node_shader_write(parser_material_curshader, "float " + facs_var + "[" + num + "];"); // TODO: Make const for (let i: i32 = 0; i < num; ++i) { - node_shader_write(parser_material_curshader, `${facs_var}[${i}] = ${points[i][0]};`); + node_shader_write(parser_material_curshader, "" + facs_var + "[" + i + "] = " + points[i][0] + ";"); } // Map vector - return `mix(${ys_var}[${index_var}], ${ys_var}[${index_var} + 1], (${fac_var} - ${facs_var}[${index_var}]) * (1.0 / (${facs_var}[${index_var} + 1] - ${facs_var}[${index_var}])))`; + return "mix(" + ys_var + "[" + index_var + "], " + ys_var + "[" + index_var + " + 1], (" + fac_var + " - " + facs_var + "[" + index_var + "]) * (1.0 / (" + facs_var + "[" + index_var + " + 1] - " + facs_var + "[" + index_var + "])))"; } function parser_material_res_var_name(node: zui_node_t, socket: zui_node_socket_t): string { @@ -1775,7 +1775,7 @@ function parser_material_write_result(l: zui_node_link_t): string { return null; } map_set(parser_material_parsed_map, res_var, res); - node_shader_write(parser_material_curshader, `vec3 ${res_var} = ${res};`); + node_shader_write(parser_material_curshader, "vec3 " + res_var + " = " + res + ";"); } else if (st == "VALUE") { let res: string = parser_material_parse_value(from_node, from_socket); @@ -1783,7 +1783,7 @@ function parser_material_write_result(l: zui_node_link_t): string { return null; } map_set(parser_material_parsed_map, res_var, res); - node_shader_write(parser_material_curshader, `float ${res_var} = ${res};`); + node_shader_write(parser_material_curshader, "float " + res_var + " = " + res + ";"); } } return res_var; @@ -1807,45 +1807,45 @@ function parser_material_texture_store(node: zui_node_t, tex: bind_tex_t, tex_na let tex_store: string = parser_material_store_var_name(node); if (parser_material_sample_keep_aspect) { - node_shader_write(parser_material_curshader, `vec2 ${tex_store}_size = vec2(textureSize(${tex_name}, 0));`); - node_shader_write(parser_material_curshader, `float ${tex_store}_ax = ${tex_store}_size.x / ${tex_store}_size.y;`); - node_shader_write(parser_material_curshader, `float ${tex_store}_ay = ${tex_store}_size.y / ${tex_store}_size.x;`); - node_shader_write(parser_material_curshader, `vec2 ${tex_store}_uv = ((${uv_name}.xy / ${parser_material_sample_uv_scale} - vec2(0.5, 0.5)) * vec2(max(${tex_store}_ay, 1.0), max(${tex_store}_ax, 1.0))) + vec2(0.5, 0.5);`); - node_shader_write(parser_material_curshader, `if (${tex_store}_uv.x < 0.0 || ${tex_store}_uv.y < 0.0 || ${tex_store}_uv.x > 1.0 || ${tex_store}_uv.y > 1.0) discard;`); - node_shader_write(parser_material_curshader, `${tex_store}_uv *= ${parser_material_sample_uv_scale};`); - uv_name = `${tex_store}_uv`; + node_shader_write(parser_material_curshader, "vec2 " + tex_store + "_size = vec2(textureSize(" + tex_name + ", 0));"); + node_shader_write(parser_material_curshader, "float " + tex_store + "_ax = " + tex_store + "_size.x / " + tex_store + "_size.y;"); + node_shader_write(parser_material_curshader, "float " + tex_store + "_ay = " + tex_store + "_size.y / " + tex_store + "_size.x;"); + node_shader_write(parser_material_curshader, "vec2 " + tex_store + "_uv = ((" + uv_name + ".xy / " + parser_material_sample_uv_scale + " - vec2(0.5, 0.5)) * vec2(max(" + tex_store + "_ay, 1.0), max(" + tex_store + "_ax, 1.0))) + vec2(0.5, 0.5);"); + node_shader_write(parser_material_curshader, "if (" + tex_store + "_uv.x < 0.0 || " + tex_store + "_uv.y < 0.0 || " + tex_store + "_uv.x > 1.0 || " + tex_store + "_uv.y > 1.0) discard;"); + node_shader_write(parser_material_curshader, "" + tex_store + "_uv *= " + parser_material_sample_uv_scale + ";"); + uv_name = tex_store + "_uv"; } if (parser_material_triplanar) { - node_shader_write(parser_material_curshader, `vec4 ${tex_store} = vec4(0.0, 0.0, 0.0, 0.0);`); - node_shader_write(parser_material_curshader, `if (texCoordBlend.x > 0) ${tex_store} += texture(${tex_name}, ${uv_name}.xy) * texCoordBlend.x;`); - node_shader_write(parser_material_curshader, `if (texCoordBlend.y > 0) ${tex_store} += texture(${tex_name}, ${uv_name}1.xy) * texCoordBlend.y;`); - node_shader_write(parser_material_curshader, `if (texCoordBlend.z > 0) ${tex_store} += texture(${tex_name}, ${uv_name}2.xy) * texCoordBlend.z;`); + node_shader_write(parser_material_curshader, "vec4 " + tex_store + " = vec4(0.0, 0.0, 0.0, 0.0);"); + node_shader_write(parser_material_curshader, "if (texCoordBlend.x > 0) " + tex_store + " += texture(" + tex_name + ", " + uv_name + ".xy) * texCoordBlend.x;"); + node_shader_write(parser_material_curshader, "if (texCoordBlend.y > 0) " + tex_store + " += texture(" + tex_name + ", " + uv_name + "1.xy) * texCoordBlend.y;"); + node_shader_write(parser_material_curshader, "if (texCoordBlend.z > 0) " + tex_store + " += texture(" + tex_name + ", " + uv_name + "2.xy) * texCoordBlend.z;"); } else { if (parser_material_curshader == parser_material_frag) { - map_set(parser_material_texture_map, tex_store, `texture(${tex_name}, ${uv_name}.xy)`); - node_shader_write(parser_material_curshader, `vec4 ${tex_store} = texture(${tex_name}, ${uv_name}.xy);`); + map_set(parser_material_texture_map, tex_store, "texture(" + tex_name + ", " + uv_name + ".xy)"); + node_shader_write(parser_material_curshader, "vec4 " + tex_store + " = texture(" + tex_name + ", " + uv_name + ".xy);"); } else { - map_set(parser_material_texture_map, tex_store, `textureLod(${tex_name}, ${uv_name}.xy, 0.0)`); - node_shader_write(parser_material_curshader, `vec4 ${tex_store} = textureLod(${tex_name}, ${uv_name}.xy, 0.0);`); + map_set(parser_material_texture_map, tex_store, "textureLod(" + tex_name + ", " + uv_name + ".xy, 0.0)"); + node_shader_write(parser_material_curshader, "vec4 " + tex_store + " = textureLod(" + tex_name + ", " + uv_name + ".xy, 0.0);"); } if (!ends_with(tex.file, ".jpg")) { // Pre-mult alpha - node_shader_write(parser_material_curshader, `${tex_store}.rgb *= ${tex_store}.a;`); + node_shader_write(parser_material_curshader, tex_store + ".rgb *= " + tex_store + ".a;"); } } if (parser_material_transform_color_space) { // Base color socket auto-converts from sRGB to linear if (color_space == color_space_t.LINEAR && parser_material_parsing_basecolor) { // Linear to sRGB - node_shader_write(parser_material_curshader, `${tex_store}.rgb = pow(${tex_store}.rgb, vec3(2.2, 2.2, 2.2));`); + node_shader_write(parser_material_curshader, tex_store + ".rgb = pow(" + tex_store + ".rgb, vec3(2.2, 2.2, 2.2));"); } else if (color_space == color_space_t.SRGB && !parser_material_parsing_basecolor) { // sRGB to linear - node_shader_write(parser_material_curshader, `${tex_store}.rgb = pow(${tex_store}.rgb, vec3(1.0 / 2.2, 1.0 / 2.2, 1.0 / 2.2));`); + node_shader_write(parser_material_curshader, tex_store + ".rgb = pow(" + tex_store + ".rgb, vec3(1.0 / 2.2, 1.0 / 2.2, 1.0 / 2.2));"); } else if (color_space == color_space_t.DIRECTX_NORMAL_MAP) { // DirectX normal map to OpenGL normal map - node_shader_write(parser_material_curshader, `${tex_store}.y = 1.0 - ${tex_store}.y;`); + node_shader_write(parser_material_curshader, tex_store + ".y = 1.0 - " + tex_store + ".y;"); } } return tex_store; @@ -1853,25 +1853,25 @@ function parser_material_texture_store(node: zui_node_t, tex: bind_tex_t, tex_na function parser_material_vec1(v: f32): string { ///if krom_android - return `float(${v})`; + return "float(" + v + ")"; ///else - return `${v}`; + return v + ""; ///end } function parser_material_vec3(v: f32[]): string { ///if krom_android - return `vec3(float(${v[0]}), float(${v[1]}), float(${v[2]}))`; + return "vec3(float(" + v[0] + "), float(" + v[1] + "), float(" + v[2] + "))"; ///else - return `vec3(${v[0]}, ${v[1]}, ${v[2]})`; + return "vec3(" + v[0] + ", " + v[1] + ", " + v[2] + ")"; ///end } function parser_material_to_vec3(s: string): string { ///if (krom_direct3d11 || krom_direct3d12) - return `(${s}).xxx`; + return "(" + s + ").xxx"; ///else - return `vec3(${s})`; + return "vec3(" + s + ")"; ///end } @@ -1901,7 +1901,7 @@ function parser_material_node_name(node: zui_node_t, _parents: zui_node_t[] = nu let s: string = node.name; for (let i: i32 = 0; i < _parents.length; ++i) { let p: zui_node_t = _parents[i]; - s = p.name + p.id + `_` + s; + s = p.name + p.id + "_" + s; } s = parser_material_safesrc(s) + node.id; return s; diff --git a/base/Sources/path.ts b/base/Sources/path.ts index d3ecb20c..bc3d9bd9 100644 --- a/base/Sources/path.ts +++ b/base/Sources/path.ts @@ -72,7 +72,7 @@ function path_working_dir(): string { if (path_working_dir_cache == null) { let cmd: string = path_pwd; let save: string = (path_is_protected() ? krom_save_path() : path_data() + path_sep) + "working_dir.txt"; - krom_sys_command(cmd + ' > "' + save + '"'); + krom_sys_command(cmd + " > \"" + save + "\""); path_working_dir_cache = trim_end(sys_buffer_to_string(krom_load_blob(save))); } return path_working_dir_cache; diff --git a/base/Sources/physics_body.ts b/base/Sources/physics_body.ts index 9de16df8..054e17a4 100644 --- a/base/Sources/physics_body.ts +++ b/base/Sources/physics_body.ts @@ -397,7 +397,7 @@ function physics_body_fill_convex_hull(pb: physics_body_t, scale: vec4_t, margin map_set(physics_body_convex_hull_cache, data, shape); map_set(physics_body_users_cache, data, 1); - let positions: i16_array_t = mesh_data_get_vertex_array(data, 'pos').values; + let positions: i16_array_t = mesh_data_get_vertex_array(data, "pos").values; let sx: f32 = scale.x * (1.0 - margin) * (1 / 32767); let sy: f32 = scale.y * (1.0 - margin) * (1 / 32767); @@ -429,7 +429,7 @@ function physics_body_fill_triangle_mesh(pb: physics_body_t, scale: vec4_t): Amm map_set(physics_body_triangle_mesh_cache, data, triangle_mesh); map_set(physics_body_users_cache, data, 1); - let positions: i16_array_t = mesh_data_get_vertex_array(data, 'pos').values; + let positions: i16_array_t = mesh_data_get_vertex_array(data, "pos").values; let indices: any = data._indices; let sx: f32 = scale.x * (1 / 32767); diff --git a/base/Sources/project.ts b/base/Sources/project.ts index a49fd5b3..bec37f08 100644 --- a/base/Sources/project.ts +++ b/base/Sources/project.ts @@ -46,7 +46,7 @@ function project_save(saveAndQuit: bool = false) { if (project_filepath == "") { ///if krom_ios let document_directory: string = krom_save_dialog("", ""); - document_directory = substring(document_directory, 0, document_directory.length - 8); // Strip /'untitled' + document_directory = substring(document_directory, 0, document_directory.length - 8); // Strip /"untitled" project_filepath = document_directory + "/" + sys_title() + ".arm"; ///elseif krom_android project_filepath = krom_save_path() + "/" + sys_title() + ".arm"; diff --git a/base/Sources/strings.ts b/base/Sources/strings.ts index 0245e23a..b333eb0d 100644 --- a/base/Sources/strings.ts +++ b/base/Sources/strings.ts @@ -37,520 +37,520 @@ function strings_graphics_api(): string { ///end } -let str_tex_checker: string = ` -vec3 tex_checker(const vec3 co, const vec3 col1, const vec3 col2, const float scale) { - // Prevent precision issues on unit coordinates - vec3 p = (co + 0.000001 * 0.999999) * scale; - float xi = abs(floor(p.x)); - float yi = abs(floor(p.y)); - float zi = abs(floor(p.z)); - bool check = ((mod(xi, 2.0) == mod(yi, 2.0)) == bool(mod(zi, 2.0))); - return check ? col1 : col2; -} -float tex_checker_f(const vec3 co, const float scale) { - vec3 p = (co + 0.000001 * 0.999999) * scale; - float xi = abs(floor(p.x)); - float yi = abs(floor(p.y)); - float zi = abs(floor(p.z)); - return float((mod(xi, 2.0) == mod(yi, 2.0)) == bool(mod(zi, 2.0))); -} -`; +let str_tex_checker: string = " \ +vec3 tex_checker(const vec3 co, const vec3 col1, const vec3 col2, const float scale) { \ + // Prevent precision issues on unit coordinates \ + vec3 p = (co + 0.000001 * 0.999999) * scale; \ + float xi = abs(floor(p.x)); \ + float yi = abs(floor(p.y)); \ + float zi = abs(floor(p.z)); \ + bool check = ((mod(xi, 2.0) == mod(yi, 2.0)) == bool(mod(zi, 2.0))); \ + return check ? col1 : col2; \ +} \ +float tex_checker_f(const vec3 co, const float scale) { \ + vec3 p = (co + 0.000001 * 0.999999) * scale; \ + float xi = abs(floor(p.x)); \ + float yi = abs(floor(p.y)); \ + float zi = abs(floor(p.z)); \ + return float((mod(xi, 2.0) == mod(yi, 2.0)) == bool(mod(zi, 2.0))); \ +} \ +"; // Created by inigo quilez - iq/2013 // License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License -let str_tex_voronoi: string = ` -vec4 tex_voronoi(const vec3 x, textureArg(snoise256)) { - vec3 p = floor(x); - vec3 f = fract(x); - float id = 0.0; - float res = 100.0; - for (int k = -1; k <= 1; k++) - for (int j = -1; j <= 1; j++) - for (int i = -1; i <= 1; i++) { - vec3 b = vec3(float(i), float(j), float(k)); - vec3 pb = p + b; - vec3 r = vec3(b) - f + texture(snoise256, (pb.xy + vec2(3.0, 1.0) * pb.z + 0.5) / 256.0).xyz; - float d = dot(r, r); - if (d < res) { - id = dot(p + b, vec3(1.0, 57.0, 113.0)); - res = d; - } - } - vec3 col = 0.5 + 0.5 * cos(id * 0.35 + vec3(0.0, 1.0, 2.0)); - return vec4(col, sqrt(res)); -} -`; +let str_tex_voronoi: string = " \ +vec4 tex_voronoi(const vec3 x, textureArg(snoise256)) { \ + vec3 p = floor(x); \ + vec3 f = fract(x); \ + float id = 0.0; \ + float res = 100.0; \ + for (int k = -1; k <= 1; k++) \ + for (int j = -1; j <= 1; j++) \ + for (int i = -1; i <= 1; i++) { \ + vec3 b = vec3(float(i), float(j), float(k)); \ + vec3 pb = p + b; \ + vec3 r = vec3(b) - f + texture(snoise256, (pb.xy + vec2(3.0, 1.0) * pb.z + 0.5) / 256.0).xyz; \ + float d = dot(r, r); \ + if (d < res) { \ + id = dot(p + b, vec3(1.0, 57.0, 113.0)); \ + res = d; \ + } \ + } \ + vec3 col = 0.5 + 0.5 * cos(id * 0.35 + vec3(0.0, 1.0, 2.0)); \ + return vec4(col, sqrt(res)); \ +} \ +"; // By Morgan McGuire @morgan3d, http://graphicscodex.com Reuse permitted under the BSD license. // https://www.shadertoy.com/view/4dS3Wd -let str_tex_noise: string = ` -float hash(float n) { return fract(sin(n) * 1e4); } -float tex_noise_f(vec3 x) { - const vec3 step = vec3(110, 241, 171); - vec3 i = floor(x); - vec3 f = fract(x); - float n = dot(i, step); - vec3 u = f * f * (3.0 - 2.0 * f); - return mix(mix(mix(hash(n + dot(step, vec3(0, 0, 0))), hash(n + dot(step, vec3(1, 0, 0))), u.x), - mix(hash(n + dot(step, vec3(0, 1, 0))), hash(n + dot(step, vec3(1, 1, 0))), u.x), u.y), - mix(mix(hash(n + dot(step, vec3(0, 0, 1))), hash(n + dot(step, vec3(1, 0, 1))), u.x), - mix(hash(n + dot(step, vec3(0, 1, 1))), hash(n + dot(step, vec3(1, 1, 1))), u.x), u.y), u.z); -} -float tex_noise(vec3 p) { - p *= 1.25; - float f = 0.5 * tex_noise_f(p); p *= 2.01; - f += 0.25 * tex_noise_f(p); p *= 2.02; - f += 0.125 * tex_noise_f(p); p *= 2.03; - f += 0.0625 * tex_noise_f(p); - return 1.0 - f; -} -`; +let str_tex_noise: string = " \ +float hash(float n) { return fract(sin(n) * 1e4); } \ +float tex_noise_f(vec3 x) { \ + const vec3 step = vec3(110, 241, 171); \ + vec3 i = floor(x); \ + vec3 f = fract(x); \ + float n = dot(i, step); \ + vec3 u = f * f * (3.0 - 2.0 * f); \ + return mix(mix(mix(hash(n + dot(step, vec3(0, 0, 0))), hash(n + dot(step, vec3(1, 0, 0))), u.x), \ + mix(hash(n + dot(step, vec3(0, 1, 0))), hash(n + dot(step, vec3(1, 1, 0))), u.x), u.y), \ + mix(mix(hash(n + dot(step, vec3(0, 0, 1))), hash(n + dot(step, vec3(1, 0, 1))), u.x), \ + mix(hash(n + dot(step, vec3(0, 1, 1))), hash(n + dot(step, vec3(1, 1, 1))), u.x), u.y), u.z); \ +} \ +float tex_noise(vec3 p) { \ + p *= 1.25; \ + float f = 0.5 * tex_noise_f(p); p *= 2.01; \ + f += 0.25 * tex_noise_f(p); p *= 2.02; \ + f += 0.125 * tex_noise_f(p); p *= 2.03; \ + f += 0.0625 * tex_noise_f(p); \ + return 1.0 - f; \ +} \ +"; // Based on noise created by Nikita Miropolskiy, nikat/2013 // Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License -let str_tex_musgrave: string = ` -vec3 random3(const vec3 c) { - float j = 4096.0 * sin(dot(c, vec3(17.0, 59.4, 15.0))); - vec3 r; - r.z = fract(512.0 * j); - j *= 0.125; - r.x = fract(512.0 * j); - j *= 0.125; - r.y = fract(512.0 * j); - return r - 0.5; -} -float tex_musgrave_f(const vec3 p) { - const float F3 = 0.3333333; - const float G3 = 0.1666667; - vec3 s = floor(p + dot(p, vec3(F3, F3, F3))); - vec3 x = p - s + dot(s, vec3(G3, G3, G3)); - vec3 e = step(vec3(0.0, 0.0, 0.0), x - x.yzx); - vec3 i1 = e*(1.0 - e.zxy); - vec3 i2 = 1.0 - e.zxy*(1.0 - e); - vec3 x1 = x - i1 + G3; - vec3 x2 = x - i2 + 2.0*G3; - vec3 x3 = x - 1.0 + 3.0*G3; - vec4 w, d; - w.x = dot(x, x); - w.y = dot(x1, x1); - w.z = dot(x2, x2); - w.w = dot(x3, x3); - w = max(0.6 - w, 0.0); - d.x = dot(random3(s), x); - d.y = dot(random3(s + i1), x1); - d.z = dot(random3(s + i2), x2); - d.w = dot(random3(s + 1.0), x3); - w *= w; - w *= w; - d *= w; - return clamp(dot(d, vec4(52.0, 52.0, 52.0, 52.0)), 0.0, 1.0); -} -`; +let str_tex_musgrave: string = " \ +vec3 random3(const vec3 c) { \ + float j = 4096.0 * sin(dot(c, vec3(17.0, 59.4, 15.0))); \ + vec3 r; \ + r.z = fract(512.0 * j); \ + j *= 0.125; \ + r.x = fract(512.0 * j); \ + j *= 0.125; \ + r.y = fract(512.0 * j); \ + return r - 0.5; \ +} \ +float tex_musgrave_f(const vec3 p) { \ + const float F3 = 0.3333333; \ + const float G3 = 0.1666667; \ + vec3 s = floor(p + dot(p, vec3(F3, F3, F3))); \ + vec3 x = p - s + dot(s, vec3(G3, G3, G3)); \ + vec3 e = step(vec3(0.0, 0.0, 0.0), x - x.yzx); \ + vec3 i1 = e * (1.0 - e.zxy); \ + vec3 i2 = 1.0 - e.zxy * (1.0 - e); \ + vec3 x1 = x - i1 + G3; \ + vec3 x2 = x - i2 + 2.0 * G3; \ + vec3 x3 = x - 1.0 + 3.0 * G3; \ + vec4 w, d; \ + w.x = dot(x, x); \ + w.y = dot(x1, x1); \ + w.z = dot(x2, x2); \ + w.w = dot(x3, x3); \ + w = max(0.6 - w, 0.0); \ + d.x = dot(random3(s), x); \ + d.y = dot(random3(s + i1), x1); \ + d.z = dot(random3(s + i2), x2); \ + d.w = dot(random3(s + 1.0), x3); \ + w *= w; \ + w *= w; \ + d *= w; \ + return clamp(dot(d, vec4(52.0, 52.0, 52.0, 52.0)), 0.0, 1.0); \ +} \ +"; -let str_hue_sat: string = ` -vec3 hsv_to_rgb(const vec3 c) { - const vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); - vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); - return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); -} -vec3 rgb_to_hsv(const vec3 c) { - const vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); - vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); - vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); - float d = q.x - min(q.w, q.y); - float e = 1.0e-10; - return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); -} -vec3 hue_sat(const vec3 col, const vec4 shift) { - vec3 hsv = rgb_to_hsv(col); - hsv.x += shift.x; - hsv.y *= shift.y; - hsv.z *= shift.z; - return mix(hsv_to_rgb(hsv), col, shift.w); -} -`; +let str_hue_sat: string = " \ +vec3 hsv_to_rgb(const vec3 c) { \ + const vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); \ + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); \ + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); \ +} \ +vec3 rgb_to_hsv(const vec3 c) { \ + const vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); \ + vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); \ + vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); \ + float d = q.x - min(q.w, q.y); \ + float e = 1.0e-10; \ + return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); \ +} \ +vec3 hue_sat(const vec3 col, const vec4 shift) { \ + vec3 hsv = rgb_to_hsv(col); \ + hsv.x += shift.x; \ + hsv.y *= shift.y; \ + hsv.z *= shift.z; \ + return mix(hsv_to_rgb(hsv), col, shift.w); \ +} \ +"; // https://twitter.com/Donzanoid/status/903424376707657730 -let str_wavelength_to_rgb: string = ` -vec3 wavelength_to_rgb(const float t) { - vec3 r = t * 2.1 - vec3(1.8, 1.14, 0.3); - return 1.0 - r * r; -} -`; +let str_wavelength_to_rgb: string = " \ +vec3 wavelength_to_rgb(const float t) { \ + vec3 r = t * 2.1 - vec3(1.8, 1.14, 0.3); \ + return 1.0 - r * r; \ +} \ +"; -let str_tex_magic: string = ` -vec3 tex_magic(const vec3 p) { - float a = 1.0 - (sin(p.x) + sin(p.y)); - float b = 1.0 - sin(p.x - p.y); - float c = 1.0 - sin(p.x + p.y); - return vec3(a, b, c); -} -float tex_magic_f(const vec3 p) { - vec3 c = tex_magic(p); - return (c.x + c.y + c.z) / 3.0; -} -`; +let str_tex_magic: string = " \ +vec3 tex_magic(const vec3 p) { \ + float a = 1.0 - (sin(p.x) + sin(p.y)); \ + float b = 1.0 - sin(p.x - p.y); \ + float c = 1.0 - sin(p.x + p.y); \ + return vec3(a, b, c); \ +} \ +float tex_magic_f(const vec3 p) { \ + vec3 c = tex_magic(p); \ + return (c.x + c.y + c.z) / 3.0; \ +} \ +"; -let str_tex_brick: string = ` -float tex_brick_noise(int n) { - int nn; - n = (n >> 13) ^ n; - nn = (n * (n * n * 60493 + 19990303) + 1376312589) & 0x7fffffff; - return 0.5f * float(nn) / 1073741824.0; -} -vec3 tex_brick(vec3 p, const vec3 c1, const vec3 c2, const vec3 c3) { - vec3 brickSize = vec3(0.9, 0.49, 0.49); - vec3 mortarSize = vec3(0.05, 0.1, 0.1); - p /= brickSize / 2; - if (fract(p.y * 0.5) > 0.5) p.x += 0.5; - float col = floor(p.x / (brickSize.x + (mortarSize.x * 2.0))); - float row = p.y; - p = fract(p); - vec3 b = step(p, 1.0 - mortarSize); - float tint = min(max(tex_brick_noise((int(col) << 16) + (int(row) & 0xFFFF)), 0.0), 1.0); - return mix(c3, mix(c1, c2, tint), b.x * b.y * b.z); -} -float tex_brick_f(vec3 p) { - p /= vec3(0.9, 0.49, 0.49) / 2; - if (fract(p.y * 0.5) > 0.5) p.x += 0.5; - p = fract(p); - vec3 b = step(p, vec3(0.95, 0.9, 0.9)); - return mix(1.0, 0.0, b.x * b.y * b.z); -} -`; +let str_tex_brick: string = " \ +float tex_brick_noise(int n) { \ + int nn; \ + n = (n >> 13) ^ n; \ + nn = (n * (n * n * 60493 + 19990303) + 1376312589) & 0x7fffffff; \ + return 0.5f * float(nn) / 1073741824.0; \ +} \ +vec3 tex_brick(vec3 p, const vec3 c1, const vec3 c2, const vec3 c3) { \ + vec3 brickSize = vec3(0.9, 0.49, 0.49); \ + vec3 mortarSize = vec3(0.05, 0.1, 0.1); \ + p /= brickSize / 2; \ + if (fract(p.y * 0.5) > 0.5) p.x += 0.5; \ + float col = floor(p.x / (brickSize.x + (mortarSize.x * 2.0))); \ + float row = p.y; \ + p = fract(p); \ + vec3 b = step(p, 1.0 - mortarSize); \ + float tint = min(max(tex_brick_noise((int(col) << 16) + (int(row) & 0xFFFF)), 0.0), 1.0); \ + return mix(c3, mix(c1, c2, tint), b.x * b.y * b.z); \ +} \ +float tex_brick_f(vec3 p) { \ + p /= vec3(0.9, 0.49, 0.49) / 2; \ + if (fract(p.y * 0.5) > 0.5) p.x += 0.5; \ + p = fract(p); \ + vec3 b = step(p, vec3(0.95, 0.9, 0.9)); \ + return mix(1.0, 0.0, b.x * b.y * b.z); \ +} \ +"; -let str_tex_wave: string = ` -float tex_wave_f(const vec3 p) { - return 1.0 - sin((p.x + p.y) * 10.0); -} -`; +let str_tex_wave: string = " \ +float tex_wave_f(const vec3 p) { \ + return 1.0 - sin((p.x + p.y) * 10.0); \ +} \ +"; -let str_brightcontrast: string = ` -vec3 brightcontrast(const vec3 col, const float bright, const float contr) { - float a = 1.0 + contr; - float b = bright - contr * 0.5; - return max(a * col + b, 0.0); -} -`; +let str_brightcontrast: string = " \ +vec3 brightcontrast(const vec3 col, const float bright, const float contr) { \ + float a = 1.0 + contr; \ + float b = bright - contr * 0.5; \ + return max(a * col + b, 0.0); \ +} \ +"; ///if arm_voxels -let str_trace_ao: string = ` -float traceConeAO(sampler3D voxels, const vec3 origin, vec3 dir, const float aperture, const float maxDist, const float offset) { - const ivec3 voxelgiResolution = ivec3(256, 256, 256); - const float voxelgiStep = 1.0; - const float VOXEL_SIZE = (2.0 / voxelgiResolution.x) * voxelgiStep; - dir = normalize(dir); - float sampleCol = 0.0; - float dist = offset; - float diam = dist * aperture; - vec3 samplePos; - while (sampleCol < 1.0 && dist < maxDist) { - samplePos = dir * dist + origin; - float mip = max(log2(diam * voxelgiResolution.x), 0); - float mipSample = textureLod(voxels, samplePos * 0.5 + vec3(0.5, 0.5, 0.5), mip).r; - sampleCol += (1 - sampleCol) * mipSample; - dist += max(diam / 2, VOXEL_SIZE); - diam = dist * aperture; - } - return sampleCol; -} -vec3 tangent(const vec3 n) { - vec3 t1 = cross(n, vec3(0, 0, 1)); - vec3 t2 = cross(n, vec3(0, 1, 0)); - if (length(t1) > length(t2)) return normalize(t1); - else return normalize(t2); -} -float traceAO(const vec3 origin, const vec3 normal, const float vrange, const float voffset) { - const float angleMix = 0.5f; - const float aperture = 0.55785173935; - vec3 o1 = normalize(tangent(normal)); - vec3 o2 = normalize(cross(o1, normal)); - vec3 c1 = 0.5f * (o1 + o2); - vec3 c2 = 0.5f * (o1 - o2); - float MAX_DISTANCE = 1.73205080757 * 2.0 * vrange; - const ivec3 voxelgiResolution = ivec3(256, 256, 256); - const float voxelgiStep = 1.0; - const float VOXEL_SIZE = (2.0 / voxelgiResolution.x) * voxelgiStep; - float offset = 1.5 * VOXEL_SIZE * 2.5 * voffset; - float col = traceConeAO(voxels, origin, normal, aperture, MAX_DISTANCE, offset); - col += traceConeAO(voxels, origin, mix(normal, o1, angleMix), aperture, MAX_DISTANCE, offset); - col += traceConeAO(voxels, origin, mix(normal, o2, angleMix), aperture, MAX_DISTANCE, offset); - col += traceConeAO(voxels, origin, mix(normal, -c1, angleMix), aperture, MAX_DISTANCE, offset); - col += traceConeAO(voxels, origin, mix(normal, -c2, angleMix), aperture, MAX_DISTANCE, offset); - col += traceConeAO(voxels, origin, mix(normal, -o1, angleMix), aperture, MAX_DISTANCE, offset); - col += traceConeAO(voxels, origin, mix(normal, -o2, angleMix), aperture, MAX_DISTANCE, offset); - col += traceConeAO(voxels, origin, mix(normal, c1, angleMix), aperture, MAX_DISTANCE, offset); - col += traceConeAO(voxels, origin, mix(normal, c2, angleMix), aperture, MAX_DISTANCE, offset); - return col / 9.0; -} -`; +let str_trace_ao: string = " \ +float traceConeAO(sampler3D voxels, const vec3 origin, vec3 dir, const float aperture, const float maxDist, const float offset) { \ + const ivec3 voxelgiResolution = ivec3(256, 256, 256); \ + const float voxelgiStep = 1.0; \ + const float VOXEL_SIZE = (2.0 / voxelgiResolution.x) * voxelgiStep; \ + dir = normalize(dir); \ + float sampleCol = 0.0; \ + float dist = offset; \ + float diam = dist * aperture; \ + vec3 samplePos; \ + while (sampleCol < 1.0 && dist < maxDist) { \ + samplePos = dir * dist + origin; \ + float mip = max(log2(diam * voxelgiResolution.x), 0); \ + float mipSample = textureLod(voxels, samplePos * 0.5 + vec3(0.5, 0.5, 0.5), mip).r; \ + sampleCol += (1 - sampleCol) * mipSample; \ + dist += max(diam / 2, VOXEL_SIZE); \ + diam = dist * aperture; \ + } \ + return sampleCol; \ +} \ +vec3 tangent(const vec3 n) { \ + vec3 t1 = cross(n, vec3(0, 0, 1)); \ + vec3 t2 = cross(n, vec3(0, 1, 0)); \ + if (length(t1) > length(t2)) return normalize(t1); \ + else return normalize(t2); \ +} \ +float traceAO(const vec3 origin, const vec3 normal, const float vrange, const float voffset) { \ + const float angleMix = 0.5f; \ + const float aperture = 0.55785173935; \ + vec3 o1 = normalize(tangent(normal)); \ + vec3 o2 = normalize(cross(o1, normal)); \ + vec3 c1 = 0.5f * (o1 + o2); \ + vec3 c2 = 0.5f * (o1 - o2); \ + float MAX_DISTANCE = 1.73205080757 * 2.0 * vrange; \ + const ivec3 voxelgiResolution = ivec3(256, 256, 256); \ + const float voxelgiStep = 1.0; \ + const float VOXEL_SIZE = (2.0 / voxelgiResolution.x) * voxelgiStep; \ + float offset = 1.5 * VOXEL_SIZE * 2.5 * voffset; \ + float col = traceConeAO(voxels, origin, normal, aperture, MAX_DISTANCE, offset); \ + col += traceConeAO(voxels, origin, mix(normal, o1, angleMix), aperture, MAX_DISTANCE, offset); \ + col += traceConeAO(voxels, origin, mix(normal, o2, angleMix), aperture, MAX_DISTANCE, offset); \ + col += traceConeAO(voxels, origin, mix(normal, -c1, angleMix), aperture, MAX_DISTANCE, offset); \ + col += traceConeAO(voxels, origin, mix(normal, -c2, angleMix), aperture, MAX_DISTANCE, offset); \ + col += traceConeAO(voxels, origin, mix(normal, -o1, angleMix), aperture, MAX_DISTANCE, offset); \ + col += traceConeAO(voxels, origin, mix(normal, -o2, angleMix), aperture, MAX_DISTANCE, offset); \ + col += traceConeAO(voxels, origin, mix(normal, c1, angleMix), aperture, MAX_DISTANCE, offset); \ + col += traceConeAO(voxels, origin, mix(normal, c2, angleMix), aperture, MAX_DISTANCE, offset); \ + return col / 9.0; \ +} \ +"; ///end -let str_cotangent_frame: string = ` -mat3 cotangentFrame(const vec3 n, const vec3 p, const vec2 duv1, const vec2 duv2) { - vec3 dp1 = dFdx(p); - vec3 dp2 = dFdy(p); - vec3 dp2perp = cross(dp2, n); - vec3 dp1perp = cross(n, dp1); - vec3 t = dp2perp * duv1.x + dp1perp * duv2.x; - vec3 b = dp2perp * duv1.y + dp1perp * duv2.y; - float invmax = inversesqrt(max(dot(t, t), dot(b, b))); - return mat3(t * invmax, b * invmax, n); -} -mat3 cotangentFrame(const vec3 n, const vec3 p, const vec2 texCoord) { - return cotangentFrame(n, p, dFdx(texCoord), dFdy(texCoord)); -} -`; +let str_cotangent_frame: string = " \ +mat3 cotangentFrame(const vec3 n, const vec3 p, const vec2 duv1, const vec2 duv2) { \ + vec3 dp1 = dFdx(p); \ + vec3 dp2 = dFdy(p); \ + vec3 dp2perp = cross(dp2, n); \ + vec3 dp1perp = cross(n, dp1); \ + vec3 t = dp2perp * duv1.x + dp1perp * duv2.x; \ + vec3 b = dp2perp * duv1.y + dp1perp * duv2.y; \ + float invmax = inversesqrt(max(dot(t, t), dot(b, b))); \ + return mat3(t * invmax, b * invmax, n); \ +} \ +mat3 cotangentFrame(const vec3 n, const vec3 p, const vec2 texCoord) { \ + return cotangentFrame(n, p, dFdx(texCoord), dFdy(texCoord)); \ +} \ +"; -let str_octahedron_wrap: string = ` -vec2 octahedronWrap(const vec2 v) { - return (1.0 - abs(v.yx)) * (vec2(v.x >= 0.0 ? 1.0 : -1.0, v.y >= 0.0 ? 1.0 : -1.0)); -} -`; +let str_octahedron_wrap: string = " \ +vec2 octahedronWrap(const vec2 v) { \ + return (1.0 - abs(v.yx)) * (vec2(v.x >= 0.0 ? 1.0 : -1.0, v.y >= 0.0 ? 1.0 : -1.0)); \ +} \ +"; -let str_pack_float_int16: string = ` -float packFloatInt16(const float f, const uint i) { - const float prec = float(1 << 16); - const float maxi = float(1 << 4); - const float precMinusOne = prec - 1.0; - const float t1 = ((prec / maxi) - 1.0) / precMinusOne; - const float t2 = (prec / maxi) / precMinusOne; - return t1 * f + t2 * float(i); -} -`; +let str_pack_float_int16: string = " \ +float packFloatInt16(const float f, const uint i) { \ + const float prec = float(1 << 16); \ + const float maxi = float(1 << 4); \ + const float precMinusOne = prec - 1.0; \ + const float t1 = ((prec / maxi) - 1.0) / precMinusOne; \ + const float t2 = (prec / maxi) / precMinusOne; \ + return t1 * f + t2 * float(i); \ +} \ +"; ///if arm_skin -let str_get_skinning_dual_quat: string = ` -void getSkinningDualQuat(const ivec4 bone, vec4 weight, out vec4 A, inout vec4 B) { - ivec4 bonei = bone * 2; - mat4 matA = mat4( - skinBones[bonei.x], - skinBones[bonei.y], - skinBones[bonei.z], - skinBones[bonei.w]); - mat4 matB = mat4( - skinBones[bonei.x + 1], - skinBones[bonei.y + 1], - skinBones[bonei.z + 1], - skinBones[bonei.w + 1]); - weight.xyz *= sign(mul(matA, matA[3])).xyz; - A = mul(weight, matA); - B = mul(weight, matB); - float invNormA = 1.0 / length(A); - A *= invNormA; - B *= invNormA; -} -`; +let str_get_skinning_dual_quat: string = " \ +void getSkinningDualQuat(const ivec4 bone, vec4 weight, out vec4 A, inout vec4 B) { \ + ivec4 bonei = bone * 2; \ + mat4 matA = mat4( \ + skinBones[bonei.x], \ + skinBones[bonei.y], \ + skinBones[bonei.z], \ + skinBones[bonei.w]); \ + mat4 matB = mat4( \ + skinBones[bonei.x + 1], \ + skinBones[bonei.y + 1], \ + skinBones[bonei.z + 1], \ + skinBones[bonei.w + 1]); \ + weight.xyz *= sign(mul(matA, matA[3])).xyz; \ + A = mul(weight, matA); \ + B = mul(weight, matB); \ + float invNormA = 1.0 / length(A); \ + A *= invNormA; \ + B *= invNormA; \ +} \ +"; ///end -let str_create_basis: string = ` -void createBasis(vec3 normal, out vec3 tangent, out vec3 binormal) { - tangent = normalize(cameraRight - normal * dot(cameraRight, normal)); - binormal = cross(tangent, normal); -} -`; +let str_create_basis: string = " \ +void createBasis(vec3 normal, out vec3 tangent, out vec3 binormal) { \ + tangent = normalize(cameraRight - normal * dot(cameraRight, normal)); \ + binormal = cross(tangent, normal); \ +} \ +"; function str_sh_irradiance(): string { ///if krom_metal - return `vec3 shIrradiance(const vec3 nor, constant vec4 shirr[7]) { - const float c1 = 0.429043; - const float c2 = 0.511664; - const float c3 = 0.743125; - const float c4 = 0.886227; - const float c5 = 0.247708; - vec3 cl00 = vec3(shirr[0].x, shirr[0].y, shirr[0].z); - vec3 cl1m1 = vec3(shirr[0].w, shirr[1].x, shirr[1].y); - vec3 cl10 = vec3(shirr[1].z, shirr[1].w, shirr[2].x); - vec3 cl11 = vec3(shirr[2].y, shirr[2].z, shirr[2].w); - vec3 cl2m2 = vec3(shirr[3].x, shirr[3].y, shirr[3].z); - vec3 cl2m1 = vec3(shirr[3].w, shirr[4].x, shirr[4].y); - vec3 cl20 = vec3(shirr[4].z, shirr[4].w, shirr[5].x); - vec3 cl21 = vec3(shirr[5].y, shirr[5].z, shirr[5].w); - vec3 cl22 = vec3(shirr[6].x, shirr[6].y, shirr[6].z); - return ( - c1 * cl22 * (nor.y * nor.y - (-nor.z) * (-nor.z)) + - c3 * cl20 * nor.x * nor.x + - c4 * cl00 - - c5 * cl20 + - 2.0 * c1 * cl2m2 * nor.y * (-nor.z) + - 2.0 * c1 * cl21 * nor.y * nor.x + - 2.0 * c1 * cl2m1 * (-nor.z) * nor.x + - 2.0 * c2 * cl11 * nor.y + - 2.0 * c2 * cl1m1 * (-nor.z) + - 2.0 * c2 * cl10 * nor.x - ); -} -`; + return "vec3 shIrradiance(const vec3 nor, constant vec4 shirr[7]) { \ + const float c1 = 0.429043; \ + const float c2 = 0.511664; \ + const float c3 = 0.743125; \ + const float c4 = 0.886227; \ + const float c5 = 0.247708; \ + vec3 cl00 = vec3(shirr[0].x, shirr[0].y, shirr[0].z); \ + vec3 cl1m1 = vec3(shirr[0].w, shirr[1].x, shirr[1].y); \ + vec3 cl10 = vec3(shirr[1].z, shirr[1].w, shirr[2].x); \ + vec3 cl11 = vec3(shirr[2].y, shirr[2].z, shirr[2].w); \ + vec3 cl2m2 = vec3(shirr[3].x, shirr[3].y, shirr[3].z); \ + vec3 cl2m1 = vec3(shirr[3].w, shirr[4].x, shirr[4].y); \ + vec3 cl20 = vec3(shirr[4].z, shirr[4].w, shirr[5].x); \ + vec3 cl21 = vec3(shirr[5].y, shirr[5].z, shirr[5].w); \ + vec3 cl22 = vec3(shirr[6].x, shirr[6].y, shirr[6].z); \ + return ( \ + c1 * cl22 * (nor.y * nor.y - (-nor.z) * (-nor.z)) + \ + c3 * cl20 * nor.x * nor.x + \ + c4 * cl00 - \ + c5 * cl20 + \ + 2.0 * c1 * cl2m2 * nor.y * (-nor.z) + \ + 2.0 * c1 * cl21 * nor.y * nor.x + \ + 2.0 * c1 * cl2m1 * (-nor.z) * nor.x + \ + 2.0 * c2 * cl11 * nor.y + \ + 2.0 * c2 * cl1m1 * (-nor.z) + \ + 2.0 * c2 * cl10 * nor.x \ + ); \ +} \ +"; ///else - return `vec3 shIrradiance(const vec3 nor, const vec4 shirr[7]) { - const float c1 = 0.429043; - const float c2 = 0.511664; - const float c3 = 0.743125; - const float c4 = 0.886227; - const float c5 = 0.247708; - vec3 cl00 = vec3(shirr[0].x, shirr[0].y, shirr[0].z); - vec3 cl1m1 = vec3(shirr[0].w, shirr[1].x, shirr[1].y); - vec3 cl10 = vec3(shirr[1].z, shirr[1].w, shirr[2].x); - vec3 cl11 = vec3(shirr[2].y, shirr[2].z, shirr[2].w); - vec3 cl2m2 = vec3(shirr[3].x, shirr[3].y, shirr[3].z); - vec3 cl2m1 = vec3(shirr[3].w, shirr[4].x, shirr[4].y); - vec3 cl20 = vec3(shirr[4].z, shirr[4].w, shirr[5].x); - vec3 cl21 = vec3(shirr[5].y, shirr[5].z, shirr[5].w); - vec3 cl22 = vec3(shirr[6].x, shirr[6].y, shirr[6].z); - return ( - c1 * cl22 * (nor.y * nor.y - (-nor.z) * (-nor.z)) + - c3 * cl20 * nor.x * nor.x + - c4 * cl00 - - c5 * cl20 + - 2.0 * c1 * cl2m2 * nor.y * (-nor.z) + - 2.0 * c1 * cl21 * nor.y * nor.x + - 2.0 * c1 * cl2m1 * (-nor.z) * nor.x + - 2.0 * c2 * cl11 * nor.y + - 2.0 * c2 * cl1m1 * (-nor.z) + - 2.0 * c2 * cl10 * nor.x - ); -} -`; + return "vec3 shIrradiance(const vec3 nor, const vec4 shirr[7]) { \ + const float c1 = 0.429043; \ + const float c2 = 0.511664; \ + const float c3 = 0.743125; \ + const float c4 = 0.886227; \ + const float c5 = 0.247708; \ + vec3 cl00 = vec3(shirr[0].x, shirr[0].y, shirr[0].z); \ + vec3 cl1m1 = vec3(shirr[0].w, shirr[1].x, shirr[1].y); \ + vec3 cl10 = vec3(shirr[1].z, shirr[1].w, shirr[2].x); \ + vec3 cl11 = vec3(shirr[2].y, shirr[2].z, shirr[2].w); \ + vec3 cl2m2 = vec3(shirr[3].x, shirr[3].y, shirr[3].z); \ + vec3 cl2m1 = vec3(shirr[3].w, shirr[4].x, shirr[4].y); \ + vec3 cl20 = vec3(shirr[4].z, shirr[4].w, shirr[5].x); \ + vec3 cl21 = vec3(shirr[5].y, shirr[5].z, shirr[5].w); \ + vec3 cl22 = vec3(shirr[6].x, shirr[6].y, shirr[6].z); \ + return ( \ + c1 * cl22 * (nor.y * nor.y - (-nor.z) * (-nor.z)) + \ + c3 * cl20 * nor.x * nor.x + \ + c4 * cl00 - \ + c5 * cl20 + \ + 2.0 * c1 * cl2m2 * nor.y * (-nor.z) + \ + 2.0 * c1 * cl21 * nor.y * nor.x + \ + 2.0 * c1 * cl2m1 * (-nor.z) * nor.x + \ + 2.0 * c2 * cl11 * nor.y + \ + 2.0 * c2 * cl1m1 * (-nor.z) + \ + 2.0 * c2 * cl10 * nor.x \ + ); \ +} \ +"; ///end } -let str_envmap_equirect: string = ` -vec2 envMapEquirect(const vec3 normal, const float angle) { - const float PI = 3.1415926535; - const float PI2 = PI * 2.0; - float phi = acos(normal.z); - float theta = atan2(-normal.y, normal.x) + PI + angle; - return vec2(theta / PI2, phi / PI); -} -`; +let str_envmap_equirect: string = " \ +vec2 envMapEquirect(const vec3 normal, const float angle) { \ + const float PI = 3.1415926535; \ + const float PI2 = PI * 2.0; \ + float phi = acos(normal.z); \ + float theta = atan2(-normal.y, normal.x) + PI + angle; \ + return vec2(theta / PI2, phi / PI); \ +} \ +"; // Linearly Transformed Cosines // https://eheitzresearch.wordpress.com/415-2/ -let str_ltc_evaluate: string = ` -float integrateEdge(vec3 v1, vec3 v2) { - float cosTheta = dot(v1, v2); - float theta = acos(cosTheta); - float res = cross(v1, v2).z * ((theta > 0.001) ? theta / sin(theta) : 1.0); - return res; -} -float ltcEvaluate(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 += integrateEdge(L0, L1); - sum += integrateEdge(L1, L2); - sum += integrateEdge(L2, L3); - if (n >= 4) sum += integrateEdge(L3, L4); - if (n == 5) sum += integrateEdge(L4, L0); - return max(0.0, -sum); -} -`; +let str_ltc_evaluate: string = " \ +float integrateEdge(vec3 v1, vec3 v2) { \ + float cosTheta = dot(v1, v2); \ + float theta = acos(cosTheta); \ + float res = cross(v1, v2).z * ((theta > 0.001) ? theta / sin(theta) : 1.0); \ + return res; \ +} \ +float ltcEvaluate(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 += integrateEdge(L0, L1); \ + sum += integrateEdge(L1, L2); \ + sum += integrateEdge(L2, L3); \ + if (n >= 4) sum += integrateEdge(L3, L4); \ + if (n == 5) sum += integrateEdge(L4, L0); \ + return max(0.0, -sum); \ +} \ +"; -let str_get_pos_from_depth: string = ` -vec3 get_pos_from_depth(vec2 uv, mat4 invVP, textureArg(gbufferD)) { - #if defined(HLSL) || defined(METAL) || defined(SPIRV) - float depth = textureLod(gbufferD, vec2(uv.x, 1.0 - uv.y), 0.0).r; - #else - float depth = textureLod(gbufferD, uv, 0.0).r; - #endif - vec4 wpos = vec4(uv * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0); - wpos = mul(wpos, invVP); - return wpos.xyz / wpos.w; -} -`; +let str_get_pos_from_depth: string = " \ +vec3 get_pos_from_depth(vec2 uv, mat4 invVP, textureArg(gbufferD)) { \ + #if defined(HLSL) || defined(METAL) || defined(SPIRV) \ + float depth = textureLod(gbufferD, vec2(uv.x, 1.0 - uv.y), 0.0).r; \ + #else \ + float depth = textureLod(gbufferD, uv, 0.0).r; \ + #endif \ + vec4 wpos = vec4(uv * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0); \ + wpos = mul(wpos, invVP); \ + return wpos.xyz / wpos.w; \ +} \ +"; -let str_get_nor_from_depth: string = ` -vec3 get_nor_from_depth(vec3 p0, vec2 uv, mat4 invVP, vec2 texStep, textureArg(gbufferD)) { - vec3 p1 = get_pos_from_depth(uv + vec2(texStep.x * 4.0, 0.0), invVP, texturePass(gbufferD)); - vec3 p2 = get_pos_from_depth(uv + vec2(0.0, texStep.y * 4.0), invVP, texturePass(gbufferD)); - return normalize(cross(p2 - p0, p1 - p0)); -} -`; +let str_get_nor_from_depth: string = " \ +vec3 get_nor_from_depth(vec3 p0, vec2 uv, mat4 invVP, vec2 texStep, textureArg(gbufferD)) { \ + vec3 p1 = get_pos_from_depth(uv + vec2(texStep.x * 4.0, 0.0), invVP, texturePass(gbufferD)); \ + vec3 p2 = get_pos_from_depth(uv + vec2(0.0, texStep.y * 4.0), invVP, texturePass(gbufferD)); \ + return normalize(cross(p2 - p0, p1 - p0)); \ +} \ +"; diff --git a/base/Sources/tab_materials.ts b/base/Sources/tab_materials.ts index 54464c31..a781573d 100644 --- a/base/Sources/tab_materials.ts +++ b/base/Sources/tab_materials.ts @@ -43,7 +43,7 @@ function tab_materials_button_nodes() { ui_base_show_material_nodes(); } else if (ui.is_hovered) { - zui_tooltip(tr("Show Node Editor") + ` (${config_keymap.toggle_node_editor})`); + zui_tooltip(tr("Show Node Editor") + " (" + config_keymap.toggle_node_editor + ")"); } } diff --git a/base/Sources/tab_meshes.ts b/base/Sources/tab_meshes.ts index 69442f0f..9bfb4cfe 100644 --- a/base/Sources/tab_meshes.ts +++ b/base/Sources/tab_meshes.ts @@ -26,7 +26,7 @@ function tab_meshes_draw(htab: zui_handle_t) { if (zui_button(tr("Import"))) { ui_menu_draw(function (ui: zui_t) { - if (ui_menu_button(ui, tr("Replace Existing"), `${config_keymap.file_import_assets}`)) { + if (ui_menu_button(ui, tr("Replace Existing"), config_keymap.file_import_assets)) { project_import_mesh(true); } if (ui_menu_button(ui, tr("Append"))) { diff --git a/base/Sources/tab_textures.ts b/base/Sources/tab_textures.ts index 2b3485b0..37890bc2 100644 --- a/base/Sources/tab_textures.ts +++ b/base/Sources/tab_textures.ts @@ -20,7 +20,7 @@ function tab_textures_draw(htab: zui_handle_t) { }); } if (ui.is_hovered) { - zui_tooltip(tr("Import texture file") + ` (${config_keymap.file_import_assets})`); + zui_tooltip(tr("Import texture file") + " (" + config_keymap.file_import_assets + ")"); } if (zui_button(tr("2D View"))) { diff --git a/base/Sources/translator.ts b/base/Sources/translator.ts index fbb1bffa..119dbd42 100644 --- a/base/Sources/translator.ts +++ b/base/Sources/translator.ts @@ -5,26 +5,28 @@ let translator_cjk_font_indices: map_t = null; let translator_last_locale: string = "en"; -// Mark strings as localizable in order to be parsed by the extract_locale script. -// The string will not be translated to the currently selected locale though. +// Mark strings as localizable in order to be parsed by the extract_locale script +// The string will not be translated to the currently selected locale though function _tr(s: string) { return s; } -// Localizes a string with the given placeholders replaced (format is `{placeholderName}`). -// If the string isn't available in the translation, this method will return the source English string. +// Localizes a string with the given placeholders replaced (format is "{placeholder_name}") +// If the string isn't available in the translation, this method will return the source English string function tr(id: string, vars: map_t = null): string { let translation: string = id; // English is the source language - if (config_raw.locale != "en" && translator_translations.has(id)) { + if (config_raw.locale != "en" && map_get(translator_translations, id) != null) { let atranslations: any = translator_translations as any; translation = atranslations[id]; } if (vars != null) { - for (let [key, value] of vars) { - translation = string_replace_all(translation, `{${key}}`, any_to_string(value)); + let keys: string[] = map_keys_to_array(vars); + let values: string[] = map_to_array(vars); + for (let i: i32 = 0; i < keys.length; ++i) { + translation = string_replace_all(translation, "{" + keys[i] + "}", any_to_string(values[i])); } } @@ -65,7 +67,7 @@ function translator_load_translations(new_locale: string) { if (config_raw.locale != "en") { // Load the translation file - let translation_json: string = sys_buffer_to_string(krom_load_blob(`data/locale/${config_raw.locale}.json`)); + let translation_json: string = sys_buffer_to_string(krom_load_blob("data/locale/" + config_raw.locale + ".json")); let data: any = json_parse(translation_json); for (let field in data) { @@ -129,7 +131,7 @@ function translator_init_font(cjk: bool, font_path: string, font_scale: f32) { let f: g2_font_t = data_get_font(font_path); if (cjk) { let acjk_font_indices: any = translator_cjk_font_indices as any; - let font_index: i32 = translator_cjk_font_indices.has(config_raw.locale) ? acjk_font_indices[config_raw.locale] : 0; + let font_index: i32 = map_get(translator_cjk_font_indices, config_raw.locale) != null ? acjk_font_indices[config_raw.locale] : 0; g2_font_set_font_index(f, font_index); } base_font = f; @@ -162,7 +164,7 @@ function translator_extended_glyphs() { function translator_get_supported_locales(): string[] { let locales: string[] = ["system", "en"]; for (let locale_filename of file_read_directory(path_data() + path_sep + "locale")) { - // Trim the `.json` file extension from file names + // Trim the ".json" file extension from file names array_push(locales, substring(locale_filename, 0, locale_filename.length - 5)); } return locales; diff --git a/base/Sources/ui_base.ts b/base/Sources/ui_base.ts index 901a9807..7abad9a2 100644 --- a/base/Sources/ui_base.ts +++ b/base/Sources/ui_base.ts @@ -883,7 +883,8 @@ function ui_base_operator_search() { let count: i32 = 0; let BUTTON_COL: i32 = ui.t.BUTTON_COL; - for (let n in config_keymap) { + for (let i: i32 = 0; i < base_keymap_keys.length; ++i) { + let n: string = base_keymap_keys[i]; if (string_index_of(n, search) >= 0) { ui.t.BUTTON_COL = count == ui_base_operator_search_offset ? ui.t.HIGHLIGHT_COL : ui.t.SEPARATOR_COL; if (zui_button(n, zui_align_t.LEFT, config_keymap[n]) || (enter && count == ui_base_operator_search_offset)) { diff --git a/base/Sources/ui_files.ts b/base/Sources/ui_files.ts index 09a8dced..216959cb 100644 --- a/base/Sources/ui_files.ts +++ b/base/Sources/ui_files.ts @@ -79,7 +79,7 @@ function ui_files_file_browser(ui: zui_t, handle: zui_handle_t, folders_only: bo ///if krom_ios let document_directory: string = krom_save_dialog("", ""); - document_directory = substring(document_directory, 0, document_directory.length - 8); // Strip /'untitled' + document_directory = substring(document_directory, 0, document_directory.length - 8); // Strip /"untitled" ///end if (handle.text == "") handle.text = ui_files_default_path; @@ -231,7 +231,7 @@ function ui_files_file_browser(ui: zui_t, handle: zui_handle_t, folders_only: bo } let key: string = handle.text + path_sep + f; icon = map_get(ui_files_icon_map, key); - if (!ui_files_icon_map.has(key)) { + if (map_get(ui_files_icon_map, key) == null) { let blob_path: string = key; ///if krom_ios diff --git a/base/Sources/ui_header.ts b/base/Sources/ui_header.ts index 3c7d1313..22bfd95c 100644 --- a/base/Sources/ui_header.ts +++ b/base/Sources/ui_header.ts @@ -162,13 +162,13 @@ function ui_header_draw_tool_properties(ui: zui_t) { zui_tooltip(tr("Add picked color to swatches")); } - zui_text(tr("Base") + ` (${base_r_picked},${base_g_picked},${base_b_picked})`); - zui_text(tr("Normal") + ` (${normal_r_picked},${normal_g_picked},${normal_b_picked})`); - zui_text(tr("Occlusion") + ` (${occlusion_picked})`); - zui_text(tr("Roughness") + ` (${roughness_picked})`); - zui_text(tr("Metallic") + ` (${metallic_picked})`); - zui_text(tr("Height") + ` (${height_picked})`); - zui_text(tr("Opacity") + ` (${opacity_picked})`); + zui_text(tr("Base") + " (" + base_r_picked + "," + base_g_picked + "," + base_b_picked + ")"); + zui_text(tr("Normal") + " (" + normal_r_picked + "," + normal_g_picked + "," + normal_b_picked + ")"); + zui_text(tr("Occlusion") + " (" + occlusion_picked + ")"); + zui_text(tr("Roughness") + " (" + roughness_picked + ")"); + zui_text(tr("Metallic") + " (" + metallic_picked + ")"); + zui_text(tr("Height") + " (" + height_picked + ")"); + zui_text(tr("Opacity") + " (" + opacity_picked + ")"); context_raw.picker_select_material = zui_check(zui_handle("uiheader_1", { selected: context_raw.picker_select_material }), tr("Select Material")); zui_combo(context_raw.picker_mask_handle, [tr("None"), tr("Material")], tr("Mask"), true); if (context_raw.picker_mask_handle.changed) { diff --git a/base/Sources/ui_menu.ts b/base/Sources/ui_menu.ts index 6a18b068..877a5155 100644 --- a/base/Sources/ui_menu.ts +++ b/base/Sources/ui_menu.ts @@ -455,7 +455,7 @@ function ui_menu_render() { ui_menu_align(ui); context_raw.camera_type = zui_inline_radio(context_raw.cam_handle, [tr("Perspective"), tr("Orthographic")], zui_align_t.LEFT); if (ui.is_hovered) { - zui_tooltip(tr("Camera Type") + ` (${config_keymap.view_camera_type})`); + zui_tooltip(tr("Camera Type") + " (" + config_keymap.view_camera_type + ")"); } if (context_raw.cam_handle.changed) { viewport_update_camera_type(context_raw.camera_type); @@ -536,7 +536,7 @@ function ui_menu_render() { ///if krom_windows let save: string = (path_is_protected() ? krom_save_path() : path_data()) + path_sep + "tmp.txt"; - krom_sys_command('wmic path win32_VideoController get name > "' + save + '"'); + krom_sys_command("wmic path win32_VideoController get name > \"" + save + "\""); let blob: buffer_t = krom_load_blob(save); let u8: u8_array_t = u8_array_create_from_buffer(blob); let gpu_raw: string = ""; @@ -553,7 +553,7 @@ function ui_menu_render() { gpu += trim_end(g) + ", "; } gpu = substring(gpu, 0, gpu.length - 2); - msg += `\n${gpu}`; + msg += "\n" + gpu; ///else // { lshw -C display } ///end diff --git a/base/Sources/ui_nodes.ts b/base/Sources/ui_nodes.ts index 752f653d..0d4db75e 100644 --- a/base/Sources/ui_nodes.ts +++ b/base/Sources/ui_nodes.ts @@ -1090,7 +1090,7 @@ function ui_nodes_render() { } } if (ui_nodes_ui.is_hovered) { - zui_tooltip(tr("Search for nodes") + ` (${config_keymap.node_search})`); + zui_tooltip(tr("Search for nodes") + " (" + config_keymap.node_search + ")"); } ui_nodes_ui._x += ui_nodes_ui._w + 3; ui_nodes_ui._y = 2 + start_y;