[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [54874] branches/ge_harmony/source: Binding the material struct from the prepass to custom material shaders.

Daniel Stokes kupomail at gmail.com
Tue Feb 26 03:36:59 CET 2013


Revision: 54874
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=54874
Author:   kupoman
Date:     2013-02-26 02:36:58 +0000 (Tue, 26 Feb 2013)
Log Message:
-----------
Binding the material struct from the prepass to custom material shaders. This is a little hacky since the rasterizer doesn't know as much as it should about materials.

Modified Paths:
--------------
    branches/ge_harmony/source/blender/gpu/GPU_material.h
    branches/ge_harmony/source/blender/gpu/intern/gpu_material.c
    branches/ge_harmony/source/gameengine/Ketsji/BL_BlenderShader.cpp
    branches/ge_harmony/source/gameengine/Ketsji/BL_BlenderShader.h
    branches/ge_harmony/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
    branches/ge_harmony/source/gameengine/Ketsji/KX_BlenderMaterial.h
    branches/ge_harmony/source/gameengine/Ketsji/KX_PolygonMaterial.h
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_IRasterizer.h
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h

Modified: branches/ge_harmony/source/blender/gpu/GPU_material.h
===================================================================
--- branches/ge_harmony/source/blender/gpu/GPU_material.h	2013-02-26 02:33:24 UTC (rev 54873)
+++ branches/ge_harmony/source/blender/gpu/GPU_material.h	2013-02-26 02:36:58 UTC (rev 54874)
@@ -138,6 +138,9 @@
 int GPU_material_bound(GPUMaterial *material);
 void GPU_material_get_sources(GPUMaterial *material, char *vertex, char *geometry, char *fragment);
 
+// XXX Remove after material refactor
+struct GPUShader *GPU_material_get_shader(GPUMaterial *material);
+
 void GPU_material_vertex_attributes(GPUMaterial *material,
 	struct GPUVertexAttribs *attrib);
 

Modified: branches/ge_harmony/source/blender/gpu/intern/gpu_material.c
===================================================================
--- branches/ge_harmony/source/blender/gpu/intern/gpu_material.c	2013-02-26 02:33:24 UTC (rev 54873)
+++ branches/ge_harmony/source/blender/gpu/intern/gpu_material.c	2013-02-26 02:36:58 UTC (rev 54874)
@@ -493,6 +493,11 @@
 	GPU_pass_get_sources(material->pass, vertex, geometry, fragment);
 }
 
+struct GPUShader *GPU_material_get_shader(GPUMaterial *material)
+{
+	return GPU_pass_shader(material->pass);
+}
+
 void GPU_material_vertex_attributes(GPUMaterial *material, GPUVertexAttribs *attribs)
 {
 	*attribs = material->attribs;

Modified: branches/ge_harmony/source/gameengine/Ketsji/BL_BlenderShader.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Ketsji/BL_BlenderShader.cpp	2013-02-26 02:33:24 UTC (rev 54873)
+++ branches/ge_harmony/source/gameengine/Ketsji/BL_BlenderShader.cpp	2013-02-26 02:36:58 UTC (rev 54874)
@@ -311,6 +311,11 @@
 	return mAlphaBlend;
 }
 
