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; } }
void GuiOffscreenCanvas::_onTextureEvent( GFXTexCallbackCode code ) { switch(code) { case GFXZombify: _teardownTargets(); break; case GFXResurrect: _setupTargets(); break; } }
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 }
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(); }