[Bf-blender-cvs] [a9de546daab] lineart-shadow: Merge branch 'temp-lineart-contained' into lineart-shadow
YimingWu
noreply at git.blender.org
Wed May 18 09:44:38 CEST 2022
Commit: a9de546daabc42cf0f30a8d95a72eaba7c2d82b7
Author: YimingWu
Date: Wed May 18 15:43:59 2022 +0800
Branches: lineart-shadow
https://developer.blender.org/rBa9de546daabc42cf0f30a8d95a72eaba7c2d82b7
Merge branch 'temp-lineart-contained' into lineart-shadow
===================================================================
===================================================================
diff --cc source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
index e5eec589dde,f9722ec94c1..86298f2f319
--- a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
+++ b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
@@@ -513,26 -382,11 +490,15 @@@ typedef struct LineartObjectInfo
LineartElementLinkNode *eln;
int usage;
uint8_t override_intersection_mask;
+ uint8_t silhouette_group;
int global_i_offset;
+ /* Shifted LRT_OBINDEX_SHIFT bits to be combined with object triangle index. */
+ int obindex;
+
bool free_use_mesh;
- /* Threads will add lines inside here, when all threads are done, we combine those into the
- * ones in LineartRenderBuffer. */
- ListBase contour;
- ListBase intersection;
- ListBase crease;
- ListBase material;
- ListBase edge_mark;
- ListBase floating;
- ListBase light_contour;
- ListBase shadow;
-
- /* Note: Data here are allocated with MEM_xxx call instead of in pool. */
+ /* Note: Data inside #pending_edges are allocated with MEM_xxx call instead of in pool. */
struct LineartPendingEdges pending_edges;
} LineartObjectInfo;
diff --cc source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
index e61df9e2639,9a7d066c12a..ee7c82311d8
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
@@@ -2319,11 -2153,11 +2298,11 @@@ static void lineart_geometry_object_loa
continue;
}
- bool edge_added = false;
+ LineartEdge *edge_added = NULL;
/* See eLineartEdgeFlag for details. */
- for (int flag_bit = 0; flag_bit < LRT_EDGE_FLAG_TYPE_MAX_BITS; flag_bit++) {
- char use_type = 1 << flag_bit;
+ for (int flag_bit = 0; flag_bit < LRT_MESH_EDGE_TYPES_COUNT; flag_bit++) {
+ int use_type = LRT_MESH_EDGE_TYPES[flag_bit];
if (!(use_type & edge_nabr->flags)) {
continue;
}
@@@ -2344,33 -2178,17 +2323,37 @@@
}
la_edge->flags = use_type;
la_edge->object_ref = orig_ob;
+ la_edge->from_shadow = (LineartEdge *)LRT_EDGE_IDENTIFIER(ob_info, la_edge);
+ la_edge->silhouette_group = (re_buf->shadow_use_silhouette &&
+ (la_edge->t1 || (la_edge->t1 && la_edge->t2 &&
+ la_edge->t1->silhouette_group ==
+ la_edge->t2->silhouette_group))) ?
+ la_edge->t1->silhouette_group :
+ 0;
+ la_seg->silhouette_group = la_edge->silhouette_group;
BLI_addtail(&la_edge->segments, la_seg);
+
+ if (shadow_eln) {
+ /* TODO(Yiming): It's gonna be faster to do this operation after second stage occlusion if
+ * we only need visible segments to have shadow info, however that way we lose information
+ * on "shadow behind transparency window" type of region. */
+ LineartEdge *shadow_e = lineart_find_matching_edge(shadow_eln,
+ (uint64_t)la_edge->from_shadow);
+ if (shadow_e) {
+ lineart_register_shadow_cuts(re_buf, la_edge, shadow_e);
+ }
+ }
+
if (usage == OBJECT_LRT_INHERIT || usage == OBJECT_LRT_INCLUDE ||
usage == OBJECT_LRT_NO_INTERSECTION) {
- lineart_add_edge_to_list_thread(ob_info, la_edge);
+ lineart_add_edge_to_array_thread(ob_info, la_edge);
}
- edge_added = true;
+ if (edge_added) {
+ edge_added->flags |= LRT_EDGE_FLAG_NEXT_IS_DUPLICATION;
+ }
+
+ edge_added = la_edge;
la_edge++;
la_seg++;
@@@ -2412,12 -2230,14 +2395,12 @@@ static void lineart_object_load_worker(
//- Print size of pending objects.
//- Try to feed this with an array instead of via the pool instead of a custom list
//- Assign the number of objects instead of number of threads
- // printf("thread start: %d\n", olti->thread_id);
for (LineartObjectInfo *obi = olti->pending; obi; obi = obi->next) {
- lineart_geometry_object_load(obi, olti->rb);
+ lineart_geometry_object_load(obi, olti->rb, olti->shadow_elns);
if (G.debug_value == 4000) {
- printf("thread id: %d processed: %d\n", olti->thread_id, obi->original_me->totpoly);
+ // printf("thread id: %d processed: %d\n", olti->thread_id, obi->original_me->totpoly);
}
}
- // printf("thread end: %d\n", olti->thread_id);
}
static uchar lineart_intersection_mask_check(Collection *c, Object *ob)
@@@ -2610,22 -2468,15 +2654,14 @@@ static void lineart_main_load_geometrie
BLI_listbase_clear(&rb->triangle_buffer_pointers);
BLI_listbase_clear(&rb->vertex_buffer_pointers);
- int flags = DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY | DEG_ITER_OBJECT_FLAG_LINKED_VIA_SET |
- DEG_ITER_OBJECT_FLAG_VISIBLE;
-
- /* Instance duplicated & particles. */
- if (allow_duplicates) {
- flags |= DEG_ITER_OBJECT_FLAG_DUPLI;
- }
-
+ double t_start;
+ if (G.debug_value == 4000) {
+ t_start = PIL_check_seconds_timer();
+ }
+
int thread_count = rb->thread_count;
+ int bound_box_discard_count = 0;
+ int obindex = 0;
/* This memory is in render buffer memory pool. So we don't need to free those after loading.
*/
@@@ -2748,12 -2552,11 +2739,11 @@@
}
/* Register a global index increment. See #lineart_triangle_share_edge() and
* #lineart_main_load_geometries() for detailed. It's okay that global_vindex might
- * eventually overflow, in such large scene it's virtually impossible for two vertex of the
- * same numeric index to come close together. */
+ * eventually overflow, in such large scene it's virtually impossible for two vertex of
+ * the same numeric index to come close together. */
obi->global_i_offset = global_i;
global_i += v_count;
-
- lineart_finalize_object_edge_list(&rb->pending_edges, obi);
+ lineart_finalize_object_edge_array(&rb->pending_edges, obi);
}
}
diff --cc source/blender/makesdna/DNA_lineart_types.h
index 46da2abf63c,3b0f2baa310..3cd763367d1
--- a/source/blender/makesdna/DNA_lineart_types.h
+++ b/source/blender/makesdna/DNA_lineart_types.h
@@@ -68,8 -59,10 +68,10 @@@ typedef enum eLineartEdgeFlag
/** For object loading code to use only. */
LRT_EDGE_FLAG_INHIBIT = (1 << 14),
+ /** For discarding duplicated edge types in culling stage. */
+ LRT_EDGE_FLAG_NEXT_IS_DUPLICATION = (1 << 15),
} eLineartEdgeFlag;
-#define LRT_EDGE_FLAG_ALL_TYPE 0x7f
+#define LRT_EDGE_FLAG_ALL_TYPE 0x01ff
#define LRT_EDGE_FLAG_INIT_TYPE 0x37 /* Without material & light contour */
#define LRT_EDGE_FLAG_TYPE_MAX_BITS 7
More information about the Bf-blender-cvs
mailing list