Ejemplo n.º 1
0
        ///Enable the Director Camera, while disabling the main camera if any
        public static void Enable()
        {
            //init gamecamera if any
            if (gameCamera == null)
            {
                var main = Camera.main;
                if (main != null && main != renderCamera)
                {
                    gameCamera = main.GetAddComponent <GameCamera>();
                }
            }

            //use gamecamera and disable it
            if (gameCamera != null)
            {
                gameCamera.gameObject.SetActive(false);
                if (matchMainWhenActive)
                {
                    var tempFOV = current.fieldOfView;
                    renderCamera.CopyFrom(gameCamera.cam);
                    if (ignoreFOVChanges)
                    {
                        renderCamera.fieldOfView = tempFOV;
                    }
                }

                //set the root pos/rot
                current.transform.position = gameCamera.position;
                current.transform.rotation = gameCamera.rotation;
            }

            //reset render camera local pos/rot
            renderCamera.transform.localPosition = Vector3.zero;
            renderCamera.transform.localRotation = Quaternion.identity;

            //set render camera to MainCamera if option enabled
            if (setMainWhenActive)
            {
                renderCamera.gameObject.tag = "MainCamera";
            }

            ///enable
            if (autoHandleActiveState)
            {
                renderCamera.gameObject.SetActive(true);
            }

#if SLATE_USE_POSTSTACK
            postStack = renderCamera.GetComponent <PostProcessingBehaviour>();
#endif

            isEnabled      = true;
            lastTargetShot = null;

            if (OnActivate != null)
            {
                OnActivate();
            }
        }
Ejemplo n.º 2
0
        ///Ease from game camera to target. If target is null, eases to DirectorCamera current.
        public static void Update(IDirectableCamera source, IDirectableCamera target, EaseType interpolation, float weight, float damping = 0f)
        {
            if (source == null)
            {
                source = gameCamera != null? (IDirectableCamera)gameCamera : (IDirectableCamera)current;
            }
            if (target == null)
            {
                target = current;
            }

            var targetPosition   = weight < 1? Easing.Ease(interpolation, source.position, target.position, weight)                 : target.position;
            var targetRotation   = weight < 1? Easing.Ease(interpolation, source.rotation, target.rotation, weight)                 : target.rotation;
            var targetFOV        = weight < 1? Easing.Ease(interpolation, source.fieldOfView, target.fieldOfView, weight)   : target.fieldOfView;
            var targetFocalPoint = weight < 1? Easing.Ease(interpolation, source.focalPoint, target.focalPoint, weight)             : target.focalPoint;
            var targetFocalRange = weight < 1? Easing.Ease(interpolation, source.focalRange, target.focalRange, weight)             : target.focalRange;

            var isCut = target != lastTargetShot;

            if (!isCut && damping > 0)
            {
                current.position    = Vector3.Lerp(current.position, targetPosition, Time.deltaTime * (MAX_DAMP / damping));
                current.rotation    = Quaternion.Lerp(current.rotation, targetRotation, Time.deltaTime * (MAX_DAMP / damping));
                current.fieldOfView = Mathf.Lerp(current.fieldOfView, targetFOV, Time.deltaTime * (MAX_DAMP / damping));
                current.focalPoint  = Mathf.Lerp(current.focalPoint, targetFocalPoint, Time.deltaTime * (MAX_DAMP / damping));
                current.focalRange  = Mathf.Lerp(current.focalRange, targetFocalRange, Time.deltaTime * (MAX_DAMP / damping));
            }
            else
            {
                current.position    = targetPosition;
                current.rotation    = targetRotation;
                current.fieldOfView = targetFOV;
                current.focalPoint  = targetFocalPoint;
                current.focalRange  = targetFocalRange;
            }

            if (isCut)
            {
#if SLATE_USE_POSTSTACK
                if (postStack != null)
                {
                    postStack.ResetTemporalEffects();
                }
#endif
                if (OnCut != null)
                {
                    OnCut(target);
                }
            }

            lastTargetShot = target;
        }
