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