Reorg of the probe initialization/update code to streamline parts of it, and make it flow more obviously

Added some initial asset stuffs for Das Boot for building out a better testing level.
This commit is contained in:
Areloch 2019-06-04 00:21:52 -05:00
parent 17cec11b97
commit a552471e4e
33 changed files with 317 additions and 1821 deletions

View file

@ -122,24 +122,12 @@ void BoxEnvironmentProbe::onRemove()
Parent::onRemove();
}
void BoxEnvironmentProbe::setTransform(const MatrixF & mat)
{
// Let SceneObject handle all of the matrix manipulation
Parent::setTransform(mat);
mDirty = true;
// Dirty our network mask so that the new transform gets
// transmitted to the client object
setMaskBits(TransformMask);
}
U32 BoxEnvironmentProbe::packUpdate(NetConnection *conn, U32 mask, BitStream *stream)
{
// Allow the Parent to get a crack at writing its info
U32 retMask = Parent::packUpdate(conn, mask, stream);
if (stream->writeFlag(mask & UpdateMask))
if (stream->writeFlag(mask & StaticDataMask))
{
stream->write(mAtten);
}
@ -152,7 +140,7 @@ void BoxEnvironmentProbe::unpackUpdate(NetConnection *conn, BitStream *stream)
// Let the Parent read any info it sent
Parent::unpackUpdate(conn, stream);
if (stream->readFlag()) // UpdateMask
if (stream->readFlag()) // StaticDataMask
{
stream->read(&mAtten);
}
@ -164,17 +152,11 @@ void BoxEnvironmentProbe::unpackUpdate(NetConnection *conn, BitStream *stream)
void BoxEnvironmentProbe::updateProbeParams()
{
Parent::updateProbeParams();
mProbeInfo->mProbeShapeType = ProbeRenderInst::Box;
mProbeShapeType = ProbeRenderInst::Box;
mProbeInfo->mAtten = mAtten;
PROBEMGR->updateProbes();
updateCubemaps();
}
void BoxEnvironmentProbe::setPreviewMatParameters(SceneRenderState* renderState, BaseMatInstance* mat)
{
Parent::setPreviewMatParameters(renderState, mat);
}
}

View file

@ -87,9 +87,6 @@ public:
bool onAdd();
void onRemove();
// Override this so that we can dirty the network flag when it is called
void setTransform(const MatrixF &mat);
// This function handles sending the relevant data from the server
// object to the client object
U32 packUpdate(NetConnection *conn, U32 mask, BitStream *stream);
@ -113,4 +110,4 @@ public:
void setPreviewMatParameters(SceneRenderState* renderState, BaseMatInstance* mat);
};
#endif // BOX_ENVIRONMENT_PROBE_H
#endif // BOX_ENVIRONMENT_PROBE_H

View file

@ -104,6 +104,7 @@ ReflectionProbe::ReflectionProbe()
mEnabled = true;
mBake = false;
mDirty = false;
mCubemapDirty = false;
mRadius = 10;
mObjScale = Point3F::One * 10;
@ -134,8 +135,6 @@ ReflectionProbe::ReflectionProbe()
mProbeRefOffset = Point3F::Zero;
mEditPosOffset = false;
mProbeInfoIdx = -1;
mCaptureMask = REFLECTION_PROBE_CAPTURE_TYPEMASK;
}
@ -292,7 +291,9 @@ bool ReflectionProbe::onAdd()
// Refresh this object's material (if any)
if (isClientObject())
{
createGeometry();
if (!createClientResources())
return false;
updateProbeParams();
}
@ -305,8 +306,9 @@ void ReflectionProbe::onRemove()
{
if (isClientObject())
{
PROBEMGR->unregisterProbe(mProbeInfoIdx);
PROBEMGR->unregisterProbe(mProbeInfo->mProbeIdx);
}
// Remove this object from the scene
removeFromScene();
@ -318,16 +320,19 @@ void ReflectionProbe::handleDeleteAction()
//we're deleting it?
//Then we need to clear out the processed cubemaps(if we have them)
String prefilPath = getPrefilterMapPath();
if (Platform::isFile(prefilPath))
if (mReflectionModeType != StaticCubemap)
{
Platform::fileDelete(prefilPath);
}
String prefilPath = getPrefilterMapPath();
if (Platform::isFile(prefilPath))
{
Platform::fileDelete(prefilPath);
}
String irrPath = getIrradianceMapPath();
if (Platform::isFile(irrPath))
{
Platform::fileDelete(irrPath);
String irrPath = getIrradianceMapPath();
if (Platform::isFile(irrPath))
{
Platform::fileDelete(irrPath);
}
}
Parent::handleDeleteAction();
@ -406,19 +411,13 @@ U32 ReflectionProbe::packUpdate(NetConnection *conn, U32 mask, BitStream *stream
mathWrite(*stream, mProbeRefScale);
}
if (stream->writeFlag(mask & ShapeTypeMask))
if (stream->writeFlag(mask & StaticDataMask))
{
stream->write((U32)mProbeShapeType);
}
if (stream->writeFlag(mask & UpdateMask))
{
stream->write(mRadius);
}
if (stream->writeFlag(mask & BakeInfoMask))
{
stream->write(mProbeUniqueID);
stream->write((U32)mReflectionModeType);
stream->write(mCubemapName);
}
if (stream->writeFlag(mask & EnabledMask))
@ -426,16 +425,6 @@ U32 ReflectionProbe::packUpdate(NetConnection *conn, U32 mask, BitStream *stream
stream->writeFlag(mEnabled);
}
if (stream->writeFlag(mask & ModeMask))
{
stream->write((U32)mReflectionModeType);
}
if (stream->writeFlag(mask & CubemapMask))
{
stream->write(mCubemapName);
}
return retMask;
}
@ -460,28 +449,28 @@ void ReflectionProbe::unpackUpdate(NetConnection *conn, BitStream *stream)
mDirty = true;
}
if (stream->readFlag()) // ShapeTypeMask
if (stream->readFlag()) // StaticDataMask
{
U32 shapeType = ProbeRenderInst::Sphere;
stream->read(&shapeType);
mProbeShapeType = (ProbeRenderInst::ProbeShapeType)shapeType;
createGeometry();
mDirty = true;
}
if (stream->readFlag()) // UpdateMask
{
stream->read(&mRadius);
mDirty = true;
}
if (stream->readFlag()) // BakeInfoMask
{
stream->read(&mProbeUniqueID);
U32 oldReflectModeType = mReflectionModeType;
U32 reflectModeType = BakedCubemap;
stream->read(&reflectModeType);
mReflectionModeType = (ReflectionModeType)reflectModeType;
String oldCubemapName = mCubemapName;
stream->read(&mCubemapName);
if(oldReflectModeType != mReflectionModeType || oldCubemapName != mCubemapName)
mCubemapDirty = true;
mDirty = true;
}
@ -492,28 +481,6 @@ void ReflectionProbe::unpackUpdate(NetConnection *conn, BitStream *stream)
mDirty = true;
}
if (stream->readFlag()) // ModeMask
{
U32 reflectModeType = BakedCubemap;
stream->read(&reflectModeType);
mReflectionModeType = (ReflectionModeType)reflectModeType;
mDirty = true;
}
if (stream->readFlag()) // CubemapMask
{
String newCubemapName;
stream->read(&mCubemapName);
//if (newCubemapName != mCubemapName)
{
processStaticCubemap();
}
mDirty = true;
}
if (mDirty)
{
updateProbeParams();
@ -525,101 +492,80 @@ void ReflectionProbe::unpackUpdate(NetConnection *conn, BitStream *stream)
//-----------------------------------------------------------------------------
void ReflectionProbe::updateProbeParams()
{
if (mProbeInfo == nullptr)
{
mProbeInfo = new ProbeRenderInst();
mProbeInfoIdx = ProbeRenderInst::all.size() - 1;
mProbeInfo->mIsEnabled = false;
//PROBEMGR->registerProbe(mProbeInfoIdx);
}
if (!mProbeInfo)
return;
mProbeInfo->mProbeShapeType = mProbeShapeType;
MatrixF transform = getTransform();
mProbeInfo->mPosition = getPosition();
if (mProbeShapeType == ProbeRenderInst::Sphere)
mObjScale.set(mRadius, mRadius, mRadius);
transform.scale(getScale());
mProbeInfo->mTransform = transform.inverse();
Box3F bounds;
if (mProbeShapeType == ProbeRenderInst::Skylight)
{
mProbeInfo->mPosition = Point3F::Zero;
mProbeInfo->mTransform = MatrixF::Identity;
mProbeInfo->mIsSkylight = true;
F32 visDist = gClientSceneGraph->getVisibleDistance();
Box3F skylightBounds = Box3F(visDist * 2);
skylightBounds.setCenter(Point3F::Zero);
bounds = skylightBounds;
setGlobalBounds();
mProbeInfo->mScore = -1.0f;
}
else
{
MatrixF transform = getTransform();
mProbeInfo->mPosition = getPosition();
transform.scale(getScale());
mProbeInfo->mTransform = transform.inverse();
mProbeInfo->mIsSkylight = false;
bounds = mWorldBox;
mProbeInfo->mScore = mMaxDrawDistance;
}
// Skip our transform... it just dirties mask bits.
Parent::setTransform(mObjToWorld);
resetWorldBox();
mProbeInfo->mBounds = mWorldBox;
mProbeInfo->mBounds = bounds;
mProbeInfo->mExtents = getScale();
mProbeInfo->mRadius = mRadius;
mProbeInfo->mIsSkylight = false;
mProbeInfo->mProbeRefOffset = mProbeRefOffset;
mProbeInfo->mProbeRefScale = mProbeRefScale;
mProbeInfo->mDirty = true;
mProbeInfo->mScore = mMaxDrawDistance;
if (mCubemapDirty)
{
if (mReflectionModeType == StaticCubemap)
processStaticCubemap();
else
processDynamicCubemap();
}
PROBEMGR->updateProbes();
}
void ReflectionProbe::processStaticCubemap()
void ReflectionProbe::processDynamicCubemap()
{
if (mReflectionModeType != StaticCubemap)
if (!mProbeInfo)
return;
createClientResources();
Sim::findObject(mCubemapName, mStaticCubemap);
if (!mStaticCubemap)
{
Con::errorf("ReflectionProbe::updateMaterial() - unable to find static cubemap file!");
return;
}
if (mStaticCubemap->mCubemap == nullptr)
{
mStaticCubemap->createMap();
mStaticCubemap->updateFaces();
}
String prefilPath = getPrefilterMapPath();
String irrPath = getIrradianceMapPath();
if (mUseHDRCaptures)
{
mIrridianceMap->mCubemap->initDynamic(mPrefilterSize, GFXFormatR16G16B16A16F);
mPrefilterMap->mCubemap->initDynamic(mPrefilterSize, GFXFormatR16G16B16A16F);
}
else
{
mIrridianceMap->mCubemap->initDynamic(mPrefilterSize, GFXFormatR8G8B8A8);
mPrefilterMap->mCubemap->initDynamic(mPrefilterSize, GFXFormatR8G8B8A8);
}
//if (!Platform::isFile(irrPath) || !Platform::isFile(prefilPath))
{
GFXTextureTargetRef renderTarget = GFX->allocRenderToTextureTarget(false);
IBLUtilities::GenerateIrradianceMap(renderTarget, mStaticCubemap->mCubemap, mIrridianceMap->mCubemap);
IBLUtilities::GeneratePrefilterMap(renderTarget, mStaticCubemap->mCubemap, mPrefilterMipLevels, mPrefilterMap->mCubemap);
IBLUtilities::SaveCubeMap(getIrradianceMapPath(), mIrridianceMap->mCubemap);
IBLUtilities::SaveCubeMap(getPrefilterMapPath(), mPrefilterMap->mCubemap);
}
mProbeInfo->mPrefilterCubemap = mPrefilterMap->mCubemap;
mProbeInfo->mIrradianceCubemap = mIrridianceMap->mCubemap;
//Update the probe manager with our new texture!
if(!mProbeInfo->mIsSkylight)
PROBEMGR->updateProbeTexture(mProbeInfo);
}
void ReflectionProbe::updateCubemaps()
{
createClientResources();
mEnabled = false;
if (mReflectionModeType != DynamicCubemap)
{
@ -627,22 +573,36 @@ void ReflectionProbe::updateCubemaps()
if ((mReflectionModeType == BakedCubemap) && !mProbeUniqueID.isEmpty())
{
if (mPrefilterMap != nullptr && mPrefilterMap->mCubemap.isValid())
String irrPath = getIrradianceMapPath();
if (Platform::isFile(irrPath))
{
mProbeInfo->mPrefilterCubemap = mPrefilterMap->mCubemap;
mIrridianceMap->setCubemapFile(FileName(irrPath));
//mIrridianceMap->updateFaces();
}
else
if (mIrridianceMap == nullptr || mIrridianceMap->mCubemap.isNull())
{
mEnabled = false;
Con::errorf("ReflectionProbe::processDynamicCubemap() - Unable to load baked irradiance map at %s", getIrradianceMapPath().c_str());
return;
}
if (mIrridianceMap != nullptr && mIrridianceMap->mCubemap.isValid())
String prefilPath = getPrefilterMapPath();
if (Platform::isFile(prefilPath))
{
mProbeInfo->mIrradianceCubemap = mIrridianceMap->mCubemap;
mPrefilterMap->setCubemapFile(FileName(prefilPath));
//mPrefilterMap->updateFaces();
}
else
if (mPrefilterMap == nullptr || mPrefilterMap->mCubemap.isNull())
{
mEnabled = false;
Con::errorf("ReflectionProbe::processDynamicCubemap() - Unable to load baked prefilter map at %s", getPrefilterMapPath().c_str());
return;
}
//mProbeInfo->mPrefilterCubemap = mPrefilterMap->mCubemap;
//mProbeInfo->mIrradianceCubemap = mIrridianceMap->mCubemap;
mEnabled = true;
}
}
else
@ -659,18 +619,120 @@ void ReflectionProbe::updateCubemaps()
}
}
//Make us ready to render
if (mEnabled)
mProbeInfo->mIsEnabled = true;
else
mProbeInfo->mIsEnabled = false;
//Update the probe manager with our new texture!
//if (!mProbeInfo->mIsSkylight && mProbeInfo->mPrefilterCubemap->isInitialized() && mProbeInfo->mIrradianceCubemap->isInitialized())
// PROBEMGR->updateProbeTexture(mProbeInfo->mProbeIdx);
}
void ReflectionProbe::processStaticCubemap()
{
if (!mProbeInfo)
return;
mEnabled = false;
String path = Con::getVariable("$pref::ReflectionProbes::CurrentLevelPath", "levels/");
char irradFileName[256];
dSprintf(irradFileName, 256, "%s_Irradiance.dds", path.c_str(), mCubemapName.c_str());
if (Platform::isFile(irradFileName))
{
mIrridianceMap->setCubemapFile(FileName(irradFileName));
mIrridianceMap->updateFaces();
}
if (mIrridianceMap == nullptr || mIrridianceMap->mCubemap.isNull())
{
Con::errorf("ReflectionProbe::processStaticCubemap() - Unable to load baked irradiance map at %s", irradFileName);
return;
}
char prefilterFileName[256];
dSprintf(prefilterFileName, 256, "%s%s_Prefilter.dds", path.c_str(), mCubemapName.c_str());
if (Platform::isFile(prefilterFileName))
{
mPrefilterMap->setCubemapFile(FileName(prefilterFileName));
mPrefilterMap->updateFaces();
}
if (mPrefilterMap == nullptr || mPrefilterMap->mCubemap.isNull())
{
Con::errorf("ReflectionProbe::processStaticCubemap() - Unable to load baked prefilter map at %s", prefilterFileName);
return;
}
if (!Platform::isFile(prefilterFileName) || !Platform::isFile(irradFileName))
{
//If we are missing either of the files, just re-run the bake
Sim::findObject(mCubemapName, mStaticCubemap);
if (!mStaticCubemap)
{
Con::errorf("ReflectionProbe::updateMaterial() - unable to find static cubemap file!");
return;
}
if (mStaticCubemap->mCubemap == nullptr)
{
mStaticCubemap->createMap();
mStaticCubemap->updateFaces();
}
if (mUseHDRCaptures)
{
mIrridianceMap->mCubemap->initDynamic(mPrefilterSize, GFXFormatR16G16B16A16F);
mPrefilterMap->mCubemap->initDynamic(mPrefilterSize, GFXFormatR16G16B16A16F);
}
else
{
mIrridianceMap->mCubemap->initDynamic(mPrefilterSize, GFXFormatR8G8B8A8);
mPrefilterMap->mCubemap->initDynamic(mPrefilterSize, GFXFormatR8G8B8A8);
}
GFXTextureTargetRef renderTarget = GFX->allocRenderToTextureTarget(false);
IBLUtilities::GenerateIrradianceMap(renderTarget, mStaticCubemap->mCubemap, mIrridianceMap->mCubemap);
IBLUtilities::GeneratePrefilterMap(renderTarget, mStaticCubemap->mCubemap, mPrefilterMipLevels, mPrefilterMap->mCubemap);
IBLUtilities::SaveCubeMap(irradFileName, mIrridianceMap->mCubemap);
IBLUtilities::SaveCubeMap(prefilterFileName, mPrefilterMap->mCubemap);
}
if ((mIrridianceMap != nullptr || !mIrridianceMap->mCubemap.isNull()) && (mPrefilterMap != nullptr || !mPrefilterMap->mCubemap.isNull()))
{
mProbeInfo->mPrefilterCubemap = mPrefilterMap->mCubemap;
mProbeInfo->mIrradianceCubemap = mIrridianceMap->mCubemap;
mEnabled = true;
}
if (mEnabled)
mProbeInfo->mIsEnabled = true;
else
mProbeInfo->mIsEnabled = false;
//Update the probe manager with our new texture!
if (!mProbeInfo->mIsSkylight && mProbeInfo->mPrefilterCubemap->isInitialized() && mProbeInfo->mIrradianceCubemap->isInitialized())
PROBEMGR->updateProbeTexture(mProbeInfo);
PROBEMGR->updateProbeTexture(mProbeInfo->mProbeIdx);
}
bool ReflectionProbe::createClientResources()
{
if (mProbeInfo == nullptr)
{
mProbeInfo = PROBEMGR->registerProbe(mProbeShapeType == ProbeRenderInst::Skylight);
if (!mProbeInfo)
return false;
mProbeInfo->mIsEnabled = false;
}
//irridiance resources
if (!mIrridianceMap)
{
@ -680,16 +742,6 @@ bool ReflectionProbe::createClientResources()
mIrridianceMap->createMap();
}
String irrPath = getIrradianceMapPath();
if (Platform::isFile(irrPath))
{
mIrridianceMap->setCubemapFile(FileName(irrPath));
mIrridianceMap->updateFaces();
}
if (mIrridianceMap->mCubemap.isNull())
Con::errorf("ReflectionProbe::createClientResources() - Unable to load baked irradiance map at %s", getIrradianceMapPath().c_str());
//
if (!mPrefilterMap)
{
@ -699,17 +751,8 @@ bool ReflectionProbe::createClientResources()
mPrefilterMap->createMap();
}
String prefilPath = getPrefilterMapPath();
if (Platform::isFile(prefilPath))
{
mPrefilterMap->setCubemapFile(FileName(prefilPath));
mPrefilterMap->updateFaces();
}
if (mPrefilterMap->mCubemap.isNull())
Con::errorf("ReflectionProbe::createClientResources() - Unable to load baked prefilter map at %s", getPrefilterMapPath().c_str());
mResourcesCreated = true;
mCubemapDirty = true;
return true;
}
@ -753,8 +796,9 @@ void ReflectionProbe::bake()
PROBEMGR->bakeProbe(this);
setMaskBits(CubemapMask);
setMaskBits(StaticDataMask);
}
//-----------------------------------------------------------------------------
//Rendering of editing/debug stuff
//-----------------------------------------------------------------------------
@ -812,8 +856,11 @@ void ReflectionProbe::prepRenderImage(SceneRenderState *state)
//Register
//PROBEMGR->registerProbe(mProbeInfoIdx);
if (ReflectionProbe::smRenderPreviewProbes && gEditingMission && mEditorShapeInst && mPrefilterMap != nullptr)
if (ReflectionProbe::smRenderPreviewProbes && gEditingMission && mPrefilterMap != nullptr)
{
if(!mEditorShapeInst)
createGeometry();
GFXTransformSaver saver;
// Calculate the distance of this object from the camera

View file

@ -82,19 +82,15 @@ protected:
enum MaskBits
{
TransformMask = Parent::NextFreeMask << 0,
UpdateMask = Parent::NextFreeMask << 1,
StaticDataMask = Parent::NextFreeMask << 1,
EnabledMask = Parent::NextFreeMask << 2,
CubemapMask = Parent::NextFreeMask << 3,
ModeMask = Parent::NextFreeMask << 4,
RadiusMask = Parent::NextFreeMask << 5,
ShapeTypeMask = Parent::NextFreeMask << 6,
BakeInfoMask = Parent::NextFreeMask << 7,
NextFreeMask = Parent::NextFreeMask << 8
NextFreeMask = Parent::NextFreeMask << 3
};
bool mBake;
bool mEnabled;
bool mDirty;
bool mCubemapDirty;
Resource<TSShape> mEditorShape;
TSShapeInstance* mEditorShapeInst;
@ -105,7 +101,6 @@ protected:
ProbeRenderInst::ProbeShapeType mProbeShapeType;
ProbeRenderInst* mProbeInfo;
U32 mProbeInfoIdx;
//Reflection Contribution stuff
ReflectionModeType mReflectionModeType;
@ -221,13 +216,11 @@ public:
// Create the geometry for rendering
void createGeometry();
// Get the Material instance
void updateCubemaps();
virtual void updateProbeParams();
bool createClientResources();
void processDynamicCubemap();
void processStaticCubemap();
// This is the function that allows this object to submit itself for rendering
@ -243,8 +236,6 @@ public:
String getPrefilterMapPath();
String getIrradianceMapPath();
void bake();
const U32 getProbeInfoIndex() { return mProbeInfoIdx; }
};
typedef ProbeRenderInst::ProbeShapeType ReflectProbeType;
@ -253,4 +244,4 @@ DefineEnumType(ReflectProbeType);
typedef ReflectionProbe::ReflectionModeType ReflectionModeEnum;
DefineEnumType(ReflectionModeEnum);
#endif // _ReflectionProbe_H_
#endif // _ReflectionProbe_H_