Ejemplo n.º 3
0
        ///Ease from game camera to target. If target is null, eases to DirectorCamera current.
        public static void Update(IDirectableCamera source, IDirectableCamera target, EaseType interpolation, float weight, float damping = 0f)
        {
            if (source == null)
            {
                source = gameCamera != null ? (IDirectableCamera)gameCamera : (IDirectableCamera)current;
            }
            if (target == null)
            {
                target = current;
            }
            var isCut = target != lastTargetShot;

            var endPosition      = weight < 1 ? Easing.Ease(interpolation, source.position, target.position, weight) : target.position;
            var endRotation      = weight < 1 ? Easing.Ease(interpolation, source.rotation, target.rotation, weight) : target.rotation;
            var endFOV           = weight < 1 ? Easing.Ease(interpolation, source.fieldOfView, target.fieldOfView, weight) : target.fieldOfView;
            var endFocalDistance = weight < 1 ? Easing.Ease(interpolation, source.focalDistance, target.focalDistance, weight) : target.focalDistance;
            var endFocalLength   = weight < 1 ? Easing.Ease(interpolation, source.focalLength, target.focalLength, weight) : target.focalLength;
            var endFocalAperture = weight < 1 ? Easing.Ease(interpolation, source.focalAperture, target.focalAperture, weight) : target.focalAperture;

            if (!isCut && damping > 0)
            {
                current.position      = Vector3.Lerp(current.position, endPosition, Time.deltaTime * (MAX_DAMP / damping));
                current.rotation      = Quaternion.Lerp(current.rotation, endRotation, Time.deltaTime * (MAX_DAMP / damping));
                current.fieldOfView   = Mathf.Lerp(current.fieldOfView, endFOV, Time.deltaTime * (MAX_DAMP / damping));
                current.focalDistance = Mathf.Lerp(current.focalDistance, endFocalDistance, Time.deltaTime * (MAX_DAMP / damping));
                current.focalLength   = Mathf.Lerp(current.focalLength, endFocalLength, Time.deltaTime * (MAX_DAMP / damping));
                current.focalAperture = Mathf.Lerp(current.focalAperture, endFocalAperture, Time.deltaTime * (MAX_DAMP / damping));
            }
            else
            {
                current.position      = endPosition;
                current.rotation      = endRotation;
                current.fieldOfView   = endFOV;
                current.focalDistance = endFocalDistance;
                current.focalLength   = endFocalLength;
                current.focalAperture = endFocalAperture;
            }

            if (isCut)
            {
#if SLATE_USE_POSTSTACK
                //Does ResetTemporalEffects exists or needed anymore?
#endif
                if (onCut != null)
                {
                    onCut(target);
                }
            }

            lastTargetShot = target;
        }
Ejemplo n.º 4
0
        protected override void OnUpdate(float time, float previousTime)
        {
            if (activeCameraTrack != this)
            {
                return;
            }

            if (cineBoxFadeTime > 0)
            {
                //use cinebox time as blendInOut override parameter for GetTrackWeight.
                DirectorGUI.UpdateLetterbox(GetTrackWeight(time, cineBoxFadeTime));
            }

            if (exitCameraOverride != null)
            {
                if (time > blendIn && entryCamera == null)
                {
                    entryCamera = DirectorCamera.gameCamera;
                    DirectorCamera.gameCamera = exitCameraOverride.GetAddComponent <GameCamera>();;
                }

                if (time <= blendIn && entryCamera != null)
                {
                    DirectorCamera.gameCamera = entryCamera;
                    entryCamera = null;
                }
            }


            var weight = GetTrackWeight(time);

            IDirectableCamera source = null;
            IDirectableCamera target = null;

            if (currentShot != null && currentShot.targetShot != null)
            {
                target = currentShot.targetShot;
                if (currentShot.blendInEffect == CameraShot.BlendInEffectType.EaseIn)
                {
                    if (currentShot != firstShot && currentShot.RootTimeWithinRange())
                    {
                        source  = currentShot.previousShot.targetShot;
                        weight *= currentShot.GetClipWeight((time + this.startTime) - currentShot.startTime);
                    }
                }
            }

            //passing null source = game camera, null target = the director camera itself.
            DirectorCamera.Update(source, target, interpolation, weight, appliedSmoothing);
        }
Ejemplo n.º 5
0
 ///OnSceneGUI
 public void DoSceneGUI(IDirectableCamera directableCamera)
 {
     if (transposer.target != null && transposer.trackingMode != Transposer.TrackingMode.None)
     {
         if (transposer.trackingMode == Transposer.TrackingMode.RailTracking)
         {
             UnityEditor.EditorGUI.BeginChangeCheck();
             var rStart = UnityEditor.Handles.PositionHandle(transposer.railStart, Quaternion.identity);
             var rEnd   = UnityEditor.Handles.PositionHandle(transposer.railEnd, Quaternion.identity);
             if (UnityEditor.EditorGUI.EndChangeCheck())
             {
                 UnityEditor.Undo.RecordObject(directableCamera as Object, "Rail Change");
                 transposer.railStart = rStart;
                 transposer.railEnd   = rEnd;
             }
         }
     }
 }
