Browse Source

Show a simple camera preview window in bottom right of editor when a camera component is selected. Closes #123.
Save editor's axismode to config to remember it on the next run.

Lasse Öörni 11 years ago
parent
commit
45b0db3590

+ 2 - 0
Bin/Data/Scripts/Editor.as

@@ -151,6 +151,7 @@ void LoadConfig()
         if (objectElem.HasAttribute("applymateriallist")) applyMaterialList = objectElem.GetBool("applymateriallist");
         if (objectElem.HasAttribute("importoptions")) importOptions = objectElem.GetAttribute("importoptions");
         if (objectElem.HasAttribute("pickmode")) pickMode = objectElem.GetInt("pickmode");
+        if (objectElem.HasAttribute("axismode")) axisMode = AxisMode(objectElem.GetInt("axismode"));
     }
 
     if (!resourcesElem.isNull)
@@ -256,6 +257,7 @@ void SaveConfig()
     objectElem.SetBool("applymateriallist", applyMaterialList);
     objectElem.SetAttribute("importoptions", importOptions);
     objectElem.SetInt("pickmode", pickMode);
+    objectElem.SetInt("axismode", axisMode);
 
     resourcesElem.SetBool("rememberresourcepath", rememberResourcePath);
     resourcesElem.SetAttribute("resourcepath", sceneResourcePath);

+ 1 - 0
Bin/Data/Scripts/Editor/EditorHierarchyWindow.as

@@ -717,6 +717,7 @@ void HandleHierarchyListSelectionChange()
 
     PositionGizmo();
     UpdateAttributeInspector();
+    UpdateCameraPreview();
 }
 
 void HandleDragDropTest(StringHash eventType, VariantMap& eventData)

+ 68 - 0
Bin/Data/Scripts/Editor/EditorView.as

@@ -1,5 +1,6 @@
 // Urho3D editor view & camera functions
 
+WeakHandle previewCamera;
 Node@ cameraNode;
 Camera@ camera;
 
@@ -400,6 +401,8 @@ void CreateCamera()
     SubscribeToEvent("PostRenderUpdate", "HandlePostRenderUpdate");
     SubscribeToEvent("UIMouseClick", "ViewMouseClick");
     SubscribeToEvent("MouseMove", "ViewMouseMove");
+    SubscribeToEvent("BeginViewUpdate", "HandleBeginViewUpdate");
+    SubscribeToEvent("EndViewUpdate", "HandleEndViewUpdate");
 }
 
 // Create any UI associated with changing the editor viewports
@@ -613,9 +616,60 @@ void SetViewportMode(uint mode = VIEWPORT_SINGLE)
     
     ReacquireCameraYawPitch();
     UpdateViewParameters();
+    UpdateCameraPreview();
     CreateViewportUI();
 }
 
+// Create a preview viewport if a camera component is selected
+void UpdateCameraPreview()
+{
+    previewCamera = null;
+    ShortStringHash cameraType("Camera");
+
+    for (uint i = 0; i < selectedComponents.length; ++i)
+    {
+        if (selectedComponents[i].type == cameraType)
+        {
+            // Take the first encountered camera
+            previewCamera = selectedComponents[i];
+            break;
+        }
+    }
+    // Also try nodes if not found from components
+    if (previewCamera.Get() is null)
+    {
+        for (uint i = 0; i < selectedNodes.length; ++i)
+        {
+            previewCamera = selectedNodes[i].GetComponent("Camera");
+            if (previewCamera.Get() !is null)
+                break;
+        }
+    }
+
+    // Remove extra viewport if it exists and no camera is selected
+    if (previewCamera.Get() is null)
+    {
+        if (renderer.numViewports > viewports.length)
+            renderer.numViewports = viewports.length;
+    }
+    else
+    {
+        if (renderer.numViewports < viewports.length + 1)
+            renderer.numViewports = viewports.length + 1;
+
+        int previewWidth = graphics.width / 4;
+        int previewHeight = previewWidth * 9 / 16;
+        int previewX = graphics.width - 10 - previewWidth;
+        int previewY = graphics.height - 30 - previewHeight;
+
+        Viewport@ previewView = Viewport();
+        previewView.scene = editorScene;
+        previewView.camera = previewCamera.Get();
+        previewView.rect = IntRect(previewX, previewY, previewX + previewWidth, previewY + previewHeight);
+        renderer.viewports[viewports.length] = previewView;
+    }
+}
+
 void HandleViewportBorderDragMove(StringHash eventType, VariantMap& eventData)
 {
     UIElement@ dragBorder = eventData["Element"].GetPtr();
@@ -1546,3 +1600,17 @@ Vector3 GetScreenCollision(IntVector2 pos)
 
     return res;
 }
+
+void HandleBeginViewUpdate(StringHash eventType, VariantMap& eventData)
+{
+    // Hide gizmo from preview camera
+    if (eventData["Camera"].GetPtr() is previewCamera.Get() && gizmo !is null)
+        gizmo.viewMask = 0;
+}
+
+void HandleEndViewUpdate(StringHash eventType, VariantMap& eventData)
+{
+    // Restore gizmo after preview view update
+    if (eventData["Camera"].GetPtr() is previewCamera.Get() && gizmo !is null)
+        gizmo.viewMask = 0x80000000;
+}