56 |
|
/* alternate handler routines */ |
57 |
|
|
58 |
|
static int e_any_toss(), /* discard unneeded entity */ |
59 |
< |
e_ies(); /* IES luminaire file */ |
59 |
> |
e_ies(), /* IES luminaire file */ |
60 |
|
e_include(), /* include file */ |
61 |
|
e_sph(), /* sphere */ |
62 |
|
e_cyl(), /* cylinder */ |
300 |
|
int rval; |
301 |
|
|
302 |
|
if ((rval = mg_open(&cntxt, fn)) != MG_OK) { |
303 |
< |
fprintf("%s: %s\n", fn, mg_err[rval]); |
303 |
> |
fprintf(stderr, "%s: %s\n", fn, mg_err[rval]); |
304 |
|
return(rval); |
305 |
|
} |
306 |
|
while (mg_read()) /* parse each line */ |
349 |
|
if (i+1 >= ac || !isint(av[i+1])) |
350 |
|
return(MG_ETYPE); |
351 |
|
niter = atoi(av[i+1]); |
352 |
< |
argv[0] = "-i"; |
352 |
> |
argv[0] = mg_ename[MG_E_OBJECT]; |
353 |
|
argv[1] = cntbuf; |
354 |
|
for (j = 2; j+i < ac; j++) |
355 |
|
argv[j] = av[j+i]; |
356 |
|
argv[j] = NULL; |
357 |
|
for (j = 0; j < niter; j++) { |
358 |
|
sprintf(cntbuf, "%d", j); |
359 |
+ |
if ((rval = handle_it(MG_E_OBJECT, 2, argv)) != MG_OK) |
360 |
+ |
return(rval); |
361 |
+ |
argv[0] = "-i"; |
362 |
|
if ((rval = mg_iterate(ac-i, argv, f)) != MG_OK) |
363 |
|
return(rval); |
364 |
+ |
argv[0] = mg_ename[MG_E_OBJECT]; |
365 |
+ |
if ((rval = handle_it(MG_E_OBJECT, 1, argv)) != MG_OK) |
366 |
+ |
return(rval); |
367 |
|
} |
368 |
|
} else if ((rval = (*f)()) != MG_OK) /* else do this instance */ |
369 |
|
return(rval); |
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); |