simgear/PUI/pu.cxx
1998-06-12 01:04:52 +00:00

239 lines
5.5 KiB
C++

#include "puLocal.h"
#define PU_STRING_X_FUDGE 6
#define PU_STRING_Y_FUDGE 6
int puRefresh = TRUE ;
puColour _puDefaultColourTable[] =
{
{ 0.5, 0.5, 0.5, 1.0 }, /* PUCOL_FOREGROUND */
{ 0.3, 0.3, 0.3, 1.0 }, /* PUCOL_BACKGROUND */
{ 0.7, 0.7, 0.7, 1.0 }, /* PUCOL_HIGHLIGHT */
{ 0.0, 0.0, 0.0, 1.0 }, /* PUCOL_LABEL */
{ 1.0, 1.0, 1.0, 1.0 }, /* PUCOL_TEXT */
{ 0.0, 0.0, 0.0, 0.0 } /* ILLEGAL */
} ;
puValue::~puValue () {}
static int _puCursor_enable = FALSE ;
static int _puCursor_x = 0 ;
static int _puCursor_y = 0 ;
static float _puCursor_bgcolour [4] = { 1.0f, 1.0f, 1.0f, 1.0f } ;
static float _puCursor_fgcolour [4] = { 0.0f, 0.0f, 0.0f, 1.0f } ;
void puHideCursor ( void ) { _puCursor_enable = FALSE ; }
void puShowCursor ( void ) { _puCursor_enable = TRUE ; }
int puCursorIsHidden ( void ) { return ! _puCursor_enable ; }
void puCursor ( int x, int y )
{
_puCursor_x = x ;
_puCursor_y = y ;
}
int puGetStringDescender ( void *fnt )
{
if ( fnt == NULL )
fnt = GLUT_BITMAP_9_BY_15 ;
if ( fnt == GLUT_BITMAP_8_BY_13 ) return 2 ;
if ( fnt == GLUT_BITMAP_9_BY_15 ) return 3 ;
if ( fnt == GLUT_BITMAP_TIMES_ROMAN_10 ) return 2 ;
if ( fnt == GLUT_BITMAP_TIMES_ROMAN_24 ) return 5 ;
if ( fnt == GLUT_BITMAP_HELVETICA_10 ) return 2 ;
if ( fnt == GLUT_BITMAP_HELVETICA_12 ) return 3 ;
if ( fnt == GLUT_BITMAP_HELVETICA_18 ) return 4 ;
return 0 ;
}
int puGetStringHeight ( void *fnt )
{
/* Height *excluding* descender */
if ( fnt == NULL )
fnt = GLUT_BITMAP_9_BY_15 ;
if ( fnt == GLUT_BITMAP_8_BY_13 ) return 9 ;
if ( fnt == GLUT_BITMAP_9_BY_15 ) return 10 ;
if ( fnt == GLUT_BITMAP_TIMES_ROMAN_10 ) return 7 ;
if ( fnt == GLUT_BITMAP_TIMES_ROMAN_24 ) return 17 ;
if ( fnt == GLUT_BITMAP_HELVETICA_10 ) return 8 ;
if ( fnt == GLUT_BITMAP_HELVETICA_12 ) return 9 ;
if ( fnt == GLUT_BITMAP_HELVETICA_18 ) return 14 ;
return 0 ;
}
int puGetStringWidth ( void *fnt, char *str )
{
if ( str == NULL )
return 0 ;
if ( fnt == NULL )
fnt = GLUT_BITMAP_9_BY_15 ;
int res = 0 ;
while ( *str != '\0' )
{
res += glutBitmapWidth ( fnt, *str ) ;
str++ ;
}
return res ;
}
void puDrawString ( void *fnt, char *str, int x, int y )
{
if ( str == NULL )
return ;
if ( fnt == NULL )
fnt = GLUT_BITMAP_9_BY_15 ;
glRasterPos2f ( x, y ) ;
while ( *str != '\0' )
{
glutBitmapCharacter ( fnt, *str ) ;
str++ ;
}
}
static void puDrawCursor ( int x, int y )
{
glColor4fv ( _puCursor_bgcolour ) ;
glBegin ( GL_TRIANGLES ) ;
glVertex2i ( x, y ) ;
glVertex2i ( x + 13, y - 4 ) ;
glVertex2i ( x + 4, y - 13 ) ;
glVertex2i ( x + 8, y - 3 ) ;
glVertex2i ( x + 17, y - 12 ) ;
glVertex2i ( x + 12, y - 17 ) ;
glVertex2i ( x + 12, y - 17 ) ;
glVertex2i ( x + 3, y - 8 ) ;
glVertex2i ( x + 8, y - 3 ) ;
glEnd () ;
glColor4fv ( _puCursor_fgcolour ) ;
glBegin ( GL_TRIANGLES ) ;
glVertex2i ( x+1, y-1 ) ;
glVertex2i ( x + 11, y - 4 ) ;
glVertex2i ( x + 4, y - 11 ) ;
glVertex2i ( x + 8, y - 5 ) ;
glVertex2i ( x + 15, y - 12 ) ;
glVertex2i ( x + 12, y - 15 ) ;
glVertex2i ( x + 12, y - 15 ) ;
glVertex2i ( x + 5, y - 8 ) ;
glVertex2i ( x + 8, y - 5 ) ;
glEnd () ;
}
void puInit ( void )
{
static int firsttime = TRUE ;
if ( firsttime )
{
puInterface *base_interface = new puInterface ( 0, 0 ) ;
puPushInterface ( base_interface ) ;
puPushLiveInterface ( base_interface ) ;
firsttime = FALSE ;
}
}
static void puSetOpenGLState ( void )
{
int w = glutGet ( (GLenum) GLUT_WINDOW_WIDTH ) ;
int h = glutGet ( (GLenum) GLUT_WINDOW_HEIGHT ) ;
glPushAttrib ( GL_ENABLE_BIT | GL_VIEWPORT_BIT | GL_TRANSFORM_BIT ) ;
glDisable ( GL_LIGHTING ) ;
glDisable ( GL_FOG ) ;
glDisable ( GL_TEXTURE_2D ) ;
glDisable ( GL_DEPTH_TEST ) ;
glDisable ( GL_CULL_FACE ) ;
glViewport ( 0, 0, w, h ) ;
glMatrixMode ( GL_PROJECTION ) ;
glPushMatrix () ;
glLoadIdentity () ;
gluOrtho2D ( 0, w, 0, h ) ;
glMatrixMode ( GL_MODELVIEW ) ;
glPushMatrix () ;
glLoadIdentity () ;
}
static void puRestoreOpenGLState ( void )
{
glMatrixMode ( GL_PROJECTION ) ;
glPopMatrix () ;
glMatrixMode ( GL_MODELVIEW ) ;
glPopMatrix () ;
glPopAttrib () ;
}
void puDisplay ( void )
{
puSetOpenGLState () ;
puGetUltimateLiveInterface () -> draw ( 0, 0 ) ;
if ( _puCursor_enable )
puDrawCursor ( _puCursor_x,
glutGet((GLenum)GLUT_WINDOW_HEIGHT) - _puCursor_y ) ;
puRestoreOpenGLState () ;
}
int puKeyboard ( int key, int updown )
{
return puGetBaseLiveInterface () -> checkKey ( key, updown ) ;
}
static int last_buttons = 0 ;
int puMouse ( int button, int updown, int x, int y )
{
puCursor ( x, y ) ;
if ( updown == PU_DOWN )
last_buttons |= ( 1 << button ) ;
else
last_buttons &= ~( 1 << button ) ;
return puGetBaseLiveInterface () -> checkHit ( button, updown, x,
glutGet((GLenum)GLUT_WINDOW_HEIGHT) - y ) ;
}
int puMouse ( int x, int y )
{
puCursor ( x, y ) ;
if ( last_buttons == 0 )
return FALSE ;
int button = (last_buttons & (1<<PU_LEFT_BUTTON )) ? PU_LEFT_BUTTON :
(last_buttons & (1<<PU_MIDDLE_BUTTON)) ? PU_MIDDLE_BUTTON :
(last_buttons & (1<<PU_RIGHT_BUTTON )) ? PU_RIGHT_BUTTON : 0 ;
return puGetBaseLiveInterface () -> checkHit ( button, PU_DRAG, x,
glutGet((GLenum)GLUT_WINDOW_HEIGHT) - y ) ;
}