Просмотр исходного кода

Added separate ClipSpace and ScreenSpace debug draw materials

Marko Pintera 12 лет назад
Родитель
Сommit
9b61d324d1

+ 4 - 2
BansheeEngine/Include/BsBuiltinMaterialManager.h

@@ -17,7 +17,8 @@ namespace BansheeEngine
 
 		virtual CM::HMaterial createSpriteTextMaterial() const = 0;
 		virtual CM::HMaterial createSpriteImageMaterial() const = 0;
-		virtual CM::HMaterial createDebugDraw2DMaterial() const = 0;
+		virtual CM::HMaterial createDebugDraw2DClipSpaceMaterial() const = 0;
+		virtual CM::HMaterial createDebugDraw2DScreenSpaceMaterial() const = 0;
 		virtual CM::HMaterial createDebugDraw3DMaterial() const = 0;
 	};
 
@@ -34,7 +35,8 @@ namespace BansheeEngine
 
 		CM::HMaterial createSpriteTextMaterial() const;
 		CM::HMaterial createSpriteImageMaterial() const;
-		CM::HMaterial createDebugDraw2DMaterial() const;
+		CM::HMaterial createDebugDraw2DClipSpaceMaterial() const;
+		CM::HMaterial createDebugDraw2DScreenSpaceMaterial() const;
 		CM::HMaterial createDebugDraw3DMaterial() const;
 
 		void addFactory(BuiltinMaterialFactory* factory);

+ 6 - 3
BansheeEngine/Include/BsD3D11BuiltinMaterialFactory.h

@@ -17,20 +17,23 @@ namespace BansheeEngine
 		
 		CM::HMaterial createSpriteTextMaterial() const;
 		CM::HMaterial createSpriteImageMaterial() const;
-		CM::HMaterial createDebugDraw2DMaterial() const;
+		CM::HMaterial createDebugDraw2DClipSpaceMaterial() const;
+		CM::HMaterial createDebugDraw2DScreenSpaceMaterial() const;
 		CM::HMaterial createDebugDraw3DMaterial() const;
 
 	protected:
 		CM::ShaderPtr mSpriteTextShader;
 		CM::ShaderPtr mSpriteImageShader;
-		CM::ShaderPtr mDebugDraw2DShader;
+		CM::ShaderPtr mDebugDraw2DClipSpaceShader;
+		CM::ShaderPtr mDebugDraw2DScreenSpaceShader;
 		CM::ShaderPtr mDebugDraw3DShader;
 
 		CM::HSamplerState mGUISamplerState;
 
 		void initSpriteTextShader();
 		void initSpriteImageShader();
-		void initDebugDraw2DShader();
+		void initDebugDraw2DClipSpaceShader();
+		void initDebugDraw2DScreenSpaceShader();
 		void initDebugDraw3DShader();
 	};
 }

+ 6 - 3
BansheeEngine/Include/BsD3D9BuiltinMaterialFactory.h

@@ -17,20 +17,23 @@ namespace BansheeEngine
 
 		CM::HMaterial createSpriteTextMaterial() const;
 		CM::HMaterial createSpriteImageMaterial() const;
-		CM::HMaterial createDebugDraw2DMaterial() const;
+		CM::HMaterial createDebugDraw2DClipSpaceMaterial() const;
+		CM::HMaterial createDebugDraw2DScreenSpaceMaterial() const;
 		CM::HMaterial createDebugDraw3DMaterial() const;
 
 	protected:
 		CM::ShaderPtr mSpriteTextShader;
 		CM::ShaderPtr mSpriteImageShader;
-		CM::ShaderPtr mDebugDraw2DShader;
+		CM::ShaderPtr mDebugDraw2DClipSpaceShader;
+		CM::ShaderPtr mDebugDraw2DScreenSpaceShader;
 		CM::ShaderPtr mDebugDraw3DShader;
 
 		CM::HSamplerState mGUISamplerState;
 
 		void initSpriteTextShader();
 		void initSpriteImageShader();
-		void initDebugDraw2DShader();
+		void initDebugDraw2DClipSpaceShader();
+		void initDebugDraw2DScreenSpaceShader();
 		void initDebugDraw3DShader();
 	};
 }

+ 9 - 2
BansheeEngine/Include/BsDrawHelper.h

@@ -7,10 +7,17 @@
 
 namespace BansheeEngine
 {
+	enum class CoordType
+	{
+		ScreenSpace,
+		ClipSpace
+	};
+
 	class BS_EXPORT DrawHelper : public CM::Module<DrawHelper>
 	{
 		enum class DebugDrawType
 		{
+			ClipSpace,
 			ScreenSpace,
 			WorldSpace
 		};
@@ -74,12 +81,12 @@ namespace BansheeEngine
 		 */
 		void line2D_AA(const CM::Vector2& a, const CM::Vector2& b, float width, const CM::Color& color, const CM::MeshDataPtr& meshData, CM::UINT32 vertexOffset, CM::UINT32 indexOffset);
 
-		void drawQuad2D(const HCamera& camera, const CM::Vector2& pos, const CM::Vector2& size, const CM::Color& color = CM::Color::White, float timeout = 0.0f);
+		void drawQuad2D(const HCamera& camera, const CM::Vector2& pos, const CM::Vector2& size, const CM::Color& color = CM::Color::White, CoordType coordType = CoordType::ScreenSpace, float timeout = 0.0f);
 
 		void render(const HCamera& camera, CM::RenderQueue& renderQueue);
 
 	private:
-		CM::HMaterial mMaterial2D;
+		CM::HMaterial mMaterial2DClipSpace;
 
 		CM::UnorderedMap<const CM::Viewport*, CM::Vector<DebugDrawCommand>::type>::type mCommandsPerViewport;
 

+ 6 - 3
BansheeEngine/Include/BsGLBuiltinMaterialFactory.h

@@ -17,20 +17,23 @@ namespace BansheeEngine
 
 		CM::HMaterial createSpriteTextMaterial() const;
 		CM::HMaterial createSpriteImageMaterial() const;
-		CM::HMaterial createDebugDraw2DMaterial() const;
+		CM::HMaterial createDebugDraw2DClipSpaceMaterial() const;
+		CM::HMaterial createDebugDraw2DScreenSpaceMaterial() const;
 		CM::HMaterial createDebugDraw3DMaterial() const;
 
 	protected:
 		CM::ShaderPtr mSpriteTextShader;
 		CM::ShaderPtr mSpriteImageShader;
-		CM::ShaderPtr mDebugDraw2DShader;
+		CM::ShaderPtr mDebugDraw2DClipSpaceShader;
+		CM::ShaderPtr mDebugDraw2DScreenSpaceShader;
 		CM::ShaderPtr mDebugDraw3DShader;
 
 		CM::HSamplerState mGUISamplerState;
 
 		void initSpriteTextShader();
 		void initSpriteImageShader();
-		void initDebugDraw2DShader();
+		void initDebugDraw2DClipSpaceShader();
+		void initDebugDraw2DScreenSpaceShader();
 		void initDebugDraw3DShader();
 	};
 }

+ 9 - 2
BansheeEngine/Source/BsBuiltinMaterialManager.cpp

@@ -33,11 +33,18 @@ namespace BansheeEngine
 		return mActiveFactory->createSpriteImageMaterial();
 	}
 
-	HMaterial BuiltinMaterialManager::createDebugDraw2DMaterial() const
+	HMaterial BuiltinMaterialManager::createDebugDraw2DClipSpaceMaterial() const
 	{
 		assert(mActiveFactory != nullptr);
 
-		return mActiveFactory->createDebugDraw2DMaterial();
+		return mActiveFactory->createDebugDraw2DClipSpaceMaterial();
+	}
+
+	HMaterial BuiltinMaterialManager::createDebugDraw2DScreenSpaceMaterial() const
+	{
+		assert(mActiveFactory != nullptr);
+
+		return mActiveFactory->createDebugDraw2DScreenSpaceMaterial();
 	}
 
 	HMaterial BuiltinMaterialManager::createDebugDraw3DMaterial() const

+ 88 - 7
BansheeEngine/Source/BsD3D11BuiltinMaterialFactory.cpp

