Torque3D Documentation / _generateds / renderTexTargetBinManager.cpp

renderTexTargetBinManager.cpp

Engine/source/renderInstance/renderTexTargetBinManager.cpp

More...

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