void ShaderProgram::changed(ConstFieldMaskArg whichField, 
                            UInt32            origin,
                            BitVector         details)
{
    Inherited::changed(whichField, origin, details);

    if(0x0000 != (whichField & VariablesFieldMask))
    {
        if(details ==  0x0001)
        {
            MFParentFieldContainerPtr::const_iterator parentsIt  = 
                this->_mfParents.begin();
        
            MFParentFieldContainerPtr::const_iterator parentsEnd = 
                this->_mfParents.end();
            
            while(parentsIt != parentsEnd)
            {
                (*parentsIt)->changed(
                    TypeTraits<BitVector>::One << parentsIt.getParentFieldPos(),
                    ChangedOrigin::Child,
                    VariablesFieldMask);
                
                ++parentsIt;
            }
        }
    }

    if(0x0000 != (whichField & ProgramFieldMask))
    {
        MFParentFieldContainerPtr::const_iterator parentsIt  = 
            this->_mfParents.begin();
        
        MFParentFieldContainerPtr::const_iterator parentsEnd = 
            this->_mfParents.end();
        
        while(parentsIt != parentsEnd)
        {
            (*parentsIt)->changed(
                TypeTraits<BitVector>::One << parentsIt.getParentFieldPos(),
                ChangedOrigin::Child,
                ProgramFieldMask);
            
            ++parentsIt;
        }


        Window::reinitializeGLObject(this->getGLId());
    }
}
void ShaderProgramVariableChunk::changed(ConstFieldMaskArg whichField, 
                                         UInt32            origin,
                                         BitVector         details)
{
    if(0x0000 != (whichField & VariablesFieldMask))
    {
        ShaderProgramVariables *pVars = _sfVariables.getValue();

        if(pVars != NULL)
        {
            if(details == 0x0001)
            {
                MFParentFieldContainerPtr::const_iterator parentsIt  = 
                    this->_mfParents.begin();
        
                MFParentFieldContainerPtr::const_iterator parentsEnd = 
                    this->_mfParents.end();
            
                for(; parentsIt != parentsEnd; ++parentsIt)
                {
                    (*parentsIt)->changed(
                        TypeTraits<BitVector>::One << 
                                               parentsIt.getParentFieldPos(),
                        ChangedOrigin::Child,
                        VariablesFieldMask);
                
                }
            }
        }
    }

    Inherited::changed(whichField, origin, details);
}
void ShaderParameter::changed(ConstFieldMaskArg whichField, 
                              UInt32            origin,
                              BitVector         details)
{
    const ShaderParameter *pThis = this;

    MFParentFieldContainerPtr::const_iterator parentsIt  = 
        pThis->_mfParents.begin();

    MFParentFieldContainerPtr::const_iterator parentsEnd = 
        pThis->_mfParents.end();
    
    while(parentsIt != parentsEnd)
    {
        (*parentsIt)->changed(
            TypeTraits<BitVector>::One << parentsIt.getParentFieldPos(),
            ChangedOrigin::Child,
            0);
        
        ++parentsIt;
    }

    Inherited::changed(whichField, origin, details);
}
void ShaderProgramVariables::changed(ConstFieldMaskArg whichField, 
                                     UInt32            origin,
                                     BitVector         details)
{
    if(0x0000 != (whichField & VariablesFieldMask))
    {
        BitVector d;

        if(origin != ChangedOrigin::Child)
        {
            d = 0x0001;
        }
        else
        {
            d = 0x0002;

            OSG_ASSERT(details < _mfVariableChanged.size());

            editVariableChanged(details) = true;
        }

        MFParentFieldContainerPtr::const_iterator parentsIt  = 
            this->_mfParents.begin();
        
        MFParentFieldContainerPtr::const_iterator parentsEnd = 
            this->_mfParents.end();
        
        while(parentsIt != parentsEnd)
        {
            (*parentsIt)->changed(
                TypeTraits<BitVector>::One << parentsIt.getParentFieldPos(),
                ChangedOrigin::Child,
                d);
            
            ++parentsIt;
        }
    }

    if(0x0000 != (whichField & ProceduralVariablesFieldMask))
    {
        BitVector d;

        if(origin != ChangedOrigin::Child)
        {
            d = 0x0001;
        }
        else
        {
            d = 0x0002;
        }

        MFParentFieldContainerPtr::const_iterator parentsIt  = 
            this->_mfParents.begin();
        
        MFParentFieldContainerPtr::const_iterator parentsEnd = 
            this->_mfParents.end();
        
        while(parentsIt != parentsEnd)
        {
            (*parentsIt)->changed(
                TypeTraits<BitVector>::One << parentsIt.getParentFieldPos(),
                ChangedOrigin::Child,
                d);
                
            ++parentsIt;
        }
    }

    Inherited::changed(whichField, origin, details);
}