+struct GPUShader* BL_BlenderShader::GetShader()
+{
+	return GPU_material_get_shader(mGPUMat);
+}
+
 bool BL_BlenderShader::Equals(BL_BlenderShader *blshader)
 {
 	/* to avoid unneeded state switches */

Modified: branches/ge_harmony/source/gameengine/Ketsji/BL_BlenderShader.h
===================================================================
--- branches/ge_harmony/source/gameengine/Ketsji/BL_BlenderShader.h	2013-02-26 02:33:24 UTC (rev 54873)
+++ branches/ge_harmony/source/gameengine/Ketsji/BL_BlenderShader.h	2013-02-26 02:36:58 UTC (rev 54874)
@@ -90,6 +90,9 @@
 	void ReloadMaterial();
 	int GetAlphaBlend();
 
+	// XXX This should be removed after refactoring materials
+	struct GPUShader *GetShader();
+
 	void SetScene(KX_Scene *scene)
 	{
 		mScene = scene;

Modified: branches/ge_harmony/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Ketsji/KX_BlenderMaterial.cpp	2013-02-26 02:33:24 UTC (rev 54873)
+++ branches/ge_harmony/source/gameengine/Ketsji/KX_BlenderMaterial.cpp	2013-02-26 02:36:58 UTC (rev 54874)
@@ -144,6 +144,10 @@
 	return mMaterial->material;
 }
 
+struct GPUShader *KX_BlenderMaterial::GetShader() const
+{
+	return mBlenderShader->GetShader();
+}
 void KX_BlenderMaterial::SetBlenderShader(BL_BlenderShader *shader)
 {
 	// First get rid of the old one if we have one
@@ -618,10 +622,6 @@
 
 void KX_BlenderMaterial::ActivateMeshSlot(const RAS_MeshSlot & ms, RAS_IRasterizer* rasty) const
 {
-	if (rasty->GetDrawingMode() == RAS_IRasterizer::KX_OVERRIDE)
-	{
-		rasty->ActivatePrePassMat(mMaterial);
-	}
 	if (mShader && GLEW_ARB_shader_objects) {
 		mShader->Update(ms, rasty);
 	}

Modified: branches/ge_harmony/source/gameengine/Ketsji/KX_BlenderMaterial.h
===================================================================
--- branches/ge_harmony/source/gameengine/Ketsji/KX_BlenderMaterial.h	2013-02-26 02:33:24 UTC (rev 54873)
+++ branches/ge_harmony/source/gameengine/Ketsji/KX_BlenderMaterial.h	2013-02-26 02:36:58 UTC (rev 54874)
@@ -78,6 +78,7 @@
 	)const;
 
 	Material* GetBlenderMaterial() const;
+	struct GPUShader* GetShader() const;
 	BL_BlenderShader* GetBlenderShader() const;
 	void SetBlenderShader(BL_BlenderShader* shader);
 	MTFace* GetMTFace(void) const;

Modified: branches/ge_harmony/source/gameengine/Ketsji/KX_PolygonMaterial.h
===================================================================
--- branches/ge_harmony/source/gameengine/Ketsji/KX_PolygonMaterial.h	2013-02-26 02:33:24 UTC (rev 54873)
+++ branches/ge_harmony/source/gameengine/Ketsji/KX_PolygonMaterial.h	2013-02-26 02:36:58 UTC (rev 54874)
@@ -112,6 +112,8 @@
 		return m_material;
 	}
 
+	struct GPUShader* GetShader() const {return NULL;}
+
 	Image *GetBlenderImage() const;
 
 	/**

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h	2013-02-26 02:33:24 UTC (rev 54873)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h	2013-02-26 02:36:58 UTC (rev 54874)
@@ -166,6 +166,7 @@
 	int					GetMaterialIndex() const;
 
 	virtual Material*   GetBlenderMaterial() const;
+	virtual struct GPUShader*	GetShader() const = 0;
 	virtual Image*      GetBlenderImage() const;
 	virtual Scene*		GetBlenderScene() const;
 	virtual void		ReleaseMaterial();

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_IRasterizer.h
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_IRasterizer.h	2013-02-26 02:33:24 UTC (rev 54873)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_IRasterizer.h	2013-02-26 02:36:58 UTC (rev 54874)
@@ -438,7 +438,6 @@
 
 	virtual void	SetPrePassShader(struct Shader** shader, int count)=0;
 	virtual int		BeginPrePass()=0;
-	virtual void	ActivatePrePassMat(struct BL_Material* mat)=0;
 	virtual void	EndPrePass()=0;
 
 	virtual void	SetPrepassCount(int count)=0;

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2013-02-26 02:33:24 UTC (rev 54873)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2013-02-26 02:36:58 UTC (rev 54874)
@@ -440,6 +440,7 @@
 
 bool RAS_OpenGLRasterizer::SetMaterial(const RAS_IPolyMaterial& mat)
 {
+	this->ActivateShader(mat);
 	return mat.Activate(this, m_materialCachingInfo);
 }
 
@@ -1640,17 +1641,27 @@
 	return 1;
 }
 
-void RAS_OpenGLRasterizer::ActivatePrePassMat(struct BL_Material *bmat)
+void RAS_OpenGLRasterizer::ActivateShader(const RAS_IPolyMaterial& polymat)
 {
-	Material *mat = bmat->material;
+	Material *mat = polymat.GetBlenderMaterial();
 	MTex *mtex;
 	Tex *tex;
 	GPUTexture *gpu_tex;
+	GPUShader *shader;
 	char name[50];
 	float texco[3];
 	int bind;
-	GPUShader *shader = m_prepass_shader;
 
+	if (this->GetDrawingMode() == KX_OVERRIDE) {
+		shader = m_prepass_shader;
+	}
+	else {
+		shader = polymat.GetShader();
+	}
+
+	if (!shader)
+		return;
+
 	bind = GPU_shader_get_uniform(shader, "bgl_Material.id");
 	int id = (mat->diff_shader << 4) + mat->spec_shader;
 	float fid = id/65335.0;
@@ -1676,7 +1687,7 @@
 	bind = GPU_shader_get_uniform(shader, "bgl_Material.hardness");
 	float hardness;
 	if (mat->spec_shader != MA_SPEC_TOON)
-		hardness = log(bmat->hard) / log(511.0);
+		hardness = logf(mat->har) / log(511.0f);
 	else
 		hardness = mat->param[2] / 10.0;
 	GPU_shader_uniform_vector(shader, bind, 1, 1, &hardness);

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h	2013-02-26 02:33:24 UTC (rev 54873)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h	2013-02-26 02:36:58 UTC (rev 54874)
@@ -159,6 +159,8 @@
 	int				m_storage_type;
 	RAS_IStorage*	m_storage;
 	RAS_IStorage*	m_failsafe_storage; //So derived mesh can use immediate mode
+	
+	void	ActivateShader(const class RAS_IPolyMaterial& mat);
 
 public:
 	double GetTime();
@@ -373,7 +375,6 @@
 	/* Pre Pass */
 	virtual void	SetPrePassShader(struct Shader** shader, int count);
 	virtual int		BeginPrePass();
-	virtual void	ActivatePrePassMat(struct BL_Material* mat);
 	virtual void	EndPrePass();
 
 	int				GetFBOWidth() { return m_width; }




More information about the Bf-blender-cvs mailing list