Explorar o código

Added separate ClipSpace and ScreenSpace debug draw materials

Marko Pintera %!s(int64=12) %!d(string=hai) anos
pai
achega
9b61d324d1

+ 4 - 2
BansheeEngine/Include/BsBuiltinMaterialManager.h

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

+ 6 - 3
BansheeEngine/Include/BsD3D11BuiltinMaterialFactory.h

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

+ 6 - 3
BansheeEngine/Include/BsD3D9BuiltinMaterialFactory.h

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

+ 9 - 2
BansheeEngine/Include/BsDrawHelper.h

@@ -7,10 +7,17 @@
 
 
 namespace BansheeEngine
 namespace BansheeEngine
 {
 {
+	enum class CoordType
+	{
+		ScreenSpace,
+		ClipSpace
+	};
+
 	class BS_EXPORT DrawHelper : public CM::Module<DrawHelper>
 	class BS_EXPORT DrawHelper : public CM::Module<DrawHelper>
 	{
 	{
 		enum class DebugDrawType
 		enum class DebugDrawType
 		{
 		{
+			ClipSpace,
 			ScreenSpace,
 			ScreenSpace,
 			WorldSpace
 			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 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);
 		void render(const HCamera& camera, CM::RenderQueue& renderQueue);
 
 
 	private:
 	private:
-		CM::HMaterial mMaterial2D;
+		CM::HMaterial mMaterial2DClipSpace;
 
 
 		CM::UnorderedMap<const CM::Viewport*, CM::Vector<DebugDrawCommand>::type>::type mCommandsPerViewport;
 		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 createSpriteTextMaterial() const;
 		CM::HMaterial createSpriteImageMaterial() const;
 		CM::HMaterial createSpriteImageMaterial() const;
-		CM::HMaterial createDebugDraw2DMaterial() const;
+		CM::HMaterial createDebugDraw2DClipSpaceMaterial() const;
+		CM::HMaterial createDebugDraw2DScreenSpaceMaterial() const;
 		CM::HMaterial createDebugDraw3DMaterial() const;
 		CM::HMaterial createDebugDraw3DMaterial() const;
 
 
 	protected:
 	protected:
 		CM::ShaderPtr mSpriteTextShader;
 		CM::ShaderPtr mSpriteTextShader;
 		CM::ShaderPtr mSpriteImageShader;
 		CM::ShaderPtr mSpriteImageShader;
-		CM::ShaderPtr mDebugDraw2DShader;
+		CM::ShaderPtr mDebugDraw2DClipSpaceShader;
+		CM::ShaderPtr mDebugDraw2DScreenSpaceShader;
 		CM::ShaderPtr mDebugDraw3DShader;
 		CM::ShaderPtr mDebugDraw3DShader;
 
 
 		CM::HSamplerState mGUISamplerState;
 		CM::HSamplerState mGUISamplerState;
 
 
 		void initSpriteTextShader();
 		void initSpriteTextShader();
 		void initSpriteImageShader();
 		void initSpriteImageShader();
-		void initDebugDraw2DShader();
+		void initDebugDraw2DClipSpaceShader();
+		void initDebugDraw2DScreenSpaceShader();
 		void initDebugDraw3DShader();
 		void initDebugDraw3DShader();
 	};
 	};
 }
 }

+ 9 - 2
BansheeEngine/Source/BsBuiltinMaterialManager.cpp

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

+ 88 - 7
BansheeEngine/Source/BsD3D11BuiltinMaterialFactory.cpp

@@ -16,7 +16,8 @@ namespace BansheeEngine
 	{
 	{
 		initSpriteTextShader();
 		initSpriteTextShader();
 		initSpriteImageShader();
 		initSpriteImageShader();
-		initDebugDraw2DShader();
+		initDebugDraw2DClipSpaceShader();
+		initDebugDraw2DScreenSpaceShader();
 		initDebugDraw3DShader();
 		initDebugDraw3DShader();
 
 
 		SAMPLER_STATE_DESC ssDesc;
 		SAMPLER_STATE_DESC ssDesc;
@@ -31,7 +32,8 @@ namespace BansheeEngine
 	{
 	{
 		mSpriteTextShader = nullptr;
 		mSpriteTextShader = nullptr;
 		mSpriteImageShader = nullptr;
 		mSpriteImageShader = nullptr;
-		mDebugDraw2DShader = nullptr;
+		mDebugDraw2DClipSpaceShader = nullptr;
+		mDebugDraw2DScreenSpaceShader = nullptr;
 		mDebugDraw3DShader = nullptr;
 		mDebugDraw3DShader = nullptr;
 	}
 	}
 
 
@@ -58,9 +60,14 @@ namespace BansheeEngine
 		return newMaterial;
 		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
 	HMaterial D3D11BuiltinMaterialFactory::createDebugDraw3DMaterial() const
@@ -206,7 +213,7 @@ namespace BansheeEngine
 		newPass->setDepthStencilState(depthState);
 		newPass->setDepthStencilState(depthState);
 	}
 	}
 
 
-	void D3D11BuiltinMaterialFactory::initDebugDraw2DShader()
+	void D3D11BuiltinMaterialFactory::initDebugDraw2DClipSpaceShader()
 	{
 	{
 		String vsCode = "						\
 		String vsCode = "						\
 		void vs_main(							\
 		void vs_main(							\
@@ -232,13 +239,78 @@ namespace BansheeEngine
 		vsProgram.synchronize();
 		vsProgram.synchronize();
 		psProgram.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();
 		PassPtr newPass = newTechnique->addPass();
 		newPass->setVertexProgram(vsProgram);
 		newPass->setVertexProgram(vsProgram);
 		newPass->setFragmentProgram(psProgram);
 		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;
 		DEPTH_STENCIL_STATE_DESC depthStateDesc;
 		depthStateDesc.depthReadEnable = false;
 		depthStateDesc.depthReadEnable = false;
 		depthStateDesc.depthWriteEnable = false;
 		depthStateDesc.depthWriteEnable = false;
@@ -283,6 +355,15 @@ namespace BansheeEngine
 		newPass->setVertexProgram(vsProgram);
 		newPass->setVertexProgram(vsProgram);
 		newPass->setFragmentProgram(psProgram);
 		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;
 		DEPTH_STENCIL_STATE_DESC depthStateDesc;
 		depthStateDesc.depthReadEnable = false;
 		depthStateDesc.depthReadEnable = false;
 		depthStateDesc.depthWriteEnable = false;
 		depthStateDesc.depthWriteEnable = false;

+ 88 - 7
BansheeEngine/Source/BsD3D9BuiltinMaterialFactory.cpp

@@ -16,7 +16,8 @@ namespace BansheeEngine
 	{
 	{
 		initSpriteTextShader();
 		initSpriteTextShader();
 		initSpriteImageShader();
 		initSpriteImageShader();
-		initDebugDraw2DShader();
+		initDebugDraw2DClipSpaceShader();
+		initDebugDraw2DScreenSpaceShader();
 		initDebugDraw3DShader();
 		initDebugDraw3DShader();
 
 
 		SAMPLER_STATE_DESC ssDesc;
 		SAMPLER_STATE_DESC ssDesc;
@@ -31,7 +32,8 @@ namespace BansheeEngine
 	{
 	{
 		mSpriteTextShader = nullptr;
 		mSpriteTextShader = nullptr;
 		mSpriteImageShader = nullptr;
 		mSpriteImageShader = nullptr;
-		mDebugDraw2DShader = nullptr;
+		mDebugDraw2DClipSpaceShader = nullptr;
+		mDebugDraw2DScreenSpaceShader = nullptr;
 		mDebugDraw3DShader = nullptr;
 		mDebugDraw3DShader = nullptr;
 	}
 	}
 
 
@@ -58,9 +60,14 @@ namespace BansheeEngine
 		return newMaterial;
 		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
 	HMaterial D3D9BuiltinMaterialFactory::createDebugDraw3DMaterial() const
@@ -204,7 +211,7 @@ namespace BansheeEngine
 		newPass->setDepthStencilState(depthState);
 		newPass->setDepthStencilState(depthState);
 	}
 	}
 
 
-	void D3D9BuiltinMaterialFactory::initDebugDraw2DShader()
+	void D3D9BuiltinMaterialFactory::initDebugDraw2DClipSpaceShader()
 	{
 	{
 		String vsCode = "										\
 		String vsCode = "										\
 						void vs_main(							\
 						void vs_main(							\
@@ -230,13 +237,78 @@ namespace BansheeEngine
 		vsProgram.synchronize();
 		vsProgram.synchronize();
 		psProgram.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();
 		PassPtr newPass = newTechnique->addPass();
 		newPass->setVertexProgram(vsProgram);
 		newPass->setVertexProgram(vsProgram);
 		newPass->setFragmentProgram(psProgram);
 		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;
 		DEPTH_STENCIL_STATE_DESC depthStateDesc;
 		depthStateDesc.depthReadEnable = false;
 		depthStateDesc.depthReadEnable = false;
 		depthStateDesc.depthWriteEnable = false;
 		depthStateDesc.depthWriteEnable = false;
@@ -281,6 +353,15 @@ namespace BansheeEngine
 		newPass->setVertexProgram(vsProgram);
 		newPass->setVertexProgram(vsProgram);
 		newPass->setFragmentProgram(psProgram);
 		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;
 		DEPTH_STENCIL_STATE_DESC depthStateDesc;
 		depthStateDesc.depthReadEnable = false;
 		depthStateDesc.depthReadEnable = false;
 		depthStateDesc.depthWriteEnable = false;
 		depthStateDesc.depthWriteEnable = false;

+ 22 - 4
BansheeEngine/Source/BsDrawHelper.cpp

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

+ 92 - 7
BansheeEngine/Source/BsGLBuiltinMaterialFactory.cpp

@@ -16,7 +16,8 @@ namespace BansheeEngine
 	{
 	{
 		initSpriteTextShader();
 		initSpriteTextShader();
 		initSpriteImageShader();
 		initSpriteImageShader();
-		initDebugDraw2DShader();
+		initDebugDraw2DClipSpaceShader();
+		initDebugDraw2DScreenSpaceShader();
 		initDebugDraw3DShader();
 		initDebugDraw3DShader();
 
 
 		SAMPLER_STATE_DESC ssDesc;
 		SAMPLER_STATE_DESC ssDesc;
@@ -31,7 +32,8 @@ namespace BansheeEngine
 	{
 	{
 		mSpriteTextShader = nullptr;
 		mSpriteTextShader = nullptr;
 		mSpriteImageShader = nullptr;
 		mSpriteImageShader = nullptr;
-		mDebugDraw2DShader = nullptr;
+		mDebugDraw2DClipSpaceShader = nullptr;
+		mDebugDraw2DScreenSpaceShader = nullptr;
 		mDebugDraw3DShader = nullptr;
 		mDebugDraw3DShader = nullptr;
 	}
 	}
 
 
@@ -58,9 +60,14 @@ namespace BansheeEngine
 		return newMaterial;
 		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
 	HMaterial GLBuiltinMaterialFactory::createDebugDraw3DMaterial() const
@@ -210,7 +217,7 @@ namespace BansheeEngine
 		newPass->setDepthStencilState(depthState);
 		newPass->setDepthStencilState(depthState);
 	}
 	}
 
 
-	void GLBuiltinMaterialFactory::initDebugDraw2DShader()
+	void GLBuiltinMaterialFactory::initDebugDraw2DClipSpaceShader()
 	{
 	{
 		String vsCode = "#version 400\n								\
 		String vsCode = "#version 400\n								\
 																	\
 																	\
@@ -240,13 +247,82 @@ namespace BansheeEngine
 		vsProgram.synchronize();
 		vsProgram.synchronize();
 		psProgram.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();
 		PassPtr newPass = newTechnique->addPass();
 		newPass->setVertexProgram(vsProgram);
 		newPass->setVertexProgram(vsProgram);
 		newPass->setFragmentProgram(psProgram);
 		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;
 		DEPTH_STENCIL_STATE_DESC depthStateDesc;
 		depthStateDesc.depthReadEnable = false;
 		depthStateDesc.depthReadEnable = false;
 		depthStateDesc.depthWriteEnable = false;
 		depthStateDesc.depthWriteEnable = false;
@@ -296,6 +372,15 @@ namespace BansheeEngine
 		newPass->setVertexProgram(vsProgram);
 		newPass->setVertexProgram(vsProgram);
 		newPass->setFragmentProgram(psProgram);
 		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;
 		DEPTH_STENCIL_STATE_DESC depthStateDesc;
 		depthStateDesc.depthReadEnable = false;
 		depthStateDesc.depthReadEnable = false;
 		depthStateDesc.depthWriteEnable = 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);
 		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()
 	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
  - 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.
       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.
  - 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_AA
  - QuadBorder2D_Pixel
  - QuadBorder2D_Pixel
  - LineList2D_AA
  - 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
  Only one material per viewport needs to exist, no need for separate material for each element