From 11f9acb00a8c6b5b0f7dc7ccb8fe2097bae23be6 Mon Sep 17 00:00:00 2001 From: cxgeorge <> Date: Wed, 2 Oct 2002 02:09:13 +0000 Subject: [PATCH] fix aniso filter settings --- panda/src/dxgsg/dxGraphicsStateGuardian.cxx | 77 +++++++++++---------- panda/src/dxgsg/dxGraphicsStateGuardian.h | 4 +- 2 files changed, 43 insertions(+), 38 deletions(-) diff --git a/panda/src/dxgsg/dxGraphicsStateGuardian.cxx b/panda/src/dxgsg/dxGraphicsStateGuardian.cxx index 76a34b1345..c5c4fc64fc 100644 --- a/panda/src/dxgsg/dxGraphicsStateGuardian.cxx +++ b/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("<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? diff --git a/panda/src/dxgsg/dxGraphicsStateGuardian.h b/panda/src/dxgsg/dxGraphicsStateGuardian.h index 93ed9d1163..8de16a18fc 100644 --- a/panda/src/dxgsg/dxGraphicsStateGuardian.h +++ b/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;