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. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs