private void OnCollisionEnter(Collision col)
        {
            AsyncFractureResult[] results = new AsyncFractureResult[Explosives.Length];

            for (int i = 0; i < Explosives.Length; i++)
            {
                if (Explosives[i] != null && Explosives[i].gameObject.activeSelf)
                {
                    results[i] = Explosives[i].Fracture();
                }
            }

            for (int i = 0; i < results.Length; i++)
            {
                if (results[i] != null)
                {
                    while (!results[i].IsComplete)
                    {
            #if !UNITY_METRO || UNITY_EDITOR
                        Thread.Sleep(1);
            #endif
                    }

                    Explode(results[i].PiecesRoot, results[i].EntireMeshBounds);
                }
            }
        }
        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
            }
        }
        protected override AsyncFractureResult FractureInternal(Vector3 localPos)
        {
            if (gameObject.activeSelf)
            {
                if (GeneratedPieces == null)
                {
                    GenerateFractureMeshes(localPos, null);

                    EnableFracturePieces();
                }
                else
                {
                    EnableFracturePieces();

                    OnFractureEventArgs args = new OnFractureEventArgs(this, GeneratedPieces);

                    // Notify scripts on this object
                    _ignoreOnFractured = true;
                    gameObject.SendMessage("OnFracture", args,
                        SendMessageOptions.DontRequireReceiver);
                    _ignoreOnFractured = false;

                    // Notify each fracture piece
                    Transform trans = GeneratedPieces.transform;
                    for (int i = 0; i < trans.childCount; i++)
                    {
                        trans.GetChild(i).gameObject.SendMessage("OnFracture", args, SendMessageOptions.DontRequireReceiver);
                    }
                }

                gameObject.SetActive(false);

                AsyncFractureResult result = new AsyncFractureResult();
                result.SetResult(GeneratedPieces, EntireMeshBounds);
                return result;
            }
            else
            {
                AsyncFractureResult result = new AsyncFractureResult();
                result.SetResult(null, new Bounds());
                return result;
            }
        }
        private void OnPreFractureComplete()
        {
            GeneratedPieces = _runningFracture.PiecesRoot;
            EntireMeshBounds = _runningFracture.EntireMeshBounds;
            GeneratedPieces.SetActive(false);
            _runningFracture = null;

            if (_completionCallback != null)
            {
                _completionCallback(this);
            }
        }
 public void StopRunningFracture()
 {
     #if UNITY_EDITOR
     EditorApplication.update -= EditorUpdate;
     #endif
     _runningFracture.StopFracture();
     _runningFracture = null;
     StopFracture();
 }