Browse Source

Bugfix: PreBasePass RenderExtensions are now called with bound GBuffer

This is what the comments suggest. Also adds a new "Prepare"
RenderExtension hook that is called before the GBuffer is bound.
Florian Will 8 years ago
parent
commit
ed7a61288d

+ 6 - 0
Source/BansheeCore/Renderer/BsRendererExtension.h

@@ -13,6 +13,12 @@ namespace bs
 	/** A set of available locations at which the renderer can call RendererExtension's render() method. */
 	enum class RenderLocation
 	{
+		/**
+		 * Rendering happens before any scene objects are rendered and before the render target for scene objects is
+		 * bound (e.g. GBuffer).
+		 */
+		Prepare,
+
 		/** 
 		 * Rendering happens before any scene objects are rendered. The renderer guarantees the render targets used for 
 		 * rendering scene objects will be bound (e.g. GBuffer).

+ 3 - 0
Source/RenderBeast/BsRenderBeast.cpp

@@ -397,6 +397,9 @@ namespace bs { namespace ct
 				RenderLocation location = extension->getLocation();
 				switch(location)
 				{
+				case RenderLocation::Prepare:
+					inputs.extPrepare.push_back(extension);
+					break;
 				case RenderLocation::PreBasePass: 
 					inputs.extPreBasePass.push_back(extension);
 					break;

+ 12 - 2
Source/RenderBeast/BsRenderCompositor.cpp

@@ -281,10 +281,10 @@ namespace bs { namespace ct
 
 		Camera* sceneCamera = inputs.view.getSceneCamera();
 
-		// Trigger pre-base-pass callbacks
+		// Trigger prepare callbacks
 		if (sceneCamera != nullptr)
 		{
-			for(auto& extension : inputs.extPreBasePass)
+			for(auto& extension : inputs.extPrepare)
 			{
 				if (extension->check(*sceneCamera))
 					extension->render(*sceneCamera);
@@ -301,6 +301,16 @@ namespace bs { namespace ct
 		// Clear all targets
 		rapi.clearViewport(FBT_COLOR | FBT_DEPTH | FBT_STENCIL, Color::ZERO, 1.0f, 0);
 
+		// Trigger pre-base-pass callbacks
+		if (sceneCamera != nullptr)
+		{
+			for(auto& extension : inputs.extPreBasePass)
+			{
+				if (extension->check(*sceneCamera))
+					extension->render(*sceneCamera);
+			}
+		}
+
 		// Render all visible opaque elements
 		const Vector<RenderQueueElement>& opaqueElements = inputs.view.getOpaqueQueue()->getSortedElements();
 		for (auto iter = opaqueElements.begin(); iter != opaqueElements.end(); ++iter)

+ 1 - 0
Source/RenderBeast/BsRenderCompositor.h

@@ -36,6 +36,7 @@ namespace ct
 		const RenderBeastFeatureSet featureSet;
 
 		// Callbacks to external systems can hook into the compositor
+		SmallVector<RendererExtension*, 4> extPrepare;
 		SmallVector<RendererExtension*, 4> extPreBasePass;
 		SmallVector<RendererExtension*, 4> extPostBasePass;
 		SmallVector<RendererExtension*, 4> extPostLighting;