View file

@ -123,18 +123,6 @@ void Skylight::onRemove()
Parent::onRemove();
}
void Skylight::setTransform(const MatrixF & mat)
{
// Let SceneObject handle all of the matrix manipulation
Parent::setTransform(mat);
mDirty = true;
// Dirty our network mask so that the new transform gets
// transmitted to the client object
setMaskBits(TransformMask);
}
U32 Skylight::packUpdate(NetConnection *conn, U32 mask, BitStream *stream)
{
// Allow the Parent to get a crack at writing its info
@ -155,34 +143,8 @@ void Skylight::unpackUpdate(NetConnection *conn, BitStream *stream)
void Skylight::updateProbeParams()
{
mProbeShapeType = ProbeRenderInst::Skylight;
Parent::updateProbeParams();
mProbeInfo->mProbeShapeType = ProbeRenderInst::Skylight;
mProbeInfo->setPosition(getPosition());
// Skip our transform... it just dirties mask bits.
Parent::setTransform(mObjToWorld);
resetWorldBox();
F32 visDist = gClientSceneGraph->getVisibleDistance();
Box3F skylightBounds = Box3F(visDist * 2);
skylightBounds.setCenter(Point3F::Zero);
mProbeInfo->setPosition(Point3F::Zero);
mProbeInfo->mBounds = skylightBounds;
setGlobalBounds();
mProbeInfo->mIsSkylight = true;
mProbeInfo->mScore = -1.0f; //sky comes first
PROBEMGR->updateProbes();
updateCubemaps();
}
void Skylight::prepRenderImage(SceneRenderState *state)
@ -273,4 +235,4 @@ DefineEngineMethod(Skylight, postApply, void, (), ,
"A utility method for forcing a network update.\n")
{
object->inspectPostApply();
}
}

