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 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 LineartEdgeChain * lineart_chain_create (LineartData *ld)
 
static bool lineart_point_overlapping (LineartEdgeChainItem *eci, float x, float y, double threshold)
 
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 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)
 
void MOD_lineart_chain_feature_lines (LineartData *ld)
 
static LineartBoundingArea * lineart_bounding_area_get_eci_recursive (LineartData *ld, LineartBoundingArea *root, LineartEdgeChainItem *eci)
 
static LineartBoundingArea * lineart_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 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)
 
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)
 
LineartElementLinkNode * lineart_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 LineartEdgeChainItem * lineart_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 
)