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
///