ZeroVR/ZeroPacientVR/Assets/Octave3D World Builder/Scripts/Objects/Object Transform Sessions/ObjectMouseRotationSession.cs

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