void ShaderExecutableChunk::updateProceduralVariables( DrawEnv *pEnv, UInt32 uiUpdateDependents) { UInt32 uiProgram = pEnv->getActiveShader(); if(uiProgram == 0) return; const ShaderProgramVariables::MFProceduralVariablesType *pMFVars = NULL; if(_sfVariables.getValue() != NULL) { pMFVars = _sfVariables.getValue()->getMFProceduralVariables(); } if(pMFVars == NULL || pMFVars->size() == 0) { return; } MFInt32 &vVarLocations = *this->editMFProceduralVariableLocations(); OSG_ASSERT(pMFVars->size() == vVarLocations.size()); MFInt32::iterator mLocIt = vVarLocations.begin(); ShaderProgramVariables::MFProceduralVariablesType::const_iterator mVarIt = pMFVars->begin(); ShaderProgramVariables::MFProceduralVariablesType::const_iterator mVarEnd = pMFVars->end (); #ifdef OSG_1_COMPATX if(_fParameterCallback) { OSGGETGLFUNC(OSGglGetUniformLocationProc, osgGlGetUniformLocation, ShaderProgram::getFuncIdGetUniformLocation()); _fParameterCallback(osgGlGetUniformLocation, pEnv, uiProgram); } #endif for(; mVarIt != mVarEnd; ++mVarIt, ++mLocIt) { ShaderVariable *pVar = *mVarIt; switch(pVar->getTypeId()) { case ShaderVariable::SHVTypeOSG: { ShaderVariableOSG *p = dynamic_cast<ShaderVariableOSG *>(pVar); if(0x0000 == (p->getDependency() & uiUpdateDependents)) continue; if(*mLocIt == -1) { OSGGETGLFUNC(OSGglGetUniformLocationProc, osgGlGetUniformLocation, ShaderProgram::getFuncIdGetUniformLocation()); *mLocIt = osgGlGetUniformLocation(uiProgram, p->getName().c_str()); } p->evaluate(pEnv, *mLocIt); } break; case ShaderVariable::SHVTypeFunctor: { ShaderVariableFunctor *p = dynamic_cast<ShaderVariableFunctor *>(pVar); if(0x0000 == (p->getDependency() & uiUpdateDependents)) continue; if(*mLocIt == -1) { OSGGETGLFUNC(OSGglGetUniformLocationProc, osgGlGetUniformLocation, ShaderProgram::getFuncIdGetUniformLocation()); *mLocIt = osgGlGetUniformLocation(uiProgram, p->getName().c_str()); } #ifdef OSG_1_COMPAT switch(p->getFuncMode()) { case 0: { p->evaluate(pEnv, *mLocIt); } break; case 1: { OSGGETGLFUNC( OSGglGetUniformLocationProc, osgGlGetUniformLocation, ShaderProgram::getFuncIdGetUniformLocation()); p->evaluate(osgGlGetUniformLocation, pEnv, uiProgram); } break; case 2: { p->evaluate(p, pEnv, uiProgram); } break; } #else p->evaluate(pEnv, *mLocIt); #endif } break; default: break; } } }
void ComputeShaderChunk::updateProceduralVariables( DrawEnv *pEnv, UInt32 uiUpdateDependents) { UInt32 uiProgram = pEnv->getActiveShader(); if(uiProgram == 0) return; const ShaderProgramVariables::MFProceduralVariablesType *pMFVars = NULL; if(_sfVariables.getValue() != NULL) { pMFVars = _sfVariables.getValue()->getMFProceduralVariables(); } if(pMFVars == NULL || pMFVars->size() == 0) { return; } MFInt32 &vVarLocations = *this->editMFProceduralVariableLocations(); OSG_ASSERT(pMFVars->size() == vVarLocations.size()); MFInt32::iterator mLocIt = vVarLocations.begin(); ShaderProgramVariables::MFProceduralVariablesType::const_iterator mVarIt = pMFVars->begin(); ShaderProgramVariables::MFProceduralVariablesType::const_iterator mVarEnd = pMFVars->end (); Window *pWin = pEnv->getWindow(); osgSinkUnusedWarning(pWin); for(; mVarIt != mVarEnd; ++mVarIt, ++mLocIt) { ShaderVariable *pVar = *mVarIt; switch(pVar->getTypeId()) { case ShaderVariable::SHVTypeOSG: { ShaderVariableOSG *p = dynamic_cast<ShaderVariableOSG *>(pVar); if(0x0000 == (p->getDependency() & uiUpdateDependents)) continue; if(*mLocIt == -1) { OSGGETGLFUNCBYID_GL3_ES( glGetUniformLocation, osgGlGetUniformLocation, ShaderProgram::getFuncIdGetUniformLocation(), pWin); *mLocIt = osgGlGetUniformLocation(uiProgram, p->getName().c_str()); } p->evaluate(pEnv, *mLocIt); } break; case ShaderVariable::SHVTypeFunctor: { ShaderVariableFunctor *p = dynamic_cast<ShaderVariableFunctor *>(pVar); if(0x0000 == (p->getDependency() & uiUpdateDependents)) continue; if(*mLocIt == -1) { OSGGETGLFUNCBYID_GL3_ES( glGetUniformLocation, osgGlGetUniformLocation, ShaderProgram::getFuncIdGetUniformLocation(), pWin); *mLocIt = osgGlGetUniformLocation(uiProgram, p->getName().c_str()); } p->evaluate(pEnv, *mLocIt); } break; default: break; } } }