| 517 |
|
return(MG_EARGC); |
| 518 |
|
if ((cv = c_getvert(av[1])) == NULL) |
| 519 |
|
return(MG_EUNDEF); |
| 520 |
< |
if (cv->n[0]==0. && cv->n[1]==0. && cv->n[2]==0.) |
| 520 |
> |
if (is0vect(cv->n)) |
| 521 |
|
return(MG_EILL); |
| 522 |
|
if (!isflt(av[2]) || !isflt(av[3])) |
| 523 |
|
return(MG_ETYPE); |
| 524 |
|
minrad = atof(av[2]); |
| 525 |
+ |
round0(minrad); |
| 526 |
|
maxrad = atof(av[3]); |
| 527 |
|
/* check orientation */ |
| 528 |
|
if (minrad > 0.) |
| 630 |
|
return(MG_EARGC); |
| 631 |
|
if ((cv = c_getvert(av[1])) == NULL) |
| 632 |
|
return(MG_EUNDEF); |
| 633 |
< |
if (cv->n[0]==0. && cv->n[1]==0. && cv->n[2]==0.) |
| 633 |
> |
if (is0vect(cv->n)) |
| 634 |
|
return(MG_EILL); |
| 635 |
|
if (!isflt(av[2]) || !isflt(av[3])) |
| 636 |
|
return(MG_ETYPE); |
| 637 |
|
minrad = atof(av[2]); |
| 638 |
+ |
round0(minrad); |
| 639 |
|
maxrad = atof(av[3]); |
| 640 |
|
if (minrad < 0. || maxrad <= minrad) |
| 641 |
|
return(MG_EILL); |
| 661 |
|
sprintf(p3[j], FLTFMT, cv->p[j] + |
| 662 |
|
maxrad*u[j]*cos(theta) + |
| 663 |
|
maxrad*v[j]*sin(theta)); |
| 664 |
< |
if ((rv = handle_it(MG_E_VERTEX, 3, v3ent)) != MG_OK) |
| 664 |
> |
if ((rv = handle_it(MG_E_VERTEX, 2, v3ent)) != MG_OK) |
| 665 |
|
return(rv); |
| 666 |
|
if ((rv = handle_it(MG_E_POINT, 4, p3ent)) != MG_OK) |
| 667 |
|
return(rv); |
| 687 |
|
sprintf(p3[j], FLTFMT, cv->p[j] + maxrad*d); |
| 688 |
|
sprintf(p4[j], FLTFMT, cv->p[j] + minrad*d); |
| 689 |
|
} |
| 690 |
< |
if ((rv = handle_it(MG_E_VERTEX, 3, v3ent)) != MG_OK) |
| 690 |
> |
if ((rv = handle_it(MG_E_VERTEX, 2, v3ent)) != MG_OK) |
| 691 |
|
return(rv); |
| 692 |
|
if ((rv = handle_it(MG_E_POINT, 4, p3ent)) != MG_OK) |
| 693 |
|
return(rv); |
| 694 |
< |
if ((rv = handle_it(MG_E_VERTEX, 3, v4ent)) != MG_OK) |
| 694 |
> |
if ((rv = handle_it(MG_E_VERTEX, 2, v4ent)) != MG_OK) |
| 695 |
|
return(rv); |
| 696 |
|
if ((rv = handle_it(MG_E_POINT, 4, p4ent)) != MG_OK) |
| 697 |
|
return(rv); |
| 736 |
|
if (!isflt(av[2]) || !isflt(av[4])) |
| 737 |
|
return(MG_ETYPE); |
| 738 |
|
rad1 = atof(av[2]); |
| 739 |
+ |
round0(rad1); |
| 740 |
|
rad2 = atof(av[4]); |
| 741 |
+ |
round0(rad2); |
| 742 |
|
if (rad1 == 0.) { |
| 743 |
|
if (rad2 == 0.) |
| 744 |
|
return(MG_EILL); |
| 762 |
|
if ((d = normalize(w)) == 0.) |
| 763 |
|
return(MG_EILL); |
| 764 |
|
n1off = n2off = (rad2 - rad1)/d; |
| 765 |
< |
if (warpconends) /* hack for e_sph and e_torus */ |
| 766 |
< |
n2off = tan(atan(n2off)-(PI/4)/mg_nqcdivs); |
| 767 |
< |
n2off = sgn*n2off; |
| 765 |
> |
if (warpconends) { /* hack for e_sph and e_torus */ |
| 766 |
> |
d = atan(n2off) - (PI/4)/mg_nqcdivs; |
| 767 |
> |
if (d <= -PI/2+FTINY) |
| 768 |
> |
n2off = -FHUGE; |
| 769 |
> |
else |
| 770 |
> |
n2off = tan(d); |
| 771 |
> |
} |
| 772 |
|
make_axes(u, v, w); |
| 773 |
|
for (j = 0; j < 3; j++) { |
| 774 |
|
sprintf(p3[j], FLTFMT, cv2->p[j] + rad2*u[j]); |
| 775 |
< |
sprintf(n3[j], FLTFMT, u[j] + w[j]*n2off); |
| 775 |
> |
if (n2off <= -FHUGE) |
| 776 |
> |
sprintf(n3[j], FLTFMT, -w[j]); |
| 777 |
> |
else |
| 778 |
> |
sprintf(n3[j], FLTFMT, u[j] + w[j]*n2off); |
| 779 |
|
} |
| 780 |
|
if ((rv = handle_it(MG_E_VERTEX, 3, v3ent)) != MG_OK) |
| 781 |
|
return(rv); |
| 798 |
|
for (j = 0; j < 3; j++) { |
| 799 |
|
d = u[j]*cos(theta) + v[j]*sin(theta); |
| 800 |
|
sprintf(p3[j], FLTFMT, cv2->p[j] + rad2*d); |
| 801 |
< |
sprintf(n3[j], FLTFMT, d + w[j]*n2off); |
| 801 |
> |
if (n2off > -FHUGE) |
| 802 |
> |
sprintf(n3[j], FLTFMT, d + w[j]*n2off); |
| 803 |
|
} |
| 804 |
< |
if ((rv = handle_it(MG_E_VERTEX, 3, v3ent)) != MG_OK) |
| 804 |
> |
if ((rv = handle_it(MG_E_VERTEX, 2, v3ent)) != MG_OK) |
| 805 |
|
return(rv); |
| 806 |
|
if ((rv = handle_it(MG_E_POINT, 4, p3ent)) != MG_OK) |
| 807 |
|
return(rv); |
| 808 |
< |
if ((rv = handle_it(MG_E_NORMAL, 4, n3ent)) != MG_OK) |
| 808 |
> |
if (n2off > -FHUGE && |
| 809 |
> |
(rv = handle_it(MG_E_NORMAL, 4, n3ent)) != MG_OK) |
| 810 |
|
return(rv); |
| 811 |
|
if ((rv = handle_it(MG_E_FACE, 4, fent)) != MG_OK) |
| 812 |
|
return(rv); |
| 813 |
|
} |
| 814 |
|
} else { /* quads */ |
| 815 |
|
v1ent[3] = "_cv4"; |
| 816 |
< |
if (warpconends) /* hack for e_sph and e_torus */ |
| 817 |
< |
n1off = tan(atan(n1off)+(PI/4)/mg_nqcdivs); |
| 818 |
< |
n1off = sgn*n1off; |
| 816 |
> |
if (warpconends) { /* hack for e_sph and e_torus */ |
| 817 |
> |
d = atan(n1off) + (PI/4)/mg_nqcdivs; |
| 818 |
> |
if (d >= PI/2-FTINY) |
| 819 |
> |
n1off = FHUGE; |
| 820 |
> |
else |
| 821 |
> |
n1off = tan(atan(n1off)+(PI/4)/mg_nqcdivs); |
| 822 |
> |
} |
| 823 |
|
for (j = 0; j < 3; j++) { |
| 824 |
|
sprintf(p4[j], FLTFMT, cv1->p[j] + rad1*u[j]); |
| 825 |
< |
sprintf(n4[j], FLTFMT, u[j] + w[j]*n1off); |
| 825 |
> |
if (n1off >= FHUGE) |
| 826 |
> |
sprintf(n4[j], FLTFMT, w[j]); |
| 827 |
> |
else |
| 828 |
> |
sprintf(n4[j], FLTFMT, u[j] + w[j]*n1off); |
| 829 |
|
} |
| 830 |
|
if ((rv = handle_it(MG_E_VERTEX, 3, v4ent)) != MG_OK) |
| 831 |
|
return(rv); |
| 842 |
|
for (j = 0; j < 3; j++) { |
| 843 |
|
d = u[j]*cos(theta) + v[j]*sin(theta); |
| 844 |
|
sprintf(p3[j], FLTFMT, cv2->p[j] + rad2*d); |
| 845 |
< |
sprintf(n3[j], FLTFMT, d + w[j]*n2off); |
| 845 |
> |
if (n2off > -FHUGE) |
| 846 |
> |
sprintf(n3[j], FLTFMT, d + w[j]*n2off); |
| 847 |
|
sprintf(p4[j], FLTFMT, cv1->p[j] + rad1*d); |
| 848 |
< |
sprintf(n4[j], FLTFMT, d + w[j]*n1off); |
| 848 |
> |
if (n1off < FHUGE) |
| 849 |
> |
sprintf(n4[j], FLTFMT, d + w[j]*n1off); |
| 850 |
|
} |
| 851 |
< |
if ((rv = handle_it(MG_E_VERTEX, 3, v3ent)) != MG_OK) |
| 851 |
> |
if ((rv = handle_it(MG_E_VERTEX, 2, v3ent)) != MG_OK) |
| 852 |
|
return(rv); |
| 853 |
|
if ((rv = handle_it(MG_E_POINT, 4, p3ent)) != MG_OK) |
| 854 |
|
return(rv); |
| 855 |
< |
if ((rv = handle_it(MG_E_NORMAL, 4, n3ent)) != MG_OK) |
| 855 |
> |
if (n2off > -FHUGE && |
| 856 |
> |
(rv = handle_it(MG_E_NORMAL, 4, n3ent)) != MG_OK) |
| 857 |
|
return(rv); |
| 858 |
< |
if ((rv = handle_it(MG_E_VERTEX, 3, v4ent)) != MG_OK) |
| 858 |
> |
if ((rv = handle_it(MG_E_VERTEX, 2, v4ent)) != MG_OK) |
| 859 |
|
return(rv); |
| 860 |
|
if ((rv = handle_it(MG_E_POINT, 4, p4ent)) != MG_OK) |
| 861 |
|
return(rv); |
| 862 |
< |
if ((rv = handle_it(MG_E_NORMAL, 4, n4ent)) != MG_OK) |
| 862 |
> |
if (n1off < FHUGE && |
| 863 |
> |
(rv = handle_it(MG_E_NORMAL, 4, n4ent)) != MG_OK) |
| 864 |
|
return(rv); |
| 865 |
|
if ((rv = handle_it(MG_E_FACE, 5, fent)) != MG_OK) |
| 866 |
|
return(rv); |