ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/cv/robjutil.c
Revision: 2.5
Committed: Thu Feb 9 21:54:10 2023 UTC (14 months, 2 weeks ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R4, HEAD
Changes since 2.4: +2 -2 lines
Log Message:
fix: compile error fixes related to redeclaration of eputs() and wputs()

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id: robjutil.c,v 2.4 2021/03/12 18:32:33 greg Exp $";
3 #endif
4 /*
5 * Utility program for fixing up Wavefront .OBJ files.
6 *
7 */
8
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <string.h>
12 #include "rtio.h"
13 #include "objutil.h"
14
15 const char *progname;
16 int verbose = 0;
17
18 int
19 main(int argc, char *argv[])
20 {
21 Scene *myScene;
22 int radout = 0;
23 const char *grp[64];
24 int ngrps = 0;
25 int save_grps = 1;
26 const char *mat[64];
27 int nmats = 0;
28 int save_mats = 1;
29 int do_tex = 0;
30 int do_norm = 0;
31 int do_triangulate = 0;
32 char *xfm = NULL;
33 char cbuf[256];
34 double verteps = -1.;
35 int i, n;
36
37 progname = argv[0];
38 /* process options */
39 for (i = 1; i < argc && (argv[i][0] == '-' || argv[i][0] == '+'); i++)
40 switch (argv[i][1]) {
41 case 'v': /* verbose mode */
42 verbose = (argv[i][0] == '+');
43 break;
44 case 'g': /* save/delete group */
45 if (save_grps != (argv[i][0] == '+')) {
46 if (ngrps) {
47 fprintf(stderr,
48 "%s: -g and +g are mutually exclusive\n",
49 argv[0]);
50 exit(1);
51 }
52 save_grps = !save_grps;
53 }
54 if (ngrps >= 64) {
55 fprintf(stderr, "%s: too many groups\n",
56 argv[0]);
57 exit(1);
58 }
59 grp[ngrps++] = argv[++i];
60 break;
61 case 'm': /* save/delete material */
62 if (save_mats != (argv[i][0] == '+')) {
63 if (nmats) {
64 fprintf(stderr,
65 "%s: -m and +m are mutually exclusive\n",
66 argv[0]);
67 exit(1);
68 }
69 save_mats = !save_mats;
70 }
71 if (nmats >= 64) {
72 fprintf(stderr, "%s: too many materials\n",
73 argv[0]);
74 exit(1);
75 }
76 mat[nmats++] = argv[++i];
77 break;
78 case 't': /* do texture coord's */
79 do_tex = (argv[i][0] == '+') ? 1 : -1;
80 break;
81 case 'n': /* do normals */
82 do_norm = (argv[i][0] == '+') ? 1 : -1;
83 break;
84 case 'c': /* coalesce vertices */
85 verteps = atof(argv[++i]);
86 break;
87 case 'r': /* output to Radiance file? */
88 radout = (argv[i][0] == '+');
89 break;
90 case 'T': /* triangulate faces? */
91 do_triangulate = (argv[i][0] == '+');
92 break;
93 case 'x': /* apply a transform */
94 if (xfm != NULL) {
95 fprintf(stderr, "%s: only one '-x' option allowed\n",
96 argv[0]);
97 exit(1);
98 }
99 xfm = argv[++i];
100 break;
101 default:
102 fprintf(stderr, "%s: unknown option: %s\n",
103 argv[0], argv[i]);
104 goto userr;
105 }
106 if (i == argc) {
107 if (verbose)
108 fputs("Loading scene from standard input...\n",
109 stderr);
110 myScene = loadOBJ(NULL, NULL);
111 } else {
112 myScene = newScene();
113 for ( ; i < argc; i++) {
114 if (verbose)
115 fprintf(stderr,
116 "Loading scene from \"%s\"...\n",
117 argv[i]);
118 if (loadOBJ(myScene, argv[i]) == NULL)
119 exit(1);
120 }
121 }
122 if (ngrps) {
123 if (verbose)
124 fputs("Deleting unwanted groups...\n", stderr);
125 clearSelection(myScene, 0);
126 sprintf(cbuf, "%s the following groups:",
127 save_grps ? "Extracting" : "Deleting");
128 addComment(myScene, cbuf);
129 for (i = 0; i < ngrps; i++) {
130 sprintf(cbuf, "\t%s", grp[i]);
131 addComment(myScene, cbuf);
132 selectGroup(myScene, grp[i], 0);
133 }
134 if (save_grps)
135 n = deleteFaces(myScene, 0, FACE_SELECTED);
136 else
137 n = deleteFaces(myScene, FACE_SELECTED, 0);
138 sprintf(cbuf, "\t(%d faces removed)", n);
139 addComment(myScene, cbuf);
140 }
141 if (nmats) {
142 if (verbose)
143 fputs("Deleting unwanted materials...\n", stderr);
144 clearSelection(myScene, 0);
145 sprintf(cbuf, "%s the following materials:",
146 save_mats ? "Extracting" : "Deleting");
147 addComment(myScene, cbuf);
148 for (i = 0; i < nmats; i++) {
149 sprintf(cbuf, "\t%s", mat[i]);
150 addComment(myScene, cbuf);
151 selectMaterial(myScene, mat[i], 0);
152 }
153 if (save_mats)
154 n = deleteFaces(myScene, 0, FACE_SELECTED);
155 else
156 n = deleteFaces(myScene, FACE_SELECTED, 0);
157 sprintf(cbuf, "\t(%d faces removed)", n);
158 addComment(myScene, cbuf);
159 }
160 if (verbose && do_tex < 0)
161 fputs("Removing texture coordinates...\n", stderr);
162 if (do_tex < 0 && (n = removeTexture(myScene, 0, 0))) {
163 sprintf(cbuf, "Removed texture coordinates from %d faces", n);
164 addComment(myScene, cbuf);
165 }
166 if (verbose && do_norm < 0)
167 fputs("Removing surface normals...\n", stderr);
168 if (do_norm < 0 && (n = removeNormals(myScene, 0, 0))) {
169 sprintf(cbuf, "Removed surface normals from %d faces", n);
170 addComment(myScene, cbuf);
171 }
172 if (verbose && verteps >= 0)
173 fputs("Coalescing vertices...\n", stderr);
174 if (verteps >= 0 && (n = coalesceVertices(myScene, verteps))) {
175 sprintf(cbuf, "Coalesced %d vertices with epsilon of %g",
176 n, verteps);
177 addComment(myScene, cbuf);
178 }
179 if (verbose)
180 fputs("Deleting degenerate faces...\n", stderr);
181 n = deleteFaces(myScene, FACE_DEGENERATE, 0);
182 if (n) {
183 sprintf(cbuf, "Removed %d degenerate faces", n);
184 addComment(myScene, cbuf);
185 }
186 if (verbose)
187 fputs("Checking for duplicate faces...\n", stderr);
188 if (findDuplicateFaces(myScene))
189 n = deleteFaces(myScene, FACE_DUPLICATE, 0);
190 if (n) {
191 sprintf(cbuf, "Removed %d duplicate faces", n);
192 addComment(myScene, cbuf);
193 }
194 if (do_triangulate) {
195 if (verbose)
196 fputs("Making sure all faces are triangles...\n", stderr);
197 n = triangulateScene(myScene);
198 if (n > 0) {
199 sprintf(cbuf, "Added %d faces during triangulation", n);
200 addComment(myScene, cbuf);
201 }
202 }
203 if (xfm != NULL) {
204 if (verbose)
205 fputs("Applying transform...\n", stderr);
206 if (!xfmScene(myScene, xfm)) {
207 fprintf(stderr, "%s: transform error\n", argv[0]);
208 exit(1);
209 }
210 }
211 if (verbose)
212 fputs("Writing out scene...\n", stderr);
213
214 fputs("# File processed by: ", stdout);
215 printargs(argc, argv, stdout);
216 if (radout)
217 toRadiance(myScene, stdout, 0, 0);
218 else
219 toOBJ(myScene, stdout);
220 /* freeScene(myScene); */
221 if (verbose)
222 fputs("Done. \n", stderr);
223 return(0);
224 userr:
225 fprintf(stderr, "Usage: %s [options] [input.obj ..]\n", argv[0]);
226 fprintf(stderr, "Available options:\n");
227 fprintf(stderr, "\t+/-r\t\t\t# Radiance scene output on/off\n");
228 fprintf(stderr, "\t+/-v\t\t\t# on/off verbosity (progress reports)\n");
229 fprintf(stderr, "\t+/-g name\t\t# save/delete group\n");
230 fprintf(stderr, "\t+/-m name\t\t# save/delete faces with material\n");
231 fprintf(stderr, "\t+/-t\t\t\t# keep/remove texture coordinates\n");
232 fprintf(stderr, "\t+/-n\t\t\t# keep/remove vertex normals\n");
233 fprintf(stderr, "\t-c epsilon\t\t# coalesce vertices within epsilon\n");
234 fprintf(stderr, "\t+T\t\t\t# turn all faces into triangles\n");
235 fprintf(stderr, "\t-x 'xf spec'\t# apply the quoted transform\n");
236 return(1);
237 }
238
239 void
240 eputs(const char *s) /* put string to stderr */
241 {
242 static int midline = 0;
243
244 if (!*s)
245 return;
246 if (!midline++) {
247 fputs(progname, stderr);
248 fputs(": ", stderr);
249 }
250 fputs(s, stderr);
251 if (s[strlen(s)-1] == '\n')
252 midline = 0;
253 }