[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