Index: orxonox/branches/textEngine/src/Makefile.am
===================================================================
--- orxonox/branches/textEngine/src/Makefile.am	(revision 3681)
+++ orxonox/branches/textEngine/src/Makefile.am	(revision 3682)
@@ -56,4 +56,5 @@
 		 lib/graphics/light.cc \
 		 lib/graphics/font/fontset.cc \
+		 lib/graphics/font/glfont.cc \
 		 lib/graphics/importer/array.cc \
 		 lib/graphics/importer/objModel.cc \
@@ -110,4 +111,5 @@
 		 lib/graphics/graphics_engine.h \
 		 lib/graphics/light.h \
+		 lib/graphics/font/glfont.h \
 		 lib/graphics/font/fontset.h \
 		 lib/data/data_tank.h \
Index: orxonox/branches/textEngine/src/Makefile.in
===================================================================
--- orxonox/branches/textEngine/src/Makefile.in	(revision 3681)
+++ orxonox/branches/textEngine/src/Makefile.in	(revision 3682)
@@ -64,9 +64,10 @@
 	null_parent.$(OBJEXT) helper_parent.$(OBJEXT) \
 	data_tank.$(OBJEXT) graphics_engine.$(OBJEXT) light.$(OBJEXT) \
-	fontset.$(OBJEXT) array.$(OBJEXT) objModel.$(OBJEXT) \
-	primitive_model.$(OBJEXT) model.$(OBJEXT) material.$(OBJEXT) \
-	texture.$(OBJEXT) base_entity.$(OBJEXT) base_object.$(OBJEXT) \
-	ini_parser.$(OBJEXT) list.$(OBJEXT) resource_manager.$(OBJEXT) \
-	vector.$(OBJEXT) curve.$(OBJEXT) glmenu_imagescreen.$(OBJEXT)
+	fontset.$(OBJEXT) glfont.$(OBJEXT) array.$(OBJEXT) \
+	objModel.$(OBJEXT) primitive_model.$(OBJEXT) model.$(OBJEXT) \
+	material.$(OBJEXT) texture.$(OBJEXT) base_entity.$(OBJEXT) \
+	base_object.$(OBJEXT) ini_parser.$(OBJEXT) list.$(OBJEXT) \
+	resource_manager.$(OBJEXT) vector.$(OBJEXT) curve.$(OBJEXT) \
+	glmenu_imagescreen.$(OBJEXT)
 orxonox_OBJECTS = $(am_orxonox_OBJECTS)
 orxonox_LDADD = $(LDADD)
@@ -84,4 +85,5 @@
 @AMDEP_TRUE@	./$(DEPDIR)/game_loader.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/garbage_collector.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/glfont.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/glmenu_imagescreen.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/graphics_engine.Po \
@@ -262,4 +264,5 @@
 		 lib/graphics/light.cc \
 		 lib/graphics/font/fontset.cc \
+		 lib/graphics/font/glfont.cc \
 		 lib/graphics/importer/array.cc \
 		 lib/graphics/importer/objModel.cc \
@@ -316,4 +319,5 @@
 		 lib/graphics/graphics_engine.h \
 		 lib/graphics/light.h \
+		 lib/graphics/font/glfont.h \
 		 lib/graphics/font/fontset.h \
 		 lib/data/data_tank.h \
