--- ray/src/util/vwright.c 2008/03/11 02:21:47 2.7 +++ ray/src/util/vwright.c 2009/06/14 00:33:16 2.8 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: vwright.c,v 2.7 2008/03/11 02:21:47 greg Exp $"; +static const char RCSid[] = "$Id: vwright.c,v 2.8 2009/06/14 00:33:16 greg Exp $"; #endif /* * Move a viewpoint the given distance to the right @@ -31,14 +31,41 @@ main( register int i; progname = argv[0]; - if (argc != 2) - goto userr; - while (fgets(linebuf, sizeof(linebuf), stdin) != NULL) { - if (linebuf[0] == '\n') - break; - if (isview(linebuf) && sscanview(&vw, linebuf) > 0) - gotview++; + ++argv; --argc; + while (argc && argv[0][0] == '-' && argv[0][1] == 'v') { + int rv; + if (argc > 2 && argv[0][2] == 'f') { + rv = viewfile(argv[1], &vw, NULL); + if (rv <= 0) { + fprintf(stderr, "%s: %s file '%s'\n", + progname, + rv < 0 ? "cannot open view" : + "no view in", argv[1]); + exit(1); + } + ++gotview; + ++argv; --argc; + } else { + rv = getviewopt(&vw, argc, argv); + if (rv < 0) { + fprintf(stderr, "%s: bad view option at '%s'\n", + progname, argv[0]); + exit(1); + } + ++gotview; + argv += rv; argc -= rv; + } + ++argv; --argc; } + if (argc != 1) + goto userr; + if (!gotview) + while (fgets(linebuf, sizeof(linebuf), stdin) != NULL) { + if (linebuf[0] == '\n') + break; + if (isview(linebuf) && sscanview(&vw, linebuf) > 0) + ++gotview; + } if (!gotview) { fprintf(stderr, "%s: no view on standard input\n", progname); exit(1); @@ -51,7 +78,7 @@ main( normalize(hvn); VCOPY(vvn, vw.vvec); normalize(vvn); - if (isalpha(argv[1][0])) { /* print out variables */ + if (isalpha(argv[0][0])) { /* print out variables */ switch (vw.type) { case VT_PER: i=1; break; case VT_PAR: i=2; break; @@ -61,30 +88,30 @@ main( case VT_PLS: i=6; break; default: i=0; break; } - printf("%st:%d;", argv[1], i); - printf("%spx:%g;%spy:%g;%spz:%g;", argv[1], vw.vp[0], - argv[1], vw.vp[1], argv[1], vw.vp[2]); - printf("%sdx:%g;%sdy:%g;%sdz:%g;", argv[1], vw.vdir[0], - argv[1], vw.vdir[1], argv[1], vw.vdir[2]); - printf("%sd:%g;", argv[1], vw.vdist); - printf("%sux:%g;%suy:%g;%suz:%g;", argv[1], vw.vup[0], - argv[1], vw.vup[1], argv[1], vw.vup[2]); - printf("%sh:%g;%sv:%g;", argv[1], vw.horiz, - argv[1], vw.vert); + printf("%st:%d;", argv[0], i); + printf("%spx:%g;%spy:%g;%spz:%g;", argv[0], vw.vp[0], + argv[0], vw.vp[1], argv[0], vw.vp[2]); + printf("%sdx:%g;%sdy:%g;%sdz:%g;", argv[0], vw.vdir[0], + argv[0], vw.vdir[1], argv[0], vw.vdir[2]); + printf("%sd:%g;", argv[0], vw.vdist); + printf("%sux:%g;%suy:%g;%suz:%g;", argv[0], vw.vup[0], + argv[0], vw.vup[1], argv[0], vw.vup[2]); + printf("%sh:%g;%sv:%g;", argv[0], vw.horiz, + argv[0], vw.vert); printf("%ss:%g;%sl:%g;%so:%g;%sa:%g;", - argv[1], vw.hoff, argv[1], vw.voff, - argv[1], vw.vfore, argv[1], vw.vaft); + argv[0], vw.hoff, argv[0], vw.voff, + argv[0], vw.vfore, argv[0], vw.vaft); printf("%shx:%g;%shy:%g;%shz:%g;%shn:%g;", - argv[1], hvn[0], argv[1], hvn[1], - argv[1], hvn[2], argv[1], sqrt(vw.hn2)); + argv[0], hvn[0], argv[0], hvn[1], + argv[0], hvn[2], argv[0], sqrt(vw.hn2)); printf("%svx:%g;%svy:%g;%svz:%g;%svn:%g;\n", - argv[1], vvn[0], argv[1], vvn[1], - argv[1], vvn[2], argv[1], sqrt(vw.vn2)); + argv[0], vvn[0], argv[0], vvn[1], + argv[0], vvn[2], argv[0], sqrt(vw.vn2)); exit(0); } - if (!isflt(argv[1])) + if (!isflt(argv[0])) goto userr; - dist = atof(argv[1]); + dist = atof(argv[0]); for (i = 0; i < 3; i++) vw.vp[i] += dist*hvn[i]; fprintview(&vw, stdout);