ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/cv/mgflib/mgf2inv.c
(Generate patch)

Comparing ray/src/cv/mgflib/mgf2inv.c (file contents):
Revision 1.2 by greg, Mon Dec 4 12:01:31 1995 UTC vs.
Revision 1.10 by greg, Tue Aug 5 20:40:16 2003 UTC

# Line 1 | Line 1
1 /* Copyright (c) 1995 Regents of the University of California */
2
1   #ifndef lint
2 < static char SCCSid[] = "$SunId$ LBL";
2 > static const char       RCSid[] = "$Id$";
3   #endif
6
4   /*
5   * Convert MGF to Inventor file.
6   *
# Line 12 | Line 9 | static char SCCSid[] = "$SunId$ LBL";
9  
10   #include <stdio.h>
11  
12 + #include <stdlib.h>
13 +
14   #include <math.h>
15  
16   #include <ctype.h>
17  
18 + #include <string.h>
19 +
20   #include "parser.h"
21  
22 + #include "lookup.h"
23 +
24   #define O_INV1          1       /* Inventor 1.0 output */
25   #define O_INV2          2       /* Inventor 2.0 output */
26 < #define O_VRML          3       /* VRML output */
26 > #define O_VRML1         3       /* VRML 1.0 output */
27  
28 + #define MAXID           48      /* maximum identifier length */
29 +
30 + #define VERTFMT         "%+16.9e %+16.9e %+16.9e\n%+6.3f %+6.3f %+6.3f"
31 + #define VZVECT          "+0.000 +0.000 +0.000"
32 + #define VFSEPPOS        50      /* position of newline in above */
33 + #define VFLEN           72      /* total vertex string length */
34 + #define MAXVERT         10240   /* maximum cached vertices */
35 +
36 + #define setvkey(k,v)    sprintf(k,VERTFMT,(v)->p[0],(v)->p[1],(v)->p[2],\
37 +                                        (v)->n[0],(v)->n[1],(v)->n[2]);
38 +
39 + char    vlist[MAXVERT][VFLEN];  /* our vertex cache */
40 + int     nverts;                 /* current cache size */
41 +
42 + LUTAB   vert_tab = LU_SINIT(NULL,NULL);
43 +
44 + struct face {
45 +        struct face     *next;          /* next face in list */
46 +        short           nv;             /* number of vertices */
47 +        short           vl[3];          /* vertex index list (variable) */
48 + }       *flist, *flast;         /* our face cache */
49 +
50 + #define newface(n)      (struct face *)malloc(sizeof(struct face) + \
51 +                                ((n) > 3 ? (n)-3 : 0)*sizeof(short))
52 + #define freeface(f)     free((MEM_PTR)f)
53 +
54   #define TABSTOP         8       /* assumed number of characters per tab */
55   #define SHIFTW          2       /* nesting shift width */
56   #define MAXIND          15      /* maximum indent level */
57  
58   char    tabs[MAXIND*SHIFTW+1];  /* current tab-in string */
59  
60 + #define curmatname      (c_cmname == NULL ? "mat" : to_id(c_cmname))
61 +
62   int     outtype = O_INV2;       /* output format */
63  
64   extern int      i_comment(), i_object(), i_xf(),
# Line 67 | Line 98 | char   *argv[];
98                                  /* get options and print format line */
99          for (i = 1; i < argc && argv[i][0] == '-'; i++)
100                  if (!strcmp(argv[i], "-vrml"))
101 <                        outtype = O_VRML;
101 >                        outtype = O_VRML1;
102                  else if (!strcmp(argv[i], "-1"))
103                          outtype = O_INV1;
104                  else if (!strcmp(argv[i], "-2"))
# Line 81 | Line 112 | char   *argv[];
112          case O_INV2:
113                  printf("#Inventor V2.0 ascii\n");
114                  break;
115 <        case O_VRML:
116 <                printf("#VRML 1.0 ascii\n");
115 >        case O_VRML1:
116 >                printf("#VRML V1.0 ascii\n");
117                  break;
118          }
119          printf("## Translated from MGF Version %d.%d\n", MG_VMAJOR, MG_VMINOR);
# Line 114 | Line 145 | char   *argv[];
145                          printf("## %s %s: %u unknown entities\n",
146                                          argv[0], argv[i], mg_nunknown);
147          }
148 <        printf("}\n");                          /* close root node */
148 >        flush_cache();          /* flush face cache, just in case */
149 >        printf("}\n");          /* close root node */
150          exit(0);
151   userr:
152          fprintf(stderr, "%s: [-1|-2|-vrml] [file] ..\n", argv[0]);
# Line 165 | Line 197 | char   **av;
197   {
198          static int      objnest;
199  
200 +        flush_cache();                  /* flush cached objects */
201          if (ac == 2) {                          /* start group */
202                  printf("%sDEF %s Group {\n", tabs, to_id(av[1]));
203                  indent(1);
# Line 191 | Line 224 | char   **av;
224          static long     xfid;
225          register XF_SPEC        *spec;
226  
227 +        flush_cache();                  /* flush cached objects */
228          if (ac == 1) {                  /* end of transform */
229                  if ((spec = xf_context) == NULL)
230                          return(MG_ECNTXT);
# Line 284 | Line 318 | register XF_SPEC       *spec;
318   int
319   put_material()                  /* put out current material */
320   {
321 <        char    *mname = "mat";
321 >        char    *mname = curmatname;
322          float   rgbval[3];
323  
290        if (c_cmname != NULL)
291                mname = c_cmname;
324          if (!c_cmaterial->clock) {      /* current, just use it */
325 <                printf("%sUSE %s\n", tabs, to_id(mname));
325 >                printf("%sUSE %s\n", tabs, mname);
326                  return(0);
327          }
328                                  /* else update definition */
329 <        printf("%sDEF %s Group {\n", tabs, to_id(mname));
329 >        printf("%sDEF %s Group {\n", tabs, mname);
330          indent(1);
331          printf("%sMaterial {\n", tabs);
332          indent(1);
# Line 307 | Line 339 | put_material()                 /* put out current material */
339                  mgf2rgb(&c_cmaterial->rs_c, c_cmaterial->rs, rgbval);
340                  printf("%sspecularColor %.4f %.4f %.4f\n", tabs,
341                                  rgbval[0], rgbval[1], rgbval[2]);
342 <                printf("%sshininess %.3f\n", tabs, 1.-c_cmaterial->rs_a);
342 >                printf("%sshininess %.3f\n", tabs, 1.-sqrt(c_cmaterial->rs_a));
343          }
344          if (c_cmaterial->ed > FTINY) {
345                  mgf2rgb(&c_cmaterial->ed_c, 1.0, rgbval);
# Line 320 | Line 352 | put_material()                 /* put out current material */
352          indent(0);
353          printf("%s}\n", tabs);
354          if (outtype != O_INV1)
355 <                printf("%sShapeHints { shapeType %s }\n", tabs,
355 >                printf("%sShapeHints { shapeType %s faceType UNKNOWN_FACE_TYPE }\n",
356 >                        tabs,
357                          c_cmaterial->sided ? "SOLID" : "UNKNOWN_SHAPE_TYPE");
358          indent(0);
359          printf("%s}\n", tabs);
# Line 334 | Line 367 | i_face(ac, av)                 /* translate an N-sided face */
367   int     ac;
368   char    **av;
369   {
370 <        C_VERTEX        *vl[MG_MAXARGC-1];
371 <        int     donorms = 1;
370 >        static char     lastmat[MAXID];
371 >        struct face     *newf;
372 >        register C_VERTEX       *vp;
373 >        register LUENT  *lp;
374          register int    i;
375  
376          if (ac < 4)
377                  return(MG_EARGC);
378 <        printf("%sSeparator {\n", tabs);
379 <        indent(1);
380 <                                /* put out current material */
381 <        if (put_material() < 0)
382 <                return(MG_EBADMAT);
378 >        if ( strcmp(lastmat, curmatname) || c_cmaterial->clock ||
379 >                        nverts == 0 || nverts+ac-1 >= MAXVERT) {
380 >                flush_cache();                  /* new cache */
381 >                lu_init(&vert_tab, MAXVERT);
382 >                printf("%sSeparator {\n", tabs);
383 >                indent(1);
384 >                if (put_material() < 0)         /* put out material */
385 >                        return(MG_EBADMAT);
386 >                (void)strcpy(lastmat, curmatname);
387 >        }
388 >                                /* allocate new face */
389 >        if ((newf = newface(ac-1)) == NULL)
390 >                return(MG_EMEM);
391 >        newf->nv = ac-1;
392                                  /* get vertex references */
393 <        for (i = 0; i < ac-1; i++) {
394 <                if ((vl[i] = c_getvert(av[i+1])) == NULL)
393 >        for (i = 0; i < newf->nv; i++) {
394 >                if ((vp = c_getvert(av[i+1])) == NULL)
395                          return(MG_EUNDEF);
396 <                if (is0vect(vl[i]->n))
397 <                        donorms = 0;
396 >                setvkey(vlist[nverts], vp);
397 >                lp = lu_find(&vert_tab, vlist[nverts]);
398 >                if (lp == NULL)
399 >                        return(MG_EMEM);
400 >                if (lp->key == NULL)
401 >                        lp->key = (char *)vlist[nverts++];
402 >                newf->vl[i] = ((char (*)[VFLEN])lp->key - vlist);
403          }
404 <                                /* put out normal coordinates */
405 <        if (donorms) {
406 <                printf("%sNormal {\n", tabs);
407 <                indent(1);
408 <                printf("%svector [ %5.3g %5.3g %5.3g", tabs,
409 <                        vl[0]->n[0], vl[0]->n[1], vl[0]->n[2]);
410 <                for (i = 1; i < ac-1; i++)
411 <                        printf(",\n%s         %5.3g %5.3g %5.3g", tabs,
363 <                                        vl[i]->n[0], vl[i]->n[1], vl[i]->n[2]);
364 <                indent(0);
365 <                printf(" ]\n%s}\n", tabs);
366 <        } else
367 <                printf("%sNormal { }\n", tabs);
368 <                                /* put out vertex coordinates */
369 <        printf("%sCoordinate3 {\n", tabs);
370 <        indent(1);
371 <        printf("%spoint [ %13.9g %13.9g %13.9g", tabs,
372 <                        vl[0]->p[0], vl[0]->p[1], vl[0]->p[2]);
373 <        for (i = 1; i < ac-1; i++)
374 <                printf(",\n%s        %13.9g %13.9g %13.9g", tabs,
375 <                        vl[i]->p[0], vl[i]->p[1], vl[i]->p[2]);
376 <        indent(0);
377 <        printf(" ]\n%s}\n", tabs);
378 <                                /* put out actual face */
379 <        printf("%sIndexedFaceSet {\n", tabs);
380 <        indent(1);
381 <        if (donorms) {
382 <                printf("%snormalIndex [ 0", tabs);
383 <                for (i = 1; i < ac-1; i++)
384 <                        printf(", %d", i);
385 <                printf(" ]\n");
386 <        }
387 <        printf("%scoordIndex [ 0", tabs);
388 <        for (i = 1; i < ac-1; i++)
389 <                printf(", %d", i);
390 <        printf(" ]\n");
391 <        indent(0);
392 <        printf("%s}\n", tabs);
393 <        indent(0);
394 <        printf("%s}\n", tabs);
395 <        return(MG_OK);
404 >                                /* add to face list */
405 >        newf->next = NULL;
406 >        if (flist == NULL)
407 >                flist = newf;
408 >        else
409 >                flast->next = newf;
410 >        flast = newf;
411 >        return(MG_OK);          /* we'll actually put it out later */
412   }
413  
414  
# Line 405 | Line 421 | char   **av;
421  
422          if (ac != 3)
423                  return(MG_EARGC);
424 +        flush_cache();          /* flush vertex cache */
425          printf("%sSeparator {\n", tabs);
426          indent(1);
427                                  /* put out current material */
# Line 436 | Line 453 | char   **av;
453  
454          if (ac != 4)
455                  return(MG_EARGC);
456 +        flush_cache();          /* flush vertex cache */
457          printf("%sSeparator {\n", tabs);
458          indent(1);
459                                  /* put out current material */
460          if (put_material() < 0)
461                  return(MG_EBADMAT);
462                                  /* get endpoints */
463 <        if ((v1 = c_getvert(av[1])) == NULL | (v2 = c_getvert(av[3])) == NULL)
463 >        if (((v1 = c_getvert(av[1])) == NULL) | ((v2 = c_getvert(av[3])) == NULL))
464                  return(MG_EUNDEF);
465                                  /* get radius */
466          if (!isflt(av[2]))
# Line 452 | Line 470 | char   **av;
470          va[1] = v2->p[1] - v1->p[1];
471          va[2] = v2->p[2] - v1->p[2];
472          length = sqrt(DOT(va,va));
473 <        angle = acos(va[1]/length);
473 >        if (va[1] >= length)
474 >                angle = 0.;
475 >        else if (va[1] <= -length)
476 >                angle = PI;
477 >        else
478 >                angle = acos(va[1]/length);
479          printf("%sTranslation { translation %13.9g %13.9g %13.9g }\n", tabs,
480                          .5*(v1->p[0]+v2->p[0]), .5*(v1->p[1]+v2->p[1]),
481                          .5*(v1->p[2]+v2->p[2]));
# Line 471 | Line 494 | char *
494   to_id(name)                     /* make sure a name is a valid Inventor ID */
495   register char   *name;
496   {
497 <        static char     id[32];
497 >        static char     id[MAXID];
498          register char   *cp;
499  
500 <        for (cp = id; cp < id+sizeof(id)-1 && *name; name++)
500 >        for (cp = id; *name && cp < MAXID-1+id; name++)
501                  if (isalnum(*name) || *name == '_')
502                          *cp++ = *name;
503                  else
504                          *cp++ = '_';
505          *cp = '\0';
506          return(id);
507 + }
508 +
509 +
510 + flush_cache()                   /* put out cached faces */
511 + {
512 +        int     donorms = 0;
513 +        register struct face    *f;
514 +        register int    i;
515 +
516 +        if (nverts == 0)
517 +                return;
518 +                                        /* put out coordinates */
519 +        printf("%sCoordinate3 {\n", tabs);
520 +        indent(1);
521 +        vlist[0][VFSEPPOS] = '\0';
522 +        printf("%spoint [ %s", tabs, vlist[0]);
523 +        for (i = 1; i < nverts; i++) {
524 +                vlist[i][VFSEPPOS] = '\0';
525 +                printf(",\n%s        %s", tabs, vlist[i]);
526 +                if (strcmp(VFSEPPOS+1+vlist[i], VZVECT))
527 +                        donorms++;
528 +        }
529 +        indent(0);
530 +        printf(" ]\n%s}\n", tabs);
531 +        if (donorms) {                  /* put out normals */
532 +                printf("%sNormal {\n", tabs);
533 +                indent(1);
534 +                printf("%svector [ %s", tabs, VFSEPPOS+1+vlist[0]);
535 +                for (i = 1; i < nverts; i++)
536 +                        printf(",\n%s         %s", tabs, VFSEPPOS+1+vlist[i]);
537 +                indent(0);
538 +                printf(" ]\n%s}\n", tabs);
539 +        }
540 +                                        /* put out faces */
541 +        printf("%sIndexedFaceSet {\n", tabs);
542 +        indent(1);
543 +        f = flist;                      /* coordinate indices */
544 +        printf("%scoordIndex [ %d", tabs, f->vl[0]);
545 +        for (i = 1; i < f->nv; i++)
546 +                printf(", %d", f->vl[i]);
547 +        for (f = f->next; f != NULL; f = f->next) {
548 +                printf(", -1,\n%s             %d", tabs, f->vl[0]);
549 +                for (i = 1; i < f->nv; i++)
550 +                        printf(", %d", f->vl[i]);
551 +        }
552 +        printf(" ]\n");
553 +        if (donorms) {
554 +                f = flist;                      /* normal indices */
555 +                printf("%snormalIndex [ %d", tabs, f->vl[0]);
556 +                for (i = 1; i < f->nv; i++)
557 +                        printf(", %d", f->vl[i]);
558 +                for (f = f->next; f != NULL; f = f->next) {
559 +                        printf(", -1,\n%s              %d", tabs, f->vl[0]);
560 +                        for (i = 1; i < f->nv; i++)
561 +                                printf(", %d", f->vl[i]);
562 +                }
563 +                printf(" ]\n");
564 +        }
565 +        indent(0);                      /* close IndexedFaceSet */
566 +        printf("%s}\n", tabs);
567 +        indent(0);                      /* close face group */
568 +        printf("%s}\n", tabs);
569 +        while ((f = flist) != NULL) {   /* free face list */
570 +                flist = f->next;
571 +                freeface(f);
572 +        }
573 +        lu_done(&vert_tab);             /* clear lookup table */
574 +        nverts = 0;
575   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines