Cleanup
This commit is contained in:
@@ -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
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user