Torque3D Documentation / _generateds / renderPassManager.cpp

renderPassManager.cpp

Engine/source/renderInstance/renderPassManager.cpp

More...

Public Functions

ConsoleDocClass(RenderPassManager , "@brief A grouping of <a href="/coding/file/editortool_8cpp/#editortool_8cpp_1a4cb041169a32ea3d4cacadbb955e06b4">render</a> bin managers which forms <a href="/coding/file/pointer_8h/#pointer_8h_1aeeddce917cf130d62c370b8f216026dd">a</a> <a href="/coding/file/editortool_8cpp/#editortool_8cpp_1a4cb041169a32ea3d4cacadbb955e06b4">render</a> <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">pass.\n\n</a>" "The <a href="/coding/file/editortool_8cpp/#editortool_8cpp_1a4cb041169a32ea3d4cacadbb955e06b4">render</a> pass is used <a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1a5bafda9519252aa2d0fd038153f77dca">to</a> order <a href="/coding/file/pointer_8h/#pointer_8h_1aeeddce917cf130d62c370b8f216026dd">a</a> set of <a href="/coding/class/classrenderbinmanager/">RenderBinManager</a> objects which are used " "when rendering <a href="/coding/file/pointer_8h/#pointer_8h_1aeeddce917cf130d62c370b8f216026dd">a</a> scene. This class does little work itself other than managing " "its list of <a href="/coding/file/editortool_8cpp/#editortool_8cpp_1a4cb041169a32ea3d4cacadbb955e06b4">render</a> <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">bins.\n\n</a>" "In 'core/scripts/client/renderManager." TORQUE_SCRIPT_EXTENSION "' you will find the DiffuseRenderPassManager " "which is used by the C++ engine <a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1a5bafda9519252aa2d0fd038153f77dca">to</a> <a href="/coding/file/editortool_8cpp/#editortool_8cpp_1a4cb041169a32ea3d4cacadbb955e06b4">render</a> the <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">scene.\n\n</a>" "@see <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">RenderBinManager\n</a>" "@ingroup <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">RenderBin\n</a>" )
DefineEngineMethod(RenderPassManager , addManager , void , (RenderBinManager *renderBin) , "Add as <a href="/coding/file/pointer_8h/#pointer_8h_1aeeddce917cf130d62c370b8f216026dd">a</a> <a href="/coding/file/editortool_8cpp/#editortool_8cpp_1a4cb041169a32ea3d4cacadbb955e06b4">render</a> bin manager <a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1a5bafda9519252aa2d0fd038153f77dca">to</a> the pass." )
DefineEngineMethod(RenderPassManager , getManager , RenderBinManager * , (S32 index) , "Returns the <a href="/coding/file/editortool_8cpp/#editortool_8cpp_1a4cb041169a32ea3d4cacadbb955e06b4">render</a> bin manager at the index or null <a href="/coding/file/tsmeshintrinsics_8cpp/#tsmeshintrinsics_8cpp_1a4e4fa7e3399708e0777b5308db01278c">if</a> the index is out of range." )
DefineEngineMethod(RenderPassManager , getManagerCount , S32 , () , "Returns the total number of bin managers." )
DefineEngineMethod(RenderPassManager , removeManager , void , (RenderBinManager *renderBin) , "Removes <a href="/coding/file/pointer_8h/#pointer_8h_1aeeddce917cf130d62c370b8f216026dd">a</a> <a href="/coding/file/editortool_8cpp/#editortool_8cpp_1a4cb041169a32ea3d4cacadbb955e06b4">render</a> bin manager." )

Detailed Description

Public Functions

ConsoleDocClass(RenderPassManager , "@brief A grouping of <a href="/coding/file/editortool_8cpp/#editortool_8cpp_1a4cb041169a32ea3d4cacadbb955e06b4">render</a> bin managers which forms <a href="/coding/file/pointer_8h/#pointer_8h_1aeeddce917cf130d62c370b8f216026dd">a</a> <a href="/coding/file/editortool_8cpp/#editortool_8cpp_1a4cb041169a32ea3d4cacadbb955e06b4">render</a> <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">pass.\n\n</a>" "The <a href="/coding/file/editortool_8cpp/#editortool_8cpp_1a4cb041169a32ea3d4cacadbb955e06b4">render</a> pass is used <a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1a5bafda9519252aa2d0fd038153f77dca">to</a> order <a href="/coding/file/pointer_8h/#pointer_8h_1aeeddce917cf130d62c370b8f216026dd">a</a> set of <a href="/coding/class/classrenderbinmanager/">RenderBinManager</a> objects which are used " "when rendering <a href="/coding/file/pointer_8h/#pointer_8h_1aeeddce917cf130d62c370b8f216026dd">a</a> scene. This class does little work itself other than managing " "its list of <a href="/coding/file/editortool_8cpp/#editortool_8cpp_1a4cb041169a32ea3d4cacadbb955e06b4">render</a> <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">bins.\n\n</a>" "In 'core/scripts/client/renderManager." TORQUE_SCRIPT_EXTENSION "' you will find the DiffuseRenderPassManager " "which is used by the C++ engine <a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1a5bafda9519252aa2d0fd038153f77dca">to</a> <a href="/coding/file/editortool_8cpp/#editortool_8cpp_1a4cb041169a32ea3d4cacadbb955e06b4">render</a> the <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">scene.\n\n</a>" "@see <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">RenderBinManager\n</a>" "@ingroup <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">RenderBin\n</a>" )

DefineEngineMethod(RenderPassManager , addManager , void , (RenderBinManager *renderBin) , "Add as <a href="/coding/file/pointer_8h/#pointer_8h_1aeeddce917cf130d62c370b8f216026dd">a</a> <a href="/coding/file/editortool_8cpp/#editortool_8cpp_1a4cb041169a32ea3d4cacadbb955e06b4">render</a> bin manager <a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1a5bafda9519252aa2d0fd038153f77dca">to</a> the pass." )

DefineEngineMethod(RenderPassManager , getManager , RenderBinManager * , (S32 index) , "Returns the <a href="/coding/file/editortool_8cpp/#editortool_8cpp_1a4cb041169a32ea3d4cacadbb955e06b4">render</a> bin manager at the index or null <a href="/coding/file/tsmeshintrinsics_8cpp/#tsmeshintrinsics_8cpp_1a4e4fa7e3399708e0777b5308db01278c">if</a> the index is out of range." )

DefineEngineMethod(RenderPassManager , getManagerCount , S32 , () , "Returns the total number of bin managers." )

DefineEngineMethod(RenderPassManager , removeManager , void , (RenderBinManager *renderBin) , "Removes <a href="/coding/file/pointer_8h/#pointer_8h_1aeeddce917cf130d62c370b8f216026dd">a</a> <a href="/coding/file/editortool_8cpp/#editortool_8cpp_1a4cb041169a32ea3d4cacadbb955e06b4">render</a> bin manager." )

IMPLEMENT_CONOBJECT(RenderPassManager )

  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 "renderInstance/renderPassManager.h"
 26
 27#include "materials/sceneData.h"
 28#include "materials/matInstance.h"
 29#include "materials/customMaterialDefinition.h"
 30#include "materials/materialManager.h"
 31#include "scene/sceneManager.h"
 32#include "scene/sceneObject.h"
 33#include "gfx/primBuilder.h"
 34#include "platform/profiler.h"
 35#include "renderInstance/renderBinManager.h"
 36#include "renderInstance/renderObjectMgr.h"
 37#include "renderInstance/renderMeshMgr.h"
 38#include "renderInstance/renderTranslucentMgr.h"
 39#include "renderInstance/renderGlowMgr.h"
 40#include "renderInstance/renderTerrainMgr.h"
 41#include "core/util/safeDelete.h"
 42#include "math/util/matrixSet.h"
 43#include "console/engineAPI.h"
 44
 45
 46const RenderInstType RenderInstType::Invalid( "" );
 47
 48const RenderInstType RenderPassManager::RIT_Mesh("Mesh");
 49const RenderInstType RenderPassManager::RIT_Shadow("Shadow");
 50const RenderInstType RenderPassManager::RIT_Sky("Sky");
 51const RenderInstType RenderPassManager::RIT_Terrain("Terrain");
 52const RenderInstType RenderPassManager::RIT_Object("Object");      
 53const RenderInstType RenderPassManager::RIT_ObjectTranslucent("ObjectTranslucent");
 54const RenderInstType RenderPassManager::RIT_Decal("Decal");
 55const RenderInstType RenderPassManager::RIT_DecalRoad("DecalRoad");
 56const RenderInstType RenderPassManager::RIT_Water("Water");
 57const RenderInstType RenderPassManager::RIT_Foliage("Foliage");
 58const RenderInstType RenderPassManager::RIT_VolumetricFog("ObjectVolumetricFog");
 59const RenderInstType RenderPassManager::RIT_Translucent("Translucent");
 60const RenderInstType RenderPassManager::RIT_Begin("Begin");
 61const RenderInstType RenderPassManager::RIT_Custom("Custom");
 62const RenderInstType RenderPassManager::RIT_Particle("Particle");
 63const RenderInstType RenderPassManager::RIT_Occluder("Occluder");
 64const RenderInstType RenderPassManager::RIT_Editor("Editor");
 65const RenderInstType RenderPassManager::RIT_Probes("Probes");
 66
 67
 68//*****************************************************************************
 69// RenderInstance
 70//*****************************************************************************
 71
 72void RenderInst::clear()
 73{
 74   dMemset( this, 0, sizeof(RenderInst) );
 75}
 76
 77void MeshRenderInst::clear()
 78{
 79   dMemset( this, 0, sizeof(MeshRenderInst) );
 80   visibility = 1.0f;
 81}
 82
 83void ParticleRenderInst::clear()
 84{
 85   dMemset( this, 0, sizeof(ParticleRenderInst) );
 86}
 87
 88void ObjectRenderInst::clear()
 89{
 90   userData = NULL;
 91
 92   dMemset( this, 0, sizeof( ObjectRenderInst ) );
 93
 94   // The memset here is kinda wrong... it clears the
 95   // state initialized by the delegate constructor.
 96   //
 97   // This fixes it... but we probably need to have a
 98   // real constructor for RenderInsts.
 99   renderDelegate.clear();
100}
101
102void OccluderRenderInst::clear()
103{
104   dMemset( this, 0, sizeof(OccluderRenderInst) );
105}
106
107IMPLEMENT_CONOBJECT(RenderPassManager);
108
109ConsoleDocClass( RenderPassManager, 
110   "@brief A grouping of render bin managers which forms a render pass.\n\n"
111   "The render pass is used to order a set of RenderBinManager objects which are used "
112   "when rendering a scene.  This class does little work itself other than managing "
113   "its list of render bins.\n\n"
114   "In 'core/scripts/client/renderManager." TORQUE_SCRIPT_EXTENSION "' you will find the DiffuseRenderPassManager "
115   "which is used by the C++ engine to render the scene.\n\n"
116   "@see RenderBinManager\n"
117   "@ingroup RenderBin\n" );
118
119RenderPassManager::RenderBinEventSignal& RenderPassManager::getRenderBinSignal()
120{
121   static RenderBinEventSignal theSignal;
122   return theSignal;
123}
124
125void RenderPassManager::initPersistFields()
126{
127   Parent::initPersistFields();
128}
129
130RenderPassManager::RenderPassManager()
131{   
132   mSceneManager = NULL;
133   VECTOR_SET_ASSOCIATION( mRenderBins );
134
135   mMatrixSet = reinterpret_cast<MatrixSet *>(dMalloc_aligned(sizeof(MatrixSet), 16));
136   constructInPlace(mMatrixSet);
137}
138
139RenderPassManager::~RenderPassManager()
140{
141   dFree_aligned(mMatrixSet);
142
143   // Any bins left need to be deleted.
144   for ( U32 i=0; i<mRenderBins.size(); i++ )
145   {
146      RenderBinManager *bin = mRenderBins[i];
147
148      // Clear the parent first, so that RenderBinManager::onRemove()
149      // won't call removeManager() and break this loop.
150      bin->setRenderPass( NULL );
151      bin->deleteObject();
152   }
153}
154
155void RenderPassManager::_insertSort(Vector<RenderBinManager*>& list, RenderBinManager* mgr, bool renderOrder)
156{
157   U32 i;
158   for (i = 0; i < list.size(); i++)
159   {
160      bool renderCompare = mgr->getRenderOrder() < list[i]->getRenderOrder();
161      bool processAddCompare = mgr->getProcessAddOrder() < list[i]->getProcessAddOrder();
162      if ((renderOrder && renderCompare) || (!renderOrder && processAddCompare))      
163      {
164         list.insert(i);
165         list[i] = mgr;
166         return;
167      }
168   }
169
170   list.push_back(mgr);
171}
172
173void RenderPassManager::addManager(RenderBinManager* mgr)
174{
175   if ( !mgr->isProperlyAdded() )
176      mgr->registerObject();
177
178   AssertFatal( mgr->getRenderPass() == NULL, "RenderPassManager::addManager() - Bin is still part of another pass manager!" );
179   mgr->setRenderPass( this );
180
181   _insertSort(mRenderBins, mgr, true);
182}
183
184void RenderPassManager::removeManager(RenderBinManager* mgr)
185{
186   AssertFatal( mgr->getRenderPass() == this, "RenderPassManager::removeManager() - We do not own this bin!" );
187
188   mgr->setRenderPass( NULL );
189   mRenderBins.remove( mgr );
190}
191
192RenderBinManager* RenderPassManager::getManager(S32 i) const
193{
194   if (i >= 0 && i < mRenderBins.size())
195      return mRenderBins[i];
196   else
197      return NULL;
198}
199
200void RenderPassManager::addInst( RenderInst *inst )
201{
202   PROFILE_SCOPE( RenderPassManager_addInst );
203
204   AssertFatal( inst != NULL, "RenderPassManager::addInst - Got null instance!" );
205
206   AddInstTable::Iterator iter = mAddInstSignals.find( inst->type );
207   if ( iter == mAddInstSignals.end() )
208      return;
209
210   iter->value.trigger( inst );
211}
212
213void RenderPassManager::sort()
214{
215   PROFILE_SCOPE( RenderPassManager_Sort );
216
217   for (Vector<RenderBinManager *>::iterator itr = mRenderBins.begin();
218      itr != mRenderBins.end(); itr++)
219   {
220      AssertFatal(*itr, "Render manager invalid!");
221      (*itr)->sort();
222   }
223}
224
225void RenderPassManager::clear()
226{
227   PROFILE_SCOPE( RenderPassManager_Clear );
228
229   mChunker.clear();
230
231   for (Vector<RenderBinManager *>::iterator itr = mRenderBins.begin();
232      itr != mRenderBins.end(); itr++)
233   {
234      AssertFatal(*itr, "Invalid render manager!");
235      (*itr)->clear();
236   }
237}
238
239void RenderPassManager::render(SceneRenderState * state)
240{
241   PROFILE_SCOPE( RenderPassManager_Render );
242
243   GFX->pushWorldMatrix();
244   MatrixF proj = GFX->getProjectionMatrix();
245
246   
247   for (Vector<RenderBinManager *>::iterator itr = mRenderBins.begin();
248      itr != mRenderBins.end(); itr++)
249   {
250      RenderBinManager *curBin = *itr;
251      AssertFatal(curBin, "Invalid render manager!");
252      getRenderBinSignal().trigger(curBin, state, true);
253      curBin->render(state);
254      getRenderBinSignal().trigger(curBin, state, false);
255   }
256
257   GFX->popWorldMatrix();
258   GFX->setProjectionMatrix( proj );
259      
260   // Restore a clean state for subsequent rendering.
261   GFX->setupGenericShaders();
262   for(S32 i = 0; i < GFX->getNumSamplers(); ++i)
263      GFX->setTexture(i, NULL);
264}
265
266void RenderPassManager::renderPass(SceneRenderState * state)
267{
268   PROFILE_SCOPE( RenderPassManager_RenderPass );
269   sort();
270   render(state);
271   clear();
272}
273
274GFXTextureObject *RenderPassManager::getDepthTargetTexture()
275{
276   // If this is OpenGL, or something else has set the depth buffer, return the pointer
277   if( mDepthBuff.isValid() )
278   {
279      // If this is OpenGL, make sure the depth target matches up
280      // with the active render target.  Otherwise recreate.
281      
282      if( GFX->getAdapterType() == OpenGL )
283      {
284         GFXTarget* activeRT = GFX->getActiveRenderTarget();
285         AssertFatal( activeRT, "Must be an active render target to call 'getDepthTargetTexture'" );
286         
287         Point2I activeRTSize = activeRT->getSize();
288         if( mDepthBuff.getWidth() == activeRTSize.x &&
289             mDepthBuff.getHeight() == activeRTSize.y )
290            return mDepthBuff.getPointer();
291      }
292      else
293         return mDepthBuff.getPointer();
294   }
295
296   if(GFX->getAdapterType() == OpenGL)
297   {
298      AssertFatal(GFX->getActiveRenderTarget(), "Must be an active render target to call 'getDepthTargetTexture'");
299
300      const Point2I rtSize = GFX->getActiveRenderTarget()->getSize();
301      mDepthBuff.set(rtSize.x, rtSize.y, GFXFormatD24S8, 
302         &GFXZTargetProfile, avar("%s() - mDepthBuff (line %d)", __FUNCTION__, __LINE__));
303      return mDepthBuff.getPointer();
304   }
305
306   // Default return value
307   return GFXTextureTarget::sDefaultDepthStencil;
308}
309
310void RenderPassManager::setDepthTargetTexture( GFXTextureObject *zTarget )
311{
312   mDepthBuff = zTarget;
313}
314
315const MatrixF* RenderPassManager::allocSharedXform( SharedTransformType stt )
316{
317   AssertFatal(stt == View || stt == Projection, "Bad shared transform type");
318
319   // Enable this to simulate non-shared transform performance
320   //#define SIMULATE_NON_SHARED_TRANSFORMS
321#ifdef SIMULATE_NON_SHARED_TRANSFORMS
322   return allocUniqueXform(stt == View ? mMatrixSet->getWorldToCamera() : mMatrixSet->getCameraToScreen());
323#else
324   return &(stt == View ? mMatrixSet->getWorldToCamera() : mMatrixSet->getCameraToScreen());
325#endif
326}
327
328void RenderPassManager::assignSharedXform( SharedTransformType stt, const MatrixF &xfm )
329{
330   AssertFatal(stt == View || stt == Projection, "Bad shared transform type");
331   if(stt == View)
332      mMatrixSet->setSceneView(xfm);
333   else
334      mMatrixSet->setSceneProjection(xfm);
335}
336
337// Script interface
338
339DefineEngineMethod(RenderPassManager, getManagerCount, S32, (),, 
340   "Returns the total number of bin managers." )
341{
342   return object->getManagerCount();
343}
344
345DefineEngineMethod( RenderPassManager, getManager, RenderBinManager*, ( S32 index ),,
346   "Returns the render bin manager at the index or null if the index is out of range." )
347{
348   if(index < 0 || index >= object->getManagerCount())
349      return NULL;
350
351   return object->getManager(index);
352}
353
354DefineEngineMethod( RenderPassManager, addManager, void, ( RenderBinManager *renderBin ),, 
355   "Add as a render bin manager to the pass." )
356{
357   if ( renderBin )
358      object->addManager( renderBin );
359}
360
361DefineEngineMethod( RenderPassManager, removeManager, void, ( RenderBinManager *renderBin ),, 
362   "Removes a render bin manager." )
363{
364   if ( renderBin )
365      object->removeManager( renderBin );
366}
367
368