123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- #if UNITY_EDITOR
- using UnityEngine;
- namespace O3DWB
- {
- public class ObjectMouseRotationSession
- {
- #region Private Variables
- private TransformAxis _rotationAxis;
- private bool _isActive;
- private GameObject _gameObject;
- private Transform _gameObjectTransform;
- private ObjectMouseRotationSettings _mouseRotationSettings;
- private bool _rotatingAroundCustomAxis;
- private Vector3 _customRotationAxis;
- private float _accumulatedRotationInDegrees;
- #endregion
- #region Public Properties
- public bool IsActive { get { return _isActive; } }
- public TransformAxis RotationAxis { get { return _rotationAxis; } }
- public bool RotatingAroundCustomAxis { get { return _rotatingAroundCustomAxis; } }
- #endregion
- #region Public Methods
- public void BeginRotationAroundAxis(GameObject gameObject, ObjectMouseRotationSettings rotationSettings, TransformAxis rotationAxis)
- {
- if (gameObject != null && !_isActive)
- {
- _isActive = true;
- _gameObject = gameObject;
- _gameObjectTransform = _gameObject.transform;
- _mouseRotationSettings = rotationSettings;
- _rotationAxis = rotationAxis;
- _rotatingAroundCustomAxis = false;
- _accumulatedRotationInDegrees = 0.0f;
- }
- }
- public void BeginRotationAroundCustomAxis(GameObject gameObject, ObjectMouseRotationSettings rotationSettings, Vector3 customRotationAxis)
- {
- if (gameObject != null && !_isActive)
- {
- _isActive = true;
- _gameObject = gameObject;
- _gameObjectTransform = _gameObject.transform;
- _mouseRotationSettings = rotationSettings;
- _rotatingAroundCustomAxis = true;
- _customRotationAxis = customRotationAxis;
- _accumulatedRotationInDegrees = 0.0f;
- }
- }
- public void End()
- {
- _isActive = false;
- }
- public void UpdateForMouseMovement(Event e)
- {
- if (_gameObject != null && _isActive)
- {
- UndoEx.RecordForToolAction(_gameObjectTransform);
- if (_rotatingAroundCustomAxis) RotateObjectAroundCustomAxis();
- else RotateObjectAroundAxis();
- }
- }
- #endregion
- #region Private Methods
- private void RotateObjectAroundAxis()
- {
- AxisMouseRotationSettings axisMouseRotationSettings = _mouseRotationSettings.XAxisRotationSettings;
- if (_rotationAxis == TransformAxis.Y) axisMouseRotationSettings = _mouseRotationSettings.YAxisRotationSettings;
- else if (_rotationAxis == TransformAxis.Z) axisMouseRotationSettings = _mouseRotationSettings.ZAxisRotationSettings;
- float rotationAmountInDegrees = MouseCursor.Instance.OffsetSinceLastMouseMove.x * axisMouseRotationSettings.MouseSensitivity;
- Vector3 rotationAxis = TransformAxes.GetVector(_rotationAxis, TransformSpace.Global, _gameObjectTransform);
- RotateObjectAroundAxis(rotationAxis, rotationAmountInDegrees);
- }
- private void RotateObjectAroundCustomAxis()
- {
- CustomAxisMouseRotationSettings customAxisRotationSettings = _mouseRotationSettings.CustomAxisRotationSettings;
- float rotationAmountInDegrees = MouseCursor.Instance.OffsetSinceLastMouseMove.x * customAxisRotationSettings.MouseSensitivity;
- RotateObjectAroundAxis(_customRotationAxis, rotationAmountInDegrees);
- }
- private void RotateObjectAroundAxis(Vector3 rotationAxis, float rotationAmountInDegrees)
- {
- OrientedBox hierarchyWorldOrientedBox = _gameObject.GetHierarchyWorldOrientedBox();
- if(hierarchyWorldOrientedBox.IsInvalid())
- {
- Box modelSpaceBox = new Box(Vector3.zero, Vector3.one * 0.001f);
- hierarchyWorldOrientedBox = new OrientedBox(modelSpaceBox, _gameObjectTransform);
- }
- if (_mouseRotationSettings.UseSnapping)
- {
- _accumulatedRotationInDegrees += rotationAmountInDegrees;
- float absAccumulatedRotationInDegrees = Mathf.Abs(_accumulatedRotationInDegrees);
- if (absAccumulatedRotationInDegrees >= _mouseRotationSettings.SnapStepInDegrees)
- {
- float floatNumberOfSteps = absAccumulatedRotationInDegrees / _mouseRotationSettings.SnapStepInDegrees;
- int integerNumberOfSteps = (int)floatNumberOfSteps;
- rotationAmountInDegrees = integerNumberOfSteps * _mouseRotationSettings.SnapStepInDegrees * Mathf.Sign(_accumulatedRotationInDegrees);
- _gameObject.RotateHierarchyBoxAroundPoint(rotationAmountInDegrees, rotationAxis, hierarchyWorldOrientedBox.Center);
- _accumulatedRotationInDegrees = 0.0f;
- }
- }
- else
- {
- _accumulatedRotationInDegrees = 0.0f;
- _gameObject.RotateHierarchyBoxAroundPoint(rotationAmountInDegrees, rotationAxis, hierarchyWorldOrientedBox.Center);
- }
- }
- #endregion
- }
- }
- #endif
|