[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49012] branches/soc-2012-swiss_cheese/ source/gameengine: Fix for [#18146] " gap in texture stack with multi UV in GE with GLSL" reported by Hubert Niecko (szczuro).
Mitchell Stokes
mogurijin at gmail.com
Wed Jul 18 05:56:45 CEST 2012
Revision: 49012
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49012
Author: moguri
Date: 2012-07-18 03:56:42 +0000 (Wed, 18 Jul 2012)
Log Message:
-----------
Fix for [#18146] "gap in texture stack with multi UV in GE with GLSL" reported by Hubert Niecko (szczuro). Places that would check texture slots now check all the slots, not just the first few. This makes the code more flexible at a slight (and probably negligible) performance hit.
I'm committing this to Swiss instead of trunk because the fix works off of the multi-UV code present in Swiss.
Modified Paths:
--------------
branches/soc-2012-swiss_cheese/source/gameengine/Converter/BL_BlenderDataConversion.cpp
branches/soc-2012-swiss_cheese/source/gameengine/Ketsji/BL_Material.cpp
branches/soc-2012-swiss_cheese/source/gameengine/Ketsji/BL_Material.h
branches/soc-2012-swiss_cheese/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
Modified: branches/soc-2012-swiss_cheese/source/gameengine/Converter/BL_BlenderDataConversion.cpp
===================================================================
--- branches/soc-2012-swiss_cheese/source/gameengine/Converter/BL_BlenderDataConversion.cpp 2012-07-17 21:59:20 UTC (rev 49011)
+++ branches/soc-2012-swiss_cheese/source/gameengine/Converter/BL_BlenderDataConversion.cpp 2012-07-18 03:56:42 UTC (rev 49012)
@@ -508,11 +508,11 @@
uvs[0][0] = uvs[1][0] = uvs[2][0] = uvs[3][0] = MT_Point2(0.f, 0.f);
}
- for (int vind = 0; vind<material->num_enabled; vind++)
+ for (int vind = 0; vind<MAXTEX; vind++)
{
BL_Mapping &map = material->mapping[vind];
- if (map.mapping != USEUV) continue;
+ if (!(map.mapping & USEUV)) continue;
//If no UVSet is specified, try grabbing one from the UV/Image editor
if (map.uvCoName.IsEmpty() && tface)
@@ -562,11 +562,10 @@
const char *tfaceName,
MFace* mface,
MCol* mmcol,
- MTF_localLayer *layers,
bool glslmat)
{
material->Initialize();
- int numchan = -1, texalpha = 0;
+ int texalpha = 0;
bool validmat = (mat!=0);
bool validface = (tface!=0);
@@ -592,7 +591,6 @@
// cast shadows?
material->ras_mode |= ( mat->mode & MA_SHADBUF )?CAST_SHADOW:0;
MTex *mttmp = 0;
- numchan = getNumTexChannels(mat);
int valid_index = 0;
/* In Multitexture use the face texture if and only if
@@ -601,12 +599,9 @@
bool facetex = false;
if (validface && mat->mode &MA_FACETEXTURE)
facetex = true;
-
- numchan = numchan>MAXTEX?MAXTEX:numchan;
- if (facetex && numchan == 0) numchan = 1;
// foreach MTex
- for (int i=0; i<numchan; i++) {
+ for (int i=0; i<MAXTEX; i++) {
// use face tex
if (i==0 && facetex ) {
@@ -906,7 +901,7 @@
bl_mat = new BL_Material();
ConvertMaterial(bl_mat, ma, tface, tfaceName, mface, mcol,
- layers, converter->GetGLSLMaterials());
+ converter->GetGLSLMaterials());
converter->CacheBlenderMaterial(ma, bl_mat);
}
@@ -1422,7 +1417,7 @@
if(!ma)
ma= &defmaterial;
ConvertMaterial(bl_mat, ma, tface, tfaceName, mface, mcol,
- layers, converter->GetGLSLMaterials());
+ converter->GetGLSLMaterials());
short type = (bl_mat) ? ((ma->mode & MA_VERTEXCOLP || bl_mat->glslmat) ? 0 : 1) : 0;
GetRGB(type,mface,mcol,ma,rgb);
Modified: branches/soc-2012-swiss_cheese/source/gameengine/Ketsji/BL_Material.cpp
===================================================================
--- branches/soc-2012-swiss_cheese/source/gameengine/Ketsji/BL_Material.cpp 2012-07-17 21:59:20 UTC (rev 49011)
+++ branches/soc-2012-swiss_cheese/source/gameengine/Ketsji/BL_Material.cpp 2012-07-18 03:56:42 UTC (rev 49012)
@@ -20,15 +20,6 @@
return m?m:0;
}
-int getNumTexChannels( Material *mat )
-{
- int count = -1;
- if (!mat) return -1;
-
- for (count =0; (count < 10) && mat->mtex[count] != 0; count++) {}
- return count;
-}
-
BL_Material::BL_Material()
{
Initialize();
Modified: branches/soc-2012-swiss_cheese/source/gameengine/Ketsji/BL_Material.h
===================================================================
--- branches/soc-2012-swiss_cheese/source/gameengine/Ketsji/BL_Material.h 2012-07-17 21:59:20 UTC (rev 49011)
+++ branches/soc-2012-swiss_cheese/source/gameengine/Ketsji/BL_Material.h 2012-07-18 03:56:42 UTC (rev 49012)
@@ -175,7 +175,6 @@
// ------------------------------------
//extern void initBL_Material(BL_Material* mat);
extern MTex* getImageFromMaterial(Material *mat, int index);
-extern int getNumTexChannels( Material *mat );
// ------------------------------------
#endif
Modified: branches/soc-2012-swiss_cheese/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
===================================================================
--- branches/soc-2012-swiss_cheese/source/gameengine/Ketsji/KX_BlenderMaterial.cpp 2012-07-17 21:59:20 UTC (rev 49011)
+++ branches/soc-2012-swiss_cheese/source/gameengine/Ketsji/KX_BlenderMaterial.cpp 2012-07-18 03:56:42 UTC (rev 49012)
@@ -96,16 +96,11 @@
m_flag |= (mMaterial->glslmat)? RAS_BLENDERGLSL: 0;
m_flag |= ((mMaterial->ras_mode & CAST_SHADOW)!=0)? RAS_CASTSHADOW: 0;
- // figure max
- int enabled = mMaterial->num_enabled;
- int max = BL_Texture::GetMaxUnits();
- mMaterial->num_enabled = enabled>=max?max:enabled;
-
// test the sum of the various modes for equality
// so we can ether accept or reject this material
// as being equal, this is rather important to
// prevent material bleeding
- for (int i=0; i<mMaterial->num_enabled; i++) {
+ for (int i=0; i<BL_Texture::GetMaxUnits(); i++) {
m_multimode += (mMaterial->flag[i] + mMaterial->blend_mode[i]);
}
m_multimode += mMaterial->IdMode+ (mMaterial->ras_mode & ~(USE_LIGHT));
@@ -169,7 +164,7 @@
// for each unique material...
int i;
- for (i=0; i<mMaterial->num_enabled; i++) {
+ for (i=0; i<BL_Texture::GetMaxUnits(); i++) {
if ( mMaterial->mapping[i].mapping & USEENV ) {
if (!GLEW_ARB_texture_cube_map) {
spit("CubeMap textures not supported");
@@ -181,7 +176,7 @@
}
// 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 "<<
@@ -233,7 +228,8 @@
}
BL_Texture::ActivateFirst();
- for (int i=0; i<mMaterial->num_enabled; i++) {
+ for (int i=0; i<BL_Texture::GetMaxUnits(); i++) {
+ if (!mTextures[i].Ok()) continue;
BL_Texture::ActivateUnit(i);
mTextures[i].DeleteTex();
mTextures[i].DisableUnit();
@@ -272,7 +268,7 @@
mShader->ApplyShader();
// for each enabled unit
- for (i=0; i<mMaterial->num_enabled; i++) {
+ for (i=0; i<BL_Texture::GetMaxUnits(); i++) {
if (!mTextures[i].Ok()) continue;
mTextures[i].ActivateTexture();
mTextures[0].SetMapping(mMaterial->mapping[i].mapping);
@@ -346,7 +342,7 @@
}
int mode = 0,i=0;
- for (i=0; (i<mMaterial->num_enabled && i<MAXTEX); i++) {
+ for (i=0; i<BL_Texture::GetMaxUnits(); i++) {
if ( !mTextures[i].Ok() ) continue;
mTextures[i].ActivateTexture();
@@ -638,7 +634,7 @@
ras->SetTexCoordNum(mMaterial->num_enabled);
- for (int i=0; i<mMaterial->num_enabled; i++) {
+ for (int i=0; i<BL_Texture::GetMaxUnits(); i++) {
int mode = mMaterial->mapping[i].mapping;
if ( mode &(USEREFL|USEOBJ))
More information about the Bf-blender-cvs
mailing list