Procházet zdrojové kódy

use floating-point division in mipmap generation

cxgeorge před 24 roky
rodič
revize
bdb754b257
1 změnil soubory, kde provedl 12 přidání a 2 odebrání
  1. 12 2
      panda/src/dxgsg/dxTextureContext.cxx

+ 12 - 2
panda/src/dxgsg/dxTextureContext.cxx

@@ -1669,9 +1669,16 @@ FillDDSurfTexturePixels(void) {
             DWORD src_row_bytelength=oldcurxsize*cPixelSize;
             DWORD src_row_bytelength=oldcurxsize*cPixelSize;
             DWORD two_src_row_bytelength=2*src_row_bytelength;
             DWORD two_src_row_bytelength=2*src_row_bytelength;
 
 
+        #ifdef GENMIPMAP_DO_INTEGER_DIV
             DWORD DivShift=2;
             DWORD DivShift=2;
             if((oldcurxsize==1)||(oldcurysize==1))
             if((oldcurxsize==1)||(oldcurysize==1))
                 DivShift = 1;
                 DivShift = 1;
+        #else
+            float numpixels_per_filter=4.0f;
+            if((oldcurxsize==1)||(oldcurysize==1))
+                numpixels_per_filter=2.0f;                
+        #endif
+
             DWORD x_srcptr_inc = ((oldcurxsize==1)? cPixelSize: (2*cPixelSize));
             DWORD x_srcptr_inc = ((oldcurxsize==1)? cPixelSize: (2*cPixelSize));
 
 
             // box-filter shrink down, avg 4 pixels at a time
             // box-filter shrink down, avg 4 pixels at a time
@@ -1691,8 +1698,11 @@ FillDDSurfTexturePixels(void) {
                             if(oldcurxsize>1)
                             if(oldcurxsize>1)
                                 colr += *(pSrcWord+src_row_bytelength+cPixelSize+c);
                                 colr += *(pSrcWord+src_row_bytelength+cPixelSize+c);
                         }
                         }
-
-                        colr >>= DivShift;
+                        #ifdef GENMIPMAP_DO_INTEGER_DIV
+                           colr >>= DivShift;
+                        #else
+                           colr = (DWORD) ((((float)colr)/numpixels_per_filter)+0.5f);
+                        #endif
 
 
                         *(pDstWord+c)=(BYTE)colr;
                         *(pDstWord+c)=(BYTE)colr;
                     }
                     }