[Bf-blender-cvs] [b9d063ab590] lanpr-under-gp: LineArt: Reliable line type determination.

YimingWu noreply at git.blender.org
Sun Sep 27 06:58:34 CEST 2020


Commit: b9d063ab590e66e38201625368fd440682d7d129
Author: YimingWu
Date:   Sun Sep 27 12:58:17 2020 +0800
Branches: lanpr-under-gp
https://developer.blender.org/rBb9d063ab590e66e38201625368fd440682d7d129

LineArt: Reliable line type determination.

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

M	source/blender/editors/lineart/lineart_cpu.c

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

diff --git a/source/blender/editors/lineart/lineart_cpu.c b/source/blender/editors/lineart/lineart_cpu.c
index 60e94787859..aec28906cb0 100644
--- a/source/blender/editors/lineart/lineart_cpu.c
+++ b/source/blender/editors/lineart/lineart_cpu.c
@@ -807,6 +807,13 @@ static void lineart_main_cull_triangles(LineartRenderBuffer *rb, bool clip_far)
   rls = lineart_mem_aquire(&rb->render_data_pool, sizeof(LineartRenderLineSegment)); \
   BLI_addtail(&rl->segments, rls);
 
+  int use_w = 3;
+  if (!rb->cam_is_persp) {
+    clip_start = 0;
+    clip_end = 1;
+    use_w = 2;
+  }
+
   LISTBASE_FOREACH (LineartRenderElementLinkNode *, reln, &rb->triangle_buffer_pointers) {
     if (reln->flags & LRT_ELEMENT_IS_ADDITIONAL) {
       continue;
@@ -822,25 +829,25 @@ static void lineart_main_cull_triangles(LineartRenderBuffer *rb, bool clip_far)
 
       if (clip_far) {
         /* Point outside far plane */
-        if (rt->v[0]->fbcoord[3] > clip_end) {
+        if (rt->v[0]->fbcoord[use_w] > clip_end) {
           in0 = 1;
         }
-        if (rt->v[1]->fbcoord[3] > clip_end) {
+        if (rt->v[1]->fbcoord[use_w] > clip_end) {
           in1 = 1;
         }
-        if (rt->v[2]->fbcoord[3] > clip_end) {
+        if (rt->v[2]->fbcoord[use_w] > clip_end) {
           in2 = 1;
         }
       }
       else {
         /* Point inside near plane */
-        if (rt->v[0]->fbcoord[3] < clip_start) {
+        if (rt->v[0]->fbcoord[use_w] < clip_start) {
           in0 = 1;
         }
-        if (rt->v[1]->fbcoord[3] < clip_start) {
+        if (rt->v[1]->fbcoord[use_w] < clip_start) {
           in1 = 1;
         }
-        if (rt->v[2]->fbcoord[3] < clip_start) {
+        if (rt->v[2]->fbcoord[use_w] < clip_start) {
           in2 = 1;
         }
       }
@@ -2427,7 +2434,7 @@ static void lineart_main_compute_scene_contours(LineartRenderBuffer *rb)
   double *view_vector = rb->view_vector;
   double dot_1 = 0, dot_2 = 0;
   double result;
-  int add = 0;
+  int add = 0, added = 0;
   int contour_count = 0;
   int crease_count = 0;
   int material_count = 0;
@@ -2442,6 +2449,7 @@ static void lineart_main_compute_scene_contours(LineartRenderBuffer *rb)
     for (int i = 0; i < amount; i++) {
       rl = &((LineartRenderLine *)reln->pointer)[i];
       add = 0;
+      added = 0;
       dot_1 = 0;
       dot_2 = 0;
 
@@ -2493,27 +2501,35 @@ static void lineart_main_compute_scene_contours(LineartRenderBuffer *rb)
       }
 
       if (rb->use_contour && (add == 1)) {
+        rl->flags &= ~LRT_EDGE_FLAG_ALL_TYPE;
         rl->flags |= LRT_EDGE_FLAG_CONTOUR;
         lineart_list_append_pointer_static(&rb->contours, &rb->render_data_pool, rl);
+        added = 1;
         contour_count++;
       }
       else if (add == 2) {
+        rl->flags &= ~LRT_EDGE_FLAG_ALL_TYPE;
         rl->flags |= LRT_EDGE_FLAG_CREASE;
         lineart_list_append_pointer_static(&rb->crease_lines, &rb->render_data_pool, rl);
+        added = 1;
         crease_count++;
       }
       else if (rb->use_material && (add == 3)) {
+        rl->flags &= ~LRT_EDGE_FLAG_ALL_TYPE;
         rl->flags |= LRT_EDGE_FLAG_MATERIAL;
         lineart_list_append_pointer_static(&rb->material_lines, &rb->render_data_pool, rl);
+        added = 1;
         material_count++;
       }
       else if (rb->use_edge_marks && (rl->flags & LRT_EDGE_FLAG_EDGE_MARK)) {
-        /*  no need to mark again */
+        rl->flags &= ~LRT_EDGE_FLAG_ALL_TYPE;
+        rl->flags = LRT_EDGE_FLAG_EDGE_MARK;
         add = 4;
         lineart_list_append_pointer_static(&rb->edge_marks, &rb->render_data_pool, rl);
+        added = 1;
         /*  continue; */
       }
-      if (add) {
+      if (added) {
         int r1, r2, c1, c2, row, col;
         if (lineart_get_line_bounding_areas(rb, rl, &r1, &r2, &c1, &c2)) {
           for (row = r1; row != r2 + 1; row++) {
@@ -3949,6 +3965,17 @@ static void lineart_gpencil_notify_targets(Depsgraph *dg)
   DEG_OBJECT_ITER_END;
 }
 
+int lineart_rb_line_types(LineartRenderBuffer *rb)
+{
+  int types = 0;
+  types |= rb->use_contour ? LRT_EDGE_FLAG_CONTOUR : 0;
+  types |= rb->use_crease ? LRT_EDGE_FLAG_CREASE : 0;
+  types |= rb->use_material ? LRT_EDGE_FLAG_MATERIAL : 0;
+  types |= rb->use_edge_marks ? LRT_EDGE_FLAG_EDGE_MARK : 0;
+  types |= rb->use_intersections ? LRT_EDGE_FLAG_INTERSECTION : 0;
+  return types;
+}
+
 void ED_lineart_gpencil_generate_from_chain(Depsgraph *UNUSED(depsgraph),
                                             float **gp_obmat_inverse,
                                             bGPDlayer *UNUSED(gpl),
@@ -4001,12 +4028,14 @@ void ED_lineart_gpencil_generate_from_chain(Depsgraph *UNUSED(depsgraph),
   float mat[4][4];
   unit_m4(mat);
 
+  int enabled_types = lineart_rb_line_types(rb);
+
   LISTBASE_FOREACH (LineartRenderLineChain *, rlc, &rb->chains) {
 
     if (rlc->picked) {
       continue;
     }
-    if (!(rlc->type & types)) {
+    if (!(rlc->type & (types & enabled_types))) {
       continue;
     }
     if (rlc->level > level_end || rlc->level < level_start) {



More information about the Bf-blender-cvs mailing list