Skip to content

Commit a9c4c27

Browse files
Fixed various Look Dev issues after exiting Playmode (#2956)
* Fixed access to invalid Contexts references after exiting playmode. * Fixed comparison gizmo after playmode. * Fixes from PR feedback
1 parent 4313b48 commit a9c4c27

File tree

6 files changed

+65
-30
lines changed

6 files changed

+65
-30
lines changed

com.unity.render-pipelines.core/Editor/LookDev/CameraController.cs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -129,13 +129,17 @@ virtual protected bool isDragging
129129
}
130130
}
131131

132-
public CameraController(CameraState cameraState, DisplayWindow window, Action focused)
132+
public CameraController(DisplayWindow window, Action focused)
133133
{
134-
m_CameraState = cameraState;
135134
m_Window = window;
136135
m_Focused = focused;
137136
}
138137

138+
public void UpdateCameraState(Context context, ViewIndex index)
139+
{
140+
m_CameraState = context.GetViewContent(index).camera;
141+
}
142+
139143
private void ResetCameraControl()
140144
{
141145
isDragging = false;
@@ -458,16 +462,22 @@ class SwitchableCameraController : CameraController
458462
bool switchedDrag = false;
459463
bool switchedWheel = false;
460464

461-
public SwitchableCameraController(CameraState cameraStateFirstView, CameraState cameraStateSecondView, DisplayWindow window, Action<ViewIndex> focused)
462-
: base(cameraStateFirstView, window, null)
465+
public SwitchableCameraController(DisplayWindow window, Action<ViewIndex> focused)
466+
: base(window, null)
463467
{
464-
m_FirstView = cameraStateFirstView;
465-
m_SecondView = cameraStateSecondView;
466468
m_CurrentViewIndex = ViewIndex.First;
467469

468470
m_Focused = () => focused?.Invoke(m_CurrentViewIndex);
469471
}
470472

473+
public void UpdateCameraState(Context context)
474+
{
475+
m_FirstView = context.GetViewContent(ViewIndex.First).camera;
476+
m_SecondView = context.GetViewContent(ViewIndex.Second).camera;
477+
478+
m_CameraState = m_CurrentViewIndex == ViewIndex.First ? m_FirstView : m_SecondView;
479+
}
480+
471481
void SwitchTo(ViewIndex index)
472482
{
473483
CameraState stateToSwitch;

com.unity.render-pipelines.core/Editor/LookDev/ComparisonGizmoController.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,16 @@ bool isDragging
4949
}
5050
}
5151

52-
public ComparisonGizmoController(ComparisonGizmoState state, SwitchableCameraController switcher)
52+
public ComparisonGizmoController(SwitchableCameraController switcher)
5353
{
54-
m_State = state;
5554
m_Switcher = switcher;
5655
}
5756

