~ubuntu-branches/ubuntu/raring/xscreensaver/raring

« back to all changes in this revision

Viewing changes to hacks/glx/dnalogo.c

  • Committer: Bazaar Package Importer
  • Author(s): Robert Ancell
  • Date: 2010-11-17 15:40:52 UTC
  • mfrom: (1.1.10 upstream)
  • Revision ID: james.westby@ubuntu.com-20101117154052-w4ou7vty38gpp1r3
Tags: 5.12-0ubuntu1
New upstream release

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* DNA Logo, Copyright (c) 2001, 2002, 2003 Jamie Zawinski <jwz@jwz.org>
 
1
/* DNA Logo, Copyright (c) 2001-2010 Jamie Zawinski <jwz@jwz.org>
2
2
 *
3
3
 * Permission to use, copy, modify, distribute, and sell this software and its
4
4
 * documentation for any purpose is hereby granted without fee, provided that
113
113
#define PROBABILITY_SCALE 600
114
114
 
115
115
 
 
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?
 
121
                          */
 
122
 
 
123
# define glBegin    dxf_glBegin
 
124
# define glVertex3f dxf_glVertex3f
 
125
# define glEnd      dxf_glEnd
 
126
 
 
127
static int dxf_type, dxf_point, dxf_point_total, dxf_layer, dxf_color;
 
128
static GLfloat dxf_quads[4*4];
 
129
 
 
130
static void
 
131
dxf_glBegin (int type)
 
132
{
 
133
  dxf_type = type; 
 
134
  dxf_point = 0;
 
135
  dxf_point_total = 0;
 
136
}
 
137
 
 
138
static void
 
139
dxf_glVertex3f (GLfloat ox, GLfloat oy, GLfloat oz)
 
140
{
 
141
  int i = 0;
 
142
  GLfloat m[4*4];
 
143
  GLfloat x, y, z;
 
144
 
 
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];
 
150
 
 
151
  dxf_quads[dxf_point*3+0] = x;
 
152
  dxf_quads[dxf_point*3+1] = y;
 
153
  dxf_quads[dxf_point*3+2] = z;
 
154
  dxf_point++;
 
155
  dxf_point_total++;
 
156
 
 
157
  switch (dxf_type) {
 
158
  case GL_QUADS:
 
159
    if (dxf_point < 4) return;
 
160
 
 
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++]);
 
165
 
 
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++]);
 
169
 
 
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++]);
 
173
 
 
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++]);
 
177
    dxf_point = 0;
 
178
    break;
 
179
 
 
180
  case GL_QUAD_STRIP:
 
181
    if (dxf_point < 4) return;
 
182
 
 
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++]);
 
187
 
 
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++]);
 
191
 
 
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]);
 
195
 
 
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]);
 
199
    i += 6;
 
200
 
 
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];
 
207
    dxf_point = 2;
 
208
    break;
 
209
 
 
210
  case GL_TRIANGLES:
 
211
  case GL_TRIANGLE_FAN:
 
212
    if (dxf_point < 3) return;
 
213
 
 
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++]);
 
218
 
 
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++]);
 
222
 
 
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++]);
 
226
 
 
227
    i -= 3;
 
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++]);
 
231
 
 
232
    dxf_point = 0;
 
233
    if (dxf_type == GL_TRIANGLE_FAN)
 
234
      {
 
235
        dxf_quads[3] = dxf_quads[6];
 
236
        dxf_quads[4] = dxf_quads[7];
 
237
        dxf_quads[5] = dxf_quads[8];
 
238
        dxf_point = 2;
 
239
      }
 
240
    break;
 
241
 
 
242
  case GL_LINES:
 
243
  case GL_LINE_STRIP:
 
244
  case GL_LINE_LOOP:
 
245
 
 
246
    if (dxf_point_total == 1)
 
247
      {
 
248
        dxf_quads[6] = ox;
 
249
        dxf_quads[7] = oy;
 
250
        dxf_quads[8] = oz;
 
251
      }
 
252
 
 
253
    if (dxf_point < 2) return;
 
254
 
 
255
    fprintf (stdout, "0\nLINE\n8\n%d\n62\n%d\n", dxf_layer, dxf_color);
 
256
 
 
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++]);
 
260
 
 
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++]);
 
264
 
 
265
    dxf_point = 0;
 
266
    if (dxf_type != GL_LINES)
 
267
      {
 
268
        dxf_quads[0] = dxf_quads[3];
 
269
        dxf_quads[1] = dxf_quads[4];
 
270
        dxf_quads[2] = dxf_quads[5];
 
271
        dxf_point = 1;
 
272
      }
 
273
    break;
 
274
 
 
275
  default:
 
276
    abort();
 
277
    break;
 
278
  }
 
279
}
 
280
 
 
281
static void
 
282
dxf_glEnd(void)
 
283
{
 
284
  if (dxf_type == GL_LINE_LOOP)  /* close loop */
 
285
    glVertex3f (dxf_quads[6], dxf_quads[7], dxf_quads[8]);
 
286
  dxf_type = -1;
 
287
  dxf_point = 0;
 
288
  dxf_point_total = 0;
 
289
}
 
290
 
 
291
 
 
292
static void
 
293
dxf_start (void)
 
294
{
 
295
  fprintf (stdout, "0\nSECTION\n2\nHEADER\n0\nENDSEC\n");
 
296
  fprintf (stdout, "0\nSECTION\n2\nENTITIES\n");
 
297
}
 
