Browse Source

Fixing renderer initialization so that active renderer is known before importing builtin resources as BSLFX importer requires it

BearishSun 10 years ago
parent
commit
a3ab47f92a

+ 1 - 1
BansheeCore/Include/BsCoreApplication.h

@@ -95,7 +95,7 @@ namespace BansheeEngine
 		virtual void postUpdate();
 
 		/**
-		 * @brief	Activates the renderer specified during construction. Called during initialization.
+		 * @brief	Initializes the renderer specified during construction. Called during initialization.
 		 */
 		virtual void startUpRenderer();
 

+ 4 - 4
BansheeCore/Include/BsCoreRenderer.h

@@ -55,18 +55,18 @@ namespace BansheeEngine
 		virtual ~CoreRenderer() { }
 
 		/**
-		 * @brief	Called after the renderer has been activated.
+		 * @brief	Initializes the renderer. Must be called before using the renderer.
 		 *
 		 * @note	Internal method.
 		 */
-		virtual void _onActivated() { }
+		virtual void initialize() { }
 
 		/**
-		 * @brief	Called just before the renderer is deactivated.
+		 * @brief	Cleans up the renderer. Must be called before the renderer is deleted.
 		 *
 		 * @note	Internal method.
 		 */
-		virtual void _onDeactivated() { }
+		virtual void destroy() { }
 
 		/**
 		 * @brief	Name of the renderer. Used by materials to find 

+ 6 - 0
BansheeCore/Include/BsRendererManager.h

@@ -20,9 +20,15 @@ namespace BansheeEngine
 		/**
 		 * @brief	Attempts to find a renderer with the specified name and makes it active.
 		 * 			Exception is thrown if renderer with the specified name doesn't exist.
+		 * 			You must call ::initialize after setting the active renderer to properly activate it.
 		 */
 		void setActive(const String& name);
 
+		/**
+		 * @brief	Initializes the currently active renderer, making it ready to render.
+		 */
+		void initialize();
+
 		/**
 		 * @brief	Returns the currently active renderer. Null if no renderer is active.
 		 */

+ 2 - 1
BansheeCore/Source/BsCoreApplication.cpp

@@ -145,6 +145,7 @@ namespace BansheeEngine
 		loadPlugin(mStartUpDesc.renderer, &mRendererPlugin);
 
 		SceneManagerFactory::create();
+		RendererManager::instance().setActive(mStartUpDesc.renderer);
 		startUpRenderer();
 
 		ProfilerGPU::startUp();
@@ -268,7 +269,7 @@ namespace BansheeEngine
 
 	void CoreApplication::startUpRenderer()
 	{
-		RendererManager::instance().setActive(mStartUpDesc.renderer);
+		RendererManager::instance().initialize();
 	}
 
 	void CoreApplication::beginCoreProfiling()

+ 8 - 3
BansheeCore/Source/BsRendererManager.cpp

@@ -7,7 +7,7 @@ namespace BansheeEngine
 	RendererManager::~RendererManager()
 	{
 		if (mActiveRenderer != nullptr)
-			mActiveRenderer->_onDeactivated();
+			mActiveRenderer->destroy();
 	}
 
 	void RendererManager::setActive(const String& name)
@@ -20,10 +20,9 @@ namespace BansheeEngine
 				if(newRenderer != nullptr)
 				{
 					if (mActiveRenderer != nullptr)
-						mActiveRenderer->_onDeactivated();
+						mActiveRenderer->destroy();
 
 					mActiveRenderer = newRenderer;
-					mActiveRenderer->_onActivated();
 				}				
 			}
 		}
@@ -35,6 +34,12 @@ namespace BansheeEngine
 		}
 	}
 
