/// ///////////////////////////////////////////////////////// /// Static /// ///////////////////////////////////////////////////////// // Activate inactive object public static void Activate(RayfireRigid scr) { // Stop if excluded if (scr.physics.exclude == true) { return; } // Skip not activatable unyielding objects if (scr.activation.activatable == false && scr.activation.unyielding == 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.rec == 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 = UnityEngine.Object.Instantiate(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) { // Size check if (scr.fading.sizeFilter > 0 && scr.fading.sizeFilter > scr.limitations.bboxSize) { scr.Fade(); } else { scr.Fade(); } } // Init particles on activation RFParticles.InitActivationParticles(scr); // Init sound RFSound.ActivationSound(scr.sound, scr.limitations.bboxSize); // Event scr.activationEvent.InvokeLocalEvent(scr); RFActivationEvent.InvokeGlobalEvent(scr); // Add initial rotation if still TODO put in ui if (scr.physics.rigidBody.angularVelocity == Vector3.zero) { float val = 1.0f; scr.physics.rigidBody.angularVelocity = new Vector3( Random.Range(-val, val), Random.Range(-val, val), Random.Range(-val, val)); } }
/// ///////////////////////////////////////////////////////// /// 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 = }
// Demolish object to reference public static bool DemolishReference(RayfireRigid scr) { if (scr.demolitionType == DemolitionType.ReferenceDemolition) { // Demolished scr.limitations.demolished = true; // Turn off original scr.gameObject.SetActive(false); // Get instance GameObject refGo = scr.referenceDemolition.GetReference(); // Has no reference if (refGo == null) { return(true); } // Instantiate turned off reference with null parent GameObject instGo = Object.Instantiate(refGo, scr.transForm.position, scr.transForm.rotation); instGo.name = refGo.name; // Set root to manager or to the same parent if (RayfireMan.inst != null && RayfireMan.inst.advancedDemolitionProperties.parent == RFManDemolition.FragmentParentType.Manager) { instGo.transform.parent = RayfireMan.inst.transform; } else { instGo.transform.parent = scr.transForm.parent; } // Set tm scr.rootChild = instGo.transform; // Copy scale if (scr.referenceDemolition.inheritScale == true) { scr.rootChild.localScale = scr.transForm.localScale; } // Clear list for fragments scr.fragments = new List <RayfireRigid>(); // Check root for rigid props RayfireRigid refScr = instGo.gameObject.GetComponent <RayfireRigid>(); // Reference Root has not rigid. Add to if (refScr == null && scr.referenceDemolition.addRigid == true) { // Add rigid and copy refScr = instGo.gameObject.AddComponent <RayfireRigid>(); // Copy rigid scr.CopyPropertiesTo(refScr); // Copy particles RFParticles.CopyParticles(scr, refScr); // Single mesh TODO improve if (instGo.transform.childCount == 0) { refScr.objectType = ObjectType.Mesh; } // Multiple meshes if (instGo.transform.childCount > 0) { refScr.objectType = ObjectType.MeshRoot; } } // Activate and init rigid instGo.transform.gameObject.SetActive(true); // Reference has rigid if (refScr != null) { // Init if not initialized yet refScr.Initialize(); // Create rigid for root children if (refScr.objectType == ObjectType.MeshRoot) { for (int i = 0; i < refScr.fragments.Count; i++) { refScr.fragments[i].limitations.currentDepth++; } scr.fragments.AddRange(refScr.fragments); scr.DestroyRigid(refScr); } // Get ref rigid else if (refScr.objectType == ObjectType.Mesh || refScr.objectType == ObjectType.SkinnedMesh) { refScr.meshDemolition.runtimeCaching.type = CachingType.Disable; RFDemolitionMesh.DemolishMesh(refScr); // TODO COPY MESH DATA FROM ROOTSCR TO THIS TO REUSE scr.fragments.AddRange(refScr.fragments); RayfireMan.DestroyFragment(refScr, refScr.rootParent, 1f); } // Get ref rigid else if (refScr.objectType == ObjectType.NestedCluster || refScr.objectType == ObjectType.ConnectedCluster) { refScr.Default(); // Copy contact data refScr.limitations.contactPoint = scr.limitations.contactPoint; refScr.limitations.contactVector3 = scr.limitations.contactVector3; refScr.limitations.contactNormal = scr.limitations.contactNormal; // Demolish RFDemolitionCluster.DemolishCluster(refScr); // Collect new fragments scr.fragments.AddRange(refScr.fragments); //refScr.physics.exclude = true; //RayfireMan.DestroyFragment (refScr, refScr.rootParent, 1f); } } } return(true); }