2
0

basicSceneObjectLightingPlugin.cpp 7.1 KB

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