import_arm.ts 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658
  1. function import_arm_run_project(path: string) {
  2. let b: buffer_t = data_get_blob(path);
  3. let project: project_format_t = armpack_decode(b);
  4. ///if (is_paint || is_sculpt)
  5. if (project.version != null && project.layer_datas == null) {
  6. // Import as material
  7. if (project.material_nodes != null) {
  8. import_arm_run_material_from_project(project, path);
  9. }
  10. // Import as brush
  11. else if (project.brush_nodes != null) {
  12. import_arm_run_brush_from_project(project, path);
  13. }
  14. // Import as swatches
  15. else if (project.swatches != null) {
  16. import_arm_run_swatches_from_project(project, path);
  17. }
  18. return;
  19. }
  20. let import_as_mesh: bool = project.version == null;
  21. context_raw.layers_preview_dirty = true;
  22. context_raw.layer_filter = 0;
  23. ///end
  24. ///if is_lab
  25. let import_as_mesh: bool = true;
  26. ///end
  27. project_new(import_as_mesh);
  28. project_filepath = path;
  29. ui_files_filename = substring(path, string_last_index_of(path, path_sep) + 1, string_last_index_of(path, "."));
  30. ///if (krom_android || krom_ios)
  31. sys_title_set(ui_files_filename);
  32. ///else
  33. sys_title_set(ui_files_filename + " - " + manifest_title);
  34. ///end
  35. ///if (is_paint || is_sculpt)
  36. // Import as mesh instead
  37. if (import_as_mesh) {
  38. import_arm_run_mesh(project);
  39. return;
  40. }
  41. ///end
  42. // Save to recent
  43. ///if krom_ios
  44. let recent_path: string = substring(path, string_last_index_of(path, "/") + 1, path.length);
  45. ///else
  46. let recent_path: string = path;
  47. ///end
  48. let recent: string[] = config_raw.recent_projects;
  49. array_remove(recent, recent_path);
  50. recent.unshift(recent_path);
  51. config_save();
  52. project_raw = project;
  53. ///if (is_paint || is_sculpt)
  54. let l0: layer_data_t = project.layer_datas[0];
  55. base_res_handle.position = config_get_texture_res_pos(l0.res);
  56. let bits_pos: texture_bits_t = l0.bpp == 8 ? texture_bits_t.BITS8 : l0.bpp == 16 ? texture_bits_t.BITS16 : texture_bits_t.BITS32;
  57. base_bits_handle.position = bits_pos;
  58. let bytes_per_pixel: i32 = math_floor(l0.bpp / 8);
  59. let format: tex_format_t = l0.bpp == 8 ? tex_format_t.RGBA32 : l0.bpp == 16 ? tex_format_t.RGBA64 : tex_format_t.RGBA128;
  60. ///end
  61. let base: string = path_base_dir(path);
  62. if (project_raw.envmap != null) {
  63. project_raw.envmap = data_is_abs(project_raw.envmap) ? project_raw.envmap : base + project_raw.envmap;
  64. }
  65. if (project_raw.envmap_strength != null) {
  66. scene_world.strength = project_raw.envmap_strength;
  67. }
  68. if (project_raw.camera_world != null) {
  69. scene_camera.base.transform.local = mat4_from_f32_array(project_raw.camera_world);
  70. transform_decompose(scene_camera.base.transform);
  71. scene_camera.data.fov = project_raw.camera_fov;
  72. camera_object_build_proj(scene_camera);
  73. let origin: f32_array_t = project_raw.camera_origin;
  74. camera_origins[0].x = origin[0];
  75. camera_origins[0].y = origin[1];
  76. camera_origins[0].z = origin[2];
  77. }
  78. for (let i: i32 = 0; i < project.assets.length; ++i) {
  79. let file: string = project.assets[i];
  80. ///if krom_windows
  81. file = string_replace_all(file, "/", "\\");
  82. ///else
  83. file = string_replace_all(file, "\\", "/");
  84. ///end
  85. // Convert image path from relative to absolute
  86. let abs: string = data_is_abs(file) ? file : base + file;
  87. if (project.packed_assets != null) {
  88. abs = path_normalize(abs);
  89. import_arm_unpack_asset(project, abs, file);
  90. }
  91. if (map_get(data_cached_images, abs) == null && !file_exists(abs)) {
  92. import_arm_make_pink(abs);
  93. }
  94. let hdr_as_envmap: bool = ends_with(abs, ".hdr") && project_raw.envmap == abs;
  95. import_texture_run(abs, hdr_as_envmap);
  96. }
  97. ///if (is_paint || is_sculpt)
  98. if (project.font_assets != null) {
  99. for (let i: i32 = 0; i < project.font_assets.length; ++i) {
  100. let file: string = project.font_assets[i];
  101. ///if krom_windows
  102. file = string_replace_all(file, "/", "\\");
  103. ///else
  104. file = string_replace_all(file, "\\", "/");
  105. ///end
  106. // Convert font path from relative to absolute
  107. let abs: string = data_is_abs(file) ? file : base + file;
  108. if (file_exists(abs)) {
  109. import_font_run(abs);
  110. }
  111. }
  112. }
  113. ///end
  114. ///if (is_paint || is_sculpt)
  115. let md: mesh_data_t = mesh_data_create(project.mesh_datas[0]);
  116. ///end
  117. ///if is_lab
  118. let md: mesh_data_t = mesh_data_create(project.mesh_data);
  119. ///end
  120. mesh_object_set_data(context_raw.paint_object, md);
  121. vec4_set(context_raw.paint_object.base.transform.scale, 1, 1, 1);
  122. transform_build_matrix(context_raw.paint_object.base.transform);
  123. context_raw.paint_object.base.name = md.name;
  124. project_paint_objects = [context_raw.paint_object];
  125. ///if (is_paint || is_sculpt)
  126. for (let i: i32 = 1; i < project.mesh_datas.length; ++i) {
  127. let raw: mesh_data_t = project.mesh_datas[i];
  128. let md: mesh_data_t = mesh_data_create(raw);
  129. let object: mesh_object_t = scene_add_mesh_object(md, context_raw.paint_object.materials, context_raw.paint_object.base);
  130. object.base.name = md.name;
  131. object.skip_context = "paint";
  132. array_push(project_paint_objects, object);
  133. }
  134. if (project.mesh_assets != null && project.mesh_assets.length > 0) {
  135. let file: string = project.mesh_assets[0];
  136. let abs: string = data_is_abs(file) ? file : base + file;
  137. project_mesh_assets = [abs];
  138. }
  139. ///if is_paint
  140. if (project.atlas_objects != null) {
  141. project_atlas_objects = project.atlas_objects;
  142. }
  143. if (project.atlas_names != null) {
  144. project_atlas_names = project.atlas_names;
  145. }
  146. ///end
  147. // No mask by default
  148. if (context_raw.merged_object == null) {
  149. util_mesh_merge();
  150. }
  151. ///end
  152. context_select_paint_object(context_main_object());
  153. viewport_scale_to_bounds();
  154. context_raw.paint_object.skip_context = "paint";
  155. context_raw.merged_object.base.visible = true;
  156. ///if (is_paint || is_sculpt)
  157. let tex: image_t = project_layers[0].texpaint;
  158. if (tex.width != config_get_texture_res_x() || tex.height != config_get_texture_res_y()) {
  159. if (history_undo_layers != null) {
  160. for (let i: i32 = 0; i < history_undo_layers.length; ++i) {
  161. let l: slot_layer_t = history_undo_layers[i];
  162. slot_layer_resize_and_set_bits(l);
  163. }
  164. }
  165. let rts: map_t<string, render_target_t> = render_path_render_targets;
  166. let _texpaint_blend0: image_t = map_get(rts, "texpaint_blend0")._image;
  167. app_notify_on_next_frame(function (_texpaint_blend0: image_t) {
  168. image_unload(_texpaint_blend0);
  169. }, _texpaint_blend0);
  170. map_get(rts, "texpaint_blend0").width = config_get_texture_res_x();
  171. map_get(rts, "texpaint_blend0").height = config_get_texture_res_y();
  172. map_get(rts, "texpaint_blend0")._image = image_create_render_target(config_get_texture_res_x(), config_get_texture_res_y(), tex_format_t.R8, depth_format_t.NO_DEPTH);
  173. let _texpaint_blend1: image_t = map_get(rts, "texpaint_blend1")._image;
  174. app_notify_on_next_frame(function (_texpaint_blend1: image_t) {
  175. image_unload(_texpaint_blend1);
  176. }, _texpaint_blend1);
  177. map_get(rts, "texpaint_blend1").width = config_get_texture_res_x();
  178. map_get(rts, "texpaint_blend1").height = config_get_texture_res_y();
  179. map_get(rts, "texpaint_blend1")._image = image_create_render_target(config_get_texture_res_x(), config_get_texture_res_y(), tex_format_t.R8, depth_format_t.NO_DEPTH);
  180. context_raw.brush_blend_dirty = true;
  181. }
  182. for (let i: i32 = 0; i < project_layers.length; ++i) {
  183. let l: slot_layer_t = project_layers[i];
  184. slot_layer_unload(l);
  185. }
  186. project_layers = [];
  187. for (let i: i32 = 0; i < project.layer_datas.length; ++i) {
  188. let ld: layer_data_t = project.layer_datas[i];
  189. let is_group: bool = ld.texpaint == null;
  190. ///if is_paint
  191. let is_mask: bool = ld.texpaint != null && ld.texpaint_nor == null;
  192. ///end
  193. ///if is_sculpt
  194. let is_mask: bool = false;
  195. ///end
  196. let l: slot_layer_t = slot_layer_create("", is_group ? layer_slot_type_t.GROUP : is_mask ? layer_slot_type_t.MASK : layer_slot_type_t.LAYER);
  197. if (ld.name != null) {
  198. l.name = ld.name;
  199. }
  200. l.visible = ld.visible;
  201. array_push(project_layers, l);
  202. if (!is_group) {
  203. if (base_pipe_merge == null) {
  204. base_make_pipe();
  205. }
  206. let _texpaint: image_t = null;
  207. ///if is_paint
  208. let _texpaint_nor: image_t = null;
  209. let _texpaint_pack: image_t = null;
  210. ///end
  211. if (is_mask) {
  212. _texpaint = image_from_bytes(lz4_decode(ld.texpaint, ld.res * ld.res * 4), ld.res, ld.res, tex_format_t.RGBA32);
  213. g2_begin(l.texpaint);
  214. // g2_set_pipeline(base_pipe_copy8);
  215. g2_set_pipeline(project.is_bgra ? base_pipe_copy_bgra : base_pipe_copy); // Full bits for undo support, R8 is used
  216. g2_draw_image(_texpaint, 0, 0);
  217. g2_set_pipeline(null);
  218. g2_end();
  219. }
  220. else { // Layer
  221. // TODO: create render target from bytes
  222. _texpaint = image_from_bytes(lz4_decode(ld.texpaint, ld.res * ld.res * 4 * bytes_per_pixel), ld.res, ld.res, format);
  223. g2_begin(l.texpaint);
  224. g2_set_pipeline(project.is_bgra ? base_pipe_copy_bgra : base_pipe_copy);
  225. g2_draw_image(_texpaint, 0, 0);
  226. g2_set_pipeline(null);
  227. g2_end();
  228. ///if is_paint
  229. _texpaint_nor = image_from_bytes(lz4_decode(ld.texpaint_nor, ld.res * ld.res * 4 * bytes_per_pixel), ld.res, ld.res, format);
  230. g2_begin(l.texpaint_nor);
  231. g2_set_pipeline(project.is_bgra ? base_pipe_copy_bgra : base_pipe_copy);
  232. g2_draw_image(_texpaint_nor, 0, 0);
  233. g2_set_pipeline(null);
  234. g2_end();
  235. _texpaint_pack = image_from_bytes(lz4_decode(ld.texpaint_pack, ld.res * ld.res * 4 * bytes_per_pixel), ld.res, ld.res, format);
  236. g2_begin(l.texpaint_pack);
  237. g2_set_pipeline(project.is_bgra ? base_pipe_copy_bgra : base_pipe_copy);
  238. g2_draw_image(_texpaint_pack, 0, 0);
  239. g2_set_pipeline(null);
  240. g2_end();
  241. ///end
  242. }
  243. l.scale = ld.uv_scale;
  244. l.angle = ld.uv_rot;
  245. l.uv_type = ld.uv_type;
  246. if (ld.decal_mat != null) {
  247. l.decal_mat = mat4_from_f32_array(ld.decal_mat);
  248. }
  249. l.mask_opacity = ld.opacity_mask;
  250. l.object_mask = ld.object_mask;
  251. l.blending = ld.blending;
  252. ///if is_paint
  253. l.paint_base = ld.paint_base;
  254. l.paint_opac = ld.paint_opac;
  255. l.paint_occ = ld.paint_occ;
  256. l.paint_rough = ld.paint_rough;
  257. l.paint_met = ld.paint_met;
  258. l.paint_nor = ld.paint_nor;
  259. l.paint_nor_blend = ld.paint_nor_blend != null ? ld.paint_nor_blend : true; // TODO: deprecated
  260. l.paint_height = ld.paint_height;
  261. l.paint_height_blend = ld.paint_height_blend != null ? ld.paint_height_blend : true; // TODO: deprecated
  262. l.paint_emis = ld.paint_emis;
  263. l.paint_subs = ld.paint_subs;
  264. ///end
  265. app_notify_on_next_frame(function (_texpaint: image_t) {
  266. image_unload(_texpaint);
  267. }, _texpaint);
  268. ///if is_paint
  269. if (_texpaint_nor != null) {
  270. app_notify_on_next_frame(function (_texpaint_nor: image_t) {
  271. image_unload(_texpaint_nor);
  272. }, _texpaint_nor);
  273. }
  274. if (_texpaint_pack != null) {
  275. app_notify_on_next_frame(function (_texpaint_pack: image_t) {
  276. image_unload(_texpaint_pack);
  277. }, _texpaint_pack);
  278. }
  279. ///end
  280. }
  281. }
  282. // Assign parents to groups and masks
  283. for (let i: i32 = 0; i < project.layer_datas.length; ++i) {
  284. let ld: layer_data_t = project.layer_datas[i];
  285. if (ld.parent >= 0) {
  286. project_layers[i].parent = project_layers[ld.parent];
  287. }
  288. }
  289. context_set_layer(project_layers[0]);
  290. // Materials
  291. let m0: material_data_t = data_get_material("Scene", "Material");
  292. project_materials = [];
  293. for (let i: i32 = 0; i < project.material_nodes.length; ++i) {
  294. let n: zui_node_canvas_t = project.material_nodes[i];
  295. import_arm_init_nodes(n.nodes);
  296. context_raw.material = slot_material_create(m0, n);
  297. array_push(project_materials, context_raw.material);
  298. }
  299. ///end
  300. ui_nodes_hwnd.redraws = 2;
  301. ui_nodes_group_stack = [];
  302. project_material_groups = [];
  303. if (project.material_groups != null) {
  304. for (let i: i32 = 0; i < project.material_groups.length; ++i) {
  305. let g: zui_node_canvas_t = project.material_groups[i];
  306. array_push(project_material_groups, { canvas: g, nodes: zui_nodes_create() });
  307. }
  308. }
  309. ///if (is_paint || is_sculpt)
  310. for (let i: i32 = 0; i < project_materials.length; ++i) {
  311. let m: slot_material_t = project_materials[i];
  312. context_raw.material = m;
  313. make_material_parse_paint_material();
  314. util_render_make_material_preview();
  315. }
  316. project_brushes = [];
  317. for (let i: i32 = 0; i < project.brush_nodes.length; ++i) {
  318. let n: zui_node_canvas_t = project.brush_nodes[i];
  319. import_arm_init_nodes(n.nodes);
  320. context_raw.brush = slot_brush_create(n);
  321. array_push(project_brushes, context_raw.brush);
  322. make_material_parse_brush();
  323. util_render_make_brush_preview();
  324. }
  325. // Fill layers
  326. for (let i: i32 = 0; i < project.layer_datas.length; ++i) {
  327. let ld: layer_data_t = project.layer_datas[i];
  328. let l: slot_layer_t = project_layers[i];
  329. let is_group: bool = ld.texpaint == null;
  330. if (!is_group) {
  331. l.fill_layer = ld.fill_layer > -1 ? project_materials[ld.fill_layer] : null;
  332. }
  333. }
  334. ui_base_hwnds[tab_area_t.SIDEBAR0].redraws = 2;
  335. ui_base_hwnds[tab_area_t.SIDEBAR1].redraws = 2;
  336. ///end
  337. ///if is_lab
  338. import_arm_init_nodes(project.material.nodes);
  339. project_canvas = project.material;
  340. parser_logic_parse(project_canvas);
  341. ///end
  342. context_raw.ddirty = 4;
  343. data_delete_blob(path);
  344. }
  345. ///if (is_paint || is_sculpt)
  346. function import_arm_run_mesh(raw: scene_t) {
  347. project_paint_objects = [];
  348. for (let i: i32 = 0; i < raw.mesh_datas.length; ++i) {
  349. let md: mesh_data_t = mesh_data_create(raw.mesh_datas[i]);
  350. let object: mesh_object_t = null;
  351. if (i == 0) {
  352. mesh_object_set_data(context_raw.paint_object, md);
  353. object = context_raw.paint_object;
  354. }
  355. else {
  356. object = scene_add_mesh_object(md, context_raw.paint_object.materials, context_raw.paint_object.base);
  357. object.base.name = md.name;
  358. object.skip_context = "paint";
  359. md._.handle = md.name;
  360. map_set(data_cached_meshes, md._.handle, md);
  361. }
  362. vec4_set(object.base.transform.scale, 1, 1, 1);
  363. transform_build_matrix(object.base.transform);
  364. object.base.name = md.name;
  365. array_push(project_paint_objects, object);
  366. util_mesh_merge();
  367. viewport_scale_to_bounds();
  368. }
  369. app_notify_on_init(base_init_layers);
  370. history_reset();
  371. }
  372. function import_arm_run_material(path: string) {
  373. let b: buffer_t = data_get_blob(path);
  374. let project: project_format_t = armpack_decode(b);
  375. if (project.version == null) {
  376. data_delete_blob(path);
  377. return;
  378. }
  379. import_arm_run_material_from_project(project, path);
  380. }
  381. function import_arm_run_material_from_project(project: project_format_t, path: string) {
  382. let base: string = path_base_dir(path);
  383. for (let i: i32 = 0; i < project.assets.length; ++i) {
  384. let file: string = project.assets[i];
  385. ///if krom_windows
  386. file = string_replace_all(file, "/", "\\");
  387. ///else
  388. file = string_replace_all(file, "\\", "/");
  389. ///end
  390. // Convert image path from relative to absolute
  391. let abs: string = data_is_abs(file) ? file : base + file;
  392. if (project.packed_assets != null) {
  393. abs = path_normalize(abs);
  394. import_arm_unpack_asset(project, abs, file);
  395. }
  396. if (map_get(data_cached_images, abs) == null && !file_exists(abs)) {
  397. import_arm_make_pink(abs);
  398. }
  399. import_texture_run(abs);
  400. }
  401. let m0: material_data_t = data_get_material("Scene", "Material");
  402. let imported: slot_material_t[] = [];
  403. for (let i: i32 = 0; i < project.material_nodes.length; ++i) {
  404. let c: zui_node_canvas_t = project.material_nodes[i];
  405. import_arm_init_nodes(c.nodes);
  406. context_raw.material = slot_material_create(m0, c);
  407. array_push(project_materials, context_raw.material);
  408. array_push(imported, context_raw.material);
  409. history_new_material();
  410. }
  411. if (project.material_groups != null) {
  412. for (let i: i32 = 0; i < project.material_groups.length; ++i) {
  413. let c: zui_node_canvas_t = project.material_groups[i];
  414. while (import_arm_group_exists(c)) {
  415. import_arm_rename_group(c.name, imported, project.material_groups); // Ensure unique group name
  416. }
  417. import_arm_init_nodes(c.nodes);
  418. array_push(project_material_groups, { canvas: c, nodes: zui_nodes_create() });
  419. }
  420. }
  421. app_notify_on_init(function (imported: slot_material_t[]) {
  422. for (let i: i32 = 0; i < imported.length; ++i) {
  423. let m: slot_material_t = imported[i];
  424. context_set_material(m);
  425. make_material_parse_paint_material();
  426. util_render_make_material_preview();
  427. }
  428. }, imported);
  429. ui_nodes_group_stack = [];
  430. ui_base_hwnds[tab_area_t.SIDEBAR1].redraws = 2;
  431. data_delete_blob(path);
  432. }
  433. function import_arm_group_exists(c: zui_node_canvas_t): bool {
  434. for (let i: i32 = 0; i < project_material_groups.length; ++i) {
  435. let g: node_group_t = project_material_groups[i];
  436. if (g.canvas.name == c.name) {
  437. return true;
  438. }
  439. }
  440. return false;
  441. }
  442. function import_arm_rename_group(name: string, materials: slot_material_t[], groups: zui_node_canvas_t[]) {
  443. for (let i: i32 = 0; i < materials.length; ++i) {
  444. let m: slot_material_t = materials[i];
  445. for (let i: i32 = 0; i < m.canvas.nodes.length; ++i) {
  446. let n: zui_node_t = m.canvas.nodes[i];
  447. if (n.type == "GROUP" && n.name == name) {
  448. n.name += ".1";
  449. }
  450. }
  451. }
  452. for (let i: i32 = 0; i < groups.length; ++i) {
  453. let c: zui_node_canvas_t = groups[i];
  454. if (c.name == name) {
  455. c.name += ".1";
  456. }
  457. for (let i: i32 = 0; i < c.nodes.length; ++i) {
  458. let n: zui_node_t = c.nodes[i];
  459. if (n.type == "GROUP" && n.name == name) {
  460. n.name += ".1";
  461. }
  462. }
  463. }
  464. }
  465. function import_arm_run_brush(path: string) {
  466. let b: buffer_t = data_get_blob(path);
  467. let project: project_format_t = armpack_decode(b);
  468. if (project.version == null) {
  469. data_delete_blob(path);
  470. return;
  471. }
  472. import_arm_run_brush_from_project(project, path);
  473. }
  474. function import_arm_run_brush_from_project(project: project_format_t, path: string) {
  475. let base: string = path_base_dir(path);
  476. for (let i: i32 = 0; i < project.assets.length; ++i) {
  477. let file: string = project.assets[i];
  478. ///if krom_windows
  479. file = string_replace_all(file, "/", "\\");
  480. ///else
  481. file = string_replace_all(file, "\\", "/");
  482. ///end
  483. // Convert image path from relative to absolute
  484. let abs: string = data_is_abs(file) ? file : base + file;
  485. if (project.packed_assets != null) {
  486. abs = path_normalize(abs);
  487. import_arm_unpack_asset(project, abs, file);
  488. }
  489. if (map_get(data_cached_images, abs) == null && !file_exists(abs)) {
  490. import_arm_make_pink(abs);
  491. }
  492. import_texture_run(abs);
  493. }
  494. let imported: slot_brush_t[] = [];
  495. for (let i: i32 = 0; i < project.brush_nodes.length; ++i) {
  496. let n: zui_node_canvas_t = project.brush_nodes[i];
  497. import_arm_init_nodes(n.nodes);
  498. context_raw.brush = slot_brush_create(n);
  499. array_push(project_brushes, context_raw.brush);
  500. array_push(imported, context_raw.brush);
  501. }
  502. app_notify_on_init(function (imported: slot_brush_t[]) {
  503. for (let i: i32 = 0; i < imported.length; ++i) {
  504. let b: slot_brush_t = imported[i];
  505. context_set_brush(b);
  506. util_render_make_brush_preview();
  507. }
  508. }, imported);
  509. ui_base_hwnds[tab_area_t.SIDEBAR1].redraws = 2;
  510. data_delete_blob(path);
  511. }
  512. ///end
  513. function import_arm_run_swatches(path: string, replace_existing: bool = false) {
  514. let b: buffer_t = data_get_blob(path);
  515. let project: project_format_t = armpack_decode(b);
  516. if (project.version == null) {
  517. data_delete_blob(path);
  518. return;
  519. }
  520. import_arm_run_swatches_from_project(project, path, replace_existing);
  521. }
  522. function import_arm_run_swatches_from_project(project: project_format_t, path: string, replace_existing: bool = false) {
  523. if (replace_existing) {
  524. project_raw.swatches = [];
  525. if (project.swatches == null) { // No swatches contained
  526. array_push(project_raw.swatches, make_swatch());
  527. }
  528. }
  529. if (project.swatches != null) {
  530. for (let i: i32 = 0; i < project.swatches.length; ++i) {
  531. let s: swatch_color_t = project.swatches[i];
  532. array_push(project_raw.swatches, s);
  533. }
  534. }
  535. ui_base_hwnds[tab_area_t.STATUS].redraws = 2;
  536. data_delete_blob(path);
  537. }
  538. function import_arm_make_pink(abs: string) {
  539. console_error(strings_error2() + " " + abs);
  540. let b: u8_array_t = u8_array_create(4);
  541. b[0] = 255;
  542. b[1] = 0;
  543. b[2] = 255;
  544. b[3] = 255;
  545. let pink: image_t = image_from_bytes(b.buffer, 1, 1);
  546. map_set(data_cached_images, abs, pink);
  547. }
  548. function import_arm_texture_node_name(): string {
  549. ///if (is_paint || is_sculpt)
  550. return "TEX_IMAGE";
  551. ///else
  552. return "ImageTextureNode";
  553. ///end
  554. }
  555. function import_arm_init_nodes(nodes: zui_node_t[]) {
  556. for (let i: i32 = 0; i < nodes.length; ++i) {
  557. let node: zui_node_t = nodes[i];
  558. if (node.type == import_arm_texture_node_name()) {
  559. node.buttons[0].default_value = f32_array_create_x(base_get_asset_index(u8_array_to_string(node.buttons[0].data)));
  560. node.buttons[0].data = u8_array_create_from_string("");
  561. }
  562. }
  563. }
  564. function import_arm_unpack_asset(project: project_format_t, abs: string, file: string) {
  565. if (project_raw.packed_assets == null) {
  566. project_raw.packed_assets = [];
  567. }
  568. for (let i: i32 = 0; i < project.packed_assets.length; ++i) {
  569. let pa: packed_asset_t = project.packed_assets[i];
  570. ///if krom_windows
  571. pa.name = string_replace_all(pa.name, "/", "\\");
  572. ///else
  573. pa.name = string_replace_all(pa.name, "\\", "/");
  574. ///end
  575. pa.name = path_normalize(pa.name);
  576. if (pa.name == file) {
  577. pa.name = abs; // From relative to absolute
  578. }
  579. if (pa.name == abs) {
  580. if (!project_packed_asset_exists(project_raw.packed_assets, pa.name)) {
  581. array_push(project_raw.packed_assets, pa);
  582. }
  583. let image: image_t = image_from_encoded_bytes(pa.bytes, ends_with(pa.name, ".jpg") ? ".jpg" : ".png");
  584. map_set(data_cached_images, abs, image);
  585. break;
  586. }
  587. }
  588. }