// 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;
}
}
}