View file

@ -86,9 +86,6 @@ public:
bool onAdd();
void onRemove();
// Override this so that we can dirty the network flag when it is called
void setTransform(const MatrixF &mat);
// This function handles sending the relevant data from the server
// object to the client object
U32 packUpdate(NetConnection *conn, U32 mask, BitStream *stream);
@ -112,4 +109,4 @@ public:
void setPreviewMatParameters(SceneRenderState* renderState, BaseMatInstance* mat);
};
#endif // _Skylight_H_
#endif // _Skylight_H_

View file

@ -119,18 +119,6 @@ void SphereEnvironmentProbe::onRemove()
Parent::onRemove();
}
void SphereEnvironmentProbe::setTransform(const MatrixF & mat)
{
// Let SceneObject handle all of the matrix manipulation
Parent::setTransform(mat);
mDirty = true;
// Dirty our network mask so that the new transform gets
// transmitted to the client object
setMaskBits(TransformMask);
}
U32 SphereEnvironmentProbe::packUpdate(NetConnection *conn, U32 mask, BitStream *stream)
{
// Allow the Parent to get a crack at writing its info
@ -151,13 +139,8 @@ void SphereEnvironmentProbe::unpackUpdate(NetConnection *conn, BitStream *stream
void SphereEnvironmentProbe::updateProbeParams()
{
mProbeShapeType = ProbeRenderInst::Sphere;
Parent::updateProbeParams();
mProbeInfo->mProbeShapeType = ProbeRenderInst::Sphere;
PROBEMGR->updateProbes();
updateCubemaps();
}
void SphereEnvironmentProbe::prepRenderImage(SceneRenderState *state)
@ -234,4 +217,4 @@ void SphereEnvironmentProbe::prepRenderImage(SceneRenderState *state)
void SphereEnvironmentProbe::setPreviewMatParameters(SceneRenderState* renderState, BaseMatInstance* mat)
{
Parent::setPreviewMatParameters(renderState, mat);
}
}

View file

@ -82,9 +82,6 @@ public:
bool onAdd();
void onRemove();
// Override this so that we can dirty the network flag when it is called
void setTransform(const MatrixF &mat);
// This function handles sending the relevant data from the server
// object to the client object
U32 packUpdate(NetConnection *conn, U32 mask, BitStream *stream);
@ -108,4 +105,4 @@ public:
void setPreviewMatParameters(SceneRenderState* renderState, BaseMatInstance* mat);
};
#endif // SPHERE_ENVIRONMENT_PROBE_H
#endif // SPHERE_ENVIRONMENT_PROBE_H

