[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53752] trunk/blender/source: BGE: Adding preliminary alpha shadow support for Simple shadow maps.

Mitchell Stokes mogurijin at gmail.com
Sat Jan 12 21:01:58 CET 2013


Revision: 53752
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53752
Author:   moguri
Date:     2013-01-12 20:01:58 +0000 (Sat, 12 Jan 2013)
Log Message:
-----------
BGE: Adding preliminary alpha shadow support for Simple shadow maps. They do not work in the viewport nor do they work for Variance shadow maps.

Modified Paths:
--------------
    trunk/blender/source/blender/gpu/GPU_material.h
    trunk/blender/source/blender/gpu/intern/gpu_material.c
    trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Light.cpp
    trunk/blender/source/gameengine/Rasterizer/RAS_IRasterizer.h
    trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
    trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h

Modified: trunk/blender/source/blender/gpu/GPU_material.h
===================================================================
--- trunk/blender/source/blender/gpu/GPU_material.h	2013-01-12 20:01:09 UTC (rev 53751)
+++ trunk/blender/source/blender/gpu/GPU_material.h	2013-01-12 20:01:58 UTC (rev 53752)
@@ -234,6 +234,7 @@
 void GPU_lamp_update_buffer_mats(GPULamp *lamp);
 void GPU_lamp_shadow_buffer_bind(GPULamp *lamp, float viewmat[4][4], int *winsize, float winmat[4][4]);
 void GPU_lamp_shadow_buffer_unbind(GPULamp *lamp);
+int GPU_lamp_shadow_buffer_type(GPULamp *lamp);
 
 void GPU_lamp_update(GPULamp *lamp, int lay, int hide, float obmat[4][4]);
 void GPU_lamp_update_colors(GPULamp *lamp, float r, float g, float b, float energy);

Modified: trunk/blender/source/blender/gpu/intern/gpu_material.c
===================================================================
--- trunk/blender/source/blender/gpu/intern/gpu_material.c	2013-01-12 20:01:09 UTC (rev 53751)
+++ trunk/blender/source/blender/gpu/intern/gpu_material.c	2013-01-12 20:01:58 UTC (rev 53752)
@@ -1882,6 +1882,11 @@
 	glEnable(GL_SCISSOR_TEST);
 }
 
