gradient_texture_node.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. function gradient_texture_node_init() {
  2. array_push(nodes_material_texture, gradient_texture_node_def);
  3. map_set(parser_material_node_vectors, "TEX_GRADIENT", gradient_texture_node_vector);
  4. map_set(parser_material_node_values, "TEX_GRADIENT", gradient_texture_node_value);
  5. }
  6. function parser_material_get_gradient(grad: string, co: string): string {
  7. if (grad == "LINEAR") {
  8. return co + ".x";
  9. }
  10. else if (grad == "QUADRATIC") {
  11. return "0.0";
  12. }
  13. else if (grad == "EASING") {
  14. return "0.0";
  15. }
  16. else if (grad == "DIAGONAL") {
  17. return "(" + co + ".x + " + co + ".y) * 0.5";
  18. }
  19. else if (grad == "RADIAL") {
  20. return "atan2(" + co + ".x, " + co + ".y) / (3.141592 * 2.0) + 0.5";
  21. }
  22. else if (grad == "QUADRATIC_SPHERE") {
  23. return "0.0";
  24. }
  25. else { // "SPHERICAL"
  26. return "max(1.0 - sqrt(" + co + ".x * " + co + ".x + " + co + ".y * " + co + ".y + " + co + ".z * " + co + ".z), 0.0)";
  27. }
  28. }
  29. function gradient_texture_node_vector(node: ui_node_t, socket: ui_node_socket_t): string {
  30. let co: string = parser_material_get_coord(node);
  31. let but: ui_node_button_t = node.buttons[0]; // gradient_type;
  32. let grad: string = to_upper_case(u8_array_string_at(but.data, but.default_value[0]));
  33. grad = string_replace_all(grad, " ", "_");
  34. let f: string = parser_material_get_gradient(grad, co);
  35. let res: string = parser_material_to_vec3("clamp(" + f + ", 0.0, 1.0)");
  36. return res;
  37. }
  38. function gradient_texture_node_value(node: ui_node_t, socket: ui_node_socket_t): string {
  39. let co: string = parser_material_get_coord(node);
  40. let but: ui_node_button_t = node.buttons[0]; // gradient_type;
  41. let grad: string = to_upper_case(u8_array_string_at(but.data, but.default_value[0]));
  42. grad = string_replace_all(grad, " ", "_");
  43. let f: string = parser_material_get_gradient(grad, co);
  44. let res: string = "(clamp(" + f + ", 0.0, 1.0))";
  45. return res;
  46. }
  47. let gradient_texture_node_def: ui_node_t = {
  48. id : 0,
  49. name : _tr("Gradient Texture"),
  50. type : "TEX_GRADIENT",
  51. x : 0,
  52. y : 0,
  53. color : 0xff4982a0,
  54. inputs : [ {
  55. id : 0,
  56. node_id : 0,
  57. name : _tr("Vector"),
  58. type : "VECTOR",
  59. color : 0xff6363c7,
  60. default_value : f32_array_create_xyz(0.0, 0.0, 0.0),
  61. min : 0.0,
  62. max : 1.0,
  63. precision : 100,
  64. display : 0
  65. } ],
  66. outputs : [
  67. {
  68. id : 0,
  69. node_id : 0,
  70. name : _tr("Color"),
  71. type : "RGBA",
  72. color : 0xffc7c729,
  73. default_value : f32_array_create_xyzw(0.8, 0.8, 0.8, 1.0),
  74. min : 0.0,
  75. max : 1.0,
  76. precision : 100,
  77. display : 0
  78. },
  79. {
  80. id : 0,
  81. node_id : 0,
  82. name : _tr("Factor"),
  83. type : "VALUE",
  84. color : 0xffa1a1a1,
  85. default_value : f32_array_create_x(1.0),
  86. min : 0.0,
  87. max : 1.0,
  88. precision : 100,
  89. display : 0
  90. }
  91. ],
  92. buttons : [ {
  93. name : _tr("gradient_type"),
  94. type : "ENUM",
  95. output : 0,
  96. default_value : f32_array_create_x(0),
  97. data : u8_array_create_from_string(_tr("Linear") + "\n" + _tr("Diagonal") + "\n" + _tr("Radial") + "\n" + _tr("Spherical")),
  98. min : 0.0,
  99. max : 1.0,
  100. precision : 100,
  101. height : 0
  102. } ],
  103. width : 0,
  104. flags : 0
  105. };