View file

@ -73,7 +73,8 @@ S32 QSORT_CALLBACK AscendingReflectProbeInfluence(const void* a, const void* b)
//
//
ProbeRenderInst::ProbeRenderInst() : SystemInterface(),
ProbeRenderInst::ProbeRenderInst() :
mIsEnabled(true),
mTransform(true),
mDirty(false),
mPriority(1.0f),
@ -85,7 +86,8 @@ ProbeRenderInst::ProbeRenderInst() : SystemInterface(),
mProbeRefScale(1,1,1),
mAtten(0.0),
mCubemapIndex(0),
mIsSkylight(false)
mIsSkylight(false),
mProbeIdx(0)
{
}
@ -267,12 +269,12 @@ bool RenderProbeMgr::onAdd()
return false;
}
/*String brdfTexturePath = GFXTextureManager::getBRDFTexturePath();
String brdfTexturePath = GFXTextureManager::getBRDFTexturePath();
if (!mBRDFTexture.set(brdfTexturePath, &GFXTexturePersistentSRGBProfile, "BRDFTexture"))
{
Con::errorf("RenderProbeMgr::onAdd: Failed to load BRDF Texture");
return false;
}*/
}
return true;
}
@ -312,21 +314,21 @@ void RenderProbeMgr::addElement(RenderInst *inst)
}*/
}
void RenderProbeMgr::registerProbe(U32 probeIdx)
ProbeRenderInst* RenderProbeMgr::registerProbe(const bool &isSkylight)
{
//Mostly for consolidation, but also lets us sanity check or prep any other data we need for rendering this in one place at time of flagging for render
if (probeIdx >= ProbeRenderInst::all.size())
return;
ProbeRenderInst newProbe;
newProbe.mIsSkylight = isSkylight;
mRegisteredProbes.push_back_unique(probeIdx);
mRegisteredProbes.push_back(newProbe);
newProbe.mProbeIdx = mRegisteredProbes.size();
if (!ProbeRenderInst::all[probeIdx]->mIsSkylight)
if (!newProbe.mIsSkylight)
{
const U32 cubeIndex = _findNextEmptyCubeSlot();
if (cubeIndex == INVALID_CUBE_SLOT)
{
Con::warnf("RenderProbeMgr::addProbe: Invalid cubemap slot.");
return;
return nullptr;
}
//check if we need to resize the cubemap array
@ -349,33 +351,34 @@ void RenderProbeMgr::registerProbe(U32 probeIdx)
mCubeSlotCount += PROBE_ARRAY_SLOT_BUFFER_SIZE;
}
ProbeRenderInst::all[probeIdx]->mCubemapIndex = cubeIndex;
newProbe.mCubemapIndex = cubeIndex;
//mark cubemap slot as taken
mCubeMapSlots[cubeIndex] = true;
mCubeMapCount++;
Con::warnf("RenderProbeMgr::registerProbe: Registered probe %u to cubeIndex %u", probeIdx, cubeIndex);
Con::warnf("RenderProbeMgr::registerProbe: Registered probe %u to cubeIndex %u", newProbe.mProbeIdx, cubeIndex);
}
//rebuild our probe data
_setupStaticParameters();
mProbesDirty = true;
return &mRegisteredProbes.last();
}
void RenderProbeMgr::unregisterProbe(U32 probeIdx)
{
//Mostly for consolidation, but also lets us sanity check or prep any other data we need for rendering this in one place at time of flagging for render
if (probeIdx >= ProbeRenderInst::all.size())
if (probeIdx >= mRegisteredProbes.size())
return;
mRegisteredProbes.remove(probeIdx);
if (ProbeRenderInst::all[probeIdx]->mCubemapIndex == INVALID_CUBE_SLOT)
if (mRegisteredProbes[probeIdx].mCubemapIndex == INVALID_CUBE_SLOT)
return;
//mark cubemap slot as available now
mCubeMapSlots[ProbeRenderInst::all[probeIdx]->mCubemapIndex] = false;
mCubeMapSlots[mRegisteredProbes[probeIdx].mCubemapIndex] = false;
mCubeMapCount--;
mRegisteredProbes.erase(probeIdx);
//rebuild our probe data
_setupStaticParameters();
}
@ -407,7 +410,7 @@ void RenderProbeMgr::updateProbes()
void RenderProbeMgr::_setupStaticParameters()
{
//Array rendering
U32 probeCount = ProbeRenderInst::all.size();
U32 probeCount = mRegisteredProbes.size();
mEffectiveProbeCount = 0;
mMipCount = 0;
@ -433,10 +436,10 @@ void RenderProbeMgr::_setupStaticParameters()
irradMaps.clear();
Vector<U32> cubemapIdxes;
if (probeCount != 0 && ProbeRenderInst::all[0]->mPrefilterCubemap != nullptr)
if (probeCount != 0 && mRegisteredProbes[0].mPrefilterCubemap != nullptr)
{
//Get our mipCount
mMipCount = ProbeRenderInst::all[0]->mPrefilterCubemap.getPointer()->getMipMapLevels();
mMipCount = mRegisteredProbes[0].mPrefilterCubemap.getPointer()->getMipMapLevels();
}
else
{
@ -448,7 +451,7 @@ void RenderProbeMgr::_setupStaticParameters()
if (mEffectiveProbeCount >= MAXPROBECOUNT)
break;
const ProbeRenderInst& curEntry = *ProbeRenderInst::all[i];
const ProbeRenderInst& curEntry = mRegisteredProbes[i];
if (!curEntry.mIsEnabled)
continue;
@ -489,29 +492,21 @@ void RenderProbeMgr::_setupStaticParameters()
mProbesDirty = false;
}
void RenderProbeMgr::updateProbeTexture(ProbeRenderInst* probe)
{
//We don't stuff skylights into the array, so we can just skip out on this if it's a skylight
if (probe->mIsSkylight)
return;
S32 probeIdx = ProbeRenderInst::all.find_next(probe);
if (probeIdx != -1) //i mean, the opposite shouldn't even be possible
updateProbeTexture(probeIdx);
}
void RenderProbeMgr::updateProbeTexture(U32 probeIdx)
{
if (probeIdx >= ProbeRenderInst::all.size())
if (probeIdx >= mRegisteredProbes.size())
return;
const U32 cubeIndex = ProbeRenderInst::all[probeIdx]->mCubemapIndex;
mIrradianceArray->updateTexture(ProbeRenderInst::all[probeIdx]->mIrradianceCubemap, cubeIndex);
mPrefilterArray->updateTexture(ProbeRenderInst::all[probeIdx]->mPrefilterCubemap, cubeIndex);
//We don't stuff skylights into the array, so we can just skip out on this if it's a skylight
if (mRegisteredProbes[probeIdx].mIsSkylight)
return;
const U32 cubeIndex = mRegisteredProbes[probeIdx].mCubemapIndex;
mIrradianceArray->updateTexture(mRegisteredProbes[probeIdx].mIrradianceCubemap, cubeIndex);
mPrefilterArray->updateTexture(mRegisteredProbes[probeIdx].mPrefilterCubemap, cubeIndex);
Con::warnf("UpdatedProbeTexture - probeIdx: %u on cubeIndex %u, Irrad validity: %d, Prefilter validity: %d", probeIdx, cubeIndex,
ProbeRenderInst::all[probeIdx]->mIrradianceCubemap->isInitialized(), ProbeRenderInst::all[probeIdx]->mPrefilterCubemap->isInitialized());
mRegisteredProbes[probeIdx].mIrradianceCubemap->isInitialized(), mRegisteredProbes[probeIdx].mPrefilterCubemap->isInitialized());
}
void RenderProbeMgr::_setupPerFrameParameters(const SceneRenderState *state)
@ -593,7 +588,7 @@ void RenderProbeMgr::_update4ProbeConsts(const SceneData &sgData,
matSet.restoreSceneViewProjection();
//Array rendering
U32 probeCount = ProbeRenderInst::all.size();
U32 probeCount = mRegisteredProbes.size();
S8 bestPickProbes[4] = { -1,-1,-1,-1 };
@ -603,7 +598,7 @@ void RenderProbeMgr::_update4ProbeConsts(const SceneData &sgData,
//if (effectiveProbeCount >= MAX_FORWARD_PROBES)
// break;
const ProbeRenderInst& curEntry = *ProbeRenderInst::all[i];
const ProbeRenderInst& curEntry = mRegisteredProbes[i];
if (!curEntry.mIsEnabled)
continue;
@ -614,13 +609,13 @@ void RenderProbeMgr::_update4ProbeConsts(const SceneData &sgData,
if (dist > curEntry.mRadius || dist > curEntry.mExtents.len())
continue;
if(bestPickProbes[0] == -1 || (Point3F(sgData.objTrans->getPosition() - ProbeRenderInst::all[bestPickProbes[0]]->mPosition).len() > dist))
if(bestPickProbes[0] == -1 || (Point3F(sgData.objTrans->getPosition() - mRegisteredProbes[bestPickProbes[0]].mPosition).len() > dist))
bestPickProbes[0] = i;
else if (bestPickProbes[1] == -1 || (Point3F(sgData.objTrans->getPosition() - ProbeRenderInst::all[bestPickProbes[1]]->mPosition).len() > dist))
else if (bestPickProbes[1] == -1 || (Point3F(sgData.objTrans->getPosition() - mRegisteredProbes[bestPickProbes[1]].mPosition).len() > dist))
bestPickProbes[1] = i;
else if (bestPickProbes[2] == -1 || (Point3F(sgData.objTrans->getPosition() - ProbeRenderInst::all[bestPickProbes[2]]->mPosition).len() > dist))
else if (bestPickProbes[2] == -1 || (Point3F(sgData.objTrans->getPosition() - mRegisteredProbes[bestPickProbes[2]].mPosition).len() > dist))
bestPickProbes[2] = i;
else if (bestPickProbes[3] == -1 || (Point3F(sgData.objTrans->getPosition() - ProbeRenderInst::all[bestPickProbes[3]]->mPosition).len() > dist))
else if (bestPickProbes[3] == -1 || (Point3F(sgData.objTrans->getPosition() - mRegisteredProbes[bestPickProbes[3]].mPosition).len() > dist))
bestPickProbes[3] = i;
}
}
@ -631,7 +626,7 @@ void RenderProbeMgr::_update4ProbeConsts(const SceneData &sgData,
if (bestPickProbes[i] == -1)
continue;
const ProbeRenderInst& curEntry = *ProbeRenderInst::all[bestPickProbes[i]];
const ProbeRenderInst& curEntry = mRegisteredProbes[bestPickProbes[i]];
probePositionArray[effectiveProbeCount] = curEntry.getPosition();
probeRefPositionArray[effectiveProbeCount] = curEntry.mProbeRefOffset;
@ -666,8 +661,8 @@ void RenderProbeMgr::_update4ProbeConsts(const SceneData &sgData,
shaderConsts->setSafe(probeShaderConsts->mProbeBoxMaxSC, probeBoxMaxArray);
shaderConsts->setSafe(probeShaderConsts->mProbeConfigDataSC, probeConfigArray);
//if (mBRDFTexture.isValid())
// GFX->setTexture(3, mBRDFTexture);
if (mBRDFTexture.isValid())
GFX->setTexture(3, mBRDFTexture);
if(probeShaderConsts->mProbeSpecularCubemapSC->getSamplerRegister() != -1)
GFX->setCubeArrayTexture(probeShaderConsts->mProbeSpecularCubemapSC->getSamplerRegister(), mPrefilterArray);
@ -680,12 +675,12 @@ void RenderProbeMgr::_update4ProbeConsts(const SceneData &sgData,
&& probeShaderConsts->mSkylightSpecularMap->isValid())
{
//Array rendering
U32 probeCount = ProbeRenderInst::all.size();
U32 probeCount = mRegisteredProbes.size();
bool hasSkylight = false;
for (U32 i = 0; i < probeCount; i++)
{
const ProbeRenderInst& curEntry = *ProbeRenderInst::all[i];
const ProbeRenderInst& curEntry = mRegisteredProbes[i];
if (!curEntry.mIsEnabled)
continue;
@ -754,8 +749,6 @@ void RenderProbeMgr::setProbeInfo(ProcessedMaterial *pmat,
//-----------------------------------------------------------------------------
void RenderProbeMgr::render( SceneRenderState *state )
{
return;
//PROFILE_SCOPE(RenderProbeMgr_render);
if (getProbeArrayEffect() == nullptr)
return;
@ -763,7 +756,7 @@ void RenderProbeMgr::render( SceneRenderState *state )
_setupStaticParameters();
// Early out if nothing to draw.
if (!RenderProbeMgr::smRenderReflectionProbes || !state->isDiffusePass() || (!ProbeRenderInst::all.size() || mEffectiveProbeCount == 0 || mCubeMapCount != 0 ) && !mHasSkylight)
if (!RenderProbeMgr::smRenderReflectionProbes || !state->isDiffusePass() || (!mRegisteredProbes.size() || mEffectiveProbeCount == 0 || mCubeMapCount != 0 ) && !mHasSkylight)
{
getProbeArrayEffect()->setSkip(true);
return;
@ -791,7 +784,7 @@ void RenderProbeMgr::render( SceneRenderState *state )
mProbeArrayEffect->setShaderMacro("DEBUGVIZ_CONTRIB", useDebugContrib);
//Array rendering
//U32 probeCount = ProbeRenderInst::all.size();
//U32 probeCount = mRegisteredProbes.size();
mProbeArrayEffect->setShaderConst("$hasSkylight", (float)mHasSkylight);
if (mHasSkylight)
@ -805,7 +798,7 @@ void RenderProbeMgr::render( SceneRenderState *state )
mProbeArrayEffect->setShaderConst("$cubeMips", (float)mMipCount);
if (mEffectiveProbeCount != 0)
{
//mProbeArrayEffect->setTexture(3, mBRDFTexture);
mProbeArrayEffect->setTexture(3, mBRDFTexture);
mProbeArrayEffect->setCubemapArrayTexture(4, mPrefilterArray);
mProbeArrayEffect->setCubemapArrayTexture(5, mIrradianceArray);

View file

@ -57,8 +57,10 @@ static U32 MAXPROBECOUNT = 50;
class PostEffect;
class ReflectionProbe;
struct ProbeRenderInst : public SystemInterface<ProbeRenderInst>
struct ProbeRenderInst
{
bool mIsEnabled;
MatrixF mTransform;
F32 mRadius;
@ -99,6 +101,8 @@ struct ProbeRenderInst : public SystemInterface<ProbeRenderInst>
U32 mCubemapIndex;
U32 mProbeIdx;
public:
ProbeRenderInst();
@ -124,6 +128,11 @@ public:
F32 getScore() const { return mScore; }
void clear();
inline bool ProbeRenderInst::operator ==(const ProbeRenderInst& b) const
{
return mProbeIdx == b.mProbeIdx;
}
};
struct ProbeShaderConstants
@ -168,7 +177,7 @@ class RenderProbeMgr : public RenderBinManager
{
typedef RenderBinManager Parent;
Vector<U32> mRegisteredProbes;
Vector<ProbeRenderInst> mRegisteredProbes;
bool mProbesDirty;
@ -254,7 +263,6 @@ protected:
GFXShaderConstBuffer *shaderConsts);
void _setupStaticParameters();
void updateProbeTexture(U32 probeIdx);
void _setupPerFrameParameters(const SceneRenderState *state);
virtual void addElement(RenderInst *inst);
virtual void render(SceneRenderState * state);
@ -263,29 +271,6 @@ protected:
PostEffect* getProbeArrayEffect();
public:
// RenderBinMgr
void updateProbes();
void updateProbeTexture(ProbeRenderInst* probe);
/// Returns the active LM.
static inline RenderProbeMgr* getProbeManager();
void registerProbe(U32 probeIdx);
void unregisterProbe(U32 probeIdx);
virtual void setProbeInfo(ProcessedMaterial *pmat,
const Material *mat,
const SceneData &sgData,
const SceneRenderState *state,
U32 pass,
GFXShaderConstBuffer *shaderConsts);
/// Debug rendering
static bool smRenderReflectionProbes;
void bakeProbe(ReflectionProbe *probeInfo);
void bakeProbes();
U32 _findNextEmptyCubeSlot()
{
@ -296,6 +281,31 @@ public:
}
return INVALID_CUBE_SLOT;
}
public:
// RenderBinMgr
void updateProbes();
/// Returns the active LM.
static inline RenderProbeMgr* getProbeManager();
ProbeRenderInst* registerProbe(const bool& isSkylight);
void unregisterProbe(U32 probeIdx);
virtual void setProbeInfo(ProcessedMaterial *pmat,
const Material *mat,
const SceneData &sgData,
const SceneRenderState *state,
U32 pass,
GFXShaderConstBuffer *shaderConsts);
void updateProbeTexture(U32 probeIdx);
/// Debug rendering
static bool smRenderReflectionProbes;
void bakeProbe(ReflectionProbe *probeInfo);
void bakeProbes();
};
RenderProbeMgr* RenderProbeMgr::getProbeManager()