Revision: 40234
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=40234
Author:   nazgul
Date:     2011-09-15 15:29:40 +0000 (Thu, 15 Sep 2011)
Log Message:
-----------
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).

Modified Paths:
--------------
    trunk/blender/extern/recastnavigation/Recast/Source/RecastMeshDetail.cpp
    trunk/blender/source/blender/blenkernel/intern/navmesh_conversion.cpp

Modified: 
trunk/blender/extern/recastnavigation/Recast/Source/RecastMeshDetail.cpp
===================================================================
--- trunk/blender/extern/recastnavigation/Recast/Source/RecastMeshDetail.cpp    
2011-09-15 14:52:48 UTC (rev 40233)
+++ trunk/blender/extern/recastnavigation/Recast/Source/RecastMeshDetail.cpp    
2011-09-15 15:29:40 UTC (rev 40234)
@@ -94,12 +94,12 @@
        
        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 @@
        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 @@
        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

Modified: trunk/blender/source/blender/blenkernel/intern/navmesh_conversion.cpp
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/navmesh_conversion.cpp       
2011-09-15 14:52:48 UTC (rev 40233)
+++ trunk/blender/source/blender/blenkernel/intern/navmesh_conversion.cpp       
2011-09-15 15:29:40 UTC (rev 40234)
@@ -290,27 +290,15 @@
        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 @@
        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++)

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to