Blender V4.3
lineart_chain.cc File Reference
#include "BLI_listbase.h"
#include "BLI_math_geom.h"
#include "MOD_lineart.hh"
#include "lineart_intern.hh"
#include <algorithm>
#include <cmath>

Go to the source code of this file.

Macros

#define LRT_OTHER_VERT(e, vt)   ((vt) == (e)->v1 ? (e)->v2 : ((vt) == (e)->v2 ? (e)->v1 : nullptr))
 
#define VERT_COORD_TO_FLOAT(a)
 
#define POS_TO_FLOAT(lpos, gpos)
 
#define IN_BOUND(ba, eci)    ba.l <= eci->pos[0] && ba.r >= eci->pos[0] && ba.b <= eci->pos[1] && ba.u >= eci->pos[1]
 
#define IN_BOUND(ba, eci)    ba.l <= eci->pos[0] && ba.r >= eci->pos[0] && ba.b <= eci->pos[1] && ba.u >= eci->pos[1]
 
#define LRT_TEST_ADJACENT_AREAS(dist_to, list)
 
#define LRT_ECI_INSIDE(eci)
 

Functions

static LineartEdgelineart_line_get_connected (LineartBoundingArea *ba, LineartVert *vt, LineartVert **new_vt, int match_flag, uint8_t match_isec_mask, Object *match_isec_object)
 
static LineartEdgeChainlineart_chain_create (LineartData *ld)
 
static bool lineart_point_overlapping (LineartEdgeChainItem *eci, float x, float y, double threshold)
 
static LineartEdgeChainItemlineart_chain_append_point (LineartData *ld, LineartEdgeChain *ec, float fbcoord[4], float gpos[3], float normal[3], uint8_t type, int level, uint8_t material_mask_bits, uint32_t shadow_mask_bits, size_t index)
 
static LineartEdgeChainItemlineart_chain_prepend_point (LineartData *ld, LineartEdgeChain *ec, float fbcoord[4], float gpos[3], float normal[3], uint8_t type, int level, uint8_t material_mask_bits, uint32_t shadow_mask_bits, size_t index)
 
void MOD_lineart_chain_feature_lines (LineartData *ld)
 
static LineartBoundingArealineart_bounding_area_get_eci_recursive (LineartData *ld, LineartBoundingArea *root, LineartEdgeChainItem *eci)
 
static LineartBoundingArealineart_bounding_area_get_end_point (LineartData *ld, LineartEdgeChainItem *eci)
 
static void lineart_bounding_area_link_point_recursive (LineartData *ld, LineartBoundingArea *root, LineartEdgeChain *ec, LineartEdgeChainItem *eci)
 
static void lineart_bounding_area_link_chain (LineartData *ld, LineartEdgeChain *ec)
 
static bool lineart_chain_fix_ambiguous_segments (LineartEdgeChain *ec, LineartEdgeChainItem *last_matching_eci, float distance_threshold, bool preserve_details, LineartEdgeChainItem **r_next_eci)
 
void MOD_lineart_chain_split_for_fixed_occlusion (LineartData *ld)
 
static void lineart_chain_connect (LineartData *, LineartEdgeChain *onto, LineartEdgeChain *sub, int reverse_1, int reverse_2)
 
static LineartChainRegisterEntrylineart_chain_get_closest_cre (LineartData *ld, LineartBoundingArea *ba, LineartEdgeChain *ec, LineartEdgeChainItem *eci, int occlusion, uint8_t material_mask_bits, uint8_t isec_mask, uint32_t shadow_mask, int loop_id, float dist, float *result_new_len, LineartBoundingArea *caller_ba)
 
void MOD_lineart_chain_connect (LineartData *ld)
 
float MOD_lineart_chain_compute_length (LineartEdgeChain *ec)
 
void MOD_lineart_chain_discard_unused (LineartData *ld, const float threshold, uint8_t max_occlusion)
 
int MOD_lineart_chain_count (const LineartEdgeChain *ec)
 
void MOD_lineart_chain_clear_picked_flag (LineartCache *lc)
 
LineartElementLinkNodelineart_find_matching_eln_obj (ListBase *elns, Object *ob)
 
void MOD_lineart_finalize_chains (LineartData *ld)
 
void MOD_lineart_smooth_chains (LineartData *ld, float tolerance)
 
static LineartEdgeChainItemlineart_chain_create_crossing_point (LineartData *ld, LineartEdgeChainItem *eci_inside, LineartEdgeChainItem *eci_outside)
 
void MOD_lineart_chain_clip_at_border (LineartData *ld)
 
void MOD_lineart_chain_split_angle (LineartData *ld, float angle_threshold_rad)
 
void MOD_lineart_chain_offset_towards_camera (LineartData *ld, float dist, bool use_custom_camera)
 
void MOD_lineart_chain_find_silhouette_backdrop_objects (LineartData *ld)
 

Macro Definition Documentation

◆ IN_BOUND [1/2]

#define IN_BOUND ( ba,
eci )    ba.l <= eci->pos[0] && ba.r >= eci->pos[0] && ba.b <= eci->pos[1] && ba.u >= eci->pos[1]

◆ IN_BOUND [2/2]

#define IN_BOUND ( ba,
eci )    ba.l <= eci->pos[0] && ba.r >= eci->pos[0] && ba.b <= eci->pos[1] && ba.u >= eci->pos[1]

◆ LRT_ECI_INSIDE

#define LRT_ECI_INSIDE ( eci)
Value:
((eci)->pos[0] >= -1.0f && (eci)->pos[0] <= 1.0f && (eci)->pos[1] >= -1.0f && \
(eci)->pos[1] <= 1.0f)

