125 lines
5.2 KiB
C#
125 lines
5.2 KiB
C#
#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 |