Use static context trick for all platforms.
authorSergey Sharybin <sergey.vfx@gmail.com>
Thu, 15 Sep 2011 15:29:40 +0000 (15:29 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Thu, 15 Sep 2011 15:29:40 +0000 (15:29 +0000)
Should be safe until modifier stack is not threaded.
Solves issues with mingw and older glibc version (like used in release environment).

extern/recastnavigation/Recast/Source/RecastMeshDetail.cpp
source/blender/blenkernel/intern/navmesh_conversion.cpp

index f1d2113..55ba28a 100644 (file)
@@ -94,31 +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];
-       if (p1[0] < p2[0])
-               return -1;
-       else if (p1[0] > p2[0])
-               return 1;
-       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];
+       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])
@@ -126,7 +107,6 @@ static int ptcmp(const void *v1, const void *v2, void* up)
        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
index 9b373db..fbc4775 100644 (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]] );
-}
-#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]] );
+       return ( _qsort_context->recastData[_qsort_context->trisToFacesMap[*(int*)a]] -
+                       _qsort_context->recastData[_qsort_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++)