+	void RendererManager::initialize()
+	{
+		if (mActiveRenderer != nullptr)
+			mActiveRenderer->initialize();
+	}
+
 	void RendererManager::_registerFactory(RendererFactoryPtr factory)
 	{
 		assert(factory != nullptr);

+ 1 - 1
BansheeEditorExec/BsEditorExec.cpp

@@ -72,7 +72,7 @@ int CALLBACK WinMain(
 
 	__try
 	{
-		EditorApplication::startUp(EditorRenderAPI::DX11);
+		EditorApplication::startUp(EditorRenderAPI::OpenGL);
 		EditorApplication::instance().runMainLoop();
 		EditorApplication::shutDown();
 	}

+ 0 - 1
BansheeEngine/Include/BsApplication.h

@@ -118,7 +118,6 @@ namespace BansheeEngine
 
 		DynLib* mMonoPlugin;
 		DynLib* mSBansheeEnginePlugin;
-		String mRenderer;
 	};
 
 	/**

+ 2 - 2
BansheeEngine/Source/BsApplication.cpp

@@ -39,7 +39,7 @@ namespace BansheeEngine
 
 	Application::Application(RENDER_WINDOW_DESC& primaryWindowDesc, RenderAPIPlugin renderAPI, RendererPlugin renderer)
 		:CoreApplication(createStartUpDesc(primaryWindowDesc, getLibNameForRenderAPI(renderAPI), getLibNameForRenderer(renderer))),
-		mMonoPlugin(nullptr), mSBansheeEnginePlugin(nullptr), mRenderer(getLibNameForRenderer(renderer))
+		mMonoPlugin(nullptr), mSBansheeEnginePlugin(nullptr)
 	{
 
 	}
@@ -73,7 +73,7 @@ namespace BansheeEngine
 		VirtualInput::startUp();
 		BuiltinResources::startUp();
 		RendererMaterialManager::startUp();
-		RendererManager::instance().setActive(mRenderer);
+		RendererManager::instance().initialize();
 		GUIManager::startUp();
 		GUIMaterialManager::startUp();
 		ShortcutManager::startUp();

+ 4 - 4
RenderBeast/Include/BsRenderBeast.h

@@ -128,14 +128,14 @@ namespace BansheeEngine
 		SPtr<CoreRendererOptions> getOptions() const override;
 
 		/**
-		 * @copydoc	Renderer::_onActivated
+		 * @copydoc	Renderer::initialize
 		 */
-		virtual void _onActivated() override;
+		virtual void initialize() override;
 
 		/**
-		 * @copydoc	Renderer::_onDeactivated
+		 * @copydoc	Renderer::destroy
 		 */
-		virtual void _onDeactivated() override;
+		virtual void destroy() override;
 
 	private:
 		/**

+ 4 - 4
RenderBeast/Source/BsRenderBeast.cpp

@@ -51,16 +51,16 @@ namespace BansheeEngine
 		return name;
 	}
 
-	void RenderBeast::_onActivated()
+	void RenderBeast::initialize()
 	{
-		CoreRenderer::_onActivated();
+		CoreRenderer::initialize();
 
 		CoreThread::instance().queueCommand(std::bind(&RenderBeast::initializeCore, this));
 	}
 
-	void RenderBeast::_onDeactivated()
+	void RenderBeast::destroy()
 	{
-		CoreRenderer::_onDeactivated();
+		CoreRenderer::destroy();
 
 		gCoreAccessor().queueCommand(std::bind(&RenderBeast::destroyCore, this));
 		gCoreAccessor().submitToCoreThread(true);

+ 4 - 2
TODOExperimentation.txt

@@ -13,11 +13,13 @@ Assign ViewOrigin, PreViewTranslation, TransViewProj
  - Perhaps do all these modifcations outside of shader (i.e. have the world matrix be pre-transformed)
  - Do this after I have basic rendering working, to avoid additional issues when I'm initially trying to get it to work
  
-Replace param buffer generation by using a dummy shader with manual generation
+Tomorrow:
+ - Extend PerCamera buffer with new values required by deferred shaders and generate those parameters in C++
 
 Next week:
  - Deferred base and light passes use different PerCamera buffers, unify them (both in shader and in code)
- - Need to generate a full screen quad for directional light pass
+ - Need to generate a full screen quad for directional light pass (RenderBeast::drawFullscreen(Camera, Material))
+   - Consider drawing a large triangle instead of a quad to improve rasterization (probably just add a TODO, and do it when I can test performance)
  - Finish up DefferedPointLightPass by generating cone geometry in shader
  - Generate C++ code for populating cbuffers for deferred shaders (2+ days)
  - Modify Light so it generated adequate number of vertices required for cone geometry, without actually creating the cone