+int GPU_lamp_shadow_buffer_type(GPULamp *lamp)
+{
+	return lamp->la->shadowmap_type;
+}
+
 int GPU_lamp_shadow_layer(GPULamp *lamp)
 {
 	if (lamp->fb && lamp->tex && (lamp->mode & (LA_LAYER|LA_LAYER_SHADOW)))

Modified: trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.cpp	2013-01-12 20:01:09 UTC (rev 53751)
+++ trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.cpp	2013-01-12 20:01:58 UTC (rev 53752)
@@ -400,6 +400,8 @@
 	
 		if (rasty->GetDrawingMode() == RAS_IRasterizer::KX_TEXTURED)
 			tmp->setShaderData(true, rasty);
+		else if (rasty->GetDrawingMode() == RAS_IRasterizer::KX_SHADOW && IsAlpha() && !rasty->GetUsingOverrideShader())
+			tmp->setShaderData(true, rasty);
 		else
 			tmp->setShaderData(false, rasty);
 
@@ -445,6 +447,8 @@
 	
 		if (rasty->GetDrawingMode() == RAS_IRasterizer::KX_TEXTURED)
 			tmp->setBlenderShaderData(true, rasty);
+		else if (rasty->GetDrawingMode() == RAS_IRasterizer::KX_SHADOW && IsAlpha() && !rasty->GetUsingOverrideShader())
+			tmp->setBlenderShaderData(true, rasty);
 		else
 			tmp->setBlenderShaderData(false, rasty);
 
@@ -494,6 +498,8 @@
 
 		if (rasty->GetDrawingMode() == RAS_IRasterizer::KX_TEXTURED)
 			tmp->setTexData( true,rasty  );
+		else if (rasty->GetDrawingMode() == RAS_IRasterizer::KX_SHADOW && IsAlpha() && !rasty->GetUsingOverrideShader())
+			tmp->setTexData(true, rasty);
 		else
 			tmp->setTexData( false,rasty);
 
@@ -628,7 +634,8 @@
 
 void KX_BlenderMaterial::ActivateTexGen(RAS_IRasterizer *ras) const
 {
-	if (ras->GetDrawingMode() == RAS_IRasterizer::KX_TEXTURED) {
+	if (ras->GetDrawingMode() == RAS_IRasterizer::KX_TEXTURED || 
+		(ras->GetDrawingMode() == RAS_IRasterizer::KX_SHADOW && IsAlpha() && !ras->GetUsingOverrideShader())) {
 		ras->SetAttribNum(0);
 		if (mShader && GLEW_ARB_shader_objects) {
 			if (mShader->GetAttribute() == BL_Shader::SHD_TANGENT) {

Modified: trunk/blender/source/gameengine/Ketsji/KX_Light.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_Light.cpp	2013-01-12 20:01:09 UTC (rev 53751)
+++ trunk/blender/source/gameengine/Ketsji/KX_Light.cpp	2013-01-12 20:01:58 UTC (rev 53752)
@@ -246,6 +246,9 @@
 	lamp = GetGPULamp();
 	GPU_lamp_shadow_buffer_bind(lamp, viewmat, &winsize, winmat);
 
+	if (GPU_lamp_shadow_buffer_type(lamp) == LA_SHADMAP_VARIANCE)
+		ras->SetUsingOverrideShader(true);
+
 	/* GPU_lamp_shadow_buffer_bind() changes the viewport, so update the canvas */
 	canvas->UpdateViewPort(0, 0, winsize, winsize);
 
@@ -276,6 +279,9 @@
 {
 	GPULamp *lamp = GetGPULamp();
 	GPU_lamp_shadow_buffer_unbind(lamp);
+
+	if (GPU_lamp_shadow_buffer_type(lamp) == LA_SHADMAP_VARIANCE)
+		ras->SetUsingOverrideShader(false);
 }
 
 struct Image *KX_LightObject::GetTextureImage(short texslot)

Modified: trunk/blender/source/gameengine/Rasterizer/RAS_IRasterizer.h
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_IRasterizer.h	2013-01-12 20:01:09 UTC (rev 53751)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_IRasterizer.h	2013-01-12 20:01:58 UTC (rev 53752)
@@ -417,6 +417,8 @@
 	virtual void	SetAnisotropicFiltering(short level)=0;
 	virtual short	GetAnisotropicFiltering()=0;
 
+	virtual void	SetUsingOverrideShader(bool val)=0;
+	virtual bool	GetUsingOverrideShader()=0;
 
 #ifdef WITH_CXX_GUARDEDALLOC
 	MEM_CXX_CLASS_ALLOC_FUNCS("GE:RAS_IRasterizer")

Modified: trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2013-01-12 20:01:09 UTC (rev 53751)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2013-01-12 20:01:58 UTC (rev 53752)
@@ -93,6 +93,7 @@
 	m_noOfScanlines(32),
 	m_motionblur(0),
 	m_motionblurvalue(-1.0),
+	m_usingoverrideshader(false),
 	m_texco_num(0),
 	m_attrib_num(0),
 	//m_last_alphablend(GPU_BLEND_SOLID),
@@ -1057,3 +1058,14 @@
 {
 	return (short)GPU_get_anisotropic();
 }
+
+void RAS_OpenGLRasterizer::SetUsingOverrideShader(bool val)
+{
+	m_usingoverrideshader = val;
+}
+
+bool RAS_OpenGLRasterizer::GetUsingOverrideShader()
+{
+	return m_usingoverrideshader;
+}
+

Modified: trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h	2013-01-12 20:01:09 UTC (rev 53751)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h	2013-01-12 20:01:58 UTC (rev 53752)
@@ -103,6 +103,8 @@
 	int	m_motionblur;
 	float	m_motionblurvalue;
 
+	bool m_usingoverrideshader;
+
 protected:
 	int				m_drawingmode;
 	TexCoGen		m_texco[RAS_MAX_TEXCO];
@@ -320,6 +322,8 @@
 	virtual void	SetAnisotropicFiltering(short level);
 	virtual short	GetAnisotropicFiltering();
 
+	virtual void	SetUsingOverrideShader(bool val);
+	virtual bool	GetUsingOverrideShader();
 
 #ifdef WITH_CXX_GUARDEDALLOC
 	MEM_CXX_CLASS_ALLOC_FUNCS("GE:RAS_OpenGLRasterizer")




More information about the Bf-blender-cvs mailing list