CRenderingContext::CRenderingContext(CRenderer* pRenderer, bool bInherit) { m_pRenderer = pRenderer; m_clrRender = ::Color(255, 255, 255, 255); s_aContexts.push_back(); if (bInherit && s_aContexts.size() > 1) { CRenderContext& oLastContext = s_aContexts[s_aContexts.size()-2]; CRenderContext& oThisContext = GetContext(); oThisContext.m_mProjection = oLastContext.m_mProjection; oThisContext.m_mView = oLastContext.m_mView; oThisContext.m_mTransformations = oLastContext.m_mTransformations; oThisContext.m_hMaterial = oLastContext.m_hMaterial; oThisContext.m_pFrameBuffer = oLastContext.m_pFrameBuffer; tstrncpy(oThisContext.m_szProgram, PROGRAM_LEN, oLastContext.m_szProgram, PROGRAM_LEN); oThisContext.m_pShader = oLastContext.m_pShader; oThisContext.m_rViewport = oLastContext.m_rViewport; oThisContext.m_eBlend = oLastContext.m_eBlend; oThisContext.m_flAlpha = oLastContext.m_flAlpha; oThisContext.m_bDepthMask = oLastContext.m_bDepthMask; oThisContext.m_bDepthTest = oLastContext.m_bDepthTest; oThisContext.m_eDepthFunction = oLastContext.m_eDepthFunction; oThisContext.m_bCull = oLastContext.m_bCull; oThisContext.m_bWinding = oLastContext.m_bWinding; m_pShader = oThisContext.m_pShader; if (m_pShader) m_iProgram = m_pShader->m_iProgram; else m_iProgram = 0; } else { m_pShader = NULL; BindTexture(0); UseMaterial(CMaterialHandle()); UseFrameBuffer(NULL); UseProgram(""); SetViewport(Rect(0, 0, Application()->GetWindowWidth(), Application()->GetWindowHeight())); SetBlend(BLEND_NONE); SetAlpha(1); SetDepthMask(true); SetDepthTest(true); SetDepthFunction(DF_LESS); SetBackCulling(true); SetWinding(true); } }
CRenderingContext::~CRenderingContext() { TAssert(s_aContexts.size()); s_aContexts.pop_back(); if (s_aContexts.size()) { CRenderContext& oContext = GetContext(); UseMaterial(oContext.m_hMaterial); UseFrameBuffer(oContext.m_pFrameBuffer); UseProgram(oContext.m_pShader); if (*oContext.m_szProgram) { oContext.m_bProjectionUpdated = false; oContext.m_bViewUpdated = false; oContext.m_bTransformUpdated = false; } SetViewport(oContext.m_rViewport); SetBlend(oContext.m_eBlend); SetAlpha(oContext.m_flAlpha); SetDepthMask(oContext.m_bDepthMask); SetDepthTest(oContext.m_bDepthTest); SetDepthFunction(oContext.m_eDepthFunction); SetBackCulling(oContext.m_bCull); SetWinding(oContext.m_bWinding); } else { glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, 0); glBindFramebuffer(GL_FRAMEBUFFER, 0); if (m_pRenderer) glViewport(0, 0, (GLsizei)m_pRenderer->m_iWidth, (GLsizei)m_pRenderer->m_iHeight); else glViewport(0, 0, (GLsizei)Application()->GetWindowWidth(), (GLsizei)Application()->GetWindowHeight()); glUseProgram(0); glDisablei(GL_BLEND, 0); glDepthMask(true); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glDepthFunc(GL_LESS); glFrontFace(GL_CCW); } }
void RenderPass::RenderBegin(int iFrameBuffer, bool bClear) { UseFrameBuffer(iFrameBuffer); RenderBegin(m_pCurFrameBuffer.get(), bClear); }