2019-12-06 11:55:43 +01:00
|
|
|
package arm.node;
|
|
|
|
|
|
2020-03-18 20:26:28 +01:00
|
|
|
import arm.ui.UISidebar;
|
2020-08-14 11:12:39 +02:00
|
|
|
import arm.shader.NodeShader;
|
2019-12-06 11:55:43 +01:00
|
|
|
|
|
|
|
|
class MakeDiscard {
|
|
|
|
|
|
2020-08-14 11:12:39 +02:00
|
|
|
public static function colorId(vert: NodeShader, frag: NodeShader) {
|
2020-03-21 15:47:25 +01:00
|
|
|
vert.add_out('vec2 texCoordPick');
|
|
|
|
|
vert.write('texCoordPick = subtex;');
|
2019-12-06 11:55:43 +01:00
|
|
|
frag.add_uniform('sampler2D texpaint_colorid'); // 1x1 picker
|
|
|
|
|
frag.add_uniform('sampler2D texcolorid', '_texcolorid'); // color map
|
|
|
|
|
frag.write('vec3 c1 = texelFetch(texpaint_colorid, ivec2(0, 0), 0).rgb;');
|
2020-03-21 15:47:25 +01:00
|
|
|
frag.write('vec3 c2 = textureLod(texcolorid, texCoordPick, 0).rgb;');
|
2020-08-05 19:26:14 +02:00
|
|
|
#if (kha_direct3d11 || kha_direct3d12 || kha_metal)
|
2019-12-06 11:55:43 +01:00
|
|
|
frag.write('if (any(c1 != c2)) discard;');
|
2020-08-05 19:26:14 +02:00
|
|
|
#else
|
|
|
|
|
frag.write('if (c1 != c2) discard;');
|
2020-01-05 22:15:17 +01:00
|
|
|
#end
|
2019-12-06 11:55:43 +01:00
|
|
|
}
|
|
|
|
|
|
2020-08-14 11:12:39 +02:00
|
|
|
public static function face(vert: NodeShader, frag: NodeShader) {
|
2019-12-06 11:55:43 +01:00
|
|
|
vert.add_out('vec2 texCoordPick');
|
2020-03-20 14:03:01 +01:00
|
|
|
vert.write('texCoordPick = subtex;');
|
2019-12-06 11:55:43 +01:00
|
|
|
frag.add_uniform('sampler2D gbuffer2');
|
|
|
|
|
frag.add_uniform('sampler2D textrianglemap', '_textrianglemap'); // triangle map
|
2020-06-03 16:35:39 +02:00
|
|
|
frag.add_uniform('vec2 textrianglemapSize', '_texpaintSize');
|
2019-12-06 11:55:43 +01:00
|
|
|
frag.add_uniform('vec2 gbufferSize', '_gbufferSize');
|
2020-08-05 19:26:14 +02:00
|
|
|
#if (kha_direct3d11 || kha_direct3d12 || kha_metal || kha_vulkan)
|
2019-12-06 11:55:43 +01:00
|
|
|
frag.write('vec2 texCoordInp = texelFetch(gbuffer2, ivec2(inp.x * gbufferSize.x, inp.y * gbufferSize.y), 0).ba;');
|
2020-08-05 19:26:14 +02:00
|
|
|
#else
|
|
|
|
|
frag.write('vec2 texCoordInp = texelFetch(gbuffer2, ivec2(inp.x * gbufferSize.x, (1.0 - inp.y) * gbufferSize.y), 0).ba;');
|
2019-12-06 11:55:43 +01:00
|
|
|
#end
|
|
|
|
|
frag.write('vec4 c1 = texelFetch(textrianglemap, ivec2(texCoordInp * textrianglemapSize), 0);');
|
2020-03-20 14:03:01 +01:00
|
|
|
frag.write('vec4 c2 = textureLod(textrianglemap, texCoordPick, 0);');
|
2020-08-05 19:26:14 +02:00
|
|
|
#if (kha_direct3d11 || kha_direct3d12 || kha_metal)
|
2019-12-06 11:55:43 +01:00
|
|
|
frag.write('if (any(c1 != c2)) discard;');
|
2020-08-05 19:26:14 +02:00
|
|
|
#else
|
|
|
|
|
frag.write('if (c1 != c2) discard;');
|
2020-01-05 22:15:17 +01:00
|
|
|
#end
|
2019-12-06 11:55:43 +01:00
|
|
|
}
|
|
|
|
|
|
2020-08-14 11:12:39 +02:00
|
|
|
public static function materialId(vert: NodeShader, frag: NodeShader) {
|
2019-12-06 11:55:43 +01:00
|
|
|
frag.wvpposition = true;
|
|
|
|
|
frag.write('vec2 picker_sample_tc = vec2(wvpposition.x / wvpposition.w, wvpposition.y / wvpposition.w) * 0.5 + 0.5;');
|
2020-08-05 19:26:14 +02:00
|
|
|
#if (kha_direct3d11 || kha_direct3d12 || kha_metal || kha_vulkan)
|
2019-12-06 11:55:43 +01:00
|
|
|
frag.write('picker_sample_tc.y = 1.0 - picker_sample_tc.y;');
|
|
|
|
|
#end
|
|
|
|
|
frag.add_uniform('sampler2D texpaint_nor_undo', '_texpaint_nor_undo');
|
2020-03-26 15:22:22 +01:00
|
|
|
var matid = Context.materialIdPicked / 255;
|
2019-12-06 11:55:43 +01:00
|
|
|
frag.write('if ($matid != textureLod(texpaint_nor_undo, picker_sample_tc, 0.0).a) discard;');
|
|
|
|
|
}
|
|
|
|
|
}
|