ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/cv/mgf2meta.c
Revision: 2.6
Committed: Sat Feb 22 02:07:23 2003 UTC (21 years, 1 month ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad3R5
Changes since 2.5: +2 -8 lines
Log Message:
Changes and check-in for 3.5 release
Includes new source files and modifications not recorded for many years
See ray/doc/notes/ReleaseNotes for notes between 3.1 and 3.5 release

File Contents

# User Rev Content
1 greg 2.1 #ifndef lint
2 greg 2.6 static const char RCSid[] = "$Id$";
3 greg 2.1 #endif
4     /*
5 greg 2.2 * Convert MGF (Materials and Geometry Format) to Metafile 2-d graphics
6 greg 2.1 */
7    
8     #include <stdio.h>
9 greg 2.6 #include <stdlib.h>
10 greg 2.1 #include <math.h>
11 greg 2.4 #include "random.h"
12 greg 2.1 #include "mgflib/parser.h"
13    
14 greg 2.5 #define MSIZE ((1<<14)-1)
15     #define MX(v) (int)(MSIZE*(v)[(proj_axis+1)%3])
16     #define MY(v) (int)(MSIZE*(v)[(proj_axis+2)%3])
17    
18 greg 2.1 int r_face();
19     int proj_axis;
20     double limit[3][2];
21 greg 2.3 int layer;
22 greg 2.5 long rthresh = 1;
23 greg 2.1
24     extern int mg_nqcdivs;
25    
26    
27     main(argc, argv) /* convert files to stdout */
28     int argc;
29     char *argv[];
30     {
31     int i;
32     /* initialize dispatch table */
33     mg_ehand[MG_E_FACE] = r_face;
34     mg_ehand[MG_E_POINT] = c_hvertex;
35     mg_ehand[MG_E_VERTEX] = c_hvertex;
36     mg_ehand[MG_E_XF] = xf_handler;
37     mg_nqcdivs = 3; /* reduce object subdivision */
38     mg_init(); /* initialize the parser */
39     /* get arguments */
40 greg 2.5 if (argc > 9 && !strcmp(argv[1], "-t")) {
41     rthresh = atof(argv[2])*MSIZE + 0.5;
42     rthresh *= rthresh;
43     argv += 2;
44     argc -= 2;
45     }
46 greg 2.1 if (argc < 8 || (proj_axis = argv[1][0]-'x') < 0 || proj_axis > 2)
47     goto userr;
48     limit[0][0] = atof(argv[2]); limit[0][1] = atof(argv[3]);
49     limit[1][0] = atof(argv[4]); limit[1][1] = atof(argv[5]);
50     limit[2][0] = atof(argv[6]); limit[2][1] = atof(argv[7]);
51    
52     if (argc == 8) { /* convert stdin */
53     if (mg_load(NULL) != MG_OK)
54     exit(1);
55     } else /* convert each file */
56 greg 2.2 for (i = 8; i < argc; i++) {
57 greg 2.1 if (mg_load(argv[i]) != MG_OK)
58     exit(1);
59 greg 2.4 newlayer();
60 greg 2.2 }
61 greg 2.3 mendpage(); /* print page */
62 greg 2.2 mdone(); /* close output */
63 greg 2.1 exit(0);
64     userr:
65 greg 2.5 fputs("Usage: mgf2meta [-t thresh] {x|y|z} xmin xmax ymin ymax zmin zmax [file.mgf] ..\n",
66     stderr);
67 greg 2.1 exit(1);
68     }
69    
70    
71     int
72     r_face(ac, av) /* convert a face */
73     int ac;
74     char **av;
75     {
76     static FVECT bbmin = {0,0,0}, bbmax = {1,1,1};
77     register int i, j;
78     register C_VERTEX *cv;
79     FVECT v1, v2, vo;
80    
81     if (ac < 4)
82     return(MG_EARGC);
83     /* connect to last point */
84     if ((cv = c_getvert(av[ac-1])) == NULL)
85     return(MG_EUNDEF);
86     xf_xfmpoint(vo, cv->p);
87     for (j = 0; j < 3; j++)
88     vo[j] = (vo[j] - limit[j][0])/(limit[j][1]-limit[j][0]);
89     for (i = 1; i < ac; i++) { /* go around face */
90     if ((cv = c_getvert(av[i])) == NULL)
91     return(MG_EUNDEF);
92     xf_xfmpoint(v2, cv->p);
93     for (j = 0; j < 3; j++)
94     v2[j] = (v2[j] - limit[j][0])/(limit[j][1]-limit[j][0]);
95     VCOPY(v1, vo);
96     VCOPY(vo, v2);
97 greg 2.4 if (clip(v1, v2, bbmin, bbmax))
98     doline(MX(v1), MY(v1), MX(v2), MY(v2));
99 greg 2.1 }
100     return(MG_OK);
101 greg 2.4 }
102    
103    
104     #define HTBLSIZ 16381 /* prime hash table size */
105    
106     short hshtab[HTBLSIZ][4]; /* done line segments */
107    
108     #define hash(mx1,my1,mx2,my2) ((long)(mx1)<<15 ^ (long)(my1)<<10 ^ \
109     (long)(mx2)<<5 ^ (long)(my2))
110    
111    
112     newlayer() /* start a new layer */
113     {
114     #ifdef BSD
115     bzero((char *)hshtab, sizeof(hshtab));
116     #else
117     (void)memset((char *)hshtab, 0, sizeof(hshtab));
118     #endif
119     if (++layer >= 16) {
120     mendpage();
121     layer = 0;
122     }
123     }
124    
125    
126     int
127     doline(v1x, v1y, v2x, v2y) /* draw line conditionally */
128     int v1x, v1y, v2x, v2y;
129     {
130     register int h;
131    
132     if (v1x > v2x || (v1x == v2x && v1y > v2y)) { /* sort endpoints */
133     h=v1x; v1x=v2x; v2x=h;
134     h=v1y; v1y=v2y; v2y=h;
135     }
136     h = hash(v1x, v1y, v2x, v2y) % HTBLSIZ;
137     if (hshtab[h][0] == v1x && hshtab[h][1] == v1y &&
138     hshtab[h][2] == v2x && hshtab[h][3] == v2y)
139     return(0);
140     hshtab[h][0] = v1x; hshtab[h][1] = v1y;
141     hshtab[h][2] = v2x; hshtab[h][3] = v2y;
142     if ((long)(v2x-v1x)*(v2x-v1x) + (long)(v2y-v1y)*(v2y-v1y)
143 greg 2.5 <= random() % rthresh)
144 greg 2.4 return(0);
145     mline(v1x, v1y, layer/4, 0, layer%4);
146     mdraw(v2x, v2y);
147     return(1);
148 greg 2.1 }