fix compilation for MinGW by substituting qsort_r with qsort. What aversion do MinGW...
authorAntony Riakiotakis <kalast@gmail.com>
Tue, 13 Sep 2011 19:51:58 +0000 (19:51 +0000)
committerAntony Riakiotakis <kalast@gmail.com>
Tue, 13 Sep 2011 19:51:58 +0000 (19:51 +0000)
Warning: a clean build will be needed probably to account for recent merge changes, or link errors will occur.

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

index dab94ea..f1d2113 100644 (file)
@@ -94,7 +94,20 @@ static int circumCircle(const float xp, const float yp,
        
        return (drsqr <= rsqr) ? 1 : 0;
 }
-
+#ifdef FREE_WINDOWS
+static float *_mingw_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__)
@@ -113,6 +126,7 @@ 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
@@ -126,6 +140,9 @@ static void delaunay(const int nv, float *verts, rcIntArray& idx, rcIntArray& tr
        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(&idx[0], idx.size(), sizeof(int), ptcmp);
 #else
        qsort_r(&idx[0], idx.size(), sizeof(int), ptcmp, verts);
 #endif
index cc3b926..9b373db 100644 (file)
@@ -289,6 +289,15 @@ struct SortContext
        const int* recastData;
        const int* trisToFacesMap;
 };
+
+#ifdef FREE_WINDOWS
+static SortContext *_mingw_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__)
@@ -301,6 +310,7 @@ static int compareByData(const void * a, const void * b, void* 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, 
@@ -327,6 +337,9 @@ bool buildNavMeshData(const int nverts, const float* verts,
        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(trisMapping, ntris, sizeof(int), compareByData);
 #else
        qsort_r(trisMapping, ntris, sizeof(int), compareByData, &context);
 #endif