113
113
#define PROBABILITY_SCALE 600
116
#ifdef DXF_OUTPUT_HACK /* When this is defined, instead of rendering
117
to the screen, we write a DXF CAD file to stdout.
118
This is a kludge of shocking magnitude...
119
Maybe there's some other way to intercept all
120
glVertex3f calls than with a #define?
123
# define glBegin dxf_glBegin
124
# define glVertex3f dxf_glVertex3f
125
# define glEnd dxf_glEnd
127
static int dxf_type, dxf_point, dxf_point_total, dxf_layer, dxf_color;
128
static GLfloat dxf_quads[4*4];
131
dxf_glBegin (int type)
139
dxf_glVertex3f (GLfloat ox, GLfloat oy, GLfloat oz)
145
/* Transform the point into modelview space. */
146
glGetFloatv (GL_MODELVIEW_MATRIX, m);
147
x = ox * m[0] + oy * m[4] + oz * m[8] + m[12];
148
y = ox * m[1] + oy * m[5] + oz * m[9] + m[13];
149
z = ox * m[2] + oy * m[6] + oz * m[10] + m[14];
151
dxf_quads[dxf_point*3+0] = x;
152
dxf_quads[dxf_point*3+1] = y;
153
dxf_quads[dxf_point*3+2] = z;
159
if (dxf_point < 4) return;
161
fprintf (stdout, "0\n3DFACE\n8\n%d\n62\n%d\n", dxf_layer, dxf_color);
162
fprintf (stdout, "10\n%.6f\n", dxf_quads[i++]);
163
fprintf (stdout, "20\n%.6f\n", dxf_quads[i++]);
164
fprintf (stdout, "30\n%.6f\n", dxf_quads[i++]);
166
fprintf (stdout, "11\n%.6f\n", dxf_quads[i++]);
167
fprintf (stdout, "21\n%.6f\n", dxf_quads[i++]);
168
fprintf (stdout, "31\n%.6f\n", dxf_quads[i++]);
170
fprintf (stdout, "12\n%.6f\n", dxf_quads[i++]);
171
fprintf (stdout, "22\n%.6f\n", dxf_quads[i++]);
172
fprintf (stdout, "32\n%.6f\n", dxf_quads[i++]);
174
fprintf (stdout, "13\n%.6f\n", dxf_quads[i++]);
175
fprintf (stdout, "23\n%.6f\n", dxf_quads[i++]);
176
fprintf (stdout, "33\n%.6f\n", dxf_quads[i++]);
181
if (dxf_point < 4) return;
183
fprintf (stdout, "0\n3DFACE\n8\n%d\n62\n%d\n", dxf_layer, dxf_color);
184
fprintf (stdout, "10\n%.6f\n", dxf_quads[i++]);
185
fprintf (stdout, "20\n%.6f\n", dxf_quads[i++]);
186
fprintf (stdout, "30\n%.6f\n", dxf_quads[i++]);
188
fprintf (stdout, "11\n%.6f\n", dxf_quads[i++]);
189
fprintf (stdout, "21\n%.6f\n", dxf_quads[i++]);
190
fprintf (stdout, "31\n%.6f\n", dxf_quads[i++]);
192
fprintf (stdout, "12\n%.6f\n", dxf_quads[i+3]); /* funky quad strip */
193
fprintf (stdout, "22\n%.6f\n", dxf_quads[i+4]); /* vert order: 1243. */
194
fprintf (stdout, "32\n%.6f\n", dxf_quads[i+5]);
196
fprintf (stdout, "13\n%.6f\n", dxf_quads[i]);
197
fprintf (stdout, "23\n%.6f\n", dxf_quads[i+1]);
198
fprintf (stdout, "33\n%.6f\n", dxf_quads[i+2]);
201
dxf_quads[0] = dxf_quads[6];
202
dxf_quads[1] = dxf_quads[7];
203
dxf_quads[2] = dxf_quads[8];
204
dxf_quads[3] = dxf_quads[9];
205
dxf_quads[4] = dxf_quads[10];
206
dxf_quads[5] = dxf_quads[11];
211
case GL_TRIANGLE_FAN:
212
if (dxf_point < 3) return;
214
fprintf (stdout, "0\n3DFACE\n8\n%d\n62\n%d\n", dxf_layer, dxf_color);
215
fprintf (stdout, "10\n%.6f\n", dxf_quads[i++]);
216
fprintf (stdout, "20\n%.6f\n", dxf_quads[i++]);
217
fprintf (stdout, "30\n%.6f\n", dxf_quads[i++]);
219
fprintf (stdout, "11\n%.6f\n", dxf_quads[i++]);
220
fprintf (stdout, "21\n%.6f\n", dxf_quads[i++]);
221
fprintf (stdout, "31\n%.6f\n", dxf_quads[i++]);
223
fprintf (stdout, "12\n%.6f\n", dxf_quads[i++]);
224
fprintf (stdout, "22\n%.6f\n", dxf_quads[i++]);
225
fprintf (stdout, "32\n%.6f\n", dxf_quads[i++]);
228
fprintf (stdout, "13\n%.6f\n", dxf_quads[i++]); /* dup pt 4 as pt 3. */
229
fprintf (stdout, "23\n%.6f\n", dxf_quads[i++]);
230
fprintf (stdout, "33\n%.6f\n", dxf_quads[i++]);
233
if (dxf_type == GL_TRIANGLE_FAN)
235
dxf_quads[3] = dxf_quads[6];
236
dxf_quads[4] = dxf_quads[7];
237
dxf_quads[5] = dxf_quads[8];
246
if (dxf_point_total == 1)
253
if (dxf_point < 2) return;
255
fprintf (stdout, "0\nLINE\n8\n%d\n62\n%d\n", dxf_layer, dxf_color);
257
fprintf (stdout, "10\n%.6f\n", dxf_quads[i++]);
258
fprintf (stdout, "20\n%.6f\n", dxf_quads[i++]);
259
fprintf (stdout, "30\n%.6f\n", dxf_quads[i++]);
261
fprintf (stdout, "11\n%.6f\n", dxf_quads[i++]);
262
fprintf (stdout, "21\n%.6f\n", dxf_quads[i++]);
263
fprintf (stdout, "31\n%.6f\n", dxf_quads[i++]);
266
if (dxf_type != GL_LINES)
268
dxf_quads[0] = dxf_quads[3];
269
dxf_quads[1] = dxf_quads[4];
270
dxf_quads[2] = dxf_quads[5];
284
if (dxf_type == GL_LINE_LOOP) /* close loop */
285
glVertex3f (dxf_quads[6], dxf_quads[7], dxf_quads[8]);
295
fprintf (stdout, "0\nSECTION\n2\nHEADER\n0\nENDSEC\n");
296
fprintf (stdout, "0\nSECTION\n2\nENTITIES\n");
302
fprintf (stdout, "0\nENDSEC\n0\nEOF\n");
306
# define unit_tube dxf_unit_tube
307
# define unit_cone dxf_unit_cone
308
# define tube_1 dxf_tube_1
309
# define tube dxf_tube
310
# define cone dxf_cone
313
#endif /* DXF_OUTPUT_HACK */
117
317
/* Calculate the angle (in degrees) between two vectors.