object.ts 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. type object_t = {
  2. uid?: i32;
  3. urandom?: f32;
  4. raw?: obj_t;
  5. name?: string;
  6. transform?: transform_t;
  7. parent?: object_t;
  8. children?: object_t[];
  9. /// if arm_anim
  10. animation?: anim_raw_t;
  11. /// end
  12. visible?: bool; // Skip render, keep updating
  13. culled?: bool; // base_object_t was culled last frame
  14. is_empty?: bool;
  15. ext?: any; // mesh_object_t | camera_object_t | speaker_object_t
  16. ext_type?: string;
  17. };
  18. let _object_uid_counter: i32 = 0;
  19. function object_create(is_empty: bool = true): object_t {
  20. let raw: object_t = {};
  21. raw.name = "";
  22. raw.children = [];
  23. raw.visible = true;
  24. raw.culled = false;
  25. raw.uid = _object_uid_counter++;
  26. raw.transform = transform_create(raw);
  27. raw.is_empty = is_empty;
  28. if (raw.is_empty) {
  29. array_push(scene_empties, raw);
  30. }
  31. return raw;
  32. }
  33. function object_set_parent(raw: object_t, parent_object: object_t, parent_inv: bool = false, keep_transform: bool = false) {
  34. if (parent_object == raw || parent_object == raw.parent) {
  35. return;
  36. }
  37. if (raw.parent != null) {
  38. array_remove(raw.parent.children, raw);
  39. if (keep_transform) {
  40. transform_apply_parent(raw.transform);
  41. }
  42. raw.parent = null; // rebuild matrix without a parent
  43. transform_build_matrix(raw.transform);
  44. }
  45. if (parent_object == null) {
  46. parent_object = _scene_scene_parent;
  47. }
  48. raw.parent = parent_object;
  49. array_push(raw.parent.children, raw);
  50. if (parent_inv) {
  51. transform_apply_parent_inv(raw.transform);
  52. }
  53. }
  54. function object_remove_super(raw: object_t) {
  55. if (raw.is_empty) {
  56. array_remove(scene_empties, raw);
  57. }
  58. /// if arm_anim
  59. if (raw.animation != null) {
  60. anim_remove(raw.animation);
  61. }
  62. /// end
  63. while (raw.children.length > 0) {
  64. object_remove(raw.children[0]);
  65. }
  66. if (raw.parent != null) {
  67. array_remove(raw.parent.children, raw);
  68. raw.parent = null;
  69. }
  70. }
  71. function object_remove(raw: object_t) {
  72. if (raw.ext_type == "mesh_object_t") {
  73. mesh_object_remove(raw.ext);
  74. }
  75. else if (raw.ext_type == "camera_object_t") {
  76. camera_object_remove(raw.ext);
  77. }
  78. /// if arm_audio
  79. else if (raw.ext_type == "speaker_object_t") {
  80. speaker_object_remove(raw.ext);
  81. }
  82. /// end
  83. else {
  84. object_remove_super(raw);
  85. }
  86. }
  87. function object_get_child(raw: object_t, name: string): object_t {
  88. if (raw.name == name) {
  89. return raw;
  90. }
  91. else {
  92. for (let i: i32 = 0; i < raw.children.length; ++i) {
  93. let c: object_t = raw.children[i];
  94. let r: object_t = object_get_child(c, name);
  95. if (r != null) {
  96. return r;
  97. }
  98. }
  99. }
  100. return null;
  101. }
  102. function object_get_children(raw: object_t, recursive: bool = false): object_t[] {
  103. if (!recursive) {
  104. return raw.children;
  105. }
  106. let ret_children: object_t[] = array_slice(raw.children, 0, raw.children.length);
  107. for (let i: i32 = 0; i < raw.children.length; ++i) {
  108. let c: object_t = raw.children[i];
  109. ret_children = array_concat(ret_children, object_get_children(c, recursive));
  110. }
  111. return ret_children;
  112. }
  113. /// if arm_anim
  114. function object_setup_animation_super(raw: object_t, oactions: scene_t[] = null) {
  115. // object_t actions
  116. if (oactions == null) {
  117. return;
  118. }
  119. raw.animation = anim_object_create(raw, oactions).base;
  120. }
  121. function object_setup_animation(raw: object_t, oactions: scene_t[] = null) {
  122. if (raw.ext_type == "mesh_object_t") {
  123. mesh_object_setup_animation(raw.ext, oactions);
  124. }
  125. else {
  126. object_setup_animation_super(raw, oactions);
  127. }
  128. }
  129. /// end