diff --git a/Engine/source/T3D/levelInfo.cpp b/Engine/source/T3D/levelInfo.cpp index 8edb6993f..bd0eb6f96 100644 --- a/Engine/source/T3D/levelInfo.cpp +++ b/Engine/source/T3D/levelInfo.cpp @@ -68,7 +68,7 @@ extern ColorI gCanvasClearColor; /// @see DecalManager extern F32 gDecalBias; - +extern LinearColorF gFallbackAmbient; /// @see AccumulationVolume extern GFXTexHandle gLevelAccuMap; @@ -86,6 +86,7 @@ LevelInfo::LevelInfo() mDecalBias( 0.0015f ), mCanvasClearColor( 255, 0, 255, 255 ), mAmbientLightBlendPhase( 1.f ), + mFallbackAmbient(LinearColorF(0.1f, 0.1f, 0.1f, 1.0f)), mSoundAmbience( NULL ), mSoundDistanceModel( SFXDistanceModelLinear ), mSoundscape( NULL ) @@ -163,6 +164,8 @@ void LevelInfo::initPersistFields() addField( "ambientLightBlendCurve", TypeEaseF, Offset( mAmbientLightBlendCurve, LevelInfo ), "Interpolation curve to use for blending from one ambient light color to a different one." ); + addField("fallbackAmbient", TypeColorF, Offset(mFallbackAmbient, LevelInfo), + "Ambient Color to use if no global light source exists."); //addField( "advancedLightmapSupport", TypeBool, Offset( mAdvancedLightmapSupport, LevelInfo ), // "Enable expanded support for mixing static and dynamic lighting (more costly)" ); @@ -211,6 +214,7 @@ U32 LevelInfo::packUpdate(NetConnection *conn, U32 mask, BitStream *stream) stream->writeFlag( mAdvancedLightmapSupport ); stream->write( mAmbientLightBlendPhase ); mathWrite( *stream, mAmbientLightBlendCurve ); + stream->write(mFallbackAmbient); sfxWrite( stream, mSoundAmbience ); stream->writeInt( mSoundDistanceModel, 1 ); @@ -241,6 +245,7 @@ void LevelInfo::unpackUpdate(NetConnection *conn, BitStream *stream) mAdvancedLightmapSupport = stream->readFlag(); stream->read( &mAmbientLightBlendPhase ); mathRead( *stream, &mAmbientLightBlendCurve ); + stream->read(&mFallbackAmbient); String errorStr; if( !sfxReadAndResolve( stream, &mSoundAmbience, errorStr ) ) @@ -323,8 +328,8 @@ void LevelInfo::_updateSceneGraph() scene->setVisibleGhostDistance( mVisibleGhostDistance ); gDecalBias = mDecalBias; - // Set ambient lighting properties. + gFallbackAmbient = mFallbackAmbient; scene->setAmbientLightTransitionTime( mAmbientLightBlendPhase * 1000.f ); scene->setAmbientLightTransitionCurve( mAmbientLightBlendCurve ); diff --git a/Engine/source/T3D/levelInfo.h b/Engine/source/T3D/levelInfo.h index 122d7ad8d..084726f4e 100644 --- a/Engine/source/T3D/levelInfo.h +++ b/Engine/source/T3D/levelInfo.h @@ -78,7 +78,7 @@ class LevelInfo : public NetObject /// Interpolation for going from one global ambient color /// to a different one. EaseF mAmbientLightBlendCurve; - + LinearColorF mFallbackAmbient; /// @} /// @name Sound Properties diff --git a/Engine/source/lighting/lightManager.cpp b/Engine/source/lighting/lightManager.cpp index 57a1936f5..11cd361ff 100644 --- a/Engine/source/lighting/lightManager.cpp +++ b/Engine/source/lighting/lightManager.cpp @@ -42,6 +42,7 @@ Signal LightManager::smActivateSignal; LightManager *LightManager::smActiveLM = NULL; +LinearColorF gFallbackAmbient; LightManager::LightManager( const char *name, const char *id ) : mName( name ), @@ -162,19 +163,28 @@ LightInfo* LightManager::getDefaultLight() { // The sun is always our default light when // when its registered. - if ( mSpecialLights[ LightManager::slSunLightType ] ) - return mSpecialLights[ LightManager::slSunLightType ]; + if (mSpecialLights[LightManager::slSunLightType]) + { + mSpecialLights[LightManager::slSunLightType]->setAmbient(gFallbackAmbient); + return mSpecialLights[LightManager::slSunLightType]; + } // Else return a dummy special light. - if ( !mDefaultLight ) + if (!mDefaultLight) + { mDefaultLight = createLightInfo(); + } + mDefaultLight->setAmbient(gFallbackAmbient); return mDefaultLight; } LightInfo* LightManager::getSpecialLight( LightManager::SpecialLightTypesEnum type, bool useDefault ) { - if ( mSpecialLights[type] ) + if (mSpecialLights[type]) + { + mSpecialLights[LightManager::slSunLightType]->setAmbient(gFallbackAmbient); return mSpecialLights[type]; + } if ( useDefault ) return getDefaultLight();