Commit: 27307a2be646540ea8d6b843113f05482d2e00f6
Author: YimingWu
Date:   Fri Aug 28 12:41:29 2020 +0800
Branches: lanpr-under-gp
https://developer.blender.org/rB27307a2be646540ea8d6b843113f05482d2e00f6

LineArt: Better manuverability with quick cancel.

===================================================================

M       source/blender/editors/include/ED_lineart.h
M       source/blender/editors/lineart/lineart_cpu.c

===================================================================

diff --git a/source/blender/editors/include/ED_lineart.h 
b/source/blender/editors/include/ED_lineart.h
index 332d794d3ca..1455bd2ae99 100644
--- a/source/blender/editors/include/ED_lineart.h
+++ b/source/blender/editors/include/ED_lineart.h
@@ -299,6 +299,7 @@ typedef struct LineartSharedResource {
   struct BLI_mempool *mp_batch_list;
 
   struct TaskPool *background_render_task;
+  struct TaskPool *pending_render_task;
 
   eLineartInitStatus init_complete;
 
diff --git a/source/blender/editors/lineart/lineart_cpu.c 
b/source/blender/editors/lineart/lineart_cpu.c
index b9a0fb91ac2..033553d90e1 100644
--- a/source/blender/editors/lineart/lineart_cpu.c
+++ b/source/blender/editors/lineart/lineart_cpu.c
@@ -405,21 +405,6 @@ static void 
lineart_occlusion_single_line(LineartRenderBuffer *rb,
   }
 }
 
-static bool lineart_calculation_is_canceled(void)
-{
-  bool is_canceled;
-  BLI_spin_lock(&lineart_share.lock_render_status);
-  switch (lineart_share.flag_render_status) {
-    case LRT_RENDER_INCOMPELTE:
-      is_canceled = true;
-      break;
-    default:
-      is_canceled = false;
-  }
-  BLI_spin_unlock(&lineart_share.lock_render_status);
-  return is_canceled;
-}
-
 static void lineart_occlusion_worker(TaskPool *__restrict UNUSED(pool), 
LineartRenderTaskInfo *rti)
 {
   LineartRenderBuffer *rb = lineart_share.render_buffer_shared;
@@ -433,40 +418,44 @@ static void lineart_occlusion_worker(TaskPool *__restrict 
UNUSED(pool), LineartR
     }
 
     /* Monitoring cancelation flag every once a while. */
-    if (lineart_calculation_is_canceled())
+    if (ED_lineart_calculation_flag_check(LRT_RENDER_CANCELING)) {
       return;
+    }
 
     for (lip = (void *)rti->crease; lip && lip->prev != 
rti->crease_pointers.last;
          lip = lip->next) {
       lineart_occlusion_single_line(rb, lip->data, rti->thread_id);
     }
 
-    if (lineart_calculation_is_canceled())
+    if (ED_lineart_calculation_flag_check(LRT_RENDER_CANCELING)) {
       return;
+    }
 
     for (lip = (void *)rti->intersection; lip && lip->prev != 
rti->intersection_pointers.last;
          lip = lip->next) {
       lineart_occlusion_single_line(rb, lip->data, rti->thread_id);
     }
 
-    if (lineart_calculation_is_canceled())
+    if (ED_lineart_calculation_flag_check(LRT_RENDER_CANCELING)) {
       return;
+    }
 
     for (lip = (void *)rti->material; lip && lip->prev != 
rti->material_pointers.last;
          lip = lip->next) {
       lineart_occlusion_single_line(rb, lip->data, rti->thread_id);
     }
-
-    if (lineart_calculation_is_canceled())
+    if (ED_lineart_calculation_flag_check(LRT_RENDER_CANCELING)) {
       return;
+    }
 
     for (lip = (void *)rti->edge_mark; lip && lip->prev != 
rti->edge_mark_pointers.last;
          lip = lip->next) {
       lineart_occlusion_single_line(rb, lip->data, rti->thread_id);
     }
 
-    if (lineart_calculation_is_canceled())
+    if (ED_lineart_calculation_flag_check(LRT_RENDER_CANCELING)) {
       return;
+    }
   }
 }
 
@@ -1525,6 +1514,10 @@ static void lineart_geometry_object_load(Object *ob,
       CanFindFreestyle = 1;
     }
 
