diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2011-09-15 19:29:40 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2011-09-15 19:29:40 +0400 |
commit | 41e5040e2f66ac4aa2898611459fe26334583b31 (patch) | |
tree | 647e4e6f062d0210babb5a9cfcb3298ec50b9d12 /source/blender | |
parent | f8af915b5152c660a75511333314b780a64b3dba (diff) |
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).
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/intern/navmesh_conversion.cpp | 34 |
1 files changed, 7 insertions, 27 deletions
diff --git a/source/blender/blenkernel/intern/navmesh_conversion.cpp b/source/blender/blenkernel/intern/navmesh_conversion.cpp index 9b373db59ff..fbc4775cf34 100644 --- a/source/blender/blenkernel/intern/navmesh_conversion.cpp +++ b/source/blender/blenkernel/intern/navmesh_conversion.cpp @@ -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++) |