// 27 Slicer // Copyright 2021 Deftly Games // https://slicer.deftly.games/ using Slicer.Core; using UnityEngine; namespace Slicer { /// /// Modifies the size property of the SlicerController, as if it is being sliced. /// /// ///

[REFERENCE MANUAL](xref:manual\components\slicer_controller_slice_modifier) ///
[ExecuteAlways] [DisallowMultipleComponent] [AddComponentMenu("Slicer/Slicer Controller Slice Modifier")] [RequireComponent(typeof(SlicerController))] [HelpURL(SlicerConfiguration.SiteUrl + SlicerConfiguration.ComponentsManualPath + "slicer_controller_slice_modifier.html")] public class SlicerControllerSliceModifier : SliceModifier { [HideInInspector] [SerializeField] private Vector3 originalSize = Vector3.one; /// /// The original size of the /// public Vector3 OriginalSize { get { return originalSize; } } [HideInInspector] [SerializeField] private Vector3 originalOffset = Vector3.zero; /// /// The original offset of the /// public Vector3 OriginalOffset { get { return originalOffset; } } [HideInInspector] [SerializeField] private Vector3 slicedSize; /// /// The sliced size of the /// public Vector3 SlicedSize { get { return slicedSize; } } [HideInInspector] [SerializeField] private Vector3 slicedOffset; /// /// The sliced offset of the /// public Vector3 SlicedOffset { get { return slicedOffset; } } private SlicerController slicerController; private void Awake() { slicerController = GetComponent(); } /// public override Hash128 GatherDetails() { var hash = base.GatherDetails(); if (slicerController != null && !ModifierEnabled) { if (ShouldUpdate()) { originalSize = slicerController.Size; originalOffset = slicerController.Offset; } } var sizeHash = HashUtility.CalculateHash(originalSize); var offsetHash = HashUtility.CalculateHash(originalOffset); HashUtility.AppendHash(sizeHash, offsetHash, ref hash); return hash; } /// public override void Modify(Vector3 size, Transform rootTransform, Bounds completeBounds, Bounds slicedBounds) { if (!ModifierEnabled || slicerController == null) { return; } if (!slicerController.CompleteBounds.HasValue) { slicerController.RefreshSliceImmediate(); } var bounds = slicerController.CompleteBounds.Value; var slicedOriginalBounds = SliceUtility.SliceVerts(bounds, transform, size, rootTransform, completeBounds, slicedBounds); slicedSize = new Vector3(slicedOriginalBounds.size.x / bounds.size.x, slicedOriginalBounds.size.y / bounds.size.y, slicedOriginalBounds.size.z / bounds.size.z); var matrix = MatrixUtility.BuildTransformMatrix(rootTransform, transform); var originalCenterLocal = matrix.MultiplyPoint3x4(bounds.center); var slicedOriginalCenterLocal = matrix.MultiplyPoint3x4(slicedOriginalBounds.center); slicedOffset = slicedOriginalCenterLocal - originalCenterLocal; slicerController.Size = slicedSize; slicerController.Offset = slicedOffset; slicerController.RefreshSlice(); } /// public override void DisableModifier() { base.DisableModifier(); if (slicerController != null) { slicerController.Size = originalSize; slicerController.Offset = originalOffset; } } /// public override void EnableModifier() { if (slicerController != null) { slicerController.Size = slicedSize; slicerController.Offset = slicedOffset; } base.EnableModifier(); } /// public override void FinalizeSlicing() { EnableModifier(); originalSize = slicedSize; originalOffset = slicedOffset; SlicerController.SafeDestroy(this); } private void OnDestroy() { DisableModifier(); } /// /// Sets the size of the Slicer Controller before slicing. /// /// /// Call for this change to be sliced. /// /// The new unsliced size to set public void SetUnslicedSize(Vector3 size) { originalSize = size; if (!ModifierEnabled && slicerController != null) { slicerController.Size = originalSize; slicerController.Offset = originalOffset; } } } }