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

Comparing ray/src/gen/replmarks.c (file contents):
Revision 2.10 by greg, Fri Jan 2 17:11:40 2004 UTC vs.
Revision 2.14 by greg, Wed Dec 28 18:35:42 2005 UTC

# Line 1 | Line 1
1   #ifndef lint
2 < static const char RCSid[] = "$Id";
2 > static const char RCSid[] = "$Id$";
3   #endif
4   /*
5   * Replace markers in Radiance scene description with objects or instances.
# Line 26 | Line 26 | static const char RCSid[] = "$Id";
26   #define  FEQ(a,b)       ((a)-(b) <= 1e-7 && (b)-(a) <= 1e-7)
27  
28   #define  MAXVERT        6       /* maximum number of vertices for markers */
29 < #define  MAXMARK        32      /* maximum number of markers */
29 > #define  MAXMARK        128     /* maximum number of markers */
30  
31 + #define  USE_XFORM      1       /* use !xform inline command */
32 + #define  USE_INSTANCE   2       /* use instance primitive */
33 + #define  USE_MESH       3       /* use mesh primitive */
34 +
35   typedef struct {
36          short   beg, end;               /* beginning and ending vertex */
37          float   len2;                   /* length squared */
# Line 38 | Line 42 | struct mrkr {
42          double  mscale;                 /* scale by this to get unit */
43          char    *modin;                 /* input modifier indicating marker */
44          char    *objname;               /* output object file or octree */
45 <        int     doxform;                /* true if xform, false if instance */
46 < }  marker[MAXMARK];             /* array of markers */
45 >        int     usetype;                /* one of USE_* above */
46 > }  marker[MAXMARK+1];           /* array of markers */
47   int     nmarkers = 0;           /* number of markers */
48  
49   int     expand;                 /* expand commands? */
# Line 70 | Line 74 | main(
74                  do {
75                          switch (argv[i][1]) {
76                          case 'i':
77 <                                marker[nmarkers].doxform = 0;
77 >                                marker[nmarkers].usetype = USE_INSTANCE;
78                                  marker[nmarkers].objname = argv[++i];
79                                  break;
80 +                        case 'I':
81 +                                marker[nmarkers].usetype = USE_MESH;
82 +                                marker[nmarkers].objname = argv[++i];
83 +                                break;
84                          case 'x':
85 <                                marker[nmarkers].doxform = 1;
85 >                                marker[nmarkers].usetype = USE_XFORM;
86                                  marker[nmarkers].objname = argv[++i];
87                                  break;
88                          case 'e':
# Line 94 | Line 102 | main(
102                  } while (argv[i][0] == '-');
103                  if (marker[nmarkers].objname == NULL)
104                          goto userr;
105 +                if (nmarkers >= MAXMARK) {
106 +                        fprintf(stderr, "%s: too many markers\n", progname);
107 +                        return 1;
108 +                }
109                  marker[nmarkers++].modin = argv[i++];
98                if (nmarkers >= MAXMARK)
99                        break;
110                  marker[nmarkers].mscale = marker[nmarkers-1].mscale;
111          }
112          if (nmarkers == 0)
# Line 122 | Line 132 | main(
132          return 0;
133   userr:
134          fprintf(stderr,
135 < "Usage: %s [-e][-s size][-m modout] {-x objfile|-i octree} modname .. [file ..]\n",
135 > "Usage: %s [-e][-s size][-m modout] {-x objfile|-i octree|-I mesh} modname .. [file ..]\n",
136                  progname);
137          return 1;
138   }
# Line 192 | Line 202 | cvobject(              /* convert an object */
202          int     i, n;
203          register int    j;
204  
205 <        if (fscanf(fin, "%s %s %s", buf, typ, nam) != 3)
205 >        if (fgetword(buf, sizeof(buf), fin) == NULL ||
206 >                        fgetword(typ, sizeof(typ), fin) == NULL ||
207 >                        fgetword(nam, sizeof(nam), fin) == NULL)
208                  goto readerr;
209          if (!strcmp(typ, "polygon"))
210                  for (j = 0; j < nmarkers; j++)
# Line 200 | Line 212 | cvobject(              /* convert an object */
212                                  replace(fname, &marker[j], nam, fin);
213                                  return;
214                          }
215 <        printf("\n%s %s %s\n", buf, typ, nam);
215 >        putchar('\n'); fputword(buf, stdout);
216 >        printf(" %s ", typ);
217 >        fputword(nam, stdout); putchar('\n');
218          if (!strcmp(typ, "alias")) {            /* alias special case */
219 <                if (fscanf(fin, "%s", buf) != 1)
219 >                if (fgetword(buf, sizeof(buf), fin) == NULL)
220                          goto readerr;
221 <                printf("\t%s\n", buf);
221 >                putchar('\t'); fputword(buf, stdout); putchar('\n');
222                  return;
223          }
224          for (i = 0; i < 3; i++) {               /* pass along arguments */
# Line 240 | Line 254 | replace(               /* replace marker */
254          char    buf[256];
255  
256          buf[0] = '\0';                  /* bug fix thanks to schorsch */
257 <        if (m->doxform) {
257 >        if (m->usetype == USE_XFORM) {
258                  sprintf(buf, "xform -n %s", mark);
259                  if (m->modout != NULL)
260                          sprintf(buf+strlen(buf), " -m %s", m->modout);
# Line 255 | Line 269 | replace(               /* replace marker */
269          } else {
270                  if ((n = buildxf(buf, m->mscale, fin)) < 0)
271                          goto badxf;
272 <                printf("\n%s instance %s\n",
273 <                                m->modout==NULL?"void":m->modout, mark);
272 >                printf("\n%s %s %s\n",
273 >                                m->modout==NULL?"void":m->modout,
274 >                                m->usetype==USE_INSTANCE?"instance":"mesh",
275 >                                mark);
276                  printf("%d %s%s\n0\n0\n", n+1, m->objname, buf);
277          }
278          return;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines