MakeDiscard.hx 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. package arm.node;
  2. import arm.ui.UITrait;
  3. import arm.node.MaterialShader;
  4. class MakeDiscard {
  5. public static function colorId(vert: MaterialShader, frag: MaterialShader) {
  6. vert.add_out('vec2 texCoordPick');
  7. vert.write('texCoordPick = fract(subtex);');
  8. frag.add_uniform('sampler2D texpaint_colorid'); // 1x1 picker
  9. frag.add_uniform('sampler2D texcolorid', '_texcolorid'); // color map
  10. frag.add_uniform('vec2 texcoloridSize', '_texcoloridSize'); // color map
  11. frag.write('vec3 c1 = texelFetch(texpaint_colorid, ivec2(0, 0), 0).rgb;');
  12. frag.write('vec3 c2 = texelFetch(texcolorid, ivec2(texCoordPick * texcoloridSize), 0).rgb;');
  13. frag.write('if (any(c1 != c2)) discard;');
  14. }
  15. public static function face(vert: MaterialShader, frag: MaterialShader) {
  16. vert.add_out('vec2 texCoordPick');
  17. vert.write('texCoordPick = fract(subtex);');
  18. frag.add_uniform('sampler2D gbuffer2');
  19. frag.add_uniform('sampler2D textrianglemap', '_textrianglemap'); // triangle map
  20. frag.add_uniform('float textrianglemapSize', '_texpaintSize');
  21. frag.add_uniform('vec2 gbufferSize', '_gbufferSize');
  22. #if (kha_opengl || kha_webgl)
  23. frag.write('vec2 texCoordInp = texelFetch(gbuffer2, ivec2(inp.x * gbufferSize.x, (1.0 - inp.y) * gbufferSize.y), 0).ba;');
  24. #else
  25. frag.write('vec2 texCoordInp = texelFetch(gbuffer2, ivec2(inp.x * gbufferSize.x, inp.y * gbufferSize.y), 0).ba;');
  26. #end
  27. frag.write('vec4 c1 = texelFetch(textrianglemap, ivec2(texCoordInp * textrianglemapSize), 0);');
  28. frag.write('vec4 c2 = texelFetch(textrianglemap, ivec2(texCoordPick * textrianglemapSize), 0);');
  29. frag.write('if (any(c1 != c2)) discard;');
  30. }
  31. public static function materialId(vert: MaterialShader, frag: MaterialShader) {
  32. frag.wvpposition = true;
  33. frag.write('vec2 picker_sample_tc = vec2(wvpposition.x / wvpposition.w, wvpposition.y / wvpposition.w) * 0.5 + 0.5;');
  34. #if (kha_direct3d11 || kha_direct3d12)
  35. frag.write('picker_sample_tc.y = 1.0 - picker_sample_tc.y;');
  36. #end
  37. frag.add_uniform('sampler2D texpaint_nor_undo', '_texpaint_nor_undo');
  38. var matid = UITrait.inst.materialIdPicked / 255;
  39. frag.write('if ($matid != textureLod(texpaint_nor_undo, picker_sample_tc, 0.0).a) discard;');
  40. }
  41. }