///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(); } }
///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; }
///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; }
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); }
///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; } } } }
///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); } } }
///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; } } }
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); } } } }
public void UpdateControllerSoft(IDirectableCamera directableCamera, IDirectable directable) { UpdateController(directableCamera, directable, false); }
//Update controller for target directable camera from target directable element (eg clip). public void UpdateControllerHard(IDirectableCamera directableCamera, IDirectable directable) { UpdateController(directableCamera, directable, true); }
///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(); } }