Torque3D Documentation / _generateds / basicSceneObjectLightingPlugin.cpp

basicSceneObjectLightingPlugin.cpp

Engine/source/lighting/basic/basicSceneObjectLightingPlugin.cpp

More...

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