TriplanarParams.hx 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package hrt.shgraph.nodes;
  2. using hxsl.Ast;
  3. @name("Triplanar params")
  4. @description("Returns parameters useful to sample a texture using triplanar mapping")
  5. @width(160)
  6. @group("Math")
  7. class TriplanarParams extends ShaderNodeHxsl {
  8. @prop() var LOCAL : Bool = false;
  9. static var SRC = {
  10. @sginput(2.0) var sharpness : Float;
  11. @sgconst var LOCAL : Int = 0;
  12. @sgoutput var weight : Vec3;
  13. @sgoutput var uvX : Vec2;
  14. @sgoutput var uvY : Vec2;
  15. @sgoutput var uvZ : Vec2;
  16. @input var input : {
  17. var normal : Vec3;
  18. };
  19. var transformedNormal : Vec3;
  20. var transformedPosition : Vec3;
  21. var relativePosition : Vec3;
  22. function fragment() {
  23. if ( LOCAL == 0 ) {
  24. weight = pow(abs(transformedNormal), vec3(sharpness));
  25. weight = weight / (weight.x + weight.y + weight.z);
  26. uvX = transformedPosition.zy;
  27. uvY = transformedPosition.xz;
  28. uvZ = transformedPosition.xy;
  29. } else {
  30. weight = pow(abs(input.normal), vec3(sharpness));
  31. weight = weight / (weight.x + weight.y + weight.z);
  32. uvX = relativePosition.zy;
  33. uvY = relativePosition.xz;
  34. uvZ = relativePosition.xy;
  35. }
  36. }
  37. };
  38. override function getConstValue(name: String) : Null<Int> {
  39. switch (name) {
  40. case "LOCAL":
  41. return this.LOCAL ? 1 : 0;
  42. default:
  43. return 0;
  44. }
  45. }
  46. #if editor
  47. override public function getPropertiesHTML(width : Float) : Array<hide.Element> {
  48. var elements = super.getPropertiesHTML(width);
  49. var element = new hide.Element('<div style="width: ${width * 0.8}px; height: 40px"></div>');
  50. var container = new hide.Element('<div style="width: ${width * 0.8}px;"></div>');
  51. container.css("display","flex");
  52. var localEl = new hide.Element('<input type="checkbox" id="local"></input>');
  53. localEl.prop('checked', this.LOCAL);
  54. localEl.css("float","");
  55. container.append('<span>LOCAL&nbsp</span>');
  56. container.append(localEl);
  57. element.append(container);
  58. localEl.on("change", function(e) {
  59. this.LOCAL = localEl.is(':checked');
  60. });
  61. elements.push(element);
  62. element.height(70);
  63. return elements;
  64. }
  65. #end
  66. }