Ejemplo n.º 6
0
        ///OnDrawGizmos
        public void DoGizmos(IDirectableCamera directableCamera)
        {
            Gizmos.color = Prefs.gizmosColor;
            if (transposer.target != null && transposer.trackingMode != Transposer.TrackingMode.None)
            {
                var targetPos = transposer.target.position;
                if (transposer.offsetMode == Transposer.OffsetMode.LocalSpace)
                {
                    targetPos = transposer.target.TransformPoint(transposer.targetOffset);
                }
                if (transposer.offsetMode == Transposer.OffsetMode.WorldSpace)
                {
                    targetPos = transposer.target.position + transposer.targetOffset;
                }

                Gizmos.DrawLine(transposer.target.position, targetPos);
                Gizmos.DrawSphere(targetPos, 0.05f);

                if (transposer.trackingMode == Transposer.TrackingMode.OffsetTracking)
                {
                    //...
                }

                if (transposer.trackingMode == Transposer.TrackingMode.RailTracking)
                {
                    Gizmos.DrawLine(transposer.railStart, transposer.railEnd);
                    Gizmos.DrawLine(directableCamera.position, targetPos);
                    Gizmos.DrawSphere(transposer.railStart, 0.05f);
                    Gizmos.DrawSphere(transposer.railEnd, 0.05f);
                }
            }

            if (composer.target != null && composer.trackingMode != Composer.TrackingMode.None)
            {
                var targetPos = composer.target.TransformPoint(composer.targetOffset);
                if (composer.trackingMode == Composer.TrackingMode.FrameComposition)
                {
                    Gizmos.DrawSphere(targetPos, 0.05f);
                    Gizmos.DrawWireSphere(targetPos, composer.targetSize);
                    Gizmos.DrawLine(directableCamera.position, targetPos);
                }
            }
        }
Ejemplo n.º 7
0
        ///OnGUI
        public void DoGUI(IDirectableCamera directableCamera, Rect container)
        {
            if (composer.target != null && composer.trackingMode != Composer.TrackingMode.None)
            {
                if (composer.trackingMode == Composer.TrackingMode.FrameComposition)
                {
                    var cam = directableCamera.cam;

                    var left      = Mathf.Clamp01((composer.frameCenter.x + 0.5f) - composer.frameExtends.x / 2);
                    var right     = Mathf.Clamp01((composer.frameCenter.x + 0.5f) + composer.frameExtends.x / 2);
                    var top       = Mathf.Clamp01((composer.frameCenter.y + 0.5f) - composer.frameExtends.y / 2);
                    var bottom    = Mathf.Clamp01((composer.frameCenter.y + 0.5f) + composer.frameExtends.y / 2);
                    var viewFrame = Rect.MinMaxRect(left, top, right, bottom);

                    //view frame
                    var min = new Vector2(viewFrame.xMin * container.width, viewFrame.yMin * container.height);
                    var max = new Vector2(viewFrame.xMax * container.width, viewFrame.yMax * container.height);
                    GUI.Box(Rect.MinMaxRect(min.x, min.y, max.x, max.y), "", Styles.hollowFrameStyle);

                    //dark
                    var leftGuide   = Rect.MinMaxRect(0, 0, min.x, container.height);
                    var rightGuide  = Rect.MinMaxRect(max.x, 0, container.width, container.height);
                    var topGuide    = Rect.MinMaxRect(min.x, 0, max.x, min.y);
                    var bottomGuide = Rect.MinMaxRect(min.x, max.y, max.x, container.height);
                    GUI.color = new Color(0, 0, 0, 0.2f);
                    GUI.DrawTexture(leftGuide, Styles.whiteTexture);
                    GUI.DrawTexture(rightGuide, Styles.whiteTexture);
                    GUI.DrawTexture(topGuide, Styles.whiteTexture);
                    GUI.DrawTexture(bottomGuide, Styles.whiteTexture);

                    //lines
                    GUI.color = new Color(1, 1, 1, 0.2f);
                    var leftLine   = Rect.MinMaxRect(min.x, 0, min.x + 2, container.height);
                    var rightLine  = Rect.MinMaxRect(max.x - 2, 0, max.x, container.height);
                    var topLine    = Rect.MinMaxRect(0, min.y, container.width, min.y + 2);
                    var bottonLine = Rect.MinMaxRect(0, max.y - 2, container.width, max.y);
                    GUI.DrawTexture(leftLine, Styles.whiteTexture);
                    GUI.DrawTexture(rightLine, Styles.whiteTexture);
                    GUI.DrawTexture(topLine, Styles.whiteTexture);
                    GUI.DrawTexture(bottonLine, Styles.whiteTexture);

                    GUI.color = Color.white;

                    var pointPos = composer.target.TransformPoint(composer.targetOffset);
                    var bounds   = new Bounds(pointPos, new Vector3(composer.targetSize, composer.targetSize, composer.targetSize) * 2);
                    var rect     = bounds.ToViewRect(cam);
                    rect      = new Rect(rect.x * container.width, rect.y * container.height, rect.width * container.width, rect.height * container.height);
                    GUI.color = Color.green;
                    GUI.Box(rect, "", Styles.hollowFrameStyle); //subject area
                    var pointRect = new Rect(0, 0, 10, 10);
                    pointRect.center = rect.center;
                    GUI.DrawTexture(pointRect, Styles.plusIcon); //subject center
                    GUI.color = Color.white;

                    //label info
                    var label     = string.Format("'{0}' FrameComposition", cam.name);
                    var labelSize = GUI.skin.GetStyle("label").CalcSize(new GUIContent(label));
                    var labelRect = new Rect(4, 4, labelSize.x + 2, labelSize.y);
                    GUI.DrawTexture(labelRect, Styles.whiteTexture);
                    GUI.color = Color.grey;
                    GUI.Label(labelRect, label);
                    GUI.color = Color.white;
                }
            }
        }
