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 ShaderExecutableChunk::updateVariableLocations(DrawEnv *pEnv,
                                                    UInt32   uiProgram)
{
    if(uiProgram == 0)
        return;

    const ShaderProgramVariables::MFVariablesType           *pMFVars     = NULL;
    const ShaderProgramVariables::MFProceduralVariablesType *pMFProcVars = NULL;

    if(_sfVariables.getValue() != NULL)
    {
        pMFVars     = _sfVariables.getValue()->getMFVariables          ();
        pMFProcVars = _sfVariables.getValue()->getMFProceduralVariables();
    }

    if(pMFVars != NULL && pMFVars->size() != 0)
    {
        MFInt32 &vVarLocations = *this->editMFVariableLocations();

        OSG_ASSERT(pMFVars->size() == vVarLocations.size());

        MFInt32::iterator mLocIt = vVarLocations.begin();
        
        ShaderProgramVariables::MFVariablesType::const_iterator mVarIt  =
            pMFVars->begin();
        ShaderProgramVariables::MFVariablesType::const_iterator mVarEnd =
            pMFVars->end  ();
        
        OSGGETGLFUNC(OSGglGetUniformLocationProc,
                     osgGlGetUniformLocation,
                     ShaderProgram::getFuncIdGetUniformLocation());

        for(; mVarIt != mVarEnd; ++mVarIt, ++mLocIt)
        {
            *mLocIt = osgGlGetUniformLocation(uiProgram,
                                              (*mVarIt)->getName().c_str());
        }
    }

    if(pMFProcVars != NULL && pMFProcVars->size() != 0)
    {
        MFInt32 &vVarLocations = *this->editMFProceduralVariableLocations();

        OSG_ASSERT(pMFProcVars->size() == vVarLocations.size());

        MFInt32::iterator mLocIt = vVarLocations.begin();
        
        ShaderProgramVariables::MFProceduralVariablesType::const_iterator 
            mVarIt  = pMFProcVars->begin();
        ShaderProgramVariables::MFProceduralVariablesType::const_iterator 
            mVarEnd = pMFProcVars->end  ();
        
        OSGGETGLFUNC(OSGglGetUniformLocationProc,
                     osgGlGetUniformLocation,
                     ShaderProgram::getFuncIdGetUniformLocation());

        for(; mVarIt != mVarEnd; ++mVarIt, ++mLocIt)
        {
            *mLocIt = osgGlGetUniformLocation(uiProgram,
                                              (*mVarIt)->getName().c_str());
        }
    }
}
Exemplo n.º 3
0
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;
        }
    }
}