@@ -16,7 +16,8 @@ namespace BansheeEngine
 	{
 		initSpriteTextShader();
 		initSpriteImageShader();
-		initDebugDraw2DShader();
+		initDebugDraw2DClipSpaceShader();
+		initDebugDraw2DScreenSpaceShader();
 		initDebugDraw3DShader();
 
 		SAMPLER_STATE_DESC ssDesc;
@@ -31,7 +32,8 @@ namespace BansheeEngine
 	{
 		mSpriteTextShader = nullptr;
 		mSpriteImageShader = nullptr;
-		mDebugDraw2DShader = nullptr;
+		mDebugDraw2DClipSpaceShader = nullptr;
+		mDebugDraw2DScreenSpaceShader = nullptr;
 		mDebugDraw3DShader = nullptr;
 	}
 
@@ -58,9 +60,14 @@ namespace BansheeEngine
 		return newMaterial;
 	}
 
-	HMaterial D3D11BuiltinMaterialFactory::createDebugDraw2DMaterial() const
+	HMaterial D3D11BuiltinMaterialFactory::createDebugDraw2DClipSpaceMaterial() const
 	{
-		return Material::create(mDebugDraw2DShader);
+		return Material::create(mDebugDraw2DClipSpaceShader);
+	}
+
+	HMaterial D3D11BuiltinMaterialFactory::createDebugDraw2DScreenSpaceMaterial() const
+	{
+		return Material::create(mDebugDraw2DScreenSpaceShader);
 	}
 
 	HMaterial D3D11BuiltinMaterialFactory::createDebugDraw3DMaterial() const
@@ -206,7 +213,7 @@ namespace BansheeEngine
 		newPass->setDepthStencilState(depthState);
 	}
 
