void FakeInstanceNode::doDisplay(FrameContext & frameContext, const RenderParam & rp) { if(fakePrototype.isNull()) { Node::doDisplay(frameContext, rp); return; } auto camera = static_cast<AbstractCameraNode*>(frameContext.getCamera()->clone()); const Geometry::Matrix4x4f & cameraMatrix = frameContext.getCamera()->getWorldTransformationMatrix(); camera->setRelTransformation( fakePrototype->getWorldTransformationMatrix() * getWorldToLocalMatrix() * cameraMatrix); frameContext.pushAndSetCamera(camera); frameContext.displayNode(fakePrototype.get(), rp); frameContext.popCamera(); }
State::stateResult_t PhotonRenderer::doEnableState(FrameContext & context, Node * node, const RenderParam & rp){ #ifdef MINSG_THESISSTANISLAW_GATHER_STATISTICS Rendering::RenderingContext::finish(); _timer.reset(); #endif // MINSG_THESISSTANISLAW_GATHER_STATISTICS if(!_photonSampler){ WARN("No PhotonSampler present in PhotonRenderer!"); return State::stateResult_t::STATE_SKIPPED; } if(!_approxScene){ WARN("No approximated Scene present in PhotonRenderer!"); return State::stateResult_t::STATE_SKIPPED; } auto& rc = context.getRenderingContext(); rc.setImmediateMode(true); rc.applyChanges(); if(_fboChanged){ if(!initializeFBO(rc)){ WARN("Could not initialize FBO for PhotonRenderer!"); return State::stateResult_t::STATE_SKIPPED; } _fboChanged = false; } RenderParam newRp; rc.pushAndSetFBO(_fbo.get()); rc.clearDepth(1.0f); rc.applyChanges(); for(int32_t i = 0; i < _photonSampler->getPhotonNumber(); i++){ _fbo->setDrawBuffers(2); rc.pushAndSetShader(_indirectLightShader.get()); _lightPatchRenderer->bindTBO(rc, true, false); _photonSampler->bindPhotonBuffer(1); context.pushAndSetCamera(_photonCamera.get()); _indirectLightShader->setUniform(rc, Rendering::Uniform("photonID", i)); rc.clearDepth(1.0f); rc.clearColor(Util::Color4f(0.f, 0.f, 0.f, 0.f)); _approxScene->display(context, newRp); context.popCamera(); _photonSampler->unbindPhotonBuffer(1); _lightPatchRenderer->unbindTBO(rc); rc.popShader(); // Accumulate all pixel values in one photon _fbo->setDrawBuffers(0); rc.pushAndSetShader(_accumulationShader.get()); _accumulationShader->setUniform(rc, Rendering::Uniform("photonID", i)); _accumulationShader->setUniform(rc, Rendering::Uniform("samplingWidth", static_cast<int>(_samplingWidth))); _accumulationShader->setUniform(rc, Rendering::Uniform("samplingHeight", static_cast<int>(_samplingHeight))); _photonSampler->bindPhotonBuffer(1); rc.clearDepth(1.0f); Rendering::TextureUtils::drawTextureToScreen(rc, Geometry::Rect_i(0, 0, _samplingWidth, _samplingHeight), *_indirectLightTexture.get(), Geometry::Rect_f(0.0f, 0.0f, 1.0f, 1.0f)); _photonSampler->unbindPhotonBuffer(1); rc.popShader(); } rc.popFBO(); rc.setImmediateMode(false); // rc.pushAndSetShader(nullptr); // Rendering::TextureUtils::drawTextureToScreen(rc, Geometry::Rect_i(0, 0, _samplingWidth, _samplingHeight), *(_indirectLightTexture.get()), Geometry::Rect_f(0.0f, 0.0f, 1.0f, 1.0f)); // rc.popShader(); // return State::stateResult_t::STATE_SKIP_RENDERING; #ifdef MINSG_THESISSTANISLAW_GATHER_STATISTICS Rendering::RenderingContext::finish(); _timer.stop(); auto& stats = context.getStatistics(); Statistics::instance(stats).addPhotonRendererTime(stats, _timer.getMilliseconds()); #endif // MINSG_THESISSTANISLAW_GATHER_STATISTICS return State::stateResult_t::STATE_OK; }