[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [54876] branches/ge_harmony/source: Custom material shaders now also have access to the material struct.

Daniel Stokes kupomail at gmail.com
Tue Feb 26 04:35:17 CET 2013


Revision: 54876
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=54876
Author:   kupoman
Date:     2013-02-26 03:35:15 +0000 (Tue, 26 Feb 2013)
Log Message:
-----------
Custom material shaders now also have access to the material struct.

Modified Paths:
--------------
    branches/ge_harmony/source/blender/gpu/GPU_extensions.h
    branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c
    branches/ge_harmony/source/blender/gpu/intern/gpu_material.c
    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_extensions.h
===================================================================
--- branches/ge_harmony/source/blender/gpu/GPU_extensions.h	2013-02-26 03:20:10 UTC (rev 54875)
+++ branches/ge_harmony/source/blender/gpu/GPU_extensions.h	2013-02-26 03:35:15 UTC (rev 54876)
@@ -167,6 +167,7 @@
 void GPU_shader_bind(GPUShader *shader);
 void GPU_shader_unbind(GPUShader *shader);
 
+void GPU_shader_material_bind(GPUShader *shader, struct Material *mat, double time);
 int GPU_shader_get_uniform(GPUShader *shader, const char *name);
 void GPU_shader_uniform_vector(GPUShader *shader, int location, int length,
 	int arraysize, float *value);

Modified: branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c
===================================================================
--- branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c	2013-02-26 03:20:10 UTC (rev 54875)
+++ branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c	2013-02-26 03:35:15 UTC (rev 54876)
@@ -33,6 +33,7 @@
 #include "GL/glew.h"
 
 #include "DNA_image_types.h"
+#include "DNA_texture_types.h"
 #include "DNA_material_types.h"
 
 #include "MEM_guardedalloc.h"
@@ -1361,6 +1362,93 @@
 	MEM_freeN(shader);
 }
 
+void GPU_shader_material_bind(GPUShader *shader, Material *mat, double time)
+{
+	MTex *mtex;
+	Tex *tex;
+	GPUTexture *gpu_tex;
+	char name[50];
+	float texco[3];
+	int bind;
+
+	bind = GPU_shader_get_uniform(shader, "bgl_Material.id");
+	{
+		int id = (mat->diff_shader << 4) + mat->spec_shader;
+		float fid = id/65335.0;
+		GPU_shader_uniform_vector(shader, bind, 1, 1, &fid);
+	}
+
+	{
+		float dparam1=0.0, dparam2=0.0;
+		if (mat->diff_shader == MA_DIFF_TOON || mat->diff_shader == MA_DIFF_FRESNEL)
+		{
+			dparam1 = mat->param[0] / 10.0;
+			dparam2 = mat->param[1] / 10.0;
+		}
+		else if (mat->diff_shader == MA_DIFF_ORENNAYAR)
+			dparam1 = mat->roughness / 10.0;
+		else if (mat->diff_shader == MA_DIFF_MINNAERT)
+			dparam1 = mat->darkness / 10.0;
+
+		bind = GPU_shader_get_uniform(shader, "bgl_Material.diffuseParam1");
+		GPU_shader_uniform_vector(shader, bind, 1, 1, &dparam1);
+
+		bind = GPU_shader_get_uniform(shader, "bgl_Material.diffuseParam2");
+		GPU_shader_uniform_vector(shader, bind, 1, 1, &dparam2);
+	}
+
+	bind = GPU_shader_get_uniform(shader, "bgl_Material.hardness");
+	{
+		float hardness;
+		if (mat->spec_shader != MA_SPEC_TOON)
+			hardness = log((float)mat->har) / log(511.0f);
+		else
+			hardness = mat->param[2] / 10.0;
+		GPU_shader_uniform_vector(shader, bind, 1, 1, &hardness);
+	}
+
+	bind = GPU_shader_get_uniform(shader, "bgl_Material.specularity");
+	{
+		float spec_param = 0.0;
+		if (mat->spec_shader == MA_SPEC_BLINN)
+			spec_param = mat->refrac / 10.0;
+		else if (mat->spec_shader == MA_SPEC_WARDISO)
+			spec_param = mat->rms / 10.0;
+		else if (mat->spec_shader == MA_SPEC_TOON)
+			spec_param = mat->param[3] / 10.0;
+		GPU_shader_uniform_vector(shader, bind, 1, 1, &spec_param);
+	}
+
+	{
+		int slot = 0, i;
+		for (i = 0; i < MAX_MTEX; i++) {
+			int f = 0, t = 1;
+
+			mtex = mat->mtex[i];
+			if (!mtex) continue;
+
+			tex = mtex->tex;
+			if (!tex) continue;
+
+			if (mtex->mapto & MAP_NORM && tex->type == TEX_IMAGE) {
+				sprintf(name, "bgl_Textures[%d].data", slot);
+				bind = GPU_shader_get_uniform(shader, name);
+				gpu_tex = GPU_texture_from_blender(tex->ima, &tex->iuser, TRUE, time, 1);
+				GPU_texture_bind(gpu_tex, slot);
+				GPU_shader_uniform_texture(shader, bind, gpu_tex);
+			}
+			else
+				continue;
+
+			sprintf(name, "bgl_Textures[%d].enabled", slot);
+			bind = GPU_shader_get_uniform(shader, name);
+			GPU_shader_uniform_ivector(shader, bind, 1, 1, &t);
+
+			slot++;
+		}
+	}
+}
+
 int GPU_shader_get_uniform(GPUShader *shader, const char *name)
 {
 	int bind;

Modified: branches/ge_harmony/source/blender/gpu/intern/gpu_material.c
===================================================================
--- branches/ge_harmony/source/blender/gpu/intern/gpu_material.c	2013-02-26 03:20:10 UTC (rev 54875)
+++ branches/ge_harmony/source/blender/gpu/intern/gpu_material.c	2013-02-26 03:35:15 UTC (rev 54876)
@@ -342,6 +342,9 @@
 			cs = cs->next;
 		}
 
