MakeDiscard.hx 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package arm.node;
  2. import arm.ui.UISidebar;
  3. import arm.shader.NodeShader;
  4. class MakeDiscard {
  5. public static function colorId(vert: NodeShader, frag: NodeShader) {
  6. frag.add_uniform('sampler2D texpaint_colorid'); // 1x1 picker
  7. frag.add_uniform('sampler2D texcolorid', '_texcolorid'); // color map
  8. frag.write('vec3 colorid_c1 = texelFetch(texpaint_colorid, ivec2(0, 0), 0).rgb;');
  9. frag.write('vec3 colorid_c2 = textureLod(texcolorid, texCoordPick, 0).rgb;');
  10. #if (kha_direct3d11 || kha_direct3d12 || kha_metal)
  11. frag.write('if (any(colorid_c1 != colorid_c2)) discard;');
  12. #else
  13. frag.write('if (colorid_c1 != colorid_c2) discard;');
  14. #end
  15. }
  16. public static function face(vert: NodeShader, frag: NodeShader) {
  17. frag.add_uniform('sampler2D gbuffer2');
  18. frag.add_uniform('sampler2D textrianglemap', '_textrianglemap');
  19. frag.add_uniform('vec2 textrianglemapSize', '_texpaintSize');
  20. frag.add_uniform('vec2 gbufferSize', '_gbufferSize');
  21. #if (kha_direct3d11 || kha_direct3d12 || kha_metal || kha_vulkan)
  22. frag.write('vec2 texCoordInp = texelFetch(gbuffer2, ivec2(inp.x * gbufferSize.x, inp.y * gbufferSize.y), 0).ba;');
  23. #else
  24. frag.write('vec2 texCoordInp = texelFetch(gbuffer2, ivec2(inp.x * gbufferSize.x, (1.0 - inp.y) * gbufferSize.y), 0).ba;');
  25. #end
  26. frag.write('vec4 face_c1 = texelFetch(textrianglemap, ivec2(texCoordInp * textrianglemapSize), 0);');
  27. frag.write('vec4 face_c2 = textureLod(textrianglemap, texCoordPick, 0);');
  28. #if (kha_direct3d11 || kha_direct3d12 || kha_metal)
  29. frag.write('if (any(face_c1 != face_c2)) discard;');
  30. #else
  31. frag.write('if (face_c1 != face_c2) discard;');
  32. #end
  33. }
  34. public static function uvIsland(vert: NodeShader, frag: NodeShader) {
  35. frag.add_uniform('sampler2D texuvislandmap', '_texuvislandmap');
  36. frag.write('if (textureLod(texuvislandmap, texCoordPick, 0).r == 0.0) discard;');
  37. }
  38. public static function materialId(vert: NodeShader, frag: NodeShader) {
  39. frag.wvpposition = true;
  40. frag.write('vec2 picker_sample_tc = vec2(wvpposition.x / wvpposition.w, wvpposition.y / wvpposition.w) * 0.5 + 0.5;');
  41. #if (kha_direct3d11 || kha_direct3d12 || kha_metal || kha_vulkan)
  42. frag.write('picker_sample_tc.y = 1.0 - picker_sample_tc.y;');
  43. #end
  44. frag.add_uniform('sampler2D texpaint_nor_undo', '_texpaint_nor_undo');
  45. var matid = Context.materialIdPicked / 255;
  46. frag.write('if ($matid != textureLod(texpaint_nor_undo, picker_sample_tc, 0.0).a) discard;');
  47. }
  48. }