Skip to content

Commit 3d939db

Browse files
committed
Bugfix: short freeze when transitioning between freeLooks
1 parent 2aa2741 commit 3d939db

File tree

3 files changed

+24
-14
lines changed

3 files changed

+24
-14
lines changed

Base/Editor/Editors/CinemachineVirtualCameraBaseEditor.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -150,10 +150,10 @@ protected void DrawCameraStatusInInspector()
150150
float labelWidth = 0;
151151
GUIContent updateText = GUIContent.none;
152152
CinemachineCore.UpdateFilter updateMode = CinemachineCore.Instance.GetVcamUpdateStatus(Target);
153-
if (updateMode != CinemachineCore.UpdateFilter.Any && Application.isPlaying)
153+
if (Application.isPlaying)
154154
{
155155
updateText = new GUIContent(
156-
updateMode == CinemachineCore.UpdateFilter.Fixed ? " Fixed Update" : " Late Update");
156+
updateMode < CinemachineCore.UpdateFilter.Late ? " Fixed Update" : " Late Update");
157157
var textDimensions = GUI.skin.label.CalcSize(updateText);
158158
labelWidth = textDimensions.x;
159159
}

Base/Runtime/Behaviours/CinemachineBrain.cs

+5-5
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ private void OnDisable()
335335

336336
private void Start()
337337
{
338-
UpdateVirtualCameras(CinemachineCore.UpdateFilter.Any, -1f);
338+
UpdateVirtualCameras(CinemachineCore.UpdateFilter.Late, -1f);
339339

340340
// We check in after the physics system has had a chance to move things
341341
StartCoroutine(AfterPhysics());
@@ -386,7 +386,7 @@ private IEnumerator AfterPhysics()
386386
else
387387
{
388388
AddSubframe(); // FixedUpdate can be called multiple times per frame
389-
UpdateVirtualCameras(CinemachineCore.UpdateFilter.Any, GetEffectiveDeltaTime(true));
389+
UpdateVirtualCameras(CinemachineCore.UpdateFilter.ForcedFixed, GetEffectiveDeltaTime(true));
390390
}
391391
}
392392
}
@@ -398,7 +398,7 @@ private void LateUpdate()
398398
if (m_UpdateMethod == UpdateMethod.SmartUpdate)
399399
UpdateVirtualCameras(CinemachineCore.UpdateFilter.Late, deltaTime);
400400
else if (m_UpdateMethod == UpdateMethod.LateUpdate)
401-
UpdateVirtualCameras(CinemachineCore.UpdateFilter.Any, deltaTime);
401+
UpdateVirtualCameras(CinemachineCore.UpdateFilter.ForcedLate, deltaTime);
402402

403403
// Choose the active vcam and apply it to the Unity camera
404404
ProcessActiveCamera(GetEffectiveDeltaTime(false));
@@ -416,7 +416,7 @@ private void OnPreCull()
416416
// to be painted one frame out of sync. It will only happen in the editor when not playing.
417417
float deltaTime = GetEffectiveDeltaTime(false);
418418
msSubframes = 1;
419-
UpdateVirtualCameras(CinemachineCore.UpdateFilter.Any, deltaTime);
419+
UpdateVirtualCameras(CinemachineCore.UpdateFilter.Late, deltaTime);
420420
ProcessActiveCamera(GetEffectiveDeltaTime(false));
421421
}
422422
}
@@ -454,7 +454,7 @@ private void UpdateVirtualCameras(CinemachineCore.UpdateFilter updateFilter, flo
454454
activeBlend.UpdateCameraState(DefaultWorldUp, deltaTime);
455455

456456
// Restore the filter for general use
457-
CinemachineCore.Instance.CurrentUpdateFilter = CinemachineCore.UpdateFilter.Any;
457+
CinemachineCore.Instance.CurrentUpdateFilter = CinemachineCore.UpdateFilter.Late;
458458
//UnityEngine.Profiling.Profiler.EndSample();
459459
}
460460

Base/Runtime/Core/CinemachineCore.cs

+17-7
Original file line numberDiff line numberDiff line change
@@ -182,8 +182,17 @@ internal bool UpdateVirtualCamera(ICinemachineCamera vcam, Vector3 worldUp, floa
182182
{
183183
//UnityEngine.Profiling.Profiler.BeginSample("CinemachineCore.UpdateVirtualCamera");
184184
int now = Time.frameCount;
185-
bool isSmartUpdate = CurrentUpdateFilter != UpdateFilter.Any;
186-
bool isSmartLateUpdate = CurrentUpdateFilter == UpdateFilter.Late;
185+
UpdateFilter filter = CurrentUpdateFilter;
186+
bool isSmartUpdate = filter != UpdateFilter.ForcedFixed
187+
&& filter != UpdateFilter.ForcedLate;
188+
bool isSmartLateUpdate = filter == UpdateFilter.Late;
189+
if (!isSmartUpdate)
190+
{
191+
if (filter == UpdateFilter.ForcedFixed)
192+
filter = UpdateFilter.Fixed;
193+
if (filter == UpdateFilter.ForcedLate)
194+
filter = UpdateFilter.Late;
195+
}
187196

188197
if (mUpdateStatus == null)
189198
mUpdateStatus = new Dictionary<ICinemachineCamera, UpdateStatus>();
@@ -215,13 +224,13 @@ internal bool UpdateVirtualCamera(ICinemachineCamera vcam, Vector3 worldUp, floa
215224
if (!GetTargetPosition(vcam, out targetPos))
216225
updateNow = isSmartLateUpdate; // no target
217226
else
218-
updateNow = status.ChoosePreferredUpdate(now, targetPos, CurrentUpdateFilter)
219-
== CurrentUpdateFilter;
227+
updateNow = status.ChoosePreferredUpdate(now, targetPos, filter)
228+
== filter;
220229
}
221230

222231
if (updateNow)
223232
{
224-
status.preferredUpdate = CurrentUpdateFilter;
233+
status.preferredUpdate = filter;
225234
while (status.lastUpdateSubframe < subframes)
226235
{
227236
//Debug.Log(vcam.Name + ": frame " + Time.frameCount + "." + status.lastUpdateSubframe + ", " + CurrentUpdateFilter + ", deltaTime = " + deltaTime);
@@ -263,6 +272,7 @@ public UpdateStatus(int currentFrame)
263272
targetPos = Matrix4x4.zero;
264273
}
265274

275+
// Important: updateFilter may ONLY be Late or Fixed
266276
public UpdateFilter ChoosePreferredUpdate(
267277
int currentFrame, Matrix4x4 pos, UpdateFilter updateFilter)
268278
{
@@ -297,7 +307,7 @@ public UpdateFilter ChoosePreferredUpdate(
297307
Dictionary<ICinemachineCamera, UpdateStatus> mUpdateStatus;
298308

299309
/// <summary>Internal use only</summary>
300-
public enum UpdateFilter { Fixed, Late, Any };
310+
public enum UpdateFilter { Fixed, ForcedFixed, Late, ForcedLate };
301311
internal UpdateFilter CurrentUpdateFilter { get; set; }
302312
private static bool GetTargetPosition(ICinemachineCamera vcam, out Matrix4x4 targetPos)
303313
{
@@ -328,7 +338,7 @@ public UpdateFilter GetVcamUpdateStatus(ICinemachineCamera vcam)
328338
{
329339
UpdateStatus status;
330340
if (mUpdateStatus == null || !mUpdateStatus.TryGetValue(vcam, out status))
331-
return UpdateFilter.Any;
341+
return UpdateFilter.Late;
332342
return status.preferredUpdate;
333343
}
334344

0 commit comments

Comments
 (0)