// 27 Slicer // Copyright 2021 Deftly Games // https://slicer.deftly.games/ using Slicer.Core; using System; using UnityEngine; namespace Slicer { /// /// MeshColliderDetails is used to keep track of information about a single MeshCollider that is being sliced. /// [Serializable] public class MeshColliderDetails : ColliderDetails { /// /// The MeshCollider on the GameObject being tracked by this details object. /// [SerializeReference] public MeshCollider MeshCollider; /// /// The Original Mesh on the GameObject being tracked by this details object. /// /// /// This is the original mesh that is used as the basis for slicing when is called. /// [SerializeReference] public Mesh OriginalSharedMesh; /// /// The Modified Mesh on the GameObject being tracked by this details object. /// /// /// This is the mesh that is sliced when is called. /// [SerializeReference] public Mesh SlicedMesh; /// /// The Original Mesh on the GameObject being tracked by this details object. /// /// /// This is the original mesh that is used as the basis for slicing when is called. /// [SerializeField] public Hash128 SlicedVertHash; /// public override void Destroy() { DestroySlicedMesh(); } /// /// Destroys the Sliced Mesh /// public void DestroySlicedMesh() { if (SlicedMesh == null) { return; } SlicerController.SafeDestroy(SlicedMesh); } /// /// Resets the mesh hashes /// public void ResetHashes() { SlicedVertHash = HashUtility.CalculateHash(Time.frameCount * 3); } /// public override void DisableSlicing() { if (MeshCollider != null && MeshCollider.sharedMesh == SlicedMesh) { MeshCollider.sharedMesh = OriginalSharedMesh; } } /// public override void EnableSlicing() { if (MeshCollider != null && SlicedMesh != null) { MeshCollider.sharedMesh = SlicedMesh; } } /// public override void FinalizeSlicing() { EnableSlicing(); if (Application.isPlaying && SlicerConfiguration.UseFinalizedSlicedMeshComponent) { var finalizedSlicedMesh = MeshCollider.gameObject.AddComponent(); finalizedSlicedMesh.SlicedMesh = SlicedMesh; } if (SlicerConfiguration.OptimizeFinalizedSlicedMesh) { SlicedMesh.Optimize(); } if (SlicerConfiguration.SetFinalizedSlicedMeshToBeNoLongerReadable) { SlicedMesh.UploadMeshData(true); } } /// public override Hash128 CalculateHash() { var hash = base.CalculateHash(); if (OriginalSharedMesh != null) { var tempHash = HashUtility.CalculateHash(OriginalSharedMesh); HashUtility.AppendHash(tempHash, ref hash); } if (SlicedMesh != null) { var tempHash = HashUtility.CalculateHash(SlicedMesh); HashUtility.AppendHash(tempHash, ref hash); } if (MeshCollider != null) { var enabledColliderHash = HashUtility.CalculateHash(MeshCollider.enabled, 5); HashUtility.AppendHash(enabledColliderHash, ref hash); if (MeshCollider.sharedMesh != null) { var tempHash = HashUtility.CalculateHash(MeshCollider.sharedMesh); HashUtility.AppendHash(tempHash, ref hash); } } return hash; } } }