vector_curves_node.ts 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. function vector_curves_node_init() {
  2. array_push(nodes_material_utilities, vector_curves_node_def);
  3. map_set(parser_material_node_vectors, "CURVE_VEC", vector_curves_node_vector);
  4. map_set(ui_nodes_custom_buttons, "nodes_material_vector_curves_button", nodes_material_vector_curves_button);
  5. }
  6. function parser_material_vector_curve(name: string, fac: string, points: f32_ptr, num: i32): string {
  7. // Write Ys array
  8. let ys_var: string = name + "_ys";
  9. parser_material_write(parser_material_kong, "var " + ys_var + ": float[" + num + "];"); // TODO: Make const
  10. for (let i: i32 = 0; i < num; ++i) {
  11. let p: f32 = ARRAY_ACCESS(points, i * 2 + 1);
  12. parser_material_write(parser_material_kong, ys_var + "[" + i + "] = " + p + ";");
  13. }
  14. // Get index
  15. let fac_var: string = name + "_fac";
  16. parser_material_write(parser_material_kong, "var " + fac_var + ": float = " + fac + ";");
  17. let index: string = "0";
  18. for (let i: i32 = 1; i < num; ++i) {
  19. let p: f32 = ARRAY_ACCESS(points, i * 2 + 0);
  20. index += " + (" + fac_var + " > " + p + " ? 1 : 0)";
  21. }
  22. // Write index
  23. let index_var: string = name + "_i";
  24. parser_material_write(parser_material_kong, "var " + index_var + ": int = " + index + ";");
  25. // Linear
  26. // Write Xs array
  27. let facs_var: string = name + "_xs";
  28. parser_material_write(parser_material_kong, "var " + facs_var + ": float[" + num + "];"); // TODO: Make const
  29. for (let i: i32 = 0; i < num; ++i) {
  30. let p: f32 = ARRAY_ACCESS(points, i * 2 + 0);
  31. parser_material_write(parser_material_kong, "" + facs_var + "[" + i + "] = " + p + ";");
  32. }
  33. // Map vector
  34. return "0.0"; ////
  35. // return "lerp(" +
  36. // ys_var + "[" + index_var + "], " + ys_var + "[" + index_var + " + 1], (" + fac_var + " - " +
  37. // facs_var + "[" + index_var + "]) * (1.0 / (" + facs_var + "[" + index_var + " + 1] - " + facs_var + "[" + index_var + "])))";
  38. }
  39. function vector_curves_node_vector(node: ui_node_t, socket: ui_node_socket_t): string {
  40. let fac: string = parser_material_parse_value_input(node.inputs[0]);
  41. let vec: string = parser_material_parse_vector_input(node.inputs[1]);
  42. let curves: f32_array_t = node.buttons[0].default_value;
  43. if (curves[96] == 0.0) {
  44. curves[96] = 1.0;
  45. curves[97] = 1.0;
  46. curves[98] = 1.0;
  47. }
  48. let name: string = parser_material_node_name(node);
  49. let vc0: string = parser_material_vector_curve(name + "0", vec + ".x", curves.buffer + 32 * 0, curves[96]);
  50. let vc1: string = parser_material_vector_curve(name + "1", vec + ".y", curves.buffer + 32 * 1, curves[97]);
  51. let vc2: string = parser_material_vector_curve(name + "2", vec + ".z", curves.buffer + 32 * 2, curves[98]);
  52. // mapping.curves[0].points[0].handle_type // bezier curve
  53. return "(float3(" + vc0 + ", " + vc1 + ", " + vc2 + ") * " + fac + ")";
  54. }
  55. function nodes_material_vector_curves_button(node_id: i32) {
  56. let node: ui_node_t = ui_get_node(ui_nodes_get_canvas(true).nodes, node_id);
  57. let but: ui_node_button_t = node.buttons[0];
  58. let nhandle: ui_handle_t = ui_nest(ui_handle(__ID__), node.id);
  59. ui_row3();
  60. ui_radio(ui_nest(ui_nest(nhandle, 0), 1), 0, "X");
  61. ui_radio(ui_nest(ui_nest(nhandle, 0), 1), 1, "Y");
  62. ui_radio(ui_nest(ui_nest(nhandle, 0), 1), 2, "Z");
  63. // Preview
  64. let axis: i32 = ui_nest(ui_nest(nhandle, 0), 1).i;
  65. let val: f32[] = but.default_value;
  66. ui._y += UI_LINE_H() * 5;
  67. let num: i32 = val[96 + axis];
  68. if (num == 0) {
  69. // Init
  70. val[96 + 0] = 1;
  71. val[96 + 1] = 1;
  72. val[96 + 2] = 1;
  73. }
  74. // Edit
  75. let row: f32[] = [ 1 / 5, 1 / 5, 3 / 5 ];
  76. ui_row(row);
  77. if (ui_button("+")) {
  78. // TODO:
  79. // val[axis * 32 + num * 2 + 0] = 0.0;
  80. // val[axis * 32 + num * 2 + 1] = 0.0;
  81. // num++;
  82. // val[96 + axis] = num;
  83. }
  84. if (ui_button("-")) {
  85. if (num > 1) {
  86. num--;
  87. val[96 + axis] = num;
  88. }
  89. }
  90. let ihandle: ui_handle_t = ui_nest(ui_nest(ui_nest(nhandle, 0), 2), axis);
  91. if (ihandle.init) {
  92. ihandle.i = 0;
  93. }
  94. let i: i32 = math_floor(ui_slider(ihandle, "Index", 0, num - 1, false, 1, true, ui_align_t.LEFT));
  95. if (i >= num || i < 0) {
  96. ihandle.f = i = num - 1; // Stay in bounds
  97. }
  98. ui_row2();
  99. ui_nest(ui_nest(nhandle, 0), 3).f = val[axis * 32 + i * 2 + 0];
  100. ui_nest(ui_nest(nhandle, 0), 4).f = val[axis * 32 + i * 2 + 1];
  101. let h1: ui_handle_t = ui_nest(ui_nest(nhandle, 0), 3);
  102. if (h1.init) {
  103. h1.f = 0.0;
  104. }
  105. let h2: ui_handle_t = ui_nest(ui_nest(nhandle, 0), 4);
  106. if (h2.init) {
  107. h2.f = 0.0;
  108. }
  109. val[axis * 32 + i * 2 + 0] = ui_slider(h1, "X", -1, 1, true, 100, true, ui_align_t.LEFT);
  110. val[axis * 32 + i * 2 + 1] = ui_slider(h2, "Y", -1, 1, true, 100, true, ui_align_t.LEFT);
  111. }
  112. let vector_curves_node_def: ui_node_t = {
  113. id : 0,
  114. name : _tr("Vector Curves"),
  115. type : "CURVE_VEC",
  116. x : 0,
  117. y : 0,
  118. color : 0xff522c99,
  119. inputs : [
  120. {
  121. id : 0,
  122. node_id : 0,
  123. name : _tr("Factor"),
  124. type : "VALUE",
  125. color : 0xffa1a1a1,
  126. default_value : f32_array_create_x(1.0),
  127. min : 0.0,
  128. max : 1.0,
  129. precision : 100,
  130. display : 0
  131. },
  132. {
  133. id : 0,
  134. node_id : 0,
  135. name : _tr("Vector"),
  136. type : "VECTOR",
  137. color : 0xff6363c7,
  138. default_value : f32_array_create_xyz(0.0, 0.0, 0.0),
  139. min : 0.0,
  140. max : 1.0,
  141. precision : 100,
  142. display : 0
  143. }
  144. ],
  145. outputs : [ {
  146. id : 0,
  147. node_id : 0,
  148. name : _tr("Vector"),
  149. type : "VECTOR",
  150. color : 0xff6363c7,
  151. default_value : f32_array_create_xyz(0.0, 0.0, 0.0),
  152. min : 0.0,
  153. max : 1.0,
  154. precision : 100,
  155. display : 0
  156. } ],
  157. buttons : [ {
  158. name : "nodes_material_vector_curves_button",
  159. type : "CUSTOM",
  160. output : 0,
  161. default_value : f32_array_create(96 + 3), // x - [0, 32], y - [33, 64], z - [65, 96], x_len, y_len, z_len
  162. data : null,
  163. min : 0.0,
  164. max : 1.0,
  165. precision : 100,
  166. height : 8.5
  167. } ],
  168. width : 0,
  169. flags : 0
  170. };