Use static context trick for all platforms.

Should be safe until modifier stack is not threaded.
Solves issues with mingw and older glibc version (like used in release environment).
This commit is contained in:
Sergey Sharybin
2011-09-15 15:29:40 +00:00
parent f8af915b51
commit 41e5040e2f
2 changed files with 12 additions and 60 deletions

View File

@@ -94,12 +94,12 @@ static int circumCircle(const float xp, const float yp,
return (drsqr <= rsqr) ? 1 : 0;
}
#ifdef FREE_WINDOWS
static float *_mingw_verts;
static float *_qsort_verts;
static int ptcmp(const void *v1, const void *v2)
{
const float* p1 = &_mingw_verts[(*(const int*)v1)*3];
const float* p2 = &_mingw_verts[(*(const int*)v2)*3];
const float* p1 = &_qsort_verts[(*(const int*)v1)*3];
const float* p2 = &_qsort_verts[(*(const int*)v2)*3];
if (p1[0] < p2[0])
return -1;
else if (p1[0] > p2[0])
@@ -107,26 +107,6 @@ static int ptcmp(const void *v1, const void *v2)
else
return 0;
}
#else
#if defined(_MSC_VER)
static int ptcmp(void* up, const void *v1, const void *v2)
#elif defined(__APPLE__) || defined(__FreeBSD__)
static int ptcmp(void* up, const void *v1, const void *v2)
#else
static int ptcmp(const void *v1, const void *v2, void* up)
#endif
{
const float* verts = (const float*)up;
const float* p1 = &verts[(*(const int*)v1)*3];
const float* p2 = &verts[(*(const int*)v2)*3];
if (p1[0] < p2[0])
return -1;
else if (p1[0] > p2[0])
return 1;
else
return 0;
}
#endif
// Based on Paul Bourke's triangulate.c
// http://astronomy.swin.edu.au/~pbourke/terrain/triangulate/triangulate.c
@@ -136,16 +116,8 @@ static void delaunay(const int nv, float *verts, rcIntArray& idx, rcIntArray& tr
idx.resize(nv);
for (int i = 0; i < nv; ++i)
idx[i] = i;
#if defined(_MSC_VER)
qsort_s(&idx[0], idx.size(), sizeof(int), ptcmp, verts);
#elif defined(__APPLE__) || defined(__FreeBSD__)
qsort_r(&idx[0], idx.size(), sizeof(int), verts, ptcmp);
#elif defined(FREE_WINDOWS)
_mingw_verts = verts;
_qsort_verts = verts;
qsort(&idx[0], idx.size(), sizeof(int), ptcmp);
#else
qsort_r(&idx[0], idx.size(), sizeof(int), ptcmp, verts);
#endif
// Find the maximum and minimum vertex bounds.
// This is to allow calculation of the bounding triangle

View File

@@ -290,27 +290,15 @@ struct SortContext
const int* trisToFacesMap;
};
#ifdef FREE_WINDOWS
static SortContext *_mingw_context;
/* XXX: not thread-safe, but it's called only from modifiers stack
which isn't threaded. Anyway, better to avoid this in the future */
static SortContext *_qsort_context;
static int compareByData(const void * a, const void * b)
{
return ( _mingw_context->recastData[_mingw_context->trisToFacesMap[*(int*)a]] -
_mingw_context->recastData[_mingw_context->trisToFacesMap[*(int*)b]] );
return ( _qsort_context->recastData[_qsort_context->trisToFacesMap[*(int*)a]] -
_qsort_context->recastData[_qsort_context->trisToFacesMap[*(int*)b]] );
}
#else
#if defined(_MSC_VER)
static int compareByData(void* data, const void * a, const void * b)
#elif defined(__APPLE__) || defined(__FreeBSD__)
static int compareByData(void* data, const void * a, const void * b)
#else
static int compareByData(const void * a, const void * b, void* data)
#endif
{
const SortContext* context = (const SortContext*)data;
return ( context->recastData[context->trisToFacesMap[*(int*)a]] -
context->recastData[context->trisToFacesMap[*(int*)b]] );
}
#endif
bool buildNavMeshData(const int nverts, const float* verts,
const int ntris, const unsigned short *tris,
@@ -333,16 +321,8 @@ bool buildNavMeshData(const int nverts, const float* verts,
SortContext context;
context.recastData = recastData;
context.trisToFacesMap = trisToFacesMap;
#if defined(_MSC_VER)
qsort_s(trisMapping, ntris, sizeof(int), compareByData, &context);
#elif defined(__APPLE__) || defined(__FreeBSD__)
qsort_r(trisMapping, ntris, sizeof(int), &context, compareByData);
#elif defined(FREE_WINDOWS)
_mingw_context = &context;
_qsort_context = &context;
qsort(trisMapping, ntris, sizeof(int), compareByData);
#else
qsort_r(trisMapping, ntris, sizeof(int), compareByData, &context);
#endif
//search first valid triangle - triangle of convex polygon
int validTriStart = -1;
for (int i=0; i< ntris; i++)