tab_objects.ts 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. let tab_objects_material_id: i32 = 0;
  2. let tab_objects_line_counter: i32 = 0;
  3. let tab_objects_current_object: object_t;
  4. function tab_objects_roundfp(f: f32, precision: i32 = 2): f32 {
  5. f *= math_pow(10, precision);
  6. return math_round(f) / math_pow(10, precision);
  7. }
  8. function tab_objects_import_mesh_done() {
  9. object_set_parent(array_pop(project_paint_objects).base, null);
  10. }
  11. function tab_objects_draw_menu(ui: zui_t) {
  12. if (ui_menu_button(ui, "Assign Material")) {
  13. tab_objects_material_id++;
  14. for (let i: i32 = 0; i < _scene_raw.shader_datas.length; ++i) {
  15. let sh: shader_data_t = _scene_raw.shader_datas[i];
  16. if (sh.name == "Material_data") {
  17. let s: shader_data_t = json_parse(json_stringify(sh));
  18. s.name = "TempMaterial_data" + tab_objects_material_id;
  19. array_push(_scene_raw.shader_datas, s);
  20. break;
  21. }
  22. }
  23. for (let i: i32 = 0; i < _scene_raw.material_datas.length; ++i) {
  24. let mat: material_data_t = _scene_raw.material_datas[i];
  25. if (mat.name == "Material") {
  26. let m: material_data_t = json_parse(json_stringify(mat));
  27. m.name = "TempMaterial" + tab_objects_material_id;
  28. m.shader = "TempMaterial_data" + tab_objects_material_id;
  29. array_push(_scene_raw.material_datas, m);
  30. break;
  31. }
  32. }
  33. let md: material_data_t = data_get_material("Scene", "TempMaterial" + tab_objects_material_id);
  34. let mo: mesh_object_t = tab_objects_current_object.ext;
  35. mo.materials = [md];
  36. make_material_parse_mesh_preview_material(md);
  37. }
  38. }
  39. function tab_objects_draw_list(ui: zui_t, list_handle: zui_handle_t, current_object: object_t) {
  40. if (char_at(current_object.name, 0) == ".") {
  41. return; // Hidden
  42. }
  43. let b: bool = false;
  44. // Highlight every other line
  45. if (tab_objects_line_counter % 2 == 0) {
  46. g2_set_color(ui.ops.theme.SEPARATOR_COL);
  47. g2_fill_rect(0, ui._y, ui._window_w, zui_ELEMENT_H(ui));
  48. g2_set_color(0xffffffff);
  49. }
  50. // Highlight selected line
  51. if (current_object == context_raw.selected_object) {
  52. g2_set_color(0xff205d9c);
  53. g2_fill_rect(0, ui._y, ui._window_w, zui_ELEMENT_H(ui));
  54. g2_set_color(0xffffffff);
  55. }
  56. if (current_object.children.length > 0) {
  57. let row: f32[] = [1 / 13, 12 / 13];
  58. zui_row(row);
  59. let h: zui_handle_t = zui_nest(list_handle, tab_objects_line_counter);
  60. if (h.init) {
  61. h.selected = true;
  62. }
  63. b = zui_panel(h, "", true, false, false);
  64. zui_text(current_object.name);
  65. }
  66. else {
  67. ui._x += 18; // Sign offset
  68. // Draw line that shows parent relations
  69. g2_set_color(ui.ops.theme.ACCENT_COL);
  70. g2_draw_line(ui._x - 10, ui._y + zui_ELEMENT_H(ui) / 2, ui._x, ui._y + zui_ELEMENT_H(ui) / 2);
  71. g2_set_color(0xffffffff);
  72. zui_text(current_object.name);
  73. ui._x -= 18;
  74. }
  75. tab_objects_line_counter++;
  76. // Undo applied offset for row drawing caused by end_element()
  77. ui._y -= zui_ELEMENT_OFFSET(ui);
  78. if (ui.is_released) {
  79. context_raw.selected_object = current_object;
  80. }
  81. if (ui.is_hovered && ui.input_released_r) {
  82. tab_objects_current_object = current_object;
  83. ui_menu_draw(tab_objects_draw_menu, 1);
  84. }
  85. if (b) {
  86. let current_y = ui._y;
  87. for (let i: i32 = 0; i < current_object.children.length; ++i) {
  88. let child: object_t = current_object.children[i];
  89. // ui.indent();
  90. tab_objects_draw_list(ui, list_handle, child);
  91. // ui.unindent();
  92. }
  93. // Draw line that shows parent relations
  94. g2_set_color(ui.ops.theme.ACCENT_COL);
  95. g2_draw_line(ui._x + 14, current_y, ui._x + 14, ui._y - zui_ELEMENT_H(ui) / 2);
  96. g2_set_color(0xffffffff);
  97. }
  98. }
  99. function tab_objects_draw(htab: zui_handle_t) {
  100. let ui: zui_t = ui_base_ui;
  101. if (zui_tab(htab, tr("Objects"))) {
  102. zui_begin_sticky();
  103. let row: f32[] = [1 / 4];
  104. zui_row(row);
  105. if (zui_button("Import")) {
  106. project_import_mesh(false, tab_objects_import_mesh_done);
  107. }
  108. zui_end_sticky();
  109. let outliner_handle: zui_handle_t = zui_handle(__ID__);
  110. if (outliner_handle.init) {
  111. outliner_handle.selected = true;
  112. }
  113. if (zui_panel(outliner_handle, "Outliner")) {
  114. ui._y -= zui_ELEMENT_OFFSET(ui);
  115. tab_objects_line_counter = 0;
  116. for (let i: i32 = 0; i < _scene_root.children.length; ++i) {
  117. let c: object_t = _scene_root.children[i];
  118. tab_objects_draw_list(ui, zui_handle(__ID__), c);
  119. }
  120. }
  121. let properties_handle: zui_handle_t = zui_handle(__ID__);
  122. if (properties_handle.init) {
  123. properties_handle.selected = true;
  124. }
  125. if (zui_panel(properties_handle, "Properties")) {
  126. if (context_raw.selected_object != null) {
  127. let h: zui_handle_t = zui_handle(__ID__);
  128. h.selected = context_raw.selected_object.visible;
  129. context_raw.selected_object.visible = zui_check(h, "Visible");
  130. let t: transform_t = context_raw.selected_object.transform;
  131. let local_pos: vec4_t = t.loc;
  132. let scale: vec4_t = t.scale;
  133. let rot: quat_t = quat_get_euler(t.rot);
  134. let dim: vec4_t = t.dim;
  135. vec4_mult(rot, 180 / 3.141592);
  136. let f: f32 = 0.0;
  137. let row: f32[] = [1 / 4, 1 / 4, 1 / 4, 1 / 4];
  138. zui_row(row);
  139. zui_text("Loc");
  140. h = zui_handle(__ID__);
  141. h.text = math_round(local_pos.x) + "";
  142. f = parse_float(zui_text_input(h, "X"));
  143. if (h.changed) {
  144. local_pos.x = f;
  145. }
  146. h = zui_handle(__ID__);
  147. h.text = math_round(local_pos.y) + "";
  148. f = parse_float(zui_text_input(h, "Y"));
  149. if (h.changed) {
  150. local_pos.y = f;
  151. }
  152. h = zui_handle(__ID__);
  153. h.text = math_round(local_pos.z) + "";
  154. f = parse_float(zui_text_input(h, "Z"));
  155. if (h.changed) {
  156. local_pos.z = f;
  157. }
  158. zui_row(row);
  159. zui_text("Rotation");
  160. h = zui_handle(__ID__);
  161. h.text = math_round(rot.x) + "";
  162. f = parse_float(zui_text_input(h, "X"));
  163. let changed = false;
  164. if (h.changed) {
  165. changed = true;
  166. rot.x = f;
  167. }
  168. h = zui_handle(__ID__);
  169. h.text = math_round(rot.y) + "";
  170. f = parse_float(zui_text_input(h, "Y"));
  171. if (h.changed) {
  172. changed = true;
  173. rot.y = f;
  174. }
  175. h = zui_handle(__ID__);
  176. h.text = math_round(rot.z) + "";
  177. f = parse_float(zui_text_input(h, "Z"));
  178. if (h.changed) {
  179. changed = true;
  180. rot.z = f;
  181. }
  182. if (changed && context_raw.selected_object.name != "Scene") {
  183. vec4_mult(rot, 3.141592 / 180);
  184. quat_from_euler(context_raw.selected_object.transform.rot, rot.x, rot.y, rot.z);
  185. transform_build_matrix(context_raw.selected_object.transform);
  186. // ///if arm_physics
  187. // if (rb != null) rb.syncTransform();
  188. // ///end
  189. }
  190. zui_row(row);
  191. zui_text("Scale");
  192. h = zui_handle(__ID__);
  193. h.text = math_round(scale.x) + "";
  194. f = parse_float(zui_text_input(h, "X"));
  195. if (h.changed) {
  196. scale.x = f;
  197. }
  198. h = zui_handle(__ID__);
  199. h.text = math_round(scale.y) + "";
  200. f = parse_float(zui_text_input(h, "Y"));
  201. if (h.changed) {
  202. scale.y = f;
  203. }
  204. h = zui_handle(__ID__);
  205. h.text = math_round(scale.z) + "";
  206. f = parse_float(zui_text_input(h, "Z"));
  207. if (h.changed) {
  208. scale.z = f;
  209. }
  210. zui_row(row);
  211. zui_text("Dimensions");
  212. h = zui_handle(__ID__);
  213. h.text = math_round(dim.x) + "";
  214. f = parse_float(zui_text_input(h, "X"));
  215. if (h.changed) {
  216. dim.x = f;
  217. }
  218. h = zui_handle(__ID__);
  219. h.text = math_round(dim.y) + "";
  220. f = parse_float(zui_text_input(h, "Y"));
  221. if (h.changed) {
  222. dim.y = f;
  223. }
  224. h = zui_handle(__ID__);
  225. h.text = math_round(dim.z) + "";
  226. f = parse_float(zui_text_input(h, "Z"));
  227. if (h.changed) {
  228. dim.z = f;
  229. }
  230. context_raw.selected_object.transform.dirty = true;
  231. if (context_raw.selected_object.name == "Scene") {
  232. let p = scene_world;
  233. let p_handle: zui_handle_t = zui_handle(__ID__);
  234. if (p_handle.init) {
  235. p_handle.value = p.strength;
  236. }
  237. p.strength = zui_slider(p_handle, "Environment", 0.0, 5.0, true);
  238. }
  239. else if (context_raw.selected_object.ext_type == "light_object_t") {
  240. let light = context_raw.selected_object.ext;
  241. let light_handle = zui_handle(__ID__);
  242. light_handle.value = light.data.strength / 10;
  243. light.data.strength = zui_slider(light_handle, "Strength", 0.0, 5.0, true) * 10;
  244. }
  245. else if (context_raw.selected_object.ext_type == "camera_object_t") {
  246. let cam = context_raw.selected_object.ext;
  247. let fov_handle = zui_handle(__ID__);
  248. fov_handle.value = math_floor(cam.data.fov * 100) / 100;
  249. cam.data.fov = zui_slider(fov_handle, "FoV", 0.3, 2.0, true);
  250. if (fov_handle.changed) {
  251. camera_object_build_proj(cam);
  252. }
  253. }
  254. }
  255. }
  256. }
  257. }