Blender
V3.3
|
#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) |
#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_ECI_INSIDE | ( | eci | ) |
Definition at line 1196 of file lineart_chain.c.
Definition at line 18 of file lineart_chain.c.
#define LRT_TEST_ADJACENT_AREAS | ( | dist_to, | |
list | |||
) |
#define POS_TO_FLOAT | ( | lpos, | |
gpos | |||
) |
#define VERT_COORD_TO_FLOAT | ( | a | ) |
|
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().
|
static |
Definition at line 518 of file lineart_chain.c.
References lineart_bounding_area_get_eci_recursive(), MOD_lineart_get_parent_bounding_area(), NULL, and LineartEdgeChainItem::pos.
Referenced by MOD_lineart_chain_connect().
|
static |
Definition at line 575 of file lineart_chain.c.
References LineartEdgeChain::chain, ListBase::first, ListBase::last, lineart_bounding_area_link_point_recursive(), MOD_lineart_get_parent_bounding_area(), and LineartEdgeChainItem::pos.
Referenced by MOD_lineart_chain_split_for_fixed_occlusion().
|
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().
|
static |
Definition at line 94 of file lineart_chain.c.
References BLI_addtail(), LineartEdgeChain::chain, LineartData::chain_data_pool, copy_v3_v3(), copy_v4_v4(), e, LineartEdgeChainItem::gpos, LineartEdgeChainItem::index, Object::index, ListBase::last, LineartEdgeChainItem::line_type, lineart_mem_acquire(), lineart_point_overlapping(), LRT_EDGE_FLAG_ALL_TYPE, LineartEdgeChainItem::material_mask_bits, normal, LineartEdgeChainItem::normal, LineartEdgeChainItem::occlusion, LineartEdgeChainItem::pos, LineartEdgeChainItem::shadow_mask_bits, and type.
Referenced by MOD_lineart_chain_feature_lines(), MOD_lineart_chain_split_angle(), and MOD_lineart_chain_split_for_fixed_occlusion().
|
static |
NOTE: segment type (crease/material/contour...) is ambiguous after this.
Definition at line 739 of file lineart_chain.c.
References BLI_listbase_reverse(), BLI_pophead(), LineartEdgeChain::chain, e, ListBase::first, ListBase::last, lineart_point_overlapping(), LRT_EDGE_FLAG_CONTOUR, LRT_EDGE_FLAG_INTERSECTION, NULL, LineartEdgeChain::object_ref, LineartEdgeChainItem::pos, and LineartEdgeChain::type.
Referenced by MOD_lineart_chain_connect().
|
static |
Definition at line 69 of file lineart_chain.c.
References BLI_addtail(), LineartData::chain_data_pool, LineartData::chains, and lineart_mem_acquire().
Referenced by MOD_lineart_chain_feature_lines(), MOD_lineart_chain_split_angle(), and MOD_lineart_chain_split_for_fixed_occlusion().
|
static |
Definition at line 1154 of file lineart_chain.c.
References LineartData::chain_data_pool, fabs(), LineartEdgeChainItem::gpos, interp_v3_v3v3(), interpf(), isect_seg_seg_v2_point(), lineart_mem_acquire(), LineartEdgeChainItem::next, NULL, LineartEdgeChainItem::pos, LineartEdgeChainItem::prev, ratiof(), and UNLIKELY.
Referenced by MOD_lineart_chain_clip_at_border().
|
static |
Definition at line 590 of file lineart_chain.c.
References BLI_remlink(), LineartEdgeChain::chain, len_v2v2(), LineartEdgeChainItem::material_mask_bits, LineartEdgeChainItem::next, NULL, LineartEdgeChainItem::occlusion, LineartEdgeChainItem::pos, and LineartEdgeChainItem::shadow_mask_bits.
Referenced by MOD_lineart_chain_split_for_fixed_occlusion().
|
static |
Definition at line 789 of file lineart_chain.c.
References LineartBoundingArea::b, LineartBoundingArea::bp, LineartData::conf, LineartData::_conf::fuzzy_everything, LineartData::_conf::fuzzy_intersections, LineartEdgeChainItem::gpos, LineartBoundingArea::l, len_v2v2(), len_v3v3(), LineartBoundingArea::linked_chains, LISTBASE_FOREACH_MUTABLE, LineartBoundingArea::lp, LRT_EDGE_FLAG_INTERSECTION, LRT_TEST_ADJACENT_AREAS, NULL, LineartEdgeChain::object_ref, usdtokens::occlusion(), LineartEdgeChainItem::pos, LineartBoundingArea::r, LineartBoundingArea::rp, LineartEdgeChain::type, LineartBoundingArea::u, LineartBoundingArea::up, and LineartData::_conf::use_geometry_space_chain.
Referenced by MOD_lineart_chain_connect().
|
static |
Definition at line 134 of file lineart_chain.c.
References BLI_addhead(), LineartEdgeChain::chain, LineartData::chain_data_pool, copy_v3_v3(), copy_v4_v4(), e, ListBase::first, LineartEdgeChainItem::gpos, LineartEdgeChainItem::index, Object::index, LineartEdgeChainItem::line_type, lineart_mem_acquire(), lineart_point_overlapping(), LRT_EDGE_FLAG_ALL_TYPE, LineartEdgeChainItem::material_mask_bits, normal, LineartEdgeChainItem::normal, LineartEdgeChainItem::occlusion, LineartEdgeChainItem::pos, LineartEdgeChainItem::shadow_mask_bits, and type.
Referenced by MOD_lineart_chain_feature_lines().
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().
|
static |
Definition at line 24 of file lineart_chain.c.
References LineartVert::fbcoord, LineartEdge::flags, LineartEdge::intersection_mask, LineartBoundingArea::line_count, LineartBoundingArea::linked_lines, LRT_EDGE_FLAG_ALL_TYPE, LRT_EDGE_FLAG_CHAIN_PICKED, LRT_EDGE_FLAG_INTERSECTION, LRT_OTHER_VERT, NULL, LineartEdge::object_ref, LineartEdge::v1, and LineartEdge::v2.
Referenced by MOD_lineart_chain_feature_lines().
|
static |
Definition at line 79 of file lineart_chain.c.
References LineartEdgeChainItem::pos, threshold, x, and y.
Referenced by lineart_chain_append_point(), lineart_chain_connect(), lineart_chain_prepend_point(), and MOD_lineart_chain_split_for_fixed_occlusion().
void MOD_lineart_chain_clear_picked_flag | ( | LineartCache * | lc | ) |
Definition at line 1044 of file lineart_chain.c.
References LineartCache::chains, LISTBASE_FOREACH, and NULL.
Referenced by bake_strokes(), generateStrokes(), and MOD_lineart_compute_feature_lines().
void MOD_lineart_chain_clip_at_border | ( | LineartData * | ld | ) |
Definition at line 1200 of file lineart_chain.c.
References BLI_addhead(), BLI_addtail(), BLI_pophead(), LineartEdgeChain::chain, LineartData::chain_data_pool, LineartData::chains, ListBase::first, is_inside(), ListBase::last, lineart_chain_create_crossing_point(), lineart_mem_acquire(), LRT_ECI_INSIDE, LineartEdgeChainItem::next, NULL, LineartEdgeChain::picked, LineartEdgeChainItem::prev, and swap().
Referenced by MOD_lineart_compute_feature_lines().
float MOD_lineart_chain_compute_length | ( | LineartEdgeChain * | ec | ) |
Length is in image space.
Definition at line 1002 of file lineart_chain.c.
References LineartEdgeChain::chain, copy_v2_v2(), ListBase::first, len_v2v2(), LineartEdgeChainItem::next, and LineartEdgeChainItem::pos.
Referenced by MOD_lineart_chain_discard_unused().
void MOD_lineart_chain_connect | ( | LineartData * | ld | ) |
This function only connects two different chains. It will not do any clean up or smart chaining. So no: removing overlapping chains, removal of short isolated segments, and no loop reduction is implemented yet.
Definition at line 897 of file lineart_chain.c.
References BLI_addtail(), BLI_pophead(), BLI_remlink(), LineartEdgeChain::chain, LineartData::_conf::chaining_image_threshold, LineartData::chains, LineartData::conf, LineartChainRegisterEntry::ec, ListBase::first, LineartEdgeChain::intersection_mask, LineartChainRegisterEntry::is_left, ListBase::last, LineartEdgeChain::level, lineart_bounding_area_get_end_point(), lineart_chain_connect(), lineart_chain_get_closest_cre(), LineartBoundingArea::linked_chains, LineartEdgeChain::loop_id, LRT_EDGE_FLAG_LOOSE, LineartEdgeChain::material_mask_bits, LineartEdgeChain::next, NULL, usdtokens::occlusion(), LineartEdgeChain::picked, LineartChainRegisterEntry::picked, LineartEdgeChain::prev, LineartEdgeChain::shadow_mask_bits, swap(), LineartEdgeChain::type, and LineartData::_conf::use_loose_edge_chain.
Referenced by MOD_lineart_compute_feature_lines().
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().
void MOD_lineart_chain_discard_unused | ( | LineartData * | ld, |
const float | threshold, | ||
uint8_t | max_occlusion | ||
) |
Definition at line 1022 of file lineart_chain.c.
References BLI_remlink(), LineartData::chains, ListBase::first, LineartEdgeChain::level, MOD_lineart_chain_compute_length(), LineartEdgeChain::next, and threshold.
Referenced by MOD_lineart_chain_split_for_fixed_occlusion().
void MOD_lineart_chain_feature_lines | ( | LineartData * | ld | ) |
Definition at line 166 of file lineart_chain.c.
References LineartEdgeChain::chain, LineartData::conf, e, LineartVert::fbcoord, ListBase::first, LineartEdge::flags, LineartData::_conf::fuzzy_everything, LineartVert::gloc, LineartTriangle::gn, LineartVert::index, interp_v3_v3v3_db(), interpf(), LineartEdgeChain::intersection_mask, ListBase::last, LineartEdgeChainItem::line_type, lineart_chain_append_point(), lineart_chain_create(), lineart_chain_prepend_point(), lineart_line_get_connected(), LRT_EDGE_FLAG_ALL_TYPE, LRT_EDGE_FLAG_CHAIN_PICKED, LRT_EDGE_FLAG_CONTOUR, LRT_ITER_ALL_LINES_BEGIN, LRT_ITER_ALL_LINES_END, LRT_ITER_ALL_LINES_NEXT, LineartEdgeSegment::material_mask_bits, LineartEdgeChainItem::material_mask_bits, MOD_lineart_get_bounding_area(), N, LineartEdgeSegment::next, normalize_v3(), LineartEdgeChain::object_ref, LineartEdgeSegment::occlusion, LineartEdgeChainItem::occlusion, POS_TO_FLOAT, LineartEdgeSegment::prev, LineartEdgeSegment::ratio, LineartEdge::segments, LineartEdgeSegment::shadow_mask_bits, LineartEdgeChainItem::shadow_mask_bits, LineartEdge::t1, LineartEdge::t2, LineartEdgeChain::type, LineartEdge::v1, LineartEdge::v2, VERT_COORD_TO_FLOAT, and zero_v3().
Referenced by MOD_lineart_compute_feature_lines().
void MOD_lineart_chain_find_silhouette_backdrop_objects | ( | LineartData * | ld | ) |
Definition at line 1362 of file lineart_chain.c.
References LineartData::chains, LineartData::geom, LineartData::_geom::line_buffer_pointers, lineart_find_matching_eln(), LISTBASE_FOREACH, LRT_EDGE_FLAG_CONTOUR, LRT_OBINDEX_HIGHER, LRT_SHADOW_SILHOUETTE_ERASED_GROUP, and LineartElementLinkNode::object_ref.
Referenced by MOD_lineart_compute_feature_lines().
void MOD_lineart_chain_offset_towards_camera | ( | LineartData * | ld, |
float | dist, | ||
bool | use_custom_camera | ||
) |
Definition at line 1323 of file lineart_chain.c.
References LineartData::_conf::active_camera_pos, add_v3_v3(), LineartData::_conf::cam_is_persp, LineartData::_conf::camera_pos, LineartData::chains, LineartData::conf, copy_v3fl_v3db(), dot_v3v3(), len_v3(), LISTBASE_FOREACH, MIN2, mul_v3_fl(), LineartData::_conf::near_clip, normalize_v3(), normalize_v3_v3(), sub_v3_v3v3(), view, and LineartData::_conf::view_vector.
Referenced by MOD_lineart_compute_feature_lines().
void MOD_lineart_chain_split_angle | ( | LineartData * | ld, |
float | angle_threshold_rad | ||
) |
This should always be the last stage!, see the end of MOD_lineart_chain_split_for_fixed_occlusion().
Definition at line 1266 of file lineart_chain.c.
References angle(), angle_v2v2v2(), BLI_addtail(), BLI_pophead(), LineartEdgeChain::chain, LineartData::chains, ListBase::first, LineartEdgeChainItem::gpos, LineartEdgeChainItem::index, LineartEdgeChain::intersection_mask, ListBase::last, LineartEdgeChain::level, LineartEdgeChainItem::line_type, lineart_chain_append_point(), lineart_chain_create(), LineartEdgeChain::loop_id, M_PI, LineartEdgeChain::material_mask_bits, LineartEdgeChainItem::material_mask_bits, LineartEdgeChain::next, LineartEdgeChainItem::next, LineartEdgeChainItem::normal, NULL, LineartEdgeChain::object_ref, LineartEdgeChainItem::pos, LineartEdgeChain::prev, LineartEdgeChainItem::prev, LineartEdgeChain::shadow_mask_bits, LineartEdgeChainItem::shadow_mask_bits, swap(), and LineartEdgeChain::type.
Referenced by MOD_lineart_compute_feature_lines().
void MOD_lineart_chain_split_for_fixed_occlusion | ( | LineartData * | ld | ) |
Definition at line 645 of file lineart_chain.c.
References BLI_addtail(), BLI_pophead(), LineartEdgeChain::chain, LineartData::_conf::chain_preserve_details, LineartData::_conf::chaining_image_threshold, LineartData::chains, LineartData::conf, DBL_EDGE_LIM, e, ListBase::first, LineartEdgeChainItem::gpos, LineartEdgeChainItem::index, LineartEdgeChain::intersection_mask, ListBase::last, LineartEdgeChain::level, LineartEdgeChainItem::line_type, lineart_bounding_area_link_chain(), lineart_chain_append_point(), lineart_chain_create(), lineart_chain_fix_ambiguous_segments(), lineart_point_overlapping(), LISTBASE_FOREACH, LineartEdgeChain::loop_id, LineartEdgeChain::material_mask_bits, LineartEdgeChainItem::material_mask_bits, LineartData::_conf::max_occlusion_level, MOD_lineart_chain_discard_unused(), LineartEdgeChain::next, LineartEdgeChainItem::next, LineartEdgeChainItem::normal, NULL, LineartEdgeChain::object_ref, LineartEdgeChainItem::occlusion, LineartEdgeChainItem::pos, LineartEdgeChain::prev, LineartEdgeChainItem::prev, LineartEdgeChain::shadow_mask_bits, LineartEdgeChainItem::shadow_mask_bits, swap(), and LineartEdgeChain::type.
Referenced by MOD_lineart_compute_feature_lines().
void MOD_lineart_finalize_chains | ( | LineartData * | ld | ) |
Definition at line 1064 of file lineart_chain.c.
References BLI_assert, LineartData::chains, ELEM, LineartData::geom, LineartElementLinkNode::global_index_offset, LIKELY, lineart_find_matching_eln_obj(), LISTBASE_FOREACH, LRT_EDGE_FLAG_INTERSECTION, LRT_EDGE_FLAG_LIGHT_CONTOUR, LRT_EDGE_FLAG_PROJECTED_SHADOW, NULL, and LineartData::_geom::vertex_buffer_pointers.
Referenced by MOD_lineart_compute_feature_lines().
void MOD_lineart_smooth_chains | ( | LineartData * | ld, |
float | tolerance | ||
) |
Definition at line 1086 of file lineart_chain.c.
References BLI_listbase_reverse(), BLI_remlink(), LineartData::chains, dist_to_line_segment_v2(), dist_to_line_v2(), dot_v2v2(), len_v2(), LISTBASE_FOREACH, LineartEdgeChainItem::next, normalize_v2_v2(), NULL, LineartEdgeChainItem::pos, and sub_v2_v2v2().
Referenced by MOD_lineart_compute_feature_lines().