/**************************************************************************** GLUI User Interface Toolkit --------------------------- glui.h - Main header for GLUI User Interface Toolkit -------------------------------------------------- Copyright (c) 1998 Paul Rademacher This program is freely distributable without licensing fees and is provided without guarantee or warrantee expressed or implied. This program is -not- in the public domain. *****************************************************************************/ #ifndef _GLUI_H_ #define _GLUI_H_ #include #include #include #include #include #include #define GLUI_VERSION 2.01f /********** Current version **********/ class Arcball; /********** Do some basic defines *******/ #ifndef false #define true 1 #define false 0 #endif #ifndef Byte #define Byte unsigned char #endif #ifndef _RGBC_ class RGBc { public: Byte r, g, b; void set(Byte r,Byte g,Byte b) {this->r=r;this->g=g;this->b=b;}; RGBc( void ) {}; RGBc( Byte r, Byte g, Byte b ) { set( r, g, b ); }; }; #define _RGBC_ #endif /********** List of GLUT callbacks ********/ enum GLUI_Glut_CB_Types { GLUI_GLUT_RESHAPE, GLUI_GLUT_KEYBOARD, GLUI_GLUT_DISPLAY, GLUI_GLUT_MOUSE, GLUI_GLUT_MOTION, GLUI_GLUT_SPECIAL, GLUI_GLUT_PASSIVE_MOTION, GLUI_GLUT_ENTRY, GLUI_GLUT_VISIBILITY }; /********** List of control types **********/ enum GLUI_Control_Types { GLUI_CONTROL_CHECKBOX =1, GLUI_CONTROL_BUTTON, GLUI_CONTROL_RADIOBUTTON, GLUI_CONTROL_RADIOGROUP, GLUI_CONTROL_SLIDER, GLUI_CONTROL_STATICTEXT, GLUI_CONTROL_EDITTEXT, GLUI_CONTROL_BITMAP, GLUI_CONTROL_PANEL, GLUI_CONTROL_SPINNER, GLUI_CONTROL_SEPARATOR, GLUI_CONTROL_COLUMN, GLUI_CONTROL_LISTBOX, GLUI_CONTROL_MOUSE_INTERACTION, GLUI_CONTROL_ROTATION, GLUI_CONTROL_TRANSLATION, GLUI_CONTROL_ROLLOUT, GLUI_CONTROL_HSLIDER }; /********* Constants for window placement **********/ #define GLUI_XOFF 6 #define GLUI_YOFF 6 #define GLUI_ITEMSPACING 3 #define GLUI_CHECKBOX_SIZE 13 #define GLUI_RADIOBUTTON_SIZE 13 #define GLUI_BUTTON_SIZE 20 #define GLUI_STATICTEXT_SIZE 13 #define GLUI_SEPARATOR_HEIGHT 8 #define GLUI_DEFAULT_CONTROL_WIDTH 100 #define GLUI_DEFAULT_CONTROL_HEIGHT 13 #define GLUI_EDITTEXT_BOXINNERMARGINX 3 #define GLUI_EDITTEXT_HEIGHT 20 #define GLUI_EDITTEXT_WIDTH 130 #define GLUI_EDITTEXT_MIN_INT_WIDTH 35 #define GLUI_EDITTEXT_MIN_TEXT_WIDTH 50 #define GLUI_PANEL_NAME_DROP 8 #define GLUI_PANEL_EMBOSS_TOP 4 /* #define GLUI_ROTATION_WIDTH 60*/ /* #define GLUI_ROTATION_HEIGHT 78 */ #define GLUI_ROTATION_WIDTH 50 #define GLUI_ROTATION_HEIGHT (GLUI_ROTATION_WIDTH+18) #define GLUI_MOUSE_INTERACTION_WIDTH 50 #define GLUI_MOUSE_INTERACTION_HEIGHT (GLUI_MOUSE_INTERACTION_WIDTH)+18 #define GLUI_HSLIDER_HEIGHT 16 #define GLUI_HSLIDER_WIDTH 130 /** Different panel control types **/ #define GLUI_PANEL_NONE 0 #define GLUI_PANEL_EMBOSSED 1 #define GLUI_PANEL_RAISED 2 /** Max # of els in control's float_array **/ #define GLUI_DEF_MAX_ARRAY 30 /********* The control's 'active' behavior *********/ #define GLUI_CONTROL_ACTIVE_MOUSEDOWN 1 #define GLUI_CONTROL_ACTIVE_PERMANENT 2 /********* Control alignment types **********/ #define GLUI_ALIGN_CENTER 1 #define GLUI_ALIGN_RIGHT 2 #define GLUI_ALIGN_LEFT 3 /********** Limit types - how to limit spinner values *********/ #define GLUI_LIMIT_NONE 0 #define GLUI_LIMIT_CLAMP 1 #define GLUI_LIMIT_WRAP 2 /********** Translation control types ********************/ #define GLUI_TRANSLATION_XY 0 #define GLUI_TRANSLATION_Z 1 #define GLUI_TRANSLATION_X 2 #define GLUI_TRANSLATION_Y 3 #define GLUI_TRANSLATION_LOCK_NONE 0 #define GLUI_TRANSLATION_LOCK_X 1 #define GLUI_TRANSLATION_LOCK_Y 2 /********** How was a control activated? *****************/ #define GLUI_ACTIVATE_MOUSE 1 #define GLUI_ACTIVATE_TAB 2 /********** What type of live variable does a control have? **********/ #define GLUI_LIVE_NONE 0 #define GLUI_LIVE_INT 1 #define GLUI_LIVE_FLOAT 2 #define GLUI_LIVE_TEXT 3 #define GLUI_LIVE_DOUBLE 4 #define GLUI_LIVE_FLOAT_ARRAY 5 /********** Translation codes **********/ enum TranslationCodes { GLUI_TRANSLATION_MOUSE_NONE=0, GLUI_TRANSLATION_MOUSE_UP, GLUI_TRANSLATION_MOUSE_DOWN, GLUI_TRANSLATION_MOUSE_LEFT, GLUI_TRANSLATION_MOUSE_RIGHT, GLUI_TRANSLATION_MOUSE_UP_LEFT, GLUI_TRANSLATION_MOUSE_UP_RIGHT, GLUI_TRANSLATION_MOUSE_DOWN_LEFT, GLUI_TRANSLATION_MOUSE_DOWN_RIGHT }; /************ A string type for us to use **********/ /* typedef char GLUI_String[300]; */ class GLUI_String { public: char string[300]; char &operator[]( int i ) { return string[i]; } operator char*() { return (char*) &string[0]; }; /* operator void*() { return (void*) &string[0]; }; */ GLUI_String( void ) { string[0] = '\0'; } GLUI_String( char *text ) { strcpy( string, text ); } }; /********* Pre-declare the various classes *********/ class GLUI; class GLUI_Control; class GLUI_Listbox; class GLUI_Rotation; class GLUI_Translation; class GLUI_Mouse_Interaction; class GLUI_Checkbox; class GLUI_HSlider; class GLUI_Button; class GLUI_StaticText; class GLUI_Bitmap; class GLUI_EditText; class GLUI_Node; class GLUI_Main; class GLUI_Panel; class GLUI_Spinner; class GLUI_RadioButton; class GLUI_RadioGroup; class GLUI_Separator; class GLUI_Column; class GLUI_Master; class GLUI_Glut_Window; class GLUI_Rollout; /*** Flags for GLUI class constructor ***/ #define GLUI_SUBWINDOW ((long)(1<< 1)) #define GLUI_SUBWINDOW_TOP ((long)(1<< 2)) #define GLUI_SUBWINDOW_BOTTOM ((long)(1<< 3)) #define GLUI_SUBWINDOW_LEFT ((long)(1<< 4)) #define GLUI_SUBWINDOW_RIGHT ((long)(1<< 5)) /*** Codes for different type of edittext boxes and spinners ***/ #define GLUI_EDITTEXT_TEXT 1 #define GLUI_EDITTEXT_INT 2 #define GLUI_EDITTEXT_FLOAT 3 #define GLUI_SPINNER_INT GLUI_EDITTEXT_INT #define GLUI_SPINNER_FLOAT GLUI_EDITTEXT_FLOAT #define GLUI_HSLIDER_INT GLUI_EDITTEXT_INT #define GLUI_HSLIDER_FLOAT GLUI_EDITTEXT_FLOAT /*** Definition of callbacks ***/ typedef void (*GLUI_Update_CB) (int id); typedef void (*Int1_CB) (int); typedef void (*Int2_CB) (int, int); typedef void (*Int3_CB) (int, int, int); typedef void (*Int4_CB) (int, int, int, int); /************************************************************/ /* */ /* Base class, for hierarchical relationships */ /* */ /************************************************************/ class GLUI_Node { protected: GLUI_Node *parent_node; GLUI_Node *child_head; GLUI_Node *child_tail; GLUI_Node *next_sibling; GLUI_Node *prev_sibling; public: GLUI_Node *first_sibling( void ); GLUI_Node *last_sibling( void ); GLUI_Node *prev( void ); GLUI_Node *next( void ); GLUI_Node *first_child( void ) { return child_head; }; GLUI_Node *last_child( void ) { return child_tail; }; GLUI_Node *parent(void) { return parent_node; }; void link_this_to_parent_last( GLUI_Node *parent ); void link_this_to_parent_first( GLUI_Node *parent ); void link_this_to_sibling_next( GLUI_Node *sibling ); void link_this_to_sibling_prev( GLUI_Node *sibling ); void unlink( void ); void dump( FILE *out, char *name ) { fprintf( out, "GLUI_node: %s\n", name ); fprintf( out, " parent: %p child_head: %p child_tail: %p\n", parent_node, child_head, child_tail ); fprintf( out, " next: %p prev: %p\n", next_sibling, prev_sibling ); } GLUI_Node( void ) { parent_node= child_head = child_tail = next_sibling = prev_sibling = NULL; }; friend GLUI_Rollout; friend GLUI_Main; }; /************************************************************/ /* */ /* Standard Bitmap stuff */ /* */ /************************************************************/ enum GLUI_StdBitmaps_Codes { GLUI_STDBITMAP_CHECKBOX_OFF=0, GLUI_STDBITMAP_CHECKBOX_ON, GLUI_STDBITMAP_RADIOBUTTON_OFF, GLUI_STDBITMAP_RADIOBUTTON_ON, GLUI_STDBITMAP_UP_ARROW, GLUI_STDBITMAP_DOWN_ARROW, GLUI_STDBITMAP_LEFT_ARROW, GLUI_STDBITMAP_RIGHT_ARROW, GLUI_STDBITMAP_TROUGH, GLUI_STDBITMAP_SPINNER_UP_OFF, GLUI_STDBITMAP_SPINNER_UP_ON, GLUI_STDBITMAP_SPINNER_DOWN_OFF, GLUI_STDBITMAP_SPINNER_DOWN_ON, GLUI_STDBITMAP_CHECKBOX_OFF_DIS, /*** Disactivated control bitmaps ***/ GLUI_STDBITMAP_CHECKBOX_ON_DIS, GLUI_STDBITMAP_RADIOBUTTON_OFF_DIS, GLUI_STDBITMAP_RADIOBUTTON_ON_DIS, GLUI_STDBITMAP_SPINNER_UP_DIS, GLUI_STDBITMAP_SPINNER_DOWN_DIS, GLUI_STDBITMAP_LISTBOX_UP, GLUI_STDBITMAP_LISTBOX_DOWN, GLUI_STDBITMAP_LISTBOX_UP_DIS, /*** GLUI_STDBITMAP_SLIDER_TAB, ***/ GLUI_STDBITMAP_NUM_ITEMS }; /************ Image Bitmap arrays **********/ extern int glui_img_checkbox_0[]; extern int glui_img_checkbox_1[]; extern int glui_img_radiobutton_0[]; extern int glui_img_radiobutton_1[]; extern int glui_img_uparrow[]; extern int glui_img_downarrow[]; extern int glui_img_leftarrow[]; extern int glui_img_rightarrow[]; extern int glui_img_trough[]; extern int glui_img_spinup_0[]; extern int glui_img_spinup_1[]; extern int glui_img_spindown_0[]; extern int glui_img_spindown_1[]; extern int glui_img_checkbox_0_dis[]; extern int glui_img_checkbox_1_dis[]; extern int glui_img_radiobutton_0_dis[]; extern int glui_img_radiobutton_1_dis[]; extern int glui_img_spinup_dis[]; extern int glui_img_spindown_dis[]; extern int glui_img_listbox_up[]; extern int glui_img_listbox_down[]; extern int glui_img_listbox_up_dis[]; extern int *bitmap_arrays[]; /************************************************************/ /* */ /* Class GLUI_Bitmap */ /* */ /************************************************************/ class GLUI_Bitmap { public: unsigned char *pixels; int w, h; void load_from_array( int *array ); GLUI_Bitmap( void ) { pixels = NULL; w = 0; h = 0; } }; /************************************************************/ /* */ /* Class GLUI_StdBitmap */ /* */ /************************************************************/ class GLUI_StdBitmaps { public: GLUI_Bitmap bitmaps[ GLUI_STDBITMAP_NUM_ITEMS ]; void draw( int bitmap_num, int x, int y ); GLUI_StdBitmaps( void ) { int i; for( i=0; i