protected override AsyncFractureResult FractureInternal(Vector3 localPos) { FractureDetails details = new FractureDetails(); details.NumPieces = NumFracturePieces; details.NumIterations = NumIterations; details.UVScale = FractureUVScale.Piece; details.FractureCenter = localPos; details.FractureRadius = FractureRadius; details.Asynchronous = Asynchronous; return Fracture(details, true); }
protected override AsyncFractureResult FractureInternal(Vector3 localPos) { FractureDetails details = new FractureDetails(); details.NumPieces = NumFracturePieces; details.NumIterations = NumIterations; details.UVScale = FractureUVScale.Piece; details.FractureCenter = localPos; details.FractureRadius = FractureRadius; details.Asynchronous = Asynchronous; return(Fracture(details, true)); }
protected AsyncFractureResult Fracture(FractureDetails details, bool hideAfterFracture) { if (NumGenerations == 0 || _processingFracture) { return(null); } if (FractureTemplate == null || FractureTemplate.GetComponent <MeshFilter>() == null) { Debug.LogError("DinoFracture: A fracture template with a MeshFilter component is required."); } _processingFracture = true; if (details.Mesh == null) { MeshFilter meshFilter = GetComponent <MeshFilter>(); SkinnedMeshRenderer skinnedRenderer = GetComponent <SkinnedMeshRenderer>(); if (meshFilter == null && skinnedRenderer == null) { Debug.LogError("DinoFracture: A mesh filter required if a mesh is not supplied."); return(null); } Mesh mesh; if (meshFilter != null) { mesh = meshFilter.sharedMesh; } else { mesh = new Mesh(); skinnedRenderer.BakeMesh(mesh); } details.Mesh = mesh; } if (details.MeshScale == Vector3.zero) { details.MeshScale = transform.localScale; } // Unassigned transforms aren't actually assigned to null by Unity, so we need check for it here. Transform piecesParent = (PiecesParent == null) ? null : PiecesParent; return(FractureEngine.StartFracture(details, this, piecesParent, DistributeMass, hideAfterFracture)); }
public void GenerateFractureMeshes(Vector3 localPoint, Action <PreFracturedGeometry> completedCallback) { if (Application.isPlaying) { Debug.LogWarning("DinoFracture: Creating pre-fractured pieces at runtime. This can be slow if there a lot of pieces."); } if (GeneratedPieces != null) { if (Application.isPlaying) { Destroy(GeneratedPieces); } else { DestroyImmediate(GeneratedPieces); } } FractureDetails details = new FractureDetails(); details.NumPieces = NumFracturePieces; details.NumIterations = NumIterations; details.UVScale = FractureUVScale.Piece; details.Asynchronous = !Application.isPlaying; // Async in editor to prevent hangs, sync while playing details.FractureCenter = localPoint; details.FractureRadius = FractureRadius; _runningFracture = Fracture(details, false); _completionCallback = completedCallback; if (Application.isPlaying) { if (!_runningFracture.IsComplete) { // Should never get here. Debug.LogError("DinoFracture: Prefracture task is not complete"); } OnPreFractureComplete(); } else { #if UNITY_EDITOR EditorApplication.update += EditorUpdate; #endif } }
public void GenerateFractureMeshes(Vector3 localPoint, Action<PreFracturedGeometry> completedCallback) { if (Application.isPlaying) { Debug.LogWarning("DinoFracture: Creating pre-fractured pieces at runtime. This can be slow if there a lot of pieces."); } if (GeneratedPieces != null) { if (Application.isPlaying) { Destroy(GeneratedPieces); } else { DestroyImmediate(GeneratedPieces); } } FractureDetails details = new FractureDetails(); details.NumPieces = NumFracturePieces; details.NumIterations = NumIterations; details.UVScale = FractureUVScale.Piece; details.Asynchronous = !Application.isPlaying; // Async in editor to prevent hangs, sync while playing details.FractureCenter = localPoint; details.FractureRadius = FractureRadius; _runningFracture = Fracture(details, false); _completionCallback = completedCallback; if (Application.isPlaying) { if (!_runningFracture.IsComplete) { // Should never get here. Debug.LogError("DinoFracture: Prefracture task is not complete"); } OnPreFractureComplete(); } else { #if UNITY_EDITOR EditorApplication.update += EditorUpdate; #endif } }
/// <summary> /// Starts a fracture operation /// </summary> /// <param name="details">Fracture info</param> /// <param name="callback">The object to fracture</param> /// <param name="piecesParent">The parent of the resulting fractured pieces root object</param> /// <param name="transferMass">True to distribute the original object's mass to the fracture pieces; false otherwise</param> /// <param name="hideAfterFracture">True to hide the originating object after fracturing</param> /// <returns></returns> public static AsyncFractureResult StartFracture(FractureDetails details, FractureGeometry callback, Transform piecesParent, bool transferMass, bool hideAfterFracture) { AsyncFractureResult res = new AsyncFractureResult(); if (Suspended) { res.SetResult(null, new Bounds()); } else { if (details.Asynchronous) { IEnumerator it = Instance.WaitForResults(FractureBuilder.Fracture(details), callback, piecesParent, transferMass, hideAfterFracture, res); if (it.MoveNext()) { #if UNITY_EDITOR if (Instance._runningFractures.Count == 0 && !Application.isPlaying) { EditorApplication.update += Instance.OnEditorUpdate; } #endif Instance._runningFractures.Add(new FractureInstance(res, it)); } } else { // There should only be one iteration IEnumerator it = Instance.WaitForResults(FractureBuilder.Fracture(details), callback, piecesParent, transferMass, hideAfterFracture, res); while (it.MoveNext()) { Debug.LogWarning("DinoFracture: Sync fracture taking more than one iteration"); } } } return(res); }