Ejemplo n.º 8
0
        void UpdateController(IDirectableCamera directableCamera, IDirectable directable, bool isHard)
        {
            //UpdateController is called more than once per frame if same shot is used from multiple clips in a cutscene.
            //Ensure that this is updated only once per frame.
            if (!isHard && lastUpdateFrame == Time.frameCount)
            {
                return;
            }
            lastUpdateFrame = Time.frameCount;

            //if rootdelta == 0, use Time.delta
            var rootDelta = Mathf.Abs(directable.root.currentTime - directable.root.previousTime);
            var deltaTime = rootDelta != 0 ? rootDelta : Time.deltaTime;
            var cam       = directableCamera.cam;

            if (transposer.target != null && transposer.trackingMode != Transposer.TrackingMode.None)
            {
                var targetPos = transposer.target.position;
                if (transposer.offsetMode == Transposer.OffsetMode.LocalSpace)
                {
                    targetPos = transposer.target.TransformPoint(transposer.targetOffset);
                }
                if (transposer.offsetMode == Transposer.OffsetMode.WorldSpace)
                {
                    targetPos = transposer.target.position + transposer.targetOffset;
                }

                //offset tracking
                if (transposer.trackingMode == Transposer.TrackingMode.OffsetTracking)
                {
                    //...
                }

                //rail tracking
                if (transposer.trackingMode == Transposer.TrackingMode.RailTracking)
                {
                    var aT       = targetPos - transposer.railStart;
                    var bT       = (transposer.railEnd - transposer.railStart).normalized;
                    var projectT = Vector3.Project(aT, bT) + transposer.railStart;

                    //clamp it
                    if ((projectT - transposer.railStart).normalized != (transposer.railEnd - transposer.railStart).normalized)
                    {
                        projectT = transposer.railStart;
                    }

                    var dMax         = Vector3.Distance(transposer.railStart, transposer.railEnd);
                    var dCurrent     = Vector3.Distance(transposer.railStart, projectT);
                    var normDistance = (dCurrent / dMax) + transposer.railOffset;
                    targetPos = Vector3.Lerp(transposer.railStart, transposer.railEnd, normDistance);
                }


                if (isHard || transposer.smoothDamping == MIN_DAMP)
                {
                    directableCamera.position = targetPos;
                }

                directableCamera.position = Vector3.Lerp(directableCamera.position, targetPos, deltaTime * (MAX_DAMP / transposer.smoothDamping));
            }

            if (composer.target != null && composer.trackingMode != Composer.TrackingMode.None)
            {
                if (composer.trackingMode == Composer.TrackingMode.FrameComposition)
                {
                    var wasRotation      = directableCamera.rotation;
                    var pointWorldPos    = composer.target.TransformPoint(composer.targetOffset);
                    var rotationToTarget = Quaternion.LookRotation(pointWorldPos - directableCamera.position);
                    directableCamera.rotation = rotationToTarget;

                    var left      = Mathf.Clamp01((composer.frameCenter.x + 0.5f) - composer.frameExtends.x / 2);
                    var right     = Mathf.Clamp01((composer.frameCenter.x + 0.5f) + composer.frameExtends.x / 2);
                    var top       = Mathf.Clamp01((composer.frameCenter.y + 0.5f) - composer.frameExtends.y / 2);
                    var bottom    = Mathf.Clamp01((composer.frameCenter.y + 0.5f) + composer.frameExtends.y / 2);
                    var viewFrame = Rect.MinMaxRect(left, top, right, bottom);

                    var worldFrameCenter = cam.ViewportToWorldPoint(new Vector3(1 - viewFrame.center.x, viewFrame.center.y, Vector3.Distance(directableCamera.position, pointWorldPos)));
                    var rotationToFrame  = Quaternion.LookRotation(worldFrameCenter - directableCamera.position);
                    directableCamera.rotation = wasRotation;

                    var interestBounds    = new Bounds(pointWorldPos, new Vector3(composer.targetSize, composer.targetSize, composer.targetSize) * 2);
                    var interestViewFrame = interestBounds.ToViewRect(cam);

                    if (isHard || composer.smoothDamping == MIN_DAMP)
                    {
                        directableCamera.rotation = rotationToFrame;
                    }
                    else
                    {
                        var normxMin = (viewFrame.xMin - interestViewFrame.xMin);
                        var normxMax = (interestViewFrame.xMax - viewFrame.xMax);
                        var normyMin = (viewFrame.yMin - interestViewFrame.yMin);
                        var normyMax = (interestViewFrame.yMax - viewFrame.yMax);

                        var norm     = Mathf.Max(normxMin, normxMax, normyMin, normyMax, 0);
                        var normDamp = (MAX_DAMP / composer.smoothDamping) * norm;
                        directableCamera.rotation = Quaternion.Lerp(wasRotation, rotationToFrame, normDamp);
                    }

                    //dutch tilt
                    if (composer.dutchTilt != 0)
                    {
                        var euler = directableCamera.cam.transform.GetLocalEulerAngles();
                        euler.z = composer.dutchTilt;
                        directableCamera.cam.transform.SetLocalEulerAngles(euler);
                    }

                    //zoom at frame
                    if (composer.zoomAtTargetFrame)
                    {
                        var rectDiff = interestViewFrame.height - viewFrame.height;
                        var fov      = directableCamera.fieldOfView;
                        var sign     = Mathf.Sign(rectDiff);
                        fov += (Mathf.Abs(rectDiff) * 20) * sign;
                        directableCamera.fieldOfView = Mathf.Clamp(fov, 5, 70);
                    }
                }
            }
        }
