Pārlūkot izejas kodu

Merge pull request #1642 from Azaezel/globalAccumulation

level-wide accumulation assignment
Anis 9 gadi atpakaļ
vecāks
revīzija
4c59f39c09

+ 4 - 2
Engine/source/T3D/accumulationVolume.cpp

@@ -46,6 +46,8 @@
 Vector< SimObjectPtr<SceneObject> > AccumulationVolume::smAccuObjects;
 Vector< SimObjectPtr<AccumulationVolume> > AccumulationVolume::smAccuVolumes;
 
+GFXTexHandle gLevelAccuMap;
+
 //#define DEBUG_DRAW
 
 IMPLEMENT_CO_NETOBJECT_V1( AccumulationVolume );
@@ -295,7 +297,7 @@ void AccumulationVolume::refreshVolumes()
    {
       SimObjectPtr<SceneObject> 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)
    {

+ 39 - 2
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();
 }

+ 11 - 1
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);
       /// @}
 };
 

+ 5 - 1
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;
 }
 

+ 3 - 4
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;