예제 #1
0
    public void AutoSetTilt(CameraPathTilt point)
    {
        float tiltPercentage = point.percent;
        Vector3 pointA = cameraPath.GetPathPosition(tiltPercentage - 0.1f);
        Vector3 pointB = cameraPath.GetPathPosition(tiltPercentage);
        Vector3 pointC = cameraPath.GetPathPosition(tiltPercentage + 0.1f);

        Vector3 directionAB = pointB - pointA;
        Vector3 directionBC = pointC - pointB;
        Quaternion angle = Quaternion.LookRotation(-cameraPath.GetPathDirection(point.percent));
        Vector3 pathCurveDirection = angle * (directionBC - directionAB).normalized;
        float curveAngle = Vector2.Angle(Vector2.up, new Vector2(pathCurveDirection.x, pathCurveDirection.y));
        float ratio = Mathf.Min(Mathf.Abs(pathCurveDirection.x) + Mathf.Abs(pathCurveDirection.y) / Mathf.Abs(pathCurveDirection.z),1.0f);

        point.tilt = -curveAngle * autoSensitivity * ratio;
    }
    private static void AddCPathPoints()
    {
        if (SceneView.focusedWindow != null)
        {
            SceneView.focusedWindow.wantsMouseMove = true;
        }

        Handles.color = _cameraPath.selectedPointColour;
        CameraPathPointList pointList = null;

        switch (_pointMode)
        {
        case CameraPath.PointModes.AddOrientations:
            pointList = _cameraPath.orientationList;
            break;

        case CameraPath.PointModes.AddFovs:
            pointList = _cameraPath.fovList;
            break;

        case CameraPath.PointModes.AddTilts:
            pointList = _cameraPath.tiltList;
            break;

        case CameraPath.PointModes.AddEvents:
            pointList = _cameraPath.eventList;
            break;

        case CameraPath.PointModes.AddSpeeds:
            pointList = _cameraPath.speedList;
            break;

        case CameraPath.PointModes.AddDelays:
            pointList = _cameraPath.delayList;
            break;
        }
        int numberOfPoints = pointList.realNumberOfPoints;

        for (int i = 0; i < numberOfPoints; i++)
        {
            CameraPathPoint point           = pointList[i];
            float           pointHandleSize = HandleUtility.GetHandleSize(point.worldPosition) * HANDLE_SCALE * 0.4f;
            UnityVersionWrapper.HandlesArrowCap(0, point.worldPosition, Quaternion.identity, pointHandleSize);
        }

        float   mousePercentage = NearestmMousePercentage();// _track.GetNearestPoint(mousePlanePoint);
        Vector3 mouseTrackPoint = _cameraPath.GetPathPosition(mousePercentage, true);

        Handles.Label(mouseTrackPoint, "Add New Point", colouredText);
        float      newPointHandleSize = HandleUtility.GetHandleSize(mouseTrackPoint) * HANDLE_SCALE;
        Ray        mouseRay           = Camera.current.ScreenPointToRay(new Vector3(Event.current.mousePosition.x, Screen.height - Event.current.mousePosition.y - 30, 0));
        Quaternion mouseLookDirection = Quaternion.LookRotation(-mouseRay.direction);

        if (UnityVersionWrapper.HandlesDotButton(mouseTrackPoint, mouseLookDirection, newPointHandleSize, newPointHandleSize))
        {
            CameraPathControlPoint curvePointA = _cameraPath[_cameraPath.GetLastPointIndex(mousePercentage, false)];
            CameraPathControlPoint curvePointB = _cameraPath[_cameraPath.GetNextPointIndex(mousePercentage, false)];
            float curvePercentage = _cameraPath.GetCurvePercentage(curvePointA, curvePointB, mousePercentage);
            switch (_pointMode)
            {
            case CameraPath.PointModes.AddOrientations:
                Quaternion            pointRotation  = Quaternion.LookRotation(_cameraPath.GetPathDirection(mousePercentage));
                CameraPathOrientation newOrientation = ((CameraPathOrientationList)pointList).AddOrientation(curvePointA, curvePointB, curvePercentage, pointRotation);
                ChangeSelectedPointIndex(pointList.IndexOf(newOrientation));
                break;

            case CameraPath.PointModes.AddFovs:
                float         pointFOV    = _cameraPath.fovList.GetValue(mousePercentage, CameraPathFOVList.ProjectionType.FOV);
                float         pointSize   = _cameraPath.fovList.GetValue(mousePercentage, CameraPathFOVList.ProjectionType.Orthographic);
                CameraPathFOV newFOVPoint = ((CameraPathFOVList)pointList).AddFOV(curvePointA, curvePointB, curvePercentage, pointFOV, pointSize);
                ChangeSelectedPointIndex(pointList.IndexOf(newFOVPoint));
                break;

            case CameraPath.PointModes.AddTilts:
                float          pointTilt    = _cameraPath.GetPathTilt(mousePercentage);
                CameraPathTilt newTiltPoint = ((CameraPathTiltList)pointList).AddTilt(curvePointA, curvePointB, curvePercentage, pointTilt);
                ChangeSelectedPointIndex(pointList.IndexOf(newTiltPoint));
                break;

            case CameraPath.PointModes.AddEvents:
                CameraPathEvent newEventPoint = ((CameraPathEventList)pointList).AddEvent(curvePointA, curvePointB, curvePercentage);
                ChangeSelectedPointIndex(pointList.IndexOf(newEventPoint));
                break;

            case CameraPath.PointModes.AddSpeeds:
                _cameraPath.speedList.listEnabled = true;    //if we're adding speeds then we probable want to enable it
                CameraPathSpeed newSpeedPoint = ((CameraPathSpeedList)pointList).AddSpeedPoint(curvePointA, curvePointB, curvePercentage);
                newSpeedPoint.speed = _animator.pathSpeed;
                ChangeSelectedPointIndex(pointList.IndexOf(newSpeedPoint));
                break;

            case CameraPath.PointModes.AddDelays:
                CameraPathDelay newDelayPoint = ((CameraPathDelayList)pointList).AddDelayPoint(curvePointA, curvePointB, curvePercentage);
                ChangeSelectedPointIndex(pointList.IndexOf(newDelayPoint));
                break;
            }
            GUI.changed = true;
        }
    }
    private static void SceneGUITiltBased()
    {
        DisplayAtPoint();

        CameraPathTiltList pointList   = _cameraPath.tiltList;
        Camera             sceneCamera = Camera.current;
        int pointCount = pointList.realNumberOfPoints;

        for (int i = 0; i < pointCount; i++)
        {
            CameraPathTilt point = pointList[i];
            if (_cameraPath.enableUndo)
            {
                Undo.RecordObject(point, "Modifying Tilt Point");
            }
            if (Vector3.Dot(sceneCamera.transform.forward, point.worldPosition - sceneCamera.transform.position) < 0)
            {
                continue;
            }

            string pointLabel = point.displayName;
            pointLabel += "\nvalue: " + point.tilt.ToString("F1") + "\u00B0";

            Handles.Label(point.worldPosition, pointLabel, colouredText);
            float pointHandleSize = HandleUtility.GetHandleSize(point.worldPosition) * HANDLE_SCALE;
            bool  pointIsSelected = i == selectedPointIndex;
            Handles.color = (pointIsSelected) ? _cameraPath.selectedPointColour : _cameraPath.unselectedPointColour;

            float      tiltSize = 2.0f;
            Vector3    pointForwardDirection = _cameraPath.GetPathDirection(_cameraPath.DeNormalisePercentage(point.percent));
            Quaternion qTilt        = Quaternion.AngleAxis(-point.tilt, pointForwardDirection);
            Quaternion pointForward = Quaternion.LookRotation(pointForwardDirection);
            UnityVersionWrapper.HandlesCircleCap(0, point.worldPosition, pointForward, tiltSize);
            Vector3 horizontalLineDirection = ((qTilt * Quaternion.AngleAxis(-90, Vector3.up)) * pointForwardDirection).normalized * tiltSize;
            Vector3 horizontalLineStart     = point.worldPosition + horizontalLineDirection;
            Vector3 horizontalLineEnd       = point.worldPosition - horizontalLineDirection;
            Handles.DrawLine(horizontalLineStart, horizontalLineEnd);

            Vector3 verticalLineDirection = (Quaternion.AngleAxis(-90, pointForwardDirection) * horizontalLineDirection).normalized * tiltSize;
            Vector3 verticalLineStart     = point.worldPosition + verticalLineDirection;
            Vector3 verticalLineEnd       = point.worldPosition;
            Handles.DrawLine(verticalLineStart, verticalLineEnd);

            if (UnityVersionWrapper.HandlesDotButton(point.worldPosition, Quaternion.identity, pointHandleSize, pointHandleSize))
            {
                ChangeSelectedPointIndex(i);
                GUI.changed = true;
            }

            if (i == selectedPointIndex)
            {
                CPPSlider(point);
            }
        }

        if (_cameraPath.showOrientationIndicators)//draw orientation indicators
        {
            Handles.color = _cameraPath.orientationIndicatorColours;
            float indicatorLength = _cameraPath.orientationIndicatorUnitLength / _cameraPath.pathLength;
            for (float i = 0; i < 1; i += indicatorLength)
            {
                Vector3    indicatorPosition   = _cameraPath.GetPathPosition(i);
                Quaternion inicatorRotation    = Quaternion.LookRotation(_cameraPath.GetPathDirection(_cameraPath.DeNormalisePercentage(i), false));
                float      indicatorHandleSize = HandleUtility.GetHandleSize(indicatorPosition) * HANDLE_SCALE * 4;
                UnityVersionWrapper.HandlesArrowCap(0, indicatorPosition, inicatorRotation, indicatorHandleSize);
            }
        }
    }