public void LayoutBone(int id, Vector3 position, Vector3 endPosition, Vector3 forward, Vector3 up, Vector3 right, bool isChainEnd) { if (mode == SkeletonMode.Disabled) { return; } Debug.Assert(m_GUIWrapper.eventType == EventType.Layout); var sliderData = new SliderData() { position = GetMouseWorldPosition(forward, position), forward = forward, up = up, right = right }; { var distance = m_GUIWrapper.DistanceToSegmentClamp(position, endPosition); if (distance <= m_NearestDistance) { m_NearestDistance = distance; m_NearestBodyDistance = distance; m_NearestBodyId = id; m_HoveredSliderData = sliderData; } } { var distance = m_GUIWrapper.DistanceToCircle(position, GetBoneRadiusForPicking(position) * 2f); if (distance <= m_NearestDistance) { m_NearestDistance = distance; m_NearestJointDistance = distance; m_NearestJointId = id; m_HoveredSliderData = sliderData; } } if (isChainEnd && (IsCapable(SkeletonAction.ChangeLength) || IsCapable(SkeletonAction.MoveEndPosition) || IsCapable(SkeletonAction.CreateBone))) { var distance = m_GUIWrapper.DistanceToCircle(endPosition, GetBoneRadiusForPicking(endPosition)); if (distance <= m_NearestDistance) { m_NearestDistance = distance; m_NearestTailDistance = distance; m_NearestTailId = id; m_HoveredSliderData = sliderData; } } }
public void SetupBase() { m_EventType = EventType.Layout; m_NearestDistance = kPickDistance; m_NearestControl = GetDefaultControlID(); m_CurrentControlID = 0; m_MousePosition = Vector2.zero; m_HotControl = 0; m_GUIWrapper = Substitute.For <IGUIWrapper>(); m_GUIWrapper.GetControlID(Arg.Any <int>(), Arg.Any <FocusType>()).Returns(x => GetControlID((int)x[0], (FocusType)x[1])); m_GUIWrapper.mousePosition.Returns(x => m_MousePosition); m_GUIWrapper.eventType.Returns(x => m_EventType); m_GUIWrapper.GUIToWorld(Arg.Any <Vector2>()).Returns(x => (Vector3)(Vector2)x[0]); m_GUIWrapper.GUIToWorld(Arg.Any <Vector2>(), Arg.Any <Vector3>(), Arg.Any <Vector3>()).Returns(x => (Vector3)(Vector2)x[0]); m_GUIWrapper.IsControlNearest(Arg.Any <int>()).Returns(x => (int)x[0] == nearestControl); m_GUIWrapper.IsControlHot(Arg.Any <int>()).Returns(x => (int)x[0] == m_HotControl); m_GUIWrapper.When(x => m_GUIWrapper.LayoutControl(Arg.Any <int>(), Arg.Any <float>())).Do(x => { if (m_EventType != EventType.Layout) { return; } int controlId = (int)x[0]; float distance = (float)x[1]; if (distance <= m_NearestDistance) { m_NearestDistance = distance; m_NearestControl = controlId; } }); m_GUIWrapper.DistanceToCircle(Arg.Any <Vector3>(), Arg.Any <float>()).Returns(x => { Vector2 center = (Vector3)x[0]; float radius = (float)x[1]; float dist = (center - m_MousePosition).magnitude; if (dist < radius) { return(0f); } return(dist - radius); }); m_GUIWrapper.DistanceToSegment(Arg.Any <Vector3>(), Arg.Any <Vector3>()).Returns(x => HandleUtility.DistancePointToLineSegment(m_MousePosition, (Vector3)x[0], (Vector3)x[1])); m_GUIWrapper.DistanceToSegmentClamp(Arg.Any <Vector3>(), Arg.Any <Vector3>()).Returns(x => MathUtility.DistanceToSegmentClamp(m_MousePosition, (Vector3)x[0], (Vector3)x[1])); Vector3 sliderPos; m_GUIWrapper.DoSlider(Arg.Any <int>(), Arg.Any <SliderData>(), out sliderPos).ReturnsForAnyArgs(x => (int)x[0] == nearestControl); m_GUIWrapper.GetHandleSize(Arg.Any <Vector3>()).ReturnsForAnyArgs(x => 1f); }