renderTexTargetBinManager.cpp
Engine/source/renderInstance/renderTexTargetBinManager.cpp
Public Variables
Public Functions
ConsoleDocClass(RenderTexTargetBinManager , "@brief An abstract base class <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1a2732ab74fa0237854c2ba0f75f88a624">for</a> <a href="/coding/file/editortool_8cpp/#editortool_8cpp_1a4cb041169a32ea3d4cacadbb955e06b4">render</a> bin managers that <a href="/coding/file/editortool_8cpp/#editortool_8cpp_1a4cb041169a32ea3d4cacadbb955e06b4">render</a> <a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1a5bafda9519252aa2d0fd038153f77dca">to</a> <a href="/coding/file/pointer_8h/#pointer_8h_1aeeddce917cf130d62c370b8f216026dd">a</a> named textue <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">target.\n\n</a>" "This bin itself doesn'<a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1aded116371789db1fd63c90ef00c95a3d">t</a> do any rendering work. It offers functionality <a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1a5bafda9519252aa2d0fd038153f77dca">to</a> manage " "<a href="/coding/file/pointer_8h/#pointer_8h_1aeeddce917cf130d62c370b8f216026dd">a</a> texture <a href="/coding/file/editortool_8cpp/#editortool_8cpp_1a4cb041169a32ea3d4cacadbb955e06b4">render</a> target which derived <a href="/coding/file/editortool_8cpp/#editortool_8cpp_1a4cb041169a32ea3d4cacadbb955e06b4">render</a> bin classes can <a href="/coding/file/editortool_8cpp/#editortool_8cpp_1a4cb041169a32ea3d4cacadbb955e06b4">render</a> <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">into.\n\n</a>" "@see <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">RenderDeferredMgr\n</a>" "@ingroup <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">RenderBin\n</a>" )
ImplementEnumType(RenderTexTargetSize , "What <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1ab7d671599a7b25ca99a487fa341bc33a">size</a> <a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1a5bafda9519252aa2d0fd038153f77dca">to</a> <a href="/coding/file/editortool_8cpp/#editortool_8cpp_1a4cb041169a32ea3d4cacadbb955e06b4">render</a> the target texture. Sizes are based on the Window the <a href="/coding/file/editortool_8cpp/#editortool_8cpp_1a4cb041169a32ea3d4cacadbb955e06b4">render</a> is occuring <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">in.\n</a>" "@ingroup <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">RenderBin\n\n</a>" )
Detailed Description
Public Variables
EndImplementEnumType
Public Functions
ConsoleDocClass(RenderTexTargetBinManager , "@brief An abstract base class <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1a2732ab74fa0237854c2ba0f75f88a624">for</a> <a href="/coding/file/editortool_8cpp/#editortool_8cpp_1a4cb041169a32ea3d4cacadbb955e06b4">render</a> bin managers that <a href="/coding/file/editortool_8cpp/#editortool_8cpp_1a4cb041169a32ea3d4cacadbb955e06b4">render</a> <a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1a5bafda9519252aa2d0fd038153f77dca">to</a> <a href="/coding/file/pointer_8h/#pointer_8h_1aeeddce917cf130d62c370b8f216026dd">a</a> named textue <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">target.\n\n</a>" "This bin itself doesn'<a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1aded116371789db1fd63c90ef00c95a3d">t</a> do any rendering work. It offers functionality <a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1a5bafda9519252aa2d0fd038153f77dca">to</a> manage " "<a href="/coding/file/pointer_8h/#pointer_8h_1aeeddce917cf130d62c370b8f216026dd">a</a> texture <a href="/coding/file/editortool_8cpp/#editortool_8cpp_1a4cb041169a32ea3d4cacadbb955e06b4">render</a> target which derived <a href="/coding/file/editortool_8cpp/#editortool_8cpp_1a4cb041169a32ea3d4cacadbb955e06b4">render</a> bin classes can <a href="/coding/file/editortool_8cpp/#editortool_8cpp_1a4cb041169a32ea3d4cacadbb955e06b4">render</a> <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">into.\n\n</a>" "@see <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">RenderDeferredMgr\n</a>" "@ingroup <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">RenderBin\n</a>" )
IMPLEMENT_CONOBJECT(RenderTexTargetBinManager )
ImplementEnumType(RenderTexTargetSize , "What <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1ab7d671599a7b25ca99a487fa341bc33a">size</a> <a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1a5bafda9519252aa2d0fd038153f77dca">to</a> <a href="/coding/file/editortool_8cpp/#editortool_8cpp_1a4cb041169a32ea3d4cacadbb955e06b4">render</a> the target texture. Sizes are based on the Window the <a href="/coding/file/editortool_8cpp/#editortool_8cpp_1a4cb041169a32ea3d4cacadbb955e06b4">render</a> is occuring <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">in.\n</a>" "@ingroup <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">RenderBin\n\n</a>" )
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/renderTexTargetBinManager.h" 26 27#include "shaderGen/conditionerFeature.h" 28#include "core/util/safeDelete.h" 29#include "gfx/gfxTextureManager.h" 30#include "gfx/gfxStringEnumTranslate.h" 31#include "scene/sceneRenderState.h" 32#include "scene/sceneManager.h" 33 34 35IMPLEMENT_CONOBJECT(RenderTexTargetBinManager); 36 37ConsoleDocClass( RenderTexTargetBinManager, 38 "@brief An abstract base class for render bin managers that render to a named textue target.\n\n" 39 "This bin itself doesn't do any rendering work. It offers functionality to manage " 40 "a texture render target which derived render bin classes can render into.\n\n" 41 "@see RenderDeferredMgr\n" 42 "@ingroup RenderBin\n" ); 43 44 45RenderTexTargetBinManager::RenderTexTargetBinManager( const RenderInstType& ritype, 46 F32 renderOrder, 47 F32 processAddOrder, 48 const GFXFormat targetFormat, 49 const Point2I &targetSize, 50 const U32 targetChainLength ) 51 52 : Parent( ritype, renderOrder, processAddOrder ), 53 mTargetFormat(targetFormat), 54 mTargetSize(targetSize), 55 mTargetScale(1.0f, 1.0f), 56 mTargetSizeType(FixedSize), 57 mTargetChainLength(targetChainLength), 58 mTargetChainIdx(0), 59 mNumRenderTargets(1), 60 mTargetChain(NULL), 61 mTargetChainTextures(NULL) 62 #ifndef TORQUE_SHIPPING 63 ,m_NeedsOnPostRender(false) 64 #endif 65{ 66 GFXDevice::getDeviceEventSignal().notify(this, &RenderTexTargetBinManager::_handleGFXEvent); 67 GFXTextureManager::addEventDelegate( this, &RenderTexTargetBinManager::_onTextureEvent ); 68 69 mNamedTarget.setSamplerState( GFXSamplerStateDesc::getClampPoint() ); 70} 71 72RenderTexTargetBinManager::~RenderTexTargetBinManager() 73{ 74 _teardownTargets(); 75 76 GFXTextureManager::removeEventDelegate( this, &RenderTexTargetBinManager::_onTextureEvent ); 77 GFXDevice::getDeviceEventSignal().remove(this, &RenderTexTargetBinManager::_handleGFXEvent); 78} 79 80bool RenderTexTargetBinManager::onAdd() 81{ 82 if(!Parent::onAdd()) 83 return false; 84 85 _setupTargets(); 86 87 return true; 88} 89 90ImplementEnumType( RenderTexTargetSize, 91 "What size to render the target texture. Sizes are based on the Window the render is occuring in.\n" 92 "@ingroup RenderBin\n\n") 93 { RenderTexTargetBinManager::WindowSize, "windowsize", "Render to the size of the window.\n" }, 94 { RenderTexTargetBinManager::WindowSizeScaled, "windowsizescaled", "Render to the size of the window, scaled to the render target's size.\n" }, 95 { RenderTexTargetBinManager::FixedSize, "fixedsize", "Don't scale the target texture, and render to its default size.\n" }, 96EndImplementEnumType; 97 98void RenderTexTargetBinManager::initPersistFields() 99{ 100 // TOM_TODO: 101 //addField( "targetScale", mTargetScale ); 102 //addPropertyNOPS( "targetSizeType", mTargetSizeType)->setEnumTable(gSizeTypeEnumTable); 103 //addPropertyNOPS<S32>( "targetFormat")->setEnumTable(gTextureFormatEnumTable)->addGet(this, &RenderTexTargetBinManager::getTargetFormatConsole)->addSet(this, &RenderTexTargetBinManager::setTargetFormatConsole); 104 //addProperty<bool>( "blur" )->addSet(this, &RenderTexTargetBinManager::setBlur)->addGet(this, &RenderTexTargetBinManager::getBlur); 105 106 Parent::initPersistFields(); 107} 108 109bool RenderTexTargetBinManager::setTargetSize(const Point2I &newTargetSize) 110{ 111 if( mTargetSize.x >= newTargetSize.x && 112 mTargetSize.y >= newTargetSize.y ) 113 return true; 114 115 mTargetSize = newTargetSize; 116 mNamedTarget.setViewport( RectI( Point2I::Zero, mTargetSize ) ); 117 118 return _updateTargets(); 119} 120 121bool RenderTexTargetBinManager::setTargetFormat(const GFXFormat &newTargetFormat) 122{ 123 if(mTargetFormat == newTargetFormat) 124 return true; 125 126 mTargetFormat = newTargetFormat; 127 ConditionerFeature *conditioner = mNamedTarget.getConditioner(); 128 if(conditioner) 129 conditioner->setBufferFormat(mTargetFormat); 130 131 return _updateTargets(); 132} 133 134void RenderTexTargetBinManager::setTargetChainLength(const U32 chainLength) 135{ 136 if(mTargetChainLength != chainLength) 137 { 138 mTargetChainLength = chainLength; 139 _setupTargets(); 140 } 141} 142 143GFXTextureObject* RenderTexTargetBinManager::getTargetTexture( U32 mrtIndex, S32 chainIndex ) const 144{ 145 const U32 chainIdx = ( chainIndex > -1 ) ? chainIndex : mTargetChainIdx; 146 if(chainIdx < mTargetChainLength) 147 return mTargetChainTextures[chainIdx][mrtIndex]; 148 return NULL; 149} 150 151bool RenderTexTargetBinManager::_updateTargets() 152{ 153 PROFILE_SCOPE(RenderTexTargetBinManager_updateTargets); 154 155 bool ret = true; 156 157 mNamedTarget.release(); 158 159 // Update the target size 160 for( U32 i = 0; i < mTargetChainLength; i++ ) 161 { 162 AssertFatal( mTargetChain != NULL, "RenderTexTargetBinManager - target chain not set up" ); 163 164 if( !mTargetChain[i] ) 165 mTargetChain[i] = GFX->allocRenderToTextureTarget(); 166 167 for( U32 j = 0; j < mNumRenderTargets; j++ ) 168 { 169 // try reuse of old color texture 170 if( mTargetChainTextures[i][j].getWidthHeight() != mTargetSize 171 || mTargetChainTextures[i][j].getFormat() != mTargetFormat) 172 { 173 ret &= mTargetChainTextures[i][j].set( mTargetSize.x, mTargetSize.y, mTargetFormat, 174 &GFXRenderTargetProfile, avar( "%s() - (line %d)", __FUNCTION__, __LINE__ ), 175 1, GFXTextureManager::AA_MATCH_BACKBUFFER ); 176 177 mTargetChain[i]->attachTexture( GFXTextureTarget::RenderSlot(GFXTextureTarget::Color0 + j), mTargetChainTextures[i][j] ); 178 } 179 } 180 } 181 182 return ret; 183} 184 185bool RenderTexTargetBinManager::_handleGFXEvent( GFXDevice::GFXDeviceEventType event_ ) 186{ 187 if ( event_ == GFXDevice::deStartOfFrame ) 188 { 189 mTargetChainIdx++; 190 if ( mTargetChainIdx >= mTargetChainLength ) 191 mTargetChainIdx = 0; 192 } 193 194 return true; 195} 196 197void RenderTexTargetBinManager::_onTextureEvent( GFXTexCallbackCode code ) 198{ 199 switch(code) 200 { 201 case GFXZombify: 202 _teardownTargets(); 203 break; 204 205 case GFXResurrect: 206 _setupTargets(); 207 break; 208 } 209} 210 211bool RenderTexTargetBinManager::_setupTargets() 212{ 213 _teardownTargets(); 214 215 mTargetChain = new GFXTextureTargetRef[mTargetChainLength]; 216 mTargetChainTextures = new GFXTexHandle*[mTargetChainLength]; 217 218 for( U32 i = 0; i < mTargetChainLength; i++ ) 219 mTargetChainTextures[i] = new GFXTexHandle[mNumRenderTargets]; 220 221 mTargetChainIdx = 0; 222 223 mTargetSize = Point2I::Zero; 224 225 return true; 226} 227 228void RenderTexTargetBinManager::_teardownTargets() 229{ 230 mNamedTarget.release(); 231 232 SAFE_DELETE_ARRAY(mTargetChain); 233 if(mTargetChainTextures != NULL) 234 { 235 for( U32 i = 0; i < mTargetChainLength; i++ ) 236 SAFE_DELETE_ARRAY(mTargetChainTextures[i]); 237 } 238 SAFE_DELETE_ARRAY(mTargetChainTextures); 239} 240 241GFXTextureTargetRef RenderTexTargetBinManager::_getTextureTarget(const U32 idx /* = 0 */) 242{ 243 return mTargetChain[idx]; 244} 245 246bool RenderTexTargetBinManager::_onPreRender(SceneRenderState * state, bool preserve /* = false */) 247{ 248 PROFILE_SCOPE(RenderTexTargetBinManager_onPreRender); 249 250#ifndef TORQUE_SHIPPING 251 AssertFatal( m_NeedsOnPostRender == false, "_onPostRender not called on RenderTexTargetBinManager, or sub-class." ); 252 m_NeedsOnPostRender = false; 253#endif 254 255 // Update the render target size 256 const Point2I &rtSize = GFX->getActiveRenderTarget()->getSize(); 257 switch(mTargetSizeType) 258 { 259 case WindowSize: 260 setTargetSize(rtSize); 261 break; 262 case WindowSizeScaled: 263 { 264 Point2I scaledTargetSize(mFloor(rtSize.x * mTargetScale.x), mFloor(rtSize.y * mTargetScale.y)); 265 setTargetSize(scaledTargetSize); 266 break; 267 } 268 case FixedSize: 269 // No adjustment necessary 270 break; 271 } 272 273 if( mTargetChainLength == 0 ) 274 return false; 275 276 GFXTextureTargetRef binTarget = _getTextureTarget(mTargetChainIdx); 277 278 if( binTarget.isNull() ) 279 return false; 280 281 // Attach active depth target texture 282 binTarget->attachTexture(GFXTextureTarget::DepthStencil, getRenderPass()->getDepthTargetTexture()); 283 284 // Preserve contents 285 if(preserve) 286 GFX->getActiveRenderTarget()->preserve(); 287 288 GFX->pushActiveRenderTarget(); 289 GFX->setActiveRenderTarget(binTarget); 290 GFX->setViewport( mNamedTarget.getViewport() ); 291 292 #ifndef TORQUE_SHIPPING 293 m_NeedsOnPostRender = true; 294 #endif 295 296 return true; 297} 298 299void RenderTexTargetBinManager::_onPostRender() 300{ 301 PROFILE_SCOPE(RenderTexTargetBinManager_onPostRender); 302 303 #ifndef TORQUE_SHIPPING 304 m_NeedsOnPostRender = false; 305 #endif 306 307 GFXTextureTargetRef binTarget = _getTextureTarget(mTargetChainIdx); 308 binTarget->resolve(); 309 310 GFX->popActiveRenderTarget(); 311 312 for ( U32 i=0; i < mNumRenderTargets; i++ ) 313 mNamedTarget.setTexture( i, mTargetChainTextures[mTargetChainIdx][i] ); 314} 315