Blender V4.3
lineart_intern.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2019 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#pragma once
10
11#include "BLI_linklist.h"
12#include "BLI_listbase.h"
13#include "BLI_threads.h"
14
15#include "DNA_lineart_types.h"
16
17#include <math.h>
18#include <string.h>
19
20#ifdef __cplusplus
21extern "C" {
22#endif
23
24struct LineartEdge;
25struct LineartData;
29
30void *lineart_list_append_pointer_pool(ListBase *h, struct LineartStaticMemPool *smp, void *data);
32 struct LineartStaticMemPool *smp,
33 void *data,
34 int size);
36 struct LineartStaticMemPool *smp,
37 void *data);
40 void *data,
41 int size);
44 struct LineartStaticMemPool *smp,
45 void *p,
46 int size);
47
50
52 size_t size);
53void *lineart_mem_acquire(struct LineartStaticMemPool *smp, size_t size);
54void *lineart_mem_acquire_thread(struct LineartStaticMemPool *smp, size_t size);
56
57void lineart_prepend_pool(LinkNode **first, struct LineartStaticMemPool *smp, void *link);
58
59void lineart_matrix_ortho_44d(double (*mProjection)[4],
60 double xMin,
61 double xMax,
62 double yMin,
63 double yMax,
64 double zMin,
65 double zMax);
67 double (*mProjection)[4], double fFov_rad, double fAspect, double zMin, double zMax);
68
70
72
73#define LRT_ITER_ALL_LINES_BEGIN \
74 { \
75 LineartEdge *e; \
76 for (int _i = 0; _i < ld->pending_edges.next; _i++) { \
77 e = ld->pending_edges.array[_i];
78
79#define LRT_ITER_ALL_LINES_NEXT ; /* Doesn't do anything now with new array setup. */
80
81#define LRT_ITER_ALL_LINES_END \
82 LRT_ITER_ALL_LINES_NEXT \
83 } \
84 }
85
86#define LRT_BOUND_AREA_CROSSES(b1, b2) \
87 ((b1)[0] < (b2)[1] && (b1)[1] > (b2)[0] && (b1)[3] < (b2)[2] && (b1)[2] > (b2)[3])
88
89/* Initial bounding area row/column count, setting 10 is tested to be relatively optimal for the
90 * performance under current algorithm. */
91#define LRT_BA_ROWS 10
92
93#define LRT_EDGE_BA_MARCHING_BEGIN(fb1, fb2) \
94 double x = fb1[0], y = fb1[1]; \
95 LineartBoundingArea *ba = lineart_edge_first_bounding_area(ld, fb1, fb2); \
96 LineartBoundingArea *nba = ba; \
97 double k = (fb2[1] - fb1[1]) / (fb2[0] - fb1[0] + 1e-30); \
98 int positive_x = (fb2[0] - fb1[0]) > 0 ? 1 : (fb2[0] == fb1[0] ? 0 : -1); \
99 int positive_y = (fb2[1] - fb1[1]) > 0 ? 1 : (fb2[1] == fb1[1] ? 0 : -1); \
100 while (nba)
101
102#define LRT_EDGE_BA_MARCHING_NEXT(fb1, fb2) \
103 /* Marching along `e->v1` to `e->v2`, searching each possible bounding areas it may touch. */ \
104 nba = lineart_bounding_area_next(nba, fb1, fb2, x, y, k, positive_x, positive_y, &x, &y);
105
106#define LRT_EDGE_BA_MARCHING_END
107
120void lineart_main_cull_triangles(struct LineartData *ld, bool clip_far);
128void lineart_main_load_geometries(struct Depsgraph *depsgraph,
129 struct Scene *scene,
130 struct Object *camera,
131 struct LineartData *ld,
132 bool allow_duplicates,
133 bool do_shadow_casting,
134 struct ListBase *shadow_elns,
135 blender::Set<const Object *> *included_objects);
146void lineart_main_link_lines(struct LineartData *ld);
161bool lineart_main_try_generate_shadow(struct Depsgraph *depsgraph,
162 struct Scene *scene,
163 struct LineartData *original_ld,
164 struct LineartGpencilModifierData *lmd_legacy,
165 struct LineartStaticMemPool *shadow_data_pool,
166 struct LineartElementLinkNode **r_veln,
167 struct LineartElementLinkNode **r_eeln,
168 struct ListBase *r_calculated_edges_eln_list,
169 struct LineartData **r_shadow_ld_if_reproject);
171 struct Scene *scene,
172 struct LineartData *original_ld,
174 struct LineartStaticMemPool *shadow_data_pool,
175 struct LineartElementLinkNode **r_veln,
176 struct LineartElementLinkNode **r_eeln,
177 struct ListBase *r_calculated_edges_eln_list,
178 struct LineartData **r_shadow_ld_if_reproject);
184void lineart_main_make_enclosed_shapes(struct LineartData *ld, struct LineartData *shadow_ld);
189 struct LineartElementLinkNode *veln,
190 struct LineartElementLinkNode *eeln);
191
192LineartElementLinkNode *lineart_find_matching_eln(struct ListBase *shadow_elns, int obindex);
195 uint64_t edge_identifier);
201 struct LineartEdge *e,
202 struct LineartEdge *shadow_edge);
204 struct ListBase *shadow_elns);
205
207 const struct LineartEdge *e,
208 bool allow_overlapping_edges);
214 double *fbcoord1,
215 double *fbcoord2);
221 double *fbcoord1,
222 double *fbcoord2,
223 double x,
224 double y,
225 double k,
226 int positive_x,
227 int positive_y,
228 double *next_x,
229 double *next_y);
233void lineart_edge_cut(struct LineartData *ld,
234 struct LineartEdge *e,
235 double start,
236 double end,
237 uchar material_mask_bits,
238 uchar mat_occlusion,
239 uint32_t shadow_bits);
243
244#ifdef __cplusplus
245}
246#endif
unsigned char uchar
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
PyObject * self
const Depsgraph * depsgraph
int count
void lineart_register_intersection_shadow_cuts(struct LineartData *ld, struct ListBase *shadow_elns)
void lineart_main_bounding_area_make_initial(struct LineartData *ld)
void lineart_main_add_triangles(struct LineartData *ld)
void lineart_destroy_render_data_keep_init(struct LineartData *ld)
LineartBoundingArea * lineart_edge_first_bounding_area(struct LineartData *ld, double *fbcoord1, double *fbcoord2)
void lineart_prepend_pool(LinkNode **first, struct LineartStaticMemPool *smp, void *link)
void * lineart_mem_acquire(struct LineartStaticMemPool *smp, size_t size)
void * lineart_list_append_pointer_pool_sized(ListBase *h, struct LineartStaticMemPool *smp, void *data, int size)
void lineart_add_edge_to_array(struct LineartPendingEdges *pe, struct LineartEdge *e)
void lineart_finalize_object_edge_array_reserve(struct LineartPendingEdges *pe, int count)
bool lineart_edge_from_triangle(const struct LineartTriangle *tri, const struct LineartEdge *e, bool allow_overlapping_edges)
void lineart_register_shadow_cuts(struct LineartData *ld, struct LineartEdge *e, struct LineartEdge *shadow_edge)
void lineart_main_free_adjacent_data(struct LineartData *ld)
LineartElementLinkNode * lineart_find_matching_eln(struct ListBase *shadow_elns, int obindex)
bool lineart_main_try_generate_shadow(struct Depsgraph *depsgraph, struct Scene *scene, struct LineartData *original_ld, struct LineartGpencilModifierData *lmd_legacy, struct LineartStaticMemPool *shadow_data_pool, struct LineartElementLinkNode **r_veln, struct LineartElementLinkNode **r_eeln, struct ListBase *r_calculated_edges_eln_list, struct LineartData **r_shadow_ld_if_reproject)
int lineart_count_intersection_segment_count(struct LineartData *ld)
void lineart_main_cull_triangles(struct LineartData *ld, bool clip_far)
void lineart_main_clear_linked_edges(struct LineartData *ld)
void * list_push_pointer_static_sized(ListBase *h, struct LineartStaticMemPool *smp, void *p, int size)
void * lineart_list_append_pointer_pool_thread(ListBase *h, struct LineartStaticMemPool *smp, void *data)
void lineart_main_make_enclosed_shapes(struct LineartData *ld, struct LineartData *shadow_ld)
void lineart_count_and_print_render_buffer_memory(struct LineartData *ld)
LineartEdge * lineart_find_matching_edge(struct LineartElementLinkNode *shadow_eln, uint64_t edge_identifier)
void lineart_main_get_view_vector(struct LineartData *ld)
void lineart_edge_cut(struct LineartData *ld, struct LineartEdge *e, double start, double end, uchar material_mask_bits, uchar mat_occlusion, uint32_t shadow_bits)
void lineart_main_perspective_division(struct LineartData *ld)
void lineart_matrix_perspective_44d(double(*mProjection)[4], double fFov_rad, double fAspect, double zMin, double zMax)
void lineart_main_bounding_areas_connect_post(struct LineartData *ld)
void lineart_main_load_geometries(struct Depsgraph *depsgraph, struct Scene *scene, struct Object *camera, struct LineartData *ld, bool allow_duplicates, bool do_shadow_casting, struct ListBase *shadow_elns, blender::Set< const Object * > *included_objects)
void * lineart_mem_acquire_thread(struct LineartStaticMemPool *smp, size_t size)
void lineart_main_discard_out_of_frame_edges(struct LineartData *ld)
void * lineart_list_append_pointer_pool(ListBase *h, struct LineartStaticMemPool *smp, void *data)
void * lineart_list_pop_pointer_no_free(ListBase *h)
LineartBoundingArea * lineart_bounding_area_next(struct LineartBoundingArea *self, double *fbcoord1, double *fbcoord2, double x, double y, double k, int positive_x, int positive_y, double *next_x, double *next_y)
void lineart_list_remove_pointer_item_no_free(ListBase *h, LinkData *lip)
struct LineartStaticMemPoolNode * lineart_mem_new_static_pool(struct LineartStaticMemPool *smp, size_t size)
void lineart_main_occlusion_begin(struct LineartData *ld)
LineartElementLinkNode * lineart_find_matching_eln_obj(struct ListBase *elns, struct Object *ob)
void lineart_main_transform_and_add_shadow(struct LineartData *ld, struct LineartElementLinkNode *veln, struct LineartElementLinkNode *eeln)
bool lineart_main_try_generate_shadow_v3(struct Depsgraph *depsgraph, struct Scene *scene, struct LineartData *original_ld, struct GreasePencilLineartModifierData *lmd, struct LineartStaticMemPool *shadow_data_pool, struct LineartElementLinkNode **r_veln, struct LineartElementLinkNode **r_eeln, struct ListBase *r_calculated_edges_eln_list, struct LineartData **r_shadow_ld_if_reproject)
void lineart_mem_destroy(struct LineartStaticMemPool *smp)
void * list_push_pointer_static(ListBase *h, struct LineartStaticMemPool *smp, void *p)
void lineart_main_link_lines(struct LineartData *ld)
void * lineart_list_append_pointer_pool_sized_thread(ListBase *h, LineartStaticMemPool *smp, void *data, int size)
void lineart_matrix_ortho_44d(double(*mProjection)[4], double xMin, double xMax, double yMin, double yMax, double zMin, double zMax)
unsigned int uint32_t
Definition stdint.h:80
unsigned __int64 uint64_t
Definition stdint.h:90