+		/* bind material struct */
+		GPU_shader_material_bind(shader, material->ma, 1.0);
+
 		/* handle rna uniforms */
 		RNA_pointer_create((ID*)material->ma, &RNA_Material, material->ma, &ma_ptr);
 

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 03:20:10 UTC (rev 54875)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2013-02-26 03:35:15 UTC (rev 54876)
@@ -440,7 +440,10 @@
 
 bool RAS_OpenGLRasterizer::SetMaterial(const RAS_IPolyMaterial& mat)
 {
-	this->ActivateShader(mat);
+	if (this->GetDrawingMode() == KX_OVERRIDE) {
+		GPU_shader_material_bind(m_prepass_shader, mat.GetBlenderMaterial(), this->GetTime());
+	}
+
 	return mat.Activate(this, m_materialCachingInfo);
 }
 
@@ -1641,95 +1644,6 @@
 	return 1;
 }
 
-void RAS_OpenGLRasterizer::ActivateShader(const RAS_IPolyMaterial& polymat)
-{
-	Material *mat = polymat.GetBlenderMaterial();
-	MTex *mtex;
-	Tex *tex;
-	GPUTexture *gpu_tex;
-	GPUShader *shader;
-	char name[50];
-	float texco[3];
-	int bind;
-
-	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;
-	GPU_shader_uniform_vector(shader, bind, 1, 1, &fid);
-
-	float dparam1=0.0, dparam2=0.0;
-	if (mat->diff_shader == MA_DIFF_TOON || mat->diff_shader == MA_DIFF_FRESNEL)
-	{
-		dparam1 = mat->param[0] / 10.0;
-		dparam2 = mat->param[1] / 10.0;
-	}
-	else if (mat->diff_shader == MA_DIFF_ORENNAYAR)
-		dparam1 = mat->roughness / 10.0;
-	else if (mat->diff_shader == MA_DIFF_MINNAERT)
-		dparam1 = mat->darkness / 10.0;
-
-	bind = GPU_shader_get_uniform(shader, "bgl_Material.diffuseParam1");
-	GPU_shader_uniform_vector(shader, bind, 1, 1, &dparam1);
-
-	bind = GPU_shader_get_uniform(shader, "bgl_Material.diffuseParam2");
-	GPU_shader_uniform_vector(shader, bind, 1, 1, &dparam2);
-
-	bind = GPU_shader_get_uniform(shader, "bgl_Material.hardness");
-	float hardness;
-	if (mat->spec_shader != MA_SPEC_TOON)
-		hardness = logf(mat->har) / log(511.0f);
-	else
-		hardness = mat->param[2] / 10.0;
-	GPU_shader_uniform_vector(shader, bind, 1, 1, &hardness);
-
-	bind = GPU_shader_get_uniform(shader, "bgl_Material.specularity");
-	float spec_param = 0.0;
-	if (mat->spec_shader == MA_SPEC_BLINN)
-		spec_param = mat->refrac / 10.0;
-	else if (mat->spec_shader == MA_SPEC_WARDISO)
-		spec_param = mat->rms / 10.0;
-	else if (mat->spec_shader == MA_SPEC_TOON)
-		spec_param = mat->param[3] / 10.0;
-	GPU_shader_uniform_vector(shader, bind, 1, 1, &spec_param);
-
-	int slot = 0;
-	for (int i = 0; i < MAX_MTEX; i++) {
-		int f = 0, t = 1;
-
-		mtex = mat->mtex[i];
-		if (!mtex) continue;
-
-		tex = mtex->tex;
-		if (!tex) continue;
-
-		if (mtex->mapto & MAP_NORM && tex->type == TEX_IMAGE) {
-			sprintf(name, "bgl_Textures[%d].data", slot);
-			bind = GPU_shader_get_uniform(shader, name);
-			gpu_tex = GPU_texture_from_blender(tex->ima, &tex->iuser, TRUE, this->GetTime(), 1);
-			GPU_texture_bind(gpu_tex, slot);
-			GPU_shader_uniform_texture(shader, bind, gpu_tex);
-		}
-		else
-			continue;
-
-		sprintf(name, "bgl_Textures[%d].enabled", slot);
-		bind = GPU_shader_get_uniform(shader, name);
-		GPU_shader_uniform_ivector(shader, bind, 1, 1, &t);
-
-		slot++;
-	}
-}
-
 void RAS_OpenGLRasterizer::EndPrePass()
 {
 	if (!m_prepass_shader) return;

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 03:20:10 UTC (rev 54875)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h	2013-02-26 03:35:15 UTC (rev 54876)
@@ -159,8 +159,6 @@
 	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();




More information about the Bf-blender-cvs mailing list