void Graphics::ClearAllBuffers() { SetScissorTest(); SetColorMask(true); SetDepthMask(true); SetStencilMask(~GLuint(0)); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); }
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 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(); }
void Graphics::ClearBuffers(bool color, bool depth, bool stencil) { SetScissorTest(); GLbitfield mask(0); if (color) { mask |= GL_COLOR_BUFFER_BIT; SetColorMask(true); } if (depth) { mask |= GL_DEPTH_BUFFER_BIT; SetDepthMask(true); } if (stencil) { mask |= GL_STENCIL_BUFFER_BIT; SetStencilMask(~GLuint(0)); } glClear(mask); }