make_discard.ts 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. function make_discard_color_id(vert: node_shader_t, frag: node_shader_t) {
  2. node_shader_add_uniform(frag, "sampler2D texpaint_colorid"); // 1x1 picker
  3. node_shader_add_uniform(frag, "sampler2D texcolorid", "_texcolorid"); // color map
  4. node_shader_write(frag, "vec3 colorid_c1 = texelFetch(texpaint_colorid, ivec2(0, 0), 0).rgb;");
  5. node_shader_write(frag, "vec3 colorid_c2 = textureLod(texcolorid, texCoordPick, 0).rgb;");
  6. ///if (krom_direct3d11 || krom_direct3d12 || krom_metal)
  7. node_shader_write(frag, "if (any(colorid_c1 != colorid_c2)) discard;");
  8. ///else
  9. node_shader_write(frag, "if (colorid_c1 != colorid_c2) discard;");
  10. ///end
  11. }
  12. function make_discard_face(vert: node_shader_t, frag: node_shader_t) {
  13. node_shader_add_uniform(frag, "sampler2D gbuffer2");
  14. node_shader_add_uniform(frag, "sampler2D textrianglemap", "_textrianglemap");
  15. node_shader_add_uniform(frag, "vec2 textrianglemapSize", "_texpaintSize");
  16. node_shader_add_uniform(frag, "vec2 gbufferSize", "_gbufferSize");
  17. ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan)
  18. node_shader_write(frag, "vec2 texCoordInp = texelFetch(gbuffer2, ivec2(inp.x * gbufferSize.x, inp.y * gbufferSize.y), 0).ba;");
  19. ///else
  20. node_shader_write(frag, "vec2 texCoordInp = texelFetch(gbuffer2, ivec2(inp.x * gbufferSize.x, (1.0 - inp.y) * gbufferSize.y), 0).ba;");
  21. ///end
  22. node_shader_write(frag, "vec4 face_c1 = texelFetch(textrianglemap, ivec2(texCoordInp * textrianglemapSize), 0);");
  23. node_shader_write(frag, "vec4 face_c2 = textureLod(textrianglemap, texCoordPick, 0);");
  24. ///if (krom_direct3d11 || krom_direct3d12 || krom_metal)
  25. node_shader_write(frag, "if (any(face_c1 != face_c2)) discard;");
  26. ///else
  27. node_shader_write(frag, "if (face_c1 != face_c2) discard;");
  28. ///end
  29. }
  30. function make_discard_uv_island(vert: node_shader_t, frag: node_shader_t) {
  31. node_shader_add_uniform(frag, "sampler2D texuvislandmap", "_texuvislandmap");
  32. node_shader_write(frag, "if (textureLod(texuvislandmap, texCoordPick, 0).r == 0.0) discard;");
  33. }
  34. function make_discard_material_id(vert: node_shader_t, frag: node_shader_t) {
  35. frag.wvpposition = true;
  36. node_shader_write(frag, "vec2 picker_sample_tc = vec2(wvpposition.x / wvpposition.w, wvpposition.y / wvpposition.w) * 0.5 + 0.5;");
  37. ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan)
  38. node_shader_write(frag, "picker_sample_tc.y = 1.0 - picker_sample_tc.y;");
  39. ///end
  40. node_shader_add_uniform(frag, "sampler2D texpaint_nor_undo", "_texpaint_nor_undo");
  41. let matid: i32 = context_raw.materialid_picked / 255;
  42. node_shader_write(frag, "if (" + matid + " != textureLod(texpaint_nor_undo, picker_sample_tc, 0.0).a) discard;");
  43. }