[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [54107] branches/ge_harmony/source/ gameengine: Moving some OpenGL code out of KX_BlenderMaterial and in to the rasterizer , fixing a crash with custom prepass shaders in the process.

Daniel Stokes kupomail at gmail.com
Sat Jan 26 10:00:28 CET 2013


Revision: 54107
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=54107
Author:   kupoman
Date:     2013-01-26 09:00:20 +0000 (Sat, 26 Jan 2013)
Log Message:
-----------
Moving some OpenGL code out of KX_BlenderMaterial and in to the rasterizer, fixing a crash with custom prepass shaders in the process.

Modified Paths:
--------------
    branches/ge_harmony/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_IRasterizer.h
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp
    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/gameengine/Ketsji/KX_BlenderMaterial.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Ketsji/KX_BlenderMaterial.cpp	2013-01-26 06:57:21 UTC (rev 54106)
+++ branches/ge_harmony/source/gameengine/Ketsji/KX_BlenderMaterial.cpp	2013-01-26 09:00:20 UTC (rev 54107)
@@ -620,81 +620,7 @@
 {
 	if (rasty->GetDrawingMode() == RAS_IRasterizer::KX_OVERRIDE)
 	{
-		Material *mat = mMaterial->material;
-		MTex *mtex;
-		Tex *tex;
-		GPUTexture *gpu_tex;
-		char name[50];
-		float texco[3];
-		int bind;
-		GPUShader *shader = GPU_shader_get_builtin_shader(GPU_SHADER_PREPASS);
-
-		bind = GPU_shader_get_uniform(shader, "mat_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, "diff_param1");
-		GPU_shader_uniform_vector(shader, bind, 1, 1, &dparam1);
-
-		bind = GPU_shader_get_uniform(shader, "diff_param2");
-		GPU_shader_uniform_vector(shader, bind, 1, 1, &dparam2);
-
-		bind = GPU_shader_get_uniform(shader, "hardness");
-		float hardness;
-		if (mat->spec_shader != MA_SPEC_TOON)
-			hardness = log(mMaterial->hard) / log(511.0);
-		else
-			hardness = mat->param[2] / 10.0;
-		GPU_shader_uniform_vector(shader, bind, 1, 1, &hardness);
-
-		bind = GPU_shader_get_uniform(shader, "spec_param");
-		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, "textures[%d].data", slot);
-				bind = GPU_shader_get_uniform(shader, name);
-				gpu_tex = GPU_texture_from_blender(tex->ima, &tex->iuser, TRUE, rasty->GetTime(), 1);
-				GPU_texture_bind(gpu_tex, slot);
-				GPU_shader_uniform_texture(shader, bind, gpu_tex);
-			}
-			else
-				continue;
-
-			sprintf(name, "textures[%d].enabled", slot);
-			bind = GPU_shader_get_uniform(shader, name);
-			GPU_shader_uniform_ivector(shader, bind, 1, 1, &t);
-
-			slot++;
-		}
+		rasty->ActivatePrePassMat(mMaterial);
 	}
 	if (mShader && GLEW_ARB_shader_objects) {
 		mShader->Update(ms, rasty);

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_IRasterizer.h
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_IRasterizer.h	2013-01-26 06:57:21 UTC (rev 54106)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_IRasterizer.h	2013-01-26 09:00:20 UTC (rev 54107)
@@ -438,6 +438,7 @@
 
 	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_ListRasterizer.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp	2013-01-26 06:57:21 UTC (rev 54106)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp	2013-01-26 09:00:20 UTC (rev 54107)
@@ -12,6 +12,9 @@
 
 #include "GL/glew.h"
 
+#include "BL_Material.h"
+#include "DNA_texture_types.h"
+
 #include "RAS_MaterialBucket.h"
 #include "RAS_TexVert.h"
 #include "RAS_CameraData.h"

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2013-01-26 06:57:21 UTC (rev 54106)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2013-01-26 09:00:20 UTC (rev 54107)
@@ -53,9 +53,12 @@
 #include "GPU_material.h"
 #include "GPU_extensions.h"
 
+#include "BL_Material.h"
+
 #include "DNA_image_types.h"
 #include "DNA_meshdata_types.h"
 #include "DNA_material_types.h"
+#include "DNA_texture_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_shader_types.h"
 
@@ -1589,6 +1592,85 @@
 	return 1;
 }
 
+void RAS_OpenGLRasterizer::ActivatePrePassMat(struct BL_Material *bmat)
+{
+	Material *mat = bmat->material;
+	MTex *mtex;
+	Tex *tex;
+	GPUTexture *gpu_tex;
+	char name[50];
+	float texco[3];
+	int bind;
+	GPUShader *shader = m_prepass_shader;
+
+	bind = GPU_shader_get_uniform(shader, "mat_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, "diff_param1");
+	GPU_shader_uniform_vector(shader, bind, 1, 1, &dparam1);
+
+	bind = GPU_shader_get_uniform(shader, "diff_param2");
+	GPU_shader_uniform_vector(shader, bind, 1, 1, &dparam2);
+
+	bind = GPU_shader_get_uniform(shader, "hardness");
+	float hardness;
+	if (mat->spec_shader != MA_SPEC_TOON)
+		hardness = log(bmat->hard) / log(511.0);
+	else
+		hardness = mat->param[2] / 10.0;
+	GPU_shader_uniform_vector(shader, bind, 1, 1, &hardness);
+
+	bind = GPU_shader_get_uniform(shader, "spec_param");
+	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, "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, "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-01-26 06:57:21 UTC (rev 54106)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h	2013-01-26 09:00:20 UTC (rev 54107)
@@ -372,6 +372,7 @@
 	/* 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