void RenderTexTargetBinManager::setTargetChainLength(const U32 chainLength)
{
   if(mTargetChainLength != chainLength)
   {
      mTargetChainLength = chainLength;
      _setupTargets();
   }
}
bool RenderTexTargetBinManager::onAdd()
{
   if(!Parent::onAdd())
      return false;

   _setupTargets();

   return true;
}
void eDeferredRenderer::renderScene(eScene &scene, const eCamera &cam, eITexture2d *target, eF32 time)
{
    ePROFILER_ZONE("Render scene");

    eASSERT(target != eNULL);
    eASSERT(target->isRenderTarget() == eTRUE);
    eASSERT(time >= 0.0f);

    eRenderJob::reset(); // TODO: relocate me if necessary

    eStateManager::push();

    // Begin rendering the scene.
    scene.update(time);
    scene.collectRenderJobs(cam, m_allJobs);

    // Setup all render-targets and fill g-buffer.
    _setupTargets(target->getWidth(), target->getHeight());
    _assignMaterialIds();
    _renderGeometryPass(cam);

    // Render the final image.
    eStateManager::bindRenderTarget(0, target);
    eStateManager::setCullingMode(eCULLING_NONE);
    eStateManager::setCap(eCAP_ZBUFFER, eFALSE);
    eStateManager::setCap(eCAP_BLENDING, eFALSE);
    eStateManager::setBlendModes(eBLEND_ONE, eBLEND_ONE, eBLENDOP_ADD);
    eStateManager::setTextureAddressMode(0, eTEXADDRMODE_CLAMP);
    eStateManager::setTextureAddressMode(1, eTEXADDRMODE_CLAMP);
    eStateManager::setTextureAddressMode(2, eTEXADDRMODE_CLAMP);
    eStateManager::setTextureAddressMode(3, eTEXADDRMODE_CLAMP);

    const eRect area(0, 0, target->getWidth(), target->getHeight());

    // Do deferred (no-) lighting passes.
    _renderAmbientPass(scene, area);
    _renderLightPass(scene, cam, area);
    _renderNoLightPass(cam);

    // Do alpha lighting passes. 
    _renderAlphaLightPass(scene, cam, area);

    // Do effect passes.
    _renderEnvPass(area);
    _renderRefractionPass(cam, area, target);
   
    eStateManager::pop();

#ifdef VISUALIZE_RENDER_PASSES
    eStateManager::bindRenderTarget(0, target);
    _visualizeGeometryBuffer(area);
#endif
}
void RenderTexTargetBinManager::_onTextureEvent( GFXTexCallbackCode code )
{
   switch(code)
   {
      case GFXZombify:
         _teardownTargets();
         break;

      case GFXResurrect:
         _setupTargets();
         break;
   }
}
Example #5
0
void GuiOffscreenCanvas::_onTextureEvent( GFXTexCallbackCode code )
{
   switch(code)
   {
      case GFXZombify:
         _teardownTargets();
         break;

      case GFXResurrect:
         _setupTargets();
         break;
   }
}
Example #6
0
bool GuiOffscreenCanvas::onAdd()
{
   if (GuiControl::onAdd()) // jamesu - skip GuiCanvas onAdd since it sets up GFX which is bad
   {
      // ensure that we have a cursor
      setCursor(dynamic_cast<GuiCursor*>(Sim::findObject("DefaultCursor")));
      
      mRenderFront = true;
      sList.push_back(this);

      //Con::printf("Registering target %s...", mTargetName.c_str());
      mNamedTarget.registerWithName( mTargetName );

      _setupTargets();

      GFXTextureManager::addEventDelegate( this, &GuiOffscreenCanvas::_onTextureEvent );

      return true;
   }
   return false;
}
void eDeferredRenderer::renderScene(const eScene &scene, const eCamera &cam, eTexture2d *colorTarget, eTexture2d *depthTarget, eF32 time)
{
    ePROFILER_FUNC();

    eASSERT(colorTarget);
    eASSERT(colorTarget->target);
    eASSERT(time >= 0.0f);

    const eRect area(0, 0, colorTarget->width, colorTarget->height);
    scene.getRenderJobs(cam, m_allJobs);

    // take care to maintain valid (filled)
    // depth buffer among different passes!
    _setupTargets(colorTarget->width, colorTarget->height);
    _renderGeometryPass(cam, depthTarget);
    _renderAmbientPass(colorTarget, depthTarget, scene, area);
    _renderNoLightPass(colorTarget, depthTarget, cam);
    _renderAlphaLightPass(colorTarget, depthTarget, scene, cam, area);
    _renderLightPass(colorTarget, depthTarget, scene, cam, area);
   
#ifdef SHOW_GBUFFER
    _showGeometryBuffer(target, area);
#endif
}
Example #8
0
void GuiOffscreenCanvas::renderFrame(bool preRenderOnly, bool bufferSwap /* = true */)
{
   if (!mTargetDirty)
      return;
   
#ifdef TORQUE_ENABLE_GFXDEBUGEVENTS
   char buf[256];
   dSprintf(buf, sizeof(buf), "OffsceenCanvas %s", getName() ? getName() : getIdString());
   GFXDEBUGEVENT_SCOPE_EX(GuiOffscreenCanvas_renderFrame, ColorI::GREEN, buf);
#endif
   
   PROFILE_START(OffscreenCanvasPreRender);

#ifdef TORQUE_GFX_STATE_DEBUG
   GFX->getDebugStateManager()->startFrame();
#endif

   if (mTarget->getSize() != mTargetSize)
   {
      _setupTargets();
      mNamedTarget.setViewport( RectI( Point2I::Zero, mTargetSize ) );
   }

   // Make sure the root control is the size of the canvas.
   Point2I size = mTarget->getSize();

   if(size.x == 0 || size.y == 0)
   {
      PROFILE_END();
      return;
   }

   RectI screenRect(0, 0, size.x, size.y);

   maintainSizing();

   //preRender (recursive) all controls
   preRender();

   PROFILE_END();

   // Are we just doing pre-render?
   if(preRenderOnly)
   {
      return;
   }

   resetUpdateRegions();

   PROFILE_START(OffscreenCanvasRenderControls);

   GuiCursor *mouseCursor = NULL;
   bool cursorVisible = true;

   Point2I cursorPos((S32)mCursorPt.x, (S32)mCursorPt.y);
   mouseCursor = mDefaultCursor;

	mLastCursorEnabled = cursorVisible;
	mLastCursor = mouseCursor;
	mLastCursorPt = cursorPos;

   // Set active target
   GFX->pushActiveRenderTarget();
   GFX->setActiveRenderTarget(mTarget);

   // Clear the current viewport area
   GFX->setViewport( screenRect );
   GFX->clear( GFXClearTarget, ColorF(0,0,0,0), 1.0f, 0 );

   resetUpdateRegions();

	// Make sure we have a clean matrix state 
   // before we start rendering anything!   
   GFX->setWorldMatrix( MatrixF::Identity );
   GFX->setViewMatrix( MatrixF::Identity );
   GFX->setProjectionMatrix( MatrixF::Identity );
   
   RectI contentRect(Point2I(0,0), mTargetSize);
   {
      // Render active GUI Dialogs
      for(iterator i = begin(); i != end(); i++)
      {
         // Get the control
         GuiControl *contentCtrl = static_cast<GuiControl*>(*i);
         
         GFX->setClipRect( contentRect );
         GFX->setStateBlock(mDefaultGuiSB);
         
         contentCtrl->onRender(contentCtrl->getPosition(), contentRect);
      }

      // Fill Blue if no Dialogs
      if(this->size() == 0)
         GFX->clear( GFXClearTarget, ColorF(0,0,0,1), 1.0f, 0 );

      GFX->setClipRect( contentRect );

      // Draw cursor
      // 
      if (mCursorEnabled && mouseCursor && mShowCursor)
      {
         Point2I pos((S32)mCursorPt.x, (S32)mCursorPt.y);
         Point2I spot = mouseCursor->getHotSpot();

         pos -= spot;
         mouseCursor->render(pos);
      }

      GFX->getDrawUtil()->clearBitmapModulation();
   }

   mTarget->resolve();
   GFX->popActiveRenderTarget();

   PROFILE_END();

   // Keep track of the last time we rendered.
   mLastRenderMs = Platform::getRealMilliseconds();
   mTargetDirty = mDynamicTarget;

   onFrameRendered();
}