home *** CD-ROM | disk | FTP | other *** search
- /*
- * Copyright 1991, 1992, 1993, 1994, Silicon Graphics, Inc.
- * All Rights Reserved.
- *
- * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
- * the contents of this file may not be disclosed to third parties, copied or
- * duplicated in any form, in whole or in part, without the prior written
- * permission of Silicon Graphics, Inc.
- *
- * RESTRICTED RIGHTS LEGEND:
- * Use, duplication or disclosure by the Government is subject to restrictions
- * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
- * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
- * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
- * rights reserved under the Copyright Laws of the United States.
- */
- /*
- * Copyright (C) 1991, Silicon Graphics, Inc.
- * All Rights Reserved.
- */
- /*
- * Display a keyboard
- *
- * Routines:
- * def_kbd ()
- * display_keys (downs)
- * hilight_keys (downs)
- * display_slider (volume)
- *
- * Jim Bennett
- * 1991
- */
-
- #include <stdio.h>
- #include <math.h>
- #include <gl/gl.h>
- #include "globj.h"
-
- extern int valid_texture; /* Set by def_tex */
-
-
- static int keystate [TOTAL_KEYS] = {0};
-
- static float v1[3];
- static float t1[2];
-
- #define vx(x,y,z) v1[0]=(x); v1[1]=(y); v1[2] = -(z); v3f(v1)
- #define tx(s,t) t1[0]=(s); t1[1]=(t); t2f(t1)
-
- /*
- * Offset and object structure for keyboard
- */
-
- struct s_dspk
- {
- Object key;
- Object keytop;
- float xoff;
- float zoff;
- }
- dspkeys [TOTAL_KEYS];
-
- /*
- * static saved transformation variables (for displaying keys)
- */
-
- static float y_off;
- static float x_rot;
-
- /*
- * static saved location of slider panel, dimensions of
- * volume control peg
- */
-
- static float vslide_x;
-
- static float vslide_z1;
- static float vslide_z2;
-
- static float vslide_y1;
- static float vslide_y2;
-
- static float vpeg_w;
- static float vpeg_d;
-
- /*
- * static saved location of button patch and button dimensions
- */
-
- static float bpatch_x1;
- static float bpatch_x2;
-
- static float bpatch_z1;
- static float bpatch_z2;
-
- static float bpatch_y1;
- static float bpatch_y2;
-
- static float button_w;
- static float button_d;
-
- static float gap_w;
- static float gap_d;
-
-
- /*
- * def_kbd - Define all graphical objects for keyboard
- */
-
- def_kbd ()
-
- {
- float offset, intercept;
- float logo_w, key_w;
- int i;
- float cum_x, cum_z;
-
- def_tex (); /* Define texture for logo */
-
- offset = (CASE_W - INSET_W) / 2.0;
- intercept = FRONT_H + ((INSET_D/CASE_D) * (BACK_H - FRONT_H));
-
- /* Define the keyboard case, top, bottom, front, back, and sides */
-
- makeobj (CASE_OBJ);
- pushname (CASE_OBJ);
- RGBcolor (CASE_FRONT);
-
- bgnpolygon (); /* Front of case */
- vx (0.0, 0.0, 0.0);
- vx (offset, 0.0, 0.0);
- vx (offset, FRONT_H, 0.0);
- vx (0.0, FRONT_H, 0.0);
- endpolygon ();
- bgnpolygon ();
- vx (offset, 0.0, 0.0);
- vx (CASE_W-offset, 0.0, 0.0);
- vx (CASE_W-offset, FRONT_H-INSET_H, 0.0);
- vx (offset, FRONT_H-INSET_H, 0.0);
- endpolygon ();
- bgnpolygon ();
- vx (CASE_W-offset, 0.0, 0.0);
- vx (CASE_W, 0.0, 0.0);
- vx (CASE_W, FRONT_H, 0.0);
- vx (CASE_W-offset, FRONT_H, 0.0);
- endpolygon ();
-
- bgnpolygon (); /* Back of the case */
- vx (0.0, 0.0, CASE_D);
- vx (0.0, BACK_H, CASE_D);
- vx (CASE_W, BACK_H, CASE_D);
- vx (CASE_W, 0.0, CASE_D);
- endpolygon ();
-
- RGBcolor (CASE_TOP);
- bgnpolygon (); /* Top of case */
- vx (0.0, FRONT_H, 0.0);
- vx (offset, FRONT_H, 0.0);
- vx (offset, intercept, INSET_D);
- vx (0.0, intercept, INSET_D);
- endpolygon ();
-
- logo_w = CASE_D - INSET_D; /* Width of logo panel */
-
- bgnpolygon (); /* Tile to edge of logo */
- vx (0.0, intercept, INSET_D);
- vx (CASE_W-logo_w, intercept, INSET_D);
- vx (CASE_W-logo_w, BACK_H, CASE_D);
- vx (0.0, BACK_H, CASE_D);
- endpolygon ();
- bgnpolygon (); /* Draw panel without logo */
- vx (CASE_W-logo_w, intercept, INSET_D);
- vx (CASE_W, intercept, INSET_D);
- vx (CASE_W, BACK_H, CASE_D);
- vx (CASE_W-logo_w, BACK_H, CASE_D);
- endpolygon ();
- bgnpolygon ();
- vx (CASE_W-offset, FRONT_H, 0.0);
- vx (CASE_W, FRONT_H, 0.0);
- vx (CASE_W, intercept, INSET_D);
- vx (CASE_W-offset, intercept, INSET_D);
- endpolygon ();
-
- /* Case top finished, now paint on logo and title */
-
- if (valid_texture)
- {
- float logo_inset = logo_w/6.0;
- float title_inset = logo_w/3.0;
- float title_w = CASE_W/4.0;
- float intercept1 = FRONT_H +
- (((INSET_D+logo_inset)/CASE_D) * (BACK_H - FRONT_H));
- float intercept2 = FRONT_H +
- (((CASE_D-logo_inset)/CASE_D) * (BACK_H - FRONT_H));
-
- intercept1 = 1.0001 * intercept1;
- intercept2 = 1.0001 * intercept2;
-
- RGBcolor (CASE_FRONT);
- texbind (TX_TEXTURE_0, LOGO_TEX);
- tevbind (TV_ENV0, DECAL_ENV);
- bgnpolygon (); /* Draw panel with logo */
- tx (0.0, 0.0);
- vx ((CASE_W-logo_w)+logo_inset,
- intercept1, INSET_D+logo_inset);
- tx (1.0, 0.0);
- vx (CASE_W-logo_inset,
- intercept1, INSET_D+logo_inset);
- tx (1.0, 1.0);
- vx (CASE_W-logo_inset,
- intercept2, CASE_D-logo_inset);
- tx (0.0, 1.0);
- vx ((CASE_W-logo_w)+logo_inset,
- intercept2, CASE_D-logo_inset);
- endpolygon ();
-
- intercept1 = FRONT_H +
- (((INSET_D+title_inset)/CASE_D) * (BACK_H - FRONT_H));
- intercept2 = FRONT_H +
- (((CASE_D-title_inset)/CASE_D) * (BACK_H - FRONT_H));
-
- intercept1 = 1.0001 * intercept1;
- intercept2 = 1.0001 * intercept2;
-
- texbind (TX_TEXTURE_0, TITLE_TEX);
- bgnpolygon (); /* Draw panel with title */
- tx (0.0, 0.0);
- vx ((CASE_W/2.0) - (title_w/2.0),
- intercept1, INSET_D+title_inset);
- tx (1.0, 0.0);
- vx ((CASE_W/2.0) + (title_w/2.0),
- intercept1, INSET_D+title_inset);
- tx (1.0, 1.0);
- vx ((CASE_W/2.0) + (title_w/2.0),
- intercept2, CASE_D-title_inset);
- tx (0.0, 1.0);
- vx ((CASE_W/2.0) - (title_w/2.0),
- intercept2, CASE_D-title_inset);
- endpolygon ();
- texbind (TX_TEXTURE_0, 0);
- tevbind (TV_ENV0, 0);
- RGBcolor (CASE_TOP);
- }
-
- bgnpolygon (); /* Bottom of the case */
- vx (0.0, 0.0, 0.0);
- vx (0.0, 0.0, CASE_D);
- vx (CASE_W, 0.0, CASE_D);
- vx (CASE_W, 0.0, 0.0);
- endpolygon ();
-
- RGBcolor (CASE_SIDE);
- bgnpolygon (); /* Both sides of the case */
- vx (0.0, 0.0, 0.0);
- vx (0.0, FRONT_H, 0.0);
- vx (0.0, BACK_H, CASE_D);
- vx (0.0, 0.0, CASE_D);
- endpolygon ();
- bgnpolygon ();
- vx (CASE_W, 0.0, 0.0);
- vx (CASE_W, 0.0, CASE_D);
- vx (CASE_W, BACK_H, CASE_D);
- vx (CASE_W, FRONT_H, 0.0);
- endpolygon ();
-
- RGBcolor (CASE_FRONT);
- bgnpolygon (); /* Base of inset */
- vx (offset, FRONT_H-INSET_H, 0.0);
- vx (CASE_W-offset, FRONT_H-INSET_H, 0.0);
- vx (CASE_W-offset, intercept-INSET_H, INSET_D);
- vx (offset, intercept-INSET_H, INSET_D);
- endpolygon ();
-
- bgnpolygon (); /* Sides of inset */
- vx (offset, FRONT_H-INSET_H, 0.0);
- vx (offset, intercept-INSET_H, INSET_D);
- vx (offset, intercept, INSET_D);
- vx (offset, FRONT_H, 0.0);
- endpolygon ();
- bgnpolygon ();
- vx (CASE_W-offset, FRONT_H-INSET_H, 0.0);
- vx (CASE_W-offset, FRONT_H, 0.0);
- vx (CASE_W-offset, intercept, INSET_D);
- vx (CASE_W-offset, intercept-INSET_H, INSET_D);
- endpolygon ();
-
- bgnpolygon (); /* Back of inset */
- vx (offset, intercept-INSET_H, INSET_D);
- vx (CASE_W-offset, intercept-INSET_H, INSET_D);
- vx (CASE_W-offset, intercept, INSET_D);
- vx (offset, intercept, INSET_D);
- endpolygon ();
- popname ();
- closeobj (); /* END of CASE_OBJ */
-
-
- /* Define objects for the volume control */
-
- makeobj (VSLIDER);
- pushname (VSLIDER);
- { /* Draw the volume slider */
- float vslide_inset = offset/3.0;
-
- vslide_x = CASE_W - (offset/2.0);
-
- vslide_z1 = vslide_inset;
- vslide_z2 = INSET_D;
-
- vslide_y1 = 1.0001 * (FRONT_H +
- ((vslide_inset/CASE_D) * (BACK_H - FRONT_H)) );
- vslide_y2 = 1.0001 * intercept;
-
- vpeg_w = vslide_inset * 0.65;
- vpeg_d = (vslide_z2 - vslide_z1) * 0.08;
-
- RGBcolor (CASE_FRONT);
- bgnpolygon ();
- vx ((CASE_W-offset)+vslide_inset,
- vslide_y1, vslide_z1);
- vx (CASE_W-vslide_inset, vslide_y1, vslide_z1);
- vx (CASE_W-vslide_inset, vslide_y2, vslide_z2);
- vx ((CASE_W-offset)+vslide_inset,
- vslide_y2, vslide_z2);
- endpolygon ();
- }
- popname ();
- closeobj (); /* END of VSLIDER */
-
- makeobj (VPEG);
- pushname (VPEG);
- RGBcolor (WHITE_KEY_TOP);
- bgnpolygon (); /* Top surface */
- vx (0.0, VPEG_H, 0.0);
- vx (vpeg_w, VPEG_H, 0.0);
- vx (vpeg_w, VPEG_H, vpeg_d);
- vx (0.0, VPEG_H, vpeg_d);
- endpolygon ();
-
- RGBcolor (WHITE_KEY_SIDE);
- bgnpolygon (); /* Front surface */
- vx (0.0, 0.0, 0.0);
- vx (vpeg_w, 0.0, 0.0);
- vx (vpeg_w, VPEG_H, 0.0);
- vx (0.0, VPEG_H, 0.0);
- endpolygon ();
- bgnpolygon (); /* Side surfaces */
- vx (vpeg_w, 0.0, 0.0);
- vx (vpeg_w, 0.0, vpeg_d);
- vx (vpeg_w, VPEG_H, vpeg_d);
- vx (vpeg_w, VPEG_H, 0.0);
- endpolygon ();
- bgnpolygon ();
- vx (0.0, 0.0, vpeg_d);
- vx (0.0, 0.0, 0.0);
- vx (0.0, VPEG_H, 0.0);
- vx (0.0, VPEG_H, vpeg_d);
- endpolygon ();
- bgnpolygon (); /* Back surface */
- vx (vpeg_w, 0.0, vpeg_d);
- vx (0.0, 0.0, vpeg_d);
- vx (0.0, VPEG_H, vpeg_d);
- vx (vpeg_w, VPEG_H, vpeg_d);
- endpolygon ();
- popname ();
- closeobj (); /* END of VPEG */
-
- /* Define objects for the button panel (voice select) */
-
- makeobj (BPATCH);
- pushname (BPATCH);
- { /* Draw the background patch */
- float bpatch_inset = logo_w/6.0;
-
- bpatch_x1 = bpatch_inset;
- bpatch_x2 = (5.0*CASE_W)/16.0;
-
- bpatch_z1 = INSET_D + bpatch_inset;
- bpatch_z2 = CASE_D - bpatch_inset;
-
- bpatch_y1 = 1.0001 * (FRONT_H +
- ((bpatch_z1/CASE_D) * (BACK_H - FRONT_H)) );
- bpatch_y2 = 1.0001 * (FRONT_H +
- ((bpatch_z2/CASE_D) * (BACK_H - FRONT_H)) );
-
- RGBcolor (CASE_FRONT);
- bgnpolygon ();
- vx (bpatch_x1, bpatch_y1, bpatch_z1);
- vx (bpatch_x2, bpatch_y1, bpatch_z1);
- vx (bpatch_x2, bpatch_y2, bpatch_z2);
- vx (bpatch_x1, bpatch_y2, bpatch_z2);
- endpolygon ();
- }
- popname ();
- closeobj (); /* END of BPATCH */
-
- { /* Compute the button sizes and */
- /* spacings. */
- int nwide = NUM_BUTTONS/2;
- int nhigh = 2;
- int wgaps = nwide+1;
- int hgaps = nhigh+1;
-
- button_w = (0.6*(bpatch_x2-bpatch_x1)) / nwide;
- gap_w = (0.4*(bpatch_x2-bpatch_x1)) / wgaps;
- button_d = (0.4*(bpatch_z2-bpatch_z1)) / nhigh;
- gap_d = (0.6*(bpatch_z2-bpatch_z1)) / hgaps;
- }
-
- makeobj (SEL_BUTTON);
- RGBcolor (WHITE_KEY_TOP);
- bgnpolygon (); /* Top surface */
- vx (0.0, BUTTON_H, 0.0);
- vx (button_w, BUTTON_H, 0.0);
- vx (button_w, BUTTON_H, button_d);
- vx (0.0, BUTTON_H, button_d);
- endpolygon ();
-
- RGBcolor (WHITE_KEY_SIDE);
- bgnpolygon (); /* Front surface */
- vx (0.0, 0.0, 0.0);
- vx (button_w, 0.0, 0.0);
- vx (button_w, BUTTON_H, 0.0);
- vx (0.0, BUTTON_H, 0.0);
- endpolygon ();
- bgnpolygon (); /* Side surfaces */
- vx (button_w, 0.0, 0.0);
- vx (button_w, 0.0, button_d);
- vx (button_w, BUTTON_H, button_d);
- vx (button_w, BUTTON_H, 0.0);
- endpolygon ();
- bgnpolygon ();
- vx (0.0, 0.0, button_d);
- vx (0.0, 0.0, 0.0);
- vx (0.0, BUTTON_H, 0.0);
- vx (0.0, BUTTON_H, button_d);
- endpolygon ();
- bgnpolygon (); /* Back surface */
- vx (button_w, 0.0, button_d);
- vx (0.0, 0.0, button_d);
- vx (0.0, BUTTON_H, button_d);
- vx (button_w, BUTTON_H, button_d);
- endpolygon ();
- closeobj ();
-
- makeobj (DOWN_BUTTON);
- RGBcolor (WHITE_KEY_TOP);
- bgnpolygon (); /* Top surface */
- vx (0.0, DOWN_BUTTON_H, 0.0);
- vx (button_w, DOWN_BUTTON_H, 0.0);
- vx (button_w, DOWN_BUTTON_H, button_d);
- vx (0.0, DOWN_BUTTON_H, button_d);
- endpolygon ();
-
- RGBcolor (WHITE_KEY_SIDE);
- bgnpolygon (); /* Front surface */
- vx (0.0, 0.0, 0.0);
- vx (button_w, 0.0, 0.0);
- vx (button_w, DOWN_BUTTON_H, 0.0);
- vx (0.0, DOWN_BUTTON_H, 0.0);
- endpolygon ();
- bgnpolygon (); /* Side surfaces */
- vx (button_w, 0.0, 0.0);
- vx (button_w, 0.0, button_d);
- vx (button_w, DOWN_BUTTON_H, button_d);
- vx (button_w, DOWN_BUTTON_H, 0.0);
- endpolygon ();
- bgnpolygon ();
- vx (0.0, 0.0, button_d);
- vx (0.0, 0.0, 0.0);
- vx (0.0, DOWN_BUTTON_H, 0.0);
- vx (0.0, DOWN_BUTTON_H, button_d);
- endpolygon ();
- bgnpolygon (); /* Back surface */
- vx (button_w, 0.0, button_d);
- vx (0.0, 0.0, button_d);
- vx (0.0, DOWN_BUTTON_H, button_d);
- vx (button_w, DOWN_BUTTON_H, button_d);
- endpolygon ();
- closeobj ();
-
- key_w = 0.85 * (INSET_W/WHITE_KEYS);
- makeobj (KEYL);
-
- RGBcolor (WHITE_KEY_SIDE);
- bgnpolygon (); /* Front surface */
- vx (0.0, 0.0, 0.0);
- vx (key_w, 0.0, 0.0);
- vx (key_w, INSET_H, 0.0);
- vx (0.0, INSET_H, 0.0);
- endpolygon ();
-
- bgnpolygon (); /* Left side */
- vx (0.0, 0.0, 0.0);
- vx (0.0, INSET_H, 0.0);
- vx (0.0, INSET_H, INSET_D/3.0);
- vx (0.0, 0.0, INSET_D/3.0);
- endpolygon ();
-
- bgnpolygon (); /* Right side */
- vx (key_w, 0.0, 0.0);
- vx (key_w, 0.0, INSET_D);
- vx (key_w, INSET_H, INSET_D);
- vx (key_w, INSET_H, 0.0);
- endpolygon ();
-
- RGBcolor (WHITE_KEY_TOP);
- callobj (KEYL_TOP);
-
- closeobj (); /* END of KEYL */
-
- makeobj (KEYL_TOP);
- bgnpolygon (); /* Top surface */
- vx (0.0, INSET_H, 0.0);
- vx (key_w, INSET_H, 0.0);
- vx (key_w, INSET_H, INSET_D/3.0);
- vx (0.0, INSET_H, INSET_D/3.0);
- endpolygon ();
- bgnpolygon ();
- vx (key_w/3.0, INSET_H, INSET_D/3.0);
- vx (key_w, INSET_H, INSET_D/3.0);
- vx (key_w, INSET_H, INSET_D);
- vx (key_w/3.0, INSET_H, INSET_D);
- endpolygon ();
- closeobj (); /* END of KEYL_TOP */
-
-
- makeobj (KEYR);
-
- RGBcolor (WHITE_KEY_SIDE);
- bgnpolygon (); /* Front surface */
- vx (0.0, 0.0, 0.0);
- vx (key_w, 0.0, 0.0);
- vx (key_w, INSET_H, 0.0);
- vx (0.0, INSET_H, 0.0);
- endpolygon ();
-
- bgnpolygon (); /* Left side */
- vx (0.0, 0.0, 0.0);
- vx (0.0, INSET_H, 0.0);
- vx (0.0, INSET_H, INSET_D);
- vx (0.0, 0.0, INSET_D);
- endpolygon ();
-
- bgnpolygon (); /* Right side */
- vx (key_w, 0.0, 0.0);
- vx (key_w, 0.0, INSET_D/3.0);
- vx (key_w, INSET_H, INSET_D/3.0);
- vx (key_w, INSET_H, 0.0);
- endpolygon ();
-
- RGBcolor (WHITE_KEY_TOP);
- callobj (KEYR_TOP);
-
- closeobj (); /* END of KEYR */
-
- makeobj (KEYR_TOP);
- bgnpolygon (); /* Top surface */
- vx (0.0, INSET_H, 0.0);
- vx (key_w, INSET_H, 0.0);
- vx (key_w, INSET_H, INSET_D/3.0);
- vx (0.0, INSET_H, INSET_D/3.0);
- endpolygon ();
- bgnpolygon ();
- vx (0.0, INSET_H, INSET_D/3.0);
- vx ((2.0*key_w)/3.0, INSET_H, INSET_D/3.0);
- vx ((2.0*key_w)/3.0, INSET_H, INSET_D);
- vx (0.0, INSET_H, INSET_D);
- endpolygon ();
- closeobj (); /* END of KEYR_TOP */
-
-
- makeobj (KEYB);
-
- RGBcolor (WHITE_KEY_SIDE);
- bgnpolygon (); /* Front surface */
- vx (0.0, 0.0, 0.0);
- vx (key_w, 0.0, 0.0);
- vx (key_w, INSET_H, 0.0);
- vx (0.0, INSET_H, 0.0);
- endpolygon ();
-
- bgnpolygon (); /* Left side */
- vx (0.0, 0.0, 0.0);
- vx (0.0, INSET_H, 0.0);
- vx (0.0, INSET_H, INSET_D/3.0);
- vx (0.0, 0.0, INSET_D/3.0);
- endpolygon ();
-
- bgnpolygon (); /* Right side */
- vx (key_w, 0.0, 0.0);
- vx (key_w, 0.0, INSET_D/3.0);
- vx (key_w, INSET_H, INSET_D/3.0);
- vx (key_w, INSET_H, 0.0);
- endpolygon ();
-
- RGBcolor (WHITE_KEY_TOP);
- callobj (KEYB_TOP);
-
- closeobj (); /* END of KEYB */
-
- makeobj (KEYB_TOP);
- bgnpolygon (); /* Top surface */
- vx (0.0, INSET_H, 0.0);
- vx (key_w, INSET_H, 0.0);
- vx (key_w, INSET_H, INSET_D/3.0);
- vx (0.0, INSET_H, INSET_D/3.0);
- endpolygon ();
- bgnpolygon ();
- vx (key_w/3.0, INSET_H, INSET_D/3.0);
- vx ((2.0*key_w)/3.0, INSET_H, INSET_D/3.0);
- vx ((2.0*key_w)/3.0, INSET_H, INSET_D);
- vx (key_w/3.0, INSET_H, INSET_D);
- endpolygon ();
- closeobj (); /* END of KEYB_TOP */
-
-
- makeobj (KEYN);
-
- RGBcolor (WHITE_KEY_SIDE);
- bgnpolygon (); /* Front surface */
- vx (0.0, 0.0, 0.0);
- vx (key_w, 0.0, 0.0);
- vx (key_w, INSET_H, 0.0);
- vx (0.0, INSET_H, 0.0);
- endpolygon ();
-
- bgnpolygon (); /* Left side */
- vx (0.0, 0.0, 0.0);
- vx (0.0, INSET_H, 0.0);
- vx (0.0, INSET_H, INSET_D);
- vx (0.0, 0.0, INSET_D);
- endpolygon ();
-
- bgnpolygon (); /* Right side */
- vx (key_w, 0.0, 0.0);
- vx (key_w, 0.0, INSET_D);
- vx (key_w, INSET_H, INSET_D);
- vx (key_w, INSET_H, 0.0);
- endpolygon ();
-
- RGBcolor (WHITE_KEY_TOP);
- callobj (KEYN_TOP);
-
- closeobj (); /* END of KEYN */
-
- makeobj (KEYN_TOP);
- bgnpolygon (); /* Top surface */
- vx (0.0, INSET_H, 0.0);
- vx (key_w, INSET_H, 0.0);
- vx (key_w, INSET_H, INSET_D);
- vx (0.0, INSET_H, INSET_D);
- endpolygon ();
- closeobj (); /* END of KEYN_TOP */
-
-
- makeobj (BLKEY);
- RGBcolor (BLACK_KEY_SIDE);
- bgnpolygon (); /* Front surface */
- vx (0.0, 0.0, 0.0);
- vx ((2.0*key_w)/3.0, 0.0, 0.0);
- vx ((2.0*key_w)/3.0, BLACK_KEY_H, 0.0);
- vx (0.0, BLACK_KEY_H, 0.0);
- endpolygon ();
-
- bgnpolygon (); /* Left side */
- vx ((2.0*key_w)/3.0, 0.0, 0.0);
- vx ((2.0*key_w)/3.0, 0.0, (2.0*INSET_D)/3.0);
- vx ((2.0*key_w)/3.0, BLACK_KEY_H, (2.0*INSET_D)/3.0);
- vx ((2.0*key_w)/3.0, BLACK_KEY_H, 0.0);
- endpolygon ();
-
- bgnpolygon (); /* Right side */
- vx (0.0, 0.0, 0.0);
- vx (0.0, BLACK_KEY_H, 0.0);
- vx (0.0, BLACK_KEY_H, (2.0*INSET_D)/3.0);
- vx (0.0, 0.0, (2.0*INSET_D)/3.0);
- endpolygon ();
-
- RGBcolor (BLACK_KEY_TOP);
- callobj (BLKEY_TOP);
-
- closeobj (); /* END of BLKEY */
-
- makeobj (BLKEY_TOP);
- bgnpolygon (); /* Top surface */
- vx (0.0, BLACK_KEY_H, 0.0);
- vx ((2.0*key_w)/3.0, BLACK_KEY_H, 0.0);
- vx ((2.0*key_w)/3.0, BLACK_KEY_H, (2.0*INSET_D)/3.0);
- vx (0.0, BLACK_KEY_H, (2.0*INSET_D)/3.0);
- endpolygon ();
- closeobj (); /* END of BLKEY_TOP */
-
-
- makeobj (OCTAVE);
- pushmatrix ();
- callobj (KEYR);
- translate ((2.0*key_w)/3.0, 0.0, -INSET_D/3.0);
- callobj (BLKEY);
- translate ((INSET_W/WHITE_KEYS) - ((2.0*key_w)/3.0), 0.0, INSET_D/3.0);
-
- callobj (KEYB);
- translate ((2.0*key_w)/3.0, 0.0, -INSET_D/3.0);
- callobj (BLKEY);
- translate ((INSET_W/WHITE_KEYS) - ((2.0*key_w)/3.0), 0.0, INSET_D/3.0);
-
- callobj (KEYL);
- translate (INSET_W/WHITE_KEYS, 0.0, 0.0);
-
- callobj (KEYR);
- translate ((2.0*key_w)/3.0, 0.0, -INSET_D/3.0);
- callobj (BLKEY);
- translate ((INSET_W/WHITE_KEYS) - ((2.0*key_w)/3.0), 0.0, INSET_D/3.0);
-
- callobj (KEYB);
- translate ((2.0*key_w)/3.0, 0.0, -INSET_D/3.0);
- callobj (BLKEY);
- translate ((INSET_W/WHITE_KEYS) - ((2.0*key_w)/3.0), 0.0, INSET_D/3.0);
-
- callobj (KEYB);
- translate ((2.0*key_w)/3.0, 0.0, -INSET_D/3.0);
- callobj (BLKEY);
- translate ((INSET_W/WHITE_KEYS) - ((2.0*key_w)/3.0), 0.0, INSET_D/3.0);
-
- callobj (KEYL);
- popmatrix ();
- closeobj (); /* END of OCTAVE */
-
-
- makeobj (ALL_KEYS);
- pushmatrix ();
- translate (offset+(0.075*(INSET_W/WHITE_KEYS)), FRONT_H-INSET_H,
- INSET_D/20.0);
- rot (180.0 * fatan((BACK_H-FRONT_H)/CASE_D) / M_PI, 'x');
- callobj (OCTAVE);
- translate (7.0 * (INSET_W/WHITE_KEYS), 0.0, 0.0);
- callobj (OCTAVE);
- translate (7.0 * (INSET_W/WHITE_KEYS), 0.0, 0.0);
- callobj (OCTAVE);
- translate (7.0 * (INSET_W/WHITE_KEYS), 0.0, 0.0);
- callobj (OCTAVE);
- translate (7.0 * (INSET_W/WHITE_KEYS), 0.0, 0.0);
- callobj (OCTAVE);
- translate (7.0 * (INSET_W/WHITE_KEYS), 0.0, 0.0);
- callobj (KEYN);
- popmatrix ();
- closeobj (); /* END of ALL_KEYS */
-
- /* Objects all made, fill in the dspkeys structure */
- /* Set the initial offsets to the keys */
-
- cum_x = offset+(0.075*(INSET_W/WHITE_KEYS));
- cum_z = INSET_D/20.0;
-
- for (i=0; i<LAST_KEY; )
- {
- dspkeys[i].key = KEYR;
- dspkeys[i].keytop = KEYR_TOP;
- if (i != 0)
- {
- cum_x += INSET_W/WHITE_KEYS;
- cum_z += 0.0;
- }
- dspkeys[i].xoff = cum_x;
- dspkeys[i].zoff = cum_z;
- i++;
-
-
- dspkeys[i].key = BLKEY;
- dspkeys[i].keytop = BLKEY_TOP;
- cum_x += (2.0*key_w)/3.0;
- cum_z += -INSET_D/3.0;
- dspkeys[i].xoff = cum_x;
- dspkeys[i].zoff = cum_z;
- i++;
-
- dspkeys[i].key = KEYB;
- dspkeys[i].keytop = KEYB_TOP;
- cum_x += (INSET_W/WHITE_KEYS) - ((2.0*key_w)/3.0);
- cum_z += INSET_D/3.0;
- dspkeys[i].xoff = cum_x;
- dspkeys[i].zoff = cum_z;
- i++;
-
- dspkeys[i].key = BLKEY;
- dspkeys[i].keytop = BLKEY_TOP;
- cum_x += (2.0*key_w)/3.0;
- cum_z += -INSET_D/3.0;
- dspkeys[i].xoff = cum_x;
- dspkeys[i].zoff = cum_z;
- i++;
-
- dspkeys[i].key = KEYL;
- dspkeys[i].keytop = KEYL_TOP;
- cum_x += (INSET_W/WHITE_KEYS) - ((2.0*key_w)/3.0);
- cum_z += INSET_D/3.0;
- dspkeys[i].xoff = cum_x;
- dspkeys[i].zoff = cum_z;
- i++;
-
- dspkeys[i].key = KEYR;
- dspkeys[i].keytop = KEYR_TOP;
- cum_x += INSET_W/WHITE_KEYS;
- cum_z += 0.0;
- dspkeys[i].xoff = cum_x;
- dspkeys[i].zoff = cum_z;
- i++;
-
- dspkeys[i].key = BLKEY;
- dspkeys[i].keytop = BLKEY_TOP;
- cum_x += (2.0*key_w)/3.0;
- cum_z += -INSET_D/3.0;
- dspkeys[i].xoff = cum_x;
- dspkeys[i].zoff = cum_z;
- i++;
-
- dspkeys[i].key = KEYB;
- dspkeys[i].keytop = KEYB_TOP;
- cum_x += (INSET_W/WHITE_KEYS) - ((2.0*key_w)/3.0);
- cum_z += INSET_D/3.0;
- dspkeys[i].xoff = cum_x;
- dspkeys[i].zoff = cum_z;
- i++;
-
- dspkeys[i].key = BLKEY;
- dspkeys[i].keytop = BLKEY_TOP;
- cum_x += (2.0*key_w)/3.0;
- cum_z += -INSET_D/3.0;
- dspkeys[i].xoff = cum_x;
- dspkeys[i].zoff = cum_z;
- i++;
-
- dspkeys[i].key = KEYB;
- dspkeys[i].keytop = KEYB_TOP;
- cum_x += (INSET_W/WHITE_KEYS) - ((2.0*key_w)/3.0);
- cum_z += INSET_D/3.0;
- dspkeys[i].xoff = cum_x;
- dspkeys[i].zoff = cum_z;
- i++;
-
- dspkeys[i].key = BLKEY;
- dspkeys[i].keytop = BLKEY_TOP;
- cum_x += (2.0*key_w)/3.0;
- cum_z += -INSET_D/3.0;
- dspkeys[i].xoff = cum_x;
- dspkeys[i].zoff = cum_z;
- i++;
-
- dspkeys[i].key = KEYL;
- dspkeys[i].keytop = KEYL_TOP;
- cum_x += (INSET_W/WHITE_KEYS) - ((2.0*key_w)/3.0);
- cum_z += INSET_D/3.0;
- dspkeys[i].xoff = cum_x;
- dspkeys[i].zoff = cum_z;
- i++;
- }
- dspkeys[LAST_KEY].key = KEYN;
- dspkeys[LAST_KEY].keytop = KEYN_TOP;
- dspkeys[LAST_KEY].xoff = dspkeys[LAST_KEY-1].xoff + INSET_W/WHITE_KEYS;
- dspkeys[LAST_KEY].zoff = dspkeys[LAST_KEY-1].zoff;
-
- y_off = FRONT_H-INSET_H;
- x_rot = 180.0 * fatan((BACK_H-FRONT_H)/CASE_D) / M_PI;
- }
-
- /*
- * display_keys - Display all of the keys in their current
- * state (up or down)
- */
-
- display_keys (downs)
-
- int *downs;
-
- {
- int i;
-
- pushmatrix ();
- rot (x_rot, 'x');
-
- for (i=0; i<TOTAL_KEYS; i++)
- {
- pushname (KEYNAMES+i);
- pushmatrix ();
- if (downs[i])
- translate (dspkeys[i].xoff, y_off-DEPRESS_H,
- dspkeys[i].zoff);
- else
- translate (dspkeys[i].xoff, y_off, dspkeys[i].zoff);
- keystate[i] = downs[i];
- callobj (dspkeys[i].key);
- popmatrix ();
- popname ();
- }
- popmatrix ();
- }
-
- /*
- * hilight_keys - Hilight the keys that are depressed
- *
- * Only updates keys whose states have changed
- */
-
- hilight_keys (downs)
-
- int *downs;
-
- {
- int i;
-
- pushmatrix ();
- rot (x_rot, 'x');
-
- /* Display the changed key tops */
-
- for (i=0; i<TOTAL_KEYS; i++)
- {
- if (downs[i] != keystate[i])
- {
- pushmatrix ();
- if (downs[i])
- RGBcolor (HILIGHT);
- else
- {
- if (dspkeys[i].key == BLKEY)
- RGBcolor (BLACK_KEY_TOP);
- else
- RGBcolor (WHITE_KEY_TOP);
- }
- translate (dspkeys[i].xoff, y_off, dspkeys[i].zoff);
- callobj (dspkeys[i].keytop);
- keystate[i] = downs[i];
- popmatrix ();
- }
- }
- popmatrix ();
- }
-
- /*
- * display_slider - Display volume slider at given volume
- */
-
- display_slider (volume)
-
- float volume;
-
- {
- zbuffer (FALSE); /* So redraw works */
- callobj (VSLIDER);
-
- pushmatrix ();
- translate ( vslide_x - (vpeg_w/2),
- (vslide_y1 + volume*(vslide_y2-vslide_y1)),
- -(vslide_z1 + volume*(vslide_z2-vslide_z1)) + vpeg_d/2 );
- callobj (VPEG);
- popmatrix ();
-
- zbuffer (TRUE);
- }
-
- /*
- * display_buttons - Display instrument selection buttons
- */
-
- display_buttons (selection)
-
- int selection;
-
- {
- int i;
- float x, y, z;
-
- zbuffer (FALSE); /* So redraw works */
- callobj (BPATCH);
-
- x = bpatch_x1+gap_w;
- z = bpatch_z1+gap_d;
- y = 1.0001 * (FRONT_H + ((z/CASE_D) * (BACK_H - FRONT_H)) );
-
- for (i=0; i<NUM_BUTTONS; i++)
- {
- if (i == (NUM_BUTTONS/2))
- {
- x = bpatch_x1+gap_w;
- z += button_d + gap_d;
- y = 1.0001 * (FRONT_H +
- ((z/CASE_D) * (BACK_H - FRONT_H)) );
- }
-
- pushmatrix ();
- translate (x, y, -z);
- pushname (SEL_BUTTON+i);
- if (i == selection)
- callobj (DOWN_BUTTON);
- else
- callobj (SEL_BUTTON);
- popname ();
- popmatrix ();
-
- x += (button_w + gap_w);
- }
-
- zbuffer (TRUE);
- }
-