Blender V4.3
lineart_cpu.cc File Reference
#include <algorithm>
#include "MOD_lineart.hh"
#include "BLI_listbase.h"
#include "BLI_math_base.hh"
#include "BLI_math_geom.h"
#include "BLI_math_matrix.h"
#include "BLI_math_matrix.hh"
#include "BLI_math_rotation.h"
#include "BLI_math_vector.hh"
#include "BLI_sort.hh"
#include "BLI_string.h"
#include "BLI_task.h"
#include "BLI_time.h"
#include "BLI_utildefines.h"
#include "BLI_vector.hh"
#include "BKE_attribute.hh"
#include "BKE_camera.h"
#include "BKE_collection.hh"
#include "BKE_curves.hh"
#include "BKE_customdata.hh"
#include "BKE_deform.hh"
#include "BKE_geometry_set.hh"
#include "BKE_global.hh"
#include "BKE_gpencil_geom_legacy.h"
#include "BKE_gpencil_legacy.h"
#include "BKE_grease_pencil.hh"
#include "BKE_grease_pencil_legacy_convert.hh"
#include "BKE_lib_id.hh"
#include "BKE_material.h"
#include "BKE_mesh.hh"
#include "BKE_object.hh"
#include "BKE_scene.hh"
#include "DEG_depsgraph_query.hh"
#include "DNA_camera_types.h"
#include "DNA_collection_types.h"
#include "DNA_gpencil_legacy_types.h"
#include "DNA_light_types.h"
#include "DNA_material_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_modifier_types.h"
#include "DNA_scene_types.h"
#include "MEM_guardedalloc.h"
#include "RE_pipeline.h"
#include "intern/render_types.h"
#include "ED_grease_pencil.hh"
#include "GEO_join_geometries.hh"
#include "lineart_intern.hh"

Go to the source code of this file.

Classes

struct  LineartIsecSingle
 
struct  LineartIsecThread
 
struct  LineartIsecData
 
struct  LineartEdgeNeighbor
 
struct  VertData
 
struct  EdgeFeatData
 
struct  EdgeFeatReduceData
 
struct  LooseEdgeData
 
struct  TriData
 
struct  EdgeNeighborData
 
struct  LineartChainWriteInfo
 

Macros

#define INCREASE_EDGE
 
#define SELECT_EDGE(e_num, v1_link, v2_link, new_tri)
 
#define RELINK_EDGE(e_num, new_tri)
 
#define REMOVE_TRIANGLE_EDGE
 
#define LRT_CULL_ENSURE_MEMORY
 
#define LRT_CULL_DECIDE_INSIDE
 
#define LRT_VERT_OUT_OF_BOUND(v)    (v->fbcoord[0] < -1 || v->fbcoord[0] > 1 || v->fbcoord[1] < -1 || v->fbcoord[1] > 1)
 
#define LRT_MESH_EDGE_TYPES_COUNT   6
 
#define LRT_TRI_SAME_POINT(tri, i, pt)
 
#define INTERSECT_SORT_MIN_TO_MAX_3(ia, ib, ic, lst)
 
#define INTERSECT_JUST_GREATER(is, order, num, index)
 
#define INTERSECT_JUST_SMALLER(is, order, num, index)
 
#define LRT_ISEC(index)   (index == 0 ? isec_e1 : (index == 1 ? isec_e2 : isec_e3))
 
#define LRT_PARALLEL(index)   (index == 0 ? para_e1 : (index == 1 ? para_e2 : para_e3))
 
#define LRT_GUARD_NOT_FOUND
 
#define LRT_ISECT_TRIANGLE_PER_THREAD   4096
 

Typedefs

typedef struct LineartChainWriteInfo LineartChainWriteInfo
 

Enumerations

enum  LineartPointTri { LRT_OUTSIDE_TRIANGLE = 0 , LRT_ON_TRIANGLE = 1 , LRT_INSIDE_TRIANGLE = 2 }
 

Functions

static void lineart_bounding_area_link_edge (LineartData *ld, LineartBoundingArea *root_ba, LineartEdge *e)
 
static bool lineart_get_edge_bounding_areas (LineartData *ld, LineartEdge *e, int *rowbegin, int *rowend, int *colbegin, int *colend)
 
static bool lineart_triangle_edge_image_space_occlusion (const LineartTriangle *tri, const LineartEdge *e, const double *override_camera_loc, const bool override_cam_is_persp, const bool allow_overlapping_edges, const double m_view_projection[4][4], const double camera_dir[3], const float cam_shift_x, const float cam_shift_y, double *from, double *to)
 
static void lineart_bounding_area_link_triangle (LineartData *ld, LineartBoundingArea *root_ba, LineartTriangle *tri, double l_r_u_b[4], int recursive, int recursive_level, bool do_intersection, LineartIsecThread *th)
 
static void lineart_free_bounding_area_memory (LineartBoundingArea *ba, bool recursive)
 
static void lineart_free_bounding_area_memories (LineartData *ld)
 
static void lineart_discard_segment (LineartData *ld, LineartEdgeSegment *es)
 
static LineartEdgeSegmentlineart_give_segment (LineartData *ld)
 
void lineart_edge_cut (LineartData *ld, LineartEdge *e, double start, double end, uchar material_mask_bits, uchar mat_occlusion, uint32_t shadow_bits)
 
BLI_INLINE bool lineart_occlusion_is_adjacent_intersection (LineartEdge *e, LineartTriangle *tri)
 
static void lineart_bounding_area_triangle_reallocate (LineartBoundingArea *ba)
 
static void lineart_bounding_area_line_add (LineartBoundingArea *ba, LineartEdge *e)
 
static void lineart_occlusion_single_line (LineartData *ld, LineartEdge *e, int thread_id)
 
static int lineart_occlusion_make_task_info (LineartData *ld, LineartRenderTaskInfo *rti)
 
static void lineart_occlusion_worker (TaskPool *__restrict, LineartRenderTaskInfo *rti)
 
void lineart_main_occlusion_begin (LineartData *ld)
 
static bool lineart_point_inside_triangle (const double v[2], const double v0[2], const double v1[2], const double v2[2])
 
static int lineart_point_on_line_segment (double v[2], double v0[2], double v1[2])
 
static LineartPointTri lineart_point_triangle_relation (double v[2], double v0[2], double v1[2], double v2[2])
 
static bool lineart_point_inside_triangle3d (double v[3], double v0[3], double v1[3], double v2[3])
 
static LineartElementLinkNodelineart_memory_get_triangle_space (LineartData *ld)
 
static LineartElementLinkNodelineart_memory_get_vert_space (LineartData *ld)
 
static LineartElementLinkNodelineart_memory_get_edge_space (LineartData *ld)
 
static void lineart_triangle_post (LineartTriangle *tri, LineartTriangle *orig)
 
static void lineart_triangle_set_cull_flag (LineartTriangle *tri, uchar flag)
 
static bool lineart_edge_match (LineartTriangle *tri, LineartEdge *e, int v1, int v2)
 
static void lineart_discard_duplicated_edges (LineartEdge *old_e)
 
static void lineart_triangle_cull_single (LineartData *ld, LineartTriangle *tri, int in0, int in1, int in2, double cam_pos[3], double view_dir[3], bool allow_boundaries, double m_view_projection[4][4], Object *ob, int *r_v_count, int *r_e_count, int *r_t_count, LineartElementLinkNode *v_eln, LineartElementLinkNode *e_eln, LineartElementLinkNode *t_eln)
 
void lineart_main_cull_triangles (LineartData *ld, bool clip_far)
 
void lineart_main_free_adjacent_data (LineartData *ld)
 
void lineart_main_perspective_division (LineartData *ld)
 
void lineart_main_discard_out_of_frame_edges (LineartData *ld)
 
static void lineart_mvert_transform_task (void *__restrict userdata, const int i, const TaskParallelTLS *__restrict)
 
static int lineart_edge_type_duplication_count (int eflag)
 
static LineartTrianglelineart_triangle_from_index (LineartData *ld, LineartTriangle *rt_array, int index)
 
static void feat_data_sum_reduce (const void *__restrict, void *__restrict chunk_join, void *__restrict chunk)
 
static void lineart_identify_corner_tri_feature_edges (void *__restrict userdata, const int i, const TaskParallelTLS *__restrict tls)
 
void lineart_add_edge_to_array (LineartPendingEdges *pe, LineartEdge *e)
 
static void lineart_add_edge_to_array_thread (LineartObjectInfo *obi, LineartEdge *e)
 
void lineart_finalize_object_edge_array_reserve (LineartPendingEdges *pe, int count)
 
static void lineart_finalize_object_edge_array (LineartPendingEdges *pe, LineartObjectInfo *obi)
 
static void lineart_triangle_adjacent_assign (LineartTriangle *tri, LineartTriangleAdjacent *tri_adj, LineartEdge *e)
 
static void lineart_load_tri_task (void *__restrict userdata, const int i, const TaskParallelTLS *__restrict)
 
static void lineart_edge_neighbor_init_task (void *__restrict userdata, const int i, const TaskParallelTLS *__restrict)
 
static void lineart_sort_adjacent_items (LineartAdjacentEdge *ai, int length)
 
static LineartEdgeNeighborlineart_build_edge_neighbor (Mesh *mesh, int total_edges)
 
static void lineart_geometry_object_load (LineartObjectInfo *ob_info, LineartData *la_data, ListBase *shadow_elns)
 
static void lineart_object_load_worker (TaskPool *__restrict, LineartObjectLoadTaskInfo *olti)
 
static uchar lineart_intersection_mask_check (Collection *c, Object *ob)
 
static uchar lineart_intersection_priority_check (Collection *c, Object *ob)
 
static int lineart_usage_check (Collection *c, Object *ob, bool is_render)
 
static void lineart_geometry_load_assign_thread (LineartObjectLoadTaskInfo *olti_list, LineartObjectInfo *obi, int thread_count, int this_face_count)
 
static bool lineart_geometry_check_visible (double model_view_proj[4][4], double shift_x, double shift_y, Mesh *use_mesh)
 
static void lineart_object_load_single_instance (LineartData *ld, Depsgraph *depsgraph, Scene *scene, Object *ob, Object *ref_ob, const float use_mat[4][4], bool is_render, LineartObjectLoadTaskInfo *olti, int thread_count, int obindex)
 
void lineart_main_load_geometries (Depsgraph *depsgraph, Scene *scene, Object *camera, LineartData *ld, bool allow_duplicates, bool do_shadow_casting, ListBase *shadow_elns, blender::Set< const Object * > *included_objects)
 
static bool lineart_triangle_get_other_verts (const LineartTriangle *tri, const LineartVert *vt, LineartVert **l, LineartVert **r)
 
bool lineart_edge_from_triangle (const LineartTriangle *tri, const LineartEdge *e, bool allow_overlapping_edges)
 
static bool lineart_triangle_share_edge (const LineartTriangle *l, const LineartTriangle *r)
 
static LineartVertlineart_triangle_share_point (const LineartTriangle *l, const LineartTriangle *r)
 
static bool lineart_triangle_2v_intersection_math (LineartVert *v1, LineartVert *v2, LineartTriangle *tri, const double *last, double *rv)
 
static bool lineart_triangle_intersect_math (LineartTriangle *tri, LineartTriangle *t2, double *v1, double *v2)
 
static void lineart_add_isec_thread (LineartIsecThread *th, const double *v1, const double *v2, LineartTriangle *tri1, LineartTriangle *tri2)
 
static bool lineart_schedule_new_triangle_task (LineartIsecThread *th)
 
static void lineart_init_isec_thread (LineartIsecData *d, LineartData *ld, int thread_count)
 
static void lineart_destroy_isec_thread (LineartIsecData *d)
 
static void lineart_triangle_intersect_in_bounding_area (LineartTriangle *tri, LineartBoundingArea *ba, LineartIsecThread *th, int up_to)
 
void lineart_main_get_view_vector (LineartData *ld)
 
static void lineart_end_bounding_area_recursive (LineartBoundingArea *ba)
 
void lineart_destroy_render_data_keep_init (LineartData *ld)
 
static void lineart_destroy_render_data (LineartData *ld)
 
void MOD_lineart_destroy_render_data_v3 (GreasePencilLineartModifierData *lmd)
 
LineartCacheMOD_lineart_init_cache ()
 
void MOD_lineart_clear_cache (LineartCache **lc)
 
static LineartDatalineart_create_render_buffer_v3 (Scene *scene, GreasePencilLineartModifierData *lmd, Object *camera, Object *active_camera, LineartCache *lc)
 
static int lineart_triangle_size_get (LineartData *ld)
 
void lineart_main_bounding_area_make_initial (LineartData *ld)
 
static void lineart_bounding_areas_connect_new (LineartData *ld, LineartBoundingArea *root)
 
static void lineart_bounding_areas_connect_recursive (LineartData *ld, LineartBoundingArea *root)
 
void lineart_main_bounding_areas_connect_post (LineartData *ld)
 
static void lineart_bounding_area_split (LineartData *ld, LineartBoundingArea *root, int recursive_level)
 
static bool lineart_bounding_area_edge_intersect (LineartData *, const double l[2], const double r[2], LineartBoundingArea *ba)
 
static bool lineart_bounding_area_triangle_intersect (LineartData *fb, LineartTriangle *tri, LineartBoundingArea *ba, bool *r_triangle_vert_inside)
 
static void lineart_clear_linked_edges_recursive (LineartData *ld, LineartBoundingArea *root_ba)
 
void lineart_main_clear_linked_edges (LineartData *ld)
 
void lineart_main_link_lines (LineartData *ld)
 
static void lineart_main_remove_unused_lines_recursive (LineartBoundingArea *ba, uint8_t max_occlusion)
 
static void lineart_main_remove_unused_lines_from_tiles (LineartData *ld)
 
static bool lineart_get_triangle_bounding_areas (LineartData *ld, LineartTriangle *tri, int *rowbegin, int *rowend, int *colbegin, int *colend)
 
LineartBoundingAreaMOD_lineart_get_parent_bounding_area (LineartData *ld, double x, double y)
 
static LineartBoundingArealineart_get_bounding_area (LineartData *ld, double x, double y)
 
LineartBoundingAreaMOD_lineart_get_bounding_area (LineartData *ld, double x, double y)
 
static void lineart_add_triangles_worker (TaskPool *__restrict, LineartIsecThread *th)
 
static void lineart_create_edges_from_isec_data (LineartIsecData *d)
 
void lineart_main_add_triangles (LineartData *ld)
 
LineartBoundingArealineart_edge_first_bounding_area (LineartData *ld, double *fbcoord1, double *fbcoord2)
 
LineartBoundingArealineart_bounding_area_next (LineartBoundingArea *self, double *fbcoord1, double *fbcoord2, double x, double y, double k, int positive_x, int positive_y, double *next_x, double *next_y)
 
bool MOD_lineart_compute_feature_lines_v3 (Depsgraph *depsgraph, GreasePencilLineartModifierData &lmd, LineartCache **cached_result, bool enable_stroke_depth_offset)
 
void MOD_lineart_gpencil_generate_v3 (const LineartCache *cache, const blender::float4x4 &inverse_mat, Depsgraph *depsgraph, blender::bke::greasepencil::Drawing &drawing, const int8_t source_type, Object *source_object, Collection *source_collection, const int level_start, const int level_end, const int mat_nr, const int16_t edge_types, const uchar mask_switches, const uchar material_mask_bits, const uchar intersection_mask, const float thickness, const float opacity, const uchar shadow_selection, const uchar silhouette_mode, const char *source_vgname, const char *vgname, const int modifier_flags, const int modifier_calculation_flags)
 

Variables

static const int LRT_MESH_EDGE_TYPES []
 

Macro Definition Documentation

◆ INCREASE_EDGE

#define INCREASE_EDGE
Value:
new_e = &((LineartEdge *)e_eln->pointer)[e_count]; \
e_count++; \
e = new_e; \
es = static_cast<LineartEdgeSegment *>( \
lineart_mem_acquire(&ld->render_data_pool, sizeof(LineartEdgeSegment))); \
BLI_addtail(&e->segments, es);
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e

Referenced by lineart_triangle_cull_single().

◆ INTERSECT_JUST_GREATER

#define INTERSECT_JUST_GREATER ( is,
order,
num,
index )
Value:
{ \
index = (num < is[order[0]] ? \
order[0] : \
(num < is[order[1]] ? order[1] : (num < is[order[2]] ? order[2] : -1))); \
}

Definition at line 2791 of file lineart_cpu.cc.

Referenced by lineart_triangle_edge_image_space_occlusion().

◆ INTERSECT_JUST_SMALLER

#define INTERSECT_JUST_SMALLER ( is,
order,
num,
index )
Value:
{ \
index = (num > is[order[2]] ? \
order[2] : \
(num > is[order[1]] ? order[1] : (num > is[order[0]] ? order[0] : -1))); \
}

Definition at line 2799 of file lineart_cpu.cc.

Referenced by lineart_triangle_edge_image_space_occlusion().

◆ INTERSECT_SORT_MIN_TO_MAX_3

