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); |