basicSceneObjectLightingPlugin.cpp
Engine/source/lighting/basic/basicSceneObjectLightingPlugin.cpp
Public Variables
Detailed Description
Public Variables
MODULE_END
MODULE_INIT
MODULE_SHUTDOWN
const U32 shadowObjectTypeMask
1 2//----------------------------------------------------------------------------- 3// Copyright (c) 2012 GarageGames, LLC 4// 5// Permission is hereby granted, free of charge, to any person obtaining a copy 6// of this software and associated documentation files (the "Software"), to 7// deal in the Software without restriction, including without limitation the 8// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 9// sell copies of the Software, and to permit persons to whom the Software is 10// furnished to do so, subject to the following conditions: 11// 12// The above copyright notice and this permission notice shall be included in 13// all copies or substantial portions of the Software. 14// 15// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21// IN THE SOFTWARE. 22//----------------------------------------------------------------------------- 23 24#include "platform/platform.h" 25#include "lighting/basic/basicSceneObjectLightingPlugin.h" 26 27#include "lighting/lightManager.h" 28#include "lighting/shadowMap/shadowMapPass.h" 29#include "lighting/shadowMap/shadowMapManager.h" 30#include "lighting/common/projectedShadow.h" 31#include "T3D/shapeBase.h" 32#include "gfx/gfxDevice.h" 33#include "gfx/gfxTransformSaver.h" 34#include "ts/tsRenderState.h" 35#include "gfx/sim/cubemapData.h" 36#include "scene/reflector.h" 37#include "T3D/decal/decalManager.h" 38#include "core/module.h" 39 40 41MODULE_BEGIN( BasicSceneObjectLightingPlugin ) 42 43 MODULE_INIT 44 { 45 BasicSceneObjectPluginFactory::createSingleton(); 46 } 47 48 MODULE_SHUTDOWN 49 { 50 BasicSceneObjectPluginFactory::deleteSingleton(); 51 } 52 53MODULE_END; 54 55 56static const U32 shadowObjectTypeMask = PlayerObjectType | CorpseObjectType | ItemObjectType | VehicleObjectType; 57Vector<BasicSceneObjectLightingPlugin*> BasicSceneObjectLightingPlugin::smPluginInstances( __FILE__, __LINE__ ); 58 59BasicSceneObjectLightingPlugin::BasicSceneObjectLightingPlugin(SceneObject* parent) 60 : mParentObject( parent ) 61{ 62 mShadow = NULL; 63 64 // Stick us on the list. 65 smPluginInstances.push_back( this ); 66} 67 68BasicSceneObjectLightingPlugin::~BasicSceneObjectLightingPlugin() 69{ 70 SAFE_DELETE( mShadow ); 71 72 // Delete us from the list. 73 smPluginInstances.remove( this ); 74} 75 76void BasicSceneObjectLightingPlugin::reset() 77{ 78 SAFE_DELETE( mShadow ); 79} 80 81void BasicSceneObjectLightingPlugin::cleanupPluginInstances() 82{ 83 for (U32 i = 0; i < smPluginInstances.size(); i++) 84 { 85 BasicSceneObjectLightingPlugin *plug = smPluginInstances[i]; 86 smPluginInstances.remove( plug ); 87 delete plug; 88 i--; 89 } 90 91 smPluginInstances.clear(); 92} 93 94void BasicSceneObjectLightingPlugin::resetAll() 95{ 96 for( U32 i = 0, num = smPluginInstances.size(); i < num; ++ i ) 97 smPluginInstances[ i ]->reset(); 98} 99 100const F32 BasicSceneObjectLightingPlugin::getScore() const 101{ 102 return mShadow ? mShadow->getScore() : 0.0f; 103} 104 105void BasicSceneObjectLightingPlugin::updateShadow( SceneRenderState *state ) 106{ 107 if ( !mShadow ) 108 mShadow = new ProjectedShadow( mParentObject ); 109 110 mShadow->update( state ); 111} 112 113void BasicSceneObjectLightingPlugin::renderShadow( SceneRenderState *state ) 114{ 115 // hack until new scenegraph in place 116 GFXTransformSaver ts; 117 118 TSRenderState rstate; 119 rstate.setSceneState(state); 120 121 F32 camDist = (state->getCameraPosition() - mParentObject->getRenderPosition()).len(); 122 123 // Make sure the shadow wants to be rendered 124 if( mShadow->shouldRender( state ) ) 125 { 126 // Render! (and note the time) 127 mShadow->render( camDist, rstate ); 128 } 129} 130 131BasicSceneObjectPluginFactory::BasicSceneObjectPluginFactory() 132 : mEnabled( false ) 133{ 134 LightManager::smActivateSignal.notify( this, &BasicSceneObjectPluginFactory::_onLMActivate ); 135 136 ShadowMapManager::smShadowDeactivateSignal.notify( this, &BasicSceneObjectPluginFactory::_setEnabled ); 137} 138 139BasicSceneObjectPluginFactory::~BasicSceneObjectPluginFactory() 140{ 141 LightManager::smActivateSignal.remove( this, &BasicSceneObjectPluginFactory::_onLMActivate ); 142 143 ShadowMapManager::smShadowDeactivateSignal.remove( this, &BasicSceneObjectPluginFactory::_setEnabled ); 144} 145 146void BasicSceneObjectPluginFactory::_onLMActivate( const char *lm, bool enable ) 147{ 148 _setEnabled(); 149} 150 151void BasicSceneObjectPluginFactory::_setEnabled() 152{ 153 bool enable = false; 154 155 // Enabled if using basic lighting. 156 LightManager *lm = LightManager::getActiveLM(); 157 if ( lm && dStricmp( lm->getName(), "Basic Lighting" ) == 0 ) 158 enable = true; 159 160 // Disabled if all shadows are explictly disabled. 161 if ( ShadowMapPass::smDisableShadows ) 162 enable = false; 163 164 // Already at the desired state. 165 if ( enable == mEnabled ) 166 return; 167 168 if ( enable ) 169 { 170 SceneObject::smSceneObjectAdd.notify(this, &BasicSceneObjectPluginFactory::addLightPlugin); 171 SceneObject::smSceneObjectRemove.notify(this, &BasicSceneObjectPluginFactory::removeLightPlugin); 172 173 if( gDecalManager ) 174 gDecalManager->getClearDataSignal().notify( this, &BasicSceneObjectPluginFactory::_onDecalManagerClear ); 175 176 addToExistingObjects(); 177 } 178 else 179 { 180 SceneObject::smSceneObjectAdd.remove(this, &BasicSceneObjectPluginFactory::addLightPlugin); 181 SceneObject::smSceneObjectRemove.remove(this, &BasicSceneObjectPluginFactory::removeLightPlugin); 182 183 if( gDecalManager ) 184 gDecalManager->getClearDataSignal().remove( this, &BasicSceneObjectPluginFactory::_onDecalManagerClear ); 185 186 BasicSceneObjectLightingPlugin::cleanupPluginInstances(); 187 } 188 189 mEnabled = enable; 190} 191 192void BasicSceneObjectPluginFactory::_onDecalManagerClear() 193{ 194 BasicSceneObjectLightingPlugin::resetAll(); 195} 196 197void BasicSceneObjectPluginFactory::removeLightPlugin( SceneObject *obj ) 198{ 199 // Grab the plugin instance. 200 SceneObjectLightingPlugin *lightPlugin = obj->getLightingPlugin(); 201 202 // Delete it, which will also remove it 203 // from the static list of plugin instances. 204 if ( lightPlugin ) 205 { 206 delete lightPlugin; 207 obj->setLightingPlugin( NULL ); 208 } 209} 210 211void BasicSceneObjectPluginFactory::addLightPlugin(SceneObject* obj) 212{ 213 bool serverObj = obj->isServerObject(); 214 bool isShadowType = (obj->getTypeMask() & shadowObjectTypeMask); 215 216 if ( !isShadowType || serverObj ) 217 return; 218 219 obj->setLightingPlugin(new BasicSceneObjectLightingPlugin(obj)); 220} 221 222// Some objects may not get cleaned up during mission load/free, so add our 223// plugin to existing scene objects 224void BasicSceneObjectPluginFactory::addToExistingObjects() 225{ 226 SimpleQueryList sql; 227 gClientContainer.findObjects( shadowObjectTypeMask, SimpleQueryList::insertionCallback, &sql); 228 for (SceneObject** i = sql.mList.begin(); i != sql.mList.end(); i++) 229 addLightPlugin(*i); 230} 231 232