sim.ts 3.7 KB

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