Hi Gerrit,
Are you still around? I have a program crash in the setup of the GeoPump data
and I would like to hear your opinion. I have the following scenario: I have a
Geometry core that is filled with usual data (length, types, props, ...) and
this renders fine. Now, during a dynamic operation on the geometry, the mesh
degrades and the length and types becomes empty. That leads to a program crash
in the following code place:
In file OSGGeoSplitVertexArrayPumpGroup.cpp line 133
namespace
{
// collect info for property in 'slot'
bool pumpGLSetup(PumpData &info, UInt16 slot)
{
...
if(info.attribPtr[slot] != NULL &&
info.attribPtr[slot]->getIgnore() == false )
{
info.attribData [slot] = info.attribPtr[slot]->getData();
...
...
}
}
The crash happens in the getData access function, which assumes that the
property has at least one element, i.e. it accesses vector index 0.
I have added the following additional code into this function and the related
functions of the other PumpGroups:
// collect info for property in 'slot'
bool pumpGLSetup(PumpData &info, UInt16 slot)
{
bool retVal = false;
if(slot < info.prop->size())
info.attribPtr[slot] = (*info.prop)[slot];
if(slot < info.propIdx->size())
info.attribIndex[slot] = (*info.propIdx)[slot];
if (info.attribPtr[slot] != NULL && //
NEW
info.attribPtr[slot]->size() == 0 )
// NEW
info.attribPtr[slot] = NULL;
// NEW
if(info.attribPtr[slot] != NULL &&
info.attribPtr[slot]->getIgnore() == false )
{
info.attribData [slot] = info.attribPtr[slot]->getData();
info.attribStride[slot] = info.attribPtr[slot]->getStride();
if(info.attribStride[slot] == 0)
{
info.attribStride[slot] =
info.attribPtr[slot]->getFormatSize() *
info.attribPtr[slot]->getDimension();
}
retVal = true;
}
return retVal;
}
This way the info.attribPtr[slot] stays zero and the calling code of the
function filters the empty props case:
bool GeoSplitVertexArrayPumpGroup::masterClassicGeoSetupPump(...)
{
...
// Setup: get all the data
PumpData pumpData;
pumpData.lengths = lengths;
pumpData.types = types;
pumpData.prop = prop;
pumpData.propIdx = propIdx;
UInt16 nattrib = prop->size32();
for(UInt16 i = 0; i < nattrib; ++i)
{
if(pumpGLSetup(pumpData, i) == false)
continue;
}
// we need positions
if(pumpData.attribPtr[0] == NULL || // catches the situation
pumpData.attribPtr[0]->getUseVBO() == false)
{
...
}
...
}
Now my question is whether this is a good solution to circumvent the program
crash?
Do I have overseen some crucial point?
Do you have a better solution in mind?
In my opinion the situation, that the geometry carries empty properties should
be valid.
What is your opinion?
I hope you still read the mailing list and have some time to give me an answer
to my problem.
Best,
Johannes
_______________________________________________
Opensg-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensg-users