diff options
author | Mitchell Stokes <mogurijin@gmail.com> | 2012-07-14 08:43:32 +0400 |
---|---|---|
committer | Mitchell Stokes <mogurijin@gmail.com> | 2012-07-14 08:43:32 +0400 |
commit | ac8c56c6fc9e1a816160144b5cebe2e99ffa67fc (patch) | |
tree | 230f0ffa161264ab51f961aa76ec0e33a92f807d | |
parent | aeaa95a525343d95258e9388076833530a6aa4ab (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.cpp | 26 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_BlenderMaterial.h | 2 |
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; |