| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- type object_t = {
- uid?: i32;
- urandom?: f32;
- raw?: obj_t;
- name?: string;
- transform?: transform_t;
- parent?: object_t;
- children?: object_t[];
- /// if arm_anim
- animation?: anim_raw_t;
- /// end
- visible?: bool; // Skip render, keep updating
- culled?: bool; // base_object_t was culled last frame
- is_empty?: bool;
- ext?: any; // mesh_object_t | camera_object_t | speaker_object_t
- ext_type?: string;
- };
- let _object_uid_counter: i32 = 0;
- function object_create(is_empty: bool = true): object_t {
- let raw: object_t = {};
- raw.name = "";
- raw.children = [];
- raw.visible = true;
- raw.culled = false;
- raw.uid = _object_uid_counter++;
- raw.transform = transform_create(raw);
- raw.is_empty = is_empty;
- if (raw.is_empty) {
- array_push(scene_empties, raw);
- }
- return raw;
- }
- function object_set_parent(raw: object_t, parent_object: object_t, parent_inv: bool = false, keep_transform: bool = false) {
- if (parent_object == raw || parent_object == raw.parent) {
- return;
- }
- if (raw.parent != null) {
- array_remove(raw.parent.children, raw);
- if (keep_transform) {
- transform_apply_parent(raw.transform);
- }
- raw.parent = null; // rebuild matrix without a parent
- transform_build_matrix(raw.transform);
- }
- if (parent_object == null) {
- parent_object = _scene_scene_parent;
- }
- raw.parent = parent_object;
- array_push(raw.parent.children, raw);
- if (parent_inv) {
- transform_apply_parent_inv(raw.transform);
- }
- }
- function object_remove_super(raw: object_t) {
- if (raw.is_empty) {
- array_remove(scene_empties, raw);
- }
- /// if arm_anim
- if (raw.animation != null) {
- anim_remove(raw.animation);
- }
- /// end
- while (raw.children.length > 0) {
- object_remove(raw.children[0]);
- }
- if (raw.parent != null) {
- array_remove(raw.parent.children, raw);
- raw.parent = null;
- }
- }
- function object_remove(raw: object_t) {
- if (raw.ext_type == "mesh_object_t") {
- mesh_object_remove(raw.ext);
- }
- else if (raw.ext_type == "camera_object_t") {
- camera_object_remove(raw.ext);
- }
- /// if arm_audio
- else if (raw.ext_type == "speaker_object_t") {
- speaker_object_remove(raw.ext);
- }
- /// end
- else {
- object_remove_super(raw);
- }
- }
- function object_get_child(raw: object_t, name: string): object_t {
- if (raw.name == name) {
- return raw;
- }
- else {
- for (let i: i32 = 0; i < raw.children.length; ++i) {
- let c: object_t = raw.children[i];
- let r: object_t = object_get_child(c, name);
- if (r != null) {
- return r;
- }
- }
- }
- return null;
- }
- function object_get_children(raw: object_t, recursive: bool = false): object_t[] {
- if (!recursive) {
- return raw.children;
- }
- let ret_children: object_t[] = array_slice(raw.children, 0, raw.children.length);
- for (let i: i32 = 0; i < raw.children.length; ++i) {
- let c: object_t = raw.children[i];
- ret_children = array_concat(ret_children, object_get_children(c, recursive));
- }
- return ret_children;
- }
- /// if arm_anim
- function object_setup_animation_super(raw: object_t, oactions: scene_t[] = null) {
- // object_t actions
- if (oactions == null) {
- return;
- }
- raw.animation = anim_object_create(raw, oactions).base;
- }
- function object_setup_animation(raw: object_t, oactions: scene_t[] = null) {
- if (raw.ext_type == "mesh_object_t") {
- mesh_object_setup_animation(raw.ext, oactions);
- }
- else {
- object_setup_animation_super(raw, oactions);
- }
- }
- /// end
|