renderPassManager.cpp
Engine/source/renderInstance/renderPassManager.cpp
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