Ejemplo n.º 9
0
 public void UpdateControllerSoft(IDirectableCamera directableCamera, IDirectable directable)
 {
     UpdateController(directableCamera, directable, false);
 }
Ejemplo n.º 10
0
 //Update controller for target directable camera from target directable element (eg clip).
 public void UpdateControllerHard(IDirectableCamera directableCamera, IDirectable directable)
 {
     UpdateController(directableCamera, directable, true);
 }
Ejemplo n.º 11
0
        ///Enable the Director Camera, while disabling the main camera if any
        public static void Enable()
        {
            //init gamecamera if any
            if (gameCamera == null)
            {
                var main = Camera.main;
                if (main != null && main != renderCamera)
                {
                    gameCamera = main.GetAddComponent <GameCamera>();
                }
            }

            //use gamecamera and disable it
            if (gameCamera != null)
            {
                gameCamera.gameObject.SetActive(false);
                if (matchMainWhenActive)
                {
                    var tempFOV = current.fieldOfView;
                    renderCamera.CopyFrom(gameCamera.cam);
                    if (ignoreFOVChanges)
                    {
                        renderCamera.fieldOfView = tempFOV;
                    }
                }

                //set the root pos/rot
                current.transform.position = gameCamera.position;
                current.transform.rotation = gameCamera.rotation;
            }

            //reset render camera local pos/rot
            renderCamera.transform.localPosition = Vector3.zero;
            renderCamera.transform.localRotation = Quaternion.identity;

            //set render camera to MainCamera if option enabled
            if (setMainWhenActive)
            {
                renderCamera.gameObject.tag = "MainCamera";
            }

            ///enable
            if (autoHandleActiveState)
            {
                renderCamera.gameObject.SetActive(true);
            }

#if SLATE_USE_POSTSTACK
            quickPostDOF = ScriptableObject.CreateInstance <DepthOfField>();
            quickPostDOF.enabled.Override(true);
            quickPostDOF.SetAllOverridesTo(true);
            quickPostVolume = PostProcessManager.instance.QuickVolume(postVolumeLayer, 100, quickPostDOF);
            quickPostVolume.gameObject.hideFlags = HideFlags.None;
#endif

            isEnabled      = true;
            lastTargetShot = null;

            if (onActivate != null)
            {
                onActivate();
            }
        }