12using System.Collections;
13using System.Collections.Generic;
18 [AddComponentMenu(
"")]
21 [Tooltip(
"The scene's InteractionManager, used to get InteractionControllers and "
22 +
"manage handle state.")]
25 [Tooltip(
"The target object to be moved by this tool.")]
28 private Vector3 _moveBuffer = Vector3.zero;
29 private Quaternion _rotateBuffer = Quaternion.identity;
31 private HashSet<TransformHandle> _transformHandles =
new HashSet<TransformHandle>();
33 private enum ToolState { Idle, Translating, Rotating }
34 private ToolState _toolState = ToolState.Idle;
35 private HashSet<TransformHandle> _activeHandles =
new HashSet<TransformHandle>();
37 private HashSet<TranslationAxis> _activeTranslationAxes =
new HashSet<TranslationAxis>();
44 foreach (var handle
in GetComponentsInChildren<TransformHandle>()) {
45 _transformHandles.Add(handle);
50 PhysicsCallbacks.OnPostPhysics += onPostPhysics;
58 #region Handle Movement / Rotation
65 _moveBuffer += deltaPosition;
73 _rotateBuffer = deltaRotation * _rotateBuffer;
76 private void onPostPhysics() {
83 target.transform.rotation = _rotateBuffer *
target.transform.rotation;
84 this.transform.rotation =
target.transform.rotation;
88 target.transform.position += _moveBuffer;
89 this.transform.position =
target.transform.position;
93 foreach (var handle
in _transformHandles) {
94 handle.syncRigidbodyWithTransform();
98 _moveBuffer = Vector3.zero;
99 _rotateBuffer = Quaternion.identity;
104 #region Handle Visibility
106 private void updateHandles() {
107 switch (_toolState) {
110 TransformHandle closestHandleToAnyHand =
null;
111 float closestHandleDist =
float.PositiveInfinity;
114 .Where(controller => controller.isTracked)) {
115 if (!intController.isPrimaryHovering)
continue;
116 TransformHandle testHandle = intController.primaryHoveredObject
118 .GetComponent<TransformHandle>();
120 if (testHandle ==
null || !_transformHandles.Contains(testHandle))
continue;
122 float testDist = intController.primaryHoverDistance;
123 if (testDist < closestHandleDist) {
124 closestHandleToAnyHand = testHandle;
125 closestHandleDist = testDist;
130 foreach (var handle
in _transformHandles) {
131 if (closestHandleToAnyHand !=
null && handle == closestHandleToAnyHand) {
132 handle.EnsureVisible();
135 handle.EnsureHidden();
140 case ToolState.Translating:
143 foreach (var handle
in _transformHandles) {
144 if (handle is TransformTranslationHandle) {
145 var translateHandle = handle as TransformTranslationHandle;
147 if (!_activeHandles.Contains(translateHandle)
148 && _activeTranslationAxes.Contains(translateHandle.axis)) {
149 handle.EnsureHidden();
152 handle.EnsureVisible();
156 handle.EnsureHidden();
161 case ToolState.Rotating:
163 foreach (var handle
in _transformHandles) {
164 if (_activeHandles.Contains(handle)) {
165 handle.EnsureVisible();
168 handle.EnsureHidden();
180 switch (_toolState) {
182 _activeHandles.Add(handle);
185 _toolState = ToolState.Translating;
189 _toolState = ToolState.Rotating;
193 case ToolState.Translating:
195 Debug.LogError(
"Error: Can't rotate a transform while it is already being "
199 _activeHandles.Add(handle);
204 case ToolState.Rotating:
205 Debug.LogError(
"Error: Only one handle can be active while a transform is being "
219 _activeHandles.Remove(handle);
221 switch (_toolState) {
223 Debug.LogWarning(
"Warning: Handle was deactived while Tool was already idle.");
227 if (_activeHandles.Count == 0) {
228 _toolState = ToolState.Idle;