util_encode.ts 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. function util_encode_scene(raw: scene_t): buffer_t {
  2. let size: i32 = 8 * 1024 * 1024 + util_encode_mesh_data_size(raw.mesh_datas);
  3. let encoded: buffer_t = buffer_create(size);
  4. armpack_encode_start(encoded.buffer);
  5. armpack_encode_map(13);
  6. armpack_encode_string("name");
  7. armpack_encode_null();
  8. armpack_encode_string("objects");
  9. armpack_encode_null();
  10. util_encode_mesh_datas(raw.mesh_datas);
  11. armpack_encode_string("camera_datas");
  12. armpack_encode_null();
  13. armpack_encode_string("camera_ref");
  14. armpack_encode_null();
  15. armpack_encode_string("material_datas");
  16. armpack_encode_null();
  17. armpack_encode_string("shader_datas");
  18. armpack_encode_null();
  19. armpack_encode_string("world_datas");
  20. armpack_encode_null();
  21. armpack_encode_string("world_ref");
  22. armpack_encode_null();
  23. armpack_encode_string("speaker_datas");
  24. armpack_encode_null();
  25. armpack_encode_string("embedded_datas");
  26. armpack_encode_null();
  27. let ei: i32 = armpack_encode_end();
  28. encoded.length = ei;
  29. return encoded;
  30. }
  31. function util_encode_node_canvas(c: ui_node_canvas_t) {
  32. ui_node_canvas_encode(c);
  33. }
  34. function util_encode_mesh_data_size(datas: mesh_data_t[]): i32 {
  35. if (datas == null) {
  36. return 0;
  37. }
  38. let size: i32 = 0;
  39. for (let i: i32 = 0; i < datas.length; ++i) {
  40. for (let j: i32 = 0; j < datas[i].vertex_arrays.length; ++j) {
  41. size += datas[i].vertex_arrays[j].values.length * 2;
  42. }
  43. size += datas[i].index_array.length * 4;
  44. }
  45. return size;
  46. }
  47. function util_encode_packed_assets_size(assets: packed_asset_t[]): i32 {
  48. if (assets == null) {
  49. return 0;
  50. }
  51. let size: i32 = 0;
  52. for (let i: i32 = 0; i < assets.length; ++i) {
  53. let asset: packed_asset_t = assets[i];
  54. let bytes: buffer_t = asset.bytes;
  55. size += bytes.length;
  56. }
  57. return size;
  58. }
  59. function util_encode_buffers_size(buffers: buffer_t[]): i32 {
  60. if (buffers == null) {
  61. return 0;
  62. }
  63. let size: i32 = 0;
  64. for (let i: i32 = 0; i < buffers.length; ++i) {
  65. size += buffers[i].length;
  66. }
  67. return size;
  68. }
  69. function util_encode_layer_data_size(datas: layer_data_t[]): i32 {
  70. if (datas == null) {
  71. return 0;
  72. }
  73. let size: i32 = 0;
  74. for (let i: i32 = 0; i < datas.length; ++i) {
  75. let tp: buffer_t = datas[i].texpaint;
  76. if (tp != null) {
  77. size += tp.length;
  78. }
  79. let tp_nor: buffer_t = datas[i].texpaint_nor;
  80. if (tp_nor != null) {
  81. size += tp_nor.length;
  82. }
  83. let tp_pack: buffer_t = datas[i].texpaint_pack;
  84. if (tp_pack != null) {
  85. size += tp_pack.length;
  86. }
  87. }
  88. return size;
  89. }
  90. function util_encode_mesh_datas(datas: mesh_data_t[]) {
  91. armpack_encode_string("mesh_datas");
  92. if (datas == null) {
  93. armpack_encode_null();
  94. return;
  95. }
  96. armpack_encode_array(datas.length);
  97. for (let i: i32 = 0; i < datas.length; ++i) {
  98. armpack_encode_map(5);
  99. armpack_encode_string("name");
  100. armpack_encode_string(datas[i].name);
  101. armpack_encode_string("scale_pos");
  102. armpack_encode_f32(datas[i].scale_pos);
  103. armpack_encode_string("scale_tex");
  104. armpack_encode_f32(datas[i].scale_tex);
  105. armpack_encode_string("vertex_arrays");
  106. armpack_encode_array(datas[i].vertex_arrays.length);
  107. for (let j: i32 = 0; j < datas[i].vertex_arrays.length; ++j) {
  108. armpack_encode_map(3);
  109. armpack_encode_string("attrib");
  110. armpack_encode_string(datas[i].vertex_arrays[j].attrib);
  111. armpack_encode_string("data");
  112. armpack_encode_string(datas[i].vertex_arrays[j].data);
  113. armpack_encode_string("values");
  114. armpack_encode_array_i16(datas[i].vertex_arrays[j].values);
  115. }
  116. armpack_encode_string("index_array");
  117. armpack_encode_array_i32(datas[i].index_array);
  118. }
  119. }
  120. function util_encode_project(raw: project_format_t): buffer_t {
  121. let size: i32 = 32 * 1024 * 1024 + util_encode_layer_data_size(raw.layer_datas) + util_encode_mesh_data_size(raw.mesh_datas) +
  122. util_encode_packed_assets_size(raw.packed_assets) + util_encode_buffers_size(raw.brush_icons) +
  123. util_encode_buffers_size(raw.material_icons) + util_encode_buffers_size(raw.mesh_icons);
  124. let encoded: buffer_t = buffer_create(size);
  125. armpack_encode_start(encoded.buffer);
  126. armpack_encode_map(24);
  127. armpack_encode_string("version");
  128. armpack_encode_string(raw.version);
  129. armpack_encode_string("assets");
  130. armpack_encode_array_string(raw.assets);
  131. armpack_encode_string("is_bgra");
  132. armpack_encode_bool(raw.is_bgra);
  133. armpack_encode_string("packed_assets");
  134. if (raw.packed_assets != null) {
  135. armpack_encode_array(raw.packed_assets.length);
  136. for (let i: i32 = 0; i < raw.packed_assets.length; ++i) {
  137. armpack_encode_map(2);
  138. armpack_encode_string("name");
  139. armpack_encode_string(raw.packed_assets[i].name);
  140. armpack_encode_string("bytes");
  141. armpack_encode_array_u8(raw.packed_assets[i].bytes);
  142. }
  143. }
  144. else {
  145. armpack_encode_null();
  146. }
  147. armpack_encode_string("envmap");
  148. armpack_encode_string(raw.envmap);
  149. armpack_encode_string("envmap_strength");
  150. armpack_encode_f32(raw.envmap_strength);
  151. armpack_encode_string("envmap_angle");
  152. armpack_encode_f32(raw.envmap_angle);
  153. armpack_encode_string("envmap_blur");
  154. armpack_encode_bool(raw.envmap_blur);
  155. armpack_encode_string("camera_world");
  156. armpack_encode_array_f32(raw.camera_world);
  157. armpack_encode_string("camera_origin");
  158. armpack_encode_array_f32(raw.camera_origin);
  159. armpack_encode_string("camera_fov");
  160. armpack_encode_f32(raw.camera_fov);
  161. armpack_encode_string("swatches");
  162. if (raw.swatches != null) {
  163. armpack_encode_array(raw.swatches.length);
  164. for (let i: i32 = 0; i < raw.swatches.length; ++i) {
  165. armpack_encode_map(9);
  166. armpack_encode_string("base");
  167. armpack_encode_i32(raw.swatches[i].base);
  168. armpack_encode_string("opacity");
  169. armpack_encode_f32(raw.swatches[i].opacity);
  170. armpack_encode_string("occlusion");
  171. armpack_encode_f32(raw.swatches[i].occlusion);
  172. armpack_encode_string("roughness");
  173. armpack_encode_f32(raw.swatches[i].roughness);
  174. armpack_encode_string("metallic");
  175. armpack_encode_f32(raw.swatches[i].metallic);
  176. armpack_encode_string("normal");
  177. armpack_encode_i32(raw.swatches[i].normal);
  178. armpack_encode_string("emission");
  179. armpack_encode_f32(raw.swatches[i].emission);
  180. armpack_encode_string("height");
  181. armpack_encode_f32(raw.swatches[i].height);
  182. armpack_encode_string("subsurface");
  183. armpack_encode_f32(raw.swatches[i].subsurface);
  184. }
  185. }
  186. else {
  187. armpack_encode_null();
  188. }
  189. armpack_encode_string("brush_nodes");
  190. if (raw.brush_nodes != null) {
  191. armpack_encode_array(raw.brush_nodes.length);
  192. for (let i: i32 = 0; i < raw.brush_nodes.length; ++i) {
  193. util_encode_node_canvas(raw.brush_nodes[i]);
  194. }
  195. }
  196. else {
  197. armpack_encode_null();
  198. }
  199. armpack_encode_string("brush_icons");
  200. if (raw.brush_icons != null) {
  201. armpack_encode_array(raw.brush_icons.length);
  202. for (let i: i32 = 0; i < raw.brush_icons.length; ++i) {
  203. armpack_encode_array_u8(raw.brush_icons[i]);
  204. }
  205. }
  206. else {
  207. armpack_encode_null();
  208. }
  209. armpack_encode_string("material_nodes");
  210. if (raw.material_nodes != null) {
  211. armpack_encode_array(raw.material_nodes.length);
  212. for (let i: i32 = 0; i < raw.material_nodes.length; ++i) {
  213. util_encode_node_canvas(raw.material_nodes[i]);
  214. }
  215. }
  216. else {
  217. armpack_encode_null();
  218. }
  219. armpack_encode_string("material_groups");
  220. if (raw.material_groups != null) {
  221. armpack_encode_array(raw.material_groups.length);
  222. for (let i: i32 = 0; i < raw.material_groups.length; ++i) {
  223. util_encode_node_canvas(raw.material_groups[i]);
  224. }
  225. }
  226. else {
  227. armpack_encode_null();
  228. }
  229. armpack_encode_string("material_icons");
  230. if (raw.material_icons != null) {
  231. armpack_encode_array(raw.material_icons.length);
  232. for (let i: i32 = 0; i < raw.material_icons.length; ++i) {
  233. armpack_encode_array_u8(raw.material_icons[i]);
  234. }
  235. }
  236. else {
  237. armpack_encode_null();
  238. }
  239. armpack_encode_string("font_assets");
  240. armpack_encode_array_string(raw.font_assets);
  241. armpack_encode_string("layer_datas");
  242. if (raw.layer_datas != null) {
  243. armpack_encode_array(raw.layer_datas.length);
  244. for (let i: i32 = 0; i < raw.layer_datas.length; ++i) {
  245. armpack_encode_map(28);
  246. armpack_encode_string("name");
  247. armpack_encode_string(raw.layer_datas[i].name);
  248. armpack_encode_string("res");
  249. armpack_encode_i32(raw.layer_datas[i].res);
  250. armpack_encode_string("bpp");
  251. armpack_encode_i32(raw.layer_datas[i].bpp);
  252. armpack_encode_string("texpaint");
  253. armpack_encode_array_u8(raw.layer_datas[i].texpaint);
  254. armpack_encode_string("uv_scale");
  255. armpack_encode_f32(raw.layer_datas[i].uv_scale);
  256. armpack_encode_string("uv_rot");
  257. armpack_encode_f32(raw.layer_datas[i].uv_rot);
  258. armpack_encode_string("uv_type");
  259. armpack_encode_i32(raw.layer_datas[i].uv_type);
  260. armpack_encode_string("decal_mat");
  261. armpack_encode_array_f32(raw.layer_datas[i].decal_mat);
  262. armpack_encode_string("opacity_mask");
  263. armpack_encode_f32(raw.layer_datas[i].opacity_mask);
  264. armpack_encode_string("fill_layer");
  265. armpack_encode_i32(raw.layer_datas[i].fill_layer);
  266. armpack_encode_string("object_mask");
  267. armpack_encode_i32(raw.layer_datas[i].object_mask);
  268. armpack_encode_string("blending");
  269. armpack_encode_i32(raw.layer_datas[i].blending);
  270. armpack_encode_string("parent");
  271. armpack_encode_i32(raw.layer_datas[i].parent);
  272. armpack_encode_string("visible");
  273. armpack_encode_bool(raw.layer_datas[i].visible);
  274. armpack_encode_string("texpaint_nor");
  275. armpack_encode_array_u8(raw.layer_datas[i].texpaint_nor);
  276. armpack_encode_string("texpaint_pack");
  277. armpack_encode_array_u8(raw.layer_datas[i].texpaint_pack);
  278. armpack_encode_string("paint_base");
  279. armpack_encode_bool(raw.layer_datas[i].paint_base);
  280. armpack_encode_string("paint_opac");
  281. armpack_encode_bool(raw.layer_datas[i].paint_opac);
  282. armpack_encode_string("paint_occ");
  283. armpack_encode_bool(raw.layer_datas[i].paint_occ);
  284. armpack_encode_string("paint_rough");
  285. armpack_encode_bool(raw.layer_datas[i].paint_rough);
  286. armpack_encode_string("paint_met");
  287. armpack_encode_bool(raw.layer_datas[i].paint_met);
  288. armpack_encode_string("paint_nor");
  289. armpack_encode_bool(raw.layer_datas[i].paint_nor);
  290. armpack_encode_string("paint_nor_blend");
  291. armpack_encode_bool(raw.layer_datas[i].paint_nor_blend);
  292. armpack_encode_string("paint_height");
  293. armpack_encode_bool(raw.layer_datas[i].paint_height);
  294. armpack_encode_string("paint_height_blend");
  295. armpack_encode_bool(raw.layer_datas[i].paint_height_blend);
  296. armpack_encode_string("paint_emis");
  297. armpack_encode_bool(raw.layer_datas[i].paint_emis);
  298. armpack_encode_string("paint_subs");
  299. armpack_encode_bool(raw.layer_datas[i].paint_subs);
  300. armpack_encode_string("uv_map");
  301. armpack_encode_i32(raw.layer_datas[i].uv_map);
  302. }
  303. }
  304. else {
  305. armpack_encode_null();
  306. }
  307. util_encode_mesh_datas(raw.mesh_datas);
  308. armpack_encode_string("mesh_assets");
  309. armpack_encode_array_string(raw.mesh_assets);
  310. armpack_encode_string("mesh_icons");
  311. if (raw.mesh_icons != null) {
  312. armpack_encode_array(raw.mesh_icons.length);
  313. for (let i: i32 = 0; i < raw.mesh_icons.length; ++i) {
  314. armpack_encode_array_u8(raw.mesh_icons[i]);
  315. }
  316. }
  317. else {
  318. armpack_encode_null();
  319. }
  320. armpack_encode_string("atlas_objects");
  321. armpack_encode_array_i32(raw.atlas_objects);
  322. armpack_encode_string("atlas_names");
  323. armpack_encode_array_string(raw.atlas_names);
  324. let ei: i32 = armpack_encode_end();
  325. encoded.length = ei;
  326. return encoded;
  327. }