Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMitchell Stokes <mogurijin@gmail.com>2012-07-14 08:43:32 +0400
committerMitchell Stokes <mogurijin@gmail.com>2012-07-14 08:43:32 +0400
commitac8c56c6fc9e1a816160144b5cebe2e99ffa67fc (patch)
tree230f0ffa161264ab51f961aa76ec0e33a92f807d
parentaeaa95a525343d95258e9388076833530a6aa4ab (diff)
BGE: Better fix for the textures not working with custom shaders regression. Now custom shaders work, and textures aren't uploaded twice for GLSL materials (my earlier fix had some bad logic).
-rw-r--r--source/gameengine/Ketsji/KX_BlenderMaterial.cpp26
-rw-r--r--source/gameengine/Ketsji/KX_BlenderMaterial.h2
2 files changed, 19 insertions, 9 deletions
diff --git a/source/gameengine/Ketsji/KX_BlenderMaterial.cpp b/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
index 79e6c35e6a2..014c68e8bee 100644
--- a/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
+++ b/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
@@ -154,15 +154,8 @@ void KX_BlenderMaterial::ReleaseMaterial()
mBlenderShader->ReloadMaterial();
}
-void KX_BlenderMaterial::OnConstruction(int layer)
+void KX_BlenderMaterial::InitTextures()
{
- if (mConstructed)
- // when material are reused between objects
- return;
-
- if (mMaterial->glslmat)
- SetBlenderGLSLShader(layer);
-
// for each unique material...
int i;
for (i=0; i<mMaterial->num_enabled; i++) {
@@ -177,7 +170,7 @@ void KX_BlenderMaterial::OnConstruction(int layer)
}
// If we're using glsl materials, the textures are handled by bf_gpu, so don't load them twice!
// However, if we're using a custom shader, then we still need to load the textures ourselves.
- else if (!mMaterial->glslmat || mBlenderShader) {
+ else if (!mMaterial->glslmat || mShader) {
if ( mMaterial->img[i] ) {
if ( ! mTextures[i].InitFromImage(i, mMaterial->img[i], (mMaterial->flag[i] &MIPMAP)!=0 ))
spit("unable to initialize image("<<i<<") in "<<
@@ -185,6 +178,18 @@ void KX_BlenderMaterial::OnConstruction(int layer)
}
}
}
+}
+
+void KX_BlenderMaterial::OnConstruction(int layer)
+{
+ if (mConstructed)
+ // when material are reused between objects
+ return;
+
+ if (mMaterial->glslmat)
+ SetBlenderGLSLShader(layer);
+
+ InitTextures();
mBlendFunc[0] =0;
mBlendFunc[1] =0;
@@ -892,6 +897,9 @@ KX_PYMETHODDEF_DOC( KX_BlenderMaterial, getShader , "getShader()")
if (!mShader && !mModified) {
mShader = new BL_Shader();
mModified = true;
+
+ // Using a custom shader, make sure to initialize textures
+ InitTextures();
}
if (mShader && !mShader->GetError()) {
diff --git a/source/gameengine/Ketsji/KX_BlenderMaterial.h b/source/gameengine/Ketsji/KX_BlenderMaterial.h
index 3a6dda06320..8fc86ef9cf2 100644
--- a/source/gameengine/Ketsji/KX_BlenderMaterial.h
+++ b/source/gameengine/Ketsji/KX_BlenderMaterial.h
@@ -138,6 +138,8 @@ private:
bool mModified;
bool mConstructed; // if false, don't clean on exit
+ void InitTextures();
+
void SetBlenderGLSLShader(int layer);
void ActivatGLMaterials( RAS_IRasterizer* rasty )const;