From f1d382fcfffd82d15ff1185664ddb16831e96953 Mon Sep 17 00:00:00 2001 From: Azaezel Date: Sat, 27 Dec 2014 11:34:08 -0600 Subject: [PATCH] cubemap Mip retrieval-DX similar to opengl, if the textures comprising a cubemap contain mips, it retrieves them, otherwise it generates them. --- Engine/source/gfx/D3D9/gfxD3D9Cubemap.cpp | 54 ++++++++++++++--------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/Engine/source/gfx/D3D9/gfxD3D9Cubemap.cpp b/Engine/source/gfx/D3D9/gfxD3D9Cubemap.cpp index ff46a3d22..d7161ad9b 100644 --- a/Engine/source/gfx/D3D9/gfxD3D9Cubemap.cpp +++ b/Engine/source/gfx/D3D9/gfxD3D9Cubemap.cpp @@ -101,11 +101,20 @@ void GFXD3D9Cubemap::initStatic( GFXTexHandle *faces ) mTexSize = faces[0].getWidth(); mFaceFormat = faces[0].getFormat(); - D3D9Assert( D3D9Device->CreateCubeTexture( mTexSize, 1, 0, GFXD3D9TextureFormat[mFaceFormat], + U32 levels = faces->getPointer()->getMipLevels(); + if (levels >1) + { + D3D9Assert(D3D9Device->CreateCubeTexture(mTexSize, levels, 0, GFXD3D9TextureFormat[mFaceFormat], + pool, &mCubeTex, NULL), NULL); + fillCubeTextures(faces, D3D9Device); + } + else + { + D3D9Assert( D3D9Device->CreateCubeTexture( mTexSize, 0, D3DUSAGE_AUTOGENMIPMAP, GFXD3D9TextureFormat[mFaceFormat], pool, &mCubeTex, NULL ), NULL ); - - fillCubeTextures( faces, D3D9Device ); -// mCubeTex->GenerateMipSubLevels(); + fillCubeTextures( faces, D3D9Device ); + mCubeTex->GenerateMipSubLevels(); + } } } @@ -195,24 +204,29 @@ void GFXD3D9Cubemap::initDynamic( U32 texSize, GFXFormat faceFormat ) //----------------------------------------------------------------------------- // Fills in face textures of cube map from existing textures //----------------------------------------------------------------------------- -void GFXD3D9Cubemap::fillCubeTextures( GFXTexHandle *faces, LPDIRECT3DDEVICE9 D3DDevice ) +void GFXD3D9Cubemap::fillCubeTextures( GFXTexHandle *faces, LPDIRECT3DDEVICE9 D3DDevice) { - for( U32 i=0; i<6; i++ ) - { - // get cube face surface - IDirect3DSurface9 *cubeSurf = NULL; - D3D9Assert( mCubeTex->GetCubeMapSurface( faceList[i], 0, &cubeSurf ), NULL ); - // get incoming texture surface - GFXD3D9TextureObject *texObj = dynamic_cast( (GFXTextureObject*)faces[i] ); - IDirect3DSurface9 *inSurf; - D3D9Assert( texObj->get2DTex()->GetSurfaceLevel( 0, &inSurf ), NULL ); - - // copy incoming texture into cube face - D3D9Assert( GFXD3DX.D3DXLoadSurfaceFromSurface( cubeSurf, NULL, NULL, inSurf, NULL, - NULL, D3DX_FILTER_NONE, 0 ), NULL ); - cubeSurf->Release(); - inSurf->Release(); + U32 levels = faces->getPointer()->getMipLevels(); + for (U32 mip = 0; mip < levels; mip++) + { + for (U32 i = 0; i < 6; i++) + { + // get cube face surface + IDirect3DSurface9 *cubeSurf = NULL; + D3D9Assert(mCubeTex->GetCubeMapSurface(faceList[i], mip, &cubeSurf), NULL); + + // get incoming texture surface + GFXD3D9TextureObject *texObj = dynamic_cast((GFXTextureObject*)faces[i]); + IDirect3DSurface9 *inSurf; + D3D9Assert(texObj->get2DTex()->GetSurfaceLevel(mip, &inSurf), NULL); + + // copy incoming texture into cube face + D3D9Assert(GFXD3DX.D3DXLoadSurfaceFromSurface(cubeSurf, NULL, NULL, inSurf, NULL, + NULL, D3DX_FILTER_NONE, 0), NULL); + cubeSurf->Release(); + inSurf->Release(); + } } }