X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fglx%2Fdnalogo.c;h=2b24f8311c74b8060377bdab84e6ac8b49f76998;hb=c85f503f5793839a6be4c818332aca4a96927bb2;hp=f9a55ef92110418e17858aa47eac1394f578f9cd;hpb=4361b69d3178d7fc98d0388f9a223af6c2651aba;p=xscreensaver diff --git a/hacks/glx/dnalogo.c b/hacks/glx/dnalogo.c index f9a55ef9..2b24f831 100644 --- a/hacks/glx/dnalogo.c +++ b/hacks/glx/dnalogo.c @@ -1,4 +1,4 @@ -/* DNA Logo, Copyright (c) 2001-2016 Jamie Zawinski +/* DNA Logo, Copyright (c) 2001-2018 Jamie Zawinski * * DNA Lounge * @@ -31,17 +31,17 @@ "*wallFacets: 360 \n" \ "*barFacets: 90 \n" \ "*clockwise: False \n" \ - "*turns: 0.69 \n" \ - "*turnSpacing: 2.2 \n" \ - "*barSpacing: 0.24 \n" \ - "*wallHeight: 0.45 \n" \ + "*turns: 0.72 \n" \ + "*turnSpacing: 2.3 \n" \ + "*barSpacing: 0.268 \n" \ + "*wallHeight: 0.42 \n" \ "*wallThickness: 0.12 \n" \ "*barThickness: 0.058 \n" \ "*wallTaper: 0.95 \n" \ - "*gasketSize: 1.88 \n" \ + "*gasketSize: 2.0 \n" \ "*gasketDepth: 0.15 \n" \ "*gasketThickness: 0.4 \n" \ - "*frameSize: 1.20 \n" \ + "*frameSize: 1.28 \n" \ "*frameDepth: 0.01 \n" \ "*frameThickness: 0.03 \n" \ "*triangleSize: 0.045 \n" \ @@ -67,7 +67,7 @@ # define CWFONT "-*-helvetica-medium-r-normal-*-*-240-*-*-*-*-*-*" # endif -# define refresh_logo 0 +# define free_logo 0 # define release_logo 0 #undef countof #define countof(x) (sizeof((x))/sizeof((*x))) @@ -107,7 +107,9 @@ typedef enum { HELIX_IN, HELIX, HELIX_OUT, PIZZA_IN, PIZZA, PIZZA_OUT, HELIX_AND_PIZZA, +# ifdef CW CODEWORD_IN, CODEWORD, CODEWORD_OUT, CODEWORD_BLANK +# endif } glyph_mode; typedef struct { @@ -150,6 +152,7 @@ typedef struct { GLfloat frame_thickness; GLfloat triangle_size; +# ifdef CW int codeword_facets, codeword_disc_facets; GLfloat codeword_spread, codeword_line_width, codeword_thickness; GLfloat codeword_cap_size; @@ -162,6 +165,12 @@ typedef struct { XYZ *codeword_guides; GLfloat codeword_color[4], codeword_bg[4]; texture_font_data *font; +# endif + +# ifdef DEBUG + GLfloat persp_off, pos_off; + texture_font_data *label_font; +# endif GLfloat speed; glyph_mode mode; @@ -170,7 +179,9 @@ typedef struct { spinner gasket_spinnerx, gasket_spinnery, gasket_spinnerz; spinner scene_spinnerx, scene_spinnery; /* for DNA */ +# ifdef CW rotator *scene_rot; /* for Codeword */ +# endif spinner helix_spinnerz; spinner pizza_spinnery, pizza_spinnerz; spinner frame_spinner; @@ -190,9 +201,11 @@ static XrmOptionDescRec opts[] = { { "-pizza", ".mode", XrmoptionNoArg, "pizza" }, { "-helix", ".mode", XrmoptionNoArg, "helix" }, { "-both", ".mode", XrmoptionNoArg, "both" }, +# ifdef CW { "-codeword", ".mode", XrmoptionNoArg, "codeword" }, { "-cw", ".mode", XrmoptionNoArg, "codeword" }, { "-text", ".text", XrmoptionSepArg, 0 }, +# endif }; ENTRYPOINT ModeSpecOpt logo_opts = {countof(opts), opts, 0, NULL, NULL}; @@ -501,6 +514,9 @@ vector_angle (double ax, double ay, double az, return (angle); } + +# ifdef CW + static void normalize (XYZ *p) { @@ -524,6 +540,8 @@ dot (const XYZ u, const XYZ v) return (u.x * v.x) + (u.y * v.y) + (u.z * v.z); } +#endif /* CW */ + /* Make the helix */ @@ -547,7 +565,7 @@ make_helix (logo_configuration *dc, int facetted, int wire) th = 0; x1 = 1; y1 = 0; - x1b = 1 - dc->wall_thickness; + x1b = 1; y1b = 0; z1 = -(dc->turn_spacing * dc->turns / 2); @@ -578,13 +596,13 @@ make_helix (logo_configuration *dc, int facetted, int wire) while (th + th_inc <= max_th) { + GLfloat thick = dc->wall_thickness; + th += th_inc; x2 = cos (th); y2 = sin (th); z2 = z1 + z_inc; - x2b = x2 * (1 - dc->wall_thickness); - y2b = y2 * (1 - dc->wall_thickness); h2 = h1; h2off = h1off; @@ -600,6 +618,11 @@ make_helix (logo_configuration *dc, int facetted, int wire) h2off = h2 - dc->wall_height/2; else h2off = dc->wall_height/2 - h2; + + if (th + th_inc <= 0) + thick = 0; + else + thick *= cos (M_PI / 2 * (1 - (th / dc->wall_taper))); } else if (th >= max_th - dc->wall_taper) { @@ -613,9 +636,17 @@ make_helix (logo_configuration *dc, int facetted, int wire) h2off = dc->wall_height/2 - h2; else h2off = h2 - dc->wall_height/2; + + if (th + th_inc > max_th) + thick = 0; + else + thick *= cos(M_PI / 2 * (1 - ((max_th - th)/dc->wall_taper))); } } + x2b = x2 * (1 - thick); + y2b = y2 * (1 - thick); + /* outer face */ glFrontFace(GL_CW); @@ -729,6 +760,11 @@ make_ladder (logo_configuration *dc, int facetted, int wire) th = (max_th * pad_ratio/2); z = -(max_z / 2) + (max_z * pad_ratio/2); + /* ##### WHYYYYYY */ + /* The image is not reflected across line y = -x and I don't know why. */ + th += M_PI * -0.035; + z -= 0.08; + if (!dc->clockwise) z = -z, z_inc = -z_inc; @@ -1916,6 +1952,8 @@ make_pizza (logo_configuration *dc, int facetted, int wire) } +# ifdef CW + /* Upcase string, convert Unicrud to ASCII, remove any non-letters. */ static char * @@ -2713,26 +2751,35 @@ draw_codeword_path (ModeInfo *mi) return polys; } +#endif /* CW */ + - -/* Window management, etc - */ ENTRYPOINT void reshape_logo (ModeInfo *mi, int width, int height) { +# ifdef DEBUG + logo_configuration *dc = &dcs[MI_SCREEN(mi)]; +# endif GLfloat h = (GLfloat) height / (GLfloat) width; + GLfloat persp = 64; /* 30 */ + GLfloat pos = 13; /* 30 */ + +# ifdef DEBUG + persp += dc->persp_off; + pos += dc->pos_off; +# endif glViewport (0, 0, (GLint) width, (GLint) height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); - gluPerspective (30.0, 1/h, 1.0, 100.0); + gluPerspective (persp, 1/h, 1, 100); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - gluLookAt( 0.0, 0.0, 30.0, - 0.0, 0.0, 0.0, - 0.0, 1.0, 0.0); + gluLookAt( 0, 0, pos, + 0, 0, 0, + 0, 1, 0); # ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */ { @@ -2790,7 +2837,7 @@ init_logo (ModeInfo *mi) exit (1); } - MI_INIT (mi, dcs, NULL); + MI_INIT (mi, dcs); dc = &dcs[MI_SCREEN(mi)]; @@ -2820,6 +2867,7 @@ init_logo (ModeInfo *mi) dc->triangle_size = get_float_resource(mi->dpy, "triangleSize", "Float"); dc->speed = get_float_resource(mi->dpy, "speed", "Float"); +# ifdef CW dc->codeword_text = get_string_resource(mi->dpy, "text", "String"); dc->codeword_text = codeword_simplify_text (dc->codeword_text); dc->codeword_text_out = @@ -2835,6 +2883,7 @@ init_logo (ModeInfo *mi) dc->codeword_line_width = get_float_resource(mi->dpy, "cwLineWidth", "Float"); dc->codeword_thickness = get_float_resource(mi->dpy, "cwThickness", "Float"); dc->codeword_cap_size = get_float_resource(mi->dpy, "cwCapSize", "Float"); +# endif { char *s = get_string_resource (MI_DISPLAY (mi), "mode", "String"); @@ -2844,12 +2893,14 @@ init_logo (ModeInfo *mi) dc->mode = PIZZA; else if (!strcasecmp (s, "both")) dc->mode = HELIX_AND_PIZZA; +# ifdef CW else if (!strcasecmp (s, "codeword")) dc->mode = CODEWORD_IN; +# endif else { fprintf (stderr, - "%s: mode must be helix, pizza, both or codeword, not \"%s\"\n", + "%s: mode must be helix, pizza or both, not \"%s\"\n", progname, s); exit (1); } @@ -2861,8 +2912,14 @@ init_logo (ModeInfo *mi) dc->anim_ratio = 0; } +# ifdef CW if (dc->mode == CODEWORD_IN) dc->font = load_texture_font (MI_DISPLAY(mi), "cwFont"); +# endif + +# ifdef DEBUG + dc->label_font = load_texture_font (MI_DISPLAY(mi), "fpsFont"); +# endif { XColor xcolor; @@ -2900,6 +2957,7 @@ init_logo (ModeInfo *mi) exit (1); } +# ifdef CW dc->codeword_color[0] = xcolor.red / 65535.0; dc->codeword_color[1] = xcolor.green / 65535.0; dc->codeword_color[2] = xcolor.blue / 65535.0; @@ -2922,6 +2980,7 @@ init_logo (ModeInfo *mi) dc->codeword_bg[1] = xcolor.green / 65535.0; dc->codeword_bg[2] = xcolor.blue / 65535.0; dc->codeword_bg[3] = 1.0; +# endif /* CW */ } dc->trackball = gltrackball_init (False); @@ -2949,11 +3008,13 @@ init_logo (ModeInfo *mi) dc->scene_spinnerx.easement = 0.1; dc->scene_spinnery.easement = 0.1; +# ifdef CW if (dc->mode == CODEWORD_IN) { double tilt_speed = 0.003; dc->scene_rot = make_rotator (0, 0, 0, 0, tilt_speed, True); } +# endif /* start the frame off-screen */ dc->frame_spinner.spinning_p = True; @@ -3076,8 +3137,9 @@ init_logo (ModeInfo *mi) if (do_frame) dc->polys[6] += make_frame (dc, 1); glEndList (); +# ifdef CW make_codeword_path (mi); - +# endif /* When drawing both solid and wireframe objects, make sure the wireframe actually shows up! */ @@ -3100,6 +3162,22 @@ logo_handle_event (ModeInfo *mi, XEvent *event) KeySym keysym; char c = 0; XLookupString (&event->xkey, &c, 1, &keysym, 0); + +# ifdef DEBUG + { + GLfloat step = 0.1; + if (c == 'a') dc->persp_off += step; + else if (c == 'z') dc->persp_off -= step; + else if (c == 's') dc->pos_off += step; + else if (c == 'x') dc->pos_off -= step; + else return False; + + /* dc->pos_off = -dc->persp_off; */ + reshape_logo (mi, MI_WIDTH(mi), MI_HEIGHT(mi)); + return True; + } +# endif + if (c == ' ' || c == '\t') { switch (dc->anim_state) { @@ -3111,10 +3189,12 @@ logo_handle_event (ModeInfo *mi, XEvent *event) dc->anim_state = PIZZA_OUT; dc->anim_ratio = 0.0; return True; +# ifdef CW case CODEWORD: dc->anim_state = CODEWORD_OUT; dc->anim_ratio = 0.0; return True; +# endif default: break; } @@ -3201,7 +3281,9 @@ draw_logo (ModeInfo *mi) GLfloat specular[] = {0.8, 0.8, 0.8, 1.0}; GLfloat shininess = 50.0; Bool pizza_p; +# ifdef CW Bool codeword_p; +# endif if (!dc->glx_context) return; @@ -3216,6 +3298,7 @@ draw_logo (ModeInfo *mi) (random() % 200) + (random() % 200)); +# ifndef DEBUG tick_spinner (mi, &dc->gasket_spinnerx); tick_spinner (mi, &dc->gasket_spinnery); tick_spinner (mi, &dc->gasket_spinnerz); @@ -3226,6 +3309,7 @@ draw_logo (ModeInfo *mi) tick_spinner (mi, &dc->scene_spinnery); tick_spinner (mi, &dc->frame_spinner); link_spinners (mi, &dc->scene_spinnerx, &dc->scene_spinnery); +# endif /* DEBUG */ switch (dc->anim_state) { @@ -3278,6 +3362,7 @@ draw_logo (ModeInfo *mi) break; +# ifdef CW case CODEWORD_IN: dc->scene_spinnerx.probability = 0.2; dc->scene_spinnery.probability = 0.05; @@ -3325,20 +3410,28 @@ draw_logo (ModeInfo *mi) dc->anim_state = CODEWORD_IN; } break; +# endif /* CW */ default: abort(); break; } +# ifdef DEBUG + dc->anim_state = HELIX; + dc->wire_overlay = 0; +# endif + pizza_p = (dc->anim_state == PIZZA || dc->anim_state == PIZZA_IN || dc->anim_state == PIZZA_OUT); +# ifdef CW codeword_p = (dc->anim_state == CODEWORD || dc->anim_state == CODEWORD_IN || dc->anim_state == CODEWORD_OUT || dc->anim_state == CODEWORD_BLANK); +# endif glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -3352,7 +3445,9 @@ draw_logo (ModeInfo *mi) /* Draw frame before trackball rotation */ +# ifdef CW if (! codeword_p) +# endif { GLfloat p = (dc->frame_spinner.position_eased >= 0 ? dc->frame_spinner.position_eased @@ -3393,7 +3488,9 @@ draw_logo (ModeInfo *mi) glRotatef(90, 1, 0, 0); glRotatef(90, 0, 0, 1); +# ifdef CW if (! codeword_p) +# endif { glRotatef (360 * dc->scene_spinnerx.position_eased, 0, 1, 0); glRotatef (360 * dc->scene_spinnery.position_eased, 0, 0, 1); @@ -3492,19 +3589,20 @@ draw_logo (ModeInfo *mi) mi->polygon_count += dc->polys[0]; } } +# ifdef CW else /* codeword_p */ { -# if 0 +# if 0 double max = 70; /* face front */ double x, y, z; get_position (dc->scene_rot, &x, &y, &z, !dc->button_down_p); glRotatef (max/2 - x*max, 0, 0, 1); glRotatef (max/2 - y*max, 0, 1, 0); /* glRotatef (max/2 - z*max, 1, 0, 0); */ -# else +# else glRotatef (360 * dc->scene_spinnerx.position_eased, 0, 1, 0); glRotatef (360 * dc->scene_spinnery.position_eased, 0, 0, 1); -# endif +# endif glClearColor (dc->codeword_bg[0], dc->codeword_bg[1], @@ -3512,12 +3610,24 @@ draw_logo (ModeInfo *mi) dc->codeword_bg[3]); mi->polygon_count += draw_codeword_path (mi); } +# endif /* CW */ } glPopMatrix(); if (dc->wire_overlay > 0) dc->wire_overlay--; +# ifdef DEBUG + { + char s[1024]; + sprintf (s, "a/z, s/x; per = %0.2f pos = %0.2f", + dc->persp_off, dc->pos_off); + glColor3f (1,1,1); + print_texture_label (dpy, dc->label_font, MI_WIDTH(mi), MI_HEIGHT(mi), + 1, s); + } +# endif + if (mi->fps_p) do_fps (mi); glFinish();