Quellcode durchsuchen

fix aniso filter settings

cxgeorge vor 23 Jahren
Ursprung
Commit
11f9acb00a

+ 40 - 37
panda/src/dxgsg/dxGraphicsStateGuardian.cxx

@@ -727,7 +727,9 @@ dx_init( void) {
     scrn.pD3DDevice->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_DISABLE);  // disables texturing
 
     // Init more Texture State
-    _CurTexMagFilter=_CurTexMinFilter=Texture::FT_nearest;
+    _CurTexMagFilter=(D3DTEXTUREMAGFILTER) 0x0;
+    _CurTexMinFilter=(D3DTEXTUREMINFILTER) 0x0;
+    _CurTexMipFilter=(D3DTEXTUREMIPFILTER) 0x0;
     _CurTexWrapModeU=_CurTexWrapModeV=Texture::WM_clamp;
     _CurTexAnisoDegree=1;
 
@@ -3569,25 +3571,29 @@ apply_texture(TextureContext *tc) {
     }
 
     uint aniso_degree=tex->get_anisotropic_degree();
+    if(_CurTexAnisoDegree != aniso_degree) {
+        scrn.pD3DDevice->SetTextureStageState(0,D3DTSS_MAXANISOTROPY,aniso_degree);
+        _CurTexAnisoDegree = aniso_degree;
+    }
+
     Texture::FilterType ft=tex->get_magfilter();
 
+    D3DTEXTUREMAGFILTER newMagFilter;
     if (aniso_degree<=1) {
-        if (_CurTexMagFilter!=ft) {
+        newMagFilter=((ft!=Texture::FT_nearest) ? D3DTFG_LINEAR : D3DTFG_POINT);
 
-            _CurTexMagFilter = ft;
-            scrn.pD3DDevice->SetTextureStageState(0, D3DTSS_MAGFILTER,(ft==Texture::FT_nearest)? D3DTFG_POINT : D3DTFG_LINEAR);
-#ifdef _DEBUG
-            if((ft!=Texture::FT_linear)&&(ft!=Texture::FT_nearest)) {
-                dxgsg_cat.error() << "MipMap filter type setting for texture magfilter makes no sense,  texture: " << tex->get_name() << "\n";
-            }
-#endif
+        #ifdef _DEBUG
+        if((ft!=Texture::FT_linear)&&(ft!=Texture::FT_nearest)) {
+             dxgsg_cat.error() << "MipMap filter type setting for texture magfilter makes no sense,  texture: " << tex->get_name() << "\n";
         }
+        #endif
     } else {
-        if (aniso_degree!=_CurTexAnisoDegree) {
-            _CurTexAnisoDegree = aniso_degree;
-            scrn.pD3DDevice->SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTFG_ANISOTROPIC );
-            scrn.pD3DDevice->SetTextureStageState(0, D3DTSS_MAXANISOTROPY,aniso_degree);
-        }
+        newMagFilter=D3DTFG_ANISOTROPIC;
+    }
+
+    if(_CurTexMagFilter!=newMagFilter) {
+        _CurTexMagFilter=newMagFilter;
+        scrn.pD3DDevice->SetTextureStageState(0, D3DTSS_MAGFILTER, newMagFilter);
     }
 
 #ifdef _DEBUG
@@ -3605,35 +3611,32 @@ apply_texture(TextureContext *tc) {
 
     ft=tex->get_minfilter();
 
-    if ((ft!=_CurTexMinFilter)||(aniso_degree!=_CurTexAnisoDegree)) {
+    D3DTEXTUREMIPFILTER newMipFilter = PandaToD3DMipType[(DWORD)ft];
 
-#ifdef _DEBUG
-        if(ft > Texture::FT_linear_mipmap_linear) {
-                dxgsg_cat.error() << "Unknown tex filter type for tex: " << tex->get_name() << "  filter: "<<(DWORD)ft<<"\n";
-                return;
-        }
-#endif
-
-        D3DTEXTUREMINFILTER minfilter = PandaToD3DMinType[(DWORD)ft];
-        D3DTEXTUREMIPFILTER mipfilter = PandaToD3DMipType[(DWORD)ft];
-
-        #ifndef NDEBUG
-            extern char *PandaFilterNameStrs[];
-            if((!(dtc->_bHasMipMaps))&&(mipfilter!=D3DTFP_NONE)) {
+    #ifndef NDEBUG
+       // sanity check
+       extern char *PandaFilterNameStrs[];
+       if((!(dtc->_bHasMipMaps))&&(mipfilter!=D3DTFP_NONE)) {
                 dxgsg_cat.error() << "Trying to set mipmap filtering for texture with no generated mipmaps!! texname[" << tex->get_name() << "], filter("<<PandaFilterNameStrs[ft]<<")\n";
                 mipfilter=D3DTFP_NONE;
-            }
-        #endif
+       }
+    #endif
 
-        if (aniso_degree>1) {
-            minfilter=D3DTFN_ANISOTROPIC;
-        }
 
-        scrn.pD3DDevice->SetTextureStageState(0, D3DTSS_MINFILTER, minfilter);
-        scrn.pD3DDevice->SetTextureStageState(0, D3DTSS_MIPFILTER, mipfilter);
+    D3DTEXTUREMINFILTER newMinFilter = PandaToD3DMinType[(DWORD)ft];
 
-        _CurTexMinFilter = ft;
-        _CurTexAnisoDegree = aniso_degree;
+    if(aniso_degree>=2) {
+        newMinFilter=D3DTFN_ANISOTROPIC;
+    }
+    
+    if(newMinFilter!=_CurTexMinFilter) {
+        _CurTexMinFilter = newMinFilter;
+        scrn.pD3DDevice->SetTextureStageState(0, D3DTSS_MINFILTER, newMinFilter);
+    }
+
+    if(newMipFilter!=_CurTexMipFilter) {
+        _CurTexMipFilter = newMipFilter;
+        scrn.pD3DDevice->SetTextureStageState(0, D3DTSS_MIPFILTER, newMipFilter);
     }
 
     // bugbug:  does this handle the case of untextured geometry?

+ 3 - 1
panda/src/dxgsg/dxGraphicsStateGuardian.h

@@ -303,7 +303,9 @@ protected:
 
   // Cur Texture State
   TextureApplyAttrib::Mode _CurTexBlendMode;
-  Texture::FilterType _CurTexMagFilter,_CurTexMinFilter;
+  D3DTEXTUREMAGFILTER _CurTexMagFilter;
+  D3DTEXTUREMINFILTER _CurTexMinFilter;
+  D3DTEXTUREMIPFILTER _CurTexMipFilter;
   DWORD _CurTexAnisoDegree;
   Texture::WrapMode _CurTexWrapModeU,_CurTexWrapModeV;