diff --git a/Engine/source/gfx/D3D11/gfxD3D11Cubemap.cpp b/Engine/source/gfx/D3D11/gfxD3D11Cubemap.cpp index ed10be7bd..3ae1731da 100644 --- a/Engine/source/gfx/D3D11/gfxD3D11Cubemap.cpp +++ b/Engine/source/gfx/D3D11/gfxD3D11Cubemap.cpp @@ -396,19 +396,8 @@ void GFXD3D11CubemapArray::init(GFXCubemapHandle *cubemaps, const U32 cubemapCou AssertFatal(cubemaps, "GFXD3D11CubemapArray::initStatic - Got null GFXCubemapHandle!"); AssertFatal(*cubemaps, "GFXD3D11CubemapArray::initStatic - Got empty cubemap!"); - U32 downscalePower = GFXTextureManager::smTextureReductionLevel; - U32 scaledSize = cubemaps[0]->getSize(); - - if (downscalePower != 0) - { - // Otherwise apply the appropriate scale... - scaledSize >>= downscalePower; - } - - //all cubemaps must be the same size,format and number of mipmaps. Grab the details from the first cubemap - mSize = scaledSize; + setCubeTexSize(cubemaps); mFormat = cubemaps[0]->getFormat(); - mMipMapLevels = cubemaps[0]->getMipMapLevels() - downscalePower; mNumCubemaps = cubemapCount; //create texture object @@ -475,16 +464,7 @@ void GFXD3D11CubemapArray::init(GFXCubemapHandle *cubemaps, const U32 cubemapCou //Just allocate the cubemap array but we don't upload any data void GFXD3D11CubemapArray::init(const U32 cubemapCount, const U32 cubemapFaceSize, const GFXFormat format) { - U32 downscalePower = GFXTextureManager::smTextureReductionLevel; - U32 scaledSize = cubemapFaceSize; - - if (downscalePower != 0) - { - scaledSize >>= downscalePower; - } - - mSize = scaledSize; - mMipMapLevels = ImageUtil::getMaxMipCount(cubemapFaceSize, cubemapFaceSize) - downscalePower; + setCubeTexSize(cubemapFaceSize); mNumCubemaps = cubemapCount; mFormat = format; diff --git a/Engine/source/gfx/gfxCubemap.cpp b/Engine/source/gfx/gfxCubemap.cpp index cf62aadf6..0525d22e0 100644 --- a/Engine/source/gfx/gfxCubemap.cpp +++ b/Engine/source/gfx/gfxCubemap.cpp @@ -24,6 +24,7 @@ #include "gfx/gfxDevice.h" #include "gfx/bitmap/gBitmap.h" #include "gfx/gfxTextureManager.h" +#include "gfx/bitmap/imageUtils.h" GFXCubemap::GFXCubemap() @@ -138,3 +139,33 @@ const String GFXCubemapArray::describeSelf() const return String(); } + +void GFXCubemapArray::setCubeTexSize(GFXCubemapHandle* cubemaps) +{ + U32 downscalePower = 0;// GFXTextureManager::smTextureReductionLevel; + U32 scaledSize = cubemaps[0]->getSize(); + + if (downscalePower != 0) + { + // Otherwise apply the appropriate scale... + scaledSize >>= downscalePower; + } + + //all cubemaps must be the same size,format and number of mipmaps. Grab the details from the first cubemap + mSize = scaledSize; + mMipMapLevels = cubemaps[0]->getMipMapLevels() - downscalePower; +} + +void GFXCubemapArray::setCubeTexSize(U32 cubemapFaceSize) +{ + U32 downscalePower = 0;// GFXTextureManager::smTextureReductionLevel; + U32 scaledSize = cubemapFaceSize; + + if (downscalePower != 0) + { + scaledSize >>= downscalePower; + } + + mSize = scaledSize; + mMipMapLevels = ImageUtil::getMaxMipCount(cubemapFaceSize, cubemapFaceSize) - downscalePower; +} diff --git a/Engine/source/gfx/gfxCubemap.h b/Engine/source/gfx/gfxCubemap.h index b3c6eac0e..5343deb0e 100644 --- a/Engine/source/gfx/gfxCubemap.h +++ b/Engine/source/gfx/gfxCubemap.h @@ -127,7 +127,10 @@ protected: public: GFXCubemapArray() :mNumCubemaps(0), mSize(0), mMipMapLevels(0), mFormat(GFXFormat_FIRST) {} virtual ~GFXCubemapArray() {}; + /// Initialize from an array of cubemaps + void setCubeTexSize(GFXCubemapHandle* cubemaps); + void setCubeTexSize(const U32 cubemapFaceSize); virtual void init(GFXCubemapHandle *cubemaps, const U32 cubemapCount) = 0; /// Initialize cubemapCount number of blank cubemaps in the array virtual void init(const U32 cubemapCount, const U32 cubemapFaceSize, const GFXFormat format) = 0; diff --git a/Engine/source/gfx/gfxTextureManager.cpp b/Engine/source/gfx/gfxTextureManager.cpp index 53ebf801c..13865489a 100644 --- a/Engine/source/gfx/gfxTextureManager.cpp +++ b/Engine/source/gfx/gfxTextureManager.cpp @@ -100,7 +100,7 @@ GFXTextureManager::~GFXTextureManager() U32 GFXTextureManager::getTextureDownscalePower( GFXTextureProfile *profile ) { - if ( !profile || profile->canDownscale() ) + if ( profile && profile->canDownscale() ) return smTextureReductionLevel; return 0; diff --git a/Engine/source/gfx/gl/gfxGLCubemap.cpp b/Engine/source/gfx/gl/gfxGLCubemap.cpp index db23a0fc2..481a790bc 100644 --- a/Engine/source/gfx/gl/gfxGLCubemap.cpp +++ b/Engine/source/gfx/gl/gfxGLCubemap.cpp @@ -322,19 +322,8 @@ void GFXGLCubemapArray::init(GFXCubemapHandle *cubemaps, const U32 cubemapCount) AssertFatal(cubemaps, "GFXGLCubemapArray- Got null GFXCubemapHandle!"); AssertFatal(*cubemaps, "GFXGLCubemapArray - Got empty cubemap!"); - U32 downscalePower = GFXTextureManager::smTextureReductionLevel; - U32 scaledSize = cubemaps[0]->getSize(); - - if (downscalePower != 0) - { - // Otherwise apply the appropriate scale... - scaledSize >>= downscalePower; - } - - //all cubemaps must be the same size,format and number of mipmaps. Grab the details from the first cubemap - mSize = scaledSize; + setCubeTexSize(cubemaps); mFormat = cubemaps[0]->getFormat(); - mMipMapLevels = cubemaps[0]->getMipMapLevels() - downscalePower; mNumCubemaps = cubemapCount; const bool isCompressed = ImageUtil::isCompressedFormat(mFormat); @@ -379,19 +368,8 @@ void GFXGLCubemapArray::init(GFXCubemapHandle *cubemaps, const U32 cubemapCount) //Just allocate the cubemap array but we don't upload any data void GFXGLCubemapArray::init(const U32 cubemapCount, const U32 cubemapFaceSize, const GFXFormat format) { - U32 downscalePower = GFXTextureManager::smTextureReductionLevel; - U32 scaledSize = cubemapFaceSize; - - if (downscalePower != 0) - { - // Otherwise apply the appropriate scale... - scaledSize >>= downscalePower; - } - - //all cubemaps must be the same size,format and number of mipmaps. Grab the details from the first cubemap - mSize = scaledSize; + setCubeTexSize(cubemapCount); mFormat = format; - mMipMapLevels = ImageUtil::getMaxMipCount(scaledSize, scaledSize); mNumCubemaps = cubemapCount; const bool isCompressed = ImageUtil::isCompressedFormat(mFormat); diff --git a/Engine/source/renderInstance/renderProbeMgr.cpp b/Engine/source/renderInstance/renderProbeMgr.cpp index 30fdcda72..18a375a64 100644 --- a/Engine/source/renderInstance/renderProbeMgr.cpp +++ b/Engine/source/renderInstance/renderProbeMgr.cpp @@ -223,9 +223,10 @@ bool RenderProbeMgr::onAdd() mIrradianceArray = GFXCubemapArrayHandle(GFX->createCubemapArray()); mPrefilterArray = GFXCubemapArrayHandle(GFX->createCubemapArray()); + U32 scaledSize = getProbeTexSize(); //pre-allocate a few slots - mIrradianceArray->init(PROBE_ARRAY_SLOT_BUFFER_SIZE, RenderProbeMgr::smProbeBakeResolution, PROBE_FORMAT); - mPrefilterArray->init(PROBE_ARRAY_SLOT_BUFFER_SIZE, RenderProbeMgr::smProbeBakeResolution, PROBE_FORMAT); + mIrradianceArray->init(PROBE_ARRAY_SLOT_BUFFER_SIZE, scaledSize, PROBE_FORMAT); + mPrefilterArray->init(PROBE_ARRAY_SLOT_BUFFER_SIZE, scaledSize, PROBE_FORMAT); mCubeSlotCount = PROBE_ARRAY_SLOT_BUFFER_SIZE; String brdfTexturePath = GFXTextureManager::getBRDFTexturePath(); @@ -362,8 +363,9 @@ void RenderProbeMgr::registerProbe(ReflectionProbe::ProbeInfo* newProbe) GFXCubemapArrayHandle irr = GFXCubemapArrayHandle(GFX->createCubemapArray()); GFXCubemapArrayHandle prefilter = GFXCubemapArrayHandle(GFX->createCubemapArray()); - irr->init(mCubeSlotCount + PROBE_ARRAY_SLOT_BUFFER_SIZE, RenderProbeMgr::smProbeBakeResolution, PROBE_FORMAT); - prefilter->init(mCubeSlotCount + PROBE_ARRAY_SLOT_BUFFER_SIZE, RenderProbeMgr::smProbeBakeResolution, PROBE_FORMAT); + U32 scaledSize = getProbeTexSize(); + irr->init(mCubeSlotCount + PROBE_ARRAY_SLOT_BUFFER_SIZE, scaledSize, PROBE_FORMAT); + prefilter->init(mCubeSlotCount + PROBE_ARRAY_SLOT_BUFFER_SIZE, scaledSize, PROBE_FORMAT); mIrradianceArray->copyTo(irr); mPrefilterArray->copyTo(prefilter); @@ -428,23 +430,35 @@ PostEffect* RenderProbeMgr::getProbeArrayEffect() return mProbeArrayEffect; } +U32 RenderProbeMgr::getProbeTexSize() +{ + U32 scaledSize = RenderProbeMgr::smProbeBakeResolution; + U32 downscalePower = 0;// GFXTextureManager::smTextureReductionLevel; + if (downscalePower != 0) + { + // Otherwise apply the appropriate scale... + scaledSize >>= downscalePower; + } + return scaledSize; +} + void RenderProbeMgr::updateProbeTexture(ReflectionProbe::ProbeInfo* probeInfo) { //If we don't have a registered probe, there's no point in updating the cubemap array for it ProbeRenderInst* probe = findProbeInst(probeInfo); if (probe == nullptr) return; - + U32 scaledSize = getProbeTexSize(); //Some basic sanity checking that we have valid cubemaps to work with if (probeInfo->mIrradianceCubemap.isNull() || !probeInfo->mIrradianceCubemap->isInitialized() || - probeInfo->mIrradianceCubemap->getSize() != RenderProbeMgr::smProbeBakeResolution) + probeInfo->mIrradianceCubemap->getSize() != scaledSize) { Con::errorf("RenderProbeMgr::updateProbeTexture() - tried to update a probe's texture with an invalid or uninitialized irradiance map!"); return; } if (probeInfo->mPrefilterCubemap.isNull() || !probeInfo->mPrefilterCubemap->isInitialized() || - probeInfo->mPrefilterCubemap->getSize() != RenderProbeMgr::smProbeBakeResolution) + probeInfo->mPrefilterCubemap->getSize() != scaledSize) { Con::errorf("RenderProbeMgr::updateProbeTexture() - tried to update a probe's texture with an invalid or uninitialized specular map!"); return; diff --git a/Engine/source/renderInstance/renderProbeMgr.h b/Engine/source/renderInstance/renderProbeMgr.h index 990c5382c..0d26bd047 100644 --- a/Engine/source/renderInstance/renderProbeMgr.h +++ b/Engine/source/renderInstance/renderProbeMgr.h @@ -402,7 +402,7 @@ public: /// /// the PostEffect object PostEffect* getProbeArrayEffect(); - + U32 getProbeTexSize(); /// /// Finds the associated cubemap array slot for the incoming ProbeInfo and updates the array's texture(s) from it ///