sim.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. let sim_running: bool = false;
  2. let sim_transforms: mat4_box_t[];
  3. let sim_object_script_map: map_t<object_t, string> = map_create();
  4. let sim_record: bool = false;
  5. function sim_init() {
  6. physics_world_create();
  7. }
  8. function sim_update() {
  9. render_path_raytrace_ready = false;
  10. if (sim_running) {
  11. // if (render_path_raytrace_frame != 1) {
  12. // return;
  13. // }
  14. let objects: object_t[] = map_keys(sim_object_script_map);
  15. for (let i: i32 = 0; i < objects.length; ++i) {
  16. let o: object_t = objects[i];
  17. let s: string = map_get(sim_object_script_map, o);
  18. let addr: string = i64_to_string((i64)(o.transform));
  19. s = "{let transform=" + addr + ";" + s + "}";
  20. js_eval(s);
  21. }
  22. let world: physics_world_t = physics_world_active;
  23. physics_world_update(world);
  24. iron_delay_idle_sleep();
  25. if (sim_record) {
  26. let rt: render_target_t = map_get(render_path_render_targets, "taa");
  27. let pixels: buffer_t = image_get_pixels(rt._image);
  28. ///if (arm_metal || arm_vulkan)
  29. export_arm_bgra_swap(pixels);
  30. ///end
  31. iron_mp4_encode(pixels);
  32. }
  33. }
  34. }
  35. function sim_play() {
  36. sim_running = true;
  37. if (sim_record) {
  38. if (project_filepath == "") {
  39. console_error(tr("Save project first"));
  40. sim_record = false;
  41. return;
  42. }
  43. let path: string = path_base_dir(project_filepath) + "/output.mp4";
  44. let rt: render_target_t = map_get(render_path_render_targets, "taa");
  45. iron_mp4_begin(path, rt._image.width, rt._image.height);
  46. }
  47. // Save transforms
  48. sim_transforms = [];
  49. let pos: mesh_object_t[] = project_paint_objects;
  50. for (let i: i32 = 0; i < pos.length; ++i) {
  51. let m: mat4_box_t = { v: pos[i].base.transform.local };
  52. array_push(sim_transforms, m);
  53. }
  54. }
  55. function sim_stop() {
  56. sim_running = false;
  57. if (sim_record) {
  58. iron_mp4_end();
  59. }
  60. // Restore transforms
  61. let pos: mesh_object_t[] = project_paint_objects;
  62. for (let i: i32 = 0; i < pos.length; ++i) {
  63. transform_set_matrix(pos[i].base.transform, sim_transforms[i].v);
  64. let pb: physics_body_t = map_get(physics_body_object_map, pos[i].base.uid);
  65. if (pb != null) {
  66. physics_body_sync_transform(pb);
  67. }
  68. }
  69. }
  70. function sim_add_body(o: object_t, shape: physics_shape_t, mass: f32) {
  71. let body: physics_body_t = physics_body_create();
  72. body.shape = shape;
  73. body.mass = mass;
  74. physics_body_init(body, o);
  75. }
  76. function sim_remove_body(uid: i32) {
  77. physics_body_remove(uid);
  78. }
  79. function sim_duplicate() {
  80. // Mesh
  81. let so: mesh_object_t = context_raw.selected_object.ext;
  82. let dup: mesh_object_t = scene_add_mesh_object(so.data, so.materials, so.base.parent);
  83. transform_set_matrix(dup.base.transform, so.base.transform.local);
  84. array_push(project_paint_objects, dup);
  85. dup.base.name = so.base.name;
  86. // Physics
  87. let pb: physics_body_t = map_get(physics_body_object_map, so.base.uid);
  88. if (pb != null) {
  89. let pbdup: physics_body_t = physics_body_create();
  90. pbdup.shape = pb.shape;
  91. pbdup.mass = pb.mass;
  92. physics_body_init(pbdup, dup.base);
  93. }
  94. _tab_scene_paint_object_length++;
  95. tab_scene_sort();
  96. }
  97. function sim_delete() {
  98. let so: mesh_object_t = context_raw.selected_object.ext;
  99. array_remove(project_paint_objects, so);
  100. mesh_object_remove(so);
  101. sim_remove_body(so.base.uid);
  102. _tab_scene_paint_object_length--;
  103. tab_scene_sort();
  104. }