Definition at line 1234 of file lineart_chain.cc.

Referenced by MOD_lineart_chain_clip_at_border().

◆ LRT_OTHER_VERT

#define LRT_OTHER_VERT ( e,
vt )   ((vt) == (e)->v1 ? (e)->v2 : ((vt) == (e)->v2 ? (e)->v1 : nullptr))

Definition at line 19 of file lineart_chain.cc.

Referenced by lineart_line_get_connected().

◆ LRT_TEST_ADJACENT_AREAS

#define LRT_TEST_ADJACENT_AREAS ( dist_to,
list )
Value:
if (dist_to < dist && dist_to > 0) { \
LISTBASE_FOREACH (LinkData *, link, list) { \
LineartBoundingArea *sba = (LineartBoundingArea *)link->data; \
adjacent_closest = lineart_chain_get_closest_cre(ld, \
sba, \
ec, \
eci, \
occlusion, \
material_mask_bits, \
isec_mask, \
shadow_mask, \
loop_id, \
dist, \
&adjacent_new_len, \
ba); \
if (adjacent_new_len < dist) { \
dist = adjacent_new_len; \
closest_cre = adjacent_closest; \
} \
} \
}
static LineartChainRegisterEntry * lineart_chain_get_closest_cre(LineartData *ld, LineartBoundingArea *ba, LineartEdgeChain *ec, LineartEdgeChainItem *eci, int occlusion, uint8_t material_mask_bits, uint8_t isec_mask, uint32_t shadow_mask, int loop_id, float dist, float *result_new_len, LineartBoundingArea *caller_ba)

Referenced by lineart_chain_get_closest_cre().

◆ POS_TO_FLOAT

#define POS_TO_FLOAT ( lpos,
gpos )
Value:
copy_v3fl_v3db(use_fbcoord, lpos); \
copy_v3fl_v3db(use_gpos, gpos);
MINLINE void copy_v3fl_v3db(float r[3], const double a[3])

Referenced by MOD_lineart_chain_feature_lines().

◆ VERT_COORD_TO_FLOAT

#define VERT_COORD_TO_FLOAT ( a)
Value:
copy_v4fl_v4db(use_fbcoord, (a)->fbcoord); \
copy_v3fl_v3db(use_gpos, (a)->gloc);
MINLINE void copy_v4fl_v4db(float r[4], const double a[4])

Referenced by MOD_lineart_chain_feature_lines().

Function Documentation

◆ lineart_bounding_area_get_eci_recursive()

◆ lineart_bounding_area_get_end_point()

static LineartBoundingArea * lineart_bounding_area_get_end_point ( LineartData * ld,
LineartEdgeChainItem * eci )
static

◆ lineart_bounding_area_link_chain()

◆ lineart_bounding_area_link_point_recursive()

static void lineart_bounding_area_link_point_recursive ( LineartData * ld,
LineartBoundingArea * root,
LineartEdgeChain * ec,
LineartEdgeChainItem * eci )
static

Here we will try to connect geometry space chains together in image space. However we can't chain two chains together if their end and start points lie on the border between two bounding areas, this happens either when 1) the geometry is way too dense, or 2) the chaining threshold is too big that it covers multiple small bounding areas.

Definition at line 552 of file lineart_chain.cc.

References LineartEdgeChain::chain, LineartData::chain_data_pool, LineartBoundingArea::child, LineartChainRegisterEntry::eci, ListBase::first, IN_BOUND, LineartChainRegisterEntry::is_left, lineart_bounding_area_link_point_recursive(), lineart_list_append_pointer_pool_sized(), and LineartBoundingArea::linked_chains.

Referenced by lineart_bounding_area_link_chain(), and lineart_bounding_area_link_point_recursive().

◆ lineart_chain_append_point()

◆ lineart_chain_connect()

◆ lineart_chain_create()

◆ lineart_chain_create_crossing_point()

◆ lineart_chain_fix_ambiguous_segments()

static bool lineart_chain_fix_ambiguous_segments ( LineartEdgeChain * ec,
LineartEdgeChainItem * last_matching_eci,
float distance_threshold,
bool preserve_details,
LineartEdgeChainItem ** r_next_eci )
static

◆ lineart_chain_get_closest_cre()

◆ lineart_chain_prepend_point()

◆ lineart_find_matching_eln_obj()

LineartElementLinkNode * lineart_find_matching_eln_obj ( ListBase * elns,
Object * ob )

Definition at line 1087 of file lineart_chain.cc.

References LISTBASE_FOREACH.

Referenced by MOD_lineart_finalize_chains().

◆ lineart_line_get_connected()

◆ lineart_point_overlapping()

static bool lineart_point_overlapping ( LineartEdgeChainItem * eci,
float x,
float y,
double threshold )
static

◆ MOD_lineart_chain_clear_picked_flag()

void MOD_lineart_chain_clear_picked_flag ( LineartCache * lc)

◆ MOD_lineart_chain_clip_at_border()

◆ MOD_lineart_chain_compute_length()

float MOD_lineart_chain_compute_length ( LineartEdgeChain * ec)

◆ MOD_lineart_chain_connect()

◆ MOD_lineart_chain_count()

int MOD_lineart_chain_count ( const LineartEdgeChain * ec)

Definition at line 1068 of file lineart_chain.cc.

References LineartEdgeChain::chain, count, and LISTBASE_FOREACH.

Referenced by MOD_lineart_gpencil_generate_v3().

◆ MOD_lineart_chain_discard_unused()

void MOD_lineart_chain_discard_unused ( LineartData * ld,
const float threshold,
uint8_t max_occlusion )

◆ 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_smooth_chains()