Explorar o código

Visualize camera as a frustum. Do not draw debug geometry in the editor's camera preview.

Lasse Öörni %!s(int64=11) %!d(string=hai) anos
pai
achega
03043038a0

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

@@ -403,6 +403,8 @@ void CreateCamera()
     SubscribeToEvent("MouseMove", "ViewMouseMove");
     SubscribeToEvent("BeginViewUpdate", "HandleBeginViewUpdate");
     SubscribeToEvent("EndViewUpdate", "HandleEndViewUpdate");
+    SubscribeToEvent("BeginViewRender", "HandleBeginViewRender");
+    SubscribeToEvent("EndViewRender", "HandleEndViewRender");
 }
 
 // Create any UI associated with changing the editor viewports
@@ -1614,3 +1616,37 @@ void HandleEndViewUpdate(StringHash eventType, VariantMap& eventData)
     if (eventData["Camera"].GetPtr() is previewCamera.Get() && gizmo !is null)
         gizmo.viewMask = 0x80000000;
 }
+
+bool debugWasEnabled = true;
+
+void HandleBeginViewRender(StringHash eventType, VariantMap& eventData)
+{
+    // Hide debug geometry from preview camera
+    if (eventData["Camera"].GetPtr() is previewCamera.Get())
+    {
+        DebugRenderer@ debug = editorScene.GetComponent("DebugRenderer");
+        if (debug !is null)
+        {
+            suppressSceneChanges = true; // Do not want UI update now
+            debugWasEnabled = debug.enabled;
+            debug.enabled = false;
+            suppressSceneChanges = false;
+        }
+    }
+}
+
+void HandleEndViewRender(StringHash eventType, VariantMap& eventData)
+{
+    // Restore debug geometry after preview camera render
+    if (eventData["Camera"].GetPtr() is previewCamera.Get())
+    {
+        DebugRenderer@ debug = editorScene.GetComponent("DebugRenderer");
+        if (debug !is null)
+        {
+            suppressSceneChanges = true; // Do not want UI update now
+            debug.enabled = debugWasEnabled;
+            suppressSceneChanges = false;
+        }
+    }
+}
+

+ 6 - 0
Source/Engine/Graphics/Camera.cpp

@@ -23,6 +23,7 @@
 #include "Precompiled.h"
 #include "Camera.h"
 #include "Context.h"
+#include "DebugRenderer.h"
 #include "Drawable.h"
 #include "Node.h"
 
@@ -108,6 +109,11 @@ void Camera::RegisterObject(Context* context)
     ACCESSOR_ATTRIBUTE(Camera, VAR_BOOL, "Use Clipping", GetUseClipping, SetUseClipping, bool, false, AM_DEFAULT);
 }
 
+void Camera::DrawDebugGeometry(DebugRenderer* debug, bool depthTest)
+{
+    debug->AddFrustum(GetFrustum(), Color::WHITE, depthTest);
+}
+
 void Camera::SetNearClip(float nearClip)
 {
     nearClip_ = Max(nearClip, M_MIN_NEARCLIP);

+ 3 - 0
Source/Engine/Graphics/Camera.h

@@ -48,6 +48,9 @@ public:
     /// Register object factory.
     static void RegisterObject(Context* context);
     
+    /// Visualize the component as debug geometry.
+    virtual void DrawDebugGeometry(DebugRenderer* debug, bool depthTest);
+    
     /// Set near clip distance.
     void SetNearClip(float nearClip);
     /// Set far clip distance.

+ 1 - 1
Source/Engine/Graphics/Renderer.cpp

@@ -732,7 +732,7 @@ void Renderer::DrawDebugGeometry(bool depthTest)
         if (!octree)
             continue;
         DebugRenderer* debug = octree->GetComponent<DebugRenderer>();
-        if (!debug)
+        if (!debug || !debug->IsEnabledEffective())
             continue;
         
         const PODVector<Drawable*>& geometries = view->GetGeometries();

+ 1 - 1
Source/Engine/Graphics/View.cpp

@@ -554,7 +554,7 @@ void View::Render()
     if (!renderTarget_)
     {
         DebugRenderer* debug = octree_->GetComponent<DebugRenderer>();
-        if (debug)
+        if (debug && debug->IsEnabledEffective())
         {
             debug->SetView(camera_);
             debug->Render();