Commit: 0c95f4f774c671c8c0d9bd19d6ea8e211b13b554
Author: YimingWu
Date:   Fri Aug 21 21:32:44 2020 +0800
Branches: lanpr-under-gp
https://developer.blender.org/rB0c95f4f774c671c8c0d9bd19d6ea8e211b13b554

LineArt: "Intersection Only" flag for objects/collections

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

M       source/blender/editors/include/ED_lineart.h
M       source/blender/editors/lineart/lineart_cpu.c
M       source/blender/makesdna/DNA_collection_types.h
M       source/blender/makesdna/DNA_object_types.h
M       source/blender/makesrna/intern/rna_collection.c
M       source/blender/makesrna/intern/rna_object.c

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

diff --git a/source/blender/editors/include/ED_lineart.h 
b/source/blender/editors/include/ED_lineart.h
index 20c7c497324..b9adf76d325 100644
--- a/source/blender/editors/include/ED_lineart.h
+++ b/source/blender/editors/include/ED_lineart.h
@@ -60,7 +60,7 @@ typedef struct LineartRenderTriangle {
   short material_id;
   ListBase intersecting_verts;
   unsigned char transparency_mask;
-  char cull_status;
+  unsigned char flags; /* eLineartTriangleFlags */
 } LineartRenderTriangle;
 
 typedef struct LineartRenderTriangleThread {
@@ -338,12 +338,13 @@ typedef struct LineartSharedResource {
 #define LRT_MEMORY_POOL_1MB 1048576
 #define LRT_MEMORY_POOL_64MB 67108864
 
-typedef enum eLineartCullState {
+typedef enum eLineartTriangleFlags {
   LRT_CULL_DONT_CARE = 0,
-  LRT_CULL_USED = 1,
-  LRT_CULL_DISCARD = 2,
-  LRT_CULL_GENERATED = 3,
-} eLineartCullState;
+  LRT_CULL_USED = (1 << 0),
+  LRT_CULL_DISCARD = (1 << 1),
+  LRT_CULL_GENERATED = (1 << 2),
+  LRT_TRIANGLE_INTERSECTION_ONLY = (1 << 3),
+} eLineartTriangleFlags;
 
 /** Controls how many lines a worker thread is processing at one request.
  * There's no significant performance impact on choosing different values.
diff --git a/source/blender/editors/lineart/lineart_cpu.c 
b/source/blender/editors/lineart/lineart_cpu.c
index e6e62fb7497..cab367e528b 100644
--- a/source/blender/editors/lineart/lineart_cpu.c
+++ b/source/blender/editors/lineart/lineart_cpu.c
@@ -369,7 +369,8 @@ static void 
lineart_occlusion_single_line(LineartRenderBuffer *rb,
     LISTBASE_FOREACH (LinkData *, lip, &nba->linked_triangles) {
       rt = lip->data;
       if (rt->testing[thread_id] == rl || rl->l->intersecting_with == (void 
*)rt ||
-          rl->r->intersecting_with == (void *)rt) {
+          rl->r->intersecting_with == (void *)rt ||
+          (rt->base.flags & LRT_TRIANGLE_INTERSECTION_ONLY)) {
         continue;
       }
       rt->testing[thread_id] = rl;
@@ -675,7 +676,14 @@ static void 
lineart_render_line_assign_with_triangle(LineartRenderTriangle *rt)
 static void lineart_triangle_post(LineartRenderTriangle *rt, 
LineartRenderTriangle *orig)
 {
   copy_v3_v3_db(rt->gn, orig->gn);
-  rt->cull_status = LRT_CULL_GENERATED;
+  rt->flags = LRT_CULL_GENERATED;
+}
+
+static void lineart_triangle_set_cull_flag(LineartRenderTriangle *rt, unsigned 
char flag)
+{
+  unsigned char intersection_only = (rt->flags & 
LRT_TRIANGLE_INTERSECTION_ONLY);
+  rt->flags = flag;
+  rt->flags |= intersection_only;
 }
 
 /** This function cuts triangles that are (partially or fully) behind near 
clipping plane.
@@ -765,7 +773,7 @@ static void lineart_main_cull_triangles(LineartRenderBuffer 
*rb)
           /** triangle completely behind near plane, throw it away
            * also remove render lines form being computed.
            */
-          rt->cull_status = LRT_CULL_DISCARD;
+          lineart_triangle_set_cull_flag(rt, LRT_CULL_DISCARD);
           BLI_remlink(&rb->all_render_lines, (void *)rt->rl[0]);
           rt->rl[0]->next = rt->rl[0]->prev = 0;
           BLI_remlink(&rb->all_render_lines, (void *)rt->rl[1]);
@@ -776,7 +784,7 @@ static void lineart_main_cull_triangles(LineartRenderBuffer 
*rb)
         case 2:
           /** Two points behind near plane, cut those and
            * generate 2 new points, 3 lines and 1 triangle */
-          rt->cull_status = LRT_CULL_USED;
+          lineart_triangle_set_cull_flag(rt, LRT_CULL_USED);
 
           /** (!in0) means "when point 0 is visible".
            * conditons for point 1, 2 are the same idea.
@@ -1014,7 +1022,7 @@ static void 
lineart_main_cull_triangles(LineartRenderBuffer *rb)
         case 1:
           /** Two points behind near plane, cut those and
            * generate 2 new points, 4 lines and 2 triangles */
-          rt->cull_status = LRT_CULL_USED;
+          lineart_triangle_set_cull_flag(rt, LRT_CULL_USED);
 
           /** (in0) means "when point 0 is invisible".
            * conditons for point 1, 2 are the same idea.
@@ -1371,7 +1379,7 @@ static void lineart_geometry_object_load(Object *ob,
 
   int usage = override_usage ? override_usage : ob->lineart.usage;
 
-  if (usage == OBJECT_FEATURE_LINE_EXCLUDE) {
+  if (usage == OBJECT_LRT_EXCLUDE) {
     return;
   }
 
@@ -1478,7 +1486,7 @@ static void lineart_geometry_object_load(Object *ob,
       LineartRenderLineSegment *rls = lineart_mem_aquire(&rb->render_data_pool,
                                                          
sizeof(LineartRenderLineSegment));
       BLI_addtail(&rl->segments, rls);
-      if (usage == OBJECT_FEATURE_LINE_INHERENT) {
+      if (usage == OBJECT_LRT_INHERENT) {
         BLI_addtail(&rb->all_render_lines, rl);
       }
       rl++;
@@ -1510,6 +1518,10 @@ static void lineart_geometry_object_load(Object *ob,
       normalize_v3_d(rt->gn);
       lineart_render_line_assign_with_triangle(rt);
 
+      if (usage == OBJECT_LRT_INTERSECTION_ONLY) {
+        rt->flags |= LRT_TRIANGLE_INTERSECTION_ONLY;
+      }
+
       rt = (LineartRenderTriangle *)(((unsigned char *)rt) + 
rb->triangle_size);
     }
 
@@ -1526,34 +1538,41 @@ int ED_lineart_object_collection_usage_check(Collection 
*c, Object *ob)
 {
 
   if (!c) {
-    return OBJECT_FEATURE_LINE_INHERENT;
+    return OBJECT_LRT_INHERENT;
   }
 
-  int object_is_used = (ob->lineart.usage == OBJECT_FEATURE_LINE_INCLUDE ||
-                        ob->lineart.usage == OBJECT_FEATURE_LINE_INHERENT);
+  int object_is_used = (ob->lineart.usage == OBJECT_LRT_INCLUDE ||
+                        ob->lineart.usage == OBJECT_LRT_INHERENT ||
+                        ob->lineart.usage == OBJECT_LRT_INTERSECTION_ONLY);
 
   if (object_is_used && (c->lineart_usage != COLLECTION_LRT_INCLUDE)) {
     if (BKE_collection_has_object_recursive(c, (Object *)(ob->id.orig_id))) {
       if (c->lineart_usage == COLLECTION_LRT_EXCLUDE) {
-        return OBJECT_FEATURE_LINE_EXCLUDE;
+        return OBJECT_LRT_EXCLUDE;
       }
       else if (c->lineart_usage == COLLECTION_LRT_OCCLUSION_ONLY) {
-        return OBJECT_FEATURE_LINE_OCCLUSION_ONLY;
+        return OBJECT_LRT_OCCLUSION_ONLY;
+      }
+      else if (c->lineart_usage == COLLECTION_LRT_INTERSECTION_ONLY) {
+        return OBJECT_LRT_INTERSECTION_ONLY;
       }
     }
   }
 
   if (c->children.first == NULL) {
     if (BKE_collection_has_object(c, ob)) {
-      if (ob->lineart.usage == OBJECT_FEATURE_LINE_INHERENT) {
-        if ((c->lineart_usage == COLLECTION_LRT_OCCLUSION_ONLY)) {
-          return OBJECT_FEATURE_LINE_OCCLUSION_ONLY;
+      if (ob->lineart.usage == OBJECT_LRT_INHERENT) {
+        if (c->lineart_usage == COLLECTION_LRT_OCCLUSION_ONLY) {
+          return OBJECT_LRT_OCCLUSION_ONLY;
+        }
+        else if (c->lineart_usage == COLLECTION_LRT_EXCLUDE) {
+          return OBJECT_LRT_EXCLUDE;
         }
-        else if ((c->lineart_usage == COLLECTION_LRT_EXCLUDE)) {
-          return OBJECT_FEATURE_LINE_EXCLUDE;
+        else if (c->lineart_usage == COLLECTION_LRT_INTERSECTION_ONLY) {
+          return OBJECT_LRT_INTERSECTION_ONLY;
         }
         else {
-          return OBJECT_FEATURE_LINE_INHERENT;
+          return OBJECT_LRT_INHERENT;
         }
       }
       else {
@@ -1561,18 +1580,18 @@ int ED_lineart_object_collection_usage_check(Collection 
*c, Object *ob)
       }
     }
     else {
-      return OBJECT_FEATURE_LINE_INHERENT;
+      return OBJECT_LRT_INHERENT;
     }
   }
 
   LISTBASE_FOREACH (CollectionChild *, cc, &c->children) {
     int result = ED_lineart_object_collection_usage_check(cc->collection, ob);
-    if (result > OBJECT_FEATURE_LINE_INHERENT) {
+    if (result > OBJECT_LRT_INHERENT) {
       return result;
     }
   }
 
-  return OBJECT_FEATURE_LINE_INHERENT;
+  return OBJECT_LRT_INHERENT;
 }
 
 static void lineart_main_load_geometries(Depsgraph *depsgraph,
@@ -2205,8 +2224,7 @@ static void 
lineart_triangle_intersections_in_bounding_area(LineartRenderBuffer
     testing_triangle = lip->data;
     rtt = (LineartRenderTriangleThread *)testing_triangle;
     if (testing_triangle == rt || rtt->testing[0] == (LineartRenderLine *)rt ||
-        (rt->cull_status == LRT_CULL_GENERATED &&
-         testing_triangle->cull_status == LRT_CULL_GENERATED) ||
+        ((rt->flags & LRT_CULL_GENERATED) && (testing_triangle->flags & 
LRT_CULL_GENERATED)) ||
         lineart_triangle_share_edge(rt, testing_triangle)) {
       continue;
     }
@@ -3164,7 +3182,7 @@ static void lineart_add_triangles(LineartRenderBuffer *rb)
     rt = reln->pointer;
     lim = reln->element_count;
     for (i = 0; i < lim; i++) {
-      if (rt->cull_status == LRT_CULL_USED || rt->cull_status == 
LRT_CULL_DISCARD) {
+      if ((rt->flags & LRT_CULL_USED) || (rt->flags & LRT_CULL_DISCARD)) {
         rt = (void *)(((unsigned char *)rt) + rb->triangle_size);
         continue;
       }
diff --git a/source/blender/makesdna/DNA_collection_types.h 
b/source/blender/makesdna/DNA_collection_types.h
index d32f3cb2fd1..bfadb18e352 100644
--- a/source/blender/makesdna/DNA_collection_types.h
+++ b/source/blender/makesdna/DNA_collection_types.h
@@ -47,6 +47,7 @@ enum CollectionFeatureLine_Usage {
   COLLECTION_LRT_INCLUDE = 0,
   COLLECTION_LRT_OCCLUSION_ONLY = (1 << 0),
   COLLECTION_LRT_EXCLUDE = (1 << 1),
+  COLLECTION_LRT_INTERSECTION_ONLY = (1 << 2),
 };
 
 typedef struct Collection {
diff --git a/source/blender/makesdna/DNA_object_types.h 
b/source/blender/makesdna/DNA_object_types.h
index f43d9ef7671..08af6a7353e 100644
--- a/source/blender/makesdna/DNA_object_types.h
+++ b/source/blender/makesdna/DNA_object_types.h
@@ -201,10 +201,11 @@ typedef struct ObjectLineart {
 } ObjectLineart;
 
 enum ObjectFeatureLine_Usage {
-  OBJECT_FEATURE_LINE_INHERENT = 0,
-  OBJECT_FEATURE_LINE_INCLUDE = (1 << 0),
-  OBJECT_FEATURE_LINE_OCCLUSION_ONLY = (1 << 1),
-  OBJECT_FEATURE_LINE_EXCLUDE = (1 << 2),
+  OBJECT_LRT_INHERENT = 0,
+  OBJECT_LRT_INCLUDE = (1 << 0),
+  OBJECT_LRT_OCCLUSION_ONLY = (1 << 1),
+  OBJECT_LRT_EXCLUDE = (1 << 2),
+  OBJECT_LRT_INTERSECTION_ONLY = (1 << 3),
 };
 
 typedef struct Object {
diff --git a/source/blender/makesrna/intern/rna_collection.c 
b/source/blender/makesrna/intern/rna_collection.c
index 2f09dabe345..700a8e768e0 100644
--- a/source/blender/makesrna/intern/rna_collect

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to