// Copy from public void CopyFrom(RFDemolitionMesh demolition) { amount = demolition.amount; variation = demolition.variation; depthFade = demolition.depthFade; seed = demolition.seed; contactBias = demolition.contactBias; useShatter = false; // TODO input mesh for fragments ?? turn off for now meshInput = demolition.meshInput; meshInput = MeshInputType.AtDemolition; properties.CopyFrom(demolition.properties); runtimeCaching = new RFRuntimeCaching(); Reset(); shatterMode = 1; innerSubId = 0; compressPrefab = true; cacheRotationStart = Quaternion.identity; mesh = null; rfShatter = null; }
// Cache for rigid public static void CacheMeshesMult(Transform tmSaved, ref List <Mesh> meshesList, ref List <Vector3> pivotsList, ref List <RFDictionary> subList, RayfireRigid scrRigid, List <int> batchAmount, int batchInd) { // Get list of meshes to calc List <int> markedElements = RFRuntimeCaching.GetMarkedElements(batchInd, batchAmount); // Local iteration data lists Mesh[] meshesLocal = new Mesh[batchAmount.Count]; Vector3[] pivotsLocal = new Vector3[batchAmount.Count]; List <Dictionary <int, int> > origSubMeshIds = new List <Dictionary <int, int> >(); // Compute bool state = scrRigid.meshDemolition.rfShatter.SimpleCompute( tmSaved, ref meshesLocal, ref pivotsLocal, scrRigid.meshDemolition.mesh, scrRigid.meshDemolition.innerSubId, ref origSubMeshIds, markedElements, batchInd == 0); // Set names if (state == false || meshesLocal == null || meshesLocal.Length == 0) { return; } // Set names for (int i = 0; i < meshesLocal.Length; i++) { meshesLocal[i].RecalculateTangents(); meshesLocal[i].name = scrRigid.name + "_" + markedElements[i].ToString(); } // Add data to main lists for (int i = 0; i < origSubMeshIds.Count; i++) { subList.Add(new RFDictionary(origSubMeshIds[i])); } meshesList.AddRange(meshesLocal); pivotsList.AddRange(pivotsLocal); }
/// ///////////////////////////////////////////////////////// /// Constructor /// ///////////////////////////////////////////////////////// // Constructor public RFDemolitionMesh() { amount = 15; variation = 0; depthFade = 0.5f; contactBias = 0f; seed = 1; useShatter = false; meshInput = MeshInputType.AtDemolition; properties = new RFFragmentProperties(); runtimeCaching = new RFRuntimeCaching(); Reset(); shatterMode = 1; innerSubId = 0; compressPrefab = true; cacheRotationStart = Quaternion.identity; mesh = null; rfShatter = null; }
// Cor to fragment mesh over several frames public IEnumerator RuntimeCachingCor(RayfireRigid scr) { // Object should be demolished when cached all meshes but not during caching bool demolitionShouldLocal = scr.limitations.demolitionShould == true; scr.limitations.demolitionShould = false; // Input mesh, setup, record time float t1 = Time.realtimeSinceStartup; if (RFFragment.InputMesh(scr) == false) { yield break; } // Set list with amount of mesh for every frame List <int> batchAmount = runtimeCaching.type == CachingType.ByFrames ? RFRuntimeCaching.GetBatchByFrames(runtimeCaching.frames, totalAmount) : RFRuntimeCaching.GetBatchByFragments(runtimeCaching.fragments, totalAmount); // Caching in progress runtimeCaching.inProgress = true; // Wait next frame if input took too much time or long batch float t2 = Time.realtimeSinceStartup - t1; if (t2 > 0.025f || batchAmount.Count > 5) { yield return(null); } // Save tm for multi frame caching GameObject tmRefGo = RFRuntimeCaching.CreateTmRef(scr); // Start rotation cacheRotationStart = scr.transForm.rotation; // Iterate every frame. Calc local frame meshes List <Mesh> meshesList = new List <Mesh>(); List <Vector3> pivotsList = new List <Vector3>(); List <RFDictionary> subList = new List <RFDictionary>(); for (int i = 0; i < batchAmount.Count; i++) { // Check for stop if (runtimeCaching.stop == true) { ResetRuntimeCaching(scr, tmRefGo); yield break; } // Cache defined points RFFragment.CacheMeshesMult(tmRefGo.transform, ref meshesList, ref pivotsList, ref subList, scr, batchAmount, i); // TODO create fragments for current batch // TODO record time and decrease batches amount if less 30 fps yield return(null); } // Set to main data vars scr.meshes = meshesList.ToArray(); scr.pivots = pivotsList.ToArray(); scr.subIds = subList; // Clear scr.DestroyObject(tmRefGo); scr.meshDemolition.scrShatter = null; // Set demolition ready state if (runtimeCaching.skipFirstDemolition == false && demolitionShouldLocal == true) { scr.limitations.demolitionShould = true; } // Reset damage if (runtimeCaching.skipFirstDemolition == true && demolitionShouldLocal == true) { scr.damage.Reset(); } // Caching finished runtimeCaching.inProgress = false; runtimeCaching.wasUsed = true; }