Hello Carsten and Gerrit,

I have not solved this issue yet but I have a little peace of extra 
information.

The crash happens in

void ShaderValueVariable::changed(ConstFieldMaskArg whichField,
                                   UInt32            origin,
                                   BitVector         details)
{
     MFParentFieldContainerPtr::const_iterator parentsIt  =
         this->_mfExeParents.begin();

     MFParentFieldContainerPtr::const_iterator parentsEnd =
         this->_mfExeParents.end();

     MFUInt16::const_iterator idxIt = _mfExeVariableIdx.begin();

     OSG_ASSERT(_mfExeParents.size() == _mfExeVariableIdx.size());

     while(parentsIt != parentsEnd)
     {
->        (*parentsIt)->changed(
             TypeTraits<BitVector>::One << parentsIt.getParentFieldPos(),
             ChangedOrigin::Child,
             *idxIt);

         ++parentsIt;
         ++idxIt;
     }

...

because the _mfExeParents does contain garbage. Now I have looked up the 
place where this container is filled. This is done in

void ShaderProgramVariables::merge(ShaderProgramVariables *pVars,
                                    MFInt32                *pVarLoc,
                                    MFInt32                *pProcVarLoc)
{
...
     for(; vIt != vEnd; ++vIt)
     {
         if(*vIt != NULL)
         {
->            (*vIt)->addExeParent(this,
                                  ShaderProgramVariables::VariablesFieldId,
                                  uiPos);
...

However, I could not find any call to the corresponding subExeParent 
function nor to any other appropriate cleanup method.

void ShaderValueVariable::addExeParent(FieldContainer * const pParent,
                                        UInt16 
uiParentFieldId,
                                        UInt16                 uiVarIdx 
       )
{
     editMField(ExeParentsFieldMask,     _mfExeParents    );
     editMField(ExeVariableIdxFieldMask, _mfExeVariableIdx);

     _mfExeParents    .push_back(pParent, uiParentFieldId);
     _mfExeVariableIdx.push_back(uiVarIdx                );

}

void ShaderValueVariable::subExeParent(FieldContainer * const pParent)
{
     Int32 iParentIdx = _mfExeParents.findIndex(pParent);

     if(iParentIdx != -1)
     {
         editMField(ExeParentsFieldMask,     _mfExeParents    );
         editMField(ExeVariableIdxFieldMask, _mfExeVariableIdx);

         _mfExeParents    .erase(iParentIdx);
         _mfExeVariableIdx.erase(iParentIdx);
     }
}

Maybe this is of some help. Currently, I'm not in the position to solve 
this issue.

Best,
Johannes




------------------------------------------------------------------------------
Introducing Performance Central, a new site from SourceForge and 
AppDynamics. Performance Central is your source for news, insights, 
analysis and resources for efficient Application Performance Management. 
Visit us today!
http://pubads.g.doubleclick.net/gampad/clk?id=48897511&iu=/4140/ostg.clktrk
_______________________________________________
Opensg-users mailing list
Opensg-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensg-users

Reply via email to