public static sbyte DrawAxisHandle(Vector3 handlePosition, sbyte voxPosition, NPVoxToUnity npVoxToUnity, Vector3 axis) { int controlID = GUIUtility.GetControlID(FocusType.Passive); Handles.DotCap(controlID, handlePosition, Quaternion.identity, npVoxToUnity.VoxeSize.x * 0.25f); Vector3 screenPosition = Handles.matrix.MultiplyPoint(handlePosition); switch (Event.current.GetTypeForControl(controlID)) { case EventType.Layout: HandleUtility.AddControl( controlID, HandleUtility.DistanceToCircle(screenPosition, npVoxToUnity.VoxeSize.x * 0.25f * (1 + npVoxToUnity.UnityVoxModelSize.x)) ); break; case EventType.MouseDown: if (HandleUtility.nearestControl == controlID) { mouseStartPos = Event.current.mousePosition; startCoord = voxPosition; // Respond to a press on this handle. Drag starts automatically. GUIUtility.hotControl = controlID; Event.current.Use(); } break; case EventType.MouseUp: if (GUIUtility.hotControl == controlID) { // Respond to a release on this handle. Drag stops automatically. GUIUtility.hotControl = 0; Event.current.Use(); } break; case EventType.MouseDrag: if (GUIUtility.hotControl == controlID) { // Do whatever with mouse deltas here GUI.changed = true; float transl = HandleUtility.CalcLineTranslation(mouseStartPos, Event.current.mousePosition, handlePosition, axis); sbyte result; if (axis == Vector3.forward) { result = (sbyte)(startCoord + npVoxToUnity.ToVoxDirection(Vector3.forward * transl).Z); } else if (axis == Vector3.right) { result = (sbyte)(startCoord + npVoxToUnity.ToVoxDirection(Vector3.right * transl).X); } else { result = (sbyte)(startCoord + npVoxToUnity.ToVoxDirection(Vector3.up * transl).Y); } if (result != voxPosition) { SceneView.RepaintAll(); return(result); } } break; } return(voxPosition); }
public static NPVoxCoord DrawVoxelHandle(Vector3 handlePosition, NPVoxCoord voxPosition, NPVoxToUnity npVoxToUnity) { int controlID = GUIUtility.GetControlID(FocusType.Passive); // if(HandleUtility.nearestControl == controlID) // { // Handles.color = Color.yellow; // } // else // { // Handles.color = Color.white; // } Handles.DotCap(controlID, handlePosition, Quaternion.identity, npVoxToUnity.VoxeSize.x * 0.25f); Vector3 screenPosition = Handles.matrix.MultiplyPoint(handlePosition); switch (Event.current.GetTypeForControl(controlID)) { case EventType.Layout: HandleUtility.AddControl( controlID, HandleUtility.DistanceToCircle(screenPosition, npVoxToUnity.VoxeSize.x * 0.25f) ); break; case EventType.MouseDown: if (HandleUtility.nearestControl == controlID && Event.current.button == 0) { mouseStartPos = Event.current.mousePosition; startCoordVox = voxPosition; // Respond to a press on this handle. Drag starts automatically. GUIUtility.hotControl = controlID; Event.current.Use(); } break; case EventType.MouseUp: if (GUIUtility.hotControl == controlID) { // Respond to a release on this handle. Drag stops automatically. GUIUtility.hotControl = 0; Event.current.Use(); } break; case EventType.MouseDrag: if (GUIUtility.hotControl == controlID) { // Do whatever with mouse deltas here GUI.changed = true; Vector3 pos = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition).origin - HandleUtility.GUIPointToWorldRay(mouseStartPos).origin; NPVoxCoord result = startCoordVox + npVoxToUnity.ToVoxDirection(pos); if (!result.Equals(voxPosition)) { SceneView.RepaintAll(); return(result); } } break; } return(voxPosition); }