home *** CD-ROM | disk | FTP | other *** search
- /**********************************************************************************
- * cube.h: declarations for the cube program
- *The following references were used:
- "The X Window System Programming And Applications with Xt
- OSF/MOTIF EDITION"
- by Douglas A Young
- Prentice-Hall, 1990.
- ISBN 0-13-642786-3
-
- "Mastering Rubik's Cube"
- by Don Taylor
- An Owl Book; Holt, Rinehart and Winston, New York, 1980
- ISBN 0-03-059941-5
-
- -------------------------------------------------------------------
- Copyright (C) 1993 by Pierre A. Fleurant
- Permission is granted to copy and distribute this program
- without charge, provided this copyright notice is included
- in the copy.
- This Software is distributed on an as-is basis. There will be
- ABSOLUTELY NO WARRANTY for any part of this software to work
- correct. In no case will the author be liable to you for damages
- caused by the usage of this software.
- -------------------------------------------------------------------
- */
-
- #include <X11/StringDefs.h>
- #include <X11/cursorfont.h>
- #include <X11/Intrinsic.h>
- #include <X11/Xutil.h>
- #include <Xm/Xm.h>
- #include <Xm/DrawingA.h>
- #include <Xm/RowColumn.h>
- #include <Xm/Form.h>
- #include <Xm/PushB.h>
- #include <Xm/ToggleB.h>
- #include <Xm/Label.h>
- #include <math.h>
- #include "libXs.h"
-
- #define DEFAULT_DELTA_ANGLE 30
-
- /* application context, display */
- XtAppContext appContext;
- Display *xDisplay;
-
- /* #define MotifBC YES */
-
- Boolean Draw_Enable = TRUE;
- Boolean Cube_Side_Chosen = FALSE;
- Boolean Fill_Pattern_Chosen = FALSE;
-
- /* Used for cornermap array. See align_subfaces in cube.c */
- typedef struct {
- int a;
- int b;
- int c;
- } Corner;
-
- /* Used for edge array. See align_subfaces in cube.c */
- typedef struct {
- int a;
- int b;
- } Edge;
-
- /* help information */
-
- char *tophelp_str[] = {
- "Init Cube: init cube to pattern desired",
- "Pristine: to start with a pristine cube",
- "Quit: exit",
- "rotate,spin,flip: turns whole cube",
- "!front, !left, !right,...: operates on 1/3 of cube",
- " ",
- " ",
- "",""};
-
- static unsigned char fg_bitmap[32] = {
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* solid foreground */
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
- };
- #define fg_width 16
- #define fg_height 16
-
- /* the initial colors of the 6 sides of the cube */
- char *seed_color[] = {
- /* 0 1 2 3 4 5
- front left right back top bottom
- */
- "red", "yellow", "orange", "light grey", "blue", "green"
- };
-
- /* the names of the 6 sides of the cube */
- char *side_names[] = {
- "front", "left", "right", "back", "top", "bottom"
- };
-
- /* Menu bar data */
- extern void spin_it();
- extern void rot_it();
- extern void flip_it();
- extern void quit_it();
- extern void init_cube();
- extern void clear_draw();
- extern void cubik_front();
- extern void cubik_left();
- extern void cubik_right();
- extern void cubik_back();
- extern void cubik_top();
- extern void cubik_bottom();
-
- /*
- * Create the list of menu items for a sub menu pane.
- */
- static xs_menu_struct OpData[] = {
- {"rotate", rot_it, "ignore", NULL, 0, NULL},
- {"spin", spin_it, "ignore", NULL, 0, NULL},
- {"flip", flip_it, "ignore", NULL, 0 ,NULL},
- {"!front", cubik_front, "ignore", NULL, 0, NULL},
- {"!left", cubik_left, "ignore", NULL, 0, NULL},
- {"!right", cubik_right, "ignore", NULL, 0, NULL},
- {"!back", cubik_back, "ignore", NULL, 0, NULL},
- {"!top", cubik_top, "ignore", NULL, 0, NULL},
- {"!bottom",cubik_bottom, "ignore", NULL, 0, NULL}
- };
-
- /*
- * Describe the menu bar, giving only the names to appear in
- * the menu bar and pointers to each pulldown pane.
- */
- static xs_menu_struct PulldownData[] = {
- {"Operate" , NULL, NULL,
- OpData, XtNumber(OpData), NULL}
- };
-
- /* Old cube0 values.
- #define MR_X 150
- #define MR_Y 125
- #define Z_DEPTH 0
- */
- /* With following values cube is centered about (0,0,0) */
- #define MR_X (-75)
- #define MR_Y (-75)
- #define Z_DEPTH (-75)
-
- #define WINDOW_CENTER_X 225
- #define WINDOW_CENTER_Y 200
-
- #define PROJECTION_DEPTH 500
- #define FACE0_WIDTH 50
- #define FACE0_HEIGHT 50
- #define NUM_SUBPLANES 54
- #define NUM_CUBIKPLANES 21 /* number of planes moved in cubikked op; 1/3 of cube moved */
-
-
- /* Double_XPoint arrays are used for all double calculations so that rotated, flipped,
- or spin'ed face does not look bad after many small increments of rotation.
- The z coordnate is used to preserve info when spin`ed or flipped. The routine
- shortface() converts the double_XPoint array to the regular XPoint array for drawing */
- typedef struct {
- double x;
- double y;
- double z;
- }double_XPoint;
-
- /* seed_face coordinates use mode=CoordModePrevious. They are converted to mode=CoordModeOrigin later. */
- double_XPoint rot_face[NUM_SUBPLANES][5]; /* the last spin'ed, flipped, or rotated face */
- double_XPoint cubik_face[NUM_SUBPLANES][5]; /* the cubikked face, a face that is turned only-1/3 of cube */
- double_XPoint seed_face[][5] = {
-
- /* Side 0 (front)*/
- {MR_X, MR_Y, Z_DEPTH},
- {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
- {MR_X+FACE0_WIDTH, MR_Y, Z_DEPTH},
- {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
- {MR_X+2*FACE0_WIDTH, MR_Y, Z_DEPTH},
- {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
-
- {MR_X, MR_Y+FACE0_HEIGHT, Z_DEPTH},
- {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
- {MR_X+FACE0_WIDTH, MR_Y+FACE0_HEIGHT, Z_DEPTH},
- {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
- {MR_X+2*FACE0_WIDTH, MR_Y+FACE0_HEIGHT, Z_DEPTH},
- {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
-
- {MR_X, MR_Y+2*FACE0_HEIGHT, Z_DEPTH},
- {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
- {MR_X+FACE0_WIDTH, MR_Y+2*FACE0_HEIGHT, Z_DEPTH},
- {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
- {MR_X+2*FACE0_WIDTH, MR_Y+2*FACE0_HEIGHT, Z_DEPTH},
- {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
-
- /* Side 1 (left) */
- {MR_X, MR_Y, Z_DEPTH},
- {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
- {MR_X, MR_Y, Z_DEPTH+FACE0_WIDTH},
- {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
- {MR_X, MR_Y, Z_DEPTH+2*FACE0_WIDTH},
- {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
-
- {MR_X, MR_Y+FACE0_HEIGHT, Z_DEPTH},
- {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
- {MR_X, MR_Y+FACE0_HEIGHT, Z_DEPTH+FACE0_WIDTH},
- {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
- {MR_X, MR_Y+FACE0_HEIGHT, Z_DEPTH+2*FACE0_WIDTH},
- {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
-
- {MR_X, MR_Y+2*FACE0_HEIGHT, Z_DEPTH},
- {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
- {MR_X, MR_Y+2*FACE0_HEIGHT, Z_DEPTH+FACE0_WIDTH},
- {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
- {MR_X, MR_Y+2*FACE0_HEIGHT, Z_DEPTH+2*FACE0_WIDTH},
- {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
-
- /* Side 2 (right) */
- {MR_X+3*FACE0_WIDTH, MR_Y, Z_DEPTH},
- {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
- {MR_X+3*FACE0_WIDTH, MR_Y, Z_DEPTH+FACE0_WIDTH},
- {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
- {MR_X+3*FACE0_WIDTH, MR_Y, Z_DEPTH+2*FACE0_WIDTH},
- {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
-
- {MR_X+3*FACE0_WIDTH, MR_Y+FACE0_HEIGHT, Z_DEPTH},
- {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
- {MR_X+3*FACE0_WIDTH, MR_Y+FACE0_HEIGHT, Z_DEPTH+FACE0_WIDTH},
- {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
- {MR_X+3*FACE0_WIDTH, MR_Y+FACE0_HEIGHT, Z_DEPTH+2*FACE0_WIDTH},
- {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
-
- {MR_X+3*FACE0_WIDTH, MR_Y+2*FACE0_HEIGHT, Z_DEPTH},
- {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
- {MR_X+3*FACE0_WIDTH, MR_Y+2*FACE0_HEIGHT, Z_DEPTH+FACE0_WIDTH},
- {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
- {MR_X+3*FACE0_WIDTH, MR_Y+2*FACE0_HEIGHT, Z_DEPTH+2*FACE0_WIDTH},
- {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
-
- /* Side 3 (back) */
- {MR_X, MR_Y, Z_DEPTH+3*FACE0_WIDTH},
- {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
- {MR_X+FACE0_WIDTH, MR_Y, Z_DEPTH+3*FACE0_WIDTH},
- {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
- {MR_X+2*FACE0_WIDTH, MR_Y, Z_DEPTH+3*FACE0_WIDTH},
- {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
-
- {MR_X, MR_Y+FACE0_HEIGHT, Z_DEPTH+3*FACE0_WIDTH},
- {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
- {MR_X+FACE0_WIDTH, MR_Y+FACE0_HEIGHT, Z_DEPTH+3*FACE0_WIDTH},
- {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
- {MR_X+2*FACE0_WIDTH, MR_Y+FACE0_HEIGHT, Z_DEPTH+3*FACE0_WIDTH},
- {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
-
- {MR_X, MR_Y+2*FACE0_HEIGHT, Z_DEPTH+3*FACE0_WIDTH},
- {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
- {MR_X+FACE0_WIDTH, MR_Y+2*FACE0_HEIGHT, Z_DEPTH+3*FACE0_WIDTH},
- {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
- {MR_X+2*FACE0_WIDTH, MR_Y+2*FACE0_HEIGHT, Z_DEPTH+3*FACE0_WIDTH},
- {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
-
- /* Side 4 (top) */
- {MR_X, MR_Y, Z_DEPTH},
- {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
- {MR_X+FACE0_WIDTH, MR_Y, Z_DEPTH},
- {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
- {MR_X+2*FACE0_WIDTH, MR_Y, Z_DEPTH},
- {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
-
- {MR_X, MR_Y, Z_DEPTH+FACE0_HEIGHT},
- {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
- {MR_X+FACE0_WIDTH, MR_Y, Z_DEPTH+FACE0_HEIGHT},
- {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
- {MR_X+2*FACE0_WIDTH, MR_Y, Z_DEPTH+FACE0_HEIGHT},
- {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
-
- {MR_X, MR_Y, Z_DEPTH+2*FACE0_HEIGHT},
- {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
- {MR_X+FACE0_WIDTH, MR_Y, Z_DEPTH+2*FACE0_HEIGHT},
- {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
- {MR_X+2*FACE0_WIDTH, MR_Y, Z_DEPTH+2*FACE0_HEIGHT},
- {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
-
- /* Side 5 (bottom) */
- {MR_X, MR_Y+3*FACE0_HEIGHT, Z_DEPTH},
- {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
- {MR_X+FACE0_WIDTH, MR_Y+3*FACE0_HEIGHT, Z_DEPTH},
- {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
- {MR_X+2*FACE0_WIDTH, MR_Y+3*FACE0_HEIGHT, Z_DEPTH},
- {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
-
- {MR_X, MR_Y+3*FACE0_HEIGHT, Z_DEPTH+FACE0_HEIGHT},
- {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
- {MR_X+FACE0_WIDTH, MR_Y+3*FACE0_HEIGHT, Z_DEPTH+FACE0_HEIGHT},
- {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
- {MR_X+2*FACE0_WIDTH, MR_Y+3*FACE0_HEIGHT, Z_DEPTH+FACE0_HEIGHT},
- {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
-
- {MR_X, MR_Y+3*FACE0_HEIGHT, Z_DEPTH+2*FACE0_HEIGHT},
- {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
- {MR_X+FACE0_WIDTH, MR_Y+3*FACE0_HEIGHT, Z_DEPTH+2*FACE0_HEIGHT},
- {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
- {MR_X+2*FACE0_WIDTH, MR_Y+3*FACE0_HEIGHT, Z_DEPTH+2*FACE0_HEIGHT},
- {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
-
- };
- int rot_angle,spin_angle,flip_angle;
-
- /* The subplanes that are moved in the cubikc_xxxx callback
- * that make up a twisting of the 1/3 of the cube.
- *
- */
- int seed_front[] = {
- 0,1,2,3,4,5,6,7,8,
- 0,0,0,
- 0,0,0,
- 0,0,0,
- 0,0,0
- };
-
- int seed_left[] = {
- 9,10,11,12,13,14,15,16,17,
- 0,0,0,
- 0,0,0,
- 0,0,0,
- 0,0,0
- };
-
- int seed_right[] = {
- 18,19,20,21,22,23,24,25,26,
- 0,0,0,
- 0,0,0,
- 0,0,0,
- 0,0,0
- };
-
- int seed_back[] = {
- 27,28,29,30,31,32,33,34,35,
- 0,0,0,
- 0,0,0,
- 0,0,0,
- 0,0,0
- };
-
- int seed_top[] = {
- 36,37,38,39,40,41,42,43,44,
- 0,0,0,
- 0,0,0,
- 0,0,0,
- 0,0,0
- };
-
- int seed_bottom[] = {
- 45,46,47,48,49,50,51,52,53,
- 0,0,0,
- 0,0,0,
- 0,0,0,
- 0,0,0
- };
- /* the front[]. left[], .... arrays
- indicate which subplane occupies a subplane location.
- When pristine these values are equal. (See seed_xxxx.)
- cubik_face[x][] gives the coordinates of a the xth
- subplane. The coordinates of a subplane change if a cubik
- operation operates on the said subplane.
- */
- int front[NUM_CUBIKPLANES],left[NUM_CUBIKPLANES];
- int right[NUM_CUBIKPLANES],back[NUM_CUBIKPLANES];
- int top[NUM_CUBIKPLANES],bottom[NUM_CUBIKPLANES];
- Corner cornermap[6][6][6]; /* see align_subfaces in cube.c */
- Edge edgemap[6][6]; /* see align_subfaces in cube.c */
-
-
- double Delta_Angle = DEFAULT_DELTA_ANGLE;
-
- void draw_line();
- void draw_circle();
- void draw_rectangle();
- void draw_filled_circle();
- void draw_filled_rectangle();
-
- void activate();
- void refresh();
- void refresh_cube();
- void set_stipple();
- void start_rubber_band();
- void track_rubber_band();
- void end_rubber_band();
- void prev_to_org();
- void facecpy();
- void cubik();
- void cubikcpy();
- void update_cubik();
- void lefthand_twist();
- void righthand_twist();
- void xs_help_callback();
- void init_subplane_pattern();
- void norm_face();
- void projface();
- void shortface();
- extern void xcube_init_cubik();
- extern void taylor();
- extern void ldfile();
-
- void init_cornermap();
- void init_edgemap();
- void check_events();
- Bool test_for_event();
-