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);
        }
Exemple #2
0
        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));
        }
Exemple #3
0
        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));
        }
Exemple #4
0
        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
            }
        }
Exemple #6
0
        /// <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);
        }