#define INTERSECT_SORT_MIN_TO_MAX_3 ( ia,
ib,
ic,
lst )
Value:
{ \
lst[0] = LRT_MIN3_INDEX(ia, ib, ic); \
lst[1] = (((ia <= ib && ib <= ic) || (ic <= ib && ib <= ia)) ? \
1 : \
(((ic <= ia && ia <= ib) || (ib < ia && ia <= ic)) ? 0 : 2)); \
lst[2] = LRT_MAX3_INDEX(ia, ib, ic); \
}
#define LRT_MIN3_INDEX(a, b, c)
#define LRT_MAX3_INDEX(a, b, c)

Definition at line 2781 of file lineart_cpu.cc.

Referenced by lineart_triangle_edge_image_space_occlusion().

◆ LRT_CULL_DECIDE_INSIDE

#define LRT_CULL_DECIDE_INSIDE
Value:
/* These three represents points that are in the clipping range or not. */ \
in0 = 0, in1 = 0, in2 = 0; \
if (clip_far) { \
/* Point outside far plane. */ \
if (tri->v[0]->fbcoord[use_w] > clip_end) { \
in0 = 1; \
} \
if (tri->v[1]->fbcoord[use_w] > clip_end) { \
in1 = 1; \
} \
if (tri->v[2]->fbcoord[use_w] > clip_end) { \
in2 = 1; \
} \
} \
else { \
/* Point inside near plane. */ \
if (tri->v[0]->fbcoord[use_w] < clip_start) { \
in0 = 1; \
} \
if (tri->v[1]->fbcoord[use_w] < clip_start) { \
in1 = 1; \
} \
if (tri->v[2]->fbcoord[use_w] < clip_start) { \
in2 = 1; \
} \
}

Referenced by lineart_main_cull_triangles().

◆ LRT_CULL_ENSURE_MEMORY

#define LRT_CULL_ENSURE_MEMORY
Value:
if (v_count > 60) { \
v_eln->element_count = v_count; \
v_count = 0; \
} \
if (t_count > 60) { \
t_eln->element_count = t_count; \
t_count = 0; \
} \
if (e_count > 60) { \
e_eln->element_count = e_count; \
e_count = 0; \
}
static LineartElementLinkNode * lineart_memory_get_vert_space(LineartData *ld)
static LineartElementLinkNode * lineart_memory_get_triangle_space(LineartData *ld)
static LineartElementLinkNode * lineart_memory_get_edge_space(LineartData *ld)

Referenced by lineart_main_cull_triangles().

◆ LRT_GUARD_NOT_FOUND

#define LRT_GUARD_NOT_FOUND
Value:
if (cross_v1 < 0 || cross_v2 < 0) { \
return false; \
}

Referenced by lineart_triangle_edge_image_space_occlusion().

◆ LRT_ISEC

#define LRT_ISEC ( index)    (index == 0 ? isec_e1 : (index == 1 ? isec_e2 : isec_e3))

Definition at line 2806 of file lineart_cpu.cc.

Referenced by lineart_triangle_edge_image_space_occlusion().

◆ LRT_ISECT_TRIANGLE_PER_THREAD

#define LRT_ISECT_TRIANGLE_PER_THREAD   4096

Definition at line 3348 of file lineart_cpu.cc.

Referenced by lineart_schedule_new_triangle_task().

◆ LRT_MESH_EDGE_TYPES_COUNT

#define LRT_MESH_EDGE_TYPES_COUNT   6

◆ LRT_PARALLEL

#define LRT_PARALLEL ( index)    (index == 0 ? para_e1 : (index == 1 ? para_e2 : para_e3))

Definition at line 2807 of file lineart_cpu.cc.

Referenced by lineart_triangle_edge_image_space_occlusion().

◆ LRT_TRI_SAME_POINT

#define LRT_TRI_SAME_POINT ( tri,
i,
pt )
Value:
((LRT_DOUBLE_CLOSE_ENOUGH(tri->v[i]->gloc[0], pt->gloc[0]) && \
LRT_DOUBLE_CLOSE_ENOUGH(tri->v[i]->gloc[1], pt->gloc[1]) && \
LRT_DOUBLE_CLOSE_ENOUGH(tri->v[i]->gloc[2], pt->gloc[2])) || \
(LRT_DOUBLE_CLOSE_ENOUGH(tri->v[i]->gloc[0], pt->gloc[0]) && \
LRT_DOUBLE_CLOSE_ENOUGH(tri->v[i]->gloc[1], pt->gloc[1]) && \
LRT_DOUBLE_CLOSE_ENOUGH(tri->v[i]->gloc[2], pt->gloc[2])))
#define LRT_DOUBLE_CLOSE_ENOUGH(a, b)

Referenced by lineart_edge_from_triangle().

◆ LRT_VERT_OUT_OF_BOUND

#define LRT_VERT_OUT_OF_BOUND ( v)     (v->fbcoord[0] < -1 || v->fbcoord[0] > 1 || v->fbcoord[1] < -1 || v->fbcoord[1] > 1)

◆ RELINK_EDGE

#define RELINK_EDGE ( e_num,
new_tri )
Value:
if (tri_adj->e[e_num]) { \
old_e = tri_adj->e[e_num]; \
old_e->t1 = ((old_e->t1 == tri) ? (new_tri) : (old_e->t1)); \
old_e->t2 = ((old_e->t2 == tri) ? (new_tri) : (old_e->t2)); \
}

Referenced by lineart_triangle_cull_single().

◆ REMOVE_TRIANGLE_EDGE

#define REMOVE_TRIANGLE_EDGE
Value:
if (tri_adj->e[0]) { \
tri_adj->e[0]->flags = MOD_LINEART_EDGE_FLAG_CHAIN_PICKED; \
lineart_discard_duplicated_edges(tri_adj->e[0]); \
} \
if (tri_adj->e[1]) { \
tri_adj->e[1]->flags = MOD_LINEART_EDGE_FLAG_CHAIN_PICKED; \
lineart_discard_duplicated_edges(tri_adj->e[1]); \
} \
if (tri_adj->e[2]) { \
tri_adj->e[2]->flags = MOD_LINEART_EDGE_FLAG_CHAIN_PICKED; \
lineart_discard_duplicated_edges(tri_adj->e[2]); \
}
@ MOD_LINEART_EDGE_FLAG_CHAIN_PICKED

Referenced by lineart_triangle_cull_single().

◆ SELECT_EDGE

#define SELECT_EDGE ( e_num,
v1_link,
v2_link,
new_tri )
Value:
if (tri_adj->e[e_num]) { \
old_e = tri_adj->e[e_num]; \
new_flag = old_e->flags; \
lineart_discard_duplicated_edges(old_e); \
INCREASE_EDGE \
e->v1 = (v1_link); \
e->v2 = (v2_link); \
e->v1->index = (v1_link)->index; \
e->v2->index = (v1_link)->index; \
e->flags = new_flag; \
e->object_ref = ob; \
e->t1 = ((old_e->t1 == tri) ? (new_tri) : (old_e->t1)); \
e->t2 = ((old_e->t2 == tri) ? (new_tri) : (old_e->t2)); \
lineart_add_edge_to_array(&ld->pending_edges, e); \
}

Referenced by lineart_triangle_cull_single().

Typedef Documentation

◆ LineartChainWriteInfo

typedef struct LineartChainWriteInfo LineartChainWriteInfo

Enumeration Type Documentation

◆ LineartPointTri

Enumerator
LRT_OUTSIDE_TRIANGLE 
LRT_ON_TRIANGLE 
LRT_INSIDE_TRIANGLE 

Definition at line 580 of file lineart_cpu.cc.

Function Documentation

◆ feat_data_sum_reduce()

static void feat_data_sum_reduce ( const void * __restrict,
void *__restrict chunk_join,
void *__restrict chunk )
static

Definition at line 1518 of file lineart_cpu.cc.

References EdgeFeatReduceData::feat_edges.

Referenced by lineart_geometry_object_load().

◆ lineart_add_edge_to_array()

◆ lineart_add_edge_to_array_thread()

static void lineart_add_edge_to_array_thread ( LineartObjectInfo * obi,
LineartEdge * e )
static

◆ lineart_add_isec_thread()

◆ lineart_add_triangles_worker()

◆ lineart_bounding_area_edge_intersect()

static bool lineart_bounding_area_edge_intersect ( LineartData * ,
const double l[2],
const double r[2],
LineartBoundingArea * ba )
static

◆ lineart_bounding_area_line_add()

static void lineart_bounding_area_line_add ( LineartBoundingArea * ba,
LineartEdge * e )
static

◆ lineart_bounding_area_link_edge()

◆ lineart_bounding_area_link_triangle()

static void lineart_bounding_area_link_triangle ( LineartData * ld,
LineartBoundingArea * root_ba,
LineartTriangle * tri,
double l_r_u_b[4],
int recursive,
int recursive_level,
bool do_intersection,
LineartIsecThread * th )
static

This function does two things:

1) Builds a quad-tree under ld->InitialBoundingAreas to achieve good geometry separation for fast overlapping test between triangles and lines. This acceleration structure makes the occlusion stage much faster.

2) Test triangles with other triangles that are previously linked into each tile (LineartBoundingArea) for intersection lines. When splitting the tile into 4 children and re-linking triangles into the child tiles, intersections are inhibited so we don't get duplicated intersection lines.

Definition at line 4187 of file lineart_cpu.cc.

References b, BLI_spin_lock(), BLI_spin_unlock(), LineartBoundingArea::child, LineartData::conf, LineartVert::fbcoord, LineartBoundingArea::insider_triangle_count, LineartBoundingArea::l, lineart_bounding_area_link_triangle(), lineart_bounding_area_split(), lineart_bounding_area_triangle_intersect(), lineart_bounding_area_triangle_reallocate(), lineart_triangle_intersect_in_bounding_area(), LineartBoundingArea::linked_triangles, LineartBoundingArea::lock, LRT_BOUND_AREA_CROSSES, LRT_TILE_SPLITTING_TRIANGLE_LIMIT, LineartBoundingArea::max_triangle_count, LineartBoundingArea::triangle_count, LineartData::_conf::use_intersections, and LineartTriangle::v.

Referenced by lineart_add_triangles_worker(), lineart_bounding_area_link_triangle(), and lineart_bounding_area_split().

◆ lineart_bounding_area_next()

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 )

This march along one render line in image space and get the next bounding area the line is crossing.

Definition at line 4805 of file lineart_cpu.cc.

References LineartBoundingArea::b, LineartBoundingArea::l, LISTBASE_FOREACH, LineartBoundingArea::r, ratiod(), self, LineartBoundingArea::u, x, and y.

◆ lineart_bounding_area_split()

◆ lineart_bounding_area_triangle_intersect()

◆ lineart_bounding_area_triangle_reallocate()

static void lineart_bounding_area_triangle_reallocate ( LineartBoundingArea * ba)
static

◆ lineart_bounding_areas_connect_new()

◆ lineart_bounding_areas_connect_recursive()

◆ lineart_build_edge_neighbor()

◆ lineart_clear_linked_edges_recursive()

◆ lineart_create_edges_from_isec_data()

◆ lineart_create_render_buffer_v3()

static LineartData * lineart_create_render_buffer_v3 ( Scene * scene,
GreasePencilLineartModifierData * lmd,
Object * camera,
Object * active_camera,
LineartCache * lc )
static

Definition at line 3596 of file lineart_cpu.cc.

References LineartData::_conf::active_camera_pos, LineartCache::all_enabled_edge_types, LineartData::_conf::allow_boundaries, LineartData::_conf::allow_duplicated_types, LineartData::_conf::allow_overlapping_edges, GreasePencilLineartModifierData::angle_splitting_threshold, LineartData::_conf::angle_splitting_threshold, BKE_camera_sensor_fit(), BKE_render_num_threads(), BLI_spin_init(), GreasePencilLineartModifierData::cache, GreasePencilLineartModifierData::calculation_flags, LineartData::_conf::cam_is_persp, LineartData::_conf::cam_is_persp_secondary, LineartData::_conf::cam_obmat, LineartData::_conf::cam_obmat_secondary, CAM_PERSP, LineartData::_conf::camera_pos, LineartData::_conf::camera_pos_secondary, CAMERA_SENSOR_FIT_HOR, CAMERA_SENSOR_FIT_VERT, LineartCache::chain_data_pool, LineartData::chain_data_pool, LineartData::_conf::chain_preserve_details, GreasePencilLineartModifierData::chain_smooth_tolerance, LineartData::_conf::chain_smooth_tolerance, GreasePencilLineartModifierData::chaining_image_threshold, LineartData::_conf::chaining_image_threshold, Camera::clip_end, Camera::clip_start, LineartData::conf, copy_m4_m4(), copy_v3db_v3fl(), cos(), GreasePencilLineartModifierData::crease_threshold, LineartData::_conf::crease_threshold, Object::data, double(), LineartData::edge_data_pool, GreasePencilLineartModifierData::edge_types_override, LineartData::_conf::far_clip, LineartData::_conf::filter_face_mark, LineartData::_conf::filter_face_mark_boundaries, LineartData::_conf::filter_face_mark_invert, LineartData::_conf::filter_face_mark_keep_contour, LineartData::_conf::force_crease, LineartData::_conf::fuzzy_everything, LineartData::_conf::fuzzy_intersections, LineartData::h, GreasePencilLineartModifierData::la_data_ptr, LA_SUN, GreasePencilLineartModifierData::level_end_override, GreasePencilLineartModifierData::light_contour_object, LineartData::_conf::light_reference_available, LINEART_SHADOW_FILTER_ILLUMINATED_ENCLOSED_SHAPES, LineartData::lock_cuts, LineartStaticMemPool::lock_mem, LineartData::lock_task, LRT_TILE_RECURSIVE_ORTHO, LRT_TILE_RECURSIVE_PERSPECTIVE, M_PI, LineartData::_conf::max_occlusion_level, MEM_callocN, MOD_LINEART_ALLOW_CLIPPING_BOUNDARIES, MOD_LINEART_ALLOW_OVERLAP_EDGE_TYPES, MOD_LINEART_ALLOW_OVERLAPPING_EDGES, MOD_LINEART_CHAIN_GEOMETRY_SPACE, MOD_LINEART_CHAIN_LOOSE_EDGES, MOD_LINEART_CHAIN_PRESERVE_DETAILS, MOD_LINEART_EDGE_FLAG_CONTOUR, MOD_LINEART_EDGE_FLAG_CREASE, MOD_LINEART_EDGE_FLAG_EDGE_MARK, MOD_LINEART_EDGE_FLAG_INTERSECTION, MOD_LINEART_EDGE_FLAG_LIGHT_CONTOUR, MOD_LINEART_EDGE_FLAG_LOOSE, MOD_LINEART_EDGE_FLAG_MATERIAL, MOD_LINEART_EDGE_FLAG_PROJECTED_SHADOW, MOD_LINEART_EVERYTHING_AS_CONTOUR, MOD_LINEART_FILTER_FACE_MARK, MOD_LINEART_FILTER_FACE_MARK_BOUNDARIES, MOD_LINEART_FILTER_FACE_MARK_INVERT, MOD_LINEART_FILTER_FACE_MARK_KEEP_CONTOUR, MOD_LINEART_INTERSECTION_AS_CONTOUR, MOD_LINEART_LOOSE_AS_CONTOUR, MOD_LINEART_USE_BACK_FACE_CULLING, MOD_LINEART_USE_CREASE_ON_SHARP_EDGES, MOD_LINEART_USE_CREASE_ON_SMOOTH_SURFACES, MOD_LINEART_USE_IMAGE_BOUNDARY_TRIMMING, LineartData::_conf::near_clip, normalize_v3(), OB_LAMP, GreasePencilLineartModifierData::overscan, LineartData::_conf::overscan, LineartData::qtree, LineartData::_qtree::recursive_level, LineartData::render_data_pool, Camera::sensor_fit, LineartData::_conf::shadow_enclose_shapes, LineartData::_conf::shadow_selection, GreasePencilLineartModifierData::shadow_selection_override, LineartData::_conf::shadow_use_silhouette, GreasePencilLineartModifierData::shadow_use_silhouette_override, LineartData::_conf::sharp_as_crease, LineartData::_conf::shift_x, LineartData::_conf::shift_y, Camera::shiftx, Camera::shifty, LineartData::thread_count, Camera::type, Object::type, LineartData::_conf::use_back_face_culling, LineartData::_conf::use_contour, LineartData::_conf::use_crease, LineartData::_conf::use_edge_marks, LineartData::_conf::use_geometry_space_chain, LineartData::_conf::use_image_boundary_trimming, LineartData::_conf::use_intersections, LineartData::_conf::use_light_contour, LineartData::_conf::use_loose, LineartData::_conf::use_loose_as_contour, LineartData::_conf::use_loose_edge_chain, LineartData::_conf::use_material, LineartData::_conf::use_shadow, and LineartData::w.

Referenced by MOD_lineart_compute_feature_lines_v3().

◆ lineart_destroy_isec_thread()

static void lineart_destroy_isec_thread ( LineartIsecData * d)
static

◆ lineart_destroy_render_data()

◆ lineart_destroy_render_data_keep_init()

◆ lineart_discard_duplicated_edges()

static void lineart_discard_duplicated_edges ( LineartEdge * old_e)
static

◆ lineart_discard_segment()

static void lineart_discard_segment ( LineartData * ld,
LineartEdgeSegment * es )
static

◆ lineart_edge_cut()

◆ lineart_edge_first_bounding_area()

LineartBoundingArea * lineart_edge_first_bounding_area ( struct LineartData * ld,
double * fbcoord1,
double * fbcoord2 )

This function gets the tile for the point e->v1, and later use lineart_bounding_area_next() to get next along the way.

Definition at line 4775 of file lineart_cpu.cc.

References interp_v2_v2v2_db(), LB, lineart_get_bounding_area(), lineart_intersect_seg_seg(), and RB.

◆ lineart_edge_from_triangle()

bool lineart_edge_from_triangle ( const LineartTriangle * tri,
const LineartEdge * e,
bool allow_overlapping_edges )

◆ lineart_edge_match()

static bool lineart_edge_match ( LineartTriangle * tri,
LineartEdge * e,
int v1,
int v2 )
static

Definition at line 747 of file lineart_cpu.cc.

References e, LineartTriangle::v, and v2.

Referenced by lineart_triangle_adjacent_assign().

◆ lineart_edge_neighbor_init_task()

◆ lineart_edge_type_duplication_count()

static int lineart_edge_type_duplication_count ( int eflag)
static

◆ lineart_end_bounding_area_recursive()

◆ lineart_finalize_object_edge_array()

static void lineart_finalize_object_edge_array ( LineartPendingEdges * pe,
LineartObjectInfo * obi )
static

◆ lineart_finalize_object_edge_array_reserve()

void lineart_finalize_object_edge_array_reserve ( LineartPendingEdges * pe,
int count )

◆ lineart_free_bounding_area_memories()

◆ lineart_free_bounding_area_memory()

◆ lineart_geometry_check_visible()

static bool lineart_geometry_check_visible ( double model_view_proj[4][4],
double shift_x,
double shift_y,
Mesh * use_mesh )
static

◆ lineart_geometry_load_assign_thread()

static void lineart_geometry_load_assign_thread ( LineartObjectLoadTaskInfo * olti_list,
LineartObjectInfo * obi,
int thread_count,
int this_face_count )
static

◆ lineart_geometry_object_load()

static void lineart_geometry_object_load ( LineartObjectInfo * ob_info,
LineartData * la_data,
ListBase * shadow_elns )
static

Definition at line 1977 of file lineart_cpu.cc.

References LineartData::_conf::allow_duplicated_types, BKE_id_free(), BLI_addtail(), BLI_parallel_range_settings_defaults(), BLI_spin_lock(), BLI_spin_unlock(), BLI_task_parallel_range(), CD_FREESTYLE_EDGE, CD_FREESTYLE_FACE, LineartData::conf, TriData::corner_tris, TriData::corner_verts, cosf, blender::bke::LooseGeomCache::count, LineartData::_conf::crease_threshold, ObjectLineArt::crease_threshold, CustomData_get_active_layer_index(), CustomData_get_layer_index(), e, LineartEdgeNeighbor::e, LineartData::edge_data_pool, LineartEdge::edge_identifier, ELEM, LineartElementLinkNode::element_count, feat_data_sum_reduce(), EdgeFeatReduceData::feat_edges, LineartEdge::flags, LineartEdgeNeighbor::flags, LineartElementLinkNode::flags, ObjectLineArt::flags, LineartObjectInfo::free_use_mesh, TaskParallelSettings::func_reduce, LineartData::geom, int, blender::bke::LooseGeomCache::is_loose_bits, EdgeFeatData::ld, LineartData::_geom::line_buffer_pointers, Object::lineart, lineart_add_edge_to_array_thread(), lineart_build_edge_neighbor(), lineart_find_matching_edge(), lineart_find_matching_eln(), lineart_identify_corner_tri_feature_edges(), lineart_list_append_pointer_pool_sized_thread(), lineart_list_append_pointer_pool_thread(), lineart_load_tri_task(), lineart_mem_acquire_thread(), lineart_mvert_transform_task(), lineart_register_shadow_cuts(), lineart_triangle_adjacent_assign(), lineart_triangle_from_index(), TriData::lineart_triangle_size, LineartData::lock_task, LooseEdgeData::loose_array, LooseEdgeData::loose_count, LRT_EDGE_IDENTIFIER, LRT_ELEMENT_BORDER_ONLY, LRT_ELEMENT_NO_INTERSECTION, LRT_MESH_EDGE_TYPES, LRT_MESH_EDGE_TYPES_COUNT, M_PI, TriData::material_indices, MEM_callocN, MEM_freeN(), MEM_malloc_arrayN, MEM_SAFE_FREE, TaskParallelSettings::min_iter_per_thread, MOD_LINEART_EDGE_FLAG_LOOSE, MOD_LINEART_EDGE_FLAG_NEXT_IS_DUPLICATION, LineartObjectInfo::model_view, VertData::model_view, LineartObjectInfo::model_view_proj, VertData::model_view_proj, OB_FONT, TriData::ob_info, LineartElementLinkNode::obindex, LineartObjectInfo::obindex, OBJECT_LRT_FORCE_INTERSECTION, OBJECT_LRT_INCLUDE, OBJECT_LRT_INHERIT, OBJECT_LRT_NO_INTERSECTION, OBJECT_LRT_OWN_CREASE, LineartEdge::object_ref, LineartElementLinkNode::object_ref, LineartObjectInfo::original_me, LineartObjectInfo::original_ob, LineartObjectInfo::original_ob_eval, TriData::positions, VertData::positions, LineartData::render_data_pool, LineartEdge::segments, blender::Span< T >::size(), LineartData::sizeof_triangle, LineartEdge::t1, LineartEdge::t2, TriData::tri_adj, TriData::tri_arr, TriData::tri_faces, LineartData::_geom::triangle_adjacent_pointers, LineartData::_geom::triangle_buffer_pointers, Object::type, LineartObjectInfo::usage, LineartData::_conf::use_loose, TaskParallelSettings::userdata_chunk, TaskParallelSettings::userdata_chunk_size, LineartEdge::v1, LineartEdgeNeighbor::v1, LineartEdge::v2, LineartEdgeNeighbor::v2, VertData::v_arr, LineartObjectInfo::v_eln, TriData::vert_arr, and LineartData::_geom::vertex_buffer_pointers.

Referenced by lineart_object_load_worker().

◆ lineart_get_bounding_area()

◆ lineart_get_edge_bounding_areas()

static bool lineart_get_edge_bounding_areas ( LineartData * ld,
LineartEdge * e,
int * rowbegin,
int * rowend,
int * colbegin,
int * colend )
static

◆ lineart_get_triangle_bounding_areas()

static bool lineart_get_triangle_bounding_areas ( LineartData * ld,
LineartTriangle * tri,
int * rowbegin,
int * rowend,
int * colbegin,
int * colend )
static

◆ lineart_give_segment()

◆ lineart_identify_corner_tri_feature_edges()

static void lineart_identify_corner_tri_feature_edges ( void *__restrict userdata,
const int i,
const TaskParallelTLS *__restrict tls )
static

Definition at line 1527 of file lineart_cpu.cc.

References LineartData::_conf::allow_duplicated_types, BKE_object_material_get_eval(), LineartData::_conf::cam_is_persp, LineartData::_conf::cam_is_persp_secondary, LineartData::_conf::camera_pos, LineartData::_conf::camera_pos_secondary, LineartData::conf, EdgeFeatData::corner_edges, EdgeFeatData::corner_tris, EdgeFeatData::corner_verts, EdgeFeatData::crease_threshold, dot_v3v3_db(), e, LineartEdgeNeighbor::e, EdgeFeatData::edge_nabr, EdgeFeatData::edges, EdgeFeatReduceData::feat_edges, LineartData::_conf::filter_face_mark, LineartData::_conf::filter_face_mark_boundaries, LineartData::_conf::filter_face_mark_invert, LineartData::_conf::filter_face_mark_keep_contour, FreestyleEdge::flag, FreestyleFace::flag, LineartEdgeNeighbor::flags, LineartTriangle::flags, LineartData::_conf::force_crease, EdgeFeatData::freestyle_edge_index, FREESTYLE_EDGE_MARK, EdgeFeatData::freestyle_face_index, FREESTYLE_FACE_MARK, LineartVert::gloc, LineartTriangle::gn, blender::Span< T >::is_empty(), EdgeFeatData::ld, Material::lineart, lineart_edge_type_duplication_count(), lineart_triangle_from_index(), LRT_CULL_DISCARD, LRT_TRIANGLE_MAT_BACK_FACE_CULLING, MaterialLineArt::mat_occlusion, EdgeFeatData::material_indices, EdgeFeatData::mesh, MOD_LINEART_EDGE_FLAG_CONTOUR, MOD_LINEART_EDGE_FLAG_CONTOUR_SECONDARY, MOD_LINEART_EDGE_FLAG_CREASE, MOD_LINEART_EDGE_FLAG_EDGE_MARK, MOD_LINEART_EDGE_FLAG_INHIBIT, MOD_LINEART_EDGE_FLAG_MATERIAL, EdgeFeatData::ob_eval, result, LineartData::_conf::sharp_as_crease, EdgeFeatData::sharp_edges, EdgeFeatData::sharp_faces, sub_v3_v3v3_db(), EdgeFeatData::tri_array, EdgeFeatData::tri_faces, EdgeFeatData::use_auto_smooth, LineartData::_conf::use_back_face_culling, LineartData::_conf::use_contour, LineartData::_conf::use_contour_secondary, LineartData::_conf::use_crease, LineartData::_conf::use_edge_marks, EdgeFeatData::use_freestyle_edge, EdgeFeatData::use_freestyle_face, LineartData::_conf::use_material, LineartEdgeNeighbor::v1, EdgeFeatData::v_array, LineartData::_conf::view_vector, and LineartData::_conf::view_vector_secondary.

Referenced by lineart_geometry_object_load().

◆ lineart_init_isec_thread()

◆ lineart_intersection_mask_check()

◆ lineart_intersection_priority_check()

◆ lineart_load_tri_task()

static void lineart_load_tri_task ( void *__restrict userdata,
const int i,
const TaskParallelTLS * __restrict )
static

◆ lineart_main_add_triangles()

◆ lineart_main_bounding_area_make_initial()

◆ lineart_main_bounding_areas_connect_post()

◆ lineart_main_clear_linked_edges()

◆ lineart_main_cull_triangles()

◆ lineart_main_discard_out_of_frame_edges()

◆ lineart_main_free_adjacent_data()

void lineart_main_free_adjacent_data ( struct LineartData * ld)

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.

Definition at line 1357 of file lineart_cpu.cc.

References BLI_pophead(), LineartData::geom, LineartTriangle::intersecting_verts, LISTBASE_FOREACH, MEM_freeN(), LineartData::sizeof_triangle, LineartData::_geom::triangle_adjacent_pointers, and LineartData::_geom::triangle_buffer_pointers.

Referenced by lineart_main_try_generate_shadow_v3(), and MOD_lineart_compute_feature_lines_v3().

◆ lineart_main_get_view_vector()

◆ lineart_main_link_lines()

◆ lineart_main_load_geometries()

void lineart_main_load_geometries ( Depsgraph * depsgraph,
Scene * scene,
Object * camera,
LineartData * ld,
bool allow_duplicates,
bool do_shadow_casting,
ListBase * shadow_elns,
blender::Set< const Object * > * included_objects )

Definition at line 2548 of file lineart_cpu.cc.

References BKE_camera_sensor_fit(), BKE_camera_sensor_size(), BKE_object_visibility(), BLI_listbase_clear(), BLI_task_pool_create(), BLI_task_pool_free(), BLI_task_pool_push(), BLI_task_pool_work_and_wait(), BLI_time_now_seconds(), LineartData::_conf::cam_obmat, CAM_ORTHO, CAM_PERSP, CAMERA_SENSOR_FIT_HOR, CAMERA_SENSOR_FIT_VERT, Camera::clip_end, Camera::clip_start, LineartData::conf, copy_m4_m4_db(), DAG_EVAL_RENDER, DEG_get_evaluated_object(), DEG_get_mode(), DEG_ITER_OBJECT_FLAG_DUPLI, DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY, DEG_ITER_OBJECT_FLAG_LINKED_VIA_SET, DEG_ITER_OBJECT_FLAG_VISIBLE, DEG_OBJECT_ITER_BEGIN, DEG_OBJECT_ITER_END, DEGObjectIterSettings::depsgraph, depsgraph, double(), ELEM, DEGObjectIterSettings::flags, focallength_to_fov(), G, LineartData::geom, LineartData::h, DEGObjectIterSettings::included_objects, invert_m4_m4(), LineartObjectLoadTaskInfo::ld, Camera::lens, lineart_finalize_object_edge_array(), lineart_finalize_object_edge_array_reserve(), lineart_matrix_ortho_44d(), lineart_matrix_perspective_44d(), lineart_mem_acquire(), lineart_object_load_single_instance(), lineart_object_load_worker(), mul_m4db_m4db_m4fl(), OB_CURVES_LEGACY, OB_FONT, OB_SURF, OB_VISIBLE_SELF, Camera::ortho_scale, LineartData::_conf::overscan, LineartData::pending_edges, printf, LineartData::render_data_pool, Camera::sensor_fit, Camera::sensor_x, Camera::sensor_y, LineartObjectLoadTaskInfo::shadow_elns, TASK_PRIORITY_HIGH, LineartData::thread_count, LineartObjectLoadTaskInfo::thread_id, LineartData::_geom::triangle_buffer_pointers, Camera::type, unit_m4_db(), v, LineartData::_geom::vertex_buffer_pointers, LineartData::_conf::view, LineartData::_conf::view_projection, LineartData::w, and w().

Referenced by lineart_main_try_generate_shadow_v3(), and MOD_lineart_compute_feature_lines_v3().

◆ lineart_main_occlusion_begin()

void lineart_main_occlusion_begin ( struct LineartData * ld)

All internal functions starting with lineart_main_ is called inside #MOD_lineart_compute_feature_lines function. This function handles all occlusion calculation.

Definition at line 480 of file lineart_cpu.cc.

References BLI_task_pool_create(), BLI_task_pool_free(), BLI_task_pool_push(), BLI_task_pool_work_and_wait(), LineartRenderTaskInfo::ld, lineart_occlusion_worker(), MEM_callocN, MEM_freeN(), TASK_PRIORITY_HIGH, LineartData::thread_count, and LineartRenderTaskInfo::thread_id.

Referenced by lineart_main_make_enclosed_shapes(), lineart_main_try_generate_shadow_v3(), and MOD_lineart_compute_feature_lines_v3().

◆ lineart_main_perspective_division()

◆ lineart_main_remove_unused_lines_from_tiles()

◆ lineart_main_remove_unused_lines_recursive()

◆ lineart_memory_get_edge_space()

◆ lineart_memory_get_triangle_space()

static LineartElementLinkNode * lineart_memory_get_triangle_space ( LineartData * ld)
static

The following lineart_memory_get_XXX_space functions are for allocating new memory for some modified geometries in the culling stage.

Definition at line 677 of file lineart_cpu.cc.

References LineartElementLinkNode::element_count, LineartElementLinkNode::flags, LineartData::geom, lineart_list_append_pointer_pool_sized(), lineart_mem_acquire(), LRT_ELEMENT_IS_ADDITIONAL, LineartData::render_data_pool, LineartData::sizeof_triangle, and LineartData::_geom::triangle_buffer_pointers.

Referenced by lineart_main_cull_triangles().

◆ lineart_memory_get_vert_space()

◆ lineart_mvert_transform_task()

static void lineart_mvert_transform_task ( void *__restrict userdata,
const int i,
const TaskParallelTLS * __restrict )
static

◆ lineart_object_load_single_instance()

◆ lineart_object_load_worker()

static void lineart_object_load_worker ( TaskPool * __restrict,
LineartObjectLoadTaskInfo * olti )
static

◆ lineart_occlusion_is_adjacent_intersection()

BLI_INLINE bool lineart_occlusion_is_adjacent_intersection ( LineartEdge * e,
LineartTriangle * tri )

To see if given line is connected to an adjacent intersection line.

Definition at line 365 of file lineart_cpu.cc.

References e, LRT_LIGHT_CONTOUR_TARGET, and LineartTriangle::target_reference.

Referenced by lineart_occlusion_single_line().

◆ lineart_occlusion_make_task_info()

◆ lineart_occlusion_single_line()

◆ lineart_occlusion_worker()

◆ lineart_point_inside_triangle()

static bool lineart_point_inside_triangle ( const double v[2],
const double v0[2],
const double v1[2],
const double v2[2] )
static

Test if v lies with in the triangle formed by v0, v1, and v2. Returns false when v is exactly on the edge.

For v to be inside the triangle, it needs to be at the same side of v0->v1, v1->v2, and v2->v0, where the "side" is determined by checking the sign of cross(v1-v0, v1-v) and so on.

Definition at line 507 of file lineart_cpu.cc.

References v, and v2.

Referenced by lineart_bounding_area_triangle_intersect().

◆ lineart_point_inside_triangle3d()

static bool lineart_point_inside_triangle3d ( double v[3],
double v0[3],
double v1[3],
double v2[3] )
static

Similar with lineart_point_inside_triangle, but in 3d. Returns false when not co-planar.

Definition at line 636 of file lineart_cpu.cc.

References cross_v3_v3v3_db(), dot_v3v3_db(), l, sub_v3_v3v3_db(), v, and v2.

Referenced by lineart_triangle_2v_intersection_math().

◆ lineart_point_on_line_segment()

static int lineart_point_on_line_segment ( double v[2],
double v0[2],
double v1[2] )
static

◆ lineart_point_triangle_relation()

static LineartPointTri lineart_point_triangle_relation ( double v[2],
double v0[2],
double v1[2],
double v2[2] )
static

Same algorithm as lineart_point_inside_triangle(), but returns differently: 0-outside 1-on the edge 2-inside.

Definition at line 590 of file lineart_cpu.cc.

References lineart_point_on_line_segment(), LRT_INSIDE_TRIANGLE, LRT_ON_TRIANGLE, LRT_OUTSIDE_TRIANGLE, v, and v2.

Referenced by lineart_triangle_edge_image_space_occlusion().

◆ lineart_schedule_new_triangle_task()

◆ lineart_sort_adjacent_items()

static void lineart_sort_adjacent_items ( LineartAdjacentEdge * ai,
int length )
static

◆ lineart_triangle_2v_intersection_math()

static bool lineart_triangle_2v_intersection_math ( LineartVert * v1,
LineartVert * v2,
LineartTriangle * tri,
const double * last,
double * rv )
static

◆ lineart_triangle_adjacent_assign()

static void lineart_triangle_adjacent_assign ( LineartTriangle * tri,
LineartTriangleAdjacent * tri_adj,
LineartEdge * e )
static

Definition at line 1799 of file lineart_cpu.cc.

References e, LineartTriangleAdjacent::e, and lineart_edge_match().

Referenced by lineart_geometry_object_load().

◆ lineart_triangle_cull_single()

static void lineart_triangle_cull_single ( LineartData * ld,
LineartTriangle * tri,
int in0,
int in1,
int in2,
double cam_pos[3],
double view_dir[3],
bool allow_boundaries,
double m_view_projection[4][4],
Object * ob,
int * r_v_count,
int * r_e_count,
int * r_t_count,
LineartElementLinkNode * v_eln,
LineartElementLinkNode * e_eln,
LineartElementLinkNode * t_eln )
static

Does near-plane cut on 1 triangle only. When cutting with far-plane, the camera vectors gets reversed by the caller so don't need to implement one in a different direction.

(!in0) means "when point 0 is visible". conditions for point 1, 2 are the same idea.

identify
1-----|-------0
| | ---
| |---
| ---|
2-- |
(near)---------->(far)
Will become:
|N******0
|* ***
|N**
|
|
(near)---------->(far)
#define N

(in0) means "when point 0 is invisible". conditions for point 1, 2 are the same idea.

0------|----------1
-- | |
---| |
|-- |
| --- |
| --- |
| --2
(near)---------->(far)
Will become:
|N*********1
|* *** |
|* *** |
|N** |
| *** |
| *** |
| **2
(near)---------->(far)

Definition at line 766 of file lineart_cpu.cc.

References dot_v3v3_db(), e, LineartTriangle::flags, LineartVert::gloc, INCREASE_EDGE, LineartVert::index, interp_v3_v3v3_db(), LineartTriangle::intersecting_verts, lineart_add_edge_to_array(), lineart_triangle_post(), lineart_triangle_set_cull_flag(), LRT_CULL_DISCARD, LRT_CULL_GENERATED, LRT_CULL_USED, MOD_LINEART_EDGE_FLAG_CONTOUR, mul_v4_m4v3_db(), LineartData::pending_edges, LineartElementLinkNode::pointer, RELINK_EDGE, REMOVE_TRIANGLE_EDGE, SELECT_EDGE, LineartData::sizeof_triangle, sub_v3_v3v3_db(), and LineartTriangle::v.

Referenced by lineart_main_cull_triangles().

◆ lineart_triangle_edge_image_space_occlusion()

static bool lineart_triangle_edge_image_space_occlusion ( const LineartTriangle * tri,
const LineartEdge * e,
const double * override_camera_loc,
const bool override_cam_is_persp,
const bool allow_overlapping_edges,
const double m_view_projection[4][4],
const double camera_dir[3],
const float cam_shift_x,
const float cam_shift_y,
double * from,
double * to )
static

This is the main function to calculate the occlusion status between 1(one) triangle and 1(one) line. if returns true, then from/to will carry the occluded segments in ratio from e->v1 to e->v2. The line is later cut with these two values.

TODO(@Yiming): This function uses a convoluted method that needs to be redesigned.

1) The lineart_intersect_seg_seg() and lineart_point_triangle_relation() are separate calls, which would potentially return results that doesn't agree, especially when it's an edge extruding from one of the triangle's point. To get the information using one math process can solve this problem.

2) Currently using discrete a/b/c/para_e1/para_e2/para_e3/is[3] values for storing intersection/edge_aligned/intersection_order info, which isn't optimal, needs a better representation (likely a struct) for readability and clarity of code path.

I keep this function as-is because it's still fast, and more importantly the output value threshold is already in tune with the cutting function in the next stage. While current "edge aligned" fix isn't ideal, it does solve most of the precision issue especially in orthographic camera mode.

Definition at line 2831 of file lineart_cpu.cc.

References copy_v3_v3_db(), DBL_TRIANGLE_LIM, dot_v3v3_db(), e, fabs(), LineartVert::fbcoord, LineartVert::gloc, LineartTriangle::gn, interp_v3_v3v3_db(), INTERSECT_JUST_GREATER, INTERSECT_JUST_SMALLER, INTERSECT_SORT_MIN_TO_MAX_3, lineart_edge_from_triangle(), lineart_intersect_seg_seg(), lineart_point_triangle_relation(), LRT_GUARD_NOT_FOUND, LRT_INSIDE_TRIANGLE, LRT_ISEC, LRT_ON_TRIANGLE, LRT_OUTSIDE_TRIANGLE, LRT_PARALLEL, MOD_LINEART_EDGE_FLAG_PROJECTED_SHADOW, MOD_LINEART_EDGE_FLAG_SHADOW_FACING_LIGHT, mul_v3db_db(), mul_v4_m4v3_db(), ratiod(), sub_v3_v3v3_db(), LineartTriangle::target_reference, and LineartTriangle::v.

Referenced by lineart_occlusion_single_line().

◆ lineart_triangle_from_index()

static LineartTriangle * lineart_triangle_from_index ( LineartData * ld,
LineartTriangle * rt_array,
int index )
static

Because we have a variable size for LineartTriangle, we need an access helper. See LineartTriangleThread for more info.

Definition at line 1482 of file lineart_cpu.cc.

References b, and LineartData::sizeof_triangle.

Referenced by lineart_geometry_object_load(), and lineart_identify_corner_tri_feature_edges().

◆ lineart_triangle_get_other_verts()

static bool lineart_triangle_get_other_verts ( const LineartTriangle * tri,
const LineartVert * vt,
LineartVert ** l,
LineartVert ** r )
static

Returns the two other verts of the triangle given a vertex. Returns false if the given vertex doesn't belong to this triangle.

Definition at line 2713 of file lineart_cpu.cc.

References l, and LineartTriangle::v.

Referenced by lineart_triangle_intersect_math().

◆ lineart_triangle_intersect_in_bounding_area()

◆ lineart_triangle_intersect_math()

◆ lineart_triangle_post()

◆ lineart_triangle_set_cull_flag()

static void lineart_triangle_set_cull_flag ( LineartTriangle * tri,
uchar flag )
static

◆ lineart_triangle_share_edge()

static bool lineart_triangle_share_edge ( const LineartTriangle * l,
const LineartTriangle * r )
static

At this stage of the computation we don't have triangle adjacent info anymore, so we can only compare the global vert index.

Definition at line 3127 of file lineart_cpu.cc.

References LineartVert::index, l, BMLoop::v, and LineartTriangle::v.

Referenced by lineart_triangle_intersect_in_bounding_area().

◆ lineart_triangle_share_point()

static LineartVert * lineart_triangle_share_point ( const LineartTriangle * l,
const LineartTriangle * r )
static

Definition at line 3176 of file lineart_cpu.cc.

References l, BMLoop::v, and LineartTriangle::v.

Referenced by lineart_triangle_intersect_math().

◆ lineart_triangle_size_get()

static int lineart_triangle_size_get ( LineartData * ld)
static

Definition at line 3747 of file lineart_cpu.cc.

References LineartData::thread_count.

Referenced by MOD_lineart_compute_feature_lines_v3().

◆ lineart_usage_check()

◆ MOD_lineart_clear_cache()

void MOD_lineart_clear_cache ( LineartCache ** lc)

◆ MOD_lineart_compute_feature_lines_v3()

bool MOD_lineart_compute_feature_lines_v3 ( struct Depsgraph * depsgraph,
struct GreasePencilLineartModifierData & lmd,
struct LineartCache ** cached_result,
bool enable_stroke_depth_offset )

This is the entry point of all line art calculations.

Returns
True when a change is made.

Definition at line 5025 of file lineart_cpu.cc.

References LineartData::_conf::angle_splitting_threshold, BKE_scene_camera_switch_update(), BLI_time_now_seconds(), GreasePencilLineartModifierData::calculation_flags, LineartData::_conf::chain_smooth_tolerance, LineartCache::chains, LineartData::chains, LineartData::conf, DEG_get_evaluated_object(), DEG_get_evaluated_scene(), depsgraph, ListBase::first, GreasePencilLineartModifierData::flags, G, LineartData::geom, lineart_count_and_print_render_buffer_memory(), lineart_create_render_buffer_v3(), lineart_destroy_render_data_keep_init(), lineart_main_add_triangles(), lineart_main_bounding_area_make_initial(), lineart_main_bounding_areas_connect_post(), lineart_main_cull_triangles(), lineart_main_discard_out_of_frame_edges(), lineart_main_free_adjacent_data(), lineart_main_get_view_vector(), lineart_main_link_lines(), lineart_main_load_geometries(), lineart_main_make_enclosed_shapes(), lineart_main_occlusion_begin(), lineart_main_perspective_division(), lineart_main_remove_unused_lines_from_tiles(), lineart_main_transform_and_add_shadow(), lineart_main_try_generate_shadow_v3(), lineart_mem_destroy(), lineart_register_intersection_shadow_cuts(), lineart_triangle_size_get(), MEM_freeN(), MOD_LINEART_ALLOW_DUPLI_OBJECTS, MOD_lineart_chain_clear_picked_flag(), MOD_lineart_chain_clip_at_border(), MOD_lineart_chain_connect(), MOD_lineart_chain_feature_lines(), MOD_lineart_chain_find_silhouette_backdrop_objects(), MOD_lineart_chain_offset_towards_camera(), MOD_lineart_chain_split_angle(), MOD_lineart_chain_split_for_fixed_occlusion(), MOD_lineart_finalize_chains(), MOD_lineart_init_cache(), MOD_LINEART_OFFSET_TOWARDS_CUSTOM_CAMERA, MOD_lineart_smooth_chains(), MOD_LINEART_USE_CUSTOM_CAMERA, OB_CAMERA, LineartModifierRuntime::object_dependencies, printf, RE_GetSceneRender(), GreasePencilLineartModifierData::runtime, LineartCache::shadow_data_pool, LineartCache::shadow_elns, LineartData::_conf::shadow_enclose_shapes, LineartData::_conf::shadow_selection, LineartData::_conf::shadow_use_silhouette, LineartData::sizeof_triangle, GreasePencilLineartModifierData::source_camera, GreasePencilLineartModifierData::stroke_depth_offset, Object::type, LineartData::_conf::use_image_boundary_trimming, and LineartData::_geom::vertex_buffer_pointers.

Referenced by bake_strokes(), and blender::generate_strokes().

◆ MOD_lineart_destroy_render_data_v3()

void MOD_lineart_destroy_render_data_v3 ( GreasePencilLineartModifierData * lmd)

◆ MOD_lineart_get_bounding_area()

LineartBoundingArea * MOD_lineart_get_bounding_area ( LineartData * ld,
double x,
double y )

Wrapper for more convenience.

Definition at line 4585 of file lineart_cpu.cc.

References lineart_get_bounding_area(), and MOD_lineart_get_parent_bounding_area().

Referenced by MOD_lineart_chain_feature_lines().

◆ MOD_lineart_get_parent_bounding_area()

◆ MOD_lineart_gpencil_generate_v3()

void MOD_lineart_gpencil_generate_v3 ( const LineartCache * cache,
const blender::float4x4 & inverse_mat,
Depsgraph * depsgraph,
blender::bke::greasepencil::Drawing & drawing,
const int8_t source_type,
Object * source_object,
Collection * source_collection,
const int level_start,
const int level_end,
const int mat_nr,
const int16_t edge_types,
const uchar mask_switches,
const uchar material_mask_bits,
const uchar intersection_mask,
const float thickness,
const float opacity,
const uchar shadow_selection,
const uchar silhouette_mode,
const char * source_vgname,
const char * vgname,
const int modifier_flags,
const int modifier_calculation_flags )

Definition at line 5234 of file lineart_cpu.cc.

References LineartCache::all_enabled_edge_types, blender::Vector< T, InlineBufferCapacity, Allocator >::append(), blender::bke::CurvesGeometry::attributes_for_write(), BKE_collection_has_object_recursive_instanced(), BKE_defvert_ensure_index(), BKE_id_defgroup_name_index(), BKE_object_get_evaluated_mesh(), LineartChainWriteInfo::chain, LineartEdgeChain::chain, LineartCache::chains, count, CURVE_TYPE_POLY, blender::bke::curves_new_nomain(), DEG_get_evaluated_object(), depsgraph, blender::bke::CurvesGeometry::fill_curve_types(), blender::bke::SpanAttributeWriter< T >::finish(), blender::bke::GeometrySet::from_curves(), G, Curves::geometry, blender::bke::GeometrySet::get_curves_for_write(), Collection::id, Mesh::id, Object::id, blender::Vector< T, InlineBufferCapacity, Allocator >::index_range(), blender::geometry::join_geometries(), blender::IndexRange::last(), LINEART_SHADOW_FILTER_ILLUMINATED, LINEART_SHADOW_FILTER_ILLUMINATED_ENCLOSED_SHAPES, LINEART_SHADOW_FILTER_SHADED, LINEART_SILHOUETTE_FILTER_INDIVIDUAL, LINEART_SOURCE_COLLECTION, LINEART_SOURCE_OBJECT, LISTBASE_FOREACH, LISTBASE_FOREACH_INDEX, LRT_SHADOW_MASK_ILLUMINATED, LRT_SHADOW_MASK_ILLUMINATED_SHAPE, LRT_SHADOW_MASK_SHADED, LRT_SHADOW_MASK_UNDEFINED, LRT_SHADOW_TEST_SHAPE_BITS, max_ii(), MOD_lineart_chain_count(), MOD_LINEART_EDGE_FLAG_CONTOUR, MOD_LINEART_EDGE_FLAG_INTERSECTION, MOD_LINEART_INTERSECTION_MATCH, MOD_LINEART_INVERT_COLLECTION, MOD_LINEART_INVERT_SILHOUETTE_FILTER, MOD_LINEART_INVERT_SOURCE_VGROUP, MOD_LINEART_MATERIAL_MASK_ENABLE, MOD_LINEART_MATERIAL_MASK_MATCH, OB_MESH, LineartEdgeChain::object_ref, blender::bke::CurvesGeometry::offsets_for_write(), ID::orig_id, LineartChainWriteInfo::point_count, blender::bke::CurvesGeometry::positions_for_write(), printf, blender::Vector< T, InlineBufferCapacity, Allocator >::reserve(), blender::bke::SpanAttributeWriter< T >::span, blender::bke::greasepencil::Drawing::strokes(), blender::bke::greasepencil::Drawing::strokes_for_write(), blender::bke::greasepencil::Drawing::tag_topology_changed(), blender::math::transform_point(), Object::type, Mesh::verts_num, and MDeformWeight::weight.

Referenced by bake_strokes(), and blender::generate_strokes().

◆ MOD_lineart_init_cache()

LineartCache * MOD_lineart_init_cache ( )

Definition at line 3579 of file lineart_cpu.cc.

References MEM_callocN.

Referenced by MOD_lineart_compute_feature_lines_v3(), and blender::modify_geometry_set().

Variable Documentation

◆ LRT_MESH_EDGE_TYPES