From 2b57bed899b7ca14aa23bf78a92539422d145767 Mon Sep 17 00:00:00 2001 From: Azaezel Date: Thu, 9 Jun 2016 12:51:43 -0500 Subject: [PATCH] level-wide accumulation assignment - overidden if an object's origin is in an accumulationVolume. ** do note changing the value does require nudging a mesh and/or a level reload to kick in at time of writing for visual feedback. --- Engine/source/T3D/accumulationVolume.cpp | 6 +++-- Engine/source/T3D/levelInfo.cpp | 33 +++++++++++++++++++++++- Engine/source/T3D/levelInfo.h | 12 ++++++++- 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/Engine/source/T3D/accumulationVolume.cpp b/Engine/source/T3D/accumulationVolume.cpp index 7eef90634..f868207e6 100644 --- a/Engine/source/T3D/accumulationVolume.cpp +++ b/Engine/source/T3D/accumulationVolume.cpp @@ -46,6 +46,8 @@ Vector< SimObjectPtr > AccumulationVolume::smAccuObjects; Vector< SimObjectPtr > AccumulationVolume::smAccuVolumes; +GFXTexHandle gLevelAccuMap; + //#define DEBUG_DRAW IMPLEMENT_CO_NETOBJECT_V1( AccumulationVolume ); @@ -295,7 +297,7 @@ void AccumulationVolume::refreshVolumes() { SimObjectPtr object = smAccuObjects[n]; if ( object.isValid() ) - object->mAccuTex = GFXTexHandle::ZERO; + object->mAccuTex = gLevelAccuMap; } // @@ -336,7 +338,7 @@ void AccumulationVolume::updateObject(SceneObject* object) // We use ZERO instead of NULL so the accumulation // texture will be updated in renderMeshMgr. - object->mAccuTex = GFXTexHandle::ZERO; + object->mAccuTex = gLevelAccuMap; for (S32 i = 0; i < smAccuVolumes.size(); ++i) { diff --git a/Engine/source/T3D/levelInfo.cpp b/Engine/source/T3D/levelInfo.cpp index 33cd44f18..55c3b834f 100644 --- a/Engine/source/T3D/levelInfo.cpp +++ b/Engine/source/T3D/levelInfo.cpp @@ -69,6 +69,8 @@ extern ColorI gCanvasClearColor; /// @see DecalManager extern F32 gDecalBias; +/// @see AccumulationVolume +extern GFXTexHandle gLevelAccuMap; /// Default SFXAmbience used to reset the global soundscape. static SFXAmbience sDefaultAmbience; @@ -96,6 +98,8 @@ LevelInfo::LevelInfo() mNetFlags.set( ScopeAlways | Ghostable ); mAdvancedLightmapSupport = false; + mAccuTextureName = ""; + mAccuTexture = NULL; // Register with the light manager activation signal, and we need to do it first // so the advanced light bin manager can be instructed about MRT lightmaps @@ -157,6 +161,9 @@ void LevelInfo::initPersistFields() addField( "advancedLightmapSupport", TypeBool, Offset( mAdvancedLightmapSupport, LevelInfo ), "Enable expanded support for mixing static and dynamic lighting (more costly)" ); + addProtectedField("AccuTexture", TypeStringFilename, Offset(mAccuTextureName, LevelInfo), + &_setLevelAccuTexture, &defaultProtectedGetFn, "Accumulation texture."); + endGroup( "Lighting" ); addGroup( "Sound" ); @@ -203,7 +210,8 @@ U32 LevelInfo::packUpdate(NetConnection *conn, U32 mask, BitStream *stream) sfxWrite( stream, mSoundAmbience ); stream->writeInt( mSoundDistanceModel, 1 ); - + + stream->write(mAccuTextureName); return retMask; } @@ -248,6 +256,8 @@ void LevelInfo::unpackUpdate(NetConnection *conn, BitStream *stream) SFX->setDistanceModel( mSoundDistanceModel ); } + stream->read(&mAccuTextureName); + setLevelAccuTexture(mAccuTextureName); } //----------------------------------------------------------------------------- @@ -341,4 +351,25 @@ void LevelInfo::_onLMActivate(const char *lm, bool enable) lightMgr->getLightBinManager()->MRTLightmapsDuringPrePass(mAdvancedLightmapSupport); } #endif +} + +bool LevelInfo::_setLevelAccuTexture(void *object, const char *index, const char *data) +{ + LevelInfo* volume = reinterpret_cast< LevelInfo* >(object); + volume->setLevelAccuTexture(data); + return false; +} + + +void LevelInfo::setLevelAccuTexture(const String& name) +{ + mAccuTextureName = name; + if (isClientObject() && mAccuTextureName.isNotEmpty()) + { + mAccuTexture.set(mAccuTextureName, &GFXDefaultStaticDiffuseProfile, "AccumulationVolume::mAccuTexture"); + if (mAccuTexture.isNull()) + Con::warnf("AccumulationVolume::setTexture - Unable to load texture: %s", mAccuTextureName.c_str()); + else + gLevelAccuMap = mAccuTexture; + } } \ No newline at end of file diff --git a/Engine/source/T3D/levelInfo.h b/Engine/source/T3D/levelInfo.h index cc4459ae4..dbdaec941 100644 --- a/Engine/source/T3D/levelInfo.h +++ b/Engine/source/T3D/levelInfo.h @@ -36,6 +36,10 @@ #include "sfx/sfxCommon.h" #endif +#ifndef _GFXTEXTUREHANDLE_H_ +#include "gfx/gfxTextureHandle.h" +#endif + class SFXAmbience; class SFXSoundscape; @@ -96,6 +100,9 @@ class LevelInfo : public NetObject void _updateSceneGraph(); void _onLMActivate(const char *lm, bool enable); + protected: + // Name (path) of the accumulation texture. + String mAccuTextureName; public: @@ -130,9 +137,12 @@ class LevelInfo : public NetObject UpdateMask = BIT(0) }; + GFXTexHandle mAccuTexture; + virtual U32 packUpdate( NetConnection *conn, U32 mask, BitStream *stream ); virtual void unpackUpdate( NetConnection *conn, BitStream *stream ); - + static bool _setLevelAccuTexture(void *object, const char *index, const char *data); + void setLevelAccuTexture(const String& name); /// @} };