278#define LRT_TILE_SPLITTING_TRIANGLE_LIMIT 100
279#define LRT_TILE_EDGE_COUNT_INITIAL 32
454#define DBL_TRIANGLE_LIM 1e-8
455#define DBL_EDGE_LIM 1e-9
457#define LRT_MEMORY_POOL_1MB (1 << 20)
470#define LRT_SHADOW_MASK_UNDEFINED 0
471#define LRT_SHADOW_MASK_ILLUMINATED (1 << 0)
472#define LRT_SHADOW_MASK_SHADED (1 << 1)
473#define LRT_SHADOW_MASK_ENCLOSED_SHAPE (1 << 2)
474#define LRT_SHADOW_MASK_INHIBITED (1 << 3)
475#define LRT_SHADOW_SILHOUETTE_ERASED_GROUP (1 << 4)
476#define LRT_SHADOW_SILHOUETTE_ERASED_OBJECT (1 << 5)
477#define LRT_SHADOW_MASK_ILLUMINATED_SHAPE (1 << 6)
479#define LRT_SHADOW_TEST_SHAPE_BITS \
480 (LRT_SHADOW_MASK_ILLUMINATED | LRT_SHADOW_MASK_SHADED | LRT_SHADOW_MASK_INHIBITED | \
481 LRT_SHADOW_MASK_ILLUMINATED_SHAPE)
488#define LRT_THREAD_EDGE_COUNT 1000
503#define LRT_OBINDEX_SHIFT 20
504#define LRT_OBINDEX_LOWER 0x0FFFFF
505#define LRT_OBINDEX_HIGHER 0xFFF00000
506#define LRT_EDGE_IDENTIFIER(obi, e) \
507 (((uint64_t)(obi->obindex | (e->v1->index & LRT_OBINDEX_LOWER)) << 32) | \
508 (obi->obindex | (e->v2->index & LRT_OBINDEX_LOWER)))
509#define LRT_LIGHT_CONTOUR_TARGET 0xFFFFFFFF
597#define LRT_TILE(tile, r, c, CCount) tile[r * CCount + c]
599#define LRT_CLAMP(a, Min, Max) a = a < Min ? Min : (a > Max ? Max : a)
601#define LRT_MAX3_INDEX(a, b, c) (a > b ? (a > c ? 0 : (b > c ? 1 : 2)) : (b > c ? 1 : 2))
603#define LRT_MIN3_INDEX(a, b, c) (a < b ? (a < c ? 0 : (b < c ? 1 : 2)) : (b < c ? 1 : 2))
605#define LRT_MAX3_INDEX_ABC(x, y, z) (x > y ? (x > z ? a : (y > z ? b : c)) : (y > z ? b : c))
607#define LRT_MIN3_INDEX_ABC(x, y, z) (x < y ? (x < z ? a : (y < z ? b : c)) : (y < z ? b : c))
609#define DBL_LOOSER 1e-5
610#define LRT_DOUBLE_CLOSE_LOOSER(a, b) (((a) + DBL_LOOSER) >= (b) && ((a)-DBL_LOOSER) <= (b))
611#define LRT_DOUBLE_CLOSE_ENOUGH(a, b) (((a) + DBL_EDGE_LIM) >= (b) && ((a)-DBL_EDGE_LIM) <= (b))
612#define LRT_DOUBLE_CLOSE_ENOUGH_TRI(a, b) \
613 (((a) + DBL_TRIANGLE_LIM) >= (b) && ((a)-DBL_TRIANGLE_LIM) <= (b))
615#define LRT_CLOSE_LOOSER_v3(a, b) \
616 (LRT_DOUBLE_CLOSE_LOOSER(a[0], b[0]) && LRT_DOUBLE_CLOSE_LOOSER(a[1], b[1]) && \
617 LRT_DOUBLE_CLOSE_LOOSER(a[2], b[2]))
640#ifdef USE_VECTOR_LINE_INTERSECTION
644 double s10[2], s32[2];
655 const double rx = ((s32[0] * u) - (s10[0] *
v)) / div;
656 const double ry = ((s32[1] * u) - (s10[1] *
v)) / div;
659 if (
fabs(a2[0] - a1[0]) >
fabs(a2[1] - a1[1])) {
660 *r_ratio =
ratiod(a1[0], a2[0], rx);
661 if (
fabs(b2[0] - b1[0]) >
fabs(b2[1] - b1[1])) {
662 rr =
ratiod(b1[0], b2[0], rx);
665 rr =
ratiod(b1[1], b2[1], ry);
667 if ((*r_ratio) > 0 && (*r_ratio) < 1 && rr > 0 && rr < 1) {
673 *r_ratio =
ratiod(a1[1], a2[1], ry);
674 if (
fabs(b2[0] - b1[0]) >
fabs(b2[1] - b1[1])) {
675 rr =
ratiod(b1[0], b2[0], rx);
678 rr =
ratiod(b1[1], b2[1], ry);
680 if ((*r_ratio) > 0 && (*r_ratio) < 1 && rr > 0 && rr < 1) {
692 double x_diff = (a2[0] - a1[0]);
693 double x_diff2 = (b2[0] - b1[0]);
714 double r2 =
ratiod(b1[0], b2[0], a1[0]);
717 *r_ratio = ratio =
ratiod(a1[1], a2[1], y);
721 ratio =
ratiod(a1[0], a2[0], b1[0]);
722 x =
interpd(a2[0], a1[0], ratio);
726 double y_diff = a2[1] - a1[1], y_diff2 = b2[1] - b1[1];
727 k1 = y_diff / x_diff;
728 k2 = y_diff2 / x_diff2;
749 x = (a1[1] - b1[1] - k1 * a1[0] + k2 * b1[0]) / (k2 - k1);
751 ratio = (x - a1[0]) / x_diff;
758 y =
interpd(a2[1], a1[1], ratio);
759 if (y > std::max(b1[1], b2[1]) || y < std::min(b1[1], b2[1])) {
763 else if (ratio <= 0 || ratio > 1 || (b1[0] > b2[0] && x > b1[0]) ||
764 (b1[0] < b2[0] && x < b1[0]) || (b2[0] > b1[0] && x > b2[0]) ||
765 (b2[0] < b1[0] && x < b2[0]))
793#define USE_VECTOR_LINE_INTERSECTION_IGN
794#ifdef USE_VECTOR_LINE_INTERSECTION_IGN
798 double s10[2], s32[2];
809 const double rx = ((s32[0] * u) - (s10[0] *
v)) / div;
810 const double ry = ((s32[1] * u) - (s10[1] *
v)) / div;
812 if (
fabs(a2[0] - a1[0]) >
fabs(a2[1] - a1[1])) {
813 *r_a_ratio =
ratiod(a1[0], a2[0], rx);
820 *r_a_ratio =
ratiod(a1[1], a2[1], ry);
833 double x_diff = (a2[0] - a1[0]);
834 double x_diff2 = (b2[0] - b1[0]);
841 double r2 =
ratiod(b1[0], b2[0], a1[0]);
844 *r_a_ratio = ratio =
ratiod(a1[1], a2[1], y);
848 ratio =
ratiod(a1[0], a2[0], b1[0]);
849 x =
interpd(a2[0], a1[0], ratio);
853 k1 = (a2[1] - a1[1]) / x_diff;
854 k2 = (b2[1] - b1[1]) / x_diff2;
859 x = (a1[1] - b1[1] - k1 * a1[0] + k2 * b1[0]) / (k2 - k1);
861 ratio = (x - a1[0]) / x_diff;
867 if (ratio <= 0 || ratio >= 1)
915 bool enable_stroke_depth_offset);
942 uchar material_mask_bits,
943 uchar intersection_mask,
946 uchar shadow_selection,
947 uchar silhouette_mode,
948 const char *source_vgname,
951 int modifier_calculation_flags);
MINLINE double ratiod(double min, double max, double pos)
MINLINE double interpd(double target, double origin, double t)
MINLINE double cross_v2v2_db(const double a[2], const double b[2]) ATTR_WARN_UNUSED_RESULT
MINLINE void sub_v2_v2v2_db(double r[2], const double a[2], const double b[2])
pthread_spinlock_t SpinLock
#define ENUM_OPERATORS(_type, _max)
LineartCache * MOD_lineart_init_cache()
void MOD_lineart_clear_cache(struct LineartCache **lc)
struct LineartStaticMemPool LineartStaticMemPool
bool MOD_lineart_compute_feature_lines_v3(struct Depsgraph *depsgraph, struct GreasePencilLineartModifierData &lmd, struct LineartCache **cached_result, bool enable_stroke_depth_offset)
struct LineartBoundingArea LineartBoundingArea
#define LRT_DOUBLE_CLOSE_ENOUGH(a, b)
#define LRT_DOUBLE_CLOSE_ENOUGH_TRI(a, b)
void MOD_lineart_chain_connect(LineartData *ld)
void MOD_lineart_chain_discard_unused(LineartData *ld, float threshold, uint8_t max_occlusion)
struct LineartCache LineartCache
struct LineartEdge LineartEdge
LineartBoundingArea * MOD_lineart_get_parent_bounding_area(LineartData *ld, double x, double y)
float MOD_lineart_chain_compute_length(LineartEdgeChain *ec)
struct LineartRenderTaskInfo LineartRenderTaskInfo
BLI_INLINE int lineart_intersect_seg_seg(const double a1[2], const double a2[2], const double b1[2], const double b2[2], double *r_ratio, bool *r_aligned)
void MOD_lineart_chain_split_for_fixed_occlusion(LineartData *ld)
struct LineartEdgeChainItem LineartEdgeChainItem
struct LineartChainRegisterEntry LineartChainRegisterEntry
struct LineartObjectInfo LineartObjectInfo
void MOD_lineart_chain_clip_at_border(LineartData *ld)
struct LineartAdjacentEdge LineartAdjacentEdge
int MOD_lineart_chain_count(const LineartEdgeChain *ec)
struct LineartData LineartData
struct LineartPendingEdges LineartPendingEdges
void MOD_lineart_finalize_chains(LineartData *ld)
struct LineartEdgeChain LineartEdgeChain
struct LineartTriangleAdjacent LineartTriangleAdjacent
struct LineartStaticMemPoolNode LineartStaticMemPoolNode
eLineArtTileRecursiveLimit
@ LRT_TILE_RECURSIVE_PERSPECTIVE
@ LRT_TILE_RECURSIVE_ORTHO
void MOD_lineart_gpencil_generate_v3(const LineartCache *cache, const blender::float4x4 &mat, Depsgraph *depsgraph, blender::bke::greasepencil::Drawing &drawing, int8_t source_type, Object *source_object, struct Collection *source_collection, int level_start, int level_end, int mat_nr, int16_t edge_types, uchar mask_switches, uchar material_mask_bits, uchar intersection_mask, float thickness, float opacity, uchar shadow_selection, uchar silhouette_mode, const char *source_vgname, const char *vgname, int modifier_flags, int modifier_calculation_flags)
void MOD_lineart_chain_find_silhouette_backdrop_objects(LineartData *ld)
void MOD_lineart_destroy_render_data_v3(struct GreasePencilLineartModifierData *lmd)
LineartBoundingArea * MOD_lineart_get_bounding_area(LineartData *ld, double x, double y)
struct LineartEdgeSegment LineartEdgeSegment
struct LineartObjectLoadTaskInfo LineartObjectLoadTaskInfo
void MOD_lineart_chain_feature_lines(LineartData *ld)
struct LineartTriangleThread LineartTriangleThread
@ LRT_TRIANGLE_NO_INTERSECTION
@ LRT_TRIANGLE_MAT_BACK_FACE_CULLING
@ LRT_TRIANGLE_INTERSECTION_ONLY
@ LRT_TRIANGLE_FORCE_INTERSECTION
struct LineartShadowEdge LineartShadowEdge
@ LRT_ELEMENT_NO_INTERSECTION
@ LRT_ELEMENT_BORDER_ONLY
@ LRT_ELEMENT_INTERSECTION_DATA
@ LRT_ELEMENT_IS_ADDITIONAL
void MOD_lineart_chain_clear_picked_flag(LineartCache *lc)
@ LRT_SHADOW_CAMERA_POINT
@ LRT_SHADOW_CAMERA_DIRECTIONAL
struct LineartElementLinkNode LineartElementLinkNode
struct LineartModifierRuntime LineartModifierRuntime
void MOD_lineart_smooth_chains(LineartData *ld, float tolerance)
BLI_INLINE int lineart_line_isec_2d_ignore_line2pos(const double a1[2], const double a2[2], const double b1[2], const double b2[2], double *r_a_ratio)
void MOD_lineart_chain_split_angle(LineartData *ld, float angle_threshold_rad)
eLineartShadowSegmentFlag
@ LRT_SHADOW_FACING_LIGHT
void MOD_lineart_chain_offset_towards_camera(LineartData *ld, float dist, bool use_custom_camera)
struct LineartShadowSegment LineartShadowSegment
struct LineartTriangle LineartTriangle
struct LineartVert LineartVert
ATTR_WARN_UNUSED_RESULT const BMVert * v
const Depsgraph * depsgraph
ccl_device_inline float2 fabs(const float2 a)
unsigned __int64 uint64_t
struct LineartBoundingArea * child
struct LineartEdge ** linked_lines
uint32_t insider_triangle_count
struct LineartTriangle ** linked_triangles
uint32_t max_triangle_count
blender::ed::greasepencil::LineartLimitInfo LimitInfo
LineartStaticMemPool chain_data_pool
uint16_t all_enabled_edge_types
LineartStaticMemPool shadow_data_pool
struct LineartChainRegisterEntry * next
LineartEdgeChainItem * eci
struct LineartChainRegisterEntry * prev
float cam_obmat_secondary[4][4]
bool use_contour_secondary
bool filter_face_mark_invert
bool cam_is_persp_secondary
int draw_material_preview
bool use_loose_edge_chain
double view_projection[4][4]
bool shadow_enclose_shapes
bool chain_preserve_details
double view_vector_secondary[3]
double camera_pos_secondary[3]
float chaining_image_threshold
bool filter_face_mark_keep_contour
double active_camera_pos[3]
float chain_smooth_tolerance
bool use_loose_as_contour
double material_transparency
bool use_image_boundary_trimming
bool shadow_use_silhouette
bool filter_face_mark_boundaries
bool allow_overlapping_edges
bool allow_duplicated_types
bool use_back_face_culling
float angle_splitting_threshold
bool use_geometry_space_chain
bool light_reference_available
ListBase vertex_buffer_pointers
ListBase line_buffer_pointers
ListBase triangle_adjacent_pointers
ListBase intersecting_vertex_buffer
ListBase triangle_buffer_pointers
uint32_t initial_tile_count
struct LineartBoundingArea * initials
LineartShadowEdge * shadow_edges
ListBase wasted_shadow_cuts
LineartStaticMemPool render_data_pool
struct LineartData::_conf conf
struct LineartData::_geom geom
struct LineartData::_qtree qtree
int isect_scheduled_up_to_index
LineartElementLinkNode * isect_scheduled_up_to
LineartStaticMemPool * edge_data_pool
struct LineartPendingEdges pending_edges
LineartStaticMemPool * shadow_data_pool
LineartStaticMemPool * chain_data_pool
uint8_t material_mask_bits
uint8_t intersection_mask
struct LineartEdgeChainItem * next
uint32_t shadow_mask_bits
struct LineartEdgeChainItem * prev
uint8_t material_mask_bits
struct Object * silhouette_backdrop
struct LineartEdgeChain * next
struct LineartEdgeChain * prev
uint32_t shadow_mask_bits
uint8_t intersection_mask
struct Object * object_ref
struct LineartEdgeSegment * prev
struct LineartEdgeSegment * next
uint32_t shadow_mask_bits
uint8_t material_mask_bits
struct LineartTriangle * t2
uint8_t intersection_mask
struct LineartTriangle * t1
uint64_t target_reference
struct Object * object_ref
eLineArtElementNodeFlag flags
struct LineartElementLinkNode * prev
struct LineartElementLinkNode * next
std::unique_ptr< blender::Set< const Object * > > object_dependencies
LineartElementLinkNode * v_eln
struct Mesh * original_me
struct LineartPendingEdges pending_edges
double model_view_proj[4][4]
struct Object * original_ob_eval
uint8_t override_intersection_mask
struct LineartObjectInfo * next
uint8_t intersection_priority
struct Object * original_ob
LineartObjectInfo * pending
struct LineartPendingEdges pending_edges
struct LineartShadowEdge * prev
struct LineartEdgeSegment * es_ref
struct LineartShadowEdge * next
struct LineartEdge * e_ref_light_contour
struct LineartEdge * e_ref
struct LineartShadowSegment * next
struct LineartShadowSegment * prev
uint32_t target_reference
uint32_t shadow_mask_bits
struct LineartEdge * e[3]
struct LineartEdge * testing_e[1]
struct LineartTriangle base
uint8_t material_mask_bits
uint8_t intersection_priority
uint8_t intersection_mask
uint32_t target_reference
struct LinkNode * intersecting_verts
struct LineartVert * v[3]