-	void D3D11BuiltinMaterialFactory::initDebugDraw2DShader()
+	void D3D11BuiltinMaterialFactory::initDebugDraw2DClipSpaceShader()
 	{
 		String vsCode = "						\
 		void vs_main(							\
@@ -232,13 +239,78 @@ namespace BansheeEngine
 		vsProgram.synchronize();
 		psProgram.synchronize();
 
-		mDebugDraw2DShader = Shader::create("DebugDraw2DShader");
+		mDebugDraw2DClipSpaceShader = Shader::create("DebugDraw2DClipSpaceShader");
 
-		TechniquePtr newTechnique = mDebugDraw2DShader->addTechnique("D3D11RenderSystem", RendererManager::getCoreRendererName()); 
+		TechniquePtr newTechnique = mDebugDraw2DClipSpaceShader->addTechnique("D3D11RenderSystem", RendererManager::getCoreRendererName()); 
 		PassPtr newPass = newTechnique->addPass();
 		newPass->setVertexProgram(vsProgram);
 		newPass->setFragmentProgram(psProgram);
 
+		BLEND_STATE_DESC desc;
+		desc.renderTargetDesc[0].blendEnable = true;
+		desc.renderTargetDesc[0].srcBlend = BF_SOURCE_ALPHA;
+		desc.renderTargetDesc[0].dstBlend = BF_INV_SOURCE_ALPHA;
+		desc.renderTargetDesc[0].blendOp = BO_ADD;
+
+		HBlendState blendState = BlendState::create(desc);
+		newPass->setBlendState(blendState);
+
+		DEPTH_STENCIL_STATE_DESC depthStateDesc;
+		depthStateDesc.depthReadEnable = false;
+		depthStateDesc.depthWriteEnable = false;
+
+		HDepthStencilState depthState = DepthStencilState::create(depthStateDesc);
+		newPass->setDepthStencilState(depthState);
+	}
+
+	void D3D11BuiltinMaterialFactory::initDebugDraw2DScreenSpaceShader()
+	{
+		String vsCode = "									\
+						float invViewportWidth;				\
+						float invViewportHeight;			\
+															\
+						void vs_main(						\
+						in float2 inPos : POSITION,			\
+						in float4 color : COLOR0,			\
+						out float4 oPosition : SV_Position, \
+						out float4 oColor : COLOR0)			\
+						{														\
+						float tfrmdX = -1.0f + (inPos.x * invViewportWidth);	\
+						float tfrmdY = 1.0f - (inPos.y * invViewportHeight);	\
+																				\
+						oPosition = float4(tfrmdX, tfrmdY, 0, 1);				\
+						oColor = color;											\
+						}";
+
+		String psCode = "																		\
+						float4 ps_main(in float4 inPos : SV_Position, in float4 color : COLOR0) : SV_Target		\
+						{																						\
+						return color;																		\
+						}																						\
+						";	
+
+		HHighLevelGpuProgram vsProgram = HighLevelGpuProgram::create(vsCode, "vs_main", "hlsl", GPT_VERTEX_PROGRAM, GPP_VS_4_0);
+		HHighLevelGpuProgram psProgram = HighLevelGpuProgram::create(psCode, "ps_main", "hlsl", GPT_FRAGMENT_PROGRAM, GPP_PS_4_0);
+
+		vsProgram.synchronize();
+		psProgram.synchronize();
+
+		mDebugDraw2DScreenSpaceShader = Shader::create("DebugDraw2DScreenSpaceShader");
+
+		TechniquePtr newTechnique = mDebugDraw2DScreenSpaceShader->addTechnique("D3D11RenderSystem", RendererManager::getCoreRendererName()); 
+		PassPtr newPass = newTechnique->addPass();
+		newPass->setVertexProgram(vsProgram);
+		newPass->setFragmentProgram(psProgram);
+
+		BLEND_STATE_DESC desc;
+		desc.renderTargetDesc[0].blendEnable = true;
+		desc.renderTargetDesc[0].srcBlend = BF_SOURCE_ALPHA;
+		desc.renderTargetDesc[0].dstBlend = BF_INV_SOURCE_ALPHA;
+		desc.renderTargetDesc[0].blendOp = BO_ADD;
+
+		HBlendState blendState = BlendState::create(desc);
+		newPass->setBlendState(blendState);
+
 		DEPTH_STENCIL_STATE_DESC depthStateDesc;
 		depthStateDesc.depthReadEnable = false;
 		depthStateDesc.depthWriteEnable = false;
@@ -283,6 +355,15 @@ namespace BansheeEngine
 		newPass->setVertexProgram(vsProgram);
 		newPass->setFragmentProgram(psProgram);
 
+		BLEND_STATE_DESC desc;
+		desc.renderTargetDesc[0].blendEnable = true;
+		desc.renderTargetDesc[0].srcBlend = BF_SOURCE_ALPHA;
+		desc.renderTargetDesc[0].dstBlend = BF_INV_SOURCE_ALPHA;
+		desc.renderTargetDesc[0].blendOp = BO_ADD;
+
+		HBlendState blendState = BlendState::create(desc);
+		newPass->setBlendState(blendState);
+
 		DEPTH_STENCIL_STATE_DESC depthStateDesc;
 		depthStateDesc.depthReadEnable = false;
 		depthStateDesc.depthWriteEnable = false;

+ 88 - 7
BansheeEngine/Source/BsD3D9BuiltinMaterialFactory.cpp

@@ -16,7 +16,8 @@ namespace BansheeEngine
 	{
 		initSpriteTextShader();
 		initSpriteImageShader();
-		initDebugDraw2DShader();
+		initDebugDraw2DClipSpaceShader();
+		initDebugDraw2DScreenSpaceShader();
 		initDebugDraw3DShader();
 
 		SAMPLER_STATE_DESC ssDesc;
@@ -31,7 +32,8 @@ namespace BansheeEngine
 	{
 		mSpriteTextShader = nullptr;
 		mSpriteImageShader = nullptr;
-		mDebugDraw2DShader = nullptr;
+		mDebugDraw2DClipSpaceShader = nullptr;
+		mDebugDraw2DScreenSpaceShader = nullptr;
 		mDebugDraw3DShader = nullptr;
 	}
 
@@ -58,9 +60,14 @@ namespace BansheeEngine
 		return newMaterial;
 	}
 
-	HMaterial D3D9BuiltinMaterialFactory::createDebugDraw2DMaterial() const
+	HMaterial D3D9BuiltinMaterialFactory::createDebugDraw2DClipSpaceMaterial() const
 	{
-		return Material::create(mDebugDraw2DShader);
+		return Material::create(mDebugDraw2DClipSpaceShader);
+	}
+
+	HMaterial D3D9BuiltinMaterialFactory::createDebugDraw2DScreenSpaceMaterial() const
+	{
+		return Material::create(mDebugDraw2DScreenSpaceShader);
 	}
 
 	HMaterial D3D9BuiltinMaterialFactory::createDebugDraw3DMaterial() const
@@ -204,7 +211,7 @@ namespace BansheeEngine
 		newPass->setDepthStencilState(depthState);
 	}
 
-	void D3D9BuiltinMaterialFactory::initDebugDraw2DShader()
+	void D3D9BuiltinMaterialFactory::initDebugDraw2DClipSpaceShader()
 	{
 		String vsCode = "										\
 						void vs_main(							\
@@ -230,13 +237,78 @@ namespace BansheeEngine
 		vsProgram.synchronize();
 		psProgram.synchronize();
 
-		mDebugDraw2DShader = Shader::create("DebugDraw2DShader");
+		mDebugDraw2DClipSpaceShader = Shader::create("DebugDraw2DClipSpaceShader");
+
+		TechniquePtr newTechnique = mDebugDraw2DClipSpaceShader->addTechnique("D3D9RenderSystem", RendererManager::getCoreRendererName()); 
+		PassPtr newPass = newTechnique->addPass();
+		newPass->setVertexProgram(vsProgram);
+		newPass->setFragmentProgram(psProgram);
+
+		BLEND_STATE_DESC desc;
+		desc.renderTargetDesc[0].blendEnable = true;
+		desc.renderTargetDesc[0].srcBlend = BF_SOURCE_ALPHA;
+		desc.renderTargetDesc[0].dstBlend = BF_INV_SOURCE_ALPHA;
+		desc.renderTargetDesc[0].blendOp = BO_ADD;
+
+		HBlendState blendState = BlendState::create(desc);
+		newPass->setBlendState(blendState);
+
+		DEPTH_STENCIL_STATE_DESC depthStateDesc;
+		depthStateDesc.depthReadEnable = false;
+		depthStateDesc.depthWriteEnable = false;
+
+		HDepthStencilState depthState = DepthStencilState::create(depthStateDesc);
+		newPass->setDepthStencilState(depthState);
+	}
+
+	void D3D9BuiltinMaterialFactory::initDebugDraw2DScreenSpaceShader()
+	{
+		String vsCode = "										\
+						float invViewportWidth;					\
+						float invViewportHeight;				\
+																\
+						void vs_main(							\
+						in float2 inPos : POSITION,				\
+						in float4 inColor : COLOR0,				\
+						out float4 oPosition : POSITION,		\
+						out float4 oColor : COLOR0)				\
+						{										\
+						float tfrmdX = -1.0f + ((inPos.x - 0.5f) * invViewportWidth);			\
+						float tfrmdY = 1.0f - ((inPos.y - 0.5f) * invViewportHeight);			\
+																\
+						oPosition = float4(tfrmdX, tfrmdY, 0, 1);		\
+						oColor = inColor;						\
+						}										\
+						";
+
+		String psCode = "												\
+						float4 ps_main(float4 color : COLOR0) : COLOR0	\
+						{												\
+						return color;									\
+						}";
+
+		HHighLevelGpuProgram vsProgram = HighLevelGpuProgram::create(vsCode, "vs_main", "hlsl", GPT_VERTEX_PROGRAM, GPP_VS_2_0);
+		HHighLevelGpuProgram psProgram = HighLevelGpuProgram::create(psCode, "ps_main", "hlsl", GPT_FRAGMENT_PROGRAM, GPP_PS_2_0);
+
+		vsProgram.synchronize();
+		psProgram.synchronize();
+
+		mDebugDraw2DScreenSpaceShader = Shader::create("DebugDraw2DScreenSpaceShader");
 
-		TechniquePtr newTechnique = mDebugDraw2DShader->addTechnique("D3D9RenderSystem", RendererManager::getCoreRendererName()); 
+		TechniquePtr newTechnique = mDebugDraw2DScreenSpaceShader->addTechnique("D3D9RenderSystem", RendererManager::getCoreRendererName()); 
 		PassPtr newPass = newTechnique->addPass();
 		newPass->setVertexProgram(vsProgram);
 		newPass->setFragmentProgram(psProgram);
 
+		BLEND_STATE_DESC desc;
+		desc.renderTargetDesc[0].blendEnable = true;
+		desc.renderTargetDesc[0].srcBlend = BF_SOURCE_ALPHA;
+		desc.renderTargetDesc[0].dstBlend = BF_INV_SOURCE_ALPHA;
+		desc.renderTargetDesc[0].blendOp = BO_ADD;
+
+		HBlendState blendState = BlendState::create(desc);
+		newPass->setBlendState(blendState);
+
 		DEPTH_STENCIL_STATE_DESC depthStateDesc;
 		depthStateDesc.depthReadEnable = false;
 		depthStateDesc.depthWriteEnable = false;
@@ -281,6 +353,15 @@ namespace BansheeEngine
 		newPass->setVertexProgram(vsProgram);
 		newPass->setFragmentProgram(psProgram);
 
+		BLEND_STATE_DESC desc;
+		desc.renderTargetDesc[0].blendEnable = true;
+		desc.renderTargetDesc[0].srcBlend = BF_SOURCE_ALPHA;
+		desc.renderTargetDesc[0].dstBlend = BF_INV_SOURCE_ALPHA;
+		desc.renderTargetDesc[0].blendOp = BO_ADD;
+
+		HBlendState blendState = BlendState::create(desc);
+		newPass->setBlendState(blendState);
+
 		DEPTH_STENCIL_STATE_DESC depthStateDesc;
 		depthStateDesc.depthReadEnable = false;
 		depthStateDesc.depthWriteEnable = false;

+ 22 - 4
BansheeEngine/Source/BsDrawHelper.cpp

@@ -15,7 +15,7 @@ namespace BansheeEngine
 {
 	DrawHelper::DrawHelper()
 	{
-		mMaterial2D = BuiltinMaterialManager::instance().createDebugDraw2DMaterial();
+		mMaterial2DClipSpace = BuiltinMaterialManager::instance().createDebugDraw2DClipSpaceMaterial();
 	}
 
 	void DrawHelper::quad2D(const Vector2& pos, const Vector2& size, UINT8* outVertices, 
@@ -222,7 +222,7 @@ namespace BansheeEngine
 		}
 	}
 
-	void DrawHelper::drawQuad2D(const HCamera& camera, const Vector2& pos, const Vector2& size, const Color& color, float timeout)
+	void DrawHelper::drawQuad2D(const HCamera& camera, const Vector2& pos, const Vector2& size, const Color& color, CoordType coordType, float timeout)
 	{
 		const Viewport* viewport = camera->getViewport().get();
 
@@ -267,8 +267,16 @@ namespace BansheeEngine
 		gMainSyncedCA().submitToCoreThread(true);
 
 		dbgCmd.mesh = mesh;
-		dbgCmd.material = mMaterial2D;
 		dbgCmd.worldCenter = Vector3::ZERO;
+
+		if(coordType == CoordType::ClipSpace)
+		{
+			dbgCmd.material = mMaterial2DClipSpace;
+		}
+		else
+		{
+			dbgCmd.material = BuiltinMaterialManager::instance().createDebugDraw2DScreenSpaceMaterial();
+		}
 	}
 
 	void DrawHelper::render(const HCamera& camera, CM::RenderQueue& renderQueue)
@@ -280,6 +288,9 @@ namespace BansheeEngine
 		Matrix4 viewMatrixCstm = camera->getViewMatrix();
 		Matrix4 viewProjMatrix = projMatrixCstm * viewMatrixCstm;
 
+		float invViewportWidth = 1.0f / (viewport->getWidth() * 0.5f);
+		float invViewportHeight = 1.0f / (viewport->getHeight() * 0.5f);
+
 		for(auto& cmd : commands)
 		{
 			if(cmd.mesh == nullptr || !cmd.mesh.isLoaded())
@@ -288,10 +299,17 @@ namespace BansheeEngine
 			if(cmd.material == nullptr || !cmd.material.isLoaded())
 				continue;
 
-			if(cmd.type == DebugDrawType::ScreenSpace)
+			if(cmd.type == DebugDrawType::ClipSpace)
 			{
 				renderQueue.add(cmd.material, cmd.mesh->getSubMeshData(), cmd.worldCenter);
 			}
+			else if(cmd.type == DebugDrawType::ScreenSpace)
+			{
+				cmd.material->setFloat("invViewportWidth", invViewportWidth);
+				cmd.material->setFloat("invViewportHeight", invViewportHeight);
+
+				renderQueue.add(cmd.material, cmd.mesh->getSubMeshData(), cmd.worldCenter);
+			}
 			else if(cmd.type == DebugDrawType::WorldSpace)
 			{
 				cmd.material->setMat4("matViewProj", viewProjMatrix);

+ 92 - 7
BansheeEngine/Source/BsGLBuiltinMaterialFactory.cpp

@@ -16,7 +16,8 @@ namespace BansheeEngine
 	{
 		initSpriteTextShader();
 		initSpriteImageShader();
-		initDebugDraw2DShader();
+		initDebugDraw2DClipSpaceShader();
+		initDebugDraw2DScreenSpaceShader();
 		initDebugDraw3DShader();
 
 		SAMPLER_STATE_DESC ssDesc;
@@ -31,7 +32,8 @@ namespace BansheeEngine
 	{
 		mSpriteTextShader = nullptr;
 		mSpriteImageShader = nullptr;
-		mDebugDraw2DShader = nullptr;
+		mDebugDraw2DClipSpaceShader = nullptr;
+		mDebugDraw2DScreenSpaceShader = nullptr;
 		mDebugDraw3DShader = nullptr;
 	}
 
@@ -58,9 +60,14 @@ namespace BansheeEngine
 		return newMaterial;
 	}
 
-	HMaterial GLBuiltinMaterialFactory::createDebugDraw2DMaterial() const
+	HMaterial GLBuiltinMaterialFactory::createDebugDraw2DClipSpaceMaterial() const
 	{
-		return Material::create(mDebugDraw2DShader);
+		return Material::create(mDebugDraw2DClipSpaceShader);
+	}
+
+	HMaterial GLBuiltinMaterialFactory::createDebugDraw2DScreenSpaceMaterial() const
+	{
+		return Material::create(mDebugDraw2DScreenSpaceShader);
 	}
 
 	HMaterial GLBuiltinMaterialFactory::createDebugDraw3DMaterial() const
@@ -210,7 +217,7 @@ namespace BansheeEngine
 		newPass->setDepthStencilState(depthState);
 	}
 
-	void GLBuiltinMaterialFactory::initDebugDraw2DShader()
+	void GLBuiltinMaterialFactory::initDebugDraw2DClipSpaceShader()
 	{
 		String vsCode = "#version 400\n								\
 																	\
@@ -240,13 +247,82 @@ namespace BansheeEngine
 		vsProgram.synchronize();
 		psProgram.synchronize();
 
-		mDebugDraw2DShader = Shader::create("DebugDraw2DShader");
+		mDebugDraw2DClipSpaceShader = Shader::create("DebugDraw2DClipSpaceShader");
 
-		TechniquePtr newTechnique = mDebugDraw2DShader->addTechnique("GLRenderSystem", RendererManager::getCoreRendererName()); 
+		TechniquePtr newTechnique = mDebugDraw2DClipSpaceShader->addTechnique("GLRenderSystem", RendererManager::getCoreRendererName()); 
 		PassPtr newPass = newTechnique->addPass();
 		newPass->setVertexProgram(vsProgram);
 		newPass->setFragmentProgram(psProgram);
 
+		BLEND_STATE_DESC desc;
+		desc.renderTargetDesc[0].blendEnable = true;
+		desc.renderTargetDesc[0].srcBlend = BF_SOURCE_ALPHA;
+		desc.renderTargetDesc[0].dstBlend = BF_INV_SOURCE_ALPHA;
+		desc.renderTargetDesc[0].blendOp = BO_ADD;
+
+		HBlendState blendState = BlendState::create(desc);
+		newPass->setBlendState(blendState);
+
+		DEPTH_STENCIL_STATE_DESC depthStateDesc;
+		depthStateDesc.depthReadEnable = false;
+		depthStateDesc.depthWriteEnable = false;
+
+		HDepthStencilState depthState = DepthStencilState::create(depthStateDesc);
+		newPass->setDepthStencilState(depthState);
+	}
+
+	void GLBuiltinMaterialFactory::initDebugDraw2DScreenSpaceShader()
+	{
+		String vsCode = "#version 400\n								\
+																	\
+						uniform float invViewportWidth;				\
+						uniform float invViewportHeight;			\
+																	\
+						in vec2 cm_position;						\
+						in vec4 cm_color0;							\
+						out vec4 color0;							\
+																	\
+						void main()									\
+						{											\
+						float tfrmdX = -1.0f + (cm_position.x * invViewportWidth);				\
+						float tfrmdY = 1.0f - (cm_position.y * invViewportHeight);				\
+																	\
+						gl_Position = vec4(tfrmdX, tfrmdY, 0, 1);	\
+						color0 = cm_color0;							\
+						}";
+
+		String psCode = "#version 400\n						\
+															\
+						in vec4 color0;						\
+						out vec4 fragColor;					\
+															\
+						void main()							\
+						{									\
+						fragColor = color0;					\
+						}";
+
+		HHighLevelGpuProgram vsProgram = HighLevelGpuProgram::create(vsCode, "vs_main", "glsl", GPT_VERTEX_PROGRAM, GPP_VS_4_0);
+		HHighLevelGpuProgram psProgram = HighLevelGpuProgram::create(psCode, "ps_main", "glsl", GPT_FRAGMENT_PROGRAM, GPP_PS_4_0);
+
+		vsProgram.synchronize();
+		psProgram.synchronize();
+
+		mDebugDraw2DScreenSpaceShader = Shader::create("DebugDraw2DScreenSpaceShader");
+
+		TechniquePtr newTechnique = mDebugDraw2DScreenSpaceShader->addTechnique("GLRenderSystem", RendererManager::getCoreRendererName()); 
+		PassPtr newPass = newTechnique->addPass();
+		newPass->setVertexProgram(vsProgram);
+		newPass->setFragmentProgram(psProgram);
+
+		BLEND_STATE_DESC desc;
+		desc.renderTargetDesc[0].blendEnable = true;
+		desc.renderTargetDesc[0].srcBlend = BF_SOURCE_ALPHA;
+		desc.renderTargetDesc[0].dstBlend = BF_INV_SOURCE_ALPHA;
+		desc.renderTargetDesc[0].blendOp = BO_ADD;
+
+		HBlendState blendState = BlendState::create(desc);
+		newPass->setBlendState(blendState);
+
 		DEPTH_STENCIL_STATE_DESC depthStateDesc;
 		depthStateDesc.depthReadEnable = false;
 		depthStateDesc.depthWriteEnable = false;
@@ -296,6 +372,15 @@ namespace BansheeEngine
 		newPass->setVertexProgram(vsProgram);
 		newPass->setFragmentProgram(psProgram);
 
+		BLEND_STATE_DESC desc;
+		desc.renderTargetDesc[0].blendEnable = true;
+		desc.renderTargetDesc[0].srcBlend = BF_SOURCE_ALPHA;
+		desc.renderTargetDesc[0].dstBlend = BF_INV_SOURCE_ALPHA;
+		desc.renderTargetDesc[0].blendOp = BO_ADD;
+
+		HBlendState blendState = BlendState::create(desc);
+		newPass->setBlendState(blendState);
+
 		DEPTH_STENCIL_STATE_DESC depthStateDesc;
 		depthStateDesc.depthReadEnable = false;
 		depthStateDesc.depthWriteEnable = false;

+ 1 - 1
CamelotClient/Source/BsMainEditorWindow.cpp

@@ -38,7 +38,7 @@ namespace BansheeEditor
 
 		textSprite->init(sceneCamera, "Testing in a new row, does this work?", nullptr);
 
-		DrawHelper::instance().drawQuad2D(sceneCamera, Vector2(-1.0f, 0.0f), Vector2(100, 50), Color::White, 50.0f);
+		DrawHelper::instance().drawQuad2D(sceneCamera, Vector2(-1.0f, 0.0f), Vector2(100, 50), Color::White, CoordType::ClipSpace, 50.0f);
 	}
 
 	MainEditorWindow::~MainEditorWindow()

+ 5 - 3
DrawHelper.txt

@@ -2,8 +2,7 @@ Add class DrawHelper:
  - Line2D_AA - Creates an emulated AA line using triangles. See Recast/imguiRenderGL::drawPolygon for implementation. Line vertices and colors
       are appended in the specified buffer. No actual drawing is done.
  - Line2D_Pixel - Creates a simple line using LINE primitive topology. Line vertices and colors are appended in the specified buffer.
- - ScreenQuad - accepts normalized viewport coordinates
- - Quad2D - accepts pixel coordinates
+ - Quad2D 
  - QuadBorder2D_AA
  - QuadBorder2D_Pixel
  - LineList2D_AA
@@ -16,5 +15,8 @@ Add class DrawHelper:
 
 --------------------------
 
- Port the 2D shader so it accepts viewport size. Because we want things to be defined in pixels (except for fullscreen quad)
+Add extra parameter to each of the 2D draw methods: ScreenSpace or ClipSpace
+(They may use 3D versions for world space)
+ - I need two separate 2D materials
+
  Only one material per viewport needs to exist, no need for separate material for each element