예제 #1
0
    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);
    }
예제 #2
0
    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);
    }