// Demolish object to reference public static bool DemolishReference(RayfireRigid scr) { if (scr.demolitionType == DemolitionType.ReferenceDemolition) { // Get instance GameObject referenceGo = scr.referenceDemolition.GetReference(); // Has reference if (referenceGo != null) { // Instantiate turned off reference bool refState = referenceGo.activeSelf; referenceGo.SetActive(false); GameObject fragRoot = scr.InstantiateGo(referenceGo); referenceGo.SetActive(refState); fragRoot.name = referenceGo.name; // Set tm scr.rootChild = fragRoot.transform; scr.rootChild.position = scr.transForm.position; scr.rootChild.rotation = scr.transForm.rotation; scr.rootChild.transform.parent = RayfireMan.inst.transForm; // Clear list for fragments scr.fragments = new List <RayfireRigid>(); // Check root for rigid props RayfireRigid rootScr = fragRoot.gameObject.GetComponent <RayfireRigid>(); // Reference Root has not rigid. Add to if (rootScr == null && scr.referenceDemolition.addRigid == true) { // Add rigid and copy rootScr = fragRoot.gameObject.AddComponent <RayfireRigid>(); rootScr.initialization = RayfireRigid.InitType.AtStart; scr.CopyPropertiesTo(rootScr); // Copy particles RFParticles.CopyParticles(scr, rootScr); // Single mesh TODO improve if (fragRoot.transform.childCount == 0) { rootScr.objectType = ObjectType.Mesh; } // Multiple meshes if (fragRoot.transform.childCount > 0) { rootScr.objectType = ObjectType.MeshRoot; } } // Activate and init rigid scr.rootChild.gameObject.SetActive(true); // Reference has rigid if (rootScr != null) { // Create rigid for root children if (rootScr.objectType == ObjectType.MeshRoot) { for (int i = 0; i < rootScr.fragments.Count; i++) { rootScr.fragments[i].limitations.currentDepth++; } scr.fragments.AddRange(rootScr.fragments); scr.DestroyRigid(rootScr); } // Get ref rigid else if (rootScr.objectType == ObjectType.Mesh || rootScr.objectType == ObjectType.SkinnedMesh) { rootScr.meshDemolition.runtimeCaching.type = CachingType.Disable; RFDemolitionMesh.DemolishMesh(rootScr); // TODO COPY MESH DATA FROM ROOTSCR TO THIS TO REUSE scr.fragments.AddRange(rootScr.fragments); RayfireMan.DestroyFragment(rootScr, rootScr.rootParent, 1f); } // Get ref rigid else if (rootScr.objectType == ObjectType.NestedCluster || rootScr.objectType == ObjectType.ConnectedCluster) { rootScr.Default(); rootScr.limitations.contactPoint = scr.limitations.contactPoint; RFDemolitionCluster.DemolishCluster(rootScr); rootScr.physics.exclude = true; scr.fragments.AddRange(rootScr.fragments); RayfireMan.DestroyFragment(rootScr, rootScr.rootParent, 1f); } // Has rigid by has No fragments. Stop demolition if (scr.HasFragments == false) { scr.demolitionType = DemolitionType.None; return(false); } } } // Has no rigid, has No fragments, but demolished scr.limitations.demolished = true; } return(true); }
/// ///////////////////////////////////////////////////////// /// Static /// ///////////////////////////////////////////////////////// // Activate inactive object public static void Activate(RayfireRigid scr) { // Stop if excluded if (scr.physics.exclude == true) { return; } // Initialize if not if (scr.initialized == false) { scr.Initialize(); } // Turn convex if kinematik activation if (scr.simulationType == SimType.Kinematic) { MeshCollider meshCollider = scr.physics.meshCollider as MeshCollider; if (meshCollider != null) { meshCollider.convex = true; } // Swap with animated object if (scr.physics.recorder == true) { // Set dynamic before copy scr.simulationType = SimType.Dynamic; scr.physics.rigidBody.isKinematic = false; scr.physics.rigidBody.useGravity = scr.physics.useGravity; // Create copy GameObject inst = scr.InstantiateGo(scr.gameObject); inst.transform.position = scr.transForm.position; inst.transform.rotation = scr.transForm.rotation; // Save velocity Rigidbody rBody = inst.GetComponent <Rigidbody>(); if (rBody != null) { rBody.velocity = scr.physics.rigidBody.velocity; rBody.angularVelocity = scr.physics.rigidBody.angularVelocity; } // Activate and init rigid scr.gameObject.SetActive(false); } } // Connectivity check scr.activation.CheckConnectivity(); // Set state scr.activation.activated = true; // Set props scr.simulationType = SimType.Dynamic; scr.physics.rigidBody.isKinematic = false; scr.physics.rigidBody.useGravity = scr.physics.useGravity; // Fade on activation if (scr.fading.onActivation == true) { scr.Fade(); } // Init particles on activation RFParticles.InitActivationParticles(scr); // Event scr.activationEvent.InvokeLocalEvent(scr); RFActivationEvent.InvokeGlobalEvent(scr); // TODO add initial velocity and rotation if still //rigidBody.velocity = }