@@ -419,4 +423,5 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/game_loader.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/garbage_collector.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glfont.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glmenu_imagescreen.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/graphics_engine.Po@am__quote@
@@ -784,4 +789,20 @@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o fontset.obj `if test -f 'lib/graphics/font/fontset.cc'; then $(CYGPATH_W) 'lib/graphics/font/fontset.cc'; else $(CYGPATH_W) '$(srcdir)/lib/graphics/font/fontset.cc'; fi`
+
+glfont.o: lib/graphics/font/glfont.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT glfont.o -MD -MP -MF "$(DEPDIR)/glfont.Tpo" -c -o glfont.o `test -f 'lib/graphics/font/glfont.cc' || echo '$(srcdir)/'`lib/graphics/font/glfont.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/glfont.Tpo" "$(DEPDIR)/glfont.Po"; else rm -f "$(DEPDIR)/glfont.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/graphics/font/glfont.cc' object='glfont.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/glfont.Po' tmpdepfile='$(DEPDIR)/glfont.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o glfont.o `test -f 'lib/graphics/font/glfont.cc' || echo '$(srcdir)/'`lib/graphics/font/glfont.cc
+
+glfont.obj: lib/graphics/font/glfont.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT glfont.obj -MD -MP -MF "$(DEPDIR)/glfont.Tpo" -c -o glfont.obj `if test -f 'lib/graphics/font/glfont.cc'; then $(CYGPATH_W) 'lib/graphics/font/glfont.cc'; else $(CYGPATH_W) '$(srcdir)/lib/graphics/font/glfont.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/glfont.Tpo" "$(DEPDIR)/glfont.Po"; else rm -f "$(DEPDIR)/glfont.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/graphics/font/glfont.cc' object='glfont.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/glfont.Po' tmpdepfile='$(DEPDIR)/glfont.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o glfont.obj `if test -f 'lib/graphics/font/glfont.cc'; then $(CYGPATH_W) 'lib/graphics/font/glfont.cc'; else $(CYGPATH_W) '$(srcdir)/lib/graphics/font/glfont.cc'; fi`
 
 array.o: lib/graphics/importer/array.cc
Index: orxonox/branches/textEngine/src/lib/graphics/font/glfont.cc
===================================================================
--- orxonox/branches/textEngine/src/lib/graphics/font/glfont.cc	(revision 3681)
+++ orxonox/branches/textEngine/src/lib/graphics/font/glfont.cc	(revision 3682)
@@ -55,6 +55,6 @@
 #include <SDL/SDL_ttf.h>
 
-#include "../glincl.h"
-#include "../debug.h"
+#include "glincl.h"
+#include "debug.h"
 
 
@@ -276,270 +276,131 @@
 
 char Usage[100] = "orxonox test" ;
-void SDL_GL_Enter2DMode()
-{
-}
-
-void SDL_GL_Leave2DMode()
-{
-}
+void GLFont::enter2DMode()
+{
+  SDL_Surface *screen = SDL_GetVideoSurface();
+  
+  /* Note, there may be other things you need to change,
+     depending on how you have your OpenGL state set up.
+  */
+  glPushAttrib(GL_ENABLE_BIT);
+  glDisable(GL_DEPTH_TEST);
+  glDisable(GL_CULL_FACE);
+  glEnable(GL_TEXTURE_2D);
+  
+  /* This allows alpha blending of 2D textures with the scene */
+  glEnable(GL_BLEND);
+  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+  
+  glViewport(0, 0, screen->w, screen->h);
+  
+  glMatrixMode(GL_PROJECTION);
+  glPushMatrix();
+  glLoadIdentity();
+  
+  glOrtho(0.0, (GLdouble)screen->w, (GLdouble)screen->h, 0.0, 0.0, 1.0);
+  
+  glMatrixMode(GL_MODELVIEW);
+  glPushMatrix();
+  glLoadIdentity();
+  
+  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+}
+
+
+void GLFont::leave2DMode()
+{
+	glMatrixMode(GL_MODELVIEW);
+	glPopMatrix();
+
+	glMatrixMode(GL_PROJECTION);
+	glPopMatrix();
+
+	glPopAttrib();
+}
+
+
+GLuint GLFont::loadTexture(SDL_Surface *surface, GLfloat *texcoord)
+{
+  GLuint texture;
+  int w, h;
+  SDL_Surface *image;
+  SDL_Rect area;
+  Uint32 saved_flags;
+  Uint8  saved_alpha;
+  
+  /* Use the surface width and height expanded to powers of 2 */
+  w = power_of_two(surface->w);
+  h = power_of_two(surface->h);
+  texcoord[0] = 0.0f;			/* Min X */
+  texcoord[1] = 0.0f;			/* Min Y */
+  texcoord[2] = (GLfloat)surface->w / w;	/* Max X */
+  texcoord[3] = (GLfloat)surface->h / h;	/* Max Y */
+  
+  image = SDL_CreateRGBSurface(
+			       SDL_SWSURFACE,
+			       w, h,
+			       32,
+#if SDL_BYTEORDER == SDL_LIL_ENDIAN /* OpenGL RGBA masks */
+			       0x000000FF, 
+			       0x0000FF00, 
+			       0x00FF0000, 
+			       0xFF000000
+#else
+			       0xFF000000,
+			       0x00FF0000, 
+			       0x0000FF00, 
+			       0x000000FF
+#endif
+			       );
+  if ( image == NULL ) {
+    return 0;
+  }
+  
+  /* Save the alpha blending attributes */
+  saved_flags = surface->flags&(SDL_SRCALPHA|SDL_RLEACCELOK);
+  saved_alpha = surface->format->alpha;
+  if ( (saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA ) {
+    SDL_SetAlpha(surface, 0, 0);
+  }
+  
+  /* Copy the surface into the GL texture image */
+  area.x = 0;
+  area.y = 0;
+  area.w = surface->w;
+  area.h = surface->h;
+  SDL_BlitSurface(surface, &area, image, &area);
+  
+  /* Restore the alpha blending attributes */
+  if ( (saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA ) {
+    SDL_SetAlpha(surface, saved_flags, saved_alpha);
+  }
+  
+  /* Create an OpenGL texture for the image */
+  glGenTextures(1, &texture);
+  glBindTexture(GL_TEXTURE_2D, texture);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+  glTexImage2D(GL_TEXTURE_2D,
+	       0,
+	       GL_RGBA,
+	       w, h,
+	       0,
+	       GL_RGBA,
+	       GL_UNSIGNED_BYTE,
+	       image->pixels);
+  SDL_FreeSurface(image); /* No longer needed */
+  
+  return texture;
+}
+
 
 /* Quick utility function for texture creation */
-static int power_of_two(int input)
-{
-}
-
-
-
-GLuint SDL_GL_LoadTexture(SDL_Surface *surface, GLfloat *texcoord)
-{
-
-}
-
-int setup(int argc, char *argv[])
-{
-	char *argv0 = argv[0];
-	SDL_Surface *screen;
-	TTF_Font *font;
-	SDL_Surface *text;
-	int ptsize;
-	int i, done;
-	SDL_Color white = { 0xFF, 0xFF, 0xFF, 0 };
-	SDL_Color black = { 0x00, 0x00, 0x00, 0 };
-	SDL_Color *forecol;
-	SDL_Color *backcol;
-	GLenum gl_error;
-	GLuint texture;
-	int x, y, w, h;
-	GLfloat texcoord[4];
-	GLfloat texMinX, texMinY;
-	GLfloat texMaxX, texMaxY;
-
-	int renderstyle;
-	int dump;
-	enum {
-		RENDER_LATIN1,
-		RENDER_UTF8,
-		RENDER_UNICODE
-	} rendertype;
-	char *message;
-
-	/* Look for special execution mode */
-	dump = 0;
-	/* Look for special rendering types */
-	rendertype = RENDER_LATIN1;
-	/* Default is black and white */
-	forecol = &black;
-	backcol = &white;
-	for ( i=1; argv[i] && argv[i][0] == '-'; ++i ) {
-		if ( strcmp(argv[i], "-utf8") == 0 ) {
-			rendertype = RENDER_UTF8;
-		} else
-		if ( strcmp(argv[i], "-unicode") == 0 ) {
-			rendertype = RENDER_UNICODE;
-		} else
-		if ( strcmp(argv[i], "-b") == 0 ) {
-			renderstyle |= TTF_STYLE_BOLD;
-		} else
-		if ( strcmp(argv[i], "-i") == 0 ) {
-			renderstyle |= TTF_STYLE_ITALIC;
-		} else
-		if ( strcmp(argv[i], "-u") == 0 ) {
-			renderstyle |= TTF_STYLE_UNDERLINE;
-		} else
-		if ( strcmp(argv[i], "-dump") == 0 ) {
-			dump = 1;
-		} else
-		if ( strcmp(argv[i], "-fgcol") == 0 ) {
-			int r, g, b;
-			if ( sscanf (argv[++i], "%d,%d,%d", &r, &g, &b) != 3 ) {
-				fprintf(stderr, Usage, argv0);
-				return(1);
-			}
-			forecol->r = (Uint8)r;
-			forecol->g = (Uint8)g;
-			forecol->b = (Uint8)b;
-		} else
-		if ( strcmp(argv[i], "-bgcol") == 0 ) {
-			int r, g, b;
-			if ( sscanf (argv[++i], "%d,%d,%d", &r, &g, &b) != 3 ) {
-				fprintf(stderr, Usage, argv0);
-				return(1);
-			}
-			backcol->r = (Uint8)r;
-			backcol->g = (Uint8)g;
-			backcol->b = (Uint8)b;
-		} else {
-			fprintf(stderr, Usage, argv0);
-			return(1);
-		}
-	}
-	argv += i;
-	argc -= i;
-
-	/* Check usage */
-	if ( ! argv[0] ) {
-		fprintf(stderr, Usage, argv0);
-		return(1);
-	}
-
-	/* Initialize SDL */
-	if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
-		fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError());
-		return(2);
-	}
-	atexit(SDL_Quit);
-
-	/* Initialize the TTF library */
-	if ( TTF_Init() < 0 ) {
-		fprintf(stderr, "Couldn't initialize TTF: %s\n",SDL_GetError());
-		return(2);
-	}
-	atexit(TTF_Quit);
-
-	/* Open the font file with the requested point size */
-	ptsize = 0;
-	if ( argc > 1 ) {
-		ptsize = atoi(argv[1]);
-	}
-	if ( ptsize == 0 ) {
-		i = 2;
-		ptsize = DEFAULT_PTSIZE;
-	} else {
-		i = 3;
-	}
-	font = TTF_OpenFont(argv[0], ptsize);
-	if ( font == NULL ) {
-		fprintf(stderr, "Couldn't load %d pt font from %s: %s\n",
-					ptsize, argv[0], SDL_GetError());
-		return(2);
-	}
-
-	if( dump ) {
-
-		for( i = 48; i < 123; i++ ) {
-			SDL_Surface* glyph = NULL;
-
-			glyph = TTF_RenderGlyph_Shaded( font, i, *forecol, *backcol );
-
-			if( glyph ) {
-				char outname[64];
-				sprintf( outname, "glyph-%d.bmp", i );
-				SDL_SaveBMP( glyph, outname );
-			}
-
-		}
-
-		return( 0 );
-	}
-
-	/* Set a 640x480 video mode */
-	screen = SDL_SetVideoMode(640, 480, 0, SDL_OPENGL);
-	if ( screen == NULL ) {
-		fprintf(stderr, "Couldn't set 640x480 OpenGL mode: %s\n",
-							SDL_GetError());
-		return(2);
-	}
-
-	/* Render and center the message */
-	if ( argc > 2 ) {
-		message = argv[2];
-	} else {
-		message = DEFAULT_TEXT;
-	}
-	switch (rendertype) {
-	    case RENDER_LATIN1:
-		text = TTF_RenderText_Blended(font, message, *forecol);
-		break;
-
-	    case RENDER_UTF8:
-		text = TTF_RenderUTF8_Blended(font, message, *forecol);
-		break;
-
-	    case RENDER_UNICODE:
-		{
-			/* This doesn't actually work because you can't pass
-			   UNICODE text in via command line, AFAIK, but...
-			 */
-			Uint16 unicode_text[BUFSIZ];
-			int index;
-			for ( index = 0; (message[0] || message[1]); ++index ) {
-				unicode_text[index]  = ((Uint8 *)message)[0];
-				unicode_text[index] <<= 8;
-				unicode_text[index] |= ((Uint8 *)message)[1];
-				message += 2;
-			}
-			text = TTF_RenderUNICODE_Blended(font,
-					unicode_text, *forecol);
-		}
-		break;
-	    default:
-		text = NULL; /* This shouldn't happen */
-		break;
-	}
-	if ( text == NULL ) {
-		fprintf(stderr, "Couldn't render text: %s\n", SDL_GetError());
-		TTF_CloseFont(font);
-		return(2);
-	}
-	x = (screen->w - text->w)/2;
-	y = (screen->h - text->h)/2;
-	w = text->w;
-	h = text->h;
-	printf("Font is generally %d big, and string is %hd big\n",
-						TTF_FontHeight(font), text->h);
-
-	/* Convert the text into an OpenGL texture */
-	glGetError();
-	texture = SDL_GL_LoadTexture(text, texcoord);
-	if ( (gl_error = glGetError()) != GL_NO_ERROR ) {
-		/* If this failed, the text may exceed texture size limits */
-		printf("Warning: Couldn't create texture: 0x%x\n", gl_error);
-	}
-
-	/* Make texture coordinates easy to understand */
-	texMinX = texcoord[0];
-	texMinY = texcoord[1];
-	texMaxX = texcoord[2];
-	texMaxY = texcoord[3];
-
-	/* We don't need the original text surface anymore */
-	SDL_FreeSurface(text);
-
-	/* Initialize the GL state */
-	glViewport( 0, 0, screen->w, screen->h );
-	glMatrixMode( GL_PROJECTION );
-	glLoadIdentity( );
-
-	glOrtho( -2.0, 2.0, -2.0, 2.0, -20.0, 20.0 );
-
-	glMatrixMode( GL_MODELVIEW );
-	glLoadIdentity( );
-
-	glEnable(GL_DEPTH_TEST);
-
-	glDepthFunc(GL_LESS);
-
-	glShadeModel(GL_SMOOTH);
-
-	/* Wait for a keystroke, and blit text on mouse press */
-	done = 0;
-	while ( ! done ) {
-
-	  /* Show the text on the screen */
-	  SDL_GL_Enter2DMode();
-	  glBindTexture(GL_TEXTURE_2D, texture);
-	  glBegin(GL_QUADS);
-	  glTexCoord2f(texMinX, texMinY); glVertex2i(x,   y  );
-	  glTexCoord2f(texMaxX, texMinY); glVertex2i(x+w, y  );
-	  glTexCoord2f(texMinX, texMaxY); glVertex2i(x,   y+h);
-	  glTexCoord2f(texMaxX, texMaxY); glVertex2i(x+w, y+h);
-	  glEnd();
-	  SDL_GL_Leave2DMode();
-	  
-	  /* Swap the buffers so everything is visible */
-	  SDL_GL_SwapBuffers( );
-	}
-	TTF_CloseFont(font);
-	return(0);
-}
-
+int GLFont::power_of_two(int input)
+{
+  int value = 1;
+  
+  while ( value < input ) {
+    value <<= 1;
+  }
+  return value;
+}
Index: orxonox/branches/textEngine/src/lib/graphics/font/glfont.h
===================================================================
--- orxonox/branches/textEngine/src/lib/graphics/font/glfont.h	(revision 3681)
+++ orxonox/branches/textEngine/src/lib/graphics/font/glfont.h	(revision 3682)
@@ -7,5 +7,5 @@
 #define _GLFONT_H
 
-#include "../glincl.h"
+#include "glincl.h"
 
 class GLFont
@@ -44,4 +44,11 @@
   static bool ttfInitialized;
 
+  void enter2DMode(void);
+  void leave2DMode(void);
+
+  GLuint loadTexture(SDL_Surface* surface, GLfloat* texcoord);
+
+  static int power_of_two(int input);
+
 };
 
