Hi Bernd! While trying to figure out how to use the new 3d-turtle feature with the font I started wondering if it is possible to do something how it is done in the attached example in C with glXUseXFont. I am not skilled in forth enough yet to implement it myself so may be you can do it (if it is simple). I, of course, understand that you possibly have no time for that but may be you do and interested in that feature. It seems like more direct way to use fonts in OpenGL, you can make them 3d easily and so on.
Thank you! -- Sergey Here is the example: /* * This code was created by Jeff Molofee '99 * (ported to Linux/SDL by Ti Leggett '01) * * If you've found this code useful, please let me know. * * Visit Jeff at http://nehe.gamedev.net/ * * or for port-specific comments, questions, bugreports etc. * email to [EMAIL PROTECTED] */ #include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include <math.h> #include <string.h> #include <GL/gl.h> #include <GL/glu.h> #include <GL/glx.h> #include "SDL.h" /* screen width, height, and bit depth */ #define SCREEN_WIDTH 640 #define SCREEN_HEIGHT 480 #define SCREEN_BPP 16 /* Set up some booleans */ #define TRUE 1 #define FALSE 0 /* This is our SDL surface */ SDL_Surface *surface; GLuint base; /* Base Display List For The Font Set */ GLfloat cnt1; /* 1st Counter Used To Move Text & For Coloring */ GLfloat cnt2; /* 2nd Counter Used To Move Text & For Coloring */ /* function to recover memory form our list of characters */ GLvoid KillFont( GLvoid ) { glDeleteLists( base, 96 ); return; } /* function to release/destroy our resources and restoring the old desktop */ void Quit( int returnCode ) { KillFont( ); /* clean up the window */ SDL_Quit( ); /* and exit appropriately */ exit( returnCode ); } /* function to build our font list */ GLvoid buildFont( GLvoid ) { Display *dpy; /* Our current X display */ XFontStruct *fontInfo; /* Our font info */ /* Sotrage for 96 characters */ base = glGenLists( 96 ); /* Get our current display long enough to get the fonts */ dpy = XOpenDisplay( NULL ); /* Get the font information */ fontInfo = XLoadQueryFont( dpy, "-adobe-helvetica-medium-r- normal--18-*-*-*-p-*-iso8859-1" ); /* If the above font didn't exist try one that should */ if ( fontInfo == NULL ) { fontInfo = XLoadQueryFont( dpy, "fixed" ); /* If that font doesn't exist, something is wrong */ if ( fontInfo == NULL ) { fprintf( stderr, "no X font available?\n" ); Quit( 1 ); } } /* generate the list */ glXUseXFont( fontInfo->fid, 32, 96, base ); /* Recover some memory */ XFreeFont( dpy, fontInfo ); /* close the display now that we're done with it */ XCloseDisplay( dpy ); return; } /* Print our GL text to the screen */ GLvoid glPrint( const char *fmt, ... ) { char text[256]; /* Holds our string */ va_list ap; /* Pointer to our list of elements */ /* If there's no text, do nothing */ if ( fmt == NULL ) return; /* Parses The String For Variables */ va_start( ap, fmt ); /* Converts Symbols To Actual Numbers */ vsprintf( text, fmt, ap ); va_end( ap ); /* Pushes the Display List Bits */ glPushAttrib( GL_LIST_BIT ); /* Sets base character to 32 */ glListBase( base - 32 ); /* Draws the text */ glCallLists( strlen( text ), GL_UNSIGNED_BYTE, text ); /* Pops the Display List Bits */ glPopAttrib( ); } /* function to reset our viewport after a window resize */ int resizeWindow( int width, int height ) { /* Height / width ration */ GLfloat ratio; /* Protect against a divide by zero */ if ( height == 0 ) height = 1; ratio = ( GLfloat )width / ( GLfloat )height; /* Setup our viewport. */ glViewport( 0, 0, ( GLint )width, ( GLint )height ); /* change to the projection matrix and set our viewing volume. */ glMatrixMode( GL_PROJECTION ); glLoadIdentity( ); /* Set our perspective */ gluPerspective( 45.0f, ratio, 0.1f, 100.0f ); /* Make sure we're chaning the model view and not the projection */ glMatrixMode( GL_MODELVIEW ); /* Reset The View */ glLoadIdentity( ); return( TRUE ); } /* function to handle key press events */ void handleKeyPress( SDL_keysym *keysym ) { switch ( keysym->sym ) { case SDLK_ESCAPE: /* ESC key was pressed */ Quit( 0 ); break; case SDLK_F1: /* F1 key was pressed * this toggles fullscreen mode */ SDL_WM_ToggleFullScreen( surface ); break; default: break; } return; } /* general OpenGL initialization function */ int initGL( GLvoid ) { /* Enable smooth shading */ glShadeModel( GL_SMOOTH ); /* Set the background black */ glClearColor( 0.0f, 0.0f, 0.0f, 0.0f ); /* Depth buffer setup */ glClearDepth( 1.0f ); /* Enables Depth Testing */ glEnable( GL_DEPTH_TEST ); /* The Type Of Depth Test To Do */ glDepthFunc( GL_LEQUAL ); /* Really Nice Perspective Calculations */ glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ); buildFont( ); return( TRUE ); } /* Here goes our drawing code */ int drawGLScene( GLvoid ) { /* These are to calculate our fps */ static GLint T0 = 0; static GLint Frames = 0; /* Clear The Screen And The Depth Buffer */ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glLoadIdentity( ); /* Move into the screen 1 unit */ glTranslatef( 0.0f, 0.0f, -1.0f ); /* Pulsing Colors Based On Text Position */ glColor3f( 1.0f *( float )cos( cnt1 ), 1.0f *( float )sin( cnt2 ), 1.0f - 0.5f * ( float )cos( cnt1 + cnt2 ) ); /* Position The Text On The Screen */ glRasterPos2f( -0.45f + 0.05f * ( float )cos( cnt1 ), 0.35f * ( float )sin( cnt2 ) ); /* Print text to the screen */ glPrint( "Active OpenGL Text With NeHe - %7.2f", cnt1 ); cnt1 += 0.051f; /* Increase the first counter */ cnt2 += 0.005f; /* Increase the second counter */ /* Draw it to the screen */ SDL_GL_SwapBuffers( ); /* Gather our frames per second */ Frames++; { GLint t = SDL_GetTicks(); if (t - T0 >= 5000) { GLfloat seconds = (t - T0) / 1000.0; GLfloat fps = Frames / seconds; printf("%d frames in %g seconds = %g FPS\n", Frames, seconds, fps); T0 = t; Frames = 0; } } return( TRUE ); } int main( int argc, char **argv ) { /* Flags to pass to SDL_SetVideoMode */ int videoFlags; /* main loop variable */ int done = FALSE; /* used to collect events */ SDL_Event event; /* this holds some info about our display */ const SDL_VideoInfo *videoInfo; /* whether or not the window is active */ int isActive = TRUE; /* initialize SDL */ if ( SDL_Init( SDL_INIT_VIDEO ) < 0 ) { fprintf( stderr, "Video initialization failed: %s\n", SDL_GetError( ) ); Quit( 1 ); } /* Fetch the video info */ videoInfo = SDL_GetVideoInfo( ); if ( !videoInfo ) { fprintf( stderr, "Video query failed: %s\n", SDL_GetError( ) ); Quit( 1 ); } /* the flags to pass to SDL_SetVideoMode */ videoFlags = SDL_OPENGL; /* Enable OpenGL in SDL */ videoFlags |= SDL_GL_DOUBLEBUFFER; /* Enable double buffering */ videoFlags |= SDL_HWPALETTE; /* Store the palette in hardware */ videoFlags |= SDL_RESIZABLE; /* Enable window resizing */ /* This checks to see if surfaces can be stored in memory */ if ( videoInfo->hw_available ) videoFlags |= SDL_HWSURFACE; else videoFlags |= SDL_SWSURFACE; /* This checks if hardware blits can be done */ if ( videoInfo->blit_hw ) videoFlags |= SDL_HWACCEL; /* Sets up OpenGL double buffering */ SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); /* get a SDL surface */ surface = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, videoFlags ); /* Verify there is a surface */ if ( !surface ) { fprintf( stderr, "Video mode set failed: %s\n", SDL_GetError( ) ); Quit( 1 ); } /* initialize OpenGL */ initGL( ); /* resize the initial window */ resizeWindow( SCREEN_WIDTH, SCREEN_HEIGHT ); /* wait for events */ while ( !done ) { /* handle the events in the queue */ while ( SDL_PollEvent( &event ) ) { switch( event.type ) { case SDL_ACTIVEEVENT: /* Something's happend with our focus * If we lost focus or we are iconified, we * shouldn't draw the screen */ if ( event.active.gain == 0 ) isActive = FALSE; else isActive = TRUE; break; case SDL_VIDEORESIZE: /* handle resize event */ surface = SDL_SetVideoMode( event.resize.w, event.resize.h, 16, videoFlags ); if ( !surface ) { fprintf( stderr, "Could not get a surface after resize: %s\n", SDL_GetError( ) ); Quit( 1 ); } resizeWindow( event.resize.w, event.resize.h ); break; case SDL_KEYDOWN: /* handle key presses */ handleKeyPress( &event.key.keysym ); break; case SDL_QUIT: /* handle quit requests */ done = TRUE; break; default: break; } } /* draw the scene */ if ( isActive ) drawGLScene( ); } /* clean ourselves up and exit */ Quit( 0 ); /* Should never get here */ return( 0 ); } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
