#ifndef _GLUI_H_ #define _GLUI_H_ #include #include #include #include #define GLUI_VERSION 1.01f /********** Current version **********/ /********** 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 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, }; /********* 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 /** Different panel control types **/ #define GLUI_PANEL_NONE 0 #define GLUI_PANEL_EMBOSSED 1 #define GLUI_PANEL_RAISED 2 /********* 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 /********** 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 /************ A string type for us to use **********/ typedef char GLUI_String[100]; /********* Pre-declare the various classes *********/ class GLUI; class GLUI_Control; class GLUI_Checkbox; class GLUI_Slider; 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; /*** Flags for GLUI class constructor ***/ #define GLUI_SAME_WINDOW_BIT (1<<1) #define GLUI_ALIGN_RIGHT_BIT (1<<2) #define GLUI_ALIGN_LEFT_BIT (1<<3) /*** 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 /*** 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; }; }; /************************************************************/ /* */ /* 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_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_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_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 *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; ienable(); }; void disable( void ); void sync_live( void ); /***** GLUT callback setup functions *****/ void set_glutDisplayFunc(void (*f)(void)); void set_glutReshapeFunc(void (*f)(int width, int height)); void set_glutKeyboardFunc(void (*f)(unsigned char key, int x, int y)); void set_glutSpecialFunc(void (*f)(int key, int x, int y)); void set_glutMouseFunc(void (*f)(int button, int state, int x, int y)); void set_glutMotionFunc(void (*f)(int x, int y)); void set_glutPassiveMotionFunc(void (*f)(int x, int y)); void set_glutEntryFunc(void (*f)(int state)); void set_glutVisibilityFunc(void (*f)(int state)); void set_glutInit( int *argcp, char **argv ); void set_glutInitWindowSize(int width, int height); void set_glutInitWindowPosition(int x, int y); void set_glutInitDisplayMode(unsigned int mode); int set_glutCreateWindow(char *name); /***** Constructors and desctructors *****/ int init( char *name, int flags, int x, int y ); }; /************************************************************/ /* */ /* EditText class */ /* */ /************************************************************/ class GLUI_EditText : public GLUI_Control { public: int has_limits; int data_type; GLUI_String orig_text; int insertion_pt; int title_x_offset; int text_x_offset; int substring_start; /*substring that gets displayed in box*/ int substring_end; int sel_start, sel_end; /* current selection */ int num_periods; int last_insertion_pt; float float_low, float_high; int int_low, int_high; GLUI_Spinner *spinner; int debug; int draw_text_only; int mouse_down_handler( int local_x, int local_y ); int mouse_up_handler( int local_x, int local_y, int same ); int mouse_held_down_handler( int local_x, int local_y, int inside ); int key_handler( unsigned char key,int modifiers ); int special_handler( int key,int modifiers ); void activate( int how ); void disactivate( void ); void draw( int x, int y ); int find_word_break( int start, int direction ); int substring_width( int start, int end ); void clear_substring( int start, int end ); int find_insertion_pt( int x, int y ); int update_substring_bounds( void ); void update_and_draw_text( void ); void draw_text( int x, int y ); void draw_insertion_pt( void ); void set_numeric_text( void ); void update_x_offsets( void ); void update_size( void ); void set_float_limits( float low,float high,int limit_type=GLUI_LIMIT_CLAMP); void set_int_limits( int low, int high, int limit_type=GLUI_LIMIT_CLAMP ); void set_float_val( float new_val ); void set_int_val( int new_val ); void set_text( char *text ); char *get_text( void ) { return text; }; void dump( FILE *out, char *text ); GLUI_EditText( void ) { type = GLUI_CONTROL_EDITTEXT; h = GLUI_EDITTEXT_HEIGHT; w = GLUI_EDITTEXT_WIDTH; title_x_offset = 0; text_x_offset = 55; insertion_pt = -1; last_insertion_pt = -1; name[0] = '\0'; substring_start = 0; data_type = GLUI_EDITTEXT_TEXT; substring_end = 2; num_periods = 0; has_limits = GLUI_LIMIT_NONE; sel_start = 0; sel_end = 0; active_type = GLUI_CONTROL_ACTIVE_PERMANENT; can_activate = true; spacebar_mouse_click = false; spinner = NULL; debug = false; draw_text_only = false; }; }; /************************************************************/ /* */ /* RadioGroup class (container) */ /* */ /************************************************************/ class GLUI_RadioGroup : public GLUI_Control { public: int num_buttons; void draw( int x, int y ); void set_name( char *text ); void set_int_val( int int_val ); void set_selected( int int_val ); void draw_group( int translate ); GLUI_RadioGroup( void ) { type = GLUI_CONTROL_RADIOGROUP; x_off = 0; y_off_top = 0; y_off_bot = 0; is_container = true; w = 300; h = 300; num_buttons = 0; name[0] = '\0'; can_activate = false; live_type = GLUI_LIVE_INT; }; }; /************************************************************/ /* */ /* RadioButton class (container) */ /* */ /************************************************************/ class GLUI_RadioButton : public GLUI_Control { public: int orig_value, currently_inside; int text_x_offset; int mouse_down_handler( int local_x, int local_y ); int mouse_up_handler( int local_x, int local_y, int inside ); int mouse_held_down_handler( int local_x, int local_y, int inside ); void draw( int x, int y ); void update_size( void ); void draw_active_area( void ); void draw_checked( void ); void draw_unchecked( void ); void draw_O( void ); GLUI_RadioGroup *group; GLUI_RadioButton( void ) { sprintf( name, "RadioButton: %p", this ); type = GLUI_CONTROL_RADIOBUTTON; h = GLUI_RADIOBUTTON_SIZE; group = NULL; orig_value = -1; text_x_offset = 18; can_activate = true; }; }; /************************************************************/ /* */ /* Separator class (container) */ /* */ /************************************************************/ class GLUI_Separator : public GLUI_Control { public: void draw( int x, int y ); GLUI_Separator( void ) { type = GLUI_CONTROL_SEPARATOR; w = 100; h = GLUI_SEPARATOR_HEIGHT; can_activate = false; }; }; #define GLUI_SPINNER_ARROW_WIDTH 12 #define GLUI_SPINNER_ARROW_HEIGHT 8 #define GLUI_SPINNER_ARROW_Y 2 #define GLUI_SPINNER_STATE_NONE 0 #define GLUI_SPINNER_STATE_UP 1 #define GLUI_SPINNER_STATE_DOWN 2 #define GLUI_SPINNER_STATE_BOTH 3 #define GLUI_SPINNER_DEFAULT_GROWTH_EXP 1.05f /************************************************************/ /* */ /* Spinner class (container) */ /* */ /************************************************************/ class GLUI_Spinner : public GLUI_Control { public: int currently_inside; int state; float growth, growth_exp; int last_x, last_y; int data_type; int callback_count; int last_int_val; float last_float_val; int first_callback; GLUI_EditText *edittext; int mouse_down_handler( int local_x, int local_y ); int mouse_up_handler( int local_x, int local_y, int same ); int mouse_held_down_handler( int local_x, int local_y, int inside ); int key_handler( unsigned char key,int modifiers ); int special_handler( int key,int modifiers ); void draw( int x, int y ); void draw_pressed( void ); void draw_unpressed( void ); void draw_text( int sunken ); void update_size( void ); void set_float_limits( float low,float high,int limit_type=GLUI_LIMIT_CLAMP); void set_int_limits( int low, int high,int limit_type=GLUI_LIMIT_CLAMP); int find_arrow( int local_x, int local_y ); void do_drag( int x, int y ); void do_callbacks( void ); void draw_arrows( void ); void do_click( void ); void idle( void ); int needs_idle( void ); char *get_text( void ); void set_float_val( float new_val ); void set_int_val( int new_val ); float get_float_val( void ); int get_int_val( void ); void increase_growth( void ); void reset_growth( void ); GLUI_Spinner( void ) { sprintf( name, "Spinner: %p", this ); type = GLUI_CONTROL_SPINNER; h = GLUI_EDITTEXT_HEIGHT; w = GLUI_EDITTEXT_WIDTH; x_off = 0; y_off_top = 0; y_off_bot = 0; can_activate = true; state = GLUI_SPINNER_STATE_NONE; edittext = NULL; growth_exp = GLUI_SPINNER_DEFAULT_GROWTH_EXP; callback_count = 0; first_callback = true; }; }; /************************************************************/ /* */ /* StaticText class */ /* */ /************************************************************/ class GLUI_StaticText : public GLUI_Control { public: void set_text( char *text ); void draw( int x, int y ); void draw_text( void ); void update_size( void ); void erase_text( void ); GLUI_StaticText( void ) { type = GLUI_CONTROL_STATICTEXT; h = GLUI_STATICTEXT_SIZE; name[0] = '\0'; can_activate = false; }; }; /********** Misc functions *********************/ int _glutBitmapWidthString( void *font, char *s ); void _glutBitmapString( void *font, char *s ); /********** Our own callbacks for glut *********/ /* These are the callbacks that we pass to glut. They take some action if necessary, then (possibly) call the user-level glut callbacks. */ void glui_display_func( void ); void glui_reshape_func( int w, int h ); void glui_keyboard_func(unsigned char key, int x, int y); void glui_special_func(int key, int x, int y); void glui_mouse_func(int button, int state, int x, int y); void glui_motion_func(int x, int y); void glui_passive_motion_func(int x, int y); void glui_entry_func(int state); void glui_visibility_func(int state); void glui_idle_func(void); #endif