57+
public void UpdateGizmoState(ComparisonGizmoState state)
58+
{
59+
m_State = state;
60+
}
61+
5862
protected override void RegisterCallbacksOnTarget()
5963
{
6064
target.RegisterCallback<MouseDownEvent>(OnMouseDown);

com.unity.render-pipelines.core/Editor/LookDev/Compositor.cs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -150,17 +150,15 @@ public bool pixelPerfect
150150

151151
public Compositer(
152152
IViewDisplayer displayer,
153-
Context contexts,
154153
IDataProvider dataProvider,
155154
StageCache stages)
156155
{
157156
m_Displayer = displayer;
158-
m_Contexts = contexts;
159157

160158
m_RenderDataCache = new RenderingData[2]
161159
{
162-
new RenderingData() { stage = stages[ViewIndex.First], updater = contexts.GetViewContent(ViewIndex.First).camera },
163-
new RenderingData() { stage = stages[ViewIndex.Second], updater = contexts.GetViewContent(ViewIndex.Second).camera }
160+
new RenderingData() { stage = stages[ViewIndex.First] },
161+
new RenderingData() { stage = stages[ViewIndex.Second] }
164162
};
165163

166164
m_Displayer.OnRenderDocAcquisitionTriggered += RenderDocAcquisitionRequested;
@@ -197,6 +195,12 @@ public void Dispose()
197195

198196
public void Render()
199197
{
198+
// This can happen when entering/leaving playmode.
199+
if (LookDev.dataProvider == null)
200+
return;
201+
202+
m_Contexts = LookDev.currentContext;
203+
200204
//TODO: make integration EditorWindow agnostic!
201205
if (UnityEditorInternal.RenderDoc.IsLoaded() && UnityEditorInternal.RenderDoc.IsSupported() && m_RenderDocAcquisitionRequested)
202206
UnityEditorInternal.RenderDoc.BeginCaptureRenderDoc(m_Displayer as EditorWindow);
@@ -236,11 +240,13 @@ void AcquireDataForView(ViewIndex index, Rect viewport)
236240

237241
m_RenderTextures.UpdateSize(renderingData.viewPort, index, m_Renderer.pixelPerfect, renderingData.stage.camera);
238242

239-
int debugMode = m_Contexts.GetViewContent(index).debug.viewMode;
243+
int debugMode = view.debug.viewMode;
240244
if (debugMode != -1)
241245
LookDev.dataProvider.UpdateDebugMode(debugMode);
242246

243247
renderingData.output = m_RenderTextures[index, ShadowCompositionPass.MainView];
248+
renderingData.updater = view.camera;
249+
244250
m_Renderer.BeginRendering(renderingData, LookDev.dataProvider);
245251
m_Renderer.Acquire(renderingData);
246252

com.unity.render-pipelines.core/Editor/LookDev/DisplayWindow.cs

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,10 @@ event Action IViewDisplayer.OnUpdateRequested
217217
StyleSheet styleSheet = null;
218218
StyleSheet styleSheetLight = null;
219219

220+
SwitchableCameraController m_FirstOrCompositeManipulator;
221+
CameraController m_SecondManipulator;
222+
ComparisonGizmoController m_GizmoManipulator;
223+
220224
void ReloadStyleSheets()
221225
{
222226
if (styleSheet == null || styleSheet.Equals(null))
@@ -395,9 +399,7 @@ void CreateViews()
395399
m_Views[(int)ViewIndex.Second] = new Image() { name = Style.k_SecondViewName, image = Texture2D.blackTexture };
396400
m_ViewContainer.Add(m_Views[(int)ViewIndex.Second]);
397401

398-
var firstOrCompositeManipulator = new SwitchableCameraController(
399-
LookDev.currentContext.GetViewContent(ViewIndex.First).camera,
400-
LookDev.currentContext.GetViewContent(ViewIndex.Second).camera,
402+
m_FirstOrCompositeManipulator = new SwitchableCameraController(
401403
this,
402404
index =>
403405
{
@@ -406,8 +408,7 @@ void CreateViews()
406408
if (sidePanel == SidePanel.Environment && environment != null && LookDev.currentContext.environmentLibrary != null)
407409
m_EnvironmentList.selectedIndex = LookDev.currentContext.environmentLibrary.IndexOf(environment);
408410
});
409-
var secondManipulator = new CameraController(
410-
LookDev.currentContext.GetViewContent(ViewIndex.Second).camera,
411+
m_SecondManipulator = new CameraController(
411412
this,
412413
() =>
413414
{
@@ -416,10 +417,10 @@ void CreateViews()
416417
if (sidePanel == SidePanel.Environment && environment != null && LookDev.currentContext.environmentLibrary != null)
417418
m_EnvironmentList.selectedIndex = LookDev.currentContext.environmentLibrary.IndexOf(environment);
418419
});
419-
var gizmoManipulator = new ComparisonGizmoController(LookDev.currentContext.layout.gizmoState, firstOrCompositeManipulator);
420-
m_Views[(int)ViewIndex.First].AddManipulator(gizmoManipulator); //must take event first to switch the firstOrCompositeManipulator
421-
m_Views[(int)ViewIndex.First].AddManipulator(firstOrCompositeManipulator);
422-
m_Views[(int)ViewIndex.Second].AddManipulator(secondManipulator);
420+
m_GizmoManipulator = new ComparisonGizmoController(m_FirstOrCompositeManipulator);
421+
m_Views[(int)ViewIndex.First].AddManipulator(m_GizmoManipulator); //must take event first to switch the firstOrCompositeManipulator
422+
m_Views[(int)ViewIndex.First].AddManipulator(m_FirstOrCompositeManipulator);
423+
m_Views[(int)ViewIndex.Second].AddManipulator(m_SecondManipulator);
423424

424425
m_NoObject1 = new Label(Style.k_DragAndDropObject);
425426
m_NoObject1.style.flexGrow = 1;
@@ -667,6 +668,11 @@ void Update()
667668
Debug.LogError("LookDev is not supported: No SRP detected.");
668669
LookDev.Close();
669670
}
671+
672+
// All those states coming from the Contexts can become invalid after a domain reload so we need to update them.
673+
m_FirstOrCompositeManipulator.UpdateCameraState(LookDev.currentContext);
674+
m_SecondManipulator.UpdateCameraState(LookDev.currentContext, ViewIndex.Second);
675+
m_GizmoManipulator.UpdateGizmoState(LookDev.currentContext.layout.gizmoState);
670676
}
671677

672678
void OnGUI()

com.unity.render-pipelines.core/Editor/LookDev/LookDev.cs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,18 @@ internal static IDataProvider dataProvider
2828
internal static Context currentContext
2929
{
3030
//Lazy init: load it when needed instead in static even if you do not support lookdev
31-
get => s_CurrentContext ?? (s_CurrentContext = LoadConfigInternal() ?? defaultContext);
31+
get
32+
{
33+
if (s_CurrentContext == null || s_CurrentContext.Equals(null))
34+
{
35+
s_CurrentContext = LoadConfigInternal();
36+
if (s_CurrentContext == null)
37+
s_CurrentContext = defaultContext;
38+
39+
ReloadStage(false);
40+
}
41+
return s_CurrentContext;
42+
}
3243
private set => s_CurrentContext = value;
3344
}
3445

@@ -161,9 +172,9 @@ static void WaitingSRPReloadForConfiguringRenderer(int maxAttempt, bool reloadWi
161172
static void ConfigureRenderer(bool reloadWithTemporaryID)
162173
{
163174
s_Stages?.Dispose(); //clean previous occurrence on reloading
164-
s_Stages = new StageCache(dataProvider, currentContext);
175+
s_Stages = new StageCache(dataProvider);
165176
s_Compositor?.Dispose(); //clean previous occurrence on reloading
166-
s_Compositor = new Compositer(s_ViewDisplayer, currentContext, dataProvider, s_Stages);
177+
s_Compositor = new Compositer(s_ViewDisplayer, dataProvider, s_Stages);
167178
}
168179

169180
static void LinkViewDisplayer()

com.unity.render-pipelines.core/Editor/LookDev/Stage.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -284,17 +284,15 @@ class StageCache : IDisposable
284284
const string secondStageName = "LookDevSecondView";
285285

286286
Stage[] m_Stages;
287-
Context m_Contexts;
288287
IDataProvider m_CurrentDataProvider;
289288

290289
public Stage this[ViewIndex index]
291290
=> m_Stages[(int)index];
292291

293292
public bool initialized { get; private set; }
294293

295-
public StageCache(IDataProvider dataProvider, Context contexts)
294+
public StageCache(IDataProvider dataProvider)
296295
{
297-
m_Contexts = contexts;
298296
m_Stages = new Stage[2]
299297
{
300298
InitStage(ViewIndex.First, dataProvider),
@@ -333,7 +331,7 @@ public void UpdateSceneObjects(ViewIndex index)
333331
Stage stage = this[index];
334332
stage.Clear();
335333

336-
var viewContent = m_Contexts.GetViewContent(index);
334+
var viewContent = LookDev.currentContext.GetViewContent(index);
337335
if (viewContent == null)
338336
{
339337
viewContent.viewedInstanceInPreview = null;
@@ -347,7 +345,7 @@ public void UpdateSceneObjects(ViewIndex index)
347345
public void UpdateSceneLighting(ViewIndex index, IDataProvider provider)
348346
{
349347
Stage stage = this[index];
350-
Environment environment = m_Contexts.GetViewContent(index).environment;
348+
Environment environment = LookDev.currentContext.GetViewContent(index).environment;
351349
provider.UpdateSky(stage.camera,
352350
environment == null ? default : environment.sky,
353351
stage.runtimeInterface);

0 commit comments

Comments
 (0)