bool GeoVectorProperty::unmapBuffer(DrawEnv *pEnv) { bool returnValue = true; if((getUseVBO() == true) && (getGLId() != 0)) { Window *pWin = pEnv->getWindow(); osgSinkUnusedWarning(pWin); OSGGETGLFUNCBYID_GL3_ES( glBindBuffer, osgGlBindBuffer, _funcBindBuffer, pWin); OSGGETGLFUNCBYID_GL3 ( glUnmapBuffer, osgGlUnmapBuffer, _funcUnmapBuffer, pWin); osgGlBindBuffer(GL_ARRAY_BUFFER_ARB, pWin->getGLObjectId(getGLId())); returnValue = (osgGlUnmapBuffer(GL_ARRAY_BUFFER_ARB) != 0); osgGlBindBuffer(GL_ARRAY_BUFFER_ARB, 0); } return returnValue; }
void *GeoVectorProperty::mapBuffer(GLenum eAccess, DrawEnv *pEnv) { void *returnValue = NULL; if((getUseVBO() == true) && (getGLId() != 0)) { Window *pWin = pEnv->getWindow(); osgSinkUnusedWarning(pWin); OSGGETGLFUNCBYID_GL3_ES( glBindBuffer, osgGlBindBuffer, _funcBindBuffer, pWin); OSGGETGLFUNCBYID_GL3 ( glMapBuffer, osgGlMapBuffer, _funcMapBuffer, pWin); pWin->validateGLObject(getGLId(), pEnv); osgGlBindBuffer(GL_ARRAY_BUFFER_ARB, pWin->getGLObjectId(getGLId())); returnValue = osgGlMapBuffer(GL_ARRAY_BUFFER_ARB, eAccess); osgGlBindBuffer(GL_ARRAY_BUFFER_ARB, 0); } return returnValue; }
void PassiveBackground::clear(DrawEnv *pEnv) { if(_sfClearFrameBufferObject.getValue() == true && pEnv->getActiveFBO() != 0 ) { if(_sfClearCallback.getValue()._func) { _sfClearCallback.getValue()._func(pEnv); } else { Window *win = pEnv->getWindow(); OSGGETGLFUNCBYID_GL3_ES( glBindFramebuffer, osgGlBindFramebuffer, _uiFuncBindFramebuffer, win ); OSGGETGLFUNCBYID_GL3( glBlitFramebuffer, osgGlBlitFramebuffer, _uiFuncBlitFramebuffer, win ); osgGlBindFramebuffer(GL_READ_FRAMEBUFFER_EXT, 0); // FixMe breaks if source size != target size osgGlBlitFramebuffer(pEnv->getPixelLeft (), pEnv->getPixelBottom(), pEnv->getPixelRight (), pEnv->getPixelTop (), pEnv->getPixelLeft (), pEnv->getPixelBottom(), pEnv->getPixelRight (), pEnv->getPixelTop (), (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT), GL_NEAREST); } } }
void HDRStage::postProcess(DrawEnv *pEnv) { UInt32 uiActiveFBO = pEnv->getActiveFBO(); Window *win = pEnv->getWindow(); if(win->hasExtOrVersion(_uiFramebufferObjectExt, 0x0300, 0x0200) == false) { FNOTICE(("Framebuffer objects not supported on Window %p!\n", static_cast<void *>(win))); return; } OSGGETGLFUNCBYID_GL3( glDrawBuffers, osgGlDrawBuffers, _uiFuncDrawBuffers, win); glColor3f(1.f, 1.f, 1.f); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); HDRStageData *pData = pEnv->getData<HDRStageData *>(_iDataSlotId); if(pData == NULL) { return; } // Shrink to w/2 h/2 FrameBufferObject *pShrinkTarget = pData->getShrinkRenderTarget(); ChunkMaterial *pSHM = pData->getShrinkMaterial(); pShrinkTarget->activate(pEnv); glViewport(0, 0, pEnv->getPixelWidth () / 2, pEnv->getPixelHeight() / 2); State *pShrinkState = pSHM->getState(); pEnv->activateState(pShrinkState, NULL); this->renderQuad(); pShrinkTarget->deactivate(pEnv); // Shrink to w/4 h/4 FrameBufferObject *pBlurTarget = pData->getBlurRenderTarget(); pBlurTarget->editMFDrawBuffers()->clear(); pBlurTarget->editMFDrawBuffers()->push_back(GL_COLOR_ATTACHMENT0_EXT); pBlurTarget->activate(pEnv); glViewport(0, 0, pEnv->getPixelWidth () / 4, pEnv->getPixelHeight() / 4); ChunkMaterial *pBLM = pData->getBlurMaterial(); State *pBlurState = pBLM->getState(); pEnv->activateState(pBlurState, NULL); this->renderQuad(); GLenum aDrawBuffers[] = { GL_COLOR_ATTACHMENT0_EXT }; // HBlur pBlurTarget->activate(pEnv); glViewport(0, 0, pEnv->getPixelWidth () / 4, pEnv->getPixelHeight() / 4); #define OVERSHADER 1 #if OVERSHADER StateOverride oOverride; oOverride.addOverride(pData->getHBlurShader()->getClassId(), pData->getHBlurShader()); pEnv->activateState(pBlurState, &oOverride); #else pData->getHBlurShader()->activate(pEnv); #endif aDrawBuffers[0] = GL_COLOR_ATTACHMENT1_EXT; osgGlDrawBuffers(1, aDrawBuffers); this->renderQuad(); #if !OVERSHADER pData->getHBlurShader()->deactivate(pEnv); #endif // VBlur #if OVERSHADER StateOverride oOverride1; oOverride1.addOverride(pData->getVBlurShader()->getClassId(), pData->getVBlurShader()); pEnv->activateState(pBlurState, &oOverride1); #else pData->getVBlurShader()->activate(pEnv); #endif aDrawBuffers[0] = GL_COLOR_ATTACHMENT0_EXT; osgGlDrawBuffers(1, aDrawBuffers); this->renderQuad(); #if !OVERSHADER pData->getVBlurShader()->deactivate(pEnv); #endif if(uiActiveFBO == 0) { pBlurTarget->deactivate(pEnv); } else { FrameBufferObject::activateFBOById(pEnv, uiActiveFBO); } // Tonemap pass glDisable(GL_DEPTH_TEST); glViewport(pEnv->getPixelLeft (), pEnv->getPixelBottom(), pEnv->getPixelWidth (), pEnv->getPixelHeight()); ChunkMaterial *pTCM = pData->getToneMappingMaterial(); State *pTState = pTCM->getState(); pEnv->activateState(pTState, NULL); this->renderQuad(); glEnable(GL_DEPTH_TEST); pEnv->deactivateState(); glPopMatrix(); }
void PointChunk::deactivate(DrawEnv *pEnv, UInt32) { #ifndef OSG_OGL_ES2 if(getSize() != 1.f) glPointSize(1.f); #endif Window *pWin = pEnv->getWindow(); osgSinkUnusedWarning(pWin); #if !defined(OSG_OGL_COREONLY) || defined(OSG_CHECK_COREONLY) if(getSmooth()) glDisable(GL_POINT_SMOOTH); #endif #if GL_ARB_point_parameters if(getMinSize() >= 0.f) { if(pEnv->getWindow()->hasExtOrVersion(_extPointParameters, 0x0104)) { OSGGETGLFUNCBYID_GL3( glPointParameterf, osgGlPointParameterf, _funcIdPointParameterf, pWin); #if !defined(OSG_OGL_COREONLY) || defined(OSG_CHECK_COREONLY) OSGGETGLFUNCBYID_GL3( glPointParameterfv, osgGlPointParameterfv, _funcIdPointParameterfv, pWin); osgGlPointParameterf(GL_POINT_SIZE_MIN_ARB, 0); osgGlPointParameterf(GL_POINT_SIZE_MAX_ARB, 1e10); #endif osgGlPointParameterf(GL_POINT_FADE_THRESHOLD_SIZE_ARB, 1); #if !defined(OSG_OGL_COREONLY) || defined(OSG_CHECK_COREONLY) GLfloat att[3] = { 1, 0, 0 }; osgGlPointParameterfv(GL_POINT_DISTANCE_ATTENUATION_ARB, att); #endif } } #endif #if !defined(OSG_OGL_COREONLY) || defined(OSG_CHECK_COREONLY) #if GL_ARB_point_sprite if(getSprite()) { if(pEnv->getWindow()->hasExtOrVersion(_extPointSpriteARB, 0x0200)) { glDisable(GL_POINT_SPRITE_ARB); } } #endif #endif #if ! defined(GL_ARB_point_parameters) && ! defined(GL_ARB_point_sprite) pEnv; #endif }
void PointChunk::changeFrom(DrawEnv *pEnv, StateChunk *old_chunk, UInt32 ) { PointChunk *old = dynamic_cast<PointChunk *>(old_chunk); #ifndef OSG_OGL_ES2 if(getSize() != old->getSize()) glPointSize(getSize()); #endif #if !defined(OSG_OGL_COREONLY) || defined(OSG_CHECK_COREONLY) if(getSmooth() && !old->getSmooth()) { glEnable(GL_POINT_SMOOTH); } else if(!getSmooth() && old->getSmooth()) { glDisable(GL_POINT_SMOOTH); } #endif Window *pWin = pEnv->getWindow(); osgSinkUnusedWarning(pWin); #if GL_ARB_point_parameters if(getMinSize() >= 0.f) { if(pEnv->getWindow()->hasExtOrVersion(_extPointParameters, 0x0104)) { OSGGETGLFUNCBYID_GL3( glPointParameterf, osgGlPointParameterf, _funcIdPointParameterf, pWin); #if !defined(OSG_OGL_COREONLY) || defined(OSG_CHECK_COREONLY) OSGGETGLFUNCBYID_GL3( glPointParameterfv, osgGlPointParameterfv, _funcIdPointParameterfv, pWin); osgGlPointParameterf(GL_POINT_SIZE_MIN_ARB, getMinSize()); osgGlPointParameterf(GL_POINT_SIZE_MAX_ARB, getMaxSize()); #endif osgGlPointParameterf(GL_POINT_FADE_THRESHOLD_SIZE_ARB, getFadeThreshold()); #if !defined(OSG_OGL_COREONLY) || defined(OSG_CHECK_COREONLY) GLfloat att[3] = { getConstantAttenuation (), getLinearAttenuation (), getQuadraticAttenuation() }; osgGlPointParameterfv(GL_POINT_DISTANCE_ATTENUATION_ARB, att); #endif } } else if(old->getMinSize() >= 0.f) { if(pEnv->getWindow()->hasExtOrVersion(_extPointParameters, 0x0104)) { OSGGETGLFUNCBYID_GL3( glPointParameterf, osgGlPointParameterf, _funcIdPointParameterf, pWin); #if !defined(OSG_OGL_COREONLY) || defined(OSG_CHECK_COREONLY) OSGGETGLFUNCBYID_GL3( glPointParameterfv, osgGlPointParameterfv, _funcIdPointParameterfv, pWin); osgGlPointParameterf(GL_POINT_SIZE_MIN_ARB, 0); osgGlPointParameterf(GL_POINT_SIZE_MAX_ARB, 1e10); #endif osgGlPointParameterf(GL_POINT_FADE_THRESHOLD_SIZE_ARB, 1); #if !defined(OSG_OGL_COREONLY) || defined(OSG_CHECK_COREONLY) GLfloat att[3] = { 1, 0, 0 }; osgGlPointParameterfv(GL_POINT_DISTANCE_ATTENUATION_ARB, att); #endif } } #endif #if !defined(OSG_OGL_COREONLY) || defined(OSG_CHECK_COREONLY) #if GL_ARB_point_sprite if(getSprite() && !old->getSprite()) { if(pEnv->getWindow()->hasExtOrVersion(_extPointSpriteARB, 0x0200)) { #if GL_NV_point_sprite if(pEnv->getWindow()->hasExtension(_extPointSpriteNV)) { OSGGETGLFUNCBYID_GL3( glPointParameterf, osgGlPointParameterf, _funcIdPointParameterf, pWin); osgGlPointParameterf(GL_POINT_SPRITE_R_MODE_NV, Real32(getRMode())); } #endif glEnable(GL_POINT_SPRITE_ARB); } } else if(!getSprite() && old->getSprite()) { if(pEnv->getWindow()->hasExtOrVersion(_extPointSpriteARB, 0x0200)) { glDisable(GL_POINT_SPRITE_ARB); } } #endif #endif #if ! defined(GL_ARB_point_parameters) && ! defined(GL_ARB_point_sprite) pEnv; #endif }
bool VboFunctions::initFunctionPointers( Window* window ) { assert( window ); OSGGETGLFUNCBYID_GL3_ES(glBindBuffer, osgGlBindBuffer, bindBufferId_ , window); bindBuffer = osgGlBindBuffer; OSGGETGLFUNCBYID_GL3_ES(glBufferData, osgGlBufferData, bufferDataId_, window); bufferData = osgGlBufferData; OSGGETGLFUNCBYID_GL3_ES(glBufferSubData, osgGlBufferSubData, bufferSubDataId_, window); bufferSubData = osgGlBufferSubData; OSGGETGLFUNCBYID_GL3_ES(glDeleteBuffers, osgGlDeleteBuffers, deleteBuffersId_, window); deleteBuffers = osgGlDeleteBuffers; OSGGETGLFUNCBYID_GL3_ES(glGenBuffers, osgGlGenBuffers, genBuffersId_, window); genBuffers = osgGlGenBuffers; OSGGETGLFUNCBYID_GL3_ES(glGetBufferParameteriv, osgGlGetBufferParameteriv, getBufferParameterivId_, window); getBufferParameteriv = osgGlGetBufferParameteriv; OSGGETGLFUNCBYID_GL3(glGetBufferPointerv, osgGlGetBufferPointerv, getBufferPointervId_, window); getBufferPointerv = osgGlGetBufferPointerv; OSGGETGLFUNCBYID_GL3(glGetBufferSubData, osgGlGetBufferSubData, getBufferSubDataId_, window); getBufferSubData = osgGlGetBufferSubData; OSGGETGLFUNCBYID_GL3_ES(glIsBuffer, osgGlIsBuffer, isBufferId_, window); isBuffer = osgGlIsBuffer; OSGGETGLFUNCBYID_GL3_ES(glMapBuffer, osgGlMapBuffer, mapBufferId_, window); mapBuffer = osgGlMapBuffer; OSGGETGLFUNCBYID_GL3_ES(glUnmapBuffer, osgGlUnmapBuffer, unmapBufferId_, window); unmapBuffer = osgGlUnmapBuffer; return ( bindBuffer != 0 ) && ( bufferData != 0 ) && ( bufferSubData != 0 ) && ( deleteBuffers != 0 ) && ( genBuffers != 0 ) && ( getBufferPointerv != 0 ) && ( getBufferSubData != 0 ) && ( isBuffer != 0 ) && ( mapBuffer != 0 ) && ( unmapBuffer != 0 ); }
void GeoVectorProperty::activate(DrawEnv *pEnv, UInt32 slot) { Window *pWin = pEnv->getWindow(); bool isGeneric = (slot >= 16); // !!!HACK. needs to be replaced for 2.0 slot &= 15; bool hasVBO = pWin->hasExtOrVersion(_extVertexBufferObject, 0x0105, 0x0200); osgSinkUnusedWarning(pWin); if(hasVBO && isGeneric == true) { OSGGETGLFUNCBYID_GL3_ES( glVertexAttribPointer, osgGlVertexAttribPointer, _funcVertexAttribPointerARB, pWin); if(getGLId() != 0 && getUseVBO()) // Do we have a VBO? { pWin->validateGLObject(getGLId(), pEnv); OSGGETGLFUNCBYID_GL3_ES( glBindBuffer, osgGlBindBuffer, _funcBindBuffer, pWin); osgGlBindBuffer(GL_ARRAY_BUFFER_ARB, pWin->getGLObjectId(getGLId())); osgGlVertexAttribPointer(slot, getDimension(), getFormat (), getNormalize(), getStride (), 0); osgGlBindBuffer(GL_ARRAY_BUFFER_ARB, 0); } else { osgGlVertexAttribPointer(slot, getDimension(), getFormat (), getNormalize(), getStride (), getData ()); } OSGGETGLFUNCBYID_GL3_ES( glEnableVertexAttribArray, osgGlEnableVertexAttribArray, _funcEnableVertexAttribArrayARB, pWin); osgGlEnableVertexAttribArray(slot); OSGGETGLFUNCBYID_GL3_ES( glVertexAttribDivisor, osgGlVertexAttribDivisor, _funcVertexAttribDivisorARB, pWin); osgGlVertexAttribDivisor(slot, _sfDivisor.getValue()); } else { #if !defined(OSG_OGL_COREONLY) || defined(OSG_CHECK_COREONLY) const void *pData = NULL; OSGGETGLFUNCBYID_GL3_ES( glBindBuffer, osgGlBindBuffer, _funcBindBuffer, pWin); hasVBO &= getUseVBO() && (getGLId() != 0); if(hasVBO == true) // Do we have a VBO? { pWin->validateGLObject(getGLId(), pEnv); osgGlBindBuffer(GL_ARRAY_BUFFER_ARB, pWin->getGLObjectId(getGLId())); } else { pData = getData(); } switch(slot) { case 0: glVertexPointer(getDimension(), getFormat (), getStride (), pData ); glEnableClientState(GL_VERTEX_ARRAY); break; case 2: glNormalPointer(getFormat(), getStride(), pData ); glEnableClientState(GL_NORMAL_ARRAY); break; case 3: glColorPointer(getDimension(), getFormat (), getStride (), pData ); glEnableClientState(GL_COLOR_ARRAY); break; case 4: if(pWin->hasExtOrVersion(_extSecondaryColor, 0x0104)) { OSGGETGLFUNCBYID_GL3( glSecondaryColorPointer, osgGlSecondaryColorPointer, _funcSecondaryColorPointer, pWin); osgGlSecondaryColorPointer(getDimension(), getFormat (), getStride (), pData ); glEnableClientState(GL_SECONDARY_COLOR_ARRAY_EXT); } else { FWARNING(("GeoVectorProperty::activate: Window " "has no Secondary Color extension\n")); } break; case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: { if(pWin->hasExtOrVersion(_extMultitexture, 0x0103, 0x0200)) { OSGGETGLFUNCBYID_GL3_ES( glClientActiveTexture, osgGlClientActiveTexture, _funcClientActiveTextureARB, pWin); osgGlClientActiveTexture(GL_TEXTURE0_ARB + slot - 8); glTexCoordPointer(getDimension(), getFormat (), getStride (), pData ); glEnableClientState(GL_TEXTURE_COORD_ARRAY); } else if(slot == 8) { glTexCoordPointer(getDimension(), getFormat (), getStride (), pData ); glEnableClientState(GL_TEXTURE_COORD_ARRAY); } else { SWARNING << "GeoVectorProperty::activate: Window " << "has no Multi Texture extension" << std::endl; } } break; default: FWARNING(("GeoVectorProperty::activate: Non-Generic" " attribute nr. %d unknown!\n", slot)); break; } if(hasVBO == true) // Do we have a VBO? { osgGlBindBuffer(GL_ARRAY_BUFFER_ARB, 0); } #endif } }