Sampler.hx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. package hrt.shgraph.nodes;
  2. using hxsl.Ast;
  3. enum abstract TexFilter(String) from String to String {
  4. var Nearest;
  5. var Linear;
  6. }
  7. var filters = [Nearest, Linear];
  8. enum abstract TexWrap(String) from String to String {
  9. var Clamp;
  10. var Repeat;
  11. var ClampX;
  12. var ClampY;
  13. }
  14. var wraps = [Clamp, Repeat, ClampX, ClampY];
  15. @name("Sample Texture 2D")
  16. @description("Get color from texture and UV")
  17. @group("Property")
  18. class Sampler extends ShaderNodeHxsl {
  19. @prop() var filter : TexFilter = Linear;
  20. @prop() var wrap : TexWrap = Repeat;
  21. static var SRC = {
  22. @sginput var texture : Sampler2D;
  23. @sginput(calculatedUV) var uv : Vec2;
  24. @sgoutput var RGBA : Vec4;
  25. @sgconst var wrap : Int;
  26. @sgconst var filter : Int;
  27. function fragment() {
  28. var uv2 = uv;
  29. var size = texture.size();
  30. if (wrap == 0) // Clamp
  31. uv2 = clamp(uv2, 0.5 / size, (size - vec2(0.5)) / size);
  32. if (wrap == 2) // Clamp X
  33. uv2.x = clamp(uv2.x, 0.5 / size.x, (size.x - 0.5) / size.x);
  34. if (wrap == 3) // Clamp Y
  35. uv2.y = clamp(uv2.y, 0.5 / size.y, (size.y - 0.5) / size.y);
  36. if (filter == 0) {
  37. var size = texture.size();
  38. uv2 = (floor( size * uv2 ) + 0.5) / size ;
  39. }
  40. RGBA = texture.get(uv2);
  41. }
  42. }
  43. override function getConstValue(name: String) : Null<Int> {
  44. switch (name) {
  45. case "wrap":
  46. if ( wrap == Clamp ) return 0;
  47. if ( wrap == ClampX ) return 2;
  48. if ( wrap == ClampY ) return 3;
  49. return 1;
  50. case "filter":
  51. return filter == Nearest ? 0 : 1;
  52. default:
  53. return null;
  54. }
  55. }
  56. #if editor
  57. override public function getPropertiesHTML(width : Float) : Array<hide.Element> {
  58. var elements = super.getPropertiesHTML(width);
  59. {
  60. var element = new hide.Element('<div style="width: ${width * 0.8}px; height: 40px"></div>');
  61. element.append('<span>Wrap</span>');
  62. element.append(new hide.Element('<select id="wrap"></select>'));
  63. if (this.wrap == null) {
  64. this.wrap = wraps[1];
  65. }
  66. var input = element.children("#wrap");
  67. var indexOption = 0;
  68. for (i => currentWrap in wraps) {
  69. input.append(new hide.Element('<option value="${i}">${currentWrap}</option>'));
  70. if (this.wrap == currentWrap) {
  71. input.val(i);
  72. }
  73. indexOption++;
  74. }
  75. input.on("change", function(e) {
  76. var value = input.val();
  77. this.wrap = wraps[value];
  78. });
  79. elements.push(element);
  80. }
  81. {
  82. var element = new hide.Element('<div style="width: ${width * 0.8}px; height: 40px"></div>');
  83. element.append('<span>Filter</span>');
  84. element.append(new hide.Element('<select id="filter"></select>'));
  85. if (this.filter == null) {
  86. this.filter = filters[1];
  87. }
  88. var input = element.children("#filter");
  89. var indexOption = 0;
  90. for (i => currentfilter in filters) {
  91. input.append(new hide.Element('<option value="${i}">${currentfilter}</option>'));
  92. if (this.filter == currentfilter) {
  93. input.val(i);
  94. }
  95. indexOption++;
  96. }
  97. input.on("change", function(e) {
  98. var value = input.val();
  99. this.filter = filters[value];
  100. requestRecompile();
  101. });
  102. elements.push(element);
  103. }
  104. return elements;
  105. }
  106. #end
  107. }