257 #define LRT_TILE_SPLITTING_TRIANGLE_LIMIT 100
258 #define LRT_TILE_EDGE_COUNT_INITIAL 32
431 #define DBL_TRIANGLE_LIM 1e-8
432 #define DBL_EDGE_LIM 1e-9
434 #define LRT_MEMORY_POOL_1MB (1 << 20)
447 #define LRT_SHADOW_MASK_UNDEFINED 0
448 #define LRT_SHADOW_MASK_ILLUMINATED (1 << 0)
449 #define LRT_SHADOW_MASK_SHADED (1 << 1)
450 #define LRT_SHADOW_MASK_ENCLOSED_SHAPE (1 << 2)
451 #define LRT_SHADOW_MASK_INHIBITED (1 << 3)
452 #define LRT_SHADOW_SILHOUETTE_ERASED_GROUP (1 << 4)
453 #define LRT_SHADOW_SILHOUETTE_ERASED_OBJECT (1 << 5)
454 #define LRT_SHADOW_MASK_ILLUMINATED_SHAPE (1 << 6)
456 #define LRT_SHADOW_TEST_SHAPE_BITS \
457 (LRT_SHADOW_MASK_ILLUMINATED | LRT_SHADOW_MASK_SHADED | LRT_SHADOW_MASK_INHIBITED | \
458 LRT_SHADOW_MASK_ILLUMINATED_SHAPE)
465 #define LRT_THREAD_EDGE_COUNT 1000
480 #define LRT_OBINDEX_SHIFT 20
481 #define LRT_OBINDEX_LOWER 0x0FFFFF
482 #define LRT_OBINDEX_HIGHER 0xFFF00000
483 #define LRT_EDGE_IDENTIFIER(obi, e) \
484 (((uint64_t)(obi->obindex | (e->v1->index & LRT_OBINDEX_LOWER)) << 32) | \
485 (obi->obindex | (e->v2->index & LRT_OBINDEX_LOWER)))
486 #define LRT_LIGHT_CONTOUR_TARGET 0xFFFFFFFF
574 #define LRT_TILE(tile, r, c, CCount) tile[r * CCount + c]
576 #define LRT_CLAMP(a, Min, Max) a = a < Min ? Min : (a > Max ? Max : a)
578 #define LRT_MAX3_INDEX(a, b, c) (a > b ? (a > c ? 0 : (b > c ? 1 : 2)) : (b > c ? 1 : 2))
580 #define LRT_MIN3_INDEX(a, b, c) (a < b ? (a < c ? 0 : (b < c ? 1 : 2)) : (b < c ? 1 : 2))
582 #define LRT_MAX3_INDEX_ABC(x, y, z) (x > y ? (x > z ? a : (y > z ? b : c)) : (y > z ? b : c))
584 #define LRT_MIN3_INDEX_ABC(x, y, z) (x < y ? (x < z ? a : (y < z ? b : c)) : (y < z ? b : c))
586 #define DBL_LOOSER 1e-5
587 #define LRT_DOUBLE_CLOSE_LOOSER(a, b) (((a) + DBL_LOOSER) >= (b) && ((a)-DBL_LOOSER) <= (b))
588 #define LRT_DOUBLE_CLOSE_ENOUGH(a, b) (((a) + DBL_EDGE_LIM) >= (b) && ((a)-DBL_EDGE_LIM) <= (b))
589 #define LRT_DOUBLE_CLOSE_ENOUGH_TRI(a, b) \
590 (((a) + DBL_TRIANGLE_LIM) >= (b) && ((a)-DBL_TRIANGLE_LIM) <= (b))
592 #define LRT_CLOSE_LOOSER_v3(a, b) \
593 (LRT_DOUBLE_CLOSE_LOOSER(a[0], b[0]) && LRT_DOUBLE_CLOSE_LOOSER(a[1], b[1]) && \
594 LRT_DOUBLE_CLOSE_LOOSER(a[2], b[2]))
617 #ifdef USE_VECTOR_LINE_INTERSECTION
621 double s10[2], s32[2];
632 const double rx = ((s32[0] * u) - (s10[0] *
v)) / div;
633 const double ry = ((s32[1] * u) - (s10[1] *
v)) / div;
636 if (
fabs(a2[0] - a1[0]) >
fabs(a2[1] - a1[1])) {
637 *r_ratio =
ratiod(a1[0], a2[0], rx);
638 if (
fabs(b2[0] - b1[0]) >
fabs(b2[1] - b1[1])) {
639 rr =
ratiod(b1[0], b2[0], rx);
642 rr =
ratiod(b1[1], b2[1], ry);
644 if ((*r_ratio) > 0 && (*r_ratio) < 1 && rr > 0 && rr < 1) {
650 *r_ratio =
ratiod(a1[1], a2[1], ry);
651 if (
fabs(b2[0] - b1[0]) >
fabs(b2[1] - b1[1])) {
652 rr =
ratiod(b1[0], b2[0], rx);
655 rr =
ratiod(b1[1], b2[1], ry);
657 if ((*r_ratio) > 0 && (*r_ratio) < 1 && rr > 0 && rr < 1) {
669 double x_diff = (a2[0] - a1[0]);
670 double x_diff2 = (b2[0] - b1[0]);
689 double r2 =
ratiod(b1[0], b2[0], a1[0]);
692 *r_ratio = ratio =
ratiod(a1[1], a2[1],
y);
696 ratio =
ratiod(a1[0], a2[0], b1[0]);
701 double y_diff = a2[1] - a1[1], y_diff2 = b2[1] - b1[1];
702 k1 = y_diff / x_diff;
703 k2 = y_diff2 / x_diff2;
723 x = (a1[1] - b1[1] - k1 * a1[0] + k2 * b1[0]) / (k2 - k1);
725 ratio = (
x - a1[0]) / x_diff;
733 if (
y >
MAX2(b1[1], b2[1]) ||
y <
MIN2(b1[1], b2[1]))
736 else if (ratio <= 0 || ratio > 1 || (b1[0] > b2[0] &&
x > b1[0]) ||
737 (b1[0] < b2[0] &&
x < b1[0]) || (b2[0] > b1[0] &&
x > b2[0]) ||
738 (b2[0] < b1[0] &&
x < b2[0]))
764 #define USE_VECTOR_LINE_INTERSECTION_IGN
765 #ifdef USE_VECTOR_LINE_INTERSECTION_IGN
769 double s10[2], s32[2];
780 const double rx = ((s32[0] * u) - (s10[0] *
v)) / div;
781 const double ry = ((s32[1] * u) - (s10[1] *
v)) / div;
783 if (
fabs(a2[0] - a1[0]) >
fabs(a2[1] - a1[1])) {
784 *r_a_ratio =
ratiod(a1[0], a2[0], rx);
791 *r_a_ratio =
ratiod(a1[1], a2[1], ry);
804 double x_diff = (a2[0] - a1[0]);
805 double x_diff2 = (b2[0] - b1[0]);
812 double r2 =
ratiod(b1[0], b2[0], a1[0]);
815 *r_a_ratio = ratio =
ratiod(a1[1], a2[1],
y);
819 ratio =
ratiod(a1[0], a2[0], b1[0]);
824 k1 = (a2[1] - a1[1]) / x_diff;
825 k2 = (b2[1] - b1[1]) / x_diff2;
830 x = (a1[1] - b1[1] - k1 * a1[0] + k2 * b1[0]) / (k2 - k1);
832 ratio = (
x - a1[0]) / x_diff;
838 if (ratio <= 0 || ratio >= 1)
883 bool enable_stroke_offset);
909 void *source_reference,
921 const char *source_vgname,
924 int modifier_calculation_flags);
MINLINE double interpd(double a, double b, double t)
MINLINE double ratiod(double min, double max, double pos)
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
struct Depsgraph Depsgraph
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint y
struct LineartStaticMemPool LineartStaticMemPool
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_gpencil_generate(LineartCache *cache, struct Depsgraph *depsgraph, struct Object *ob, struct bGPDlayer *gpl, struct bGPDframe *gpf, int8_t source_type, void *source_reference, int level_start, int level_end, int mat_nr, int16_t edge_types, uint8_t mask_switches, uint8_t material_mask_bits, uint8_t intersection_mask, int16_t thickness, float opacity, uint8_t shadow_selection, uint8_t silhouette_mode, const char *source_vgname, const char *vgname, int modifier_flags, int modifier_calculation_flags)
void MOD_lineart_chain_discard_unused(LineartData *ld, float threshold, uint8_t max_occlusion)
struct LineartCache LineartCache
struct LineartEdge LineartEdge
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
LineartBoundingArea * MOD_lineart_get_bounding_area(LineartData *ld, double x, double y)
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
void MOD_lineart_destroy_render_data(struct LineartGpencilModifierData *lmd)
void ED_operatortypes_lineart(void)
struct LineartStaticMemPoolNode LineartStaticMemPoolNode
eLineArtTileRecursiveLimit
@ LRT_TILE_RECURSIVE_PERSPECTIVE
@ LRT_TILE_RECURSIVE_ORTHO
void MOD_lineart_chain_find_silhouette_backdrop_objects(LineartData *ld)
struct LineartEdgeSegment LineartEdgeSegment
struct LineartObjectLoadTaskInfo LineartObjectLoadTaskInfo
void MOD_lineart_chain_feature_lines(LineartData *ld)
LineartBoundingArea * MOD_lineart_get_parent_bounding_area(LineartData *ld, double x, double y)
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
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)
bool MOD_lineart_compute_feature_lines(struct Depsgraph *depsgraph, struct LineartGpencilModifierData *lmd, struct LineartCache **cached_result, bool enable_stroke_offset)
struct LineartShadowSegment LineartShadowSegment
struct LineartTriangle LineartTriangle
struct LineartVert LineartVert
ATTR_WARN_UNUSED_RESULT const BMVert * v
const Depsgraph * depsgraph
ccl_gpu_kernel_postfix ccl_global float int int int int float threshold
ccl_device_inline float2 fabs(const float2 &a)
static const pxr::TfToken opacity("opacity", pxr::TfToken::Immortal)
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
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
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]