34 #define LRT_OTHER_RV(e, rv) ((rv) == (e)->v1 ? (e)->v2 : ((rv) == (e)->v2 ? (e)->v1 : NULL))
92 if (((rlci->
pos[0] + threshold) >=
x) && ((rlci->
pos[0] - threshold) <=
x) &&
93 ((rlci->
pos[1] + threshold) >=
y) && ((rlci->
pos[1] - threshold) <=
y)) {
106 unsigned char transparency_mask,
143 unsigned char transparency_mask,
173 unsigned char last_transparency;
175 float use_fbcoord[2];
178 #define VERT_COORD_TO_FLOAT(a) \
179 copy_v2fl_v2db(use_fbcoord, (a)->fbcoord); \
180 copy_v3fl_v3db(use_gpos, (a)->gloc);
182 #define POS_TO_FLOAT(lpos, gpos) \
183 copy_v2fl_v2db(use_fbcoord, lpos); \
184 copy_v3fl_v3db(use_gpos, gpos);
206 N[0] +=
e->t1->gn[0];
207 N[1] +=
e->t1->gn[1];
208 N[2] +=
e->t1->gn[2];
211 N[0] +=
e->t2->gn[0];
212 N[1] +=
e->t2->gn[1];
213 N[2] +=
e->t2->gn[2];
215 if (
e->t1 ||
e->t2) {
222 rls =
e->segments.first;
236 if (new_e->
t1 || new_e->
t2) {
239 N[0] += new_e->
t1->
gn[0];
240 N[1] += new_e->
t1->
gn[1];
241 N[2] += new_e->
t1->
gn[2];
244 N[0] += new_e->
t2->
gn[0];
245 N[1] += new_e->
t2->
gn[1];
246 N[2] += new_e->
t2->
gn[2];
251 if (new_rv == new_e->
v1) {
253 double gpos[3], lpos[3];
255 double global_at = lfb[3] * rls->
at / (rls->
at * lfb[3] + (1 - rls->
at) * rfb[3]);
272 else if (new_rv == new_e->
v2) {
277 for (; rls; rls = rls->
next) {
278 double gpos[3], lpos[3];
280 double global_at = lfb[3] * rls->
at / (rls->
at * lfb[3] + (1 - rls->
at) * rfb[3]);
311 if (
e->t1 ||
e->t2) {
314 N[0] +=
e->t1->gn[0];
315 N[1] +=
e->t1->gn[1];
316 N[2] +=
e->t1->gn[2];
319 N[0] +=
e->t2->gn[0];
320 N[1] +=
e->t2->gn[1];
321 N[2] +=
e->t2->gn[2];
327 rls =
e->segments.first;
330 for (rls = rls->
next; rls; rls = rls->
next) {
331 double gpos[3], lpos[3];
332 double *lfb =
e->v1->fbcoord, *rfb =
e->v2->fbcoord;
333 double global_at = lfb[3] * rls->
at / (rls->
at * lfb[3] + (1 - rls->
at) * rfb[3]);
366 if (new_e->
t1 || new_e->
t2) {
369 N[0] += new_e->
t1->
gn[0];
370 N[1] += new_e->
t1->
gn[1];
371 N[2] += new_e->
t1->
gn[2];
374 N[0] += new_e->
t2->
gn[0];
375 N[1] += new_e->
t2->
gn[1];
376 N[2] += new_e->
t2->
gn[2];
385 if (new_rv == new_e->
v1) {
393 double gpos[3], lpos[3];
395 double global_at = lfb[3] * rls->
at / (rls->
at * lfb[3] + (1 - rls->
at) * rfb[3]);
412 else if (new_rv == new_e->
v2) {
419 for (; rls; rls = rls->
next) {
420 double gpos[3], lpos[3];
422 double global_at = lfb[3] * rls->
at / (rls->
at * lfb[3] + (1 - rls->
at) * rfb[3]);
470 #define IN_BOUND(ba, rlci) \
471 ba.l <= rlci->pos[0] && ba.r >= rlci->pos[0] && ba.b <= rlci->pos[1] && ba.u >= rlci->pos[1]
526 #define IN_BOUND(ba, rlci) \
527 ba.l <= rlci->pos[0] && ba.r >= rlci->pos[0] && ba.b <= rlci->pos[1] && ba.u >= rlci->pos[1]
578 rlc->
level = fixed_occ;
580 for (rlci = first_rlci->
next; rlci; rlci = next_rlci) {
581 next_rlci = rlci->
next;
618 rlc->
level = fixed_occ;
686 unsigned char transparency_mask,
688 float *result_new_len,
697 if (cre->rlc->object_ref != rlc->
object_ref) {
711 if (cre->rlc->picked || cre->picked) {
714 if (cre->rlc == rlc || (!cre->rlc->chain.first) || (cre->rlc->level != occlusion) ||
715 (cre->rlc->transparency_mask != transparency_mask)) {
719 if (cre->rlc->type != rlc->
type) {
732 float new_len =
len_v2v2(cre->rlci->pos, rlci->
pos);
733 if (new_len < dist) {
736 if (result_new_len) {
737 (*result_new_len) = new_len;
743 float adjacent_new_len = dist;
746 #define LRT_TEST_ADJACENT_AREAS(dist_to, list) \
747 if (dist_to < dist && dist_to > 0) { \
748 LISTBASE_FOREACH (LinkData *, ld, list) { \
749 LineartBoundingArea *sba = (LineartBoundingArea *)ld->data; \
750 adjacent_closest = lineart_chain_get_closest_cre( \
751 rb, sba, rlc, rlci, occlusion, transparency_mask, dist, &adjacent_new_len, ba); \
752 if (adjacent_new_len < dist) { \
753 dist = adjacent_new_len; \
754 closest_cre = adjacent_closest; \
764 if (result_new_len) {
765 (*result_new_len) = dist;
782 float dist_l, dist_r;
783 int occlusion, reverse_main;
784 unsigned char transparency_mask;
803 occlusion = rlc->
level;
811 rb, ba_l, rlc, rlci_l, occlusion, transparency_mask, dist, &dist_l,
NULL);
813 rb, ba_r, rlc, rlci_r, occlusion, transparency_mask, dist, &dist_r,
NULL);
814 if (closest_cre_l && closest_cre_r) {
815 if (dist_l < dist_r) {
816 closest_cre = closest_cre_l;
820 closest_cre = closest_cre_r;
824 else if (closest_cre_l) {
825 closest_cre = closest_cre_l;
828 else if (closest_cre_r) {
829 closest_cre = closest_cre_r;
858 float offset_accum = 0;
866 offset_accum += dist;
875 for (rlc = rb->
chains.
first; rlc; rlc = next_rlc) {
876 next_rlc = rlc->
next;
921 for (rlci = first_rlci->
next; rlci; rlci = next_rlci) {
922 next_rlci = rlci->
next;
923 prev_rlci = rlci->
prev;
925 if (next_rlci && prev_rlci) {
931 if (
angle < angle_threshold_rad) {
void * BLI_pophead(ListBase *listbase) ATTR_NONNULL(1)
void BLI_addhead(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void void void void void void BLI_listbase_reverse(struct ListBase *lb) ATTR_NONNULL(1)
float angle_v2v2v2(const float a[2], const float b[2], const float c[2]) ATTR_WARN_UNUSED_RESULT
MINLINE float normalize_v3(float r[3])
void interp_v3_v3v3_db(double target[3], const double a[3], const double b[3], const double t)
MINLINE void copy_v2_v2(float r[2], const float a[2])
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE float len_v2v2(const float a[2], const float b[2]) ATTR_WARN_UNUSED_RESULT
MINLINE void zero_v3(float r[3])
@ LRT_EDGE_FLAG_INTERSECTION
@ LRT_EDGE_FLAG_CHAIN_PICKED
#define LRT_EDGE_FLAG_ALL_TYPE
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint y
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
SIMD_FORCE_INLINE btScalar angle(const btVector3 &v) const
Return the angle between this and another vector.
IconTextureDrawCall normal
#define POS_TO_FLOAT(lpos, gpos)
static LineartBoundingArea * lineart_bounding_area_get_end_point(LineartRenderBuffer *rb, LineartLineChainItem *rlci)
#define IN_BOUND(ba, rlci)
static bool lineart_point_overlapping(LineartLineChainItem *rlci, float x, float y, double threshold)
void MOD_lineart_chain_discard_short(LineartRenderBuffer *rb, const float threshold)
#define VERT_COORD_TO_FLOAT(a)
void MOD_lineart_chain_connect(LineartRenderBuffer *rb)
int MOD_lineart_chain_count(const LineartLineChain *rlc)
void MOD_lineart_chain_split_for_fixed_occlusion(LineartRenderBuffer *rb)
static void lineart_bounding_area_link_chain(LineartRenderBuffer *rb, LineartLineChain *rlc)
#define LRT_TEST_ADJACENT_AREAS(dist_to, list)
static LineartBoundingArea * lineart_bounding_area_get_rlci_recursive(LineartRenderBuffer *rb, LineartBoundingArea *root, LineartLineChainItem *rlci)
static LineartLineChainItem * lineart_chain_prepend_point(LineartRenderBuffer *rb, LineartLineChain *rlc, float *fbcoord, float *gpos, float *normal, char type, int level, unsigned char transparency_mask, size_t index)
static void lineart_chain_connect(LineartRenderBuffer *UNUSED(rb), LineartLineChain *onto, LineartLineChain *sub, int reverse_1, int reverse_2)
void MOD_lineart_chain_feature_lines(LineartRenderBuffer *rb)
void MOD_lineart_chain_clear_picked_flag(LineartRenderBuffer *rb)
static LineartLineChainItem * lineart_chain_append_point(LineartRenderBuffer *rb, LineartLineChain *rlc, float *fbcoord, float *gpos, float *normal, char type, int level, unsigned char transparency_mask, size_t index)
static LineartEdge * lineart_line_get_connected(LineartBoundingArea *ba, LineartVert *rv, LineartVert **new_rv, int match_flag)
static LineartLineChain * lineart_chain_create(LineartRenderBuffer *rb)
float MOD_lineart_chain_compute_length(LineartLineChain *rlc)
static void lineart_bounding_area_link_point_recursive(LineartRenderBuffer *rb, LineartBoundingArea *root, LineartLineChain *rlc, LineartLineChainItem *rlci)
#define LRT_OTHER_RV(e, rv)
void MOD_lineart_chain_split_angle(LineartRenderBuffer *rb, float angle_threshold_rad)
static LineartChainRegisterEntry * lineart_chain_get_closest_cre(LineartRenderBuffer *rb, LineartBoundingArea *ba, LineartLineChain *rlc, LineartLineChainItem *rlci, int occlusion, unsigned char transparency_mask, float dist, float *result_new_len, LineartBoundingArea *caller_ba)
LineartBoundingArea * MOD_lineart_get_parent_bounding_area(LineartRenderBuffer *rb, double x, double y)
LineartBoundingArea * MOD_lineart_get_bounding_area(LineartRenderBuffer *rb, double x, double y)
void * lineart_list_append_pointer_pool_sized(ListBase *h, struct LineartStaticMemPool *smp, void *data, int size)
void * lineart_mem_aquire(struct LineartStaticMemPool *smp, size_t size)
#define LRT_ITER_ALL_LINES_END
#define LRT_ITER_ALL_LINES_NEXT
#define LRT_ITER_ALL_LINES_BEGIN
struct LineartBoundingArea * child
LineartLineChainItem * rlci
struct LineartTriangle * t2
struct LineartTriangle * t1
struct LineartLineChainItem * next
struct LineartLineChainItem * prev
unsigned char transparency_mask
struct LineartLineChain * next
struct LineartLineChain * prev
unsigned char transparency_mask
struct Object * object_ref
struct LineartLineSegment * prev
struct LineartLineSegment * next
unsigned char transparency_mask
LineartStaticMemPool render_data_pool
float chaining_image_threshold