[Bf-blender-cvs] [f8fd64052eb] temp-lineart-embree: LineArt: embree put occlusion detection inside collider
YimingWu
noreply at git.blender.org
Sat Mar 26 14:29:54 CET 2022
Commit: f8fd64052eb22a4060e0939a6fd6819c5a3d55dc
Author: YimingWu
Date: Sat Mar 26 21:28:50 2022 +0800
Branches: temp-lineart-embree
https://developer.blender.org/rBf8fd64052eb22a4060e0939a6fd6819c5a3d55dc
LineArt: embree put occlusion detection inside collider
===================================================================
M source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
M source/blender/gpencil_modifiers/intern/lineart/lineart_cpp_bridge.cpp
M source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
===================================================================
diff --git a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
index 1b8684ad8c2..04687358c1a 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
+++ b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
@@ -135,6 +135,7 @@ typedef struct LineartEdge {
int v1_obindex, v2_obindex;
struct LineartTriangle *t1, *t2;
ListBase segments;
+ char lock_id;
char min_occ;
/** Also for line type determination on chaining. */
@@ -240,6 +241,8 @@ typedef struct LineartOcclusionPair {
LineartElementLinkNode *eln_triangle;
LineartEdge *e;
LineartTriangle *t;
+ double cut_l;
+ double cut_r;
} LineartOcclusionPair;
typedef struct LineartOcclusionPairRecord {
@@ -250,6 +253,9 @@ typedef struct LineartOcclusionPairRecord {
} LineartOcclusionPairRecord;
typedef struct LineartThreadOcclusionData LineartThreadOcclusionData;
+typedef struct LineartThreadOcclusionDataCombined LineartThreadOcclusionDataCombined;
+
+#define LRT_LOCK_COUNT_OCCLUSION 100
typedef struct LineartRenderBuffer {
struct LineartRenderBuffer *prev, *next;
@@ -303,6 +309,7 @@ typedef struct LineartRenderBuffer {
RTCScene rtcscene_view;
struct LineartThreadOcclusionData *thread_occlusion_data;
+ struct LineartThreadOcclusionDataCombined *thread_occlusion_data_storage;
LineartMeshRecord mesh_record;
LineartOcclusionPairRecord occlusion_record;
@@ -321,6 +328,9 @@ typedef struct LineartRenderBuffer {
/* For managing calculation tasks for multiple threads. */
SpinLock lock_task;
+ /* A series of locks to give threads more breathing room while applying occlusion results. */
+ SpinLock lock_occlusion[100];
+
/* settings */
int max_occlusion_level;
@@ -793,9 +803,15 @@ void lineart_thread_add_occlusion_pair(LineartThreadOcclusionData *data,
LineartElementLinkNode *eln_edge,
LineartElementLinkNode *eln_triangle,
LineartEdge *e,
- LineartTriangle *t);
-LineartOcclusionPair *lineart_thread_finalize_occlusion_result(LineartThreadOcclusionData *data,
- int *result_count);
+ LineartTriangle *t,
+ double cut_l,
+ double cut_r);
+LineartOcclusionPair *lineart_thread_finalize_occlusion_result(
+ LineartThreadOcclusionData *data,
+ int *result_count,
+ LineartThreadOcclusionDataCombined **r_combined_storage);
+void lineart_thread_clear_occlusion_result(LineartThreadOcclusionData *data,
+ LineartThreadOcclusionDataCombined *combined_storage);
#ifdef __cplusplus
}
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpp_bridge.cpp b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpp_bridge.cpp
index 339a8050091..71319d34143 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpp_bridge.cpp
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpp_bridge.cpp
@@ -14,6 +14,9 @@ using blender::threading::EnumerableThreadSpecific;
typedef EnumerableThreadSpecific<Vector<LineartOcclusionPair>> _LineartThreadOcclusionData;
typedef struct LineartThreadOcclusionData LineartThreadOcclusionData;
+typedef Vector<LineartOcclusionPair> _LineartThreadOcclusionDataCombined;
+typedef struct LineartThreadOcclusionDataCombined LineartThreadOcclusionDataCombined;
+
LineartThreadOcclusionData *lineart_thread_init_occlusion_result()
{
_LineartThreadOcclusionData *result = new _LineartThreadOcclusionData;
@@ -24,24 +27,41 @@ void lineart_thread_add_occlusion_pair(LineartThreadOcclusionData *data,
LineartElementLinkNode *eln_edge,
LineartElementLinkNode *eln_triangle,
LineartEdge *e,
- LineartTriangle *t)
+ LineartTriangle *t,
+ double cut_l,
+ double cut_r)
{
LineartOcclusionPair op;
op.e = e;
op.t = t;
op.eln_edge = eln_edge;
op.eln_triangle = eln_triangle;
+ op.cut_l = cut_l;
+ op.cut_r = cut_r;
((_LineartThreadOcclusionData *)data)->local().append(op);
}
/* Memory returned by this needs to be freed manually. */
-LineartOcclusionPair *lineart_thread_finalize_occlusion_result(LineartThreadOcclusionData *data,
- int *result_count)
+LineartOcclusionPair *lineart_thread_finalize_occlusion_result(
+ LineartThreadOcclusionData *data,
+ int *result_count,
+ LineartThreadOcclusionDataCombined **r_combined_storage)
{
Vector<LineartOcclusionPair> *result = new Vector<LineartOcclusionPair>;
for (const Vector<LineartOcclusionPair> &local : (*(_LineartThreadOcclusionData *)data)) {
result->extend(local);
}
*result_count = result->size();
+ *r_combined_storage = (LineartThreadOcclusionDataCombined *)result;
return (LineartOcclusionPair *)result->data();
};
+
+void lineart_thread_clear_occlusion_result(LineartThreadOcclusionData *data,
+ LineartThreadOcclusionDataCombined *combined_storage)
+{
+ _LineartThreadOcclusionData *occlusion_data = (_LineartThreadOcclusionData *)data;
+ _LineartThreadOcclusionDataCombined *combined = (_LineartThreadOcclusionDataCombined *)
+ combined_storage;
+ delete occlusion_data;
+ delete combined;
+};
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
index 40b3cc5ef8b..d83e3c55788 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
@@ -497,27 +497,28 @@ static void lineart_occlusion_worker(TaskPool *__restrict UNUSED(pool), LineartR
LineartOcclusionPairRecord *rec = &rb->occlusion_record;
for (size_t i = rti->ocpair_index_start; i < rti->ocpair_index_end; i++) {
LineartOcclusionPair *op = &rec->array[i];
- if (lineart_triangle_edge_image_space_occlusion(&rb->lock_task,
- op->t,
- op->e,
- rb->camera_pos,
- rb->cam_is_persp,
- rb->allow_overlapping_edges,
- rb->view_projection,
- rb->view_vector,
- rb->shift_x,
- rb->shift_y,
- &l,
- &r)) {
- BLI_spin_lock(&rb->lock_task);
- lineart_edge_cut(rb, op->e, l, r, op->t->material_mask_bits, op->t->mat_occlusion);
- BLI_spin_unlock(&rb->lock_task);
- if (op->e->min_occ > rb->max_occlusion_level) {
- /* No need to calculate any longer on this line because no level more than set value is
- * going to show up in the rendered result. */
- continue;
- }
+ // if (lineart_triangle_edge_image_space_occlusion(&rb->lock_task,
+ // op->t,
+ // op->e,
+ // rb->camera_pos,
+ // rb->cam_is_persp,
+ // rb->allow_overlapping_edges,
+ // rb->view_projection,
+ // rb->view_vector,
+ // rb->shift_x,
+ // rb->shift_y,
+ // &l,
+ // &r)) {
+ if (op->e->min_occ > rb->max_occlusion_level) {
+ /* No need to calculate any longer on this line because no level more than set value is
+ * going to show up in the rendered result. */
+ continue;
}
+ BLI_spin_lock(&rb->lock_occlusion[op->e->lock_id]);
+ lineart_edge_cut(
+ rb, op->e, op->cut_l, op->cut_r, op->t->material_mask_bits, op->t->mat_occlusion);
+ BLI_spin_unlock(&rb->lock_occlusion[op->e->lock_id]);
+ // }
}
#else
@@ -2027,6 +2028,7 @@ static void lineart_geometry_object_load(LineartObjectInfo *obi, LineartRenderBu
la_e = o_la_e;
la_s = o_la_s;
+ int lock_i = 0;
for (i = 0; i < bm->totedge; i++) {
e = BM_edge_at_index(bm, i);
@@ -2044,6 +2046,10 @@ static void lineart_geometry_object_load(LineartObjectInfo *obi, LineartRenderBu
continue;
}
+ la_e->lock_id = lock_i;
+ lock_i++;
+ lock_i %= LRT_LOCK_COUNT_OCCLUSION;
+
la_e->v1 = &orv[BM_elem_index_get(e->v1)];
la_e->v2 = &orv[BM_elem_index_get(e->v2)];
la_e->v1_obindex = la_e->v1->index;
@@ -2390,7 +2396,7 @@ static void lineart_embree_clear_mesh_record(LineartRenderBuffer *rb)
rb->mesh_record.intersection_pair_max = rb->mesh_record.intersection_pair_next = 0;
if (rb->occlusion_record.array) {
- MEM_freeN(rb->occlusion_record.array);
+ // MEM_freeN(rb->occlusion_record.array);
}
rb->occlusion_record.array = NULL;
rb->occlusion_record.max_length = rb->occlusion_record.next = 0;
@@ -2426,9 +2432,9 @@ static void lineart_embree_init_mesh_record(LineartRenderBuffer *rb)
rb->mesh_record.intersection_pair_max,
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list