363 |
DBG(dbg_vfillets) << "P cleave: "<< w1<<" "<<w2<<" " |
DBG(dbg_vfillets) << "P cleave: "<< w1<<" "<<w2<<" " |
364 |
<< ab<<" "<<fract<<" "<<va1<<" "<<va2<< |
<< ab<<" "<<fract<<" "<<va1<<" "<<va2<< |
365 |
"\n"; |
"\n"; |
366 |
if (overlap1) |
renderSpan2(node, a1, |
367 |
renderSpan(CircularSliceSpan(node, a1-w1, a1+w1), 0); |
makeLerpFilletSpan( |
368 |
else |
makeFilletBlend(f1, vf2), |
369 |
renderSpan( |
f1, |
370 |
makeLerpFilletSpan( |
fract), 1, |
371 |
makeFilletBlend(f1, vf2), |
overlap1); |
372 |
f1, |
|
373 |
fract), 1 |
renderSpan2(node, a2, |
374 |
); |
makeLerpFilletSpan( |
375 |
|
makeFilletBlend(f2, vf1), |
376 |
if (overlap2) |
f2, |
377 |
renderSpan(CircularSliceSpan(node, a2-w2, a2+w2), 0); |
fract), -1, |
378 |
else |
overlap2 |
379 |
renderSpan( |
); |
|
makeLerpFilletSpan( |
|
|
makeFilletBlend(f2, vf1), |
|
|
f2, |
|
|
fract), -1 |
|
|
); |
|
380 |
} else |
} else |
381 |
renderNormalOrBlend(node, f1, f2, overlap1, overlap2); |
renderNormalOrBlend(node, f1, f2, overlap1, overlap2); |
382 |
} else if(flags & 16) { // Ellipses |
} else if(flags & 16) { // Ellipses |
478 |
} |
} |
479 |
|
|
480 |
template<class F> void renderNormalOrBlend(const CircularNode &node, const F &f1, const F &f2, bool overlap1 = false, bool overlap2 = false) const { |
template<class F> void renderNormalOrBlend(const CircularNode &node, const F &f1, const F &f2, bool overlap1 = false, bool overlap2 = false) const { |
|
float a1 = f1.conn.a; |
|
|
float a2 = f2.conn.a; |
|
|
float w1 = normAngle(f1.dirTang.atan() - a1); |
|
|
float w2 = normAngle(a2 - f2.dirTang.atan()); |
|
|
|
|
481 |
if(f1.overlaps(f2)) { |
if(f1.overlaps(f2)) { |
482 |
if (overlap1) |
renderSpan2(node, f1.conn.a, makeFilletBlend(f1, f2), 1, overlap1); |
483 |
renderSpan(CircularSliceSpan(node, a1-w1, a1+w1), 0); |
renderSpan2(node, f2.conn.a, makeFilletBlend(f2, f1), -1, overlap2); |
|
else |
|
|
renderSpan(makeFilletBlend(f1, f2), 1); |
|
|
|
|
|
if (overlap2) |
|
|
renderSpan(CircularSliceSpan(node, a2-w2, a2+w2), 0); |
|
|
else |
|
|
renderSpan(makeFilletBlend(f2, f1), -1); |
|
|
|
|
484 |
} else { |
} else { |
485 |
if (overlap1) |
renderSpan2(node, f1.conn.a, f1, 1, overlap1); |
486 |
renderSpan(CircularSliceSpan(node, a1-w1, a1+w1), 0); |
|
|
else |
|
|
renderSpan(f1, 1); |
|
487 |
float ta1 = f1.dirTang.atan(); |
float ta1 = f1.dirTang.atan(); |
488 |
float ta2 = f2.dirTang.atan(); |
float ta2 = f2.dirTang.atan(); |
489 |
if(ta2 < ta1) ta2 += 2*M_PI; |
if(ta2 < ta1) ta2 += 2*M_PI; |
490 |
renderSpan(CircularNodeSpan(node, ta1, ta2), 1); |
renderSpan(CircularNodeSpan(node, ta1, ta2), 1); |
491 |
if (overlap2) |
|
492 |
renderSpan(CircularSliceSpan(node, a2-w2, a2+w2), 0); |
renderSpan2(node, f2.conn.a, f2, -1, overlap2); |
|
else |
|
|
renderSpan(f2, -1); |
|
493 |
} |
} |
494 |
} |
} |
495 |
|
|
496 |
|
template<class F> void renderSpan2(const CircularNode &node, float a0, const F &f, int sign, bool overlap) const { |
497 |
|
Vec p1 = f.point(1); |
498 |
|
Vec n = dirVec(a0).cw90(); |
499 |
|
Vec p2 = p1 - node.ctr; |
500 |
|
p2 = p2 - n.dot(p2) * n + node.ctr; |
501 |
|
if (flags & 128) |
502 |
|
renderSpan(CircularSliceSpan(node, p1, p2), 0); |
503 |
|
if (!overlap) renderSpan(f, sign); |
504 |
|
} |
505 |
|
|
506 |
}; |
}; |
507 |
VOB_DEFINED(FilletSpan2); |
VOB_DEFINED(FilletSpan2); |
508 |
|
|