// CaptureRenderRequest // void plCaptureRenderRequest::Render(plPipeline* pipe, plPageTreeMgr* pageMgr) { // If we don't have a render target, something has gone horribly wrong. if( !GetRenderTarget() ) { hsAssert(false, "CaptureRenderRequest with no render target"); return; } // Set ourselves up like the current pipeline, except with our screen size. plViewTransform vt = pipe->GetViewTransform(); vt.SetViewPort(0, 0, fRenderTarget->GetWidth(), fRenderTarget->GetHeight()); SetViewTransform(vt); SetClearColor(pipe->GetClearColor()); SetClearDepth(pipe->GetClearDepth()); // Clear our render target // Render the scene pipe->PushRenderRequest(this); plVirtualCam1::Refresh(); pipe->ClearRenderTarget(); pageMgr->Render(pipe); pipe->PopRenderRequest(this); plVirtualCam1::Refresh(); // set up state so we can clear the z-buffer for every gui dialog (and therefore not have it // be obscured by other geometry) SetRenderState(GetRenderState() & ~plPipeline::kRenderClearColor); SetRenderState(GetRenderState() | plPipeline::kRenderClearDepth); SetClearDepth(1); // render all GUI items std::vector<plPostEffectMod*> guiRenderMods = pfGameGUIMgr::GetInstance()->GetDlgRenderMods(); for (int i = (int)guiRenderMods.size() - 1; i >= 0; i--) // render in reverse, so dialogs on the bottom get rendered first { plPageTreeMgr* dlgPageMgr = guiRenderMods[i]->GetPageMgr(); if (dlgPageMgr) { SetViewTransform(guiRenderMods[i]->GetViewTransform()); pipe->PushRenderRequest(this); pipe->ClearRenderTarget(); dlgPageMgr->Render(pipe); pipe->PopRenderRequest(this); } } // Callback on plCaptureRender to process the render target into a mipmap // and send it back to the requester. plCaptureRender::IProcess(pipe, GetAck(), GetRenderTarget()); delete fRenderTarget; fRenderTarget = nil; }
void Device::Clear(CLEAR_FLAG flags) { glShadeModel(GL_SMOOTH); glPixelStorei(GL_UNPACK_ALIGNMENT, 4); GLfloat lightModelAmbient[] = { 0.0f, 0.0f, 0.0f, 1.0f }; glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lightModelAmbient); GLfloat lightAmbient[] = { 0.25f, 0.25f, 0.25f, 1.0f }; glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient); GLfloat lightDiffuse[] = { 0.75f, 0.75f, 0.75f, 1.0f }; glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiffuse); GLfloat materialAmbient[] = { 1.0f, 1.0f, 1.0f, 1.0f }; glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, materialAmbient); GLfloat materialDiffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f }; glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, materialDiffuse); GLfloat lightPosition[] = { 0.0f, 0.0f, 2.5f, 1.0f }; glLightfv(GL_LIGHT0, GL_POSITION, lightPosition); glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); glEnable(GL_COLOR_MATERIAL); SetClearStencil(0); SetClearDepth(1); glClear((flags & CLEAR_FLAG::Color ? GL_COLOR_BUFFER_BIT : 0) | (flags & CLEAR_FLAG::Depth ? GL_DEPTH_BUFFER_BIT : 0) | (flags & CLEAR_FLAG::Stencil ? GL_STENCIL_BUFFER_BIT : 0)); }
void Graphics::ResetCachedState() { Program::Clear(); viewport_ = Recti(0); glGetIntegerv(GL_FRAMEBUFFER_BINDING, &systemFbo_); // On IOS default FBO is not zero // Set up texture data read/write alignment glPixelStorei(GL_PACK_ALIGNMENT, 1); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); VertexArrayObj::Clear(); lastMesh_ = nullptr; lastProgram_ = nullptr; activeMesh_ = nullptr; activeWindow_ = nullptr; CHECK_GL_STATUS(); SetClearColor(Color(0, 0, 0, 1)); SetClearDepth(1); SetClearStencil(0); SetFrameBuffer(nullptr); SetStencilTest(DEFAULT_STENCIL_ENABLE, DEFAULT_STENCIL_WRITEMASK, DEFAULT_STENCIL_SFAIL, DEFAULT_STENCIL_DPFAIL, DEFAULT_STENCIL_DPPASS, DEFAULT_STENCIL_FUNC, DEFAULT_STENCIL_REF, DEFAULT_STENCIL_COMPAREMASK); SetScissorTest(); CHECK_GL_STATUS(); SetColorMask(DEFAULT_COLOR_MASK); SetDepthMask(DEFAULT_DEPTH_MASK); SetDepthFunc(DepthFunc::LESS); SetStencilMask(DEFAULT_STENCIL_MASK); SetBlendModeTest(DEFAULT_BLEND_MODE); EnableDepthTest(DEFAULT_DEPTH_TEST_ENABLE); EnableCullFace(DEFAULT_CULL_FACE_ENABLE); SetCullFace(CullFaceMode::DEFAULT); SetFrontFace(FrontFaceMode::DEFAULT); CHECK_GL_STATUS(); UnboundTextures(); SetVertexArrayObj(nullptr); SetVertexBuffer(nullptr); SetIndexBuffer(nullptr); SetProgram(nullptr); SetSlopeScaledBias(0); CHECK_GL_STATUS(); }