BulletWorldImporter didn't properly import m_3indices16 arrays, fixes Issue 562 thanks to Marius Elvert
Support for m_3indices8 import Fix un-initialized memPtr->m_3indices8 at export time, add a workaround at loading time
This commit is contained in:
@@ -94,6 +94,10 @@ void btBulletWorldImporter::deleteAllData()
|
|||||||
|
|
||||||
if(curPart->m_indices16)
|
if(curPart->m_indices16)
|
||||||
delete [] curPart->m_indices16;
|
delete [] curPart->m_indices16;
|
||||||
|
|
||||||
|
if (curPart->m_3indices8)
|
||||||
|
delete [] curPart->m_3indices8;
|
||||||
|
|
||||||
}
|
}
|
||||||
delete [] curData->m_meshPartsPtr;
|
delete [] curData->m_meshPartsPtr;
|
||||||
delete curData;
|
delete curData;
|
||||||
@@ -108,8 +112,13 @@ void btBulletWorldImporter::deleteAllData()
|
|||||||
for (i=0;i<m_shortIndexArrays.size();i++)
|
for (i=0;i<m_shortIndexArrays.size();i++)
|
||||||
{
|
{
|
||||||
btAlignedFree(m_shortIndexArrays[i]);
|
btAlignedFree(m_shortIndexArrays[i]);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (i=0;i<m_charIndexArrays.size();i++)
|
||||||
|
{
|
||||||
|
btAlignedFree(m_charIndexArrays[i]);
|
||||||
|
}
|
||||||
|
|
||||||
for (i=0;i<m_floatVertexArrays.size();i++)
|
for (i=0;i<m_floatVertexArrays.size();i++)
|
||||||
{
|
{
|
||||||
btAlignedFree(m_floatVertexArrays[i]);
|
btAlignedFree(m_floatVertexArrays[i]);
|
||||||
@@ -173,9 +182,9 @@ btTriangleIndexVertexArray* btBulletWorldImporter::createMeshInterface(btStridin
|
|||||||
meshPart.m_triangleIndexBase = (const unsigned char*)indexArray;
|
meshPart.m_triangleIndexBase = (const unsigned char*)indexArray;
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
meshPart.m_indexType = PHY_SHORT;
|
|
||||||
if (meshData.m_meshPartsPtr[i].m_3indices16)
|
if (meshData.m_meshPartsPtr[i].m_3indices16)
|
||||||
{
|
{
|
||||||
|
meshPart.m_indexType = PHY_SHORT;
|
||||||
meshPart.m_triangleIndexStride = sizeof(short int)*3;//sizeof(btShortIntIndexTripletData);
|
meshPart.m_triangleIndexStride = sizeof(short int)*3;//sizeof(btShortIntIndexTripletData);
|
||||||
|
|
||||||
short int* indexArray = (short int*)btAlignedAlloc(sizeof(short int)*3*meshPart.m_numTriangles,16);
|
short int* indexArray = (short int*)btAlignedAlloc(sizeof(short int)*3*meshPart.m_numTriangles,16);
|
||||||
@@ -192,6 +201,7 @@ btTriangleIndexVertexArray* btBulletWorldImporter::createMeshInterface(btStridin
|
|||||||
}
|
}
|
||||||
if (meshData.m_meshPartsPtr[i].m_indices16)
|
if (meshData.m_meshPartsPtr[i].m_indices16)
|
||||||
{
|
{
|
||||||
|
meshPart.m_indexType = PHY_SHORT;
|
||||||
meshPart.m_triangleIndexStride = 3*sizeof(short int);
|
meshPart.m_triangleIndexStride = 3*sizeof(short int);
|
||||||
short int* indexArray = (short int*)btAlignedAlloc(sizeof(short int)*3*meshPart.m_numTriangles,16);
|
short int* indexArray = (short int*)btAlignedAlloc(sizeof(short int)*3*meshPart.m_numTriangles,16);
|
||||||
m_shortIndexArrays.push_back(indexArray);
|
m_shortIndexArrays.push_back(indexArray);
|
||||||
@@ -203,6 +213,23 @@ btTriangleIndexVertexArray* btBulletWorldImporter::createMeshInterface(btStridin
|
|||||||
meshPart.m_triangleIndexBase = (const unsigned char*)indexArray;
|
meshPart.m_triangleIndexBase = (const unsigned char*)indexArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (meshData.m_meshPartsPtr[i].m_3indices8)
|
||||||
|
{
|
||||||
|
meshPart.m_indexType = PHY_UCHAR;
|
||||||
|
meshPart.m_triangleIndexStride = sizeof(unsigned char)*3;
|
||||||
|
|
||||||
|
unsigned char* indexArray = (unsigned char*)btAlignedAlloc(sizeof(unsigned char)*3*meshPart.m_numTriangles,16);
|
||||||
|
m_charIndexArrays.push_back(indexArray);
|
||||||
|
|
||||||
|
for (int j=0;j<meshPart.m_numTriangles;j++)
|
||||||
|
{
|
||||||
|
indexArray[3*j] = meshData.m_meshPartsPtr[i].m_3indices8[j].m_values[0];
|
||||||
|
indexArray[3*j+1] = meshData.m_meshPartsPtr[i].m_3indices8[j].m_values[1];
|
||||||
|
indexArray[3*j+2] = meshData.m_meshPartsPtr[i].m_3indices8[j].m_values[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
meshPart.m_triangleIndexBase = (const unsigned char*)indexArray;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (meshData.m_meshPartsPtr[i].m_vertices3f)
|
if (meshData.m_meshPartsPtr[i].m_vertices3f)
|
||||||
@@ -265,7 +292,7 @@ btStridingMeshInterfaceData* btBulletWorldImporter::createStridingMeshInterfaceD
|
|||||||
|
|
||||||
curNewPart->m_numTriangles = curPart->m_numTriangles;
|
curNewPart->m_numTriangles = curPart->m_numTriangles;
|
||||||
curNewPart->m_numVertices = curPart->m_numVertices;
|
curNewPart->m_numVertices = curPart->m_numVertices;
|
||||||
|
|
||||||
if(curPart->m_vertices3f)
|
if(curPart->m_vertices3f)
|
||||||
{
|
{
|
||||||
curNewPart->m_vertices3f = new btVector3FloatData[curNewPart->m_numVertices];
|
curNewPart->m_vertices3f = new btVector3FloatData[curNewPart->m_numVertices];
|
||||||
@@ -283,9 +310,13 @@ btStridingMeshInterfaceData* btBulletWorldImporter::createStridingMeshInterfaceD
|
|||||||
curNewPart->m_vertices3d = NULL;
|
curNewPart->m_vertices3d = NULL;
|
||||||
|
|
||||||
int numIndices = curNewPart->m_numTriangles * 3;
|
int numIndices = curNewPart->m_numTriangles * 3;
|
||||||
|
///the m_3indices8 was not initialized in some Bullet versions, this can cause crashes at loading time
|
||||||
|
///we catch it by only dealing with m_3indices8 if none of the other indices are initialized
|
||||||
|
bool uninitialized3indices8Workaround =false;
|
||||||
|
|
||||||
if(curPart->m_indices32)
|
if(curPart->m_indices32)
|
||||||
{
|
{
|
||||||
|
uninitialized3indices8Workaround=true;
|
||||||
curNewPart->m_indices32 = new btIntIndexData[numIndices];
|
curNewPart->m_indices32 = new btIntIndexData[numIndices];
|
||||||
memcpy(curNewPart->m_indices32,curPart->m_indices32,sizeof(btIntIndexData) * numIndices);
|
memcpy(curNewPart->m_indices32,curPart->m_indices32,sizeof(btIntIndexData) * numIndices);
|
||||||
}
|
}
|
||||||
@@ -294,19 +325,30 @@ btStridingMeshInterfaceData* btBulletWorldImporter::createStridingMeshInterfaceD
|
|||||||
|
|
||||||
if(curPart->m_3indices16)
|
if(curPart->m_3indices16)
|
||||||
{
|
{
|
||||||
curNewPart->m_3indices16 = new btShortIntIndexTripletData[numIndices];
|
uninitialized3indices8Workaround=true;
|
||||||
memcpy(curNewPart->m_3indices16,curPart->m_3indices16,sizeof(btShortIntIndexTripletData) * numIndices);
|
curNewPart->m_3indices16 = new btShortIntIndexTripletData[curNewPart->m_numTriangles];
|
||||||
|
memcpy(curNewPart->m_3indices16,curPart->m_3indices16,sizeof(btShortIntIndexTripletData) * curNewPart->m_numTriangles);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
curNewPart->m_3indices16 = NULL;
|
curNewPart->m_3indices16 = NULL;
|
||||||
|
|
||||||
if(curPart->m_indices16)
|
if(curPart->m_indices16)
|
||||||
{
|
{
|
||||||
|
uninitialized3indices8Workaround=true;
|
||||||
curNewPart->m_indices16 = new btShortIntIndexData[numIndices];
|
curNewPart->m_indices16 = new btShortIntIndexData[numIndices];
|
||||||
memcpy(curNewPart->m_indices16,curPart->m_indices16,sizeof(btShortIntIndexData) * numIndices);
|
memcpy(curNewPart->m_indices16,curPart->m_indices16,sizeof(btShortIntIndexData) * numIndices);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
curNewPart->m_indices16 = NULL;
|
curNewPart->m_indices16 = NULL;
|
||||||
|
|
||||||
|
if(!uninitialized3indices8Workaround && curPart->m_3indices8)
|
||||||
|
{
|
||||||
|
curNewPart->m_3indices8 = new btCharIndexTripletData[curNewPart->m_numTriangles];
|
||||||
|
memcpy(curNewPart->m_3indices8,curPart->m_3indices8,sizeof(btCharIndexTripletData) * curNewPart->m_numTriangles);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
curNewPart->m_3indices8 = NULL;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m_allocatedbtStridingMeshInterfaceDatas.push_back(newData);
|
m_allocatedbtStridingMeshInterfaceDatas.push_back(newData);
|
||||||
|
|||||||
@@ -77,6 +77,8 @@ protected:
|
|||||||
|
|
||||||
btAlignedObjectArray<int*> m_indexArrays;
|
btAlignedObjectArray<int*> m_indexArrays;
|
||||||
btAlignedObjectArray<short int*> m_shortIndexArrays;
|
btAlignedObjectArray<short int*> m_shortIndexArrays;
|
||||||
|
btAlignedObjectArray<unsigned char*> m_charIndexArrays;
|
||||||
|
|
||||||
btAlignedObjectArray<btVector3FloatData*> m_floatVertexArrays;
|
btAlignedObjectArray<btVector3FloatData*> m_floatVertexArrays;
|
||||||
btAlignedObjectArray<btVector3DoubleData*> m_doubleVertexArrays;
|
btAlignedObjectArray<btVector3DoubleData*> m_doubleVertexArrays;
|
||||||
|
|
||||||
|
|||||||
@@ -253,9 +253,11 @@ const char* btStridingMeshInterface::serialize(void* dataBuffer, btSerializer* s
|
|||||||
memPtr->m_indices16 = 0;
|
memPtr->m_indices16 = 0;
|
||||||
memPtr->m_indices32 = 0;
|
memPtr->m_indices32 = 0;
|
||||||
memPtr->m_3indices16 = 0;
|
memPtr->m_3indices16 = 0;
|
||||||
|
memPtr->m_3indices8 = 0;
|
||||||
memPtr->m_vertices3f = 0;
|
memPtr->m_vertices3f = 0;
|
||||||
memPtr->m_vertices3d = 0;
|
memPtr->m_vertices3d = 0;
|
||||||
|
|
||||||
|
|
||||||
switch (gfxindextype)
|
switch (gfxindextype)
|
||||||
{
|
{
|
||||||
case PHY_INTEGER:
|
case PHY_INTEGER:
|
||||||
|
|||||||
Reference in New Issue
Block a user