fix anisotropic filter settings bug

This commit is contained in:
cxgeorge 2002-10-02 01:40:17 +00:00
parent 0cb3570746
commit 25fbc0f86d
2 changed files with 44 additions and 36 deletions

View File

@ -797,7 +797,7 @@ dx_init(HCURSOR hMouseCursor) {
scrn.pD3DDevice->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_DISABLE); // disables texturing scrn.pD3DDevice->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_DISABLE); // disables texturing
// Init more Texture State // Init more Texture State
_CurTexMagFilter=_CurTexMinFilter=Texture::FT_nearest; _CurTexMagFilter=_CurTexMinFilter=D3DTEXF_NONE;
_CurTexWrapModeU=_CurTexWrapModeV=Texture::WM_clamp; _CurTexWrapModeU=_CurTexWrapModeV=Texture::WM_clamp;
_CurTexAnisoDegree=1; _CurTexAnisoDegree=1;
@ -3135,23 +3135,27 @@ apply_texture(TextureContext *tc) {
uint aniso_degree=tex->get_anisotropic_degree(); uint aniso_degree=tex->get_anisotropic_degree();
Texture::FilterType ft=tex->get_magfilter(); Texture::FilterType ft=tex->get_magfilter();
if (aniso_degree<=1) { if(_CurTexAnisoDegree != aniso_degree) {
if (_CurTexMagFilter!=ft) { scrn.pD3DDevice->SetTextureStageState(0,D3DTSS_MAXANISOTROPY,aniso_degree);
_CurTexAnisoDegree = aniso_degree;
}
_CurTexMagFilter = ft; D3DTEXTUREFILTERTYPE newMagFilter;
scrn.pD3DDevice->SetTextureStageState(0, D3DTSS_MAGFILTER,(ft==Texture::FT_nearest)? D3DTEXF_POINT : D3DTEXF_LINEAR); if (aniso_degree<=1) {
#ifdef _DEBUG newMagFilter=((ft!=Texture::FT_nearest) ? D3DTEXF_LINEAR : D3DTEXF_POINT);
#ifdef _DEBUG
if((ft!=Texture::FT_linear)&&(ft!=Texture::FT_nearest)) { 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"; dxgsg_cat.error() << "MipMap filter type setting for texture magfilter makes no sense, texture: " << tex->get_name() << "\n";
} }
#endif #endif
}
} else { } else {
if (aniso_degree!=_CurTexAnisoDegree) { newMagFilter=D3DTEXF_ANISOTROPIC;
_CurTexAnisoDegree = aniso_degree;
scrn.pD3DDevice->SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_ANISOTROPIC );
scrn.pD3DDevice->SetTextureStageState(0, D3DTSS_MAXANISOTROPY,aniso_degree);
} }
if(_CurTexMagFilter!=newMagFilter) {
_CurTexMagFilter=newMagFilter;
scrn.pD3DDevice->SetTextureStageState(0, D3DTSS_MAGFILTER, newMagFilter);
} }
#ifdef _DEBUG #ifdef _DEBUG
@ -3170,8 +3174,6 @@ apply_texture(TextureContext *tc) {
ft=tex->get_minfilter(); ft=tex->get_minfilter();
if ((ft!=_CurTexMinFilter)||(aniso_degree!=_CurTexAnisoDegree)) {
#ifdef _DEBUG #ifdef _DEBUG
if(ft > Texture::FT_linear_mipmap_linear) { if(ft > Texture::FT_linear_mipmap_linear) {
dxgsg_cat.error() << "Unknown tex filter type for tex: " << tex->get_name() << " filter: "<<(DWORD)ft<<"\n"; dxgsg_cat.error() << "Unknown tex filter type for tex: " << tex->get_name() << " filter: "<<(DWORD)ft<<"\n";
@ -3179,26 +3181,32 @@ apply_texture(TextureContext *tc) {
} }
#endif #endif
D3DTEXTUREFILTERTYPE minfilter = PandaToD3DMinType[(DWORD)ft]; D3DTEXTUREFILTERTYPE newMipFilter = PandaToD3DMipType[(DWORD)ft];
D3DTEXTUREFILTERTYPE mipfilter = PandaToD3DMipType[(DWORD)ft];
#ifndef NDEBUG #ifndef NDEBUG
// sanity check
extern char *PandaFilterNameStrs[]; extern char *PandaFilterNameStrs[];
if((!(dtc->_bHasMipMaps))&&(mipfilter!=D3DTEXF_NONE)) { if((!(dtc->_bHasMipMaps))&&(mipfilter!=D3DTEXF_NONE)) {
dxgsg_cat.error() << "Trying to set mipmap filtering for texture with no generated mipmaps!! texname[" << tex->get_name() << "], filter("<<PandaFilterNameStrs[ft]<<")\n"; dxgsg_cat.error() << "Trying to set mipmap filtering for texture with no generated mipmaps!! texname[" << tex->get_name() << "], filter("<<PandaFilterNameStrs[ft]<<")\n";
mipfilter=D3DTEXF_NONE; newMipFilter=D3DTEXF_NONE;
} }
#endif #endif
if (aniso_degree>1) {
minfilter=D3DTEXF_ANISOTROPIC; D3DTEXTUREFILTERTYPE newMinFilter = PandaToD3DMinType[(DWORD)ft];
if(aniso_degree>=2) {
newMinFilter=D3DTEXF_ANISOTROPIC;
} }
scrn.pD3DDevice->SetTextureStageState(0, D3DTSS_MINFILTER, minfilter); if(newMinFilter!=_CurTexMinFilter) {
scrn.pD3DDevice->SetTextureStageState(0, D3DTSS_MIPFILTER, mipfilter); _CurTexMinFilter = newMinFilter;
scrn.pD3DDevice->SetTextureStageState(0, D3DTSS_MINFILTER, newMinFilter);
}
_CurTexMinFilter = ft; if(newMipFilter!=_CurTexMipFilter) {
_CurTexAnisoDegree = aniso_degree; _CurTexMipFilter = newMipFilter;
scrn.pD3DDevice->SetTextureStageState(0, D3DTSS_MIPFILTER, newMipFilter);
} }
// bugbug: does this handle the case of untextured geometry? // bugbug: does this handle the case of untextured geometry?

View File

@ -306,7 +306,7 @@ protected:
// Cur Texture State // Cur Texture State
TextureApplyAttrib::Mode _CurTexBlendMode; TextureApplyAttrib::Mode _CurTexBlendMode;
Texture::FilterType _CurTexMagFilter,_CurTexMinFilter; D3DTEXTUREFILTERTYPE _CurTexMagFilter,_CurTexMinFilter,_CurTexMipFilter;
DWORD _CurTexAnisoDegree; DWORD _CurTexAnisoDegree;
Texture::WrapMode _CurTexWrapModeU,_CurTexWrapModeV; Texture::WrapMode _CurTexWrapModeU,_CurTexWrapModeV;
LMatrix4f _current_projection_mat; LMatrix4f _current_projection_mat;