This commit is contained in:
luboslenco
2024-01-26 16:50:04 +01:00
parent 6a4d245ae6
commit 257390f3ec
76 changed files with 2674 additions and 2668 deletions
+2 -2
View File
@@ -17,7 +17,7 @@ class MakeMaterial {
}
}
let con = MakeMesh.run(new NodeShaderData({ name: "Material", canvas: null }));
let con = MakeMesh.run({ name: "Material", canvas: null });
let scon = new ShaderContext(con.data, (scon: ShaderContext) => {});
scon.overrideContext = {};
if (con.frag.sharedSamplers.length > 0) {
@@ -78,7 +78,7 @@ class MakeMaterial {
}
}
let sdata = new NodeShaderData({ name: "Material", canvas: null });
let sdata: TMaterial = { name: "Material", canvas: null };
let mcon: TMaterialContext = { name: "paint", bind_textures: [] };
let con = MakePaint.run(sdata, mcon);
+132 -132
View File
@@ -3,8 +3,8 @@ class MakeMesh {
static layerPassCount = 1;
static run = (data: NodeShaderData, layerPass = 0): NodeShaderContext => {
let con_mesh: NodeShaderContext = data.add_context({
static run = (data: TMaterial, layerPass = 0): NodeShaderContextRaw => {
let con_mesh = NodeShaderContext.create(data, {
name: "mesh",
depth_write: layerPass == 0 ? true : false,
compare_mode: layerPass == 0 ? "less" : "equal",
@@ -14,224 +14,224 @@ class MakeMesh {
depth_attachment: "DEPTH32"
});
let vert = con_mesh.make_vert();
let frag = con_mesh.make_frag();
let vert = NodeShaderContext.make_vert(con_mesh);
let frag = NodeShaderContext.make_frag(con_mesh);
frag.ins = vert.outs;
vert.add_out('vec2 texCoord');
NodeShader.add_out(vert, 'vec2 texCoord');
frag.wvpposition = true;
vert.add_out('vec4 prevwvpposition');
vert.add_uniform('mat4 VP', '_viewProjectionMatrix');
vert.add_uniform('mat4 prevWVP', '_prevWorldViewProjectionMatrix');
NodeShader.add_out(vert, 'vec4 prevwvpposition');
NodeShader.add_uniform(vert, 'mat4 VP', '_viewProjectionMatrix');
NodeShader.add_uniform(vert, 'mat4 prevWVP', '_prevWorldViewProjectionMatrix');
vert.wposition = true;
let textureCount = 0;
let displaceStrength = MakeMaterial.getDisplaceStrength();
if (MakeMaterial.heightUsed && displaceStrength > 0.0) {
vert.n = true;
vert.write('float height = 0.0;');
NodeShader.write(vert, 'float height = 0.0;');
let numLayers = 1;
vert.write(`wposition += wnormal * vec3(height, height, height) * vec3(${displaceStrength}, ${displaceStrength}, ${displaceStrength});`);
NodeShader.write(vert, `wposition += wnormal * vec3(height, height, height) * vec3(${displaceStrength}, ${displaceStrength}, ${displaceStrength});`);
}
vert.write('gl_Position = mul(vec4(wposition.xyz, 1.0), VP);');
NodeShader.write(vert, 'gl_Position = mul(vec4(wposition.xyz, 1.0), VP);');
let brushScale = Context.raw.brushScale;
vert.add_uniform('float texScale', '_texUnpack');
vert.write(`texCoord = tex * ${brushScale} * texScale;`);
NodeShader.add_uniform(vert, 'float texScale', '_texUnpack');
NodeShader.write(vert, `texCoord = tex * ${brushScale} * texScale;`);
if (MakeMaterial.heightUsed && displaceStrength > 0) {
vert.add_uniform('mat4 invW', '_inverseWorldMatrix');
vert.write('prevwvpposition = mul(mul(vec4(wposition, 1.0), invW), prevWVP);');
NodeShader.add_uniform(vert, 'mat4 invW', '_inverseWorldMatrix');
NodeShader.write(vert, 'prevwvpposition = mul(mul(vec4(wposition, 1.0), invW), prevWVP);');
}
else {
vert.write('prevwvpposition = mul(vec4(pos.xyz, 1.0), prevWVP);');
NodeShader.write(vert, 'prevwvpposition = mul(vec4(pos.xyz, 1.0), prevWVP);');
}
frag.add_out('vec4 fragColor[3]');
NodeShader.add_out(frag, 'vec4 fragColor[3]');
frag.n = true;
frag.add_function(ShaderFunctions.str_packFloatInt16);
frag.add_function(ShaderFunctions.str_octahedronWrap);
frag.add_function(ShaderFunctions.str_cotangentFrame);
NodeShader.add_function(frag, ShaderFunctions.str_packFloatInt16);
NodeShader.add_function(frag, ShaderFunctions.str_octahedronWrap);
NodeShader.add_function(frag, ShaderFunctions.str_cotangentFrame);
frag.write('vec3 basecol = vec3(0.0, 0.0, 0.0);');
frag.write('float roughness = 0.0;');
frag.write('float metallic = 0.0;');
frag.write('float occlusion = 1.0;');
frag.write('float opacity = 1.0;');
frag.write('float matid = 0.0;');
frag.write('vec3 ntex = vec3(0.5, 0.5, 1.0);');
frag.write('float height = 0.0;');
NodeShader.write(frag, 'vec3 basecol = vec3(0.0, 0.0, 0.0);');
NodeShader.write(frag, 'float roughness = 0.0;');
NodeShader.write(frag, 'float metallic = 0.0;');
NodeShader.write(frag, 'float occlusion = 1.0;');
NodeShader.write(frag, 'float opacity = 1.0;');
NodeShader.write(frag, 'float matid = 0.0;');
NodeShader.write(frag, 'vec3 ntex = vec3(0.5, 0.5, 1.0);');
NodeShader.write(frag, 'float height = 0.0;');
frag.write('vec4 texpaint_sample = vec4(0.0, 0.0, 0.0, 1.0);');
frag.write('vec4 texpaint_nor_sample;');
frag.write('vec4 texpaint_pack_sample;');
frag.write('float texpaint_opac;');
NodeShader.write(frag, 'vec4 texpaint_sample = vec4(0.0, 0.0, 0.0, 1.0);');
NodeShader.write(frag, 'vec4 texpaint_nor_sample;');
NodeShader.write(frag, 'vec4 texpaint_pack_sample;');
NodeShader.write(frag, 'float texpaint_opac;');
if (MakeMaterial.heightUsed) {
frag.write('float height0 = 0.0;');
frag.write('float height1 = 0.0;');
frag.write('float height2 = 0.0;');
frag.write('float height3 = 0.0;');
NodeShader.write(frag, 'float height0 = 0.0;');
NodeShader.write(frag, 'float height1 = 0.0;');
NodeShader.write(frag, 'float height2 = 0.0;');
NodeShader.write(frag, 'float height3 = 0.0;');
}
if (Context.raw.viewportMode == ViewLit && Context.raw.renderMode == RenderForward) {
frag.add_uniform('sampler2D senvmapBrdf', "$brdf.k");
frag.add_uniform('sampler2D senvmapRadiance', '_envmapRadiance');
frag.add_uniform('sampler2D sltcMat', '_ltcMat');
frag.add_uniform('sampler2D sltcMag', '_ltcMag');
NodeShader.add_uniform(frag, 'sampler2D senvmapBrdf', "$brdf.k");
NodeShader.add_uniform(frag, 'sampler2D senvmapRadiance', '_envmapRadiance');
NodeShader.add_uniform(frag, 'sampler2D sltcMat', '_ltcMat');
NodeShader.add_uniform(frag, 'sampler2D sltcMag', '_ltcMag');
}
frag.add_shared_sampler('sampler2D texpaint');
frag.write('texpaint_sample = textureLodShared(texpaint' + ', texCoord, 0.0);');
frag.write('texpaint_opac = texpaint_sample.a;');
NodeShader.add_shared_sampler(frag, 'sampler2D texpaint');
NodeShader.write(frag, 'texpaint_sample = textureLodShared(texpaint' + ', texCoord, 0.0);');
NodeShader.write(frag, 'texpaint_opac = texpaint_sample.a;');
frag.write('basecol = texpaint_sample.rgb * texpaint_opac;');
NodeShader.write(frag, 'basecol = texpaint_sample.rgb * texpaint_opac;');
frag.add_shared_sampler('sampler2D texpaint_nor');
frag.write('texpaint_nor_sample = textureLodShared(texpaint_nor' + ', texCoord, 0.0);');
NodeShader.add_shared_sampler(frag, 'sampler2D texpaint_nor');
NodeShader.write(frag, 'texpaint_nor_sample = textureLodShared(texpaint_nor' + ', texCoord, 0.0);');
frag.write('ntex = mix(ntex, texpaint_nor_sample.rgb, texpaint_opac);');
NodeShader.write(frag, 'ntex = mix(ntex, texpaint_nor_sample.rgb, texpaint_opac);');
frag.add_shared_sampler('sampler2D texpaint_pack');
frag.write('texpaint_pack_sample = textureLodShared(texpaint_pack' + ', texCoord, 0.0);');
NodeShader.add_shared_sampler(frag, 'sampler2D texpaint_pack');
NodeShader.write(frag, 'texpaint_pack_sample = textureLodShared(texpaint_pack' + ', texCoord, 0.0);');
frag.write('occlusion = mix(occlusion, texpaint_pack_sample.r, texpaint_opac);');
NodeShader.write(frag, 'occlusion = mix(occlusion, texpaint_pack_sample.r, texpaint_opac);');
frag.write('roughness = mix(roughness, texpaint_pack_sample.g, texpaint_opac);');
NodeShader.write(frag, 'roughness = mix(roughness, texpaint_pack_sample.g, texpaint_opac);');
frag.write('metallic = mix(metallic, texpaint_pack_sample.b, texpaint_opac);');
NodeShader.write(frag, 'metallic = mix(metallic, texpaint_pack_sample.b, texpaint_opac);');
frag.write('height = texpaint_pack_sample.a * texpaint_opac;');
NodeShader.write(frag, 'height = texpaint_pack_sample.a * texpaint_opac;');
// if (l.paintHeight && MakeMaterial.heightUsed) {
// let assign = l.paintHeightBlend ? "+=" : "=";
// frag.write(`height ${assign} texpaint_pack_sample.a * texpaint_opac;`);
// frag.write('{');
// frag.add_uniform('vec2 texpaintSize', '_texpaintSize');
// frag.write('float tex_step = 1.0 / texpaintSize.x;');
// frag.write(`height0 ${assign} textureLodShared(texpaint_pack` + ', vec2(texCoord.x - tex_step, texCoord.y), 0.0).a * texpaint_opac;');
// frag.write(`height1 ${assign} textureLodShared(texpaint_pack` + ', vec2(texCoord.x + tex_step, texCoord.y), 0.0).a * texpaint_opac;');
// frag.write(`height2 ${assign} textureLodShared(texpaint_pack` + ', vec2(texCoord.x, texCoord.y - tex_step), 0.0).a * texpaint_opac;');
// frag.write(`height3 ${assign} textureLodShared(texpaint_pack` + ', vec2(texCoord.x, texCoord.y + tex_step), 0.0).a * texpaint_opac;');
// frag.write('}');
// NodeShader.write(frag, `height ${assign} texpaint_pack_sample.a * texpaint_opac;`);
// NodeShader.write(frag, '{');
// NodeShader.add_uniform(frag, 'vec2 texpaintSize', '_texpaintSize');
// NodeShader.write(frag, 'float tex_step = 1.0 / texpaintSize.x;');
// NodeShader.write(frag, `height0 ${assign} textureLodShared(texpaint_pack` + ', vec2(texCoord.x - tex_step, texCoord.y), 0.0).a * texpaint_opac;');
// NodeShader.write(frag, `height1 ${assign} textureLodShared(texpaint_pack` + ', vec2(texCoord.x + tex_step, texCoord.y), 0.0).a * texpaint_opac;');
// NodeShader.write(frag, `height2 ${assign} textureLodShared(texpaint_pack` + ', vec2(texCoord.x, texCoord.y - tex_step), 0.0).a * texpaint_opac;');
// NodeShader.write(frag, `height3 ${assign} textureLodShared(texpaint_pack` + ', vec2(texCoord.x, texCoord.y + tex_step), 0.0).a * texpaint_opac;');
// NodeShader.write(frag, '}');
// }
if (MakeMaterial.heightUsed) {
frag.write('if (height > 0.0) {');
frag.write('float height_dx = height0 - height1;');
frag.write('float height_dy = height2 - height3;');
NodeShader.write(frag, 'if (height > 0.0) {');
NodeShader.write(frag, 'float height_dx = height0 - height1;');
NodeShader.write(frag, 'float height_dy = height2 - height3;');
// Whiteout blend
frag.write('vec3 n1 = ntex * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0);');
frag.write('vec3 n2 = normalize(vec3(height_dx * 16.0, height_dy * 16.0, 1.0));');
frag.write('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);');
frag.write('}');
NodeShader.write(frag, 'vec3 n1 = ntex * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0);');
NodeShader.write(frag, 'vec3 n2 = normalize(vec3(height_dx * 16.0, height_dy * 16.0, 1.0));');
NodeShader.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);');
NodeShader.write(frag, '}');
}
frag.vVec = true;
///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan)
frag.write('mat3 TBN = cotangentFrame(n, vVec, texCoord);');
NodeShader.write(frag, 'mat3 TBN = cotangentFrame(n, vVec, texCoord);');
///else
frag.write('mat3 TBN = cotangentFrame(n, -vVec, texCoord);');
NodeShader.write(frag, 'mat3 TBN = cotangentFrame(n, -vVec, texCoord);');
///end
frag.write('n = ntex * 2.0 - 1.0;');
frag.write('n.y = -n.y;');
frag.write('n = normalize(mul(n, TBN));');
NodeShader.write(frag, 'n = ntex * 2.0 - 1.0;');
NodeShader.write(frag, 'n.y = -n.y;');
NodeShader.write(frag, 'n = normalize(mul(n, TBN));');
if (Context.raw.viewportMode == ViewLit || Context.raw.viewportMode == ViewPathTrace) {
frag.write('basecol = pow(basecol, vec3(2.2, 2.2, 2.2));');
NodeShader.write(frag, 'basecol = pow(basecol, vec3(2.2, 2.2, 2.2));');
if (Context.raw.viewportShader != null) {
let color = Context.raw.viewportShader(frag);
frag.write(`fragColor[1] = vec4(${color}, 1.0);`);
NodeShader.write(frag, `fragColor[1] = vec4(${color}, 1.0);`);
}
else if (Context.raw.renderMode == RenderForward && Context.raw.viewportMode != ViewPathTrace) {
frag.wposition = true;
frag.write('vec3 albedo = mix(basecol, vec3(0.0, 0.0, 0.0), metallic);');
frag.write('vec3 f0 = mix(vec3(0.04, 0.04, 0.04), basecol, metallic);');
NodeShader.write(frag, 'vec3 albedo = mix(basecol, vec3(0.0, 0.0, 0.0), metallic);');
NodeShader.write(frag, 'vec3 f0 = mix(vec3(0.04, 0.04, 0.04), basecol, metallic);');
frag.vVec = true;
frag.write('float dotNV = max(0.0, dot(n, vVec));');
frag.write('vec2 envBRDF = texelFetch(senvmapBrdf, ivec2(vec2(roughness, 1.0 - dotNV) * 256.0), 0).xy;');
frag.add_uniform('int envmapNumMipmaps', '_envmapNumMipmaps');
frag.add_uniform('vec4 envmapData', '_envmapData'); // angle, sin(angle), cos(angle), strength
frag.write('vec3 wreflect = reflect(-vVec, n);');
frag.write('float envlod = roughness * float(envmapNumMipmaps);');
frag.add_function(ShaderFunctions.str_envMapEquirect);
frag.write('vec3 prefilteredColor = textureLod(senvmapRadiance, envMapEquirect(wreflect, envmapData.x), envlod).rgb;');
frag.add_uniform('vec3 lightArea0', '_lightArea0');
frag.add_uniform('vec3 lightArea1', '_lightArea1');
frag.add_uniform('vec3 lightArea2', '_lightArea2');
frag.add_uniform('vec3 lightArea3', '_lightArea3');
frag.add_function(ShaderFunctions.str_ltcEvaluate);
frag.add_uniform('vec3 lightPos', '_pointPosition');
frag.add_uniform('vec3 lightColor', '_pointColor');
frag.write('float ldist = distance(wposition, lightPos);');
frag.write('const float LUT_SIZE = 64.0;');
frag.write('const float LUT_SCALE = (LUT_SIZE - 1.0) / LUT_SIZE;');
frag.write('const float LUT_BIAS = 0.5 / LUT_SIZE;');
frag.write('float theta = acos(dotNV);');
frag.write('vec2 tuv = vec2(roughness, theta / (0.5 * 3.14159265));');
frag.write('tuv = tuv * LUT_SCALE + LUT_BIAS;');
frag.write('vec4 t = textureLod(sltcMat, tuv, 0.0);');
frag.write('mat3 minv = mat3(vec3(1.0, 0.0, t.y), vec3(0.0, t.z, 0.0), vec3(t.w, 0.0, t.x));');
frag.write('float ltcspec = ltcEvaluate(n, vVec, dotNV, wposition, minv, lightArea0, lightArea1, lightArea2, lightArea3);');
frag.write('ltcspec *= textureLod(sltcMag, tuv, 0.0).a;');
frag.write('mat3 mident = mat3(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0);');
frag.write('float ltcdiff = ltcEvaluate(n, vVec, dotNV, wposition, mident, lightArea0, lightArea1, lightArea2, lightArea3);');
frag.write('vec3 direct = albedo * ltcdiff + ltcspec * 0.05;');
frag.write('direct *= lightColor * (1.0 / (ldist * ldist));');
NodeShader.write(frag, 'float dotNV = max(0.0, dot(n, vVec));');
NodeShader.write(frag, 'vec2 envBRDF = texelFetch(senvmapBrdf, ivec2(vec2(roughness, 1.0 - dotNV) * 256.0), 0).xy;');
NodeShader.add_uniform(frag, 'int envmapNumMipmaps', '_envmapNumMipmaps');
NodeShader.add_uniform(frag, 'vec4 envmapData', '_envmapData'); // angle, sin(angle), cos(angle), strength
NodeShader.write(frag, 'vec3 wreflect = reflect(-vVec, n);');
NodeShader.write(frag, 'float envlod = roughness * float(envmapNumMipmaps);');
NodeShader.add_function(frag, ShaderFunctions.str_envMapEquirect);
NodeShader.write(frag, 'vec3 prefilteredColor = textureLod(senvmapRadiance, envMapEquirect(wreflect, envmapData.x), envlod).rgb;');
NodeShader.add_uniform(frag, 'vec3 lightArea0', '_lightArea0');
NodeShader.add_uniform(frag, 'vec3 lightArea1', '_lightArea1');
NodeShader.add_uniform(frag, 'vec3 lightArea2', '_lightArea2');
NodeShader.add_uniform(frag, 'vec3 lightArea3', '_lightArea3');
NodeShader.add_function(frag, ShaderFunctions.str_ltcEvaluate);
NodeShader.add_uniform(frag, 'vec3 lightPos', '_pointPosition');
NodeShader.add_uniform(frag, 'vec3 lightColor', '_pointColor');
NodeShader.write(frag, 'float ldist = distance(wposition, lightPos);');
NodeShader.write(frag, 'const float LUT_SIZE = 64.0;');
NodeShader.write(frag, 'const float LUT_SCALE = (LUT_SIZE - 1.0) / LUT_SIZE;');
NodeShader.write(frag, 'const float LUT_BIAS = 0.5 / LUT_SIZE;');
NodeShader.write(frag, 'float theta = acos(dotNV);');
NodeShader.write(frag, 'vec2 tuv = vec2(roughness, theta / (0.5 * 3.14159265));');
NodeShader.write(frag, 'tuv = tuv * LUT_SCALE + LUT_BIAS;');
NodeShader.write(frag, 'vec4 t = textureLod(sltcMat, tuv, 0.0);');
NodeShader.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));');
NodeShader.write(frag, 'float ltcspec = ltcEvaluate(n, vVec, dotNV, wposition, minv, lightArea0, lightArea1, lightArea2, lightArea3);');
NodeShader.write(frag, 'ltcspec *= textureLod(sltcMag, tuv, 0.0).a;');
NodeShader.write(frag, 'mat3 mident = mat3(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0);');
NodeShader.write(frag, 'float ltcdiff = ltcEvaluate(n, vVec, dotNV, wposition, mident, lightArea0, lightArea1, lightArea2, lightArea3);');
NodeShader.write(frag, 'vec3 direct = albedo * ltcdiff + ltcspec * 0.05;');
NodeShader.write(frag, 'direct *= lightColor * (1.0 / (ldist * ldist));');
frag.add_uniform('vec4 shirr[7]', '_envmapIrradiance');
frag.add_function(ShaderFunctions.str_shIrradiance);
frag.write('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);');
frag.write('indirect += prefilteredColor * (f0 * envBRDF.x + envBRDF.y) * 1.5;');
frag.write('indirect *= envmapData.w * occlusion;');
frag.write('fragColor[1] = vec4(direct + indirect, 1.0);');
NodeShader.add_uniform(frag, 'vec4 shirr[7]', '_envmapIrradiance');
NodeShader.add_function(frag, ShaderFunctions.str_shIrradiance);
NodeShader.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);');
NodeShader.write(frag, 'indirect += prefilteredColor * (f0 * envBRDF.x + envBRDF.y) * 1.5;');
NodeShader.write(frag, 'indirect *= envmapData.w * occlusion;');
NodeShader.write(frag, 'fragColor[1] = vec4(direct + indirect, 1.0);');
}
else { // Deferred, Pathtraced
frag.write('fragColor[1] = vec4(basecol, occlusion);');
NodeShader.write(frag, 'fragColor[1] = vec4(basecol, occlusion);');
}
}
else if (Context.raw.viewportMode == ViewBaseColor) {
frag.write('fragColor[1] = vec4(basecol, 1.0);');
NodeShader.write(frag, 'fragColor[1] = vec4(basecol, 1.0);');
}
else if (Context.raw.viewportMode == ViewNormalMap) {
frag.write('fragColor[1] = vec4(ntex.rgb, 1.0);');
NodeShader.write(frag, 'fragColor[1] = vec4(ntex.rgb, 1.0);');
}
else if (Context.raw.viewportMode == ViewOcclusion) {
frag.write('fragColor[1] = vec4(vec3(occlusion, occlusion, occlusion), 1.0);');
NodeShader.write(frag, 'fragColor[1] = vec4(vec3(occlusion, occlusion, occlusion), 1.0);');
}
else if (Context.raw.viewportMode == ViewRoughness) {
frag.write('fragColor[1] = vec4(vec3(roughness, roughness, roughness), 1.0);');
NodeShader.write(frag, 'fragColor[1] = vec4(vec3(roughness, roughness, roughness), 1.0);');
}
else if (Context.raw.viewportMode == ViewMetallic) {
frag.write('fragColor[1] = vec4(vec3(metallic, metallic, metallic), 1.0);');
NodeShader.write(frag, 'fragColor[1] = vec4(vec3(metallic, metallic, metallic), 1.0);');
}
else if (Context.raw.viewportMode == ViewOpacity) {
frag.write('fragColor[1] = vec4(vec3(texpaint_sample.a, texpaint_sample.a, texpaint_sample.a), 1.0);');
NodeShader.write(frag, 'fragColor[1] = vec4(vec3(texpaint_sample.a, texpaint_sample.a, texpaint_sample.a), 1.0);');
}
else if (Context.raw.viewportMode == ViewHeight) {
frag.write('fragColor[1] = vec4(vec3(height, height, height), 1.0);');
NodeShader.write(frag, 'fragColor[1] = vec4(vec3(height, height, height), 1.0);');
}
else {
frag.write('fragColor[1] = vec4(1.0, 0.0, 1.0, 1.0);'); // Pink
NodeShader.write(frag, 'fragColor[1] = vec4(1.0, 0.0, 1.0, 1.0);'); // Pink
}
if (Context.raw.viewportMode != ViewLit && Context.raw.viewportMode != ViewPathTrace) {
frag.write('fragColor[1].rgb = pow(fragColor[1].rgb, vec3(2.2, 2.2, 2.2));');
NodeShader.write(frag, 'fragColor[1].rgb = pow(fragColor[1].rgb, vec3(2.2, 2.2, 2.2));');
}
frag.write('n /= (abs(n.x) + abs(n.y) + abs(n.z));');
frag.write('n.xy = n.z >= 0.0 ? n.xy : octahedronWrap(n.xy);');
frag.write('fragColor[0] = vec4(n.xy, roughness, packFloatInt16(metallic, uint(int(matid * 255.0) % 3)));');
NodeShader.write(frag, 'n /= (abs(n.x) + abs(n.y) + abs(n.z));');
NodeShader.write(frag, 'n.xy = n.z >= 0.0 ? n.xy : octahedronWrap(n.xy);');
NodeShader.write(frag, 'fragColor[0] = vec4(n.xy, roughness, packFloatInt16(metallic, uint(int(matid * 255.0) % 3)));');
frag.write('vec2 posa = (wvpposition.xy / wvpposition.w) * 0.5 + 0.5;');
frag.write('vec2 posb = (prevwvpposition.xy / prevwvpposition.w) * 0.5 + 0.5;');
frag.write('fragColor[2] = vec4(posa - posb, texCoord.xy);');
NodeShader.write(frag, 'vec2 posa = (wvpposition.xy / wvpposition.w) * 0.5 + 0.5;');
NodeShader.write(frag, 'vec2 posb = (prevwvpposition.xy / prevwvpposition.w) * 0.5 + 0.5;');
NodeShader.write(frag, 'fragColor[2] = vec4(posa - posb, texCoord.xy);');
ParserMaterial.finalize(con_mesh);
con_mesh.data.shader_from_source = true;
con_mesh.data.vertex_shader = vert.get();
con_mesh.data.fragment_shader = frag.get();
con_mesh.data.vertex_shader = NodeShader.get(vert);
con_mesh.data.fragment_shader = NodeShader.get(frag);
return con_mesh;
}
}
+150 -150
View File
@@ -1,8 +1,8 @@
class MakePaint {
static run = (data: NodeShaderData, matcon: TMaterialContext): NodeShaderContext => {
let con_paint:NodeShaderContext = data.add_context({
static run = (data: TMaterial, matcon: TMaterialContext): NodeShaderContextRaw => {
let con_paint = NodeShaderContext.create(data, {
name: "paint",
depth_write: false,
compare_mode: "always", // TODO: align texcoords winding order
@@ -20,131 +20,131 @@ class MakePaint {
con_paint.data.color_writes_alpha = [true, true, true, true];
con_paint.allow_vcols = Context.raw.paintObject.data.cols != null;
let vert = con_paint.make_vert();
let frag = con_paint.make_frag();
let vert = NodeShaderContext.make_vert(con_paint);
let frag = NodeShaderContext.make_frag(con_paint);
frag.ins = vert.outs;
if (Context.raw.tool == ToolPicker) {
// Mangle vertices to form full screen triangle
vert.write('gl_Position = vec4(-1.0 + float((gl_VertexID & 1) << 2), -1.0 + float((gl_VertexID & 2) << 1), 0.0, 1.0);');
NodeShader.write(vert, 'gl_Position = vec4(-1.0 + float((gl_VertexID & 1) << 2), -1.0 + float((gl_VertexID & 2) << 1), 0.0, 1.0);');
frag.add_uniform('sampler2D gbuffer2');
frag.add_uniform('vec2 gbufferSize', '_gbufferSize');
frag.add_uniform('vec4 inp', '_inputBrush');
NodeShader.add_uniform(frag, 'sampler2D gbuffer2');
NodeShader.add_uniform(frag, 'vec2 gbufferSize', '_gbufferSize');
NodeShader.add_uniform(frag, 'vec4 inp', '_inputBrush');
///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan)
frag.write('vec2 texCoordInp = texelFetch(gbuffer2, ivec2(inp.x * gbufferSize.x, inp.y * gbufferSize.y), 0).ba;');
NodeShader.write(frag, 'vec2 texCoordInp = texelFetch(gbuffer2, ivec2(inp.x * gbufferSize.x, inp.y * gbufferSize.y), 0).ba;');
///else
frag.write('vec2 texCoordInp = texelFetch(gbuffer2, ivec2(inp.x * gbufferSize.x, (1.0 - inp.y) * gbufferSize.y), 0).ba;');
NodeShader.write(frag, 'vec2 texCoordInp = texelFetch(gbuffer2, ivec2(inp.x * gbufferSize.x, (1.0 - inp.y) * gbufferSize.y), 0).ba;');
///end
frag.add_out('vec4 fragColor[4]');
frag.add_uniform('sampler2D texpaint');
frag.add_uniform('sampler2D texpaint_nor');
frag.add_uniform('sampler2D texpaint_pack');
frag.write('fragColor[0] = textureLod(texpaint, texCoordInp, 0.0);');
frag.write('fragColor[1] = textureLod(texpaint_nor, texCoordInp, 0.0);');
frag.write('fragColor[2] = textureLod(texpaint_pack, texCoordInp, 0.0);');
frag.write('fragColor[3].rg = texCoordInp.xy;');
NodeShader.add_out(frag, 'vec4 fragColor[4]');
NodeShader.add_uniform(frag, 'sampler2D texpaint');
NodeShader.add_uniform(frag, 'sampler2D texpaint_nor');
NodeShader.add_uniform(frag, 'sampler2D texpaint_pack');
NodeShader.write(frag, 'fragColor[0] = textureLod(texpaint, texCoordInp, 0.0);');
NodeShader.write(frag, 'fragColor[1] = textureLod(texpaint_nor, texCoordInp, 0.0);');
NodeShader.write(frag, 'fragColor[2] = textureLod(texpaint_pack, texCoordInp, 0.0);');
NodeShader.write(frag, 'fragColor[3].rg = texCoordInp.xy;');
con_paint.data.shader_from_source = true;
con_paint.data.vertex_shader = vert.get();
con_paint.data.fragment_shader = frag.get();
con_paint.data.vertex_shader = NodeShader.get(vert);
con_paint.data.fragment_shader = NodeShader.get(frag);
return con_paint;
}
///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan)
vert.write('vec2 tpos = vec2(tex.x * 2.0 - 1.0, (1.0 - tex.y) * 2.0 - 1.0);');
// vert.write('vec2 tpos = vec2(frac(tex.x * texScale) * 2.0 - 1.0, (1.0 - frac(tex.y * texScale)) * 2.0 - 1.0);'); // 3D View
NodeShader.write(vert, 'vec2 tpos = vec2(tex.x * 2.0 - 1.0, (1.0 - tex.y) * 2.0 - 1.0);');
// NodeShader.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
vert.write('vec2 tpos = vec2(tex.xy * 2.0 - 1.0);');
NodeShader.write(vert, 'vec2 tpos = vec2(tex.xy * 2.0 - 1.0);');
///end
vert.write('gl_Position = vec4(tpos, 0.0, 1.0);');
NodeShader.write(vert, 'gl_Position = vec4(tpos, 0.0, 1.0);');
vert.add_uniform('mat4 WVP', '_worldViewProjectionMatrix');
NodeShader.add_uniform(vert, 'mat4 WVP', '_worldViewProjectionMatrix');
vert.add_out('vec4 ndc');
vert.write_attrib('ndc = mul(vec4(pos.xyz, 1.0), WVP);');
NodeShader.add_out(vert, 'vec4 ndc');
NodeShader.write_attrib(vert, 'ndc = mul(vec4(pos.xyz, 1.0), WVP);');
frag.write_attrib('vec3 sp = vec3((ndc.xyz / ndc.w) * 0.5 + 0.5);');
frag.write_attrib('sp.y = 1.0 - sp.y;');
frag.write_attrib('sp.z -= 0.0001;'); // small bias
NodeShader.write_attrib(frag, 'vec3 sp = vec3((ndc.xyz / ndc.w) * 0.5 + 0.5);');
NodeShader.write_attrib(frag, 'sp.y = 1.0 - sp.y;');
NodeShader.write_attrib(frag, 'sp.z -= 0.0001;'); // small bias
frag.add_uniform('vec4 inp', '_inputBrush');
frag.add_uniform('vec4 inplast', '_inputBrushLast');
frag.add_uniform('float aspectRatio', '_aspectRatioWindowF');
frag.write('vec2 bsp = sp.xy * 2.0 - 1.0;');
frag.write('bsp.x *= aspectRatio;');
frag.write('bsp = bsp * 0.5 + 0.5;');
NodeShader.add_uniform(frag, 'vec4 inp', '_inputBrush');
NodeShader.add_uniform(frag, 'vec4 inplast', '_inputBrushLast');
NodeShader.add_uniform(frag, 'float aspectRatio', '_aspectRatioWindowF');
NodeShader.write(frag, 'vec2 bsp = sp.xy * 2.0 - 1.0;');
NodeShader.write(frag, 'bsp.x *= aspectRatio;');
NodeShader.write(frag, 'bsp = bsp * 0.5 + 0.5;');
frag.add_uniform('sampler2D gbufferD');
NodeShader.add_uniform(frag, 'sampler2D gbufferD');
frag.add_out('vec4 fragColor[4]');
NodeShader.add_out(frag, 'vec4 fragColor[4]');
frag.add_uniform('float brushRadius', '_brushRadius');
frag.add_uniform('float brushOpacity', '_brushOpacity');
frag.add_uniform('float brushHardness', '_brushHardness');
NodeShader.add_uniform(frag, 'float brushRadius', '_brushRadius');
NodeShader.add_uniform(frag, 'float brushOpacity', '_brushOpacity');
NodeShader.add_uniform(frag, 'float brushHardness', '_brushHardness');
if (Context.raw.tool == ToolEraser ||
Context.raw.tool == ToolClone ||
Context.raw.tool == ToolBlur ||
Context.raw.tool == ToolSmudge) {
frag.write('float dist = 0.0;');
NodeShader.write(frag, 'float dist = 0.0;');
///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan)
frag.write('float depth = textureLod(gbufferD, inp.xy, 0.0).r;');
NodeShader.write(frag, 'float depth = textureLod(gbufferD, inp.xy, 0.0).r;');
///else
frag.write('float depth = textureLod(gbufferD, vec2(inp.x, 1.0 - inp.y), 0.0).r;');
NodeShader.write(frag, 'float depth = textureLod(gbufferD, vec2(inp.x, 1.0 - inp.y), 0.0).r;');
///end
frag.add_uniform('mat4 invVP', '_inverseViewProjectionMatrix');
frag.write('vec4 winp = vec4(vec2(inp.x, 1.0 - inp.y) * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0);');
frag.write('winp = mul(winp, invVP);');
frag.write('winp.xyz /= winp.w;');
NodeShader.add_uniform(frag, 'mat4 invVP', '_inverseViewProjectionMatrix');
NodeShader.write(frag, 'vec4 winp = vec4(vec2(inp.x, 1.0 - inp.y) * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0);');
NodeShader.write(frag, 'winp = mul(winp, invVP);');
NodeShader.write(frag, 'winp.xyz /= winp.w;');
frag.wposition = true;
///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan)
frag.write('float depthlast = textureLod(gbufferD, inplast.xy, 0.0).r;');
NodeShader.write(frag, 'float depthlast = textureLod(gbufferD, inplast.xy, 0.0).r;');
///else
frag.write('float depthlast = textureLod(gbufferD, vec2(inplast.x, 1.0 - inplast.y), 0.0).r;');
NodeShader.write(frag, 'float depthlast = textureLod(gbufferD, vec2(inplast.x, 1.0 - inplast.y), 0.0).r;');
///end
frag.write('vec4 winplast = vec4(vec2(inplast.x, 1.0 - inplast.y) * 2.0 - 1.0, depthlast * 2.0 - 1.0, 1.0);');
frag.write('winplast = mul(winplast, invVP);');
frag.write('winplast.xyz /= winplast.w;');
NodeShader.write(frag, 'vec4 winplast = vec4(vec2(inplast.x, 1.0 - inplast.y) * 2.0 - 1.0, depthlast * 2.0 - 1.0, 1.0);');
NodeShader.write(frag, 'winplast = mul(winplast, invVP);');
NodeShader.write(frag, 'winplast.xyz /= winplast.w;');
frag.write('vec3 pa = wposition - winp.xyz;');
frag.write('vec3 ba = winplast.xyz - winp.xyz;');
NodeShader.write(frag, 'vec3 pa = wposition - winp.xyz;');
NodeShader.write(frag, 'vec3 ba = winplast.xyz - winp.xyz;');
// Capsule
frag.write('float h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);');
frag.write('dist = length(pa - ba * h);');
NodeShader.write(frag, 'float h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);');
NodeShader.write(frag, 'dist = length(pa - ba * h);');
frag.write('if (dist > brushRadius) discard;');
NodeShader.write(frag, 'if (dist > brushRadius) discard;');
}
// vert.add_uniform('float brushScale', '_brushScale');
// vert.add_uniform('float texScale', '_texUnpack');
// vert.add_out('vec2 texCoord');
// vert.write('texCoord = tex * brushScale * texScale;');
// NodeShader.add_uniform(vert, 'float brushScale', '_brushScale');
// NodeShader.add_uniform(vert, 'float texScale', '_texUnpack');
// NodeShader.add_out(vert, 'vec2 texCoord');
// NodeShader.write(vert, 'texCoord = tex * brushScale * texScale;');
if (Context.raw.tool == ToolClone || Context.raw.tool == ToolBlur || Context.raw.tool == ToolSmudge) {
frag.add_uniform('sampler2D gbuffer2');
frag.add_uniform('vec2 gbufferSize', '_gbufferSize');
frag.add_uniform('sampler2D texpaint_undo', '_texpaint_undo');
frag.add_uniform('sampler2D texpaint_nor_undo', '_texpaint_nor_undo');
frag.add_uniform('sampler2D texpaint_pack_undo', '_texpaint_pack_undo');
NodeShader.add_uniform(frag, 'sampler2D gbuffer2');
NodeShader.add_uniform(frag, 'vec2 gbufferSize', '_gbufferSize');
NodeShader.add_uniform(frag, 'sampler2D texpaint_undo', '_texpaint_undo');
NodeShader.add_uniform(frag, 'sampler2D texpaint_nor_undo', '_texpaint_nor_undo');
NodeShader.add_uniform(frag, 'sampler2D texpaint_pack_undo', '_texpaint_pack_undo');
if (Context.raw.tool == ToolClone) {
// frag.add_uniform('vec2 cloneDelta', '_cloneDelta');
// NodeShader.add_uniform(frag, 'vec2 cloneDelta', '_cloneDelta');
// ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan)
// frag.write('vec2 texCoordInp = texelFetch(gbuffer2, ivec2((sp.xy + cloneDelta) * gbufferSize), 0).ba;');
// NodeShader.write(frag, 'vec2 texCoordInp = texelFetch(gbuffer2, ivec2((sp.xy + cloneDelta) * gbufferSize), 0).ba;');
// ///else
// frag.write('vec2 texCoordInp = texelFetch(gbuffer2, ivec2((sp.x + cloneDelta.x) * gbufferSize.x, (1.0 - (sp.y + cloneDelta.y)) * gbufferSize.y), 0).ba;');
// NodeShader.write(frag, 'vec2 texCoordInp = texelFetch(gbuffer2, ivec2((sp.x + cloneDelta.x) * gbufferSize.x, (1.0 - (sp.y + cloneDelta.y)) * gbufferSize.y), 0).ba;');
// ///end
// frag.write('vec3 texpaint_pack_sample = textureLod(texpaint_pack_undo, texCoordInp, 0.0).rgb;');
// NodeShader.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';
@@ -152,125 +152,125 @@ class MakePaint {
// let nortan = 'textureLod(texpaint_nor_undo, texCoordInp, 0.0).rgb';
// let height = '0.0';
// let opac = '1.0';
// frag.write(`vec3 basecol = ${base};`);
// frag.write(`float roughness = ${rough};`);
// frag.write(`float metallic = ${met};`);
// frag.write(`float occlusion = ${occ};`);
// frag.write(`vec3 nortan = ${nortan};`);
// frag.write(`float height = ${height};`);
// frag.write(`float mat_opacity = ${opac};`);
// frag.write('float opacity = mat_opacity * brushOpacity;');
// NodeShader.write(frag, `vec3 basecol = ${base};`);
// NodeShader.write(frag, `float roughness = ${rough};`);
// NodeShader.write(frag, `float metallic = ${met};`);
// NodeShader.write(frag, `float occlusion = ${occ};`);
// NodeShader.write(frag, `vec3 nortan = ${nortan};`);
// NodeShader.write(frag, `float height = ${height};`);
// NodeShader.write(frag, `float mat_opacity = ${opac};`);
// NodeShader.write(frag, 'float opacity = mat_opacity * brushOpacity;');
}
else { // Blur
// ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan)
// frag.write('vec2 texCoordInp = texelFetch(gbuffer2, ivec2(sp.x * gbufferSize.x, sp.y * gbufferSize.y), 0).ba;');
// NodeShader.write(frag, 'vec2 texCoordInp = texelFetch(gbuffer2, ivec2(sp.x * gbufferSize.x, sp.y * gbufferSize.y), 0).ba;');
// ///else
// frag.write('vec2 texCoordInp = texelFetch(gbuffer2, ivec2(sp.x * gbufferSize.x, (1.0 - sp.y) * gbufferSize.y), 0).ba;');
// NodeShader.write(frag, 'vec2 texCoordInp = texelFetch(gbuffer2, ivec2(sp.x * gbufferSize.x, (1.0 - sp.y) * gbufferSize.y), 0).ba;');
// ///end
// frag.write('vec3 basecol = vec3(0.0, 0.0, 0.0);');
// frag.write('float roughness = 0.0;');
// frag.write('float metallic = 0.0;');
// frag.write('float occlusion = 0.0;');
// frag.write('vec3 nortan = vec3(0.0, 0.0, 0.0);');
// frag.write('float height = 0.0;');
// frag.write('float mat_opacity = 1.0;');
// frag.write('float opacity = 0.0;');
// NodeShader.write(frag, 'vec3 basecol = vec3(0.0, 0.0, 0.0);');
// NodeShader.write(frag, 'float roughness = 0.0;');
// NodeShader.write(frag, 'float metallic = 0.0;');
// NodeShader.write(frag, 'float occlusion = 0.0;');
// NodeShader.write(frag, 'vec3 nortan = vec3(0.0, 0.0, 0.0);');
// NodeShader.write(frag, 'float height = 0.0;');
// NodeShader.write(frag, 'float mat_opacity = 1.0;');
// NodeShader.write(frag, 'float opacity = 0.0;');
// frag.add_uniform('vec2 texpaintSize', '_texpaintSize');
// frag.write('float blur_step = 1.0 / texpaintSize.x;');
// NodeShader.add_uniform(frag, 'vec2 texpaintSize', '_texpaintSize');
// NodeShader.write(frag, 'float blur_step = 1.0 / texpaintSize.x;');
// if (Context.raw.blurDirectional) {
// ///if (krom_direct3d11 || krom_direct3d12 || krom_metal)
// frag.write('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};');
// NodeShader.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
// frag.write('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);');
// NodeShader.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
// frag.add_uniform('vec3 brushDirection', '_brushDirection');
// frag.write('vec2 blur_direction = brushDirection.yx;');
// frag.write('for (int i = 0; i < 7; ++i) {');
// NodeShader.add_uniform(frag, 'vec3 brushDirection', '_brushDirection');
// NodeShader.write(frag, 'vec2 blur_direction = brushDirection.yx;');
// NodeShader.write(frag, 'for (int i = 0; i < 7; ++i) {');
// ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan)
// frag.write('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;');
// NodeShader.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
// frag.write('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;');
// NodeShader.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
// frag.write('vec4 texpaint_sample = texture(texpaint_undo, texCoordInp2);');
// frag.write('opacity += texpaint_sample.a * blur_weight[i];');
// frag.write('basecol += texpaint_sample.rgb * blur_weight[i];');
// frag.write('vec4 texpaint_pack_sample = texture(texpaint_pack_undo, texCoordInp2) * blur_weight[i];');
// frag.write('roughness += texpaint_pack_sample.g;');
// frag.write('metallic += texpaint_pack_sample.b;');
// frag.write('occlusion += texpaint_pack_sample.r;');
// frag.write('height += texpaint_pack_sample.a;');
// frag.write('nortan += texture(texpaint_nor_undo, texCoordInp2).rgb * blur_weight[i];');
// frag.write('}');
// NodeShader.write(frag, 'vec4 texpaint_sample = texture(texpaint_undo, texCoordInp2);');
// NodeShader.write(frag, 'opacity += texpaint_sample.a * blur_weight[i];');
// NodeShader.write(frag, 'basecol += texpaint_sample.rgb * blur_weight[i];');
// NodeShader.write(frag, 'vec4 texpaint_pack_sample = texture(texpaint_pack_undo, texCoordInp2) * blur_weight[i];');
// NodeShader.write(frag, 'roughness += texpaint_pack_sample.g;');
// NodeShader.write(frag, 'metallic += texpaint_pack_sample.b;');
// NodeShader.write(frag, 'occlusion += texpaint_pack_sample.r;');
// NodeShader.write(frag, 'height += texpaint_pack_sample.a;');
// NodeShader.write(frag, 'nortan += texture(texpaint_nor_undo, texCoordInp2).rgb * blur_weight[i];');
// NodeShader.write(frag, '}');
// }
// else {
// ///if (krom_direct3d11 || krom_direct3d12 || krom_metal)
// frag.write('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};');
// NodeShader.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
// frag.write('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);');
// NodeShader.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
// frag.write('for (int i = -7; i <= 7; ++i) {');
// frag.write('vec4 texpaint_sample = texture(texpaint_undo, texCoordInp + vec2(blur_step * float(i), 0.0));');
// frag.write('opacity += texpaint_sample.a * blur_weight[i + 7];');
// frag.write('basecol += texpaint_sample.rgb * blur_weight[i + 7];');
// frag.write('vec4 texpaint_pack_sample = texture(texpaint_pack_undo, texCoordInp + vec2(blur_step * float(i), 0.0)) * blur_weight[i + 7];');
// frag.write('roughness += texpaint_pack_sample.g;');
// frag.write('metallic += texpaint_pack_sample.b;');
// frag.write('occlusion += texpaint_pack_sample.r;');
// frag.write('height += texpaint_pack_sample.a;');
// frag.write('nortan += texture(texpaint_nor_undo, texCoordInp + vec2(blur_step * float(i), 0.0)).rgb * blur_weight[i + 7];');
// frag.write('}');
// NodeShader.write(frag, 'for (int i = -7; i <= 7; ++i) {');
// NodeShader.write(frag, 'vec4 texpaint_sample = texture(texpaint_undo, texCoordInp + vec2(blur_step * float(i), 0.0));');
// NodeShader.write(frag, 'opacity += texpaint_sample.a * blur_weight[i + 7];');
// NodeShader.write(frag, 'basecol += texpaint_sample.rgb * blur_weight[i + 7];');
// NodeShader.write(frag, 'vec4 texpaint_pack_sample = texture(texpaint_pack_undo, texCoordInp + vec2(blur_step * float(i), 0.0)) * blur_weight[i + 7];');
// NodeShader.write(frag, 'roughness += texpaint_pack_sample.g;');
// NodeShader.write(frag, 'metallic += texpaint_pack_sample.b;');
// NodeShader.write(frag, 'occlusion += texpaint_pack_sample.r;');
// NodeShader.write(frag, 'height += texpaint_pack_sample.a;');
// NodeShader.write(frag, 'nortan += texture(texpaint_nor_undo, texCoordInp + vec2(blur_step * float(i), 0.0)).rgb * blur_weight[i + 7];');
// NodeShader.write(frag, '}');
// // Y
// frag.write('for (int j = -7; j <= 7; ++j) {');
// frag.write('vec4 texpaint_sample = texture(texpaint_undo, texCoordInp + vec2(0.0, blur_step * float(j)));');
// frag.write('opacity += texpaint_sample.a * blur_weight[j + 7];');
// frag.write('basecol += texpaint_sample.rgb * blur_weight[j + 7];');
// frag.write('vec4 texpaint_pack_sample = texture(texpaint_pack_undo, texCoordInp + vec2(0.0, blur_step * float(j))) * blur_weight[j + 7];');
// frag.write('roughness += texpaint_pack_sample.g;');
// frag.write('metallic += texpaint_pack_sample.b;');
// frag.write('occlusion += texpaint_pack_sample.r;');
// frag.write('height += texpaint_pack_sample.a;');
// frag.write('nortan += texture(texpaint_nor_undo, texCoordInp + vec2(0.0, blur_step * float(j))).rgb * blur_weight[j + 7];');
// frag.write('}');
// NodeShader.write(frag, 'for (int j = -7; j <= 7; ++j) {');
// NodeShader.write(frag, 'vec4 texpaint_sample = texture(texpaint_undo, texCoordInp + vec2(0.0, blur_step * float(j)));');
// NodeShader.write(frag, 'opacity += texpaint_sample.a * blur_weight[j + 7];');
// NodeShader.write(frag, 'basecol += texpaint_sample.rgb * blur_weight[j + 7];');
// NodeShader.write(frag, 'vec4 texpaint_pack_sample = texture(texpaint_pack_undo, texCoordInp + vec2(0.0, blur_step * float(j))) * blur_weight[j + 7];');
// NodeShader.write(frag, 'roughness += texpaint_pack_sample.g;');
// NodeShader.write(frag, 'metallic += texpaint_pack_sample.b;');
// NodeShader.write(frag, 'occlusion += texpaint_pack_sample.r;');
// NodeShader.write(frag, 'height += texpaint_pack_sample.a;');
// NodeShader.write(frag, 'nortan += texture(texpaint_nor_undo, texCoordInp + vec2(0.0, blur_step * float(j))).rgb * blur_weight[j + 7];');
// NodeShader.write(frag, '}');
// }
// frag.write('opacity *= brushOpacity;');
// NodeShader.write(frag, 'opacity *= brushOpacity;');
}
}
frag.write('float opacity = 1.0;');
frag.write('if (opacity == 0.0) discard;');
NodeShader.write(frag, 'float opacity = 1.0;');
NodeShader.write(frag, 'if (opacity == 0.0) discard;');
frag.write('float str = clamp((brushRadius - dist) * brushHardness * 400.0, 0.0, 1.0) * opacity;');
NodeShader.write(frag, 'float str = clamp((brushRadius - dist) * brushHardness * 400.0, 0.0, 1.0) * opacity;');
// Manual blending to preserve memory
frag.wvpposition = true;
frag.write('vec2 sample_tc = vec2(wvpposition.xy / wvpposition.w) * 0.5 + 0.5;');
NodeShader.write(frag, 'vec2 sample_tc = vec2(wvpposition.xy / wvpposition.w) * 0.5 + 0.5;');
///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan)
frag.write('sample_tc.y = 1.0 - sample_tc.y;');
NodeShader.write(frag, 'sample_tc.y = 1.0 - sample_tc.y;');
///end
frag.add_uniform('sampler2D paintmask');
frag.write('float sample_mask = textureLod(paintmask, sample_tc, 0.0).r;');
frag.write('str = max(str, sample_mask);');
NodeShader.add_uniform(frag, 'sampler2D paintmask');
NodeShader.write(frag, 'float sample_mask = textureLod(paintmask, sample_tc, 0.0).r;');
NodeShader.write(frag, 'str = max(str, sample_mask);');
frag.add_uniform('sampler2D texpaint_undo', '_texpaint_undo');
frag.write('vec4 sample_undo = textureLod(texpaint_undo, sample_tc, 0.0);');
NodeShader.add_uniform(frag, 'sampler2D texpaint_undo', '_texpaint_undo');
NodeShader.write(frag, 'vec4 sample_undo = textureLod(texpaint_undo, sample_tc, 0.0);');
if (Context.raw.tool == ToolEraser) {
// frag.write('fragColor[0] = vec4(mix(sample_undo.rgb, vec3(0.0, 0.0, 0.0), str), sample_undo.a - str);');
frag.write('fragColor[0] = vec4(0.0, 0.0, 0.0, 0.0);');
frag.write('fragColor[1] = vec4(0.5, 0.5, 1.0, 0.0);');
frag.write('fragColor[2] = vec4(1.0, 0.0, 0.0, 0.0);');
// NodeShader.write(frag, 'fragColor[0] = vec4(mix(sample_undo.rgb, vec3(0.0, 0.0, 0.0), str), sample_undo.a - str);');
NodeShader.write(frag, 'fragColor[0] = vec4(0.0, 0.0, 0.0, 0.0);');
NodeShader.write(frag, 'fragColor[1] = vec4(0.5, 0.5, 1.0, 0.0);');
NodeShader.write(frag, 'fragColor[2] = vec4(1.0, 0.0, 0.0, 0.0);');
}
frag.write('fragColor[3] = vec4(str, 0.0, 0.0, 1.0);');
NodeShader.write(frag, 'fragColor[3] = vec4(str, 0.0, 0.0, 1.0);');
ParserMaterial.finalize(con_paint);
ParserMaterial.sample_keep_aspect = false;
con_paint.data.shader_from_source = true;
con_paint.data.vertex_shader = vert.get();
con_paint.data.fragment_shader = frag.get();
con_paint.data.vertex_shader = NodeShader.get(vert);
con_paint.data.fragment_shader = NodeShader.get(frag);
return con_paint;
}