+    if (ED_lineart_calculation_flag_check(LRT_RENDER_CANCELING)) {
+      return;
+    }
+
     orv = lineart_mem_aquire(&rb->render_data_pool, sizeof(LineartRenderVert) 
* bm->totvert);
     ort = lineart_mem_aquire(&rb->render_data_pool, bm->totface * 
rb->triangle_size);
     orl = lineart_mem_aquire(&rb->render_data_pool, sizeof(LineartRenderLine) 
* bm->totedge);
@@ -2542,7 +2535,7 @@ LineartRenderBuffer 
*ED_lineart_create_render_buffer(Scene *scene)
 {
   /* Re-init render_buffer_shared */
   if (lineart_share.render_buffer_shared) {
-    ED_lineart_destroy_render_data();
+    ED_lineart_destroy_render_data_external();
   }
 
   LineartRenderBuffer *rb = MEM_callocN(sizeof(LineartRenderBuffer), "Line Art 
render buffer");
@@ -2591,6 +2584,13 @@ LineartRenderBuffer 
*ED_lineart_create_render_buffer(Scene *scene)
 
   lineart_share.allow_overlapping_edges = (scene->lineart.flags & 
LRT_ALLOW_OVERLAPPING_EDGES) !=
                                           0;
+
+  BLI_spin_lock(&lineart_share.lock_render_status);
+  lineart_share.background_render_task = lineart_share.pending_render_task;
+  lineart_share.pending_render_task = NULL;
+  BLI_spin_unlock(&lineart_share.lock_render_status);
+
+  ED_lineart_calculation_flag_set(LRT_RENDER_IDLE);
   return rb;
 }
 
@@ -3280,6 +3280,7 @@ static void lineart_add_triangles(LineartRenderBuffer *rb)
   int i, lim;
   int x1, x2, y1, y2;
   int r, co;
+  int temp_count = 0;
 
   LISTBASE_FOREACH (LineartRenderElementLinkNode *, reln, 
&rb->triangle_buffer_pointers) {
     rt = reln->pointer;
@@ -3296,8 +3297,12 @@ static void lineart_add_triangles(LineartRenderBuffer 
*rb)
                 rb, &rb->initial_bounding_areas[r * 4 + co], rt, 0, 1, 0);
           }
         }
+        temp_count++;
       } /* else throw away. */
       rt = (void *)(((unsigned char *)rt) + rb->triangle_size);
+      if ((!(temp_count % 1000)) && 
ED_lineart_calculation_flag_check(LRT_RENDER_CANCELING)) {
+        return;
+      }
     }
   }
 }
@@ -3760,27 +3765,18 @@ void 
ED_lineart_compute_feature_lines_background(Depsgraph *dg, const int show_f
 {
   TaskPool *tp_read;
   BLI_spin_lock(&lineart_share.lock_render_status);
-  tp_read = lineart_share.background_render_task;
+  tp_read = lineart_share.pending_render_task;
   BLI_spin_unlock(&lineart_share.lock_render_status);
 
   /* If the calculation is already started then bypass it. */
   if (ED_lineart_calculation_flag_check(LRT_RENDER_RUNNING)) {
     /* Set CANCEL flag, and when operation is canceled, flag will become 
FINISHED. */
     ED_lineart_calculation_flag_set(LRT_RENDER_CANCELING);
-
-    while (!ED_lineart_calculation_flag_check(LRT_RENDER_FINISHED)) {
-      /* Wait for canceling */
-    }
-
-    /* If canceling is not used, then early return. */
-    /* BLI_spin_unlock(&lineart_share.lock_loader); */
-    /* return; */
   }
 
   if (tp_read) {
-    BLI_task_pool_work_and_wait(lineart_share.background_render_task);
-    BLI_task_pool_free(lineart_share.background_render_task);
-    lineart_share.background_render_task = NULL;
+    BLI_spin_unlock(&lineart_share.lock_loader);
+    return;
   }
 
   LRT_FeatureLineWorker *flw = MEM_callocN(sizeof(LRT_FeatureLineWorker), 
"Line Art Worker");
@@ -3791,7 +3787,7 @@ void 
ED_lineart_compute_feature_lines_background(Depsgraph *dg, const int show_f
 
   TaskPool *tp = BLI_task_pool_create_background(0, TASK_PRIORITY_HIGH);
   BLI_spin_lock(&lineart_share.lock_render_status);
-  lineart_share.background_render_task = tp;
+  lineart_share.pending_render_task = tp;
   BLI_spin_unlock(&lineart_share.lock_render_status);
 
   BLI_task_pool_push(tp, 
(TaskRunFunction)lineart_compute_feature_lines_worker, flw, true, NULL);

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

Reply via email to