298
 
 
299
static void
 
300
dxf_end (void)
 
301
{
 
302
  fprintf (stdout, "0\nENDSEC\n0\nEOF\n");
 
303
  exit (0);
 
304
}
 
305
 
 
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
 
311
# include "tube.c"
 
312
 
 
313
#endif /* DXF_OUTPUT_HACK */
 
314
 
 
315
 
116
316
 
117
317
/* Calculate the angle (in degrees) between two vectors.
118
318
 */
351
551
  if (!dc->clockwise)
352
552
    z = -z, z_inc = -z_inc;
353
553
 
 
554
  glFrontFace(GL_CCW);
354
555
  for (i = 0; i < nbars; i++)
355
556
    {
356
557
      int facets = dc->bar_facets / (facetted ? 14 : 1);
402
603
 
403
604
  glPushMatrix();
404
605
 
 
606
# ifdef DXF_OUTPUT_HACK
 
607
  if (! wire) res *= 8;
 
608
# endif
 
609
 
405
610
# define POINT(r,th) \
406
611
    ctrl_r [nctrls] = r, \
407
612
    ctrl_th[nctrls] = (th * d2r), \
449
654
  POINT (0.880, 319.74);
450
655
  POINT (0.990, 320.08);
451
656
 
452
 
  POINT (r4,  338.5);
 
657
  POINT (r4,  338.0);
453
658
  if (! wire)
454
659
    {
455
 
      POINT (r1a, 338.5);      /* cut-out disc */
456
 
      POINT (r1a, 343.5);
 
660
      POINT (r1a, 338.0);      /* cut-out disc */
 
661
      POINT (r1a, 344.0);
457
662
    }
458
 
  POINT (r4,  343.5);
 
663
  POINT (r4,  344.0);
459
664
  POINT (r4,  356.0);
460
665
 
461
666
  POINT (0.872, 356.05);   /* top indentation, left half */
670
875
    GLfloat th;
671
876
    npoints = 0;
672
877
 
673
 
    th = 338.5 * d2r;
 
878
    th = 338.0 * d2r;
674
879
    pointsx0[npoints] = r1c * cos(th) * dc->gasket_size;
675
880
    pointsy0[npoints] = r1c * sin(th) * dc->gasket_size;
676
881
    npoints++;
678
883
    pointsy0[npoints] = r4 * sin(th) * dc->gasket_size;
679
884
    npoints++;
680
885
 
681
 
    th = 343.5 * d2r;
 
886
    th = 344.0 * d2r;
682
887
    pointsx0[npoints] = r1c * cos(th) * dc->gasket_size;
683
888
    pointsy0[npoints] = r1c * sin(th) * dc->gasket_size;
684
889
    npoints++;
685
890
    pointsx0[npoints] = r4 * cos(th) * dc->gasket_size;
686
891
    pointsy0[npoints] = r4 * sin(th) * dc->gasket_size;
687
 
    npoints++;
688
892
 
689
893
    if (! wire)
690
894
      {
728
932
    /* Now make a donut.
729
933
     */
730
934
    {
731
 
      int nsteps = 12;
 
935
      int nsteps = (wire ? 12 : 64);
732
936
      GLfloat r0 = 0.04;
733
 
      GLfloat r1 = 0.060;
 
937
      GLfloat r1 = 0.070;
734
938
      GLfloat th, cth, sth;
735
939
 
736
940
      glPushMatrix ();
863
1067
      }
864
1068
 
865
1069
    npoints = 0;
866
 
    for (th = 0; th < M_PI; th += (M_PI / 6))
 
1070
    for (th = (wire ? 0 : -0.1);
 
1071
         th <= M_PI + 0.1;
 
1072
         th += (M_PI / (wire ? 5 : 32)))
867
1073
      {
868
1074
        pointsx0[npoints] = w/2 * cos(th);
869
1075
        pointsy0[npoints] = w/2 * sin(th);
1211
1417
                                   * dc->speed);
1212
1418
    }
1213
1419
 
 
1420
# ifdef DXF_OUTPUT_HACK
 
1421
  {
 
1422
    dc->frame_depth = dc->gasket_depth;
 
1423
    dxf_layer = 1;
 
1424
    dxf_color = 3;
 
1425
    dxf_start();
 
1426
    glPushMatrix();
 
1427
    glRotatef(90, 1, 0, 0);
 
1428
    glRotatef(90, 0, 0, 1);
 
1429
    glPushMatrix();
 
1430
    glRotatef(helix_rot, 0, 0, 1);
 
1431
    make_ladder (dc, 0, 0);
 
1432
    make_helix  (dc, 0, 0);
 
1433
    glRotatef (180, 0, 0, 1);
 
1434
    make_helix  (dc, 0, 0);
 
1435
    glPopMatrix();
 
1436
    dxf_layer++;
 
1437
    make_gasket (dc, 0);
 
1438
    dxf_layer++;
 
1439
    make_frame (dc, 0);
 
1440
    glPopMatrix();
 
1441
    dxf_end();
 
1442
  }
 
1443
# endif
 
1444
 
1214
1445
  glPushMatrix();
1215
1446
  dc->helix_list = glGenLists (1);
1216
1447
  glNewList (dc->helix_list, GL_COMPILE);