Blender  V3.3
Macros | Functions
lineart_chain.c File Reference
#include "BLI_linklist.h"
#include "BLI_listbase.h"
#include "BLI_math.h"
#include "MOD_lineart.h"
#include "lineart_intern.h"
#include <math.h>

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 : NULL))
 
#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, struct 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 *UNUSED(ld), 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, struct Object *obj)
 
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)
uint pos

Definition at line 1196 of file lineart_chain.c.

◆ LRT_OTHER_VERT

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

Definition at line 18 of file lineart_chain.c.

◆ 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, \
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)
static const pxr::TfToken occlusion("occlusion", pxr::TfToken::Immortal)

◆ 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])

◆ 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])
static unsigned a[3]
Definition: RandGen.cpp:78

Function Documentation

◆ lineart_bounding_area_get_eci_recursive()

static LineartBoundingArea* lineart_bounding_area_get_eci_recursive ( LineartData ld,
LineartBoundingArea root,
LineartEdgeChainItem eci 
)
static

Definition at line 490 of file lineart_chain.c.

References LineartBoundingArea::child, IN_BOUND, and NULL.

Referenced by lineart_bounding_area_get_end_point().

◆ lineart_bounding_area_get_end_point()

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

◆ lineart_bounding_area_link_chain()

static void lineart_bounding_area_link_chain ( LineartData ld,
LineartEdgeChain ec 
)
static

◆ 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 537 of file lineart_chain.c.

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

Referenced by lineart_bounding_area_link_chain().

◆ lineart_chain_append_point()

static LineartEdgeChainItem* lineart_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

◆ lineart_chain_connect()

static void lineart_chain_connect ( LineartData UNUSEDld,
LineartEdgeChain onto,
LineartEdgeChain sub,
int  reverse_1,
int  reverse_2 
)
static

◆ lineart_chain_create()

static LineartEdgeChain* lineart_chain_create ( LineartData ld)
static

◆ lineart_chain_create_crossing_point()

static LineartEdgeChainItem* lineart_chain_create_crossing_point ( LineartData ld,
LineartEdgeChainItem eci_inside,
LineartEdgeChainItem eci_outside 
)
static

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

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 
)
static

◆ lineart_chain_prepend_point()

static LineartEdgeChainItem* lineart_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 
)
static

◆ lineart_find_matching_eln_obj()

LineartElementLinkNode* lineart_find_matching_eln_obj ( ListBase elns,
struct Object obj 
)

Definition at line 1054 of file lineart_chain.c.

References LISTBASE_FOREACH, and NULL.

Referenced by MOD_lineart_finalize_chains().

◆ lineart_line_get_connected()

static LineartEdge* lineart_line_get_connected ( LineartBoundingArea ba,
LineartVert vt,
LineartVert **  new_vt,
int  match_flag,
uint8_t  match_isec_mask,
struct Object match_isec_object 
)
static

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

void MOD_lineart_chain_clip_at_border ( LineartData ld)

◆ MOD_lineart_chain_compute_length()

float MOD_lineart_chain_compute_length ( LineartEdgeChain ec)

◆ MOD_lineart_chain_connect()

void MOD_lineart_chain_connect ( LineartData ld)

◆ MOD_lineart_chain_count()

int MOD_lineart_chain_count ( const LineartEdgeChain ec)

Definition at line 1035 of file lineart_chain.c.

References LineartEdgeChain::chain, count, and LISTBASE_FOREACH.

Referenced by lineart_gpencil_generate().

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

void MOD_lineart_chain_feature_lines ( LineartData ld)

◆ MOD_lineart_chain_find_silhouette_backdrop_objects()

void MOD_lineart_chain_find_silhouette_backdrop_objects ( LineartData ld)

◆ MOD_lineart_chain_offset_towards_camera()

void MOD_lineart_chain_offset_towards_camera ( LineartData ld,
float  dist,
bool  use_custom_camera 
)

◆ MOD_lineart_chain_split_angle()

void MOD_lineart_chain_split_angle ( LineartData ld,
float  angle_threshold_rad 
)

◆ MOD_lineart_chain_split_for_fixed_occlusion()

void MOD_lineart_chain_split_for_fixed_occlusion ( LineartData ld)

◆ MOD_lineart_finalize_chains()

void MOD_lineart_finalize_chains ( LineartData ld)

◆ MOD_lineart_smooth_chains()

void MOD_lineart_smooth_chains ( LineartData ld,
float  tolerance 
)