Merge branch 'master' into blender2.8
authorCampbell Barton <ideasman42@gmail.com>
Wed, 19 Jul 2017 17:53:44 +0000 (03:53 +1000)
committerCampbell Barton <ideasman42@gmail.com>
Wed, 19 Jul 2017 17:53:44 +0000 (03:53 +1000)
source/blender/editors/mesh/editface.c
source/blender/editors/space_file/filelist.c
source/blender/render/intern/raytrace/rayobject_rtbuild.cpp
source/blender/render/intern/raytrace/rayobject_rtbuild.h

index cd7940126ece85386ddaf71c66ca5c46f130a7a0..696f489253060b378d6fd1e96a18c479c48f0840 100644 (file)
@@ -801,25 +801,47 @@ void ED_mesh_mirrtopo_init(Mesh *me, DerivedMesh *dm, const int ob_mode, MirrTop
 
        qsort(topo_pairs, totvert, sizeof(MirrTopoVert_t), mirrtopo_vert_sort);
 
-       /* Since the loop starts at 2, we must define the last index where the hash's differ */
-       last = ((totvert >= 2) && (topo_pairs[0].hash == topo_pairs[1].hash)) ? 0 : 1;
+       last = 0;
 
        /* Get the pairs out of the sorted hashes, note, totvert+1 means we can use the previous 2,
         * but you cant ever access the last 'a' index of MirrTopoPairs */
-       for (a = 2; a <= totvert; a++) {
-               /* printf("I %d %ld %d\n", (a-last), MirrTopoPairs[a  ].hash, MirrTopoPairs[a  ].v_index ); */
-               if ((a == totvert) || (topo_pairs[a - 1].hash != topo_pairs[a].hash)) {
-                       if (a - last == 2) {
-                               if (em) {
-                                       index_lookup[topo_pairs[a - 1].v_index] = (intptr_t)BM_vert_at_index(em->bm, topo_pairs[a - 2].v_index);
-                                       index_lookup[topo_pairs[a - 2].v_index] = (intptr_t)BM_vert_at_index(em->bm, topo_pairs[a - 1].v_index);
+       if (em) {
+               BMVert **vtable = em->bm->vtable;
+               for (a = 1; a <= totvert; a++) {
+                       /* printf("I %d %ld %d\n", (a - last), MirrTopoPairs[a].hash, MirrTopoPairs[a].v_indexs); */
+                       if ((a == totvert) || (topo_pairs[a - 1].hash != topo_pairs[a].hash)) {
+                               const int match_count = a - last;
+                               if (match_count == 2) {
+                                       const int j = topo_pairs[a - 1].v_index, k = topo_pairs[a - 2].v_index;
+                                       index_lookup[j] = (intptr_t)vtable[k];
+                                       index_lookup[k] = (intptr_t)vtable[j];
+                               }
+                               else if (match_count == 1) {
+                                       /* Center vertex. */
+                                       const int j = topo_pairs[a - 1].v_index;
+                                       index_lookup[j] = (intptr_t)vtable[j];
+                               }
+                               last = a;
+                       }
+               }
+       }
+       else {
+               /* same as above, for mesh */
+               for (a = 1; a <= totvert; a++) {
+                       if ((a == totvert) || (topo_pairs[a - 1].hash != topo_pairs[a].hash)) {
+                               const int match_count = a - last;
+                               if (match_count == 2) {
+                                       const int j = topo_pairs[a - 1].v_index, k = topo_pairs[a - 2].v_index;
+                                       index_lookup[j] = k;
+                                       index_lookup[k] = j;
                                }
-                               else {
-                                       index_lookup[topo_pairs[a - 1].v_index] = topo_pairs[a - 2].v_index;
-                                       index_lookup[topo_pairs[a - 2].v_index] = topo_pairs[a - 1].v_index;
+                               else if (match_count == 1) {
+                                       /* Center vertex. */
+                                       const int j = topo_pairs[a - 1].v_index;
+                                       index_lookup[j] = j;
                                }
+                               last = a;
                        }
-                       last = a;
                }
        }
 
index 8e548d7a9bd43894903a8813ff47669cb77669a9..d94aad640b7be2a2b1df298d3e1e62d22b153e77 100644 (file)
@@ -1116,7 +1116,10 @@ static void filelist_cache_preview_runf(TaskPool *__restrict pool, void *taskdat
        preview->img = IMB_thumb_manage(preview->path, THB_LARGE, source);
        IMB_thumb_path_unlock(preview->path);
 
-       preview->flags = 0;  /* Used to tell free func to not free anything! */
+       /* Used to tell free func to not free anything.
+        * Note that we do not care about cas result here,
+        * we only want value attribution itself to be atomic (and memory barier).*/
+       atomic_cas_uint32(&preview->flags, preview->flags, 0);
        BLI_thread_queue_push(cache->previews_done, preview);
 
 //     printf("%s: End (%d)...\n", __func__, threadid);
index 81e41a20f2e6626577af80bae3d63911fd8b9dda..103fa3e6034298b3333acd04e80f99dfa87da522 100644 (file)
@@ -59,6 +59,7 @@ static void rtbuild_init(RTBuilder *b)
        b->primitives.begin   = NULL;
        b->primitives.end     = NULL;
        b->primitives.maxsize = 0;
+       b->depth = 0;
        
        for (int i = 0; i < RTBUILD_MAX_CHILDS; i++)
                b->child_offset[i] = 0;
@@ -178,6 +179,8 @@ RTBuilder *rtbuild_get_child(RTBuilder *b, int child, RTBuilder *tmp)
 {
        rtbuild_init(tmp);
 
+       tmp->depth = b->depth + 1;
+
        for (int i = 0; i < 3; i++)
                if (b->sorted_begin[i]) {
                        tmp->sorted_begin[i] = b->sorted_begin[i] +  b->child_offset[child];
@@ -336,6 +339,15 @@ int rtbuild_heuristic_object_split(RTBuilder *b, int nchilds)
        int baxis = -1, boffset = 0;
 
        if (size > nchilds) {
+               if (b->depth > RTBUILD_MAX_SAH_DEPTH) {
+                       // for degenerate cases we avoid running out of stack space
+                       // by simply splitting the children in the middle
+                       b->child_offset[0] = 0;
+                       b->child_offset[1] = (size+1)/2;
+                       b->child_offset[2] = size;
+                       return 2;
+               }
+
                float bcost = FLT_MAX;
                baxis = -1;
                boffset = size / 2;
index 9e296da144b1f778350e3fe87024e82aaa89e7e6..83042ef3d7ed43b76c06c5c17948d29a4fecc83c 100644 (file)
@@ -49,7 +49,8 @@ extern "C" {
  * generate with simple calls, and then convert to the theirs
  * specific structure on the fly.
  */
-#define RTBUILD_MAX_CHILDS 32
+#define RTBUILD_MAX_CHILDS     32
+#define RTBUILD_MAX_SAH_DEPTH  256
 
 
 typedef struct RTBuilder {
@@ -79,6 +80,8 @@ typedef struct RTBuilder {
        
        float bb[6];
 
+       /* current depth */
+       int depth;
 } RTBuilder;
 
 /* used during creation */