Преглед на файлове

Fix mipmap count and potential crash for non square textures that are allocated with GBitmap class

rextimmy преди 8 години
родител
ревизия
f6d624be8f
променени са 2 файла, в които са добавени 5 реда и са изтрити 16 реда
  1. 4 1
      Engine/source/gfx/bitmap/gBitmap.cpp
  2. 1 15
      Engine/source/gfx/gfxTextureManager.cpp

+ 4 - 1
Engine/source/gfx/bitmap/gBitmap.cpp

@@ -327,7 +327,10 @@ void GBitmap::allocateBitmap(const U32 in_width, const U32 in_height, const bool
 
          mNumMipLevels++;
          allocPixels += currWidth * currHeight * mBytesPerPixel;
-      } while (currWidth != 1 && currHeight != 1);
+      } while (currWidth != 1 || currHeight != 1);
+
+      U32 expectedMips = mFloor(mLog2(mMax(in_width, in_height))) + 1;
+      AssertFatal(mNumMipLevels == expectedMips, "GBitmap::allocateBitmap: mipmap count wrong");
    }
    AssertFatal(mNumMipLevels <= c_maxMipLevels, "GBitmap::allocateBitmap: too many miplevels");
 

+ 1 - 15
Engine/source/gfx/gfxTextureManager.cpp

@@ -1085,21 +1085,7 @@ void GFXTextureManager::_validateTexParams( const U32 width, const U32 height,
       // NOTE: Does this belong here?
       if( inOutNumMips == 0 && !autoGenSupp )
       {
-         U32 currWidth  = width;
-         U32 currHeight = height;
-
-         inOutNumMips = 1;
-         do 
-         {
-            currWidth  >>= 1;
-            currHeight >>= 1;
-            if( currWidth == 0 )
-               currWidth  = 1;
-            if( currHeight == 0 ) 
-               currHeight = 1;
-
-            inOutNumMips++;
-         } while ( currWidth != 1 && currHeight != 1 );
+         inOutNumMips = mFloor(mLog2(mMax(width, height))) + 1;
       }
    }
 }