Browse Source

Clean up view event sending code. Add 2 new view events: buffers allocated, and global shader parameters set.

Lasse Öörni 9 years ago
parent
commit
fe2e70db13

+ 21 - 1
Source/Urho3D/Graphics/GraphicsEvents.h

@@ -90,7 +90,27 @@ URHO3D_EVENT(E_BEGINVIEWRENDER, BeginViewRender)
     URHO3D_PARAM(P_CAMERA, Camera);                // Camera pointer
 }
 
-/// Render of a view ended.
+/// A view has allocated its screen buffers for rendering. They can be accessed now with View::FindNamedTexture().
+URHO3D_EVENT(E_VIEWBUFFERSREADY, ViewBuffersReady)
+{
+    URHO3D_PARAM(P_VIEW, View);                    // View pointer
+    URHO3D_PARAM(P_TEXTURE, Texture);              // Texture pointer
+    URHO3D_PARAM(P_SURFACE, Surface);              // RenderSurface pointer
+    URHO3D_PARAM(P_SCENE, Scene);                  // Scene pointer
+    URHO3D_PARAM(P_CAMERA, Camera);                // Camera pointer
+}
+
+/// A view has set global shader parameters for a new combination of vertex/pixel shaders. Custom global parameters can now be set.
+URHO3D_EVENT(E_VIEWGLOBALSHADERPARAMETERS, ViewGlobalShaderParameters)
+{
+    URHO3D_PARAM(P_VIEW, View);                    // View pointer
+    URHO3D_PARAM(P_TEXTURE, Texture);              // Texture pointer
+    URHO3D_PARAM(P_SURFACE, Surface);              // RenderSurface pointer
+    URHO3D_PARAM(P_SCENE, Scene);                  // Scene pointer
+    URHO3D_PARAM(P_CAMERA, Camera);                // Camera pointer
+}
+
+/// Render of a view ended. Its screen buffers are still accessible if needed.
 URHO3D_EVENT(E_ENDVIEWRENDER, EndViewRender)
 {
     URHO3D_PARAM(P_VIEW, View);                    // View pointer

+ 0 - 14
Source/Urho3D/Graphics/Renderer.cpp

@@ -737,23 +737,9 @@ void Renderer::Render()
         if (!views_[i])
             continue;
 
-        using namespace BeginViewRender;
-
-        RenderSurface* renderTarget = views_[i]->GetRenderTarget();
-
-        VariantMap& eventData = GetEventDataMap();
-        eventData[P_VIEW] = views_[i];
-        eventData[P_SURFACE] = renderTarget;
-        eventData[P_TEXTURE] = (renderTarget ? renderTarget->GetParentTexture() : 0);
-        eventData[P_SCENE] = views_[i]->GetScene();
-        eventData[P_CAMERA] = views_[i]->GetCamera();
-        SendEvent(E_BEGINVIEWRENDER, eventData);
-
         // Screen buffers can be reused between views, as each is rendered completely
         PrepareViewRender();
         views_[i]->Render();
-
-        SendEvent(E_ENDVIEWRENDER, eventData);
     }
 
     // Copy the number of batches & primitives from Graphics so that we can account for 3D geometry only

+ 28 - 9
Source/Urho3D/Graphics/View.cpp

@@ -546,13 +546,7 @@ void View::Update(const FrameInfo& frame)
 
     using namespace BeginViewUpdate;
 
-    VariantMap& eventData = GetEventDataMap();
-    eventData[P_VIEW] = this;
-    eventData[P_SURFACE] = renderTarget_;
-    eventData[P_TEXTURE] = (renderTarget_ ? renderTarget_->GetParentTexture() : 0);
-    eventData[P_SCENE] = scene_;
-    eventData[P_CAMERA] = cullCamera_;
-    renderer_->SendEvent(E_BEGINVIEWUPDATE, eventData);
+    SendViewEvent(E_BEGINVIEWUPDATE);
 
     int maxSortedInstances = renderer_->GetMaxSortedInstances();
 
@@ -569,7 +563,7 @@ void View::Update(const FrameInfo& frame)
 
     if (hasScenePasses_ && (!cullCamera_ || !octree_))
     {
-        renderer_->SendEvent(E_ENDVIEWUPDATE, eventData);
+        SendViewEvent(E_ENDVIEWUPDATE);
         return;
     }
 
@@ -581,18 +575,24 @@ void View::Update(const FrameInfo& frame)
     GetBatches();
     renderer_->StorePreparedView(this, cullCamera_);
 
-    renderer_->SendEvent(E_ENDVIEWUPDATE, eventData);
+    SendViewEvent(E_ENDVIEWUPDATE);
 }
 
 void View::Render()
 {
+    SendViewEvent(E_BEGINVIEWRENDER);
+
     if (hasScenePasses_ && (!octree_ || !camera_))
+    {
+        SendViewEvent(E_ENDVIEWRENDER);
         return;
+    }
 
     UpdateGeometries();
 
     // Allocate screen buffers as necessary
     AllocateScreenBuffers();
+    SendViewEvent(E_VIEWBUFFERSREADY);
 
     // Forget parameter sources from the previous view
     graphics_->ClearParameterSources();
@@ -672,6 +672,8 @@ void View::Render()
     // (backbuffer should contain proper depth already)
     if (currentRenderTarget_ != renderTarget_)
         BlitFramebuffer(currentRenderTarget_->GetParentTexture(), renderTarget_, !usedResolve_);
+
+    SendViewEvent(E_ENDVIEWRENDER);
 }
 
 Graphics* View::GetGraphics() const
@@ -700,6 +702,8 @@ void View::SetGlobalShaderParameters()
         graphics_->SetShaderParameter(VSP_ELAPSEDTIME, elapsedTime);
         graphics_->SetShaderParameter(PSP_ELAPSEDTIME, elapsedTime);
     }
+
+    SendViewEvent(E_VIEWGLOBALSHADERPARAMETERS);
 }
 
 void View::SetCameraShaderParameters(Camera* camera)
@@ -3081,6 +3085,21 @@ RenderSurface* View::GetRenderSurfaceFromTexture(Texture* texture, CubeMapFace f
         return 0;
 }
 
+void View::SendViewEvent(StringHash eventType)
+{
+    using namespace BeginViewRender;
+    
+    VariantMap& eventData = GetEventDataMap();
+    
+    eventData[P_VIEW] = this;
+    eventData[P_SURFACE] = renderTarget_;
+    eventData[P_TEXTURE] = (renderTarget_ ? renderTarget_->GetParentTexture() : 0);
+    eventData[P_SCENE] = scene_;
+    eventData[P_CAMERA] = cullCamera_;
+
+    renderer_->SendEvent(eventType, eventData);
+}
+
 Texture* View::FindNamedTexture(const String& name, bool isRenderTarget, bool isVolumeMap)
 {
     // Check rendertargets first

+ 2 - 0
Source/Urho3D/Graphics/View.h

@@ -271,6 +271,8 @@ private:
     RenderSurface* GetDepthStencil(RenderSurface* renderTarget);
     /// Helper function to get the render surface from a texture. 2D textures will always return the first face only.
     RenderSurface* GetRenderSurfaceFromTexture(Texture* texture, CubeMapFace face = FACE_POSITIVE_X);
+    /// Send a view update or render related event through the Renderer subsystem. The parameters are the same for all of them.
+    void SendViewEvent(StringHash eventType);
 
     /// Return the drawable's zone, or camera zone if it has override mode enabled.
     Zone* GetZone(Drawable* drawable)