diff --git a/AVVR/Assets/_Scripts/MeshDimension/MeshDimensionCalculator.cs b/AVVR/Assets/_Scripts/MeshDimension/MeshDimensionCalculator.cs index 31920cbdb4d3303af9defcc22516e9647139a4ea..fc722efc7b0ee419b1048a370a69ac20306490de 100644 --- a/AVVR/Assets/_Scripts/MeshDimension/MeshDimensionCalculator.cs +++ b/AVVR/Assets/_Scripts/MeshDimension/MeshDimensionCalculator.cs @@ -142,6 +142,37 @@ public static class MeshDimensionCalculatorLogic targetObject.transform.localScale = Vector3.one; Debug.Log("Target object scale has been reset to (1, 1, 1)."); } + + public static Vector3 CalculateScaleFactorsForTargetDimensions(Vector3 currentDimensions, Vector3 targetDimensions) + { + if (currentDimensions == Vector3.zero) + { + Debug.LogError("Current dimensions are zero. Please calculate dimensions first!"); + return Vector3.one; + } + + return new Vector3( + targetDimensions.x / currentDimensions.x, + targetDimensions.y / currentDimensions.y, + targetDimensions.z / currentDimensions.z + ); + } + + public static void ScaleToTargetDimensions(GameObject targetObject, Vector3 currentDimensions, Vector3 targetDimensions) + { + if (targetObject == null) + { + Debug.LogError("Target object is not assigned!"); + return; + } + + Vector3 scaleFactors = CalculateScaleFactorsForTargetDimensions(currentDimensions, targetDimensions); + Undo.RecordObject(targetObject.transform, "Scale To Target Dimensions"); + Vector3 currentScale = targetObject.transform.localScale; + Vector3 newScale = Vector3.Scale(currentScale, scaleFactors); + targetObject.transform.localScale = newScale; + Debug.Log($"Scaled object to target dimensions. New scale: {newScale}"); + } } // MonoBehaviour Component @@ -150,6 +181,7 @@ public class MeshDimensionCalculator : MonoBehaviour public GameObject targetObject; private DimensionResults results; + [SerializeField] private Vector3 targetDimensions = Vector3.one; [SerializeField] private Vector3 scaleFactors = Vector3.one; [SerializeField] private float uniformScaleFactor = 1f; @@ -187,6 +219,17 @@ public class MeshDimensionCalculator : MonoBehaviour { MeshDimensionCalculatorLogic.ResetScale(targetObject); } + + public void ScaleToTargetDimensions() + { + if (results == null || results.dimensions == Vector3.zero) + { + Debug.LogWarning("Please calculate dimensions first!"); + return; + } + + MeshDimensionCalculatorLogic.ScaleToTargetDimensions(targetObject, results.dimensions, targetDimensions); + } } // Inspector UI for the MonoBehaviour component @@ -194,12 +237,14 @@ public class MeshDimensionCalculator : MonoBehaviour public class MeshDimensionCalculatorEditor : Editor { SerializedProperty targetObjectProperty; + SerializedProperty targetDimensionsProperty; SerializedProperty scaleFactorsProperty; SerializedProperty uniformScaleFactorProperty; private void OnEnable() { targetObjectProperty = serializedObject.FindProperty("targetObject"); + targetDimensionsProperty = serializedObject.FindProperty("targetDimensions"); scaleFactorsProperty = serializedObject.FindProperty("scaleFactors"); uniformScaleFactorProperty = serializedObject.FindProperty("uniformScaleFactor"); } @@ -227,6 +272,15 @@ public class MeshDimensionCalculatorEditor : Editor calculator.ResetFloorToZero(); } + EditorGUILayout.Space(); + EditorGUILayout.LabelField("Target Dimensions", EditorStyles.boldLabel); + EditorGUILayout.PropertyField(targetDimensionsProperty, new GUIContent("Target Dimensions (X, Y, Z)")); + + if (GUILayout.Button("Scale To Target Dimensions")) + { + calculator.ScaleToTargetDimensions(); + } + EditorGUILayout.Space(); EditorGUILayout.LabelField("Scaling Options", EditorStyles.boldLabel); @@ -260,6 +314,7 @@ public class MeshDimensionCalculatorWindow : EditorWindow { private GameObject targetObject; private DimensionResults results; + private Vector3 targetDimensions = Vector3.one; private Vector3 scaleFactors = Vector3.one; private float uniformScaleFactor = 1f; @@ -301,6 +356,22 @@ public class MeshDimensionCalculatorWindow : EditorWindow } } + EditorGUILayout.Space(); + EditorGUILayout.LabelField("Target Dimensions", EditorStyles.boldLabel); + + targetDimensions = EditorGUILayout.Vector3Field("Target Dimensions (X, Y, Z)", targetDimensions); + if (GUILayout.Button("Scale To Target Dimensions")) + { + if (results != null) + { + MeshDimensionCalculatorLogic.ScaleToTargetDimensions(targetObject, results.dimensions, targetDimensions); + } + else + { + EditorUtility.DisplayDialog("Error", "Please calculate dimensions first!", "OK"); + } + } + EditorGUILayout.Space(); EditorGUILayout.LabelField("Scaling Options", EditorStyles.boldLabel);