[Bf-blender-cvs] [53dc52c83d8] lineart-shadow: LineArt: split shadow functions into separate files.
YimingWu
noreply at git.blender.org
Thu Jun 2 05:17:20 CEST 2022
Commit: 53dc52c83d88652503b78cd1ca3660c197b60d3d
Author: YimingWu
Date: Tue May 31 19:27:43 2022 +0800
Branches: lineart-shadow
https://developer.blender.org/rB53dc52c83d88652503b78cd1ca3660c197b60d3d
LineArt: split shadow functions into separate files.
===================================================================
M source/blender/gpencil_modifiers/CMakeLists.txt
M source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
M source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
M source/blender/gpencil_modifiers/intern/lineart/lineart_intern.h
A source/blender/gpencil_modifiers/intern/lineart/lineart_shadow.c
===================================================================
diff --git a/source/blender/gpencil_modifiers/CMakeLists.txt b/source/blender/gpencil_modifiers/CMakeLists.txt
index c45209661f6..46d1ea2c094 100644
--- a/source/blender/gpencil_modifiers/CMakeLists.txt
+++ b/source/blender/gpencil_modifiers/CMakeLists.txt
@@ -69,6 +69,7 @@ set(SRC
intern/lineart/lineart_cpp_bridge.cc
intern/lineart/lineart_cpu.c
intern/lineart/lineart_ops.c
+ intern/lineart/lineart_shadow.c
intern/lineart/lineart_util.c
intern/lineart/MOD_lineart.h
diff --git a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
index 5e17839e262..38bc230fa7d 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
+++ b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
@@ -460,6 +460,13 @@ typedef enum eLineartTriangleFlags {
LRT_TRIANGLE_MAT_BACK_FACE_CULLING = (1 << 5),
} eLineartTriangleFlags;
+#define LRT_SHADOW_MASK_UNDEFINED 0
+#define LRT_SHADOW_MASK_LIT (1 << 0)
+#define LRT_SHADOW_MASK_SHADED (1 << 1)
+#define LRT_SHADOW_MASK_ENCLOSED_SHAPE (1 << 2)
+#define LRT_SHADOW_MASK_INHIBITED (1 << 3)
+#define LRT_SHADOW_SILHOUETTE_ERASED (1 << 4)
+
/**
* Controls how many edges a worker thread is processing at one request.
* There's no significant performance impact on choosing different values.
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
index e922a8b9163..df94e285d4c 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
@@ -85,25 +85,10 @@ typedef struct LineartIsecData {
int thread_count;
} LineartIsecData;
-static LineartBoundingArea *lineart_edge_first_bounding_area(LineartRenderBuffer *rb,
- double *fbcoord1,
- double *fbcoord2);
-
static void lineart_bounding_area_link_edge(LineartRenderBuffer *rb,
LineartBoundingArea *root_ba,
LineartEdge *e);
-static LineartBoundingArea *lineart_bounding_area_next(LineartBoundingArea *this,
- double *fbcoord1,
- double *fbcoord2,
- double x,
- double y,
- double k,
- int positive_x,
- int positive_y,
- double *next_x,
- double *next_y);
-
static bool lineart_get_edge_bounding_areas(LineartRenderBuffer *rb,
LineartEdge *e,
int *rowbegin,
@@ -124,8 +109,6 @@ static bool lineart_triangle_edge_image_space_occlusion(SpinLock *spl,
double *from,
double *to);
-static void lineart_add_edge_to_array(LineartPendingEdges *pe, LineartEdge *e);
-
static void lineart_bounding_area_link_triangle_cas(LineartRenderBuffer *rb,
LineartBoundingArea *root_ba,
LineartTriangle *tri,
@@ -141,8 +124,6 @@ static void lineart_free_bounding_area_memories(LineartRenderBuffer *rb);
static LineartCache *lineart_init_cache(void);
-static void lineart_clear_linked_edges(LineartRenderBuffer *rb);
-
static void lineart_discard_segment(LineartRenderBuffer *rb, LineartEdgeSegment *es)
{
BLI_spin_lock(&rb->lock_cuts);
@@ -174,23 +155,16 @@ static LineartEdgeSegment *lineart_give_segment(LineartRenderBuffer *rb)
sizeof(LineartEdgeSegment));
}
-#define LRT_SHADOW_MASK_UNDEFINED 0
-#define LRT_SHADOW_MASK_LIT (1 << 0)
-#define LRT_SHADOW_MASK_SHADED (1 << 1)
-#define LRT_SHADOW_MASK_ENCLOSED_SHAPE (1 << 2)
-#define LRT_SHADOW_MASK_INHIBITED (1 << 3)
-#define LRT_SHADOW_SILHOUETTE_ERASED (1 << 4)
-
/**
* Cuts the edge in image space and mark occlusion level for each segment.
*/
-static void lineart_edge_cut(LineartRenderBuffer *rb,
- LineartEdge *e,
- double start,
- double end,
- uchar material_mask_bits,
- uchar mat_occlusion,
- uchar shadow_bits)
+void lineart_edge_cut(LineartRenderBuffer *rb,
+ LineartEdge *e,
+ double start,
+ double end,
+ uchar material_mask_bits,
+ uchar mat_occlusion,
+ uchar shadow_bits)
{
LineartEdgeSegment *es, *ies, *next_es, *prev_es;
LineartEdgeSegment *cut_start_before = 0, *cut_end_before = 0;
@@ -415,21 +389,6 @@ static void lineart_bounding_area_line_add(LineartBoundingArea *ba, LineartEdge
ba->line_count++;
}
-#define LRT_EDGE_BA_MARCHING_BEGIN(fb1, fb2) \
- double x = fb1[0], y = fb1[1]; \
- LineartBoundingArea *ba = lineart_edge_first_bounding_area(rb, fb1, fb2); \
- LineartBoundingArea *nba = ba; \
- double k = (fb2[1] - fb1[1]) / (fb2[0] - fb1[0] + 1e-30); \
- int positive_x = (fb2[0] - fb1[0]) > 0 ? 1 : (fb2[0] == fb1[0] ? 0 : -1); \
- int positive_y = (fb2[1] - fb1[1]) > 0 ? 1 : (fb2[1] == fb1[1] ? 0 : -1); \
- while (nba)
-
-#define LRT_EDGE_BA_MARCHING_NEXT(fb1, fb2) \
- /* Marching along `e->v1` to `e->v2`, searching each possible bounding areas it may touch. */ \
- nba = lineart_bounding_area_next(nba, fb1, fb2, x, y, k, positive_x, positive_y, &x, &y);
-
-#define LRT_EDGE_BA_MARCHING_END
-
static void lineart_occlusion_single_line(LineartRenderBuffer *rb, LineartEdge *e, int thread_id)
{
LineartTriangleThread *tri;
@@ -516,7 +475,7 @@ static void lineart_occlusion_worker(TaskPool *__restrict UNUSED(pool), LineartR
* #MOD_lineart_compute_feature_lines function.
* This function handles all occlusion calculation.
*/
-static void lineart_main_occlusion_begin(LineartRenderBuffer *rb)
+void lineart_main_occlusion_begin(LineartRenderBuffer *rb)
{
int thread_count = rb->thread_count;
LineartRenderTaskInfo *rti = MEM_callocN(sizeof(LineartRenderTaskInfo) * thread_count,
@@ -1259,7 +1218,7 @@ static void lineart_triangle_cull_single(LineartRenderBuffer *rb,
* new topology that represents the trimmed triangle. (which then became a triangle or a square
* formed by two triangles)
*/
-static void lineart_main_cull_triangles(LineartRenderBuffer *rb, bool clip_far)
+void lineart_main_cull_triangles(LineartRenderBuffer *rb, bool clip_far)
{
LineartTriangle *tri;
LineartElementLinkNode *v_eln, *t_eln, *e_eln;
@@ -1394,7 +1353,7 @@ static void lineart_main_cull_triangles(LineartRenderBuffer *rb, bool clip_far)
* Adjacent data is only used during the initial stages of computing.
* So we can free it using this function when it is not needed anymore.
*/
-static void lineart_main_free_adjacent_data(LineartRenderBuffer *rb)
+void lineart_main_free_adjacent_data(LineartRenderBuffer *rb)
{
LinkData *ld;
while ((ld = BLI_pophead(&rb->triangle_adjacent_pointers)) != NULL) {
@@ -1412,7 +1371,7 @@ static void lineart_main_free_adjacent_data(LineartRenderBuffer *rb)
}
}
-static void lineart_main_perspective_division(LineartRenderBuffer *rb)
+void lineart_main_perspective_division(LineartRenderBuffer *rb)
{
LineartVert *vt;
int i;
@@ -1437,7 +1396,7 @@ static void lineart_main_perspective_division(LineartRenderBuffer *rb)
}
}
-static void lineart_main_discard_out_of_frame_edges(LineartRenderBuffer *rb)
+void lineart_main_discard_out_of_frame_edges(LineartRenderBuffer *rb)
{
LineartEdge *e;
int i;
@@ -1807,7 +1766,7 @@ static void loose_data_sum_reduce(const void *__restrict UNUSED(userdata),
lineart_join_loose_edge_arr(final, loose_chunk);
}
-static void lineart_add_edge_to_array(LineartPendingEdges *pe, LineartEdge *e)
+void lineart_add_edge_to_array(LineartPendingEdges *pe, LineartEdge *e)
{
if (pe->next >= pe->max || !pe->max) {
if (!pe->max) {
@@ -1834,7 +1793,7 @@ static void lineart_add_edge_to_array_thread(LineartObjectInfo *obi, LineartEdge
/* Note: For simplicity, this function doesn't actually do anything if you already have data in
* #pe. */
-static void lineart_finalize_object_edge_array_reserve(LineartPendingEdges *pe, int count)
+void lineart_finalize_object_edge_array_reserve(LineartPendingEdges *pe, int count)
{
if (pe->max || pe->array) {
return;
@@ -2012,78 +1971,6 @@ static LineartEdgeNeighbor *lineart_build_edge_neighbor(Mesh *me, int total_edge
return edge_nabr;
}
-static LineartElementLinkNode *lineart_find_matching_eln(ListBase *shadow_elns, int obindex)
-{
- LISTBASE_FOREACH (LineartElementLinkNode *, eln, shadow_elns) {
- if (eln->obindex == obindex) {
- return eln;
- }
- }
- return NULL;
-}
-
-static LineartEdge *lineart_find_matching_edge(LineartElementLinkNode *shadow_eln,
- uint64_t edge_identifier)
-{
- LineartEdge *elist = (LineartEdge *)shadow_eln->pointer;
- for (int i = 0; i < shadow_eln->element_count; i++) {
- if (elist[i].from_shadow == (LineartEdge *)edge_identifier) {
- return &elist[i];
- }
- }
- return NULL;
-}
-
-static void lineart_register_shadow_cuts(LineartRenderBuffer *rb,
- LineartEdge *e,
- LineartEdge *shadow_edge)
-{
- LISTBASE_FOREACH (LineartEdgeSegment *, es, &shadow_edge->segments) {
- /* Convert to view space cutting points. */
- double la1 = es->at;
- double la2 = es->next ? es->next->at : 1.0f;
- la1 = l
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list