[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [40234] trunk/blender: Use static context trick for all platforms.

Sergey Sharybin g.ulairi at gmail.com
Thu Sep 15 17:29:40 CEST 2011


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++)




More information about the Bf-blender-cvs mailing list