ObjectMouseRotationSession.cs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. #if UNITY_EDITOR
  2. using UnityEngine;
  3. namespace O3DWB
  4. {
  5. public class ObjectMouseRotationSession
  6. {
  7. #region Private Variables
  8. private TransformAxis _rotationAxis;
  9. private bool _isActive;
  10. private GameObject _gameObject;
  11. private Transform _gameObjectTransform;
  12. private ObjectMouseRotationSettings _mouseRotationSettings;
  13. private bool _rotatingAroundCustomAxis;
  14. private Vector3 _customRotationAxis;
  15. private float _accumulatedRotationInDegrees;
  16. #endregion
  17. #region Public Properties
  18. public bool IsActive { get { return _isActive; } }
  19. public TransformAxis RotationAxis { get { return _rotationAxis; } }
  20. public bool RotatingAroundCustomAxis { get { return _rotatingAroundCustomAxis; } }
  21. #endregion
  22. #region Public Methods
  23. public void BeginRotationAroundAxis(GameObject gameObject, ObjectMouseRotationSettings rotationSettings, TransformAxis rotationAxis)
  24. {
  25. if (gameObject != null && !_isActive)
  26. {
  27. _isActive = true;
  28. _gameObject = gameObject;
  29. _gameObjectTransform = _gameObject.transform;
  30. _mouseRotationSettings = rotationSettings;
  31. _rotationAxis = rotationAxis;
  32. _rotatingAroundCustomAxis = false;
  33. _accumulatedRotationInDegrees = 0.0f;
  34. }
  35. }
  36. public void BeginRotationAroundCustomAxis(GameObject gameObject, ObjectMouseRotationSettings rotationSettings, Vector3 customRotationAxis)
  37. {
  38. if (gameObject != null && !_isActive)
  39. {
  40. _isActive = true;
  41. _gameObject = gameObject;
  42. _gameObjectTransform = _gameObject.transform;
  43. _mouseRotationSettings = rotationSettings;
  44. _rotatingAroundCustomAxis = true;
  45. _customRotationAxis = customRotationAxis;
  46. _accumulatedRotationInDegrees = 0.0f;
  47. }
  48. }
  49. public void End()
  50. {
  51. _isActive = false;
  52. }
  53. public void UpdateForMouseMovement(Event e)
  54. {
  55. if (_gameObject != null && _isActive)
  56. {
  57. UndoEx.RecordForToolAction(_gameObjectTransform);
  58. if (_rotatingAroundCustomAxis) RotateObjectAroundCustomAxis();
  59. else RotateObjectAroundAxis();
  60. }
  61. }
  62. #endregion
  63. #region Private Methods
  64. private void RotateObjectAroundAxis()
  65. {
  66. AxisMouseRotationSettings axisMouseRotationSettings = _mouseRotationSettings.XAxisRotationSettings;
  67. if (_rotationAxis == TransformAxis.Y) axisMouseRotationSettings = _mouseRotationSettings.YAxisRotationSettings;
  68. else if (_rotationAxis == TransformAxis.Z) axisMouseRotationSettings = _mouseRotationSettings.ZAxisRotationSettings;
  69. float rotationAmountInDegrees = MouseCursor.Instance.OffsetSinceLastMouseMove.x * axisMouseRotationSettings.MouseSensitivity;
  70. Vector3 rotationAxis = TransformAxes.GetVector(_rotationAxis, TransformSpace.Global, _gameObjectTransform);
  71. RotateObjectAroundAxis(rotationAxis, rotationAmountInDegrees);
  72. }
  73. private void RotateObjectAroundCustomAxis()
  74. {
  75. CustomAxisMouseRotationSettings customAxisRotationSettings = _mouseRotationSettings.CustomAxisRotationSettings;
  76. float rotationAmountInDegrees = MouseCursor.Instance.OffsetSinceLastMouseMove.x * customAxisRotationSettings.MouseSensitivity;
  77. RotateObjectAroundAxis(_customRotationAxis, rotationAmountInDegrees);
  78. }
  79. private void RotateObjectAroundAxis(Vector3 rotationAxis, float rotationAmountInDegrees)
  80. {
  81. OrientedBox hierarchyWorldOrientedBox = _gameObject.GetHierarchyWorldOrientedBox();
  82. if(hierarchyWorldOrientedBox.IsInvalid())
  83. {
  84. Box modelSpaceBox = new Box(Vector3.zero, Vector3.one * 0.001f);
  85. hierarchyWorldOrientedBox = new OrientedBox(modelSpaceBox, _gameObjectTransform);
  86. }
  87. if (_mouseRotationSettings.UseSnapping)
  88. {
  89. _accumulatedRotationInDegrees += rotationAmountInDegrees;
  90. float absAccumulatedRotationInDegrees = Mathf.Abs(_accumulatedRotationInDegrees);
  91. if (absAccumulatedRotationInDegrees >= _mouseRotationSettings.SnapStepInDegrees)
  92. {
  93. float floatNumberOfSteps = absAccumulatedRotationInDegrees / _mouseRotationSettings.SnapStepInDegrees;
  94. int integerNumberOfSteps = (int)floatNumberOfSteps;
  95. rotationAmountInDegrees = integerNumberOfSteps * _mouseRotationSettings.SnapStepInDegrees * Mathf.Sign(_accumulatedRotationInDegrees);
  96. _gameObject.RotateHierarchyBoxAroundPoint(rotationAmountInDegrees, rotationAxis, hierarchyWorldOrientedBox.Center);
  97. _accumulatedRotationInDegrees = 0.0f;
  98. }
  99. }
  100. else
  101. {
  102. _accumulatedRotationInDegrees = 0.0f;
  103. _gameObject.RotateHierarchyBoxAroundPoint(rotationAmountInDegrees, rotationAxis, hierarchyWorldOrientedBox.Center);
  104. }
  105. }
  106. #endregion
  107. }
  108. }
  109. #endif