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..7d275585a 100644 --- a/Engine/source/T3D/levelInfo.cpp +++ b/Engine/source/T3D/levelInfo.cpp @@ -36,7 +36,7 @@ #include "math/mathIO.h" #include "torqueConfig.h" - +#include "T3D/accumulationVolume.h" IMPLEMENT_CO_NETOBJECT_V1(LevelInfo); @@ -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 @@ -107,6 +111,11 @@ LevelInfo::LevelInfo() LevelInfo::~LevelInfo() { LightManager::smActivateSignal.remove(this, &LevelInfo::_onLMActivate); + if (!mAccuTexture.isNull()) + { + mAccuTexture.free(); + gLevelAccuMap.free(); + } } //----------------------------------------------------------------------------- @@ -157,6 +166,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 +215,8 @@ U32 LevelInfo::packUpdate(NetConnection *conn, U32 mask, BitStream *stream) sfxWrite( stream, mSoundAmbience ); stream->writeInt( mSoundDistanceModel, 1 ); - + + stream->write(mAccuTextureName); return retMask; } @@ -248,6 +261,8 @@ void LevelInfo::unpackUpdate(NetConnection *conn, BitStream *stream) SFX->setDistanceModel( mSoundDistanceModel ); } + stream->read(&mAccuTextureName); + setLevelAccuTexture(mAccuTextureName); } //----------------------------------------------------------------------------- @@ -341,4 +356,26 @@ 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; + } + AccumulationVolume::refreshVolumes(); } \ 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); /// @} }; diff --git a/Engine/source/T3D/shapeBase.cpp b/Engine/source/T3D/shapeBase.cpp index 4bca5f23b..69931c85b 100644 --- a/Engine/source/T3D/shapeBase.cpp +++ b/Engine/source/T3D/shapeBase.cpp @@ -1044,7 +1044,11 @@ bool ShapeBase::onAdd() if(mDataBlock->cloakTexName != StringTable->insert("")) mCloakTexture = TextureHandle(mDataBlock->cloakTexName, MeshTexture, false); */ - + // Accumulation and environment mapping + if (isClientObject() && mShapeInstance) + { + AccumulationVolume::addObject(this); + } return true; } diff --git a/Engine/source/T3D/tsStatic.cpp b/Engine/source/T3D/tsStatic.cpp index be0da4cf8..3997d40dd 100644 --- a/Engine/source/T3D/tsStatic.cpp +++ b/Engine/source/T3D/tsStatic.cpp @@ -310,11 +310,10 @@ bool TSStatic::onAdd() _updateShouldTick(); - // Accumulation - if ( isClientObject() && mShapeInstance ) + // Accumulation and environment mapping + if (isClientObject() && mShapeInstance) { - if ( mShapeInstance->hasAccumulation() ) - AccumulationVolume::addObject(this); + AccumulationVolume::addObject(this); } return true;