Index: /orxonox/branches/trackManager/Makefile.am
===================================================================
--- /orxonox/branches/trackManager/Makefile.am	(revision 3497)
+++ /orxonox/branches/trackManager/Makefile.am	(revision 3498)
@@ -16,5 +16,5 @@
 ## doxygen stuff
 if DOXYGEN
-DOXYGEN_INPUT = "src src/gui src/importer"
+DOXYGEN_INPUT = "src src/lib/gui/gui src/lib/graphics/importer"
 
 ## Exclude the application wizard templates, and some file templates
Index: /orxonox/branches/trackManager/Makefile.in
===================================================================
--- /orxonox/branches/trackManager/Makefile.in	(revision 3497)
+++ /orxonox/branches/trackManager/Makefile.in	(revision 3498)
@@ -191,5 +191,5 @@
 	     doc/doxyconf/project 
 
-@DOXYGEN_TRUE@DOXYGEN_INPUT = "src src/gui src/importer"
+@DOXYGEN_TRUE@DOXYGEN_INPUT = "src src/lib/gui/gui src/lib/graphics/importer"
 @DOXYGEN_TRUE@DOXYGEN_EXCLUDE = 
 @DOXYGEN_TRUE@DOXYGEN_EXAMPLE_PATH = 
Index: /orxonox/branches/trackManager/configure
===================================================================
--- /orxonox/branches/trackManager/configure	(revision 3497)
+++ /orxonox/branches/trackManager/configure	(revision 3498)
@@ -8182,5 +8182,5 @@
 ## OUTPUT CONFIGURE ##
 ######################
-                                                  ac_config_files="$ac_config_files Makefile src/Makefile src/importer/Makefile src/console/Makefile src/gui/Makefile"
+                                                                                ac_config_files="$ac_config_files Makefile src/Makefile src/lib/Makefile src/lib/graphics/Makefile src/lib/graphics/importer/Makefile src/lib/gui/Makefile src/lib/gui/console/Makefile src/lib/gui/gui/Makefile"
 
 
@@ -8778,7 +8778,10 @@
   "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
   "src/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
-  "src/importer/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/importer/Makefile" ;;
-  "src/console/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/console/Makefile" ;;
-  "src/gui/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/gui/Makefile" ;;
+  "src/lib/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/lib/Makefile" ;;
+  "src/lib/graphics/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/lib/graphics/Makefile" ;;
+  "src/lib/graphics/importer/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/lib/graphics/importer/Makefile" ;;
+  "src/lib/gui/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/lib/gui/Makefile" ;;
+  "src/lib/gui/console/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/lib/gui/console/Makefile" ;;
+  "src/lib/gui/gui/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/lib/gui/gui/Makefile" ;;
   "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
   "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
Index: /orxonox/branches/trackManager/configure.ac
===================================================================
--- /orxonox/branches/trackManager/configure.ac	(revision 3497)
+++ /orxonox/branches/trackManager/configure.ac	(revision 3498)
@@ -529,7 +529,10 @@
 AC_CONFIG_FILES([Makefile
                  src/Makefile
-		 src/importer/Makefile
-		 src/console/Makefile
-                 src/gui/Makefile])
+		 src/lib/Makefile
+		 src/lib/graphics/Makefile
+		 src/lib/graphics/importer/Makefile
+		 src/lib/gui/Makefile
+		 src/lib/gui/console/Makefile
+                 src/lib/gui/gui/Makefile])
 
 AC_OUTPUT
Index: /orxonox/branches/trackManager/doc/orxodox.checkFiles.pl
===================================================================
--- /orxonox/branches/trackManager/doc/orxodox.checkFiles.pl	(revision 3498)
+++ /orxonox/branches/trackManager/doc/orxodox.checkFiles.pl	(revision 3498)
@@ -0,0 +1,294 @@
+#!/usr/bin/perl
+########################################################################## 
+#   orxonox - the future of 3D-vertical-scrollers			 #
+#									 #
+#   Copyright (C) 2004 orx						 #
+#									 #
+#   This program is free software; you can redistribute it and/or modify #
+#   it under the terms of the GNU General Public License as published by #
+#   the Free Software Foundation; either version 2, or (at your option)  #
+#   any later version.							 #
+#									 #
+#   ### File Specific:							 #
+#   main-programmer: Benjamin Grauer					 #
+#   co-programmer: ...							 #
+#									 #
+#   This Script is for parsing single or multiple files for their        #
+#   doxygeb-tags, and outputs the warnings and errors, but prehibits     #
+#   the progress from being displayed.                                   #
+#   Usage: ./orxodox.checkFiles.pl [fileName1 [fileName2 [...]]]         #
+#   This script ignores file-extensions, and assumes that either         #
+#   .h, .cc or both may exist, and searches for them.                    #
+##########################################################################
+
+$inputFiles = @ARGV[0];
+$tempDoxFile = "TMPorxodox";
+
+unless (open (DOXfile, ">$tempDoxFile"))
+ {
+   die("cannot open file\n");
+ }
+
+$processFiles = "";
+$numberOfFiles = 0;
+foreach $inputFile (@ARGV)
+  {
+    $tmpNumber = $numberOfFiles;
+
+    $inputFile =~ s/\.cc$//;
+    $inputFile =~ s/\.h$//;
+
+    print "checking file $inputFile: ";
+
+    $inputFile =~ s/$/\.h/;
+    if (-e $inputFile)
+      {
+	$processFiles = "$processFiles $inputFile";
+	$numberOfFiles++;
+	print "found .h ";
+      }
+    $inputFile =~ s/\.h$/\.cc/;
+    if (-e $inputFile)
+      {
+	$processFiles = "$processFiles $inputFile";
+	$numberOfFiles++;
+	print "...found .cc ";
+      }
+    if ($tmpNumber == $numberOfFiles) {print "no matching files found";}
+    print "\n";
+  }
+
+if ($numberOfFiles == 0 && @ARGV !=0){
+  die("no Files have been found\n");}
+
+print "==================================================================\n";
+print "Generating temporary Documentation File\n";
+print "==================================================================\n";
+
+print DOXfile "# THIS IS A DEFAULT FILE FOR DOXYGEN DOCUMENTATION";
+
+printf DOXfile "# Doxyfile 1.3.7 \
+## SAMPLE FILE (to be executed from orxonox/trunk/) \
+ \
+#--------------------------------------------------------------------------- \
+# Project related configuration options \
+#--------------------------------------------------------------------------- \
+PROJECT_NAME           = Orxonox \
+PROJECT_NUMBER         = 1 \
+OUTPUT_DIRECTORY       = doxygen/ \
+CREATE_SUBDIRS         = YES \
+OUTPUT_LANGUAGE        = English \
+USE_WINDOWS_ENCODING   = YES \
+BRIEF_MEMBER_DESC      = YES \
+REPEAT_BRIEF           = YES \
+ABBREVIATE_BRIEF       =  \
+ALWAYS_DETAILED_SEC    = NO \
+INLINE_INHERITED_MEMB  = NO \
+FULL_PATH_NAMES        = NO \
+STRIP_FROM_PATH        =  \
+STRIP_FROM_INC_PATH    =  \
+SHORT_NAMES            = NO \
+JAVADOC_AUTOBRIEF      = NO \
+MULTILINE_CPP_IS_BRIEF = NO \
+DETAILS_AT_TOP         = NO \
+INHERIT_DOCS           = YES \
+DISTRIBUTE_GROUP_DOC   = NO \
+TAB_SIZE               = 8 \
+ALIASES                =  \
+OPTIMIZE_OUTPUT_FOR_C  = NO \
+OPTIMIZE_OUTPUT_JAVA   = NO \
+SUBGROUPING            = YES \
+#--------------------------------------------------------------------------- \
+# Build related configuration options \
+#--------------------------------------------------------------------------- \
+EXTRACT_ALL            = NO \
+EXTRACT_PRIVATE        = YES \
+EXTRACT_STATIC         = YES \
+EXTRACT_LOCAL_CLASSES  = YES \
+EXTRACT_LOCAL_METHODS  = NO \
+HIDE_UNDOC_MEMBERS     = NO \
+HIDE_UNDOC_CLASSES     = NO \
+HIDE_FRIEND_COMPOUNDS  = NO \
+HIDE_IN_BODY_DOCS      = NO \
+INTERNAL_DOCS          = NO \
+CASE_SENSE_NAMES       = YES \
+HIDE_SCOPE_NAMES       = NO \
+SHOW_INCLUDE_FILES     = YES \
+INLINE_INFO            = YES \
+SORT_MEMBER_DOCS       = YES \
+SORT_BRIEF_DOCS        = NO \
+SORT_BY_SCOPE_NAME     = NO \
+GENERATE_TODOLIST      = YES \
+GENERATE_TESTLIST      = YES \
+GENERATE_BUGLIST       = YES \
+GENERATE_DEPRECATEDLIST= YES \
+ENABLED_SECTIONS       =  \
+MAX_INITIALIZER_LINES  = 30 \
+SHOW_USED_FILES        = YES \
+#--------------------------------------------------------------------------- \
+# configuration options related to warning and progress messages \
+#--------------------------------------------------------------------------- \
+QUIET                  = YES \
+WARNINGS               = YES \
+WARN_IF_UNDOCUMENTED   = YES \
+WARN_IF_DOC_ERROR      = YES \
+WARN_FORMAT            = \"\$file:\$line: \$text\" \
+WARN_LOGFILE           =  \
+#--------------------------------------------------------------------------- \
+# configuration options related to the input files \
+#--------------------------------------------------------------------------- \
+INPUT                  = $processFiles \
+FILE_PATTERNS          =  \
+RECURSIVE              = NO \
+EXCLUDE                =  \
+EXCLUDE_SYMLINKS       = NO \
+EXCLUDE_PATTERNS       =  \
+EXAMPLE_PATH           =  \
+EXAMPLE_PATTERNS       =  \
+EXAMPLE_RECURSIVE      = NO \
+IMAGE_PATH             =  \
+INPUT_FILTER           =  \
+FILTER_SOURCE_FILES    = NO \
+#--------------------------------------------------------------------------- \
+# configuration options related to source browsing \
+#--------------------------------------------------------------------------- \
+SOURCE_BROWSER         = NO \
+INLINE_SOURCES         = NO \
+STRIP_CODE_COMMENTS    = YES \
+REFERENCED_BY_RELATION = YES \
+REFERENCES_RELATION    = YES \
+VERBATIM_HEADERS       = YES \
+#--------------------------------------------------------------------------- \
+# configuration options related to the alphabetical class index \
+#--------------------------------------------------------------------------- \
+ALPHABETICAL_INDEX     = NO \
+COLS_IN_ALPHA_INDEX    = 5 \
+IGNORE_PREFIX          =  \
+#--------------------------------------------------------------------------- \
+# configuration options related to the HTML output \
+#--------------------------------------------------------------------------- \
+GENERATE_HTML          = YES \
+HTML_OUTPUT            = html \
+HTML_FILE_EXTENSION    = .html \
+HTML_HEADER            =  \
+HTML_FOOTER            =  \
+HTML_STYLESHEET        =  \
+HTML_ALIGN_MEMBERS     = YES \
+GENERATE_HTMLHELP      = NO \
+CHM_FILE               =  \
+HHC_LOCATION           =  \
+GENERATE_CHI           = NO \
+BINARY_TOC             = NO \
+TOC_EXPAND             = NO \
+DISABLE_INDEX          = NO \
+ENUM_VALUES_PER_LINE   = 4 \
+GENERATE_TREEVIEW      = NO \
+TREEVIEW_WIDTH         = 250 \
+#--------------------------------------------------------------------------- \
+# configuration options related to the LaTeX output \
+#--------------------------------------------------------------------------- \
+GENERATE_LATEX         = NO \
+LATEX_OUTPUT           = latex \
+LATEX_CMD_NAME         = latex \
+MAKEINDEX_CMD_NAME     = makeindex \
+COMPACT_LATEX          = NO \
+PAPER_TYPE             = a4wide \
+EXTRA_PACKAGES         =  \
+LATEX_HEADER           =  \
+PDF_HYPERLINKS         = NO \
+USE_PDFLATEX           = NO \
+LATEX_BATCHMODE        = NO \
+LATEX_HIDE_INDICES     = NO \
+#--------------------------------------------------------------------------- \
+# configuration options related to the RTF output \
+#--------------------------------------------------------------------------- \
+GENERATE_RTF           = NO \
+RTF_OUTPUT             = rtf \
+COMPACT_RTF            = NO \
+RTF_HYPERLINKS         = NO \
+RTF_STYLESHEET_FILE    =  \
+RTF_EXTENSIONS_FILE    =  \
+#--------------------------------------------------------------------------- \
+# configuration options related to the man page output \
+#--------------------------------------------------------------------------- \
+GENERATE_MAN           = NO \
+MAN_OUTPUT             = man \
+MAN_EXTENSION          = .3 \
+MAN_LINKS              = NO \
+#--------------------------------------------------------------------------- \
+# configuration options related to the XML output \
+#--------------------------------------------------------------------------- \
+GENERATE_XML           = NO \
+XML_OUTPUT             = xml \
+XML_SCHEMA             =  \
+XML_DTD                =  \
+XML_PROGRAMLISTING     = YES \
+#--------------------------------------------------------------------------- \
+# configuration options for the AutoGen Definitions output \
+#--------------------------------------------------------------------------- \
+GENERATE_AUTOGEN_DEF   = NO \
+#--------------------------------------------------------------------------- \
+# configuration options related to the Perl module output \
+#--------------------------------------------------------------------------- \
+GENERATE_PERLMOD       = NO \
+PERLMOD_LATEX          = NO \
+PERLMOD_PRETTY         = YES \
+PERLMOD_MAKEVAR_PREFIX =  \
+#--------------------------------------------------------------------------- \
+# Configuration options related to the preprocessor    \
+#--------------------------------------------------------------------------- \
+ENABLE_PREPROCESSING   = YES \
+MACRO_EXPANSION        = NO \
+EXPAND_ONLY_PREDEF     = NO \
+SEARCH_INCLUDES        = YES \
+INCLUDE_PATH           =  \
+INCLUDE_FILE_PATTERNS  =  \
+PREDEFINED             =  \
+EXPAND_AS_DEFINED      =  \
+SKIP_FUNCTION_MACROS   = YES \
+#--------------------------------------------------------------------------- \
+# Configuration::additions related to external references    \
+#--------------------------------------------------------------------------- \
+TAGFILES               =  \
+GENERATE_TAGFILE       =  \
+ALLEXTERNALS           = NO \
+EXTERNAL_GROUPS        = YES \
+PERL_PATH              = /usr/bin/perl \
+#--------------------------------------------------------------------------- \
+# Configuration options related to the dot tool    \
+#--------------------------------------------------------------------------- \
+CLASS_DIAGRAMS         = YES \
+HIDE_UNDOC_RELATIONS   = YES \
+HAVE_DOT               = NO \
+CLASS_GRAPH            = YES \
+COLLABORATION_GRAPH    = YES \
+UML_LOOK               = NO \
+TEMPLATE_RELATIONS     = NO \
+INCLUDE_GRAPH          = YES \
+INCLUDED_BY_GRAPH      = YES \
+CALL_GRAPH             = NO \
+GRAPHICAL_HIERARCHY    = YES \
+DOT_IMAGE_FORMAT       = png \
+DOT_PATH               =  \
+DOTFILE_DIRS           =  \
+MAX_DOT_GRAPH_WIDTH    = 1024 \
+MAX_DOT_GRAPH_HEIGHT   = 1024 \
+MAX_DOT_GRAPH_DEPTH    = 0 \
+GENERATE_LEGEND        = YES \
+DOT_CLEANUP            = YES \
+#--------------------------------------------------------------------------- \
+# Configuration::additions related to the search engine    \
+#--------------------------------------------------------------------------- \
+SEARCHENGINE           = NO \
+ \
+";
+
+close DOXfile;
+
+print "==================================================================\n";
+print "Generating Documentation of $processFiles\n";
+print "==================================================================\n";
+exec("doxygen $tempDoxFile");
+
+
+unlink $tmpDoxFile;
Index: /orxonox/branches/trackManager/src/Makefile.am
===================================================================
--- /orxonox/branches/trackManager/src/Makefile.am	(revision 3497)
+++ /orxonox/branches/trackManager/src/Makefile.am	(revision 3498)
@@ -1,3 +1,23 @@
-#AM_CXXFLAGS=""
+MAINSRCDIR=.
+AM_CXXFLAGS=-I$(MAINSRCDIR)
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/world_entities
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/story_entities
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/coord
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/data
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/gaphics
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/graphics/font
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/graphics/importer
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/gui
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/lang
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/util
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/math
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/defs
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/font
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/network
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/glmenu
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/ai
+
+
 AM_LDFLAGS= $(MWINDOWS)
 
@@ -8,90 +28,86 @@
 
 orxonox_SOURCES= orxonox.cc \
-		 world.cc \
-		 player.cc \
-		 collision.cc \
-		 data_tank.cc \
-		 world_entity.cc \
-		 vector.cc \
+		 game_loader.cc \
+		 command_node.cc \
+		 keynames.cc \
 		 camera.cc \
-		 command_node.cc \
-		 ini_parser.cc \
-		 keynames.cc \
-		 base_entity.cc \
-		 game_loader.cc \
-		 campaign.cc \
-		 story_entity.cc \
-		 environment.cc \
-		 importer/model.cc \
-		 importer/objModel.cc \
-		 importer/array.cc \
-		 importer/material.cc \
-		 importer/texture.cc \
-		 list.cc \
-		 p_node.cc \
-		 null_parent.cc \
-		 track_node.cc \
-		 base_object.cc \
-		 helper_parent.cc \
 		 track_manager.cc \
-		 matrix.cc \
-		 curve.cc \
-		 glmenu_imagescreen.cc \
-		 skysphere.cc 
+		 light.cc \
+		 story_entities/story_entity.cc \
+		 story_entities/campaign.cc \
+		 story_entities/world.cc \
+		 world_entities/world_entity.cc \
+		 world_entities/player.cc \
+		 world_entities/environment.cc \
+		 world_entities/skysphere.cc \
+		 ai/ai.cc \
+		 lib/coord/p_node.cc \
+		 lib/coord/null_parent.cc \
+		 lib/coord/helper_parent.cc \
+		 lib/data/data_tank.cc \
+		 lib/graphics/font/fontset.cc \
+		 lib/graphics/importer/array.cc \
+		 lib/graphics/importer/objModel.cc \
+		 lib/graphics/importer/model.cc \
+		 lib/graphics/importer/material.cc \
+		 lib/graphics/importer/texture.cc \
+		 lib/lang/base_entity.cc \
+		 lib/lang/base_object.cc \
+		 lib/util/ini_parser.cc \
+		 lib/util/list.cc \
+		 lib/math/vector.cc \
+		 lib/math/matrix.cc \
+		 lib/math/curve.cc \
+		 glmenu/glmenu_imagescreen.cc 
 
-noinst_HEADERS = ability.h \
-		 data_tank.h \
-		 collision.h \
-		 npc.h \
-		 stdincl.h \
-		 ai.h \
-		 environment.h \
-		 orxonox.h \
-		 synchronisable.h \
-		 base_entity.h \
-		 error.h \
-		 player.h \
+noinst_HEADERS = orxonox.h \
+		 game_loader.h \
+		 track_manager.h \
+                 ability.h \
 		 camera.h \
-		 ini_parser.h \
-		 power_up.h \
-		 vector.h \
 		 keynames.h \
 		 proto_class.h \
-		 world.h \
 		 command_node.h \
-		 list.h \
-		 shoot_laser.h \
-		 world_entity.h \
 		 message_structures.h \
-		 shoot_rocket.h \
-		 list_template.h \
-		 story_entity.h \
-		 story_def.h \
-		 game_loader.h \
-		 campaign.h \
-		 p_node.h \
-		 null_parent.h \
-		 base_object.h \
-		 helper_parent.h \
-		 track_manager.h \
-		 matrix.h \
-		 curve.h \
-		 glmenu_imagescreen.h \
-		 debug.h \
-		 skysphere.h
+		 light.h \
+		 story_entities/story_entity.h \
+		 story_entities/story_def.h \
+		 story_entities/campaign.h \
+		 story_entities/world.h \
+		 world_entities/world_entity.h \
+		 world_entities/player.h \
+		 world_entities/npc.h \
+		 world_entities/environment.h \
+		 world_entities/skysphere.h \
+		 world_entities/shoot_laser.h \
+		 world_entities/shoot_rocket.h \
+		 world_entities/power_up.h \
+		 ai/ai.h \
+		 network/synchronisable.h \
+		 defs/stdincl.h \
+		 defs/glincl.h \
+		 defs/error.h \
+		 defs/debug.h \
+		 lib/coord/p_node.h \
+		 lib/coord/null_parent.h \
+		 lib/coord/helper_parent.h \
+		 lib/graphics/font/fontset.h \
+		 lib/data/data_tank.h \
+		 lib/lang/base_entity.h \
+		 lib/lang/base_object.h \
+		 lib/util/list.h \
+		 lib/util/list_template.h \
+		 lib/util/ini_parser.h \
+		 lib/math/vector.h \
+		 lib/math/matrix.h \
+		 lib/math/curve.h \
+		 glmenu/glmenu_imagescreen.h 
+
 
 ## orxonox.conf will be used from home-dir instead.
 EXTRA_DIST = orxonox.conf
 
-### GTK_RELATED
-if HAVE_GTK2
-  GTK_PROGS =console
-else
-  GTK_PROGS =
-endif
 if SUB_PROJECTS
-  SUB_PROGS = importer \
-	      gui \
-	      $(GTK_PROGS)
+  SUB_PROGS = lib
 else
   SUB_PROGS = 
Index: /orxonox/branches/trackManager/src/Makefile.in
===================================================================
--- /orxonox/branches/trackManager/src/Makefile.in	(revision 3497)
+++ /orxonox/branches/trackManager/src/Makefile.in	(revision 3498)
@@ -53,16 +53,16 @@
 binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
 PROGRAMS = $(bin_PROGRAMS)
-am_orxonox_OBJECTS = orxonox.$(OBJEXT) world.$(OBJEXT) \
-	player.$(OBJEXT) collision.$(OBJEXT) data_tank.$(OBJEXT) \
-	world_entity.$(OBJEXT) vector.$(OBJEXT) camera.$(OBJEXT) \
-	command_node.$(OBJEXT) ini_parser.$(OBJEXT) keynames.$(OBJEXT) \
-	base_entity.$(OBJEXT) game_loader.$(OBJEXT) campaign.$(OBJEXT) \
-	story_entity.$(OBJEXT) environment.$(OBJEXT) model.$(OBJEXT) \
-	objModel.$(OBJEXT) array.$(OBJEXT) material.$(OBJEXT) \
-	texture.$(OBJEXT) list.$(OBJEXT) p_node.$(OBJEXT) \
-	null_parent.$(OBJEXT) track_node.$(OBJEXT) \
-	base_object.$(OBJEXT) helper_parent.$(OBJEXT) \
-	track_manager.$(OBJEXT) matrix.$(OBJEXT) curve.$(OBJEXT) \
-	glmenu_imagescreen.$(OBJEXT) skysphere.$(OBJEXT)
+am_orxonox_OBJECTS = orxonox.$(OBJEXT) game_loader.$(OBJEXT) \
+	command_node.$(OBJEXT) keynames.$(OBJEXT) camera.$(OBJEXT) \
+	track_manager.$(OBJEXT) light.$(OBJEXT) story_entity.$(OBJEXT) \
+	campaign.$(OBJEXT) world.$(OBJEXT) world_entity.$(OBJEXT) \
+	player.$(OBJEXT) environment.$(OBJEXT) skysphere.$(OBJEXT) \
+	ai.$(OBJEXT) p_node.$(OBJEXT) null_parent.$(OBJEXT) \
+	helper_parent.$(OBJEXT) data_tank.$(OBJEXT) fontset.$(OBJEXT) \
+	array.$(OBJEXT) objModel.$(OBJEXT) model.$(OBJEXT) \
+	material.$(OBJEXT) texture.$(OBJEXT) base_entity.$(OBJEXT) \
+	base_object.$(OBJEXT) ini_parser.$(OBJEXT) list.$(OBJEXT) \
+	vector.$(OBJEXT) matrix.$(OBJEXT) curve.$(OBJEXT) \
+	glmenu_imagescreen.$(OBJEXT)
 orxonox_OBJECTS = $(am_orxonox_OBJECTS)
 orxonox_LDADD = $(LDADD)
@@ -70,23 +70,23 @@
 depcomp = $(SHELL) $(top_srcdir)/depcomp
 am__depfiles_maybe = depfiles
-@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/array.Po \
+@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/ai.Po ./$(DEPDIR)/array.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/base_entity.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/base_object.Po ./$(DEPDIR)/camera.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/campaign.Po ./$(DEPDIR)/collision.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/campaign.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/command_node.Po ./$(DEPDIR)/curve.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/data_tank.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/environment.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/environment.Po ./$(DEPDIR)/fontset.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/game_loader.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/glmenu_imagescreen.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/helper_parent.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/ini_parser.Po ./$(DEPDIR)/keynames.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/list.Po ./$(DEPDIR)/material.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/matrix.Po ./$(DEPDIR)/model.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/null_parent.Po ./$(DEPDIR)/objModel.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/orxonox.Po ./$(DEPDIR)/p_node.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/player.Po ./$(DEPDIR)/skysphere.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/light.Po ./$(DEPDIR)/list.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/material.Po ./$(DEPDIR)/matrix.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/model.Po ./$(DEPDIR)/null_parent.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/objModel.Po ./$(DEPDIR)/orxonox.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/p_node.Po ./$(DEPDIR)/player.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/skysphere.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/story_entity.Po ./$(DEPDIR)/texture.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/track_manager.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/track_node.Po ./$(DEPDIR)/vector.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/track_manager.Po ./$(DEPDIR)/vector.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/world.Po ./$(DEPDIR)/world_entity.Po
 CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
@@ -106,5 +106,5 @@
 ETAGS = etags
 CTAGS = ctags
-DIST_SUBDIRS = . importer gui console
+DIST_SUBDIRS = . lib
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
@@ -214,91 +214,87 @@
 target_os = @target_os@
 target_vendor = @target_vendor@
-
-#AM_CXXFLAGS=""
+MAINSRCDIR = .
+AM_CXXFLAGS = -I$(MAINSRCDIR) -I$(MAINSRCDIR)/world_entities -I$(MAINSRCDIR)/story_entities -I$(MAINSRCDIR)/lib -I$(MAINSRCDIR)/lib/coord -I$(MAINSRCDIR)/lib/data -I$(MAINSRCDIR)/lib/gaphics -I$(MAINSRCDIR)/lib/graphics/font -I$(MAINSRCDIR)/lib/graphics/importer -I$(MAINSRCDIR)/lib/gui -I$(MAINSRCDIR)/lib/lang -I$(MAINSRCDIR)/lib/util -I$(MAINSRCDIR)/lib/math -I$(MAINSRCDIR)/defs -I$(MAINSRCDIR)/font -I$(MAINSRCDIR)/network -I$(MAINSRCDIR)/glmenu -I$(MAINSRCDIR)/ai
 AM_LDFLAGS = $(MWINDOWS)
 orxonox_SOURCES = orxonox.cc \
-		 world.cc \
-		 player.cc \
-		 collision.cc \
-		 data_tank.cc \
-		 world_entity.cc \
-		 vector.cc \
+		 game_loader.cc \
+		 command_node.cc \
+		 keynames.cc \
 		 camera.cc \
-		 command_node.cc \
-		 ini_parser.cc \
-		 keynames.cc \
-		 base_entity.cc \
-		 game_loader.cc \
-		 campaign.cc \
-		 story_entity.cc \
-		 environment.cc \
-		 importer/model.cc \
-		 importer/objModel.cc \
-		 importer/array.cc \
-		 importer/material.cc \
-		 importer/texture.cc \
-		 list.cc \
-		 p_node.cc \
-		 null_parent.cc \
-		 track_node.cc \
-		 base_object.cc \
-		 helper_parent.cc \
 		 track_manager.cc \
-		 matrix.cc \
-		 curve.cc \
-		 glmenu_imagescreen.cc \
-		 skysphere.cc 
-
-noinst_HEADERS = ability.h \
-		 data_tank.h \
-		 collision.h \
-		 npc.h \
-		 stdincl.h \
-		 ai.h \
-		 environment.h \
-		 orxonox.h \
-		 synchronisable.h \
-		 base_entity.h \
-		 error.h \
-		 player.h \
+		 light.cc \
+		 story_entities/story_entity.cc \
+		 story_entities/campaign.cc \
+		 story_entities/world.cc \
+		 world_entities/world_entity.cc \
+		 world_entities/player.cc \
+		 world_entities/environment.cc \
+		 world_entities/skysphere.cc \
+		 ai/ai.cc \
+		 lib/coord/p_node.cc \
+		 lib/coord/null_parent.cc \
+		 lib/coord/helper_parent.cc \
+		 lib/data/data_tank.cc \
+		 lib/graphics/font/fontset.cc \
+		 lib/graphics/importer/array.cc \
+		 lib/graphics/importer/objModel.cc \
+		 lib/graphics/importer/model.cc \
+		 lib/graphics/importer/material.cc \
+		 lib/graphics/importer/texture.cc \
+		 lib/lang/base_entity.cc \
+		 lib/lang/base_object.cc \
+		 lib/util/ini_parser.cc \
+		 lib/util/list.cc \
+		 lib/math/vector.cc \
+		 lib/math/matrix.cc \
+		 lib/math/curve.cc \
+		 glmenu/glmenu_imagescreen.cc 
+
+noinst_HEADERS = orxonox.h \
+		 game_loader.h \
+		 track_manager.h \
+                 ability.h \
 		 camera.h \
-		 ini_parser.h \
-		 power_up.h \
-		 vector.h \
 		 keynames.h \
 		 proto_class.h \
-		 world.h \
 		 command_node.h \
-		 list.h \
-		 shoot_laser.h \
-		 world_entity.h \
 		 message_structures.h \
-		 shoot_rocket.h \
-		 list_template.h \
-		 story_entity.h \
-		 story_def.h \
-		 game_loader.h \
-		 campaign.h \
-		 p_node.h \
-		 null_parent.h \
-		 base_object.h \
-		 helper_parent.h \
-		 track_manager.h \
-		 matrix.h \
-		 curve.h \
-		 glmenu_imagescreen.h \
-		 debug.h \
-		 skysphere.h
+		 light.h \
+		 story_entities/story_entity.h \
+		 story_entities/story_def.h \
+		 story_entities/campaign.h \
+		 story_entities/world.h \
+		 world_entities/world_entity.h \
+		 world_entities/player.h \
+		 world_entities/npc.h \
+		 world_entities/environment.h \
+		 world_entities/skysphere.h \
+		 world_entities/shoot_laser.h \
+		 world_entities/shoot_rocket.h \
+		 world_entities/power_up.h \
+		 ai/ai.h \
+		 network/synchronisable.h \
+		 defs/stdincl.h \
+		 defs/glincl.h \
+		 defs/error.h \
+		 defs/debug.h \
+		 lib/coord/p_node.h \
+		 lib/coord/null_parent.h \
+		 lib/coord/helper_parent.h \
+		 lib/graphics/font/fontset.h \
+		 lib/data/data_tank.h \
+		 lib/lang/base_entity.h \
+		 lib/lang/base_object.h \
+		 lib/util/list.h \
+		 lib/util/list_template.h \
+		 lib/util/ini_parser.h \
+		 lib/math/vector.h \
+		 lib/math/matrix.h \
+		 lib/math/curve.h \
+		 glmenu/glmenu_imagescreen.h 
 
 EXTRA_DIST = orxonox.conf
-@HAVE_GTK2_FALSE@GTK_PROGS = 
-
-### GTK_RELATED
-@HAVE_GTK2_TRUE@GTK_PROGS = console
 @SUB_PROJECTS_FALSE@SUB_PROGS = 
-@SUB_PROJECTS_TRUE@SUB_PROGS = importer \
-@SUB_PROJECTS_TRUE@	      gui \
-@SUB_PROJECTS_TRUE@	      $(GTK_PROGS)
-
+@SUB_PROJECTS_TRUE@SUB_PROGS = lib
 SUBDIRS = . \
 	  $(SUB_PROGS)
@@ -317,7 +313,7 @@
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Makefile'; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  src/Makefile'; \
 	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Makefile
+	  $(AUTOMAKE) --gnu  src/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@@ -370,4 +366,5 @@
 	-rm -f *.tab.c
 
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ai.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/array.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/base_entity.Po@am__quote@
@@ -375,9 +372,9 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/camera.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/campaign.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/collision.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/command_node.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curve.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data_tank.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/environment.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fontset.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/game_loader.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glmenu_imagescreen.Po@am__quote@
@@ -385,4 +382,5 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ini_parser.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keynames.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/light.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/list.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/material.Po@am__quote@
@@ -398,5 +396,4 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/texture.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/track_manager.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/track_node.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/world.Po@am__quote@
@@ -419,83 +416,419 @@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
-model.o: importer/model.cc
-@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT model.o -MD -MP -MF "$(DEPDIR)/model.Tpo" -c -o model.o `test -f 'importer/model.cc' || echo '$(srcdir)/'`importer/model.cc; \
+story_entity.o: story_entities/story_entity.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT story_entity.o -MD -MP -MF "$(DEPDIR)/story_entity.Tpo" -c -o story_entity.o `test -f 'story_entities/story_entity.cc' || echo '$(srcdir)/'`story_entities/story_entity.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/story_entity.Tpo" "$(DEPDIR)/story_entity.Po"; else rm -f "$(DEPDIR)/story_entity.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='story_entities/story_entity.cc' object='story_entity.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/story_entity.Po' tmpdepfile='$(DEPDIR)/story_entity.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 story_entity.o `test -f 'story_entities/story_entity.cc' || echo '$(srcdir)/'`story_entities/story_entity.cc
+
+story_entity.obj: story_entities/story_entity.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT story_entity.obj -MD -MP -MF "$(DEPDIR)/story_entity.Tpo" -c -o story_entity.obj `if test -f 'story_entities/story_entity.cc'; then $(CYGPATH_W) 'story_entities/story_entity.cc'; else $(CYGPATH_W) '$(srcdir)/story_entities/story_entity.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/story_entity.Tpo" "$(DEPDIR)/story_entity.Po"; else rm -f "$(DEPDIR)/story_entity.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='story_entities/story_entity.cc' object='story_entity.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/story_entity.Po' tmpdepfile='$(DEPDIR)/story_entity.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 story_entity.obj `if test -f 'story_entities/story_entity.cc'; then $(CYGPATH_W) 'story_entities/story_entity.cc'; else $(CYGPATH_W) '$(srcdir)/story_entities/story_entity.cc'; fi`
+
+campaign.o: story_entities/campaign.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT campaign.o -MD -MP -MF "$(DEPDIR)/campaign.Tpo" -c -o campaign.o `test -f 'story_entities/campaign.cc' || echo '$(srcdir)/'`story_entities/campaign.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/campaign.Tpo" "$(DEPDIR)/campaign.Po"; else rm -f "$(DEPDIR)/campaign.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='story_entities/campaign.cc' object='campaign.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/campaign.Po' tmpdepfile='$(DEPDIR)/campaign.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 campaign.o `test -f 'story_entities/campaign.cc' || echo '$(srcdir)/'`story_entities/campaign.cc
+
+campaign.obj: story_entities/campaign.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT campaign.obj -MD -MP -MF "$(DEPDIR)/campaign.Tpo" -c -o campaign.obj `if test -f 'story_entities/campaign.cc'; then $(CYGPATH_W) 'story_entities/campaign.cc'; else $(CYGPATH_W) '$(srcdir)/story_entities/campaign.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/campaign.Tpo" "$(DEPDIR)/campaign.Po"; else rm -f "$(DEPDIR)/campaign.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='story_entities/campaign.cc' object='campaign.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/campaign.Po' tmpdepfile='$(DEPDIR)/campaign.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 campaign.obj `if test -f 'story_entities/campaign.cc'; then $(CYGPATH_W) 'story_entities/campaign.cc'; else $(CYGPATH_W) '$(srcdir)/story_entities/campaign.cc'; fi`
+
+world.o: story_entities/world.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT world.o -MD -MP -MF "$(DEPDIR)/world.Tpo" -c -o world.o `test -f 'story_entities/world.cc' || echo '$(srcdir)/'`story_entities/world.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/world.Tpo" "$(DEPDIR)/world.Po"; else rm -f "$(DEPDIR)/world.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='story_entities/world.cc' object='world.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/world.Po' tmpdepfile='$(DEPDIR)/world.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 world.o `test -f 'story_entities/world.cc' || echo '$(srcdir)/'`story_entities/world.cc
+
+world.obj: story_entities/world.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT world.obj -MD -MP -MF "$(DEPDIR)/world.Tpo" -c -o world.obj `if test -f 'story_entities/world.cc'; then $(CYGPATH_W) 'story_entities/world.cc'; else $(CYGPATH_W) '$(srcdir)/story_entities/world.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/world.Tpo" "$(DEPDIR)/world.Po"; else rm -f "$(DEPDIR)/world.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='story_entities/world.cc' object='world.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/world.Po' tmpdepfile='$(DEPDIR)/world.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 world.obj `if test -f 'story_entities/world.cc'; then $(CYGPATH_W) 'story_entities/world.cc'; else $(CYGPATH_W) '$(srcdir)/story_entities/world.cc'; fi`
+
+world_entity.o: world_entities/world_entity.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT world_entity.o -MD -MP -MF "$(DEPDIR)/world_entity.Tpo" -c -o world_entity.o `test -f 'world_entities/world_entity.cc' || echo '$(srcdir)/'`world_entities/world_entity.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/world_entity.Tpo" "$(DEPDIR)/world_entity.Po"; else rm -f "$(DEPDIR)/world_entity.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='world_entities/world_entity.cc' object='world_entity.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/world_entity.Po' tmpdepfile='$(DEPDIR)/world_entity.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 world_entity.o `test -f 'world_entities/world_entity.cc' || echo '$(srcdir)/'`world_entities/world_entity.cc
+
+world_entity.obj: world_entities/world_entity.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT world_entity.obj -MD -MP -MF "$(DEPDIR)/world_entity.Tpo" -c -o world_entity.obj `if test -f 'world_entities/world_entity.cc'; then $(CYGPATH_W) 'world_entities/world_entity.cc'; else $(CYGPATH_W) '$(srcdir)/world_entities/world_entity.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/world_entity.Tpo" "$(DEPDIR)/world_entity.Po"; else rm -f "$(DEPDIR)/world_entity.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='world_entities/world_entity.cc' object='world_entity.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/world_entity.Po' tmpdepfile='$(DEPDIR)/world_entity.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 world_entity.obj `if test -f 'world_entities/world_entity.cc'; then $(CYGPATH_W) 'world_entities/world_entity.cc'; else $(CYGPATH_W) '$(srcdir)/world_entities/world_entity.cc'; fi`
+
+player.o: world_entities/player.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT player.o -MD -MP -MF "$(DEPDIR)/player.Tpo" -c -o player.o `test -f 'world_entities/player.cc' || echo '$(srcdir)/'`world_entities/player.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/player.Tpo" "$(DEPDIR)/player.Po"; else rm -f "$(DEPDIR)/player.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='world_entities/player.cc' object='player.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/player.Po' tmpdepfile='$(DEPDIR)/player.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 player.o `test -f 'world_entities/player.cc' || echo '$(srcdir)/'`world_entities/player.cc
+
+player.obj: world_entities/player.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT player.obj -MD -MP -MF "$(DEPDIR)/player.Tpo" -c -o player.obj `if test -f 'world_entities/player.cc'; then $(CYGPATH_W) 'world_entities/player.cc'; else $(CYGPATH_W) '$(srcdir)/world_entities/player.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/player.Tpo" "$(DEPDIR)/player.Po"; else rm -f "$(DEPDIR)/player.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='world_entities/player.cc' object='player.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/player.Po' tmpdepfile='$(DEPDIR)/player.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 player.obj `if test -f 'world_entities/player.cc'; then $(CYGPATH_W) 'world_entities/player.cc'; else $(CYGPATH_W) '$(srcdir)/world_entities/player.cc'; fi`
+
+environment.o: world_entities/environment.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT environment.o -MD -MP -MF "$(DEPDIR)/environment.Tpo" -c -o environment.o `test -f 'world_entities/environment.cc' || echo '$(srcdir)/'`world_entities/environment.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/environment.Tpo" "$(DEPDIR)/environment.Po"; else rm -f "$(DEPDIR)/environment.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='world_entities/environment.cc' object='environment.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/environment.Po' tmpdepfile='$(DEPDIR)/environment.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 environment.o `test -f 'world_entities/environment.cc' || echo '$(srcdir)/'`world_entities/environment.cc
+
+environment.obj: world_entities/environment.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT environment.obj -MD -MP -MF "$(DEPDIR)/environment.Tpo" -c -o environment.obj `if test -f 'world_entities/environment.cc'; then $(CYGPATH_W) 'world_entities/environment.cc'; else $(CYGPATH_W) '$(srcdir)/world_entities/environment.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/environment.Tpo" "$(DEPDIR)/environment.Po"; else rm -f "$(DEPDIR)/environment.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='world_entities/environment.cc' object='environment.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/environment.Po' tmpdepfile='$(DEPDIR)/environment.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 environment.obj `if test -f 'world_entities/environment.cc'; then $(CYGPATH_W) 'world_entities/environment.cc'; else $(CYGPATH_W) '$(srcdir)/world_entities/environment.cc'; fi`
+
+skysphere.o: world_entities/skysphere.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT skysphere.o -MD -MP -MF "$(DEPDIR)/skysphere.Tpo" -c -o skysphere.o `test -f 'world_entities/skysphere.cc' || echo '$(srcdir)/'`world_entities/skysphere.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/skysphere.Tpo" "$(DEPDIR)/skysphere.Po"; else rm -f "$(DEPDIR)/skysphere.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='world_entities/skysphere.cc' object='skysphere.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/skysphere.Po' tmpdepfile='$(DEPDIR)/skysphere.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 skysphere.o `test -f 'world_entities/skysphere.cc' || echo '$(srcdir)/'`world_entities/skysphere.cc
+
+skysphere.obj: world_entities/skysphere.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT skysphere.obj -MD -MP -MF "$(DEPDIR)/skysphere.Tpo" -c -o skysphere.obj `if test -f 'world_entities/skysphere.cc'; then $(CYGPATH_W) 'world_entities/skysphere.cc'; else $(CYGPATH_W) '$(srcdir)/world_entities/skysphere.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/skysphere.Tpo" "$(DEPDIR)/skysphere.Po"; else rm -f "$(DEPDIR)/skysphere.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='world_entities/skysphere.cc' object='skysphere.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/skysphere.Po' tmpdepfile='$(DEPDIR)/skysphere.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 skysphere.obj `if test -f 'world_entities/skysphere.cc'; then $(CYGPATH_W) 'world_entities/skysphere.cc'; else $(CYGPATH_W) '$(srcdir)/world_entities/skysphere.cc'; fi`
+
+ai.o: ai/ai.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ai.o -MD -MP -MF "$(DEPDIR)/ai.Tpo" -c -o ai.o `test -f 'ai/ai.cc' || echo '$(srcdir)/'`ai/ai.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/ai.Tpo" "$(DEPDIR)/ai.Po"; else rm -f "$(DEPDIR)/ai.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='ai/ai.cc' object='ai.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/ai.Po' tmpdepfile='$(DEPDIR)/ai.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 ai.o `test -f 'ai/ai.cc' || echo '$(srcdir)/'`ai/ai.cc
+
+ai.obj: ai/ai.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ai.obj -MD -MP -MF "$(DEPDIR)/ai.Tpo" -c -o ai.obj `if test -f 'ai/ai.cc'; then $(CYGPATH_W) 'ai/ai.cc'; else $(CYGPATH_W) '$(srcdir)/ai/ai.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/ai.Tpo" "$(DEPDIR)/ai.Po"; else rm -f "$(DEPDIR)/ai.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='ai/ai.cc' object='ai.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/ai.Po' tmpdepfile='$(DEPDIR)/ai.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 ai.obj `if test -f 'ai/ai.cc'; then $(CYGPATH_W) 'ai/ai.cc'; else $(CYGPATH_W) '$(srcdir)/ai/ai.cc'; fi`
+
+p_node.o: lib/coord/p_node.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT p_node.o -MD -MP -MF "$(DEPDIR)/p_node.Tpo" -c -o p_node.o `test -f 'lib/coord/p_node.cc' || echo '$(srcdir)/'`lib/coord/p_node.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/p_node.Tpo" "$(DEPDIR)/p_node.Po"; else rm -f "$(DEPDIR)/p_node.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/coord/p_node.cc' object='p_node.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/p_node.Po' tmpdepfile='$(DEPDIR)/p_node.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 p_node.o `test -f 'lib/coord/p_node.cc' || echo '$(srcdir)/'`lib/coord/p_node.cc
+
+p_node.obj: lib/coord/p_node.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT p_node.obj -MD -MP -MF "$(DEPDIR)/p_node.Tpo" -c -o p_node.obj `if test -f 'lib/coord/p_node.cc'; then $(CYGPATH_W) 'lib/coord/p_node.cc'; else $(CYGPATH_W) '$(srcdir)/lib/coord/p_node.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/p_node.Tpo" "$(DEPDIR)/p_node.Po"; else rm -f "$(DEPDIR)/p_node.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/coord/p_node.cc' object='p_node.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/p_node.Po' tmpdepfile='$(DEPDIR)/p_node.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 p_node.obj `if test -f 'lib/coord/p_node.cc'; then $(CYGPATH_W) 'lib/coord/p_node.cc'; else $(CYGPATH_W) '$(srcdir)/lib/coord/p_node.cc'; fi`
+
+null_parent.o: lib/coord/null_parent.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT null_parent.o -MD -MP -MF "$(DEPDIR)/null_parent.Tpo" -c -o null_parent.o `test -f 'lib/coord/null_parent.cc' || echo '$(srcdir)/'`lib/coord/null_parent.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/null_parent.Tpo" "$(DEPDIR)/null_parent.Po"; else rm -f "$(DEPDIR)/null_parent.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/coord/null_parent.cc' object='null_parent.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/null_parent.Po' tmpdepfile='$(DEPDIR)/null_parent.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 null_parent.o `test -f 'lib/coord/null_parent.cc' || echo '$(srcdir)/'`lib/coord/null_parent.cc
+
+null_parent.obj: lib/coord/null_parent.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT null_parent.obj -MD -MP -MF "$(DEPDIR)/null_parent.Tpo" -c -o null_parent.obj `if test -f 'lib/coord/null_parent.cc'; then $(CYGPATH_W) 'lib/coord/null_parent.cc'; else $(CYGPATH_W) '$(srcdir)/lib/coord/null_parent.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/null_parent.Tpo" "$(DEPDIR)/null_parent.Po"; else rm -f "$(DEPDIR)/null_parent.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/coord/null_parent.cc' object='null_parent.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/null_parent.Po' tmpdepfile='$(DEPDIR)/null_parent.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 null_parent.obj `if test -f 'lib/coord/null_parent.cc'; then $(CYGPATH_W) 'lib/coord/null_parent.cc'; else $(CYGPATH_W) '$(srcdir)/lib/coord/null_parent.cc'; fi`
+
+helper_parent.o: lib/coord/helper_parent.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT helper_parent.o -MD -MP -MF "$(DEPDIR)/helper_parent.Tpo" -c -o helper_parent.o `test -f 'lib/coord/helper_parent.cc' || echo '$(srcdir)/'`lib/coord/helper_parent.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/helper_parent.Tpo" "$(DEPDIR)/helper_parent.Po"; else rm -f "$(DEPDIR)/helper_parent.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/coord/helper_parent.cc' object='helper_parent.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/helper_parent.Po' tmpdepfile='$(DEPDIR)/helper_parent.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 helper_parent.o `test -f 'lib/coord/helper_parent.cc' || echo '$(srcdir)/'`lib/coord/helper_parent.cc
+
+helper_parent.obj: lib/coord/helper_parent.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT helper_parent.obj -MD -MP -MF "$(DEPDIR)/helper_parent.Tpo" -c -o helper_parent.obj `if test -f 'lib/coord/helper_parent.cc'; then $(CYGPATH_W) 'lib/coord/helper_parent.cc'; else $(CYGPATH_W) '$(srcdir)/lib/coord/helper_parent.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/helper_parent.Tpo" "$(DEPDIR)/helper_parent.Po"; else rm -f "$(DEPDIR)/helper_parent.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/coord/helper_parent.cc' object='helper_parent.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/helper_parent.Po' tmpdepfile='$(DEPDIR)/helper_parent.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 helper_parent.obj `if test -f 'lib/coord/helper_parent.cc'; then $(CYGPATH_W) 'lib/coord/helper_parent.cc'; else $(CYGPATH_W) '$(srcdir)/lib/coord/helper_parent.cc'; fi`
+
+data_tank.o: lib/data/data_tank.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT data_tank.o -MD -MP -MF "$(DEPDIR)/data_tank.Tpo" -c -o data_tank.o `test -f 'lib/data/data_tank.cc' || echo '$(srcdir)/'`lib/data/data_tank.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/data_tank.Tpo" "$(DEPDIR)/data_tank.Po"; else rm -f "$(DEPDIR)/data_tank.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/data/data_tank.cc' object='data_tank.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/data_tank.Po' tmpdepfile='$(DEPDIR)/data_tank.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 data_tank.o `test -f 'lib/data/data_tank.cc' || echo '$(srcdir)/'`lib/data/data_tank.cc
+
+data_tank.obj: lib/data/data_tank.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT data_tank.obj -MD -MP -MF "$(DEPDIR)/data_tank.Tpo" -c -o data_tank.obj `if test -f 'lib/data/data_tank.cc'; then $(CYGPATH_W) 'lib/data/data_tank.cc'; else $(CYGPATH_W) '$(srcdir)/lib/data/data_tank.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/data_tank.Tpo" "$(DEPDIR)/data_tank.Po"; else rm -f "$(DEPDIR)/data_tank.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/data/data_tank.cc' object='data_tank.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/data_tank.Po' tmpdepfile='$(DEPDIR)/data_tank.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 data_tank.obj `if test -f 'lib/data/data_tank.cc'; then $(CYGPATH_W) 'lib/data/data_tank.cc'; else $(CYGPATH_W) '$(srcdir)/lib/data/data_tank.cc'; fi`
+
+fontset.o: lib/graphics/font/fontset.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT fontset.o -MD -MP -MF "$(DEPDIR)/fontset.Tpo" -c -o fontset.o `test -f 'lib/graphics/font/fontset.cc' || echo '$(srcdir)/'`lib/graphics/font/fontset.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/fontset.Tpo" "$(DEPDIR)/fontset.Po"; else rm -f "$(DEPDIR)/fontset.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/graphics/font/fontset.cc' object='fontset.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/fontset.Po' tmpdepfile='$(DEPDIR)/fontset.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 fontset.o `test -f 'lib/graphics/font/fontset.cc' || echo '$(srcdir)/'`lib/graphics/font/fontset.cc
+
+fontset.obj: lib/graphics/font/fontset.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT fontset.obj -MD -MP -MF "$(DEPDIR)/fontset.Tpo" -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`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/fontset.Tpo" "$(DEPDIR)/fontset.Po"; else rm -f "$(DEPDIR)/fontset.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/graphics/font/fontset.cc' object='fontset.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/fontset.Po' tmpdepfile='$(DEPDIR)/fontset.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 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`
+
+array.o: lib/graphics/importer/array.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT array.o -MD -MP -MF "$(DEPDIR)/array.Tpo" -c -o array.o `test -f 'lib/graphics/importer/array.cc' || echo '$(srcdir)/'`lib/graphics/importer/array.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/array.Tpo" "$(DEPDIR)/array.Po"; else rm -f "$(DEPDIR)/array.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/graphics/importer/array.cc' object='array.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/array.Po' tmpdepfile='$(DEPDIR)/array.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 array.o `test -f 'lib/graphics/importer/array.cc' || echo '$(srcdir)/'`lib/graphics/importer/array.cc
+
+array.obj: lib/graphics/importer/array.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT array.obj -MD -MP -MF "$(DEPDIR)/array.Tpo" -c -o array.obj `if test -f 'lib/graphics/importer/array.cc'; then $(CYGPATH_W) 'lib/graphics/importer/array.cc'; else $(CYGPATH_W) '$(srcdir)/lib/graphics/importer/array.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/array.Tpo" "$(DEPDIR)/array.Po"; else rm -f "$(DEPDIR)/array.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/graphics/importer/array.cc' object='array.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/array.Po' tmpdepfile='$(DEPDIR)/array.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 array.obj `if test -f 'lib/graphics/importer/array.cc'; then $(CYGPATH_W) 'lib/graphics/importer/array.cc'; else $(CYGPATH_W) '$(srcdir)/lib/graphics/importer/array.cc'; fi`
+
+objModel.o: lib/graphics/importer/objModel.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT objModel.o -MD -MP -MF "$(DEPDIR)/objModel.Tpo" -c -o objModel.o `test -f 'lib/graphics/importer/objModel.cc' || echo '$(srcdir)/'`lib/graphics/importer/objModel.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/objModel.Tpo" "$(DEPDIR)/objModel.Po"; else rm -f "$(DEPDIR)/objModel.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/graphics/importer/objModel.cc' object='objModel.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/objModel.Po' tmpdepfile='$(DEPDIR)/objModel.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 objModel.o `test -f 'lib/graphics/importer/objModel.cc' || echo '$(srcdir)/'`lib/graphics/importer/objModel.cc
+
+objModel.obj: lib/graphics/importer/objModel.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT objModel.obj -MD -MP -MF "$(DEPDIR)/objModel.Tpo" -c -o objModel.obj `if test -f 'lib/graphics/importer/objModel.cc'; then $(CYGPATH_W) 'lib/graphics/importer/objModel.cc'; else $(CYGPATH_W) '$(srcdir)/lib/graphics/importer/objModel.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/objModel.Tpo" "$(DEPDIR)/objModel.Po"; else rm -f "$(DEPDIR)/objModel.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/graphics/importer/objModel.cc' object='objModel.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/objModel.Po' tmpdepfile='$(DEPDIR)/objModel.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 objModel.obj `if test -f 'lib/graphics/importer/objModel.cc'; then $(CYGPATH_W) 'lib/graphics/importer/objModel.cc'; else $(CYGPATH_W) '$(srcdir)/lib/graphics/importer/objModel.cc'; fi`
+
+model.o: lib/graphics/importer/model.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT model.o -MD -MP -MF "$(DEPDIR)/model.Tpo" -c -o model.o `test -f 'lib/graphics/importer/model.cc' || echo '$(srcdir)/'`lib/graphics/importer/model.cc; \
 @am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/model.Tpo" "$(DEPDIR)/model.Po"; else rm -f "$(DEPDIR)/model.Tpo"; exit 1; fi
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='importer/model.cc' object='model.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/graphics/importer/model.cc' object='model.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/model.Po' tmpdepfile='$(DEPDIR)/model.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 model.o `test -f 'importer/model.cc' || echo '$(srcdir)/'`importer/model.cc
-
-model.obj: importer/model.cc
-@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT model.obj -MD -MP -MF "$(DEPDIR)/model.Tpo" -c -o model.obj `if test -f 'importer/model.cc'; then $(CYGPATH_W) 'importer/model.cc'; else $(CYGPATH_W) '$(srcdir)/importer/model.cc'; fi`; \
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o model.o `test -f 'lib/graphics/importer/model.cc' || echo '$(srcdir)/'`lib/graphics/importer/model.cc
+
+model.obj: lib/graphics/importer/model.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT model.obj -MD -MP -MF "$(DEPDIR)/model.Tpo" -c -o model.obj `if test -f 'lib/graphics/importer/model.cc'; then $(CYGPATH_W) 'lib/graphics/importer/model.cc'; else $(CYGPATH_W) '$(srcdir)/lib/graphics/importer/model.cc'; fi`; \
 @am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/model.Tpo" "$(DEPDIR)/model.Po"; else rm -f "$(DEPDIR)/model.Tpo"; exit 1; fi
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='importer/model.cc' object='model.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/graphics/importer/model.cc' object='model.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/model.Po' tmpdepfile='$(DEPDIR)/model.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 model.obj `if test -f 'importer/model.cc'; then $(CYGPATH_W) 'importer/model.cc'; else $(CYGPATH_W) '$(srcdir)/importer/model.cc'; fi`
-
-objModel.o: importer/objModel.cc
-@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT objModel.o -MD -MP -MF "$(DEPDIR)/objModel.Tpo" -c -o objModel.o `test -f 'importer/objModel.cc' || echo '$(srcdir)/'`importer/objModel.cc; \
-@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/objModel.Tpo" "$(DEPDIR)/objModel.Po"; else rm -f "$(DEPDIR)/objModel.Tpo"; exit 1; fi
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='importer/objModel.cc' object='objModel.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/objModel.Po' tmpdepfile='$(DEPDIR)/objModel.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 objModel.o `test -f 'importer/objModel.cc' || echo '$(srcdir)/'`importer/objModel.cc
-
-objModel.obj: importer/objModel.cc
-@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT objModel.obj -MD -MP -MF "$(DEPDIR)/objModel.Tpo" -c -o objModel.obj `if test -f 'importer/objModel.cc'; then $(CYGPATH_W) 'importer/objModel.cc'; else $(CYGPATH_W) '$(srcdir)/importer/objModel.cc'; fi`; \
-@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/objModel.Tpo" "$(DEPDIR)/objModel.Po"; else rm -f "$(DEPDIR)/objModel.Tpo"; exit 1; fi
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='importer/objModel.cc' object='objModel.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/objModel.Po' tmpdepfile='$(DEPDIR)/objModel.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 objModel.obj `if test -f 'importer/objModel.cc'; then $(CYGPATH_W) 'importer/objModel.cc'; else $(CYGPATH_W) '$(srcdir)/importer/objModel.cc'; fi`
-
-array.o: importer/array.cc
-@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT array.o -MD -MP -MF "$(DEPDIR)/array.Tpo" -c -o array.o `test -f 'importer/array.cc' || echo '$(srcdir)/'`importer/array.cc; \
-@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/array.Tpo" "$(DEPDIR)/array.Po"; else rm -f "$(DEPDIR)/array.Tpo"; exit 1; fi
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='importer/array.cc' object='array.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/array.Po' tmpdepfile='$(DEPDIR)/array.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 array.o `test -f 'importer/array.cc' || echo '$(srcdir)/'`importer/array.cc
-
-array.obj: importer/array.cc
-@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT array.obj -MD -MP -MF "$(DEPDIR)/array.Tpo" -c -o array.obj `if test -f 'importer/array.cc'; then $(CYGPATH_W) 'importer/array.cc'; else $(CYGPATH_W) '$(srcdir)/importer/array.cc'; fi`; \
-@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/array.Tpo" "$(DEPDIR)/array.Po"; else rm -f "$(DEPDIR)/array.Tpo"; exit 1; fi
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='importer/array.cc' object='array.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/array.Po' tmpdepfile='$(DEPDIR)/array.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 array.obj `if test -f 'importer/array.cc'; then $(CYGPATH_W) 'importer/array.cc'; else $(CYGPATH_W) '$(srcdir)/importer/array.cc'; fi`
-
-material.o: importer/material.cc
-@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT material.o -MD -MP -MF "$(DEPDIR)/material.Tpo" -c -o material.o `test -f 'importer/material.cc' || echo '$(srcdir)/'`importer/material.cc; \
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o model.obj `if test -f 'lib/graphics/importer/model.cc'; then $(CYGPATH_W) 'lib/graphics/importer/model.cc'; else $(CYGPATH_W) '$(srcdir)/lib/graphics/importer/model.cc'; fi`
+
+material.o: lib/graphics/importer/material.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT material.o -MD -MP -MF "$(DEPDIR)/material.Tpo" -c -o material.o `test -f 'lib/graphics/importer/material.cc' || echo '$(srcdir)/'`lib/graphics/importer/material.cc; \
 @am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/material.Tpo" "$(DEPDIR)/material.Po"; else rm -f "$(DEPDIR)/material.Tpo"; exit 1; fi
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='importer/material.cc' object='material.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/graphics/importer/material.cc' object='material.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/material.Po' tmpdepfile='$(DEPDIR)/material.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 material.o `test -f 'importer/material.cc' || echo '$(srcdir)/'`importer/material.cc
-
-material.obj: importer/material.cc
-@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT material.obj -MD -MP -MF "$(DEPDIR)/material.Tpo" -c -o material.obj `if test -f 'importer/material.cc'; then $(CYGPATH_W) 'importer/material.cc'; else $(CYGPATH_W) '$(srcdir)/importer/material.cc'; fi`; \
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o material.o `test -f 'lib/graphics/importer/material.cc' || echo '$(srcdir)/'`lib/graphics/importer/material.cc
+
+material.obj: lib/graphics/importer/material.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT material.obj -MD -MP -MF "$(DEPDIR)/material.Tpo" -c -o material.obj `if test -f 'lib/graphics/importer/material.cc'; then $(CYGPATH_W) 'lib/graphics/importer/material.cc'; else $(CYGPATH_W) '$(srcdir)/lib/graphics/importer/material.cc'; fi`; \
 @am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/material.Tpo" "$(DEPDIR)/material.Po"; else rm -f "$(DEPDIR)/material.Tpo"; exit 1; fi
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='importer/material.cc' object='material.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/graphics/importer/material.cc' object='material.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/material.Po' tmpdepfile='$(DEPDIR)/material.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 material.obj `if test -f 'importer/material.cc'; then $(CYGPATH_W) 'importer/material.cc'; else $(CYGPATH_W) '$(srcdir)/importer/material.cc'; fi`
-
-texture.o: importer/texture.cc
-@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT texture.o -MD -MP -MF "$(DEPDIR)/texture.Tpo" -c -o texture.o `test -f 'importer/texture.cc' || echo '$(srcdir)/'`importer/texture.cc; \
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o material.obj `if test -f 'lib/graphics/importer/material.cc'; then $(CYGPATH_W) 'lib/graphics/importer/material.cc'; else $(CYGPATH_W) '$(srcdir)/lib/graphics/importer/material.cc'; fi`
+
+texture.o: lib/graphics/importer/texture.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT texture.o -MD -MP -MF "$(DEPDIR)/texture.Tpo" -c -o texture.o `test -f 'lib/graphics/importer/texture.cc' || echo '$(srcdir)/'`lib/graphics/importer/texture.cc; \
 @am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/texture.Tpo" "$(DEPDIR)/texture.Po"; else rm -f "$(DEPDIR)/texture.Tpo"; exit 1; fi
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='importer/texture.cc' object='texture.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/graphics/importer/texture.cc' object='texture.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/texture.Po' tmpdepfile='$(DEPDIR)/texture.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 texture.o `test -f 'importer/texture.cc' || echo '$(srcdir)/'`importer/texture.cc
-
-texture.obj: importer/texture.cc
-@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT texture.obj -MD -MP -MF "$(DEPDIR)/texture.Tpo" -c -o texture.obj `if test -f 'importer/texture.cc'; then $(CYGPATH_W) 'importer/texture.cc'; else $(CYGPATH_W) '$(srcdir)/importer/texture.cc'; fi`; \
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o texture.o `test -f 'lib/graphics/importer/texture.cc' || echo '$(srcdir)/'`lib/graphics/importer/texture.cc
+
+texture.obj: lib/graphics/importer/texture.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT texture.obj -MD -MP -MF "$(DEPDIR)/texture.Tpo" -c -o texture.obj `if test -f 'lib/graphics/importer/texture.cc'; then $(CYGPATH_W) 'lib/graphics/importer/texture.cc'; else $(CYGPATH_W) '$(srcdir)/lib/graphics/importer/texture.cc'; fi`; \
 @am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/texture.Tpo" "$(DEPDIR)/texture.Po"; else rm -f "$(DEPDIR)/texture.Tpo"; exit 1; fi
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='importer/texture.cc' object='texture.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/graphics/importer/texture.cc' object='texture.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/texture.Po' tmpdepfile='$(DEPDIR)/texture.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 texture.obj `if test -f 'importer/texture.cc'; then $(CYGPATH_W) 'importer/texture.cc'; else $(CYGPATH_W) '$(srcdir)/importer/texture.cc'; fi`
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o texture.obj `if test -f 'lib/graphics/importer/texture.cc'; then $(CYGPATH_W) 'lib/graphics/importer/texture.cc'; else $(CYGPATH_W) '$(srcdir)/lib/graphics/importer/texture.cc'; fi`
+
+base_entity.o: lib/lang/base_entity.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT base_entity.o -MD -MP -MF "$(DEPDIR)/base_entity.Tpo" -c -o base_entity.o `test -f 'lib/lang/base_entity.cc' || echo '$(srcdir)/'`lib/lang/base_entity.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/base_entity.Tpo" "$(DEPDIR)/base_entity.Po"; else rm -f "$(DEPDIR)/base_entity.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/lang/base_entity.cc' object='base_entity.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/base_entity.Po' tmpdepfile='$(DEPDIR)/base_entity.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 base_entity.o `test -f 'lib/lang/base_entity.cc' || echo '$(srcdir)/'`lib/lang/base_entity.cc
+
+base_entity.obj: lib/lang/base_entity.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT base_entity.obj -MD -MP -MF "$(DEPDIR)/base_entity.Tpo" -c -o base_entity.obj `if test -f 'lib/lang/base_entity.cc'; then $(CYGPATH_W) 'lib/lang/base_entity.cc'; else $(CYGPATH_W) '$(srcdir)/lib/lang/base_entity.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/base_entity.Tpo" "$(DEPDIR)/base_entity.Po"; else rm -f "$(DEPDIR)/base_entity.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/lang/base_entity.cc' object='base_entity.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/base_entity.Po' tmpdepfile='$(DEPDIR)/base_entity.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 base_entity.obj `if test -f 'lib/lang/base_entity.cc'; then $(CYGPATH_W) 'lib/lang/base_entity.cc'; else $(CYGPATH_W) '$(srcdir)/lib/lang/base_entity.cc'; fi`
+
+base_object.o: lib/lang/base_object.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT base_object.o -MD -MP -MF "$(DEPDIR)/base_object.Tpo" -c -o base_object.o `test -f 'lib/lang/base_object.cc' || echo '$(srcdir)/'`lib/lang/base_object.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/base_object.Tpo" "$(DEPDIR)/base_object.Po"; else rm -f "$(DEPDIR)/base_object.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/lang/base_object.cc' object='base_object.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/base_object.Po' tmpdepfile='$(DEPDIR)/base_object.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 base_object.o `test -f 'lib/lang/base_object.cc' || echo '$(srcdir)/'`lib/lang/base_object.cc
+
+base_object.obj: lib/lang/base_object.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT base_object.obj -MD -MP -MF "$(DEPDIR)/base_object.Tpo" -c -o base_object.obj `if test -f 'lib/lang/base_object.cc'; then $(CYGPATH_W) 'lib/lang/base_object.cc'; else $(CYGPATH_W) '$(srcdir)/lib/lang/base_object.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/base_object.Tpo" "$(DEPDIR)/base_object.Po"; else rm -f "$(DEPDIR)/base_object.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/lang/base_object.cc' object='base_object.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/base_object.Po' tmpdepfile='$(DEPDIR)/base_object.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 base_object.obj `if test -f 'lib/lang/base_object.cc'; then $(CYGPATH_W) 'lib/lang/base_object.cc'; else $(CYGPATH_W) '$(srcdir)/lib/lang/base_object.cc'; fi`
+
+ini_parser.o: lib/util/ini_parser.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ini_parser.o -MD -MP -MF "$(DEPDIR)/ini_parser.Tpo" -c -o ini_parser.o `test -f 'lib/util/ini_parser.cc' || echo '$(srcdir)/'`lib/util/ini_parser.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/ini_parser.Tpo" "$(DEPDIR)/ini_parser.Po"; else rm -f "$(DEPDIR)/ini_parser.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/util/ini_parser.cc' object='ini_parser.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/ini_parser.Po' tmpdepfile='$(DEPDIR)/ini_parser.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 ini_parser.o `test -f 'lib/util/ini_parser.cc' || echo '$(srcdir)/'`lib/util/ini_parser.cc
+
+ini_parser.obj: lib/util/ini_parser.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ini_parser.obj -MD -MP -MF "$(DEPDIR)/ini_parser.Tpo" -c -o ini_parser.obj `if test -f 'lib/util/ini_parser.cc'; then $(CYGPATH_W) 'lib/util/ini_parser.cc'; else $(CYGPATH_W) '$(srcdir)/lib/util/ini_parser.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/ini_parser.Tpo" "$(DEPDIR)/ini_parser.Po"; else rm -f "$(DEPDIR)/ini_parser.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/util/ini_parser.cc' object='ini_parser.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/ini_parser.Po' tmpdepfile='$(DEPDIR)/ini_parser.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 ini_parser.obj `if test -f 'lib/util/ini_parser.cc'; then $(CYGPATH_W) 'lib/util/ini_parser.cc'; else $(CYGPATH_W) '$(srcdir)/lib/util/ini_parser.cc'; fi`
+
+list.o: lib/util/list.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT list.o -MD -MP -MF "$(DEPDIR)/list.Tpo" -c -o list.o `test -f 'lib/util/list.cc' || echo '$(srcdir)/'`lib/util/list.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/list.Tpo" "$(DEPDIR)/list.Po"; else rm -f "$(DEPDIR)/list.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/util/list.cc' object='list.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/list.Po' tmpdepfile='$(DEPDIR)/list.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 list.o `test -f 'lib/util/list.cc' || echo '$(srcdir)/'`lib/util/list.cc
+
+list.obj: lib/util/list.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT list.obj -MD -MP -MF "$(DEPDIR)/list.Tpo" -c -o list.obj `if test -f 'lib/util/list.cc'; then $(CYGPATH_W) 'lib/util/list.cc'; else $(CYGPATH_W) '$(srcdir)/lib/util/list.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/list.Tpo" "$(DEPDIR)/list.Po"; else rm -f "$(DEPDIR)/list.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/util/list.cc' object='list.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/list.Po' tmpdepfile='$(DEPDIR)/list.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 list.obj `if test -f 'lib/util/list.cc'; then $(CYGPATH_W) 'lib/util/list.cc'; else $(CYGPATH_W) '$(srcdir)/lib/util/list.cc'; fi`
+
+vector.o: lib/math/vector.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT vector.o -MD -MP -MF "$(DEPDIR)/vector.Tpo" -c -o vector.o `test -f 'lib/math/vector.cc' || echo '$(srcdir)/'`lib/math/vector.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/vector.Tpo" "$(DEPDIR)/vector.Po"; else rm -f "$(DEPDIR)/vector.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/math/vector.cc' object='vector.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/vector.Po' tmpdepfile='$(DEPDIR)/vector.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 vector.o `test -f 'lib/math/vector.cc' || echo '$(srcdir)/'`lib/math/vector.cc
+
+vector.obj: lib/math/vector.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT vector.obj -MD -MP -MF "$(DEPDIR)/vector.Tpo" -c -o vector.obj `if test -f 'lib/math/vector.cc'; then $(CYGPATH_W) 'lib/math/vector.cc'; else $(CYGPATH_W) '$(srcdir)/lib/math/vector.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/vector.Tpo" "$(DEPDIR)/vector.Po"; else rm -f "$(DEPDIR)/vector.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/math/vector.cc' object='vector.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/vector.Po' tmpdepfile='$(DEPDIR)/vector.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 vector.obj `if test -f 'lib/math/vector.cc'; then $(CYGPATH_W) 'lib/math/vector.cc'; else $(CYGPATH_W) '$(srcdir)/lib/math/vector.cc'; fi`
+
+matrix.o: lib/math/matrix.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT matrix.o -MD -MP -MF "$(DEPDIR)/matrix.Tpo" -c -o matrix.o `test -f 'lib/math/matrix.cc' || echo '$(srcdir)/'`lib/math/matrix.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/matrix.Tpo" "$(DEPDIR)/matrix.Po"; else rm -f "$(DEPDIR)/matrix.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/math/matrix.cc' object='matrix.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/matrix.Po' tmpdepfile='$(DEPDIR)/matrix.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 matrix.o `test -f 'lib/math/matrix.cc' || echo '$(srcdir)/'`lib/math/matrix.cc
+
+matrix.obj: lib/math/matrix.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT matrix.obj -MD -MP -MF "$(DEPDIR)/matrix.Tpo" -c -o matrix.obj `if test -f 'lib/math/matrix.cc'; then $(CYGPATH_W) 'lib/math/matrix.cc'; else $(CYGPATH_W) '$(srcdir)/lib/math/matrix.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/matrix.Tpo" "$(DEPDIR)/matrix.Po"; else rm -f "$(DEPDIR)/matrix.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/math/matrix.cc' object='matrix.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/matrix.Po' tmpdepfile='$(DEPDIR)/matrix.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 matrix.obj `if test -f 'lib/math/matrix.cc'; then $(CYGPATH_W) 'lib/math/matrix.cc'; else $(CYGPATH_W) '$(srcdir)/lib/math/matrix.cc'; fi`
+
+curve.o: lib/math/curve.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT curve.o -MD -MP -MF "$(DEPDIR)/curve.Tpo" -c -o curve.o `test -f 'lib/math/curve.cc' || echo '$(srcdir)/'`lib/math/curve.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/curve.Tpo" "$(DEPDIR)/curve.Po"; else rm -f "$(DEPDIR)/curve.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/math/curve.cc' object='curve.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/curve.Po' tmpdepfile='$(DEPDIR)/curve.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 curve.o `test -f 'lib/math/curve.cc' || echo '$(srcdir)/'`lib/math/curve.cc
+
+curve.obj: lib/math/curve.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT curve.obj -MD -MP -MF "$(DEPDIR)/curve.Tpo" -c -o curve.obj `if test -f 'lib/math/curve.cc'; then $(CYGPATH_W) 'lib/math/curve.cc'; else $(CYGPATH_W) '$(srcdir)/lib/math/curve.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/curve.Tpo" "$(DEPDIR)/curve.Po"; else rm -f "$(DEPDIR)/curve.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/math/curve.cc' object='curve.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/curve.Po' tmpdepfile='$(DEPDIR)/curve.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 curve.obj `if test -f 'lib/math/curve.cc'; then $(CYGPATH_W) 'lib/math/curve.cc'; else $(CYGPATH_W) '$(srcdir)/lib/math/curve.cc'; fi`
+
+glmenu_imagescreen.o: glmenu/glmenu_imagescreen.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT glmenu_imagescreen.o -MD -MP -MF "$(DEPDIR)/glmenu_imagescreen.Tpo" -c -o glmenu_imagescreen.o `test -f 'glmenu/glmenu_imagescreen.cc' || echo '$(srcdir)/'`glmenu/glmenu_imagescreen.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/glmenu_imagescreen.Tpo" "$(DEPDIR)/glmenu_imagescreen.Po"; else rm -f "$(DEPDIR)/glmenu_imagescreen.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='glmenu/glmenu_imagescreen.cc' object='glmenu_imagescreen.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/glmenu_imagescreen.Po' tmpdepfile='$(DEPDIR)/glmenu_imagescreen.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 glmenu_imagescreen.o `test -f 'glmenu/glmenu_imagescreen.cc' || echo '$(srcdir)/'`glmenu/glmenu_imagescreen.cc
+
+glmenu_imagescreen.obj: glmenu/glmenu_imagescreen.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT glmenu_imagescreen.obj -MD -MP -MF "$(DEPDIR)/glmenu_imagescreen.Tpo" -c -o glmenu_imagescreen.obj `if test -f 'glmenu/glmenu_imagescreen.cc'; then $(CYGPATH_W) 'glmenu/glmenu_imagescreen.cc'; else $(CYGPATH_W) '$(srcdir)/glmenu/glmenu_imagescreen.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/glmenu_imagescreen.Tpo" "$(DEPDIR)/glmenu_imagescreen.Po"; else rm -f "$(DEPDIR)/glmenu_imagescreen.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='glmenu/glmenu_imagescreen.cc' object='glmenu_imagescreen.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/glmenu_imagescreen.Po' tmpdepfile='$(DEPDIR)/glmenu_imagescreen.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 glmenu_imagescreen.obj `if test -f 'glmenu/glmenu_imagescreen.cc'; then $(CYGPATH_W) 'glmenu/glmenu_imagescreen.cc'; else $(CYGPATH_W) '$(srcdir)/glmenu/glmenu_imagescreen.cc'; fi`
 uninstall-info-am:
 
@@ -621,4 +954,5 @@
 
 distdir: $(DISTFILES)
+	$(mkdir_p) $(distdir)/ai $(distdir)/defs $(distdir)/glmenu $(distdir)/lib/coord $(distdir)/lib/data $(distdir)/lib/graphics/font $(distdir)/lib/lang $(distdir)/lib/math $(distdir)/lib/util $(distdir)/network $(distdir)/story_entities $(distdir)/world_entities
 	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
 	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
Index: xonox/branches/trackManager/src/ai.cc
===================================================================
--- /orxonox/branches/trackManager/src/ai.cc	(revision 3497)
+++ 	(revision )
@@ -1,32 +1,0 @@
-
-
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   ### File Specific:
-   main-programmer: Patrick Boenzli
-   co-programmer: ...
-*/
-
-
-#include "ai.h"
-
-
-using namespace std;
-
-
-
-AI::AI () {}
-
-
-
-AI::~AI () {}
-
-
Index: xonox/branches/trackManager/src/ai.h
===================================================================
--- /orxonox/branches/trackManager/src/ai.h	(revision 3497)
+++ 	(revision )
@@ -1,15 +1,0 @@
-
-#ifndef _AI_H
-#define _AI_H
-
-#include "data_tank.h"
-
-class AI {
-
- public:
-  AI ();
-  ~AI ();
-
-};
-
-#endif /* _AI_H */
Index: /orxonox/branches/trackManager/src/ai/ai.cc
===================================================================
--- /orxonox/branches/trackManager/src/ai/ai.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/ai/ai.cc	(revision 3498)
@@ -0,0 +1,32 @@
+
+
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: Patrick Boenzli
+   co-programmer: ...
+*/
+
+
+#include "ai.h"
+
+
+using namespace std;
+
+
+
+AI::AI () {}
+
+
+
+AI::~AI () {}
+
+
Index: /orxonox/branches/trackManager/src/ai/ai.h
===================================================================
--- /orxonox/branches/trackManager/src/ai/ai.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/ai/ai.h	(revision 3498)
@@ -0,0 +1,15 @@
+
+#ifndef _AI_H
+#define _AI_H
+
+#include "data_tank.h"
+
+class AI {
+
+ public:
+  AI ();
+  ~AI ();
+
+};
+
+#endif /* _AI_H */
Index: xonox/branches/trackManager/src/base_entity.cc
===================================================================
--- /orxonox/branches/trackManager/src/base_entity.cc	(revision 3497)
+++ 	(revision )
@@ -1,32 +1,0 @@
-
-
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   ### File Specific:
-   main-programmer: Patrick Boenzli
-   co-programmer: ...
-*/
-
-
-#include "base_entity.h"
-
-
-using namespace std;
-
-
-
-BaseEntity::BaseEntity () {}
-
-
-
-BaseEntity::~BaseEntity () {}
-
-
Index: xonox/branches/trackManager/src/base_entity.h
===================================================================
--- /orxonox/branches/trackManager/src/base_entity.h	(revision 3497)
+++ 	(revision )
@@ -1,16 +1,0 @@
-
-#ifndef _BASE_ENTITY_H
-#define _BASE_ENTITY_H
-
-#include "stdincl.h"
-
-
-class BaseEntity {
-
- public:
-  BaseEntity ();
-  ~BaseEntity ();
-
-};
-
-#endif /* _BASE_ENTITY_H */
Index: xonox/branches/trackManager/src/base_object.cc
===================================================================
--- /orxonox/branches/trackManager/src/base_object.cc	(revision 3497)
+++ 	(revision )
@@ -1,48 +1,0 @@
-
-
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   ### File Specific:
-   main-programmer: Patrick Boenzli
-   co-programmer: ...
-*/
-
-
-#include "base_object.h"
-
-
-using namespace std;
-
-
-/**
-   \brief standard constructor
-*/
-BaseObject::BaseObject () {}
-
-
-/**
-   \brief standard deconstructor
-*/
-BaseObject::~BaseObject () {}
-
-
-void BaseObject::setClassName (char* className)
-{
-  this->className = className;
-}
-
-
-bool BaseObject::isA (char* className)
-{
-  if( this->className == className)
-    return false;
-  return true;
-}
Index: xonox/branches/trackManager/src/base_object.h
===================================================================
--- /orxonox/branches/trackManager/src/base_object.h	(revision 3497)
+++ 	(revision )
@@ -1,27 +1,0 @@
-/*! 
-    \file proto_class.h
-    \brief Definition of the proto class template, used quickly start work
-*/
-
-
-#ifndef _BASE_OBJECT_H
-#define _BASE_OBJECT_H
-
-#include "stdincl.h"
-
-
-class BaseObject {
-
- public:
-  BaseObject ();
-  ~BaseObject ();
-
-  void setClassName (char* className);
-  bool isA (char* className);
-
- private:
-  char* className;
-
-};
-
-#endif /* _BASE_OBJECT_H */
Index: xonox/branches/trackManager/src/campaign.cc
===================================================================
--- /orxonox/branches/trackManager/src/campaign.cc	(revision 3497)
+++ 	(revision )
@@ -1,197 +1,0 @@
-
-
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   ### File Specific:
-   main-programmer: Patrick Boenzli
-   co-programmer: 
-*/
-
-
-#include "campaign.h"
-#include "world.h"
-#include "camera.h"
-#include "story_entity.h"
-
-using namespace std;
-
-
-Campaign::Campaign () 
-{
-  this->entities = new ListTemplate<StoryEntity>();
-  this->isInit = false;
-}
-
-Campaign::~Campaign () {}
-
-
-ErrorMessage Campaign::init()
-{
-  this->isInit = true;
-}
-
-/** 
-    \brief adds an game stroy entity to the campaign
-
-    \param se: The entity
-    \param storyID: The number that identifies the entity in the campaign. Each ID only used once in a Campaign
-
-    An entity can be a world (playable), a cinematic, a shop, sounds, whatever you
-    want to queue up in the campaign.
-*/
-void Campaign::addEntity(StoryEntity* se, int storyID)
-{
-  se->setStoryID(storyID);
-  this->addEntity(se);
-}
-
-void Campaign::addEntity(StoryEntity* se)
-{
-  this->entities->add(se);
-}
-
-
-void Campaign::removeEntity(int storyID)
-{
-  this->removeEntity(this->getStoryEntity(storyID));
-  
-}
-
-
-void Campaign::removeEntity(StoryEntity* se)
-{
-  this->entities->remove(se);
-}
-
-
-ErrorMessage Campaign::start()
-{
-  this->start(0);
-}
-
-ErrorMessage Campaign::start(int storyID = 0)
-{
-  printf("World::start() - starting new StoryEntity Nr:%i\n", storyID);
-  ErrorMessage errorCode;
-  if( !this->isInit) return errorCode; 
-  if( storyID == WORLD_ID_GAMEEND) return errorCode;
-  this->running = true;
-  StoryEntity* se = this->getStoryEntity(storyID);
-  this->currentEntity = se;
-  while( se != NULL && this->running)
-    {
-      se->displayLoadScreen();
-      se->load();
-      se->init();
-      se->releaseLoadScreen();
-      se->start();
-      se->destroy();
-     
-      delete se;
-
-      int nextWorldID = se->getNextStoryID();
-      //printf("Campaing::start() - got nextWorldID = %i\n", nextWorldID);
-      se = this->getStoryEntity(nextWorldID);
-      this->currentEntity = se;
-      if( ( nextWorldID == WORLD_ID_GAMEEND) ||( se == NULL) ) 
-	{
-	  printf("Campaign::start() - quitting campaing story loop\n");
-	  if(se != NULL)
-	    delete se;
-	  return errorCode;
-	}
-      
-    }
-}
-
-ErrorMessage Campaign::stop()
-{
-  this->running = false;
-  if(this->currentEntity != NULL) 
-    {
-      this->currentEntity->stop();
-      //delete this->currentEntity;
-      //this->currentEntity = NULL;
-    }
-}
-
-ErrorMessage Campaign::pause()
-{
-  if(this->currentEntity != NULL)
-    this->isPaused = true;
-}
-
-
-ErrorMessage Campaign::resume()
-{
-  if(this->currentEntity != NULL)
-    this->isPaused = false;
-}
-
-
-void Campaign::destroy()
-{
-  if(this->currentEntity != NULL)
-    {
-      this->currentEntity->destroy();
-      delete this->currentEntity;
-      this->currentEntity = NULL;
-    }
-}
-
-/*
-  \brief this changes to the next level
-*/
-void Campaign::nextLevel()
-{
-  printf("Campaign:nextLevel()\n");
-  //int nextID = this->currentEntity->getNextStoryID();
-  //this->stop();
-  //this->start(nextID);
-  this->currentEntity->stop();
-}
-
-/*
-  \brief change to the previous level - not implemented
-
-  this propably useless
-*/
-void Campaign::previousLevel()
-{}
-
-
-/*
-  \brief lookup a entity with a given id
-  \param story id to be lookuped
-  \returns the entity found or NULL if search ended without match
-*/
-StoryEntity* Campaign::getStoryEntity(int storyID)
-{
-  //printf("Campaing::getStoryEntity(%i) - getting next Entity\n", storyID);
-  if( storyID == WORLD_ID_GAMEEND)
-    return NULL;
-  ListTemplate<StoryEntity>* l;
-  StoryEntity* entity = NULL;
-  l = this->entities->getNext();  
-  while( l != NULL) 
-    { 
-      entity = l->getObject();
-      l = l->getNext();
-      int id = entity->getStoryID();
-      //printf("Campaing::getStoryEntity() - now looping, found entity nr=%i\n", id);
-      if(id == storyID)
-	{
-	  //printf("Campaing::getStoryEntity() - yea, this is what we where looking for: %id\n");
-	  return entity;
-	}
-    }
-  return NULL;
-}
Index: xonox/branches/trackManager/src/campaign.h
===================================================================
--- /orxonox/branches/trackManager/src/campaign.h	(revision 3497)
+++ 	(revision )
@@ -1,43 +1,0 @@
-
-#ifndef _CAMPAIGN_H
-#define _CAMPAIGN_H
-
-#include "stdincl.h"
-#include "story_entity.h"
-
-
-class World;
-
-class Campaign : public StoryEntity {
-
- public:
-  Campaign ();
-  ~Campaign ();
-
-  StoryEntity* currentEntity;
-
-  virtual ErrorMessage init();
-  virtual ErrorMessage start();
-  virtual ErrorMessage start(int storyID);
-  virtual ErrorMessage stop();
-  virtual ErrorMessage pause();
-  virtual ErrorMessage resume();
-
-  virtual void destroy();
-
-  void addEntity(StoryEntity* se, int storyID);
-  void addEntity(StoryEntity* se);
-  void removeEntity(int storyID);
-  void removeEntity(StoryEntity* se);
-  
-  void nextLevel();
-  void previousLevel();
-
- private:
-  ListTemplate<StoryEntity>* entities;
-  bool running;
-
-  StoryEntity* getStoryEntity(int storyID);
-};
-
-#endif /* _CAMPAIGN_H */
Index: /orxonox/branches/trackManager/src/collision.h
===================================================================
--- /orxonox/branches/trackManager/src/collision.h	(revision 3497)
+++ /orxonox/branches/trackManager/src/collision.h	(revision 3498)
@@ -8,5 +8,4 @@
 
 #include "vector.h"
-#include "coordinates.h"
 #include <stdlib.h>
 #include <stdio.h>
Index: xonox/branches/trackManager/src/coordinates.h
===================================================================
--- /orxonox/branches/trackManager/src/coordinates.h	(revision 3497)
+++ 	(revision )
@@ -1,36 +1,0 @@
-/*! 
-    \file coordinates.h
-    \brief Basic coordinate system definitions
-*/ 
-
-#ifndef _COORDINATES_H
-#define _COORDINATES_H
-
-#include "vector.h"
-
-class Track;
-
-//! Coordinates relative to track
-/**
-  This identifies the position of an object on the track system
-*/
-typedef struct
-{
-  unsigned long part;   //!< ID of the track part the object is on
-  Track* track;         //!< This is the current Track to which the Entity belongs to
-  float dist;           //!< The distance that has already been traveled on the track
-  Vector pos;           //!< The position relative to the offset marked by the distance already covered - this is mostly for user interaction/control
-  Quaternion rot;       //!< The direction the object is heading (relative to track direction)
-} Location;
-
-//! Absolute coordinates
-/**
-  This is used to store the position of a object in the rendered coordinate system
-*/
-typedef struct
-{
-  Vector r;              //!< Absolute x/y/z coordinates
-  Quaternion w;          //!< Absolute orientation
-} Placement;
-
-#endif /* _COORDINATS_H */
Index: xonox/branches/trackManager/src/curve.cc
===================================================================
--- /orxonox/branches/trackManager/src/curve.cc	(revision 3497)
+++ 	(revision )
@@ -1,462 +1,0 @@
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   ### File Specific:
-   main-programmer: Benjamin Grauer
-   co-programmer: Patrick Boenzli
-
-   ADD: Patrick Boenzli           B-Spline 
-
-
-   TODO: 
-     local-Time implementation
-     NURBS
-     
-*/
-
-#include "curve.h"
-#include "matrix.h"
-#include "debug.h"
-
-#include <math.h>
-#include <stdio.h>
-
-/**
-   \brief adds a new Node to the bezier Curve
-   \param newNode a Vector to the position of the new node
-*/
-void Curve::addNode(const Vector& newNode)
-{
-  if (nodeCount != 0 )
-    {
-      currentNode = currentNode->next = new PathNode;
-    }
-  currentNode->position = newNode;
-  currentNode->next = 0;
-  currentNode->number = (++nodeCount);
-  this->rebuild();
-  return;
-}
-
-void Curve::addNode(const Vector& newNode, unsigned int insertPosition)
-{
-
-  if (this->nodeCount == 0 || insertPosition > this->nodeCount)
-    return addNode(newNode);
-
-  if (insertPosition == 0)
-    insertPosition = 1;
-
-  PathNode* insNode = new PathNode;
-
-  // relinking
-  PathNode* tmpNode = this->firstNode;
-  if (insertPosition > 1)
-    {
-      while (tmpNode->next->number != insertPosition)
-	tmpNode= tmpNode->next;
-      insNode->next = tmpNode->next;
-      tmpNode->next = insNode;
-    }
-  else
-    {
-      insNode->next = this->firstNode;
-      this->firstNode = insNode;
-    }
-  // renumbering
-  insNode->number = insertPosition;
-  tmpNode = insNode->next;
-  while (tmpNode)
-    {
-      tmpNode->number++;
-      tmpNode = tmpNode->next;
-    }
-
-    // finished
-  insNode->position = newNode;
-  ++nodeCount;
-  this->rebuild();
-  return;
-}
-
-/**
-   \brief Finds a Node by its Number, and returns its Position
-   \param nodeToFind the n'th node in the List of nodes
-   \returns A Vector to the Position of the Node.
-*/
-Vector Curve::getNode(unsigned int nodeToFind)
-{
-  if (nodeToFind > this->nodeCount || nodeToFind < 0)
-    return Vector(0,0,0);
-  PathNode* tmpNode = this->firstNode;
-  for (int i = 1; i < nodeToFind; i++)
-    tmpNode = tmpNode->next;
-  return tmpNode->position;
-}
-
-/**
-   \brief Outputs information about the state of this Curve
-*/
-void Curve::debug(void)
-{
-  printf("<<-------------------------------\n");
-  printf("Curve Information:\n");
-  printf("NodeCount: %d\n", this->nodeCount);
-  PathNode* tmpNode = this->firstNode;
-  while (tmpNode)
-    {
-      printf("node #%d: %f, %f, %f\n", tmpNode->number, tmpNode->position.x, tmpNode->position.y, tmpNode->position.z);
-      tmpNode = tmpNode->next;
-    }
-  printf("------------------------------->>\n");
-}
-
-
-///////////////////////////////////
-/// Bezier Curve //////////////////
-///////////////////////////////////
-
-/**
-   \brief Creates a new BezierCurve
-*/
-BezierCurve::BezierCurve (void)
-{
-  this->derivation = 0;
-  dirCurve = new BezierCurve(1);
-  this->init();
-}
-
-/**
-   \brief Creates a new BezierCurve-Derivation-Curve
-*/
-BezierCurve::BezierCurve (int derivation)
-{
-  this->derivation = derivation;
-  dirCurve=NULL;
-  this->init();
-}
-
-/**
-   \brief Deletes a BezierCurve.
-
-   It does this by freeing all the space taken over from the nodes
-*/
-BezierCurve::~BezierCurve(void)
-{
-  PathNode* tmpNode;
-  currentNode = firstNode;
-  while (tmpNode != 0)
-    {
-      tmpNode = currentNode;
-      currentNode = currentNode->next;
-      delete tmpNode;
-    }
-  if (dirCurve)
-    delete dirCurve;
-}
-
-/**
-   \brief Initializes a BezierCurve
-*/
-void BezierCurve::init(void)
-{
-  nodeCount = 0;
-  firstNode = new PathNode;
-  currentNode = firstNode;
-
-  firstNode->position = Vector (.0, .0, .0);
-  firstNode->number = 0;
-  firstNode->next = 0; // not sure if this really points to NULL!!
-
-  return;
-}
-
-/**
-   \brief Rebuilds a Curve
-*/
-void BezierCurve::rebuild(void)
-{
-  PathNode* tmpNode = firstNode;
-
-  // rebuilding the Curve itself
-  float k=0;
-  float n = nodeCount -1;
-  float binCoef = 1;
-  while(tmpNode)
-    {
-      tmpNode->factor = binCoef;
-      if (tmpNode =tmpNode->next)
-	{
-	  binCoef *=(n-k)/(k+1);
-	  ++k;
-	}
-    }
-
-  // rebuilding the Derivation curve
-  if(this->derivation <= 1)
-    {
-      tmpNode = firstNode;
-      delete dirCurve;
-      dirCurve = new BezierCurve(1);
-      while(tmpNode->next)
-	{
-	  Vector tmpVector = (tmpNode->next->position)- (tmpNode->position);
-	  tmpVector.x*=(float)nodeCount;
-	  tmpVector.y*=(float)nodeCount;
-	  tmpVector.z*=(float)nodeCount;
-	  tmpVector.normalize();
-	  this->dirCurve->addNode(tmpVector);
-	  tmpNode = tmpNode->next;
-	}
-    }
-}
-
-/**
-   \brief calculates the Position on the curve
-   \param t The position on the Curve (0<=t<=1)
-   \return the Position on the Path
-*/
-Vector BezierCurve::calcPos(float t) 
-{
-  Vector ret = Vector(0.0,0.0,0.0);
-  if (this->nodeCount >= 3)
-    {
-      PathNode* tmpNode = this->firstNode;
-      double factor = pow(1.0-t,nodeCount-1);
-      while(tmpNode)
-	{
-	  ret.x += tmpNode->factor * factor * tmpNode->position.x;
-	  ret.y += tmpNode->factor * factor * tmpNode->position.y;
-	  ret.z += tmpNode->factor * factor * tmpNode->position.z;
-	  factor *= t/(1.0-t); // same as pow but much faster.
-	  
-	  tmpNode = tmpNode->next;
-	}
-    }
-  else if (nodeCount == 2)
-    {
-      ret = this->firstNode->position *(1.0-t);
-      ret = ret + this->firstNode->next->position * t;
-    }
-  else if (nodeCount == 1)
-    ret = this->firstNode->position;
-  return ret;
-}
-
-/**
-   \brief Calulates the direction of the Curve at time t.
-   \param The time at which to evaluate the curve.
-   \returns The vvaluated Vector.
-*/
-Vector BezierCurve::calcDir (float t)
-{
-  return dirCurve->calcPos(t);
-}
-
-Vector BezierCurve::calcAcc (float t)
-{
-  return dirCurve->dirCurve->calcPos(t);
-}
-
-/**
-   \brief Calculates the Quaternion needed for our rotations
-   \param t The time at which to evaluate the cuve.
-   \returns The evaluated Quaternion.
-*/
-Quaternion BezierCurve::calcQuat (float t)
-{
-  return Quaternion (calcDir(t), Vector(0,0,1));
-}
-
-
-/**
-  \brief returns the Position of the point calculated on the Curve
-  \return a Vector to the calculated position
-*/
-Vector BezierCurve::getPos(void) const
-{
-  return curvePoint;
-}
-
-
-
-///////////////////////////////////
-//// Uniform Point curve  /////////
-///////////////////////////////////
-/**
-   \brief Creates a new UPointCurve
-*/
-UPointCurve::UPointCurve (void)
-{
-  this->derivation = 0;
-  this->init();
-}
-
-/**
-   \brief Creates a new UPointCurve-Derivation-Curve of deriavation'th degree
-*/
-UPointCurve::UPointCurve (int derivation)
-{
-  this->derivation = derivation;
-  dirCurve=NULL;
-  this->init();
-}
-
-/**
-   \brief Deletes a UPointCurve.
-
-   It does this by freeing all the space taken over from the nodes
-*/
-UPointCurve::~UPointCurve(void)
-{
-  PathNode* tmpNode;
-  currentNode = firstNode;
-  while (tmpNode != 0)
-    {
-      tmpNode = currentNode;
-      currentNode = currentNode->next;
-      delete tmpNode;
-    }
-  if (dirCurve)
-    delete dirCurve;
-}
-
-/**
-   \brief Initializes a UPointCurve
-*/
-void UPointCurve::init(void)
-{
-  nodeCount = 0;
-  firstNode = new PathNode;
-  currentNode = firstNode;
-
-  firstNode->position = Vector (.0, .0, .0);
-  firstNode->number = 0;
-  firstNode->next = 0; // not sure if this really points to NULL!!
-
-  return;
-}
-
-/**
-   \brief Rebuilds a UPointCurve
-   
-   \todo very bad algorithm
-*/
-void UPointCurve::rebuild(void)
-{
-  // rebuilding the Curve itself
-  PathNode* tmpNode = this->firstNode;
-  int i=0;
-  Matrix xTmpMat = Matrix(this->nodeCount, this->nodeCount);
-  Matrix yTmpMat = Matrix(this->nodeCount, this->nodeCount);
-  Matrix zTmpMat = Matrix(this->nodeCount, this->nodeCount);
-  Matrix xValMat = Matrix(this->nodeCount, 3);
-  Matrix yValMat = Matrix(this->nodeCount, 3);
-  Matrix zValMat = Matrix(this->nodeCount, 3);
-  while(tmpNode)
-    {
-      Vector fac = Vector(1,1,1);
-      for (int j = 0; j < this->nodeCount; j++)
-	{
-	  xTmpMat(i,j) = fac.x; fac.x *= (float)i/(float)this->nodeCount;//tmpNode->position.x;
-	  yTmpMat(i,j) = fac.y; fac.y *= (float)i/(float)this->nodeCount;//tmpNode->position.y;
-	  zTmpMat(i,j) = fac.z; fac.z *= (float)i/(float)this->nodeCount;//tmpNode->position.z;
-	}
-      xValMat(i,0) = tmpNode->position.x;
-      yValMat(i,0) = tmpNode->position.y;
-      zValMat(i,0) = tmpNode->position.z;
-      ++i;
-      tmpNode = tmpNode->next;
-    }
-  tmpNode = this->firstNode;
-  xValMat = xTmpMat.Inv() *= xValMat;
-  yValMat = yTmpMat.Inv() *= yValMat;
-  zValMat = zTmpMat.Inv() *= zValMat;
-  i = 0;
-  while(tmpNode)
-    {
-      tmpNode->vFactor.x = xValMat(i,0);
-      tmpNode->vFactor.y = yValMat(i,0);
-      tmpNode->vFactor.z = zValMat(i,0);
-
-      i++;
-      tmpNode = tmpNode->next;
-    }
-}
-
-/**
-   \brief calculates the Position on the curve
-   \param t The position on the Curve (0<=t<=1)
-   \return the Position on the Path
-*/
-Vector UPointCurve::calcPos(float t) 
-{
-  PathNode* tmpNode = firstNode;
-  Vector ret = Vector(0.0,0.0,0.0);
-  float factor = 1.0;
-  while(tmpNode)
-    {
-      ret.x += tmpNode->vFactor.x * factor;
-      ret.y += tmpNode->vFactor.y * factor;
-      ret.z += tmpNode->vFactor.z * factor;
-      factor *= t;
-
-      tmpNode = tmpNode->next;
-    }
-  return ret;
-}
-
-/**
-   \brief Calulates the direction of the Curve at time t.
-   \param The time at which to evaluate the curve.
-   \returns The vvaluated Vector.
-*/
-Vector UPointCurve::calcDir (float t)
-{
-  PathNode* tmpNode = firstNode;
-  Vector ret = Vector(0.0,0.0,0.0);
-  float factor = 1.0/t;
-  int k=0;
-  while(tmpNode)
-    {
-      ret.x += tmpNode->vFactor.x * factor *k;
-      ret.y += tmpNode->vFactor.y * factor *k;
-      ret.z += tmpNode->vFactor.z * factor *k;
-      factor *= t;
-      k++;
-      tmpNode = tmpNode->next;
-    }
-  ret.normalize();
-  return ret;
-}
-
-Vector UPointCurve::calcAcc (float t)
-{
-}
-
-/**
-   \brief Calculates the Quaternion needed for our rotations
-   \param t The time at which to evaluate the cuve.
-   \returns The evaluated Quaternion.
-*/
-Quaternion UPointCurve::calcQuat (float t)
-{
-  return Quaternion (calcDir(t), Vector(0,0,1));
-}
-
-
-/**
-  \brief returns the Position of the point calculated on the Curve
-  \return a Vector to the calculated position
-*/
-Vector UPointCurve::getPos(void) const
-{
-  return curvePoint;
-}
Index: xonox/branches/trackManager/src/curve.h
===================================================================
--- /orxonox/branches/trackManager/src/curve.h	(revision 3497)
+++ 	(revision )
@@ -1,118 +1,0 @@
-
-/*! 
-    \file curve.h
-    \brief A basic 3D curve framework
-    
-    Contains classes to handle curves
-*/ 
-
-#ifndef _CURVE_H
-#define _CURVE_H
-
-#include "vector.h"
-
-//! An Enumerator that defines what sort of Curves are availible
-enum CurveType {BEZIERCURVE, UPOINTCURVE};
-
-
-//! An abstract class to handle curves. Needed for the Tracking system in orxonox.
-class Curve
-{
- protected:
-  int nodeCount;         //!< The count of nodes the Curve has.
-  Vector curvePoint;     //!< The point on the Cureve at a local Time.
-  float localTime;       //!< If the time of one point is asked more than once the programm will not calculate it again.
-  int derivation;        //!< Which derivation of a Curve is this.
-
-  //! Handles the curve-points (dynamic List)
-  struct PathNode
-  {
-    int number;          //!< The N-th node of this curve.
-    float factor;        //!< Curve specific multiplier factor.
-    Vector vFactor;      //!< A Vector-factor for multipliing.
-    Vector position;     //!< Vector Pointung to this curve-point.
-    PathNode* next;      //!< Pointer to the next Node.
-  };
-
-  PathNode* firstNode;   //!< First node of the curve.
-  PathNode* currentNode; //!< The node we are working with (the Last node).
-
- private:
-  virtual void rebuild(void) = 0;
- public:
-  Curve* dirCurve;       //!< The derivation-curve of this Curve.
-  void addNode(const Vector& newNode);
-  void addNode(const Vector& newNode, unsigned int insertPosition);
-  Vector getNode(unsigned int nodeToFind);
-  inline int getNodeCount(void) { return this->nodeCount;}
-
-  virtual Vector calcPos(float t) = 0;
-  virtual Vector calcDir(float t) = 0;
-  virtual Vector calcAcc(float t) = 0;
-  virtual Quaternion calcQuat(float t) = 0;
- 
-  // DEBUG
-  void debug(void);
-};
-
-//!    Class to handle bezier curves in 3-dimesnsional space
-/**
-   This Curve is good, for Fast Interaction. If you want to change it during the game, go on.
-   !!be aware!! BezierCurves only flow through their first and last Node. Their Tangents at those Points a directed to the second and second-last Point.
-*/
-class BezierCurve : public Curve
-{
- private:
-  void rebuild(void);
- public:
-  BezierCurve(void);
-  BezierCurve(int derivation);
-  ~BezierCurve(void);
-  void init(void);
-
-  Vector calcPos(float t);
-  Vector calcDir(float t);
-  Vector calcAcc(float t);
-  Quaternion calcQuat(float t);
-  
-  
-  Vector getPos(void) const;
-};
-
-
-//! B-Spline
-/**
-   class to handle b-spline in 3d space
-*/
-class BSplieCurve : public Curve
-{
-
-
-};
-
-//! Uniform Point Curve-class
-/**
-   A UPoint Curve is a A Curve, that flows through all the nodes given it.
-   The Algorithm to buid the curve is rather slow, but Painting and tracing along the curve has high speed, so do not change this curve during the Game.
-
-   This Curve is very erattic, so i do not recommend to use it.
-*/
-class UPointCurve : public Curve
-{
- private:
-  void rebuild(void);
- public:
-  UPointCurve(void);
-  UPointCurve(int derivation);
-  ~UPointCurve(void);
-  void init(void);
-
-  Vector calcPos(float t);
-  Vector calcDir(float t);
-  Vector calcAcc(float t);
-  Quaternion calcQuat(float t);
-  
-  Vector getPos(void) const;
-};
-
-#endif /* _CURVE_H */
Index: xonox/branches/trackManager/src/data_tank.cc
===================================================================
--- /orxonox/branches/trackManager/src/data_tank.cc	(revision 3497)
+++ 	(revision )
@@ -1,26 +1,0 @@
-
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   Copyright by: Patrick Boenzli
-   Fixes by:
-*/
-
-
-#include "data_tank.h"
-
-using namespace std;
-
-long DataTank::timeStamp = 0;
-
-DataTank::DataTank () {}
-DataTank::~DataTank () {}
-
-
Index: xonox/branches/trackManager/src/data_tank.h
===================================================================
--- /orxonox/branches/trackManager/src/data_tank.h	(revision 3497)
+++ 	(revision )
@@ -1,16 +1,0 @@
-
-#ifndef _DATA_TANK_H
-#define _DATA_TANK_H
-
-
-class DataTank {
-
- public:
-  DataTank ();
-  ~DataTank ();
-
-  static long timeStamp;
-
-};
-
-#endif /* _DATA_TANK_H */
Index: xonox/branches/trackManager/src/debug.h
===================================================================
--- /orxonox/branches/trackManager/src/debug.h	(revision 3497)
+++ 	(revision )
@@ -1,180 +1,0 @@
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   ### File Specific:
-   main-programmer: Benjamin Grauer
-   co-programmer: ...
-*/
-
-/*! 
-    \file debug.h
-    \brief Handles output to console for different Verbose-Modes.
-*/ 
-
-#ifndef _DEBUG_H
-#define _DEBUG_H
-
-#define NO              0
-#define ERROR           1
-#define WARNING         2
-#define INFORMATION     3
-#define DEBUGING        4
-
-#include <stdio.h>
-
-///////////////////////////////////////////////////
-/// PRINTF: prints with filename and linenumber ///
-///////////////////////////////////////////////////
-
-#ifdef  DEBUG
-extern int verbose;
-#define PRINTF(x) \
-           PRINTF ## x
-
-#if DEBUG >= ERROR
-#define PRINTF1 \
-    if (verbose >= ERROR) \
-      printf("%s:%d::", __FILE__, __LINE__) && printf
-#else 
-#define PRINTF1 if (NO)
-#endif
-     
-#if DEBUG >= WARNING
-#define PRINTF2 \
-     if (verbose >= WARNING) \
-       printf("%s:%d::", __FILE__, __LINE__) && printf
-         
-#else 
-#define PRINTF2 if (NO)
-#endif
-     
-#if DEBUG >= INFORMATION
-#define PRINTF3 \
-     if (verbose >= INFORMATION) \
-       printf("%s:%d::", __FILE__, __LINE__) && printf
-#else 
-#define PRINTF3 if (NO)
-#endif
-     
-#if DEBUG >= DEBUGING
-#define PRINTF4 \
-     if (verbose >= DEBUGING) \
-       printf("%s:%d::", __FILE__, __LINE__) && printf
-#else 
-#define PRINTF4 if (NO)
-#endif
-     
-     
-#else  
-#define PRINTF(x) if (NO)
-#endif
-
-#define PRINTF0 \
-    printf("%s:%d::", __FILE__, __LINE__) && printf
-
-
-///////////////////////////////////////////////////
-///  PRINT: just prints output as is            ///
-///////////////////////////////////////////////////
-#ifdef  DEBUG
-extern int verbose;
-#define PRINT(x) \
-  PRINT ## x
-
-#if DEBUG >= ERROR
-#define PRINT1	\
-  if (verbose >= ERROR)	\
-    printf
-#else 
-#define PRINT1 if (NO)
-#endif
-
-#if DEBUG >= WARNING
-#define PRINT2 \
-  if (verbose >= WARNING) \
-    printf
-
-#else 
-#define PRINT2 if (NO)
-#endif
-
-#if DEBUG >= INFORMATION
-#define PRINT3 \
-  if (verbose >= INFORMATION) \
-    printf
-#else 
-#define PRINT3 if (NO)
-#endif
-
-#if DEBUG >= DEBUGING
-#define PRINT4 \
-  if (verbose >= DEBUGING) \
-    printf
-#else 
-#define PRINT4 if (NO)
-#endif
-
-
-#else  
-#define PRINT(x) if (NO)
-#endif
-
-#define PRINT0 \
-  printf
-
-///////////////////////////////////////////////////
-/// COUT: simple cout print with verbose-check  ///
-///////////////////////////////////////////////////
-#ifdef  DEBUG
-#define COUT(x) \
-           COUT ## x
-
-#if DEBUG >= 1
-#define COUT1 \
-    if (verbose >= 1 ) \
-      cout
-#else 
-#define COUT1 if (NO) cout
-#endif
-     
-#if DEBUG >= 2
-#define COUT2 \
-     if (verbose >= 2 ) \
-       cout
-
-#else 
-#define COUT2 if (NO) cout
-#endif
-     
-#if DEBUG >= 3
-#define COUT3 \
-     if (verbose >= 3 ) \
-       cout
-#else
-#define COUT3 if (NO) cout
-#endif
-     
-#if DEBUG >= 4
-#define COUT4 \
-     if (verbose >= 4 ) \
-       cout
-#else 
-#define COUT4 if (NO) cout
-#endif
-     
-     
-#else  
-#define COUT(x) if (NO) cout
-#endif
-
-#define COUT0 \
-           cout
-
-#endif /* _DEBUG_H */
Index: /orxonox/branches/trackManager/src/defs/debug.h
===================================================================
--- /orxonox/branches/trackManager/src/defs/debug.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/defs/debug.h	(revision 3498)
@@ -0,0 +1,184 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+   co-programmer: ...
+*/
+
+/*! 
+    \file debug.h
+    \brief Handles output to console for different Verbose-Modes.
+*/ 
+
+#ifndef _DEBUG_H
+#define _DEBUG_H
+
+#define NO              0
+#define ERR             1
+#define WARN            2
+#define INFO            3
+#define DEBUGING        4
+
+#if HAVE_CONFIG_H 
+#include <config.h> 
+#endif
+
+#include <stdio.h>
+
+///////////////////////////////////////////////////
+/// PRINTF: prints with filename and linenumber ///
+///////////////////////////////////////////////////
+
+#ifdef DEBUG
+extern int verbose;
+#define PRINTF(x) \
+           PRINTF ## x
+
+#if DEBUG >= ERR
+#define PRINTF1 \
+    if (verbose >= ERR) \
+      printf("%s:%d::ERROR:", __FILE__, __LINE__) && printf
+#else 
+#define PRINTF1 if (NO)
+#endif
+     
+#if DEBUG >= WARN
+#define PRINTF2 \
+     if (verbose >= WARN) \
+       printf("%s:%d::WARNING:", __FILE__, __LINE__) && printf
+         
+#else 
+#define PRINTF2 if (NO)
+#endif
+     
+#if DEBUG >= INFO
+#define PRINTF3 \
+     if (verbose >= INFO) \
+       printf("%s:%d::INFO:", __FILE__, __LINE__) && printf
+#else 
+#define PRINTF3 if (NO)
+#endif
+     
+#if DEBUG >= DEBUGING
+#define PRINTF4 \
+     if (verbose >= DEBUGING) \
+       printf("%s:%d::DEBUG:", __FILE__, __LINE__) && printf
+#else 
+#define PRINTF4 if (NO)
+#endif
+     
+     
+#else  
+#define PRINTF(x) if (NO)
+#endif
+
+#define PRINTF0 \
+    printf("%s:%d::", __FILE__, __LINE__) && printf
+
+
+///////////////////////////////////////////////////
+///  PRINT: just prints output as is            ///
+///////////////////////////////////////////////////
+#ifdef  DEBUG
+extern int verbose;
+#define PRINT(x) \
+  PRINT ## x
+
+#if DEBUG >= ERR
+#define PRINT1	\
+  if (verbose >= ERR)	\
+    printf
+#else 
+#define PRINT1 if (NO)
+#endif
+
+#if DEBUG >= WARN
+#define PRINT2 \
+  if (verbose >= WARN) \
+    printf
+
+#else 
+#define PRINT2 if (NO)
+#endif
+
+#if DEBUG >= INFO
+#define PRINT3 \
+  if (verbose >= INFO) \
+    printf
+#else 
+#define PRINT3 if (NO)
+#endif
+
+#if DEBUG >= DEBUGING
+#define PRINT4 \
+  if (verbose >= DEBUGING) \
+    printf
+#else 
+#define PRINT4 if (NO)
+#endif
+
+
+#else  
+#define PRINT(x) if (NO)
+#endif
+
+#define PRINT0 \
+  printf
+
+///////////////////////////////////////////////////
+/// COUT: simple cout print with verbose-check  ///
+///////////////////////////////////////////////////
+#ifdef  DEBUG
+#define COUT(x) \
+           COUT ## x
+
+#if DEBUG >= 1
+#define COUT1 \
+    if (verbose >= 1 ) \
+      cout
+#else 
+#define COUT1 if (NO) cout
+#endif
+     
+#if DEBUG >= 2
+#define COUT2 \
+     if (verbose >= 2 ) \
+       cout
+
+#else 
+#define COUT2 if (NO) cout
+#endif
+     
+#if DEBUG >= 3
+#define COUT3 \
+     if (verbose >= 3 ) \
+       cout
+#else
+#define COUT3 if (NO) cout
+#endif
+     
+#if DEBUG >= 4
+#define COUT4 \
+     if (verbose >= 4 ) \
+       cout
+#else 
+#define COUT4 if (NO) cout
+#endif
+     
+     
+#else  
+#define COUT(x) if (NO) cout
+#endif
+
+#define COUT0 \
+           cout
+
+#endif /* _DEBUG_H */
Index: /orxonox/branches/trackManager/src/defs/error.h
===================================================================
--- /orxonox/branches/trackManager/src/defs/error.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/defs/error.h	(revision 3498)
@@ -0,0 +1,63 @@
+
+
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: Patrick Boenzli
+   co-programmer: Christian Meyer
+*/
+
+
+/*! 
+    \file error.h
+    \brief A compendium of Error codes used in the program
+*/ 
+
+
+#ifndef _ERROR_H
+#define _ERROR_H
+
+// these are the two undefined error nr. Don't use them ...
+#define oERROR -1
+
+#define oNOERROR 0
+
+/*!
+    \brief Error Definitions:
+
+    Error Classes:
+    0xx application framework codes
+    1xx graphics codes
+    2xx file/FS codes
+    3xx network codes
+    4xx general codes
+
+    Error Specifier 1:
+    x0x action finsished as desired
+    x1x initialisation error
+    x2x execution error
+    x3x uninitialisation error
+
+    Error Specifier 2:
+    xx0 no further informations
+    xx1 only a warning - feel free to ignore, the program will proceed
+    xx2 this could lead unexpected behaviour
+    xx3 this is a fatal error - you are invited to quit the program - panic!
+*/
+
+typedef struct 
+{
+  int code;
+  char* message;
+  char* location;
+} ErrorMessage;
+
+#endif /* _ERROR_H */
Index: /orxonox/branches/trackManager/src/defs/glincl.h
===================================================================
--- /orxonox/branches/trackManager/src/defs/glincl.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/defs/glincl.h	(revision 3498)
@@ -0,0 +1,21 @@
+/*!
+  \file glincl.h
+  \brief This file includes gl Headers.
+  
+  no Class is defined here, but the opengl Headers
+*/
+
+#ifndef _GLINCL_H
+#define _GLINCL_H
+
+#ifndef __APPLE__
+#include <SDL/SDL.h>
+#include <GL/gl.h>
+#include <GL/glu.h>
+#else
+#include <SDL.h>
+#include <OpenGL/gl.h>
+#include <OpenGL/glu.h>
+#endif
+
+#endif /* _GLINCL_H */
Index: /orxonox/branches/trackManager/src/defs/stdincl.h
===================================================================
--- /orxonox/branches/trackManager/src/defs/stdincl.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/defs/stdincl.h	(revision 3498)
@@ -0,0 +1,43 @@
+/*!
+  \file stdincl.h
+  \brief This file includes default headers that nearly every Class needs.
+  
+  no Class is defined here, but many headers to classes, and more general Headers like the openGL-header.
+*/
+
+#ifndef _STDINCL_H
+#define _STDINCL_H
+
+#define null 0   //!< null
+
+typedef unsigned char byte;
+
+// this includes the information from configure/makefiles
+#if HAVE_CONFIG_H 
+#include <config.h> 
+#endif
+
+#ifdef __WIN32__
+#include <windows.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "glincl.h"
+
+
+// MATH //
+#include "vector.h"
+
+#include "list.h"
+#include "list_template.h"
+#include "message_structures.h"
+#include "orxonox.h"
+#include "data_tank.h"
+#include "base_object.h"
+
+#include "error.h"
+#include "debug.h"
+
+#endif /* _STDINCL_H */
Index: xonox/branches/trackManager/src/environment.cc
===================================================================
--- /orxonox/branches/trackManager/src/environment.cc	(revision 3497)
+++ 	(revision )
@@ -1,62 +1,0 @@
-
-
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   ### File Specific
-   main-programmer: Patrick Boenzli
-   co-programmer: 
-*/
-
-
-#include "environment.h"
-#include "stdincl.h"
-#include "world_entity.h"
-#include "vector.h"
-#include "importer/objModel.h"
-
-using namespace std;
-
-
-
-Environment::Environment () : WorldEntity()
-{
-  this->model = new OBJModel("../data/models/fighter.obj");
-}
-
-
-
-Environment::~Environment () 
-{
-  delete this->model;
-}
-
-void Environment::tick (float time) {}
-
-void Environment::hit (WorldEntity* weapon, Vector loc) {}
-
-void Environment::destroy () {}
-
-void Environment::collide (WorldEntity* other,  Uint32 ownhitflags, Uint32 otherhitflags) {}
-
-void Environment::draw () 
-{
-  glMatrixMode(GL_MODELVIEW);
-  glLoadIdentity();
-  float matrix[4][4];
-  
-  glTranslatef (this->getAbsCoor ().x, this->getAbsCoor ().y, this->getAbsCoor ().z);
-  //rotate
-  this->getAbsDir().matrix (matrix);
-  glMultMatrixf((float*)matrix);
-  
-  this->model->draw();
-}
-
Index: xonox/branches/trackManager/src/environment.h
===================================================================
--- /orxonox/branches/trackManager/src/environment.h	(revision 3497)
+++ 	(revision )
@@ -1,31 +1,0 @@
-#ifndef _ENVIRONEMENT_H
-#define _ENVIRONEMENT_H
-
-#include "world_entity.h"
-
-
-class Environment : public WorldEntity 
-{
-  friend class World;
-
- private:
-  float xCor;
-  float yCor;
-  float zCor;
-
-  float mountainTest[10][10];
-
- public:
-  Environment ();
-  ~Environment ();
-
-  
-  virtual void tick (float time);
-  virtual void hit (WorldEntity* weapon, Vector loc);
-  virtual void destroy ();
-  virtual void collide (WorldEntity* other,  Uint32 ownhitflags, Uint32 otherhitflags);
-  virtual void draw ();
-
-};
-
-#endif /* _ENVIRONEMENT_H */
Index: xonox/branches/trackManager/src/error.h
===================================================================
--- /orxonox/branches/trackManager/src/error.h	(revision 3497)
+++ 	(revision )
@@ -1,63 +1,0 @@
-
-
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   ### File Specific:
-   main-programmer: Patrick Boenzli
-   co-programmer: Christian Meyer
-*/
-
-
-/*! 
-    \file error.h
-    \brief A compendium of Error codes used in the program
-*/ 
-
-
-#ifndef _ERROR_H
-#define _ERROR_H
-
-// these are the two undefined error nr. Don't use them ...
-#define oERROR -1
-
-#define oNOERROR 0
-
-/*!
-    \brief Error Definitions:
-
-    Error Classes:
-    0xx application framework codes
-    1xx graphics codes
-    2xx file/FS codes
-    3xx network codes
-    4xx general codes
-
-    Error Specifier 1:
-    x0x action finsished as desired
-    x1x initialisation error
-    x2x execution error
-    x3x uninitialisation error
-
-    Error Specifier 2:
-    xx0 no further informations
-    xx1 only a warning - feel free to ignore, the program will proceed
-    xx2 this could lead unexpected behaviour
-    xx3 this is a fatal error - you are invited to quit the program - panic!
-*/
-
-typedef struct 
-{
-  int code;
-  char* message;
-  char* location;
-} ErrorMessage;
-
-#endif /* _ERROR_H */
Index: /orxonox/branches/trackManager/src/glmenu/glmenu_imagescreen.cc
===================================================================
--- /orxonox/branches/trackManager/src/glmenu/glmenu_imagescreen.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/glmenu/glmenu_imagescreen.cc	(revision 3498)
@@ -0,0 +1,305 @@
+
+
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: Patrick Boenzli
+   co-programmer: 
+*/
+
+
+#include "glmenu_imagescreen.h"
+
+#include "material.h"
+
+using namespace std;
+
+GLMenuImageScreen* GLMenuImageScreen::singletonRef = 0;
+
+GLMenuImageScreen* GLMenuImageScreen::getInstance()
+{
+  if( singletonRef == NULL)
+    singletonRef = new GLMenuImageScreen ();
+  return singletonRef;
+}
+
+/**
+   \brief standard constructor
+
+   \todo this constructor is not jet implemented - do it
+*/
+GLMenuImageScreen::GLMenuImageScreen () 
+{
+   this->setClassName ("GLMenuImageScreen");
+}
+
+
+/**
+   \brief standard deconstructor
+
+   \todo this deconstructor is not jet implemented - do it
+*/
+GLMenuImageScreen::~GLMenuImageScreen() 
+{
+  if (backMat)
+    delete backMat;
+}
+
+
+/**
+   \brief function to init the screen
+*/
+void GLMenuImageScreen::init ()
+{
+  /*
+  int w = 680;
+  int h = 480;
+
+  glViewport(0,0,w,h);
+  
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity(); 
+  gluPerspective(45.0f,(GLfloat)w/(GLfloat)h, .5f ,150.0f);
+  glMatrixMode(GL_MODELVIEW); 
+
+  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+  glLoadIdentity();
+  gluLookAt(0, 0, 6,     0, 0, 0,     0, 1, 0);
+
+  // Bind the texture stored at the zero index of g_Texture[]
+  //glBindTexture(GL_TEXTURE_2D, g_Texture[0]);
+  */
+
+  
+  // Select Our VU Meter Background Texture
+  this->backMat = new Material("load_screen");
+  this->backMat->setDiffuseMap("../data/pictures/load_screen.jpg");
+  this->maxValue = 10;
+  this->currentValue = 0;
+
+  // End of Background image code.
+}
+
+
+/**
+   \brief function to innit screen with all attributes set
+   \param name of the background-image file
+   \param height of the ImageScreen
+   \param width of the Image Screen
+   \param x offset from (0, 0)
+   \param y offset from (0, 0)
+
+   GLMenu uses its own coordinating system: upper left corner is (0, 0). x-axis is down=height, 
+   right axis is right direction (=width)
+*/
+void GLMenuImageScreen::init (char* backImageName, float height, float width, 
+			      float offsetX, float offsetY)
+{}
+
+
+/**
+   \brief draws the ImageScreen to the screenbuffer
+*/
+void GLMenuImageScreen::draw ()
+{
+  /*
+  // Display a quad texture to the screen
+  glEnable(GL_TEXTURE_2D);
+  glBegin(GL_QUADS);
+  
+  // Display the top left vertice
+  glTexCoord2f(0.0f, 1.0f);
+  glVertex3f(-2.5, 2.5, 0);
+  
+  // Display the bottom left vertice
+  glTexCoord2f(0.0f, 0.0f);
+  glVertex3f(-2.5, -2.5, 0);
+  
+  // Display the bottom right vertice
+  glTexCoord2f(1.0f, 0.0f);
+  glVertex3f(2.5, -2.5, 0);
+  
+  // Display the top right vertice
+  glTexCoord2f(1.0f, 1.0f);
+  glVertex3f(2.5, 2.5, 0);
+
+  glEnd();
+  glEnable(GL_TEXTURE_2D);  
+  */
+
+  glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+
+  /* screen size */
+  int screenWidth = 640;
+  int screenHeight = 480;
+  
+  /* set image size */
+  int imageWidth = 640;
+  int imageHeight = 480;
+  
+  /* start pos of image */
+  int offsetX = (screenWidth - imageWidth)/2;
+  int offsetY = (screenHeight - imageHeight)/2;
+  
+  /* loadbar pos */
+  int barX = 390;
+  int barY = 50;
+  int barWidth = 230;
+  int barHeight = 30;
+
+  int val = (int)((float)this->currentValue/(float)this->maxValue) * barWidth;
+
+  glMatrixMode(GL_PROJECTION);
+  glPushMatrix();
+  glLoadIdentity();
+  /* set up an ortho screen */
+  glOrtho(0, screenWidth, 0, screenHeight, -1, 1); 
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
+  glPushMatrix();
+
+  glEnable(GL_BLEND);
+  glPushAttrib(GL_LIGHTING_BIT | GL_TRANSFORM_BIT);
+  glDisable(GL_LIGHTING);
+
+  backMat->select();
+  glBegin(GL_QUADS);
+  glColor3f(0.96, 0.84, 0.34);
+  glVertex2i(barX, barY);
+  glVertex2i(barX + val, barY);
+  glVertex2i(barX + val, barY + barHeight);
+  glVertex2i(barX, barY + barHeight);
+  glColor3f(1.0, 1.0, 1.0);
+  glEnd();
+
+  glBegin(GL_QUADS);
+  glColor3f(0.0, 0.0, 0.0);
+  glVertex2i(barX, barY);
+  glVertex2i(barX + barWidth, barY);
+  glVertex2i(barX + barWidth, barY + barHeight);
+  glVertex2i(barX, barY + barHeight);
+  glColor3f(1.0, 1.0, 1.0);
+  glEnd();
+
+  /* draw black border */
+  glBegin(GL_QUADS);
+  glColor3f(0.0, 0.0, 0.0);
+  glVertex2i(barX-1, barY-1);
+  glVertex2i(barX + barWidth +1, barY-1);
+  glVertex2i(barX + barWidth+1, barY + barHeight+1);
+  glVertex2i(barX - 1, barY + barHeight +1);
+  glColor3f(1.0, 1.0, 1.0);
+  glEnd();
+
+  /* draw white border */
+  glBegin(GL_QUADS);
+  glColor3f(1.0, 1.0, 1.0);
+  glVertex2i(barX-2, barY-2);
+  glVertex2i(barX + barWidth +2, barY-2);
+  glVertex2i(barX + barWidth+2, barY + barHeight+2);
+  glVertex2i(barX - 2, barY + barHeight +2);
+  glColor3f(1.0, 1.0, 1.0);
+  glEnd();
+
+  glEnable(GL_TEXTURE_2D);
+  glBegin(GL_QUADS);
+  glTexCoord2i(0, 0); glVertex2i(offsetX, offsetY);
+  glTexCoord2i(1, 0); glVertex2i(offsetX + imageWidth, offsetY);
+  glTexCoord2i(1, 1); glVertex2i(offsetX + imageWidth, offsetY + imageHeight);
+  glTexCoord2i(0, 1); glVertex2i(offsetX, offsetY + imageHeight);
+  glEnd();
+  glDisable(GL_TEXTURE_2D);
+
+  glDisable(GL_BLEND);
+  glPopMatrix();
+  glMatrixMode(GL_PROJECTION);
+  glPopMatrix();
+  glPopAttrib();
+
+  SDL_GL_SwapBuffers();                    
+}
+ 
+
+/** 
+    \brief sets the background image name
+    \param file name of the backgroun-image
+ */
+void GLMenuImageScreen::setBackImageName (char* backImageName)
+{}
+
+
+/**
+   \brief sets position of the ImageScreen
+   \param x offset from (0, 0)
+   \param y offset from (0, 0)
+*/
+void GLMenuImageScreen::setPosition(float offsetX, float offsetY)
+{}
+
+
+/*
+  \brief sets size of the ImageScreen
+  \param height of the ImageScreen
+  \param width of the Image Screen
+*/
+void GLMenuImageScreen::setSize(float height, float width)
+{}
+
+
+/**
+   \brief set the maximum of countable steps
+   \param maximum of steps
+*/
+void GLMenuImageScreen::setMaximum(int maxValue)
+{
+  this->maxValue = maxValue;
+}
+
+
+/**
+   \brief gets the maximum of countable steps
+*/
+int GLMenuImageScreen::getMaximum()
+{
+  return this->maxValue;
+}
+
+
+/**
+   \brief set current value
+   \param current value
+*/
+void GLMenuImageScreen::setValue(int currentValue)
+{
+  this->currentValue = currentValue;
+  this->draw();
+}
+
+
+/**
+   \brief get the current value
+ */
+int GLMenuImageScreen::getValue()
+{
+  return this->currentValue;
+}
+
+
+/** 
+    \brief call this to trigger a progress event
+    
+    this has to redraw the progress bar and the whole image
+ */
+void GLMenuImageScreen::step ()
+{
+  this->currentValue++;
+  this->draw();
+}
Index: /orxonox/branches/trackManager/src/glmenu/glmenu_imagescreen.h
===================================================================
--- /orxonox/branches/trackManager/src/glmenu/glmenu_imagescreen.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/glmenu/glmenu_imagescreen.h	(revision 3498)
@@ -0,0 +1,52 @@
+/*! 
+    \file glmenu_imagescreen
+    \brief class to display a image
+*/
+
+
+#ifndef _GLMENU_IMAGESCREEN_H
+#define _GLMENU_IMAGESCREEN_H
+
+#include "stdincl.h"
+class Texture;
+class Material;
+
+class GLMenuImageScreen : public BaseObject {
+
+ private:
+  GLMenuImageScreen ();
+
+ public:
+  ~GLMenuImageScreen ();
+
+  static GLMenuImageScreen* getInstance();
+
+  static GLMenuImageScreen* singletonRef;
+
+  void init ();
+  void init (char* backImageName, float height, float width, 
+	     float offsetX, float offsetY);
+
+  void draw ();
+  
+  void setBackImageName (char* backImageName);
+  void setPosition (float offsetX, float offsetY);
+  void setSize (float height, float width);
+  
+  void setMaximum (int maxValue);
+  int getMaximum ();
+  void setValue (int currentValue);
+  int getValue ();
+  void step ();
+
+ private:
+  char* backImageName;       //!< the name of the file of the background image
+  float height, width;       //!< hight and width of the image
+  float offsetX, offsetY;    //!< offset of the image from left and up
+  Material* backMat;         //!< Background Material.
+  int currentValue;          //!< the current count of step() calls fired yet
+  int maxValue;              //!< total count of steps
+
+};
+
+#endif /* _GLMENU_IMAGESCREEN_H */
Index: xonox/branches/trackManager/src/glmenu_imagescreen.cc
===================================================================
--- /orxonox/branches/trackManager/src/glmenu_imagescreen.cc	(revision 3497)
+++ 	(revision )
@@ -1,305 +1,0 @@
-
-
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   ### File Specific:
-   main-programmer: Patrick Boenzli
-   co-programmer: 
-*/
-
-
-#include "glmenu_imagescreen.h"
-
-#include "importer/material.h"
-
-using namespace std;
-
-GLMenuImageScreen* GLMenuImageScreen::singletonRef = 0;
-
-GLMenuImageScreen* GLMenuImageScreen::getInstance()
-{
-  if( singletonRef == NULL)
-    singletonRef = new GLMenuImageScreen ();
-  return singletonRef;
-}
-
-/**
-   \brief standard constructor
-
-   \todo this constructor is not jet implemented - do it
-*/
-GLMenuImageScreen::GLMenuImageScreen () 
-{
-   this->setClassName ("GLMenuImageScreen");
-}
-
-
-/**
-   \brief standard deconstructor
-
-   \todo this deconstructor is not jet implemented - do it
-*/
-GLMenuImageScreen::~GLMenuImageScreen() 
-{
-  if (backMat)
-    delete backMat;
-}
-
-
-/**
-   \brief function to init the screen
-*/
-void GLMenuImageScreen::init ()
-{
-  /*
-  int w = 680;
-  int h = 480;
-
-  glViewport(0,0,w,h);
-  
-  glMatrixMode(GL_PROJECTION);
-  glLoadIdentity(); 
-  gluPerspective(45.0f,(GLfloat)w/(GLfloat)h, .5f ,150.0f);
-  glMatrixMode(GL_MODELVIEW); 
-
-  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-  glLoadIdentity();
-  gluLookAt(0, 0, 6,     0, 0, 0,     0, 1, 0);
-
-  // Bind the texture stored at the zero index of g_Texture[]
-  //glBindTexture(GL_TEXTURE_2D, g_Texture[0]);
-  */
-
-  
-  // Select Our VU Meter Background Texture
-  this->backMat = new Material("load_screen");
-  this->backMat->setDiffuseMap("../data/pictures/load_screen.jpg");
-  this->maxValue = 10;
-  this->currentValue = 0;
-
-  // End of Background image code.
-}
-
-
-/**
-   \brief function to innit screen with all attributes set
-   \param name of the background-image file
-   \param height of the ImageScreen
-   \param width of the Image Screen
-   \param x offset from (0, 0)
-   \param y offset from (0, 0)
-
-   GLMenu uses its own coordinating system: upper left corner is (0, 0). x-axis is down=height, 
-   right axis is right direction (=width)
-*/
-void GLMenuImageScreen::init (char* backImageName, float height, float width, 
-			      float offsetX, float offsetY)
-{}
-
-
-/**
-   \brief draws the ImageScreen to the screenbuffer
-*/
-void GLMenuImageScreen::draw ()
-{
-  /*
-  // Display a quad texture to the screen
-  glEnable(GL_TEXTURE_2D);
-  glBegin(GL_QUADS);
-  
-  // Display the top left vertice
-  glTexCoord2f(0.0f, 1.0f);
-  glVertex3f(-2.5, 2.5, 0);
-  
-  // Display the bottom left vertice
-  glTexCoord2f(0.0f, 0.0f);
-  glVertex3f(-2.5, -2.5, 0);
-  
-  // Display the bottom right vertice
-  glTexCoord2f(1.0f, 0.0f);
-  glVertex3f(2.5, -2.5, 0);
-  
-  // Display the top right vertice
-  glTexCoord2f(1.0f, 1.0f);
-  glVertex3f(2.5, 2.5, 0);
-
-  glEnd();
-  glEnable(GL_TEXTURE_2D);  
-  */
-
-  glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
-
-  /* screen size */
-  int screenWidth = 640;
-  int screenHeight = 480;
-  
-  /* set image size */
-  int imageWidth = 640;
-  int imageHeight = 480;
-  
-  /* start pos of image */
-  int offsetX = (screenWidth - imageWidth)/2;
-  int offsetY = (screenHeight - imageHeight)/2;
-  
-  /* loadbar pos */
-  int barX = 390;
-  int barY = 50;
-  int barWidth = 230;
-  int barHeight = 30;
-
-  int val = (int)((float)this->currentValue/(float)this->maxValue) * barWidth;
-
-  glMatrixMode(GL_PROJECTION);
-  glPushMatrix();
-  glLoadIdentity();
-  /* set up an ortho screen */
-  glOrtho(0, screenWidth, 0, screenHeight, -1, 1); 
-  glMatrixMode(GL_MODELVIEW);
-  glLoadIdentity();
-  glPushMatrix();
-
-  glEnable(GL_BLEND);
-  glPushAttrib(GL_LIGHTING_BIT | GL_TRANSFORM_BIT);
-  glDisable(GL_LIGHTING);
-
-  backMat->select();
-  glBegin(GL_QUADS);
-  glColor3f(0.96, 0.84, 0.34);
-  glVertex2i(barX, barY);
-  glVertex2i(barX + val, barY);
-  glVertex2i(barX + val, barY + barHeight);
-  glVertex2i(barX, barY + barHeight);
-  glColor3f(1.0, 1.0, 1.0);
-  glEnd();
-
-  glBegin(GL_QUADS);
-  glColor3f(0.0, 0.0, 0.0);
-  glVertex2i(barX, barY);
-  glVertex2i(barX + barWidth, barY);
-  glVertex2i(barX + barWidth, barY + barHeight);
-  glVertex2i(barX, barY + barHeight);
-  glColor3f(1.0, 1.0, 1.0);
-  glEnd();
-
-  /* draw black border */
-  glBegin(GL_QUADS);
-  glColor3f(0.0, 0.0, 0.0);
-  glVertex2i(barX-1, barY-1);
-  glVertex2i(barX + barWidth +1, barY-1);
-  glVertex2i(barX + barWidth+1, barY + barHeight+1);
-  glVertex2i(barX - 1, barY + barHeight +1);
-  glColor3f(1.0, 1.0, 1.0);
-  glEnd();
-
-  /* draw white border */
-  glBegin(GL_QUADS);
-  glColor3f(1.0, 1.0, 1.0);
-  glVertex2i(barX-2, barY-2);
-  glVertex2i(barX + barWidth +2, barY-2);
-  glVertex2i(barX + barWidth+2, barY + barHeight+2);
-  glVertex2i(barX - 2, barY + barHeight +2);
-  glColor3f(1.0, 1.0, 1.0);
-  glEnd();
-
-  glEnable(GL_TEXTURE_2D);
-  glBegin(GL_QUADS);
-  glTexCoord2i(0, 0); glVertex2i(offsetX, offsetY);
-  glTexCoord2i(1, 0); glVertex2i(offsetX + imageWidth, offsetY);
-  glTexCoord2i(1, 1); glVertex2i(offsetX + imageWidth, offsetY + imageHeight);
-  glTexCoord2i(0, 1); glVertex2i(offsetX, offsetY + imageHeight);
-  glEnd();
-  glDisable(GL_TEXTURE_2D);
-
-  glDisable(GL_BLEND);
-  glPopMatrix();
-  glMatrixMode(GL_PROJECTION);
-  glPopMatrix();
-  glPopAttrib();
-
-  SDL_GL_SwapBuffers();                    
-}
- 
-
-/** 
-    \brief sets the background image name
-    \param file name of the backgroun-image
- */
-void GLMenuImageScreen::setBackImageName (char* backImageName)
-{}
-
-
-/**
-   \brief sets position of the ImageScreen
-   \param x offset from (0, 0)
-   \param y offset from (0, 0)
-*/
-void GLMenuImageScreen::setPosition(float offsetX, float offsetY)
-{}
-
-
-/*
-  \brief sets size of the ImageScreen
-  \param height of the ImageScreen
-  \param width of the Image Screen
-*/
-void GLMenuImageScreen::setSize(float height, float width)
-{}
-
-
-/**
-   \brief set the maximum of countable steps
-   \param maximum of steps
-*/
-void GLMenuImageScreen::setMaximum(int maxValue)
-{
-  this->maxValue = maxValue;
-}
-
-
-/**
-   \brief gets the maximum of countable steps
-*/
-int GLMenuImageScreen::getMaximum()
-{
-  return this->maxValue;
-}
-
-
-/**
-   \brief set current value
-   \param current value
-*/
-void GLMenuImageScreen::setValue(int currentValue)
-{
-  this->currentValue = currentValue;
-  this->draw();
-}
-
-
-/**
-   \brief get the current value
- */
-int GLMenuImageScreen::getValue()
-{
-  return this->currentValue;
-}
-
-
-/** 
-    \brief call this to trigger a progress event
-    
-    this has to redraw the progress bar and the whole image
- */
-void GLMenuImageScreen::step ()
-{
-  this->currentValue++;
-  this->draw();
-}
Index: xonox/branches/trackManager/src/glmenu_imagescreen.h
===================================================================
--- /orxonox/branches/trackManager/src/glmenu_imagescreen.h	(revision 3497)
+++ 	(revision )
@@ -1,52 +1,0 @@
-/*! 
-    \file glmenu_imagescreen
-    \brief class to display a image
-*/
-
-
-#ifndef _GLMENU_IMAGESCREEN_H
-#define _GLMENU_IMAGESCREEN_H
-
-#include "stdincl.h"
-class Texture;
-class Material;
-
-class GLMenuImageScreen : public BaseObject {
-
- private:
-  GLMenuImageScreen ();
-
- public:
-  ~GLMenuImageScreen ();
-
-  static GLMenuImageScreen* getInstance();
-
-  static GLMenuImageScreen* singletonRef;
-
-  void init ();
-  void init (char* backImageName, float height, float width, 
-	     float offsetX, float offsetY);
-
-  void draw ();
-  
-  void setBackImageName (char* backImageName);
-  void setPosition (float offsetX, float offsetY);
-  void setSize (float height, float width);
-  
-  void setMaximum (int maxValue);
-  int getMaximum ();
-  void setValue (int currentValue);
-  int getValue ();
-  void step ();
-
- private:
-  char* backImageName;       //!< the name of the file of the background image
-  float height, width;       //!< hight and width of the image
-  float offsetX, offsetY;    //!< offset of the image from left and up
-  Material* backMat;         //!< Background Material.
-  int currentValue;          //!< the current count of step() calls fired yet
-  int maxValue;              //!< total count of steps
-
-};
-
-#endif /* _GLMENU_IMAGESCREEN_H */
Index: xonox/branches/trackManager/src/helper_parent.cc
===================================================================
--- /orxonox/branches/trackManager/src/helper_parent.cc	(revision 3497)
+++ 	(revision )
@@ -1,42 +1,0 @@
-
-
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   ### File Specific:
-   main-programmer: Patrick Boenzli
-   co-programmer: ...
-*/
-
-
-#include "helper_parent.h"
-
-
-using namespace std;
-
-
-/**
-   \brief standard constructor
-
-   \todo this constructor is not jet implemented - do it
-*/
-HelperParent::HelperParent () 
-{
-   this->setClassName ("HelperParent");
-}
-
-
-/**
-   \brief standard deconstructor
-
-   \todo this deconstructor is not jet implemented - do it
-*/
-HelperParent::~HelperParent () {}
-
Index: xonox/branches/trackManager/src/helper_parent.h
===================================================================
--- /orxonox/branches/trackManager/src/helper_parent.h	(revision 3497)
+++ 	(revision )
@@ -1,24 +1,0 @@
-/*! 
-    \file helper_parent.h
-    \brief this is a parent class, that isn't visible in the real world itself
-*/
-
-
-#ifndef _HELPER_PARENT_H
-#define _HELPER_PARENT_H
-
-#include "stdincl.h"
-#include "p_node.h"
-
-
-
-class HelperParent : public PNode {
-
- public:
-  HelperParent ();
-  ~HelperParent ();
-
-
-};
-
-#endif /* _HELPER_PARENT_H */
Index: xonox/branches/trackManager/src/ini_parser.cc
===================================================================
--- /orxonox/branches/trackManager/src/ini_parser.cc	(revision 3497)
+++ 	(revision )
@@ -1,163 +1,0 @@
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   ### File Specific:
-   main-programmer: Christian Meyer
-   co-programmer: ...
-*/
-
-
-#include "ini_parser.h"
-
-using namespace std;
-
-/**
-	\brief constructs an IniParser using a file
-	\param filename: the path and name of the file to parse
-*/
-IniParser::IniParser (char* filename)
-{
-  stream = NULL;
-  bInSection = false;
-  openFile(filename);
-}
-
-/**
-	\brief removes the IniParser from memory
-*/
-IniParser::~IniParser ()
-{
-  if( stream != NULL) fclose (stream);
-}
-
-/**
-   \brief opens another file to parse
-   \param filename: path and name of the new file to parse
-   \return zero on success or -1 if an error occured;
-*/
-int IniParser::openFile( char* filename)
-{
-  if( filename == NULL) return -1;
-  if( stream != NULL)	fclose (stream);
-  if( (stream = fopen (filename, "r")) == NULL)
-    {
-      printf("IniParser could not open %s\n", filename);
-      return -1;
-    }
-  bInSection = false;
-  return 0;
-}
-
-/**
-   \brief set the parsing cursor to the specified section
-   \param section: the name of the section to set the cursor to
-   \return zero on success or -1 if the section could not be found
-*/
-int IniParser::getSection( char* section)
-{
-  bInSection = false;
-  if( stream == NULL) return -1;
-  
-  char linebuffer[PARSELINELENGHT];
-  char secbuffer[PARSELINELENGHT];
-  char* ptr;
-  
-  rewind (stream);
-  while( !feof( stream))
-    {
-      // get next line
-      fgets (linebuffer, PARSELINELENGHT, stream);
-      // remove newline char
-      if( (ptr = strchr( linebuffer, '\n')) != NULL) *ptr = 0;
-      // check for section identifyer
-      if( sscanf (linebuffer, "[%s", secbuffer) == 1)
-	{
-	  if( (ptr = strchr( secbuffer, ']')) != NULL)
-	    {
-	      *ptr = 0;
-	      if( !strcmp( secbuffer, section))
-		{
-		  bInSection = true;
-		  return 0;
-		}
-	    }
-	}
-    }
-  return -1;
-}
-
-/**
-   \brief gets the next VarName=VarValue pair from the parsing stream
-   \param name: a pointer to a buffer to store the name of the entry
-   \param value: a pointer to a buffer to store the value of the entry
-   \return zero if the buffers have been filled with data or -1 if there are no entries left in the current section
-*/
-int IniParser::nextVar( char* name, char* value)
-{
-  if( stream == NULL)
-    {
-      bInSection = false;
-      return -1;
-    }
-  if( !bInSection) return -1;
-  
-  char linebuffer[PARSELINELENGHT];
-  char* ptr;
-  
-  while( !feof( stream))
-    {
-      // get next line
-      fgets (linebuffer, PARSELINELENGHT, stream);
-      // remove newline char
-      if( (ptr = strchr( linebuffer, '\n')) != NULL) *ptr = 0;
-      if( linebuffer[0] == '[')
-	{
-	  bInSection = false;
-	  return -1;
-	}
-      if( (ptr = strchr( linebuffer, '=')) != NULL)
-	{
-	  if( ptr == linebuffer) continue;
-	  strcpy (value, &ptr[1]);
-	  strncpy (name, linebuffer, strlen (linebuffer) - strlen (value) - 1);
-	  return 0;
-	}
-    }
-  return -1;	
-}
-
-/**
-   \brief directly acesses an entry in a section
-   \param name: the name of the entry to find
-   \param section: the section where the entry is to be found
-   \param defvalue: what should be returned in case the entry cannot be found
-   \return a pointer to a buffer conatining the value of the specified entry. This buffer will contain the data specified in defvalue in case the entry wasn't found
-   
-   The returned pointer points to an internal buffer, so do not free it on your own. Do not give a NULL pointer to defvalue, this will certainly
-   lead to unwanted behaviour.
-*/
-char* IniParser::getVar( char* name, char* section, char* defvalue = "")
-{
-  strcpy (internbuf, defvalue);
-  if( getSection (section) == -1) return internbuf;
-  
-  char namebuf[PARSELINELENGHT];
-  char valuebuf[PARSELINELENGHT];
-  
-  while( nextVar (namebuf, valuebuf) != -1)
-    {
-      if( !strcmp (name, namebuf))
-	{
-	  strcpy (internbuf, valuebuf);
-	  return internbuf;
-	}
-    }
-  return internbuf;
-}
Index: xonox/branches/trackManager/src/ini_parser.h
===================================================================
--- /orxonox/branches/trackManager/src/ini_parser.h	(revision 3497)
+++ 	(revision )
@@ -1,37 +1,0 @@
-/*!
-    \file ini_parser.h
-    \brief A small ini file parser
-    
-    Can be used to find a defined [Section] in an ini file and get the VarName=Value entries
-*/
-
-#ifndef _INI_PARSER_H
-#define _INI_PARSER_H
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#define PARSELINELENGHT 512
-
-//! ini-file parser
-/**
-	This class can be used to load an initializer file and parse it's contents for variablename=value pairs.
-*/
-class IniParser {
- private:
-	FILE* stream;
-	bool bInSection;
-	char internbuf[PARSELINELENGHT];
-	
- public:
-  IniParser (char* filename);
-  ~IniParser ();
-  
-  char* getVar( char* name, char* section, char* defvalue);
-	int openFile( char* name);
-  int getSection( char* section);
-  int nextVar( char* name, char* value);
-};
-
-#endif /* _INI_PARSER_H */
Index: /orxonox/branches/trackManager/src/lib/Makefile.am
===================================================================
--- /orxonox/branches/trackManager/src/lib/Makefile.am	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/Makefile.am	(revision 3498)
@@ -0,0 +1,9 @@
+### GTK_RELATED
+if HAVE_GTK2
+  GTK_PROGS = gui
+else
+  GTK_PROGS =
+endif
+
+SUBDIRS = graphics \
+	  $(GTK_PROGS)
Index: /orxonox/branches/trackManager/src/lib/Makefile.in
===================================================================
--- /orxonox/branches/trackManager/src/lib/Makefile.in	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/Makefile.in	(revision 3498)
@@ -0,0 +1,456 @@
+# Makefile.in generated by automake 1.8.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_triplet = @host@
+subdir = src/lib
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+	html-recursive info-recursive install-data-recursive \
+	install-exec-recursive install-info-recursive \
+	install-recursive installcheck-recursive installdirs-recursive \
+	pdf-recursive ps-recursive uninstall-info-recursive \
+	uninstall-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = graphics gui
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CURL_CFLAGS = @CURL_CFLAGS@
+CURL_LIBS = @CURL_LIBS@
+CXX = @CXX@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEBUG = @DEBUG@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DOXYGEN = @DOXYGEN@
+DOXYGEN_FALSE = @DOXYGEN_FALSE@
+DOXYGEN_TRUE = @DOXYGEN_TRUE@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GTHREAD_CFLAGS = @GTHREAD_CFLAGS@
+GTHREAD_LIBS = @GTHREAD_LIBS@
+GTK2_CFLAGS = @GTK2_CFLAGS@
+GTK2_LIBS = @GTK2_LIBS@
+HAVE_CURL_FALSE = @HAVE_CURL_FALSE@
+HAVE_CURL_TRUE = @HAVE_CURL_TRUE@
+HAVE_GTHREAD_FALSE = @HAVE_GTHREAD_FALSE@
+HAVE_GTHREAD_TRUE = @HAVE_GTHREAD_TRUE@
+HAVE_GTK2_FALSE = @HAVE_GTK2_FALSE@
+HAVE_GTK2_TRUE = @HAVE_GTK2_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MSBITFIELDS = @MSBITFIELDS@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SUB_PROJECTS_FALSE = @SUB_PROJECTS_FALSE@
+SUB_PROJECTS_TRUE = @SUB_PROJECTS_TRUE@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+@HAVE_GTK2_FALSE@GTK_PROGS = 
+
+### GTK_RELATED
+@HAVE_GTK2_TRUE@GTK_PROGS = gui
+SUBDIRS = graphics \
+	  $(GTK_PROGS)
+
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  src/lib/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  src/lib/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+uninstall-info-am:
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+	@set fnord $$MAKEFLAGS; amf=$$2; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	   || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+	@set fnord $$MAKEFLAGS; amf=$$2; \
+	dot_seen=no; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	rev=''; for subdir in $$list; do \
+	  if test "$$subdir" = "."; then :; else \
+	    rev="$$subdir $$rev"; \
+	  fi; \
+	done; \
+	rev="$$rev ."; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	   || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+ctags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d "$(distdir)/$$subdir" \
+	    || mkdir "$(distdir)/$$subdir" \
+	    || exit 1; \
+	    (cd $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="../$(top_distdir)" \
+	        distdir="../$(distdir)/$$subdir" \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-recursive
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \
+	clean clean-generic clean-recursive ctags ctags-recursive \
+	distclean distclean-generic distclean-recursive distclean-tags \
+	distdir dvi dvi-am html html-am info info-am install \
+	install-am install-data install-data-am install-exec \
+	install-exec-am install-info install-info-am install-man \
+	install-strip installcheck installcheck-am installdirs \
+	installdirs-am maintainer-clean maintainer-clean-generic \
+	maintainer-clean-recursive mostlyclean mostlyclean-generic \
+	mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \
+	uninstall uninstall-am uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
Index: /orxonox/branches/trackManager/src/lib/coord/helper_parent.cc
===================================================================
--- /orxonox/branches/trackManager/src/lib/coord/helper_parent.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/coord/helper_parent.cc	(revision 3498)
@@ -0,0 +1,42 @@
+
+
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: Patrick Boenzli
+   co-programmer: ...
+*/
+
+
+#include "helper_parent.h"
+
+
+using namespace std;
+
+
+/**
+   \brief standard constructor
+
+   \todo this constructor is not jet implemented - do it
+*/
+HelperParent::HelperParent () 
+{
+   this->setClassName ("HelperParent");
+}
+
+
+/**
+   \brief standard deconstructor
+
+   \todo this deconstructor is not jet implemented - do it
+*/
+HelperParent::~HelperParent () {}
+
Index: /orxonox/branches/trackManager/src/lib/coord/helper_parent.h
===================================================================
--- /orxonox/branches/trackManager/src/lib/coord/helper_parent.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/coord/helper_parent.h	(revision 3498)
@@ -0,0 +1,24 @@
+/*! 
+    \file helper_parent.h
+    \brief this is a parent class, that isn't visible in the real world itself
+*/
+
+
+#ifndef _HELPER_PARENT_H
+#define _HELPER_PARENT_H
+
+#include "stdincl.h"
+#include "p_node.h"
+
+
+
+class HelperParent : public PNode {
+
+ public:
+  HelperParent ();
+  ~HelperParent ();
+
+
+};
+
+#endif /* _HELPER_PARENT_H */
Index: /orxonox/branches/trackManager/src/lib/coord/null_parent.cc
===================================================================
--- /orxonox/branches/trackManager/src/lib/coord/null_parent.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/coord/null_parent.cc	(revision 3498)
@@ -0,0 +1,96 @@
+
+
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: Patrick Boenzli
+   co-programmer: ...
+*/
+
+
+#include "null_parent.h"
+
+
+using namespace std;
+
+NullParent* NullParent::singletonRef = 0;
+
+NullParent* NullParent::getInstance ()
+{
+  if( singletonRef == NULL)
+    singletonRef = new NullParent ();
+  return singletonRef;
+}
+
+/**
+   \brief standard constructor
+
+   \todo this constructor is not jet implemented - do it
+*/
+NullParent::NullParent () 
+{
+  this->parent = this;
+  this->mode = ALL;
+}
+
+
+NullParent::NullParent (Vector* absCoordinate)
+{
+  this->parent = this;
+  this->mode = ALL;
+  this->absCoordinate = *absCoordinate;
+}
+
+
+/**
+   \brief standard deconstructor
+
+   \todo this deconstructor is not jet implemented - do it
+*/
+NullParent::~NullParent () 
+{
+  delete singletonRef;
+  singletonRef = NULL;
+}
+
+
+
+
+/**
+   \brief updates the absCoordinate/absDirection
+
+   this is used to go through the parent-tree to update all the absolute coordinates
+   and directions. this update should be done by the engine, so you don't have to 
+   worry, normaly...
+*/
+void NullParent::update (float timeStamp)
+{
+  this->absCoordinate = this->relCoordinate;
+  this->absDirection = parent->getAbsDir () * this->relDirection;
+  
+  PNode* pn = this->children->enumerate ();
+  while( pn != NULL) 
+    { 
+      /* if this node has changed, make sure, that all children are updated also */
+      if( this->bRelCoorChanged || this->bAbsCoorChanged)
+	pn->parentCoorChanged ();
+      if( this->bRelDirChanged || this->bAbsDirChanged)
+	pn->parentDirChanged ();
+      pn->update (timeStamp);
+      pn = this->children->nextElement ();
+    }
+
+  this->timeStamp = timeStamp;
+  this->bRelCoorChanged = false;
+  this->bAbsCoorChanged = false;
+  this->bRelDirChanged = false;
+  this->bAbsDirChanged = false;
+}
Index: /orxonox/branches/trackManager/src/lib/coord/null_parent.h
===================================================================
--- /orxonox/branches/trackManager/src/lib/coord/null_parent.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/coord/null_parent.h	(revision 3498)
@@ -0,0 +1,30 @@
+/*! 
+    \file proto_class.h
+    \brief Definition of the proto class template, used quickly start work
+*/
+
+
+#ifndef _NULL_PARENT_H
+#define _NULL_PARENT_H
+
+#include "stdincl.h"
+#include "p_node.h"
+
+
+class NullParent : public PNode {
+
+ public:
+  static NullParent* getInstance ();
+  ~NullParent ();
+  
+  static NullParent* singletonRef;
+
+  virtual void update (float timeStamp);
+
+ private:
+  NullParent ();
+  NullParent (Vector* absCoordinate);
+
+};
+
+#endif /* _NULL_PARENT_H */
Index: /orxonox/branches/trackManager/src/lib/coord/p_node.cc
===================================================================
--- /orxonox/branches/trackManager/src/lib/coord/p_node.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/coord/p_node.cc	(revision 3498)
@@ -0,0 +1,458 @@
+
+
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: Patrick Boenzli
+   co-programmer: ...
+
+   \todo Null-Parent => center of the coord system - singleton
+   \todo Smooth-Parent: delay, speed
+   \todo destroy the stuff again, delete...
+*/
+
+
+#include "p_node.h"
+
+
+using namespace std;
+
+
+/**
+   \brief standard constructor
+
+   \todo this constructor is not jet implemented - do it
+*/
+PNode::PNode () 
+{
+  this->children = new tList<PNode>();
+  this->bRelCoorChanged = true;
+  this->bAbsCoorChanged = false;
+  this->bRelDirChanged = true;
+  this->bAbsDirChanged = false;
+  this->parent = NULL;
+}
+
+
+/**
+   \brief constructor with coodinates
+   \param absCoordinate the Absolute coordinate of the Object
+   \param parent The parent-node of this node.
+*/
+PNode::PNode (Vector* absCoordinate, PNode* parent )
+{
+  this->absCoordinate = *absCoordinate;
+  this->relCoordinate = this->absCoordinate - parent->getAbsCoor ();
+  
+  this->children = new tList<PNode>();
+  this->bRelCoorChanged = true;
+  this->bAbsCoorChanged = false;
+  this->bRelDirChanged = true;
+  this->bAbsDirChanged = false;
+  this->parent = parent;
+
+  parent->addChild (this);
+}
+
+
+/**
+   \brief standard deconstructor
+
+   \todo this deconstructor is not jet implemented - do it
+*/
+PNode::~PNode () 
+{
+  /*
+  delete &this->children;
+  delete &this->relCoordinate;
+  delete &this->absCoordinate;
+  delete &this->relDirection;
+  delete &this->absDirection;
+  */
+  this->parent = NULL;
+  /* there is currently a problem with cleaning up - fix*/
+}
+
+
+/**
+   \brief deletes the hole pnode tree
+
+   cleans up all pnodes
+*/
+void PNode::destroy ()
+{
+  PNode* pn = this->children->enumerate();
+  while( pn != NULL) 
+    { 
+      pn->destroy ();
+      pn = this->children->nextElement();
+    } 
+  this->children->destroy ();
+}
+
+
+/**
+   \brief get relative coordinates
+   \returns relative coordinates to its parent
+*/
+Vector PNode::getRelCoor ()
+{
+  Vector r = this->relCoordinate; /* return a copy, so it can't be modified */
+  return r;
+}
+
+
+/**
+   \brief set relative coordinates
+   \param relCoord relative coordinates to its parent
+
+   it is very importand, that you use this function, if you want to update the
+   relCoordinates. If you don't use this, the PNode won't recognize, that something
+   has changed and won't update the children Nodes.
+*/
+void PNode::setRelCoor (Vector* relCoord)
+{
+  this->bRelCoorChanged = true;
+  this->relCoordinate = *relCoord;
+}
+
+
+/**
+   \brief get absolute coordinates
+   \returns absolute coordinates from (0,0,0)
+*/
+Vector PNode::getAbsCoor ()
+{
+  return this->absCoordinate;
+}
+
+
+/**
+   \param absCoord set absolute coordinate
+
+   it is very importand, that you use this function, if you want to update the
+   absCoordinates. If you don't use this, the PNode won't recognize, that something
+   has changed and won't update the children Nodes.
+*/
+void PNode::setAbsCoor (Vector* absCoord)
+{
+  this->bAbsCoorChanged = true;
+  this->absCoordinate = *absCoord;
+}
+
+
+/**
+   \brief shift coordinate (abs and rel)
+   \param shift vector
+
+   this function shifts the current coordinates about the vector shift. this is
+   usefull because from some place else you can:
+   PNode* someNode = ...;
+   Vector objectMovement = calculateShift();
+   someNode->shiftCoor(objectMovement);
+
+   elsewhere you would have to:
+   PNode* someNode = ...;
+   Vector objectMovement = calculateShift();
+   Vector currentCoor = someNode->getRelCoor();
+   Vector newCoor = currentCoor + objectMovement;
+   someNode->setRelCoor(newCoor);
+   
+   yea right... shorter...
+
+*/
+void PNode::shiftCoor (Vector* shift)
+{
+  if( this->bAbsCoorChanged)
+    {
+      this->absCoordinate = this->absCoordinate + *shift;
+    }
+  else 
+    {
+      this->relCoordinate = this->relCoordinate + *shift;
+      this->bRelCoorChanged = true;
+    }
+}
+
+
+
+/**
+   \brief get relative direction
+   \returns relative direction to its parent
+*/
+Quaternion PNode::getRelDir ()
+{
+  return this->relDirection;
+}
+
+
+/**
+   \brief set relative direction
+   \param relDir to its parent
+
+   it is very importand, that you use this function, if you want to update the
+   relDirection. If you don't use this, the PNode won't recognize, that something
+   has changed and won't update the children Nodes.
+*/
+void PNode::setRelDir (Quaternion* relDir)
+{
+  this->bRelCoorChanged = true;
+  this->relDirection = *relDir;
+}
+
+
+/**
+   \brief gets the absolute direction (0,0,1)
+   \returns absolute coordinates
+*/
+Quaternion PNode::getAbsDir ()
+{
+  return this->absDirection;
+}
+
+
+/**
+   \brief sets the absolute direction (0,0,1)
+   \param absDir absolute coordinates
+
+   it is very importand, that you use this function, if you want to update the
+   absDirection. If you don't use this, the PNode won't recognize, that something
+   has changed and won't update the children Nodes.
+*/
+void PNode::setAbsDir (Quaternion* absDir)
+{
+  this->bAbsDirChanged = true;
+  this->absDirection = *absDir;
+}
+
+
+/**
+   \brief shift coordinate (abs and rel)
+   \param shift vector
+
+   this function shifts the current coordinates about the vector shift. this is
+   usefull because from some place else you can:
+   PNode* someNode = ...;
+   Quaternion objectMovement = calculateShift();
+   someNode->shiftCoor(objectMovement);
+
+   elsewhere you would have to:
+   PNode* someNode = ...;
+   Quaternion objectMovement = calculateShift();
+   Quaternion currentCoor = someNode->getRelCoor();
+   Quaternion newCoor = currentCoor + objectMovement;
+   someNode->setRelCoor(newCoor);
+   
+   yea right... shorter...
+
+   \todo implement this
+*/
+void PNode::shiftDir (Quaternion* shift)
+{}
+
+
+
+/**
+   \brief adds a child and makes this node to a parent
+   \param pNode child reference
+
+   use this to add a child to this node.
+*/
+void PNode::addChild (PNode* pNode)
+{
+  this->addChild(pNode, DEFAULT_MODE);
+}
+
+
+/**
+   \brief adds a child and makes this node to a parent
+   \param pNode child reference
+   \param mode on which changes the child should also change ist state
+
+   use this to add a child to this node.
+*/
+void PNode::addChild (PNode* pNode, parentingMode mode)
+{
+  pNode->mode = mode;
+  pNode->parent = this;
+  this->children->add (pNode);
+}
+
+
+/**
+   \brief removes a child from the node
+   \param pNode the child to remove from this pNode.
+*/
+void PNode::removeChild (PNode* pNode)
+{
+  this->children->remove (pNode);
+}
+
+
+/**
+   \brief sets the parent of this PNode
+   \param parent the Parent to set
+*/
+void PNode::setParent (PNode* parent)
+{
+  this->parent = parent;
+}
+
+/**
+   \brief set the mode of this parent manualy
+   \param mode the mode of the bind-type.
+*/
+void PNode::setMode (parentingMode mode)
+{
+  this->mode = mode;
+}
+
+/**
+   \brief has to be called, if the parent coordinate has changed
+   
+   normaly this will be done by the parent itself automaticaly. If you call this, you
+   will force an update of the coordinated of the node.
+*/
+void PNode::parentCoorChanged ()
+{
+  this->bRelCoorChanged = true;
+}
+
+
+/**
+   \brief has to be called, if the parent direction has changed
+   
+   normaly this will be done by the parent itself automaticaly. If you call this, you
+   will force an update of the direction of the node.
+*/
+void PNode::parentDirChanged ()
+{
+  this->bRelDirChanged = true;
+}
+
+
+/**
+   \brief updates the absCoordinate/absDirection
+   \param timeStamp The timestanp used for to look if calculations should be done
+
+   this is used to go through the parent-tree to update all the absolute coordinates
+   and directions. this update should be done by the engine, so you don't have to 
+   worry, normaly...
+*/
+void PNode::update (float timeStamp)
+{
+  printf ("PNode::update - %s - (%f, %f, %f)\n", this->objectName, this->absCoordinate.x, this->absCoordinate.y, this->absCoordinate.z);
+
+      if( this->mode == MOVEMENT || this->mode == ALL)
+	{
+	  if( this->bAbsCoorChanged /*&& this->timeStamp != DataTank::timeStamp*/)
+	    {
+	      printf("PNode::update () - this->bAbsCoorChanged = true\n");
+	      /* if you have set the absolute coordinates this overrides all other changes */
+	      this->relCoordinate = this->absCoordinate - parent->getAbsCoor ();
+	    }
+	  else if( this->bRelCoorChanged /*&& this->timeStamp != DataTank::timeStamp*/)
+	    {
+	      /*this is bad style... must be deleted later - just for testing*/
+	      if( this->parent == NULL)
+		{
+		this->absCoordinate = this->relCoordinate;
+		}
+	      else
+		this->absCoordinate = parent->getAbsCoor () + this->relCoordinate;	      /* update the current absCoordinate */
+	    }
+	}
+      
+      if( this->mode == ROTATION && this->mode == ALL)
+	{
+	  if( this->bAbsDirChanged /*&& this->timeStamp != DataTank::timeStamp*/)
+	    {
+	      /* if you have set the absolute coordinates this overrides all other changes */
+	      this->relDirection = this->absDirection - parent->getAbsDir ();
+	    }
+	  else if( this->bRelDirChanged /*&& this->timeStamp != DataTank::timeStamp*/)
+	    {
+	      /* update the current absDirection - remember * means rotation around sth.*/
+	      this->absDirection = parent->getAbsDir () * this->relDirection;
+	    }
+	}    
+      // }
+  PNode* pn = this->children->enumerate();
+  while( pn != NULL) 
+    { 
+      /* if this node has changed, make sure, that all children are updated also */
+      if( this->bRelCoorChanged || this->bAbsCoorChanged)
+	pn->parentCoorChanged ();
+      if( this->bRelDirChanged || this->bAbsDirChanged)
+	pn->parentDirChanged ();
+      pn->update(timeStamp);
+      pn = this->children->nextElement();
+    }
+
+  this->timeStamp = timeStamp;
+  this->bRelCoorChanged = false;
+  this->bAbsCoorChanged = false;
+  this->bRelDirChanged = false;
+  this->bAbsDirChanged = false;
+}
+
+
+/**
+  \brief tick
+  \param dt time to tick
+*/
+void PNode::processTick (float dt)
+{
+  this->tick (dt);
+  PNode* pn = this->children->enumerate();
+  while( pn != NULL) 
+    { 
+      pn->processTick (dt);
+      pn = this->children->nextElement();
+    } 
+}
+
+/**
+   \param dt time to tick
+*/
+void PNode::tick (float dt)
+{}
+
+/**
+   \brief displays some information about this pNode
+*/
+void PNode::debug()
+{
+  printf("PNode::debug() - absCoord: (%f, %f, %f)\n", 
+	 this->absCoordinate.x, 
+	 this->absCoordinate.y,
+	 this->absCoordinate.z);
+}
+
+
+/**
+  \brief set the name of the node
+
+  for debug purposes realy usefull, not used to work properly
+*/
+void PNode::setName (char* newName)
+{
+  this->objectName = newName;
+}
+
+
+/**
+  \brief gets the name of the node
+*/
+char* PNode::getName ()
+{
+  return this->objectName;
+}
Index: /orxonox/branches/trackManager/src/lib/coord/p_node.h
===================================================================
--- /orxonox/branches/trackManager/src/lib/coord/p_node.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/coord/p_node.h	(revision 3498)
@@ -0,0 +1,95 @@
+/*! 
+    \file p_node.h
+    \brief Definition of a parenting node
+
+    parenting is how coordinates are handled in orxonox, meaning, that all coordinates
+    are representet relative to another parent node. this nodes build a parenting
+    tree of one-sided references (from up to down referenced).
+    Every node manages itself a list of childrens (of whos it is parent - easy...)
+
+    absCoordinate, absDirection have to be recalculated as soon as there was a change in
+    place or ortientation. this is only the case if 
+    o bDirChanged is true (so changed) AND timeStamp != now
+    o bCoorChanged is true (so moved) AND timeStamp != now
+    this conditions make it cheaper to recalculate the tree (reduces redundant work).
+
+    remember: if you have to change the coordinates or the directions, use the functions
+    that are defined to execute this operation - otherwhise there will be big problems...
+*/
+
+
+#ifndef _P_NODE_H
+#define _P_NODE_H
+
+#include "stdincl.h"
+
+class PNode; /* forward decleration, so that parentEntry has access to PNode */
+
+//! enumeration for the different translation-binding-types
+typedef enum parentingMode {MOVEMENT = 0, ROTATION, ALL};
+//! The default mode of the translation-binding.
+#define DEFAULT_MODE ALL
+
+//! Patent Node is a Engine to calculate the position of an Object in respect to the position of its parent.
+class PNode : public BaseObject {
+
+ public:
+  PNode ();
+  PNode (Vector* absCoordinate, PNode* pNode);
+  virtual ~PNode ();
+
+  void destroy ();
+
+  PNode* parent;            //!< a pointer to the parent node
+  tList<PNode>* children;   //!< list of the children
+
+  parentingMode mode;       //!< the mode of the binding
+
+  Vector getRelCoor ();
+  void setRelCoor (Vector* relCoord);
+  //void setRelCoor (Vector relCoord);
+  Vector getAbsCoor ();
+  void setAbsCoor (Vector* absCoord);
+  //void setAbsCoor (Vector absCoord);
+  void shiftCoor (Vector* shift);
+  //void shiftCoor (Vector shift);
+
+  Quaternion getRelDir ();
+  void setRelDir (Quaternion* relDir);
+  Quaternion getAbsDir ();
+  void setAbsDir (Quaternion* absDir);
+  void shiftDir (Quaternion* shift);
+
+  void addChild (PNode* pNode);
+  void addChild (PNode* pNode, parentingMode mode);
+  void removeChild (PNode* pNode);
+  void setParent (PNode* parent);
+  void parentCoorChanged ();
+  void parentDirChanged ();
+  void setMode (parentingMode mode);
+
+  virtual void update (float timeStamp);
+  void processTick (float dt);
+  virtual void tick (float dt);
+
+  void setName (char* newName);
+  char* getName ();
+
+
+  void debug ();
+
+  float timeStamp;         //!< this the timeStamp of when the abs{Coordinat, Direction} has been calculated
+  char* objectName;        //!< The name of the Object
+  bool bAbsCoorChanged;    //!< If Absolute Coordinate has changed since last time we checked
+  bool bRelCoorChanged;    //!< If Relative Coordinate has changed since last time we checked
+  bool bAbsDirChanged;     //!< If Absolute Direction has changed since last time we checked
+  bool bRelDirChanged;     //!< If Relative Direction has changed since last time we checked
+
+  Vector relCoordinate;    //!< coordinates relative to the parent
+  Vector absCoordinate;    //!< absolute coordinates in the world ( from (0,0,0) )
+  Quaternion relDirection; //!< direction relative to the parent
+  Quaternion absDirection; //!< absolute direvtion in the world ( from (0,0,1) )
+
+};
+
+#endif /* _P_NODE_H */
Index: /orxonox/branches/trackManager/src/lib/data/data_tank.cc
===================================================================
--- /orxonox/branches/trackManager/src/lib/data/data_tank.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/data/data_tank.cc	(revision 3498)
@@ -0,0 +1,26 @@
+
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   Copyright by: Patrick Boenzli
+   Fixes by:
+*/
+
+
+#include "data_tank.h"
+
+using namespace std;
+
+long DataTank::timeStamp = 0;
+
+DataTank::DataTank () {}
+DataTank::~DataTank () {}
+
+
Index: /orxonox/branches/trackManager/src/lib/data/data_tank.h
===================================================================
--- /orxonox/branches/trackManager/src/lib/data/data_tank.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/data/data_tank.h	(revision 3498)
@@ -0,0 +1,16 @@
+
+#ifndef _DATA_TANK_H
+#define _DATA_TANK_H
+
+
+class DataTank {
+
+ public:
+  DataTank ();
+  ~DataTank ();
+
+  static long timeStamp;
+
+};
+
+#endif /* _DATA_TANK_H */
Index: /orxonox/branches/trackManager/src/lib/graphics/Makefile.am
===================================================================
--- /orxonox/branches/trackManager/src/lib/graphics/Makefile.am	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/graphics/Makefile.am	(revision 3498)
@@ -0,0 +1,1 @@
+SUBDIRS = importer
Index: /orxonox/branches/trackManager/src/lib/graphics/Makefile.in
===================================================================
--- /orxonox/branches/trackManager/src/lib/graphics/Makefile.in	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/graphics/Makefile.in	(revision 3498)
@@ -0,0 +1,450 @@
+# Makefile.in generated by automake 1.8.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_triplet = @host@
+subdir = src/lib/graphics
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+	html-recursive info-recursive install-data-recursive \
+	install-exec-recursive install-info-recursive \
+	install-recursive installcheck-recursive installdirs-recursive \
+	pdf-recursive ps-recursive uninstall-info-recursive \
+	uninstall-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CURL_CFLAGS = @CURL_CFLAGS@
+CURL_LIBS = @CURL_LIBS@
+CXX = @CXX@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEBUG = @DEBUG@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DOXYGEN = @DOXYGEN@
+DOXYGEN_FALSE = @DOXYGEN_FALSE@
+DOXYGEN_TRUE = @DOXYGEN_TRUE@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GTHREAD_CFLAGS = @GTHREAD_CFLAGS@
+GTHREAD_LIBS = @GTHREAD_LIBS@
+GTK2_CFLAGS = @GTK2_CFLAGS@
+GTK2_LIBS = @GTK2_LIBS@
+HAVE_CURL_FALSE = @HAVE_CURL_FALSE@
+HAVE_CURL_TRUE = @HAVE_CURL_TRUE@
+HAVE_GTHREAD_FALSE = @HAVE_GTHREAD_FALSE@
+HAVE_GTHREAD_TRUE = @HAVE_GTHREAD_TRUE@
+HAVE_GTK2_FALSE = @HAVE_GTK2_FALSE@
+HAVE_GTK2_TRUE = @HAVE_GTK2_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MSBITFIELDS = @MSBITFIELDS@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SUB_PROJECTS_FALSE = @SUB_PROJECTS_FALSE@
+SUB_PROJECTS_TRUE = @SUB_PROJECTS_TRUE@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+SUBDIRS = importer
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  src/lib/graphics/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  src/lib/graphics/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+uninstall-info-am:
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+	@set fnord $$MAKEFLAGS; amf=$$2; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	   || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+	@set fnord $$MAKEFLAGS; amf=$$2; \
+	dot_seen=no; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	rev=''; for subdir in $$list; do \
+	  if test "$$subdir" = "."; then :; else \
+	    rev="$$subdir $$rev"; \
+	  fi; \
+	done; \
+	rev="$$rev ."; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	   || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+ctags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d "$(distdir)/$$subdir" \
+	    || mkdir "$(distdir)/$$subdir" \
+	    || exit 1; \
+	    (cd $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="../$(top_distdir)" \
+	        distdir="../$(distdir)/$$subdir" \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-recursive
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \
+	clean clean-generic clean-recursive ctags ctags-recursive \
+	distclean distclean-generic distclean-recursive distclean-tags \
+	distdir dvi dvi-am html html-am info info-am install \
+	install-am install-data install-data-am install-exec \
+	install-exec-am install-info install-info-am install-man \
+	install-strip installcheck installcheck-am installdirs \
+	installdirs-am maintainer-clean maintainer-clean-generic \
+	maintainer-clean-recursive mostlyclean mostlyclean-generic \
+	mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \
+	uninstall uninstall-am uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
Index: /orxonox/branches/trackManager/src/lib/graphics/font/font.cc
===================================================================
--- /orxonox/branches/trackManager/src/lib/graphics/font/font.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/graphics/font/font.cc	(revision 3498)
@@ -0,0 +1,59 @@
+/*
+Copyright (C) 2004 Lion Vollnhals
+Copyright (C) 2003 Matthias Braun
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+#ifndef __LIB_2D_FONT_HPP__
+#define __LIB_2D_FONT_HPP__
+
+#include <string>
+#include <stdexcept>
+#include "SFont.h"
+
+/** A thin c++ wrapper around my custom SFont version */
+class SFont
+{
+public:
+	int getHeight() const
+	{ return SFont_TextHeight(font); }
+
+	int getTextWidth(const char* text) const
+	{ return SFont_TextWidth(font, text); }
+	int getTextWidth(const std::string& text) const
+	{ return getTextWidth(text.c_str()); }
+
+	void write(SDL_Surface* surface, const char* text, int x, int y) const
+	{ SFont_Write(surface, font, x, y, text); }
+	
+	void write(SDL_Surface* surface, const std::string& text, int x, int y) const
+	{ Write(surface, text.c_str(), x, y); }
+
+	Font(SDL_Surface* surface)
+	{
+		font = SFont_InitFont(surface);
+		if(!font)
+			throw std::runtime_error("Couldn't initialize font.");
+	}
+	~Font()
+	{ SFont_FreeFont(font); }
+	
+private:
+	SFont_Font* font;
+};
+
+#endif
+
+
Index: /orxonox/branches/trackManager/src/lib/graphics/font/fontset.cc
===================================================================
--- /orxonox/branches/trackManager/src/lib/graphics/font/fontset.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/graphics/font/fontset.cc	(revision 3498)
@@ -0,0 +1,226 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+   co-programmer: ...
+
+   ***
+   * This file is extended to the needs of the orxonox-project.         *
+   * The main difference to the version of Marius is, that textures get *
+   * loaded by orxonox Texture-class, and that the comments are set up, *
+   * in doxygen style                                                   *
+   * the Copyright of the original file is below this copyright, and we *
+   * hope not to offend Marius through this.                            *
+                                                                      ***
+
+*/
+
+/***************************************************************************
+                          cone3dfont.cpp  -  description
+                             -------------------
+    copyright            : (C) 2001 by Marius Andra aka Cone3D
+    email                : marius@hot.ee
+    ICQ                  : 43999510
+ ***************************************************************************/
+
+/***************************************************************************
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ ***************************************************************************/
+
+
+#include "fontset.h"
+#include <stdarg.h>
+
+#include "../importer/texture.h"
+
+/** 
+    \brief initializes a new fontset
+*/
+FontSet::FontSet()
+{
+  this->sizex=1.0f;
+  this->sizey=1.0f;
+  this->font = NULL;
+}
+
+/** 
+    \brief initializes a new fontset with a texture for the font
+    \param fontFile The fontfile to load
+*/
+FontSet::FontSet(char* fontFile)
+{
+  this->sizex=1.0f;
+  this->sizey=1.0f;
+  this->font = NULL;
+  
+}
+
+/**
+   \brief deletes the Fontset by freeing all allocated space
+   and then deleting the Texture.
+*/
+FontSet::~FontSet()
+{
+  killFont();
+  // delete the texture;
+  delete font;
+}
+
+/**
+   \brief sets the size of the font
+   \param x the width of the font
+   \param y the height of the font
+*/
+int FontSet::setSize(float x, float y)
+{
+  sizex=x;
+  sizey=y;
+  
+  return 1;
+}
+
+/**
+   \brief builds the fontset
+   \param file the name of the file to get the fontset from.
+*/
+int FontSet::buildFont(char *file)
+{
+  int loop1;
+  float cx, cy;
+  
+  if (!font)
+    delete font;
+  font = new Texture();
+  font->loadImage(file);
+  
+  base=glGenLists(256);                          // Creating 256 Display Lists
+  glBindTexture(GL_TEXTURE_2D, font->getTexture()); // Select Our Font Texture
+  for (loop1=0; loop1<256; loop1++)              // Loop Through All 256 Lists
+    {
+      cx=(float)(loop1%16)/16.0f;                  // X Position Of Current Character
+      cy=(float)(loop1/16)/16.0f;                  // Y Position Of Current Character
+      
+      glNewList(base+loop1,GL_COMPILE);            // Start Building A List
+      glBegin(GL_QUADS);                           // Use A Quad For Each Character
+      glTexCoord2f(cx,1.0f-cy-0.0625f);          // Texture Coord (Bottom Left)
+      glVertex2d(0,16);                          // Vertex Coord (Bottom Left)
+      glTexCoord2f(cx+0.0625f,1.0f-cy-0.0625f);  // Texture Coord (Bottom Right)
+      glVertex2i(16,16);                         // Vertex Coord (Bottom Right)
+      glTexCoord2f(cx+0.0625f,1.0f-cy-0.001f);   // Texture Coord (Top Right)
+      glVertex2i(16,0);                          // Vertex Coord (Top Right)
+      glTexCoord2f(cx,1.0f-cy-0.001f);           // Texture Coord (Top Left)
+      glVertex2i(0,0);                           // Vertex Coord (Top Left)
+      glEnd();                                     // Done Building Our Quad (Character)
+      glTranslated(12,0,0);                        // Move To The Right Of The Character
+      glEndList();                                 // Done Building The Display List
+    }                                              // Loop Until All 256 Are Built
+  return 1;
+}
+
+/**
+   \brief deletes the display lists.
+*/
+int FontSet::killFont(void)                          // Delete The Font From Memory
+{
+  glDeleteLists(base,256);                       // Delete All 256 Display Lists
+  return 1;
+}
+
+/**
+   \brief prints out some text
+   \param x most left coordinate of the text.
+   \param y the top coordinate of the text
+   \param type Type of text
+   \param fmt The text to display
+   \param ... more text
+*/
+int FontSet::printText(int x, int y, char type, char *fmt,...)// Where The Printing Happens
+{
+  char    text[1024];                            // Holds Our String
+  int blendOn,scissorOn,textureOn,lightOn;  // Holds the previous GL settings
+  int depthOn,matrixMode,screenStats[4],blendSrc,blendDst;
+  char typ=type;
+
+  va_list ap;                                    // Pointer To List Of Arguments
+
+  if (fmt == NULL)                               // If There's No Text
+    return 1;                                      // Do Nothing
+  
+  va_start(ap, fmt);                             // Parses The String For Variables
+  vsprintf(text, fmt, ap);                       // And Converts Symbols To Actual Numbers
+  va_end(ap);                                    // Results Are Stored In Text
+  
+  if (type>3)                                     // Did User Choose An Invalid Character Set?
+    type=3;                                       // If So, Select Set 2 (Italic)
+  
+  textureOn = glIsEnabled(GL_TEXTURE_2D); // Were textures enabled?
+  depthOn = glIsEnabled(GL_DEPTH_TEST);  // Was GL_DEPTH_TEST enabled?
+  lightOn = glIsEnabled(GL_LIGHTING); // Was GL_LIGHTING enabled?
+  scissorOn = glIsEnabled(GL_SCISSOR_TEST);  // etc.
+  glGetIntegerv(GL_MATRIX_MODE, &matrixMode);
+  glGetIntegerv(GL_VIEWPORT, screenStats);
+  blendOn= glIsEnabled(GL_BLEND);
+  glGetIntegerv(GL_BLEND_SRC, &blendSrc);
+  glGetIntegerv(GL_BLEND_DST, &blendDst);
+  
+  if (depthOn) glDisable(GL_DEPTH_TEST);  // If they were enabled/disabled
+  if (!textureOn) glEnable(GL_TEXTURE_2D); // then enable/disable them
+  if (!blendOn) glEnable(GL_BLEND);
+  if (!scissorOn) glEnable(GL_SCISSOR_TEST);
+  if (lightOn) glDisable(GL_LIGHTING);
+  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Set the correct blending mode
+  
+  glMatrixMode(GL_PROJECTION); // and initalize Ortho mode
+  glPushMatrix();
+  glLoadIdentity();
+  glOrtho(0.0f,screenStats[2],screenStats[3],0.0f,-1.0f,1.0f);
+  glMatrixMode(GL_MODELVIEW);
+  glPushMatrix();
+  glBindTexture(GL_TEXTURE_2D, font->getTexture());
+
+  if(type>1) typ=typ-2;
+  glLoadIdentity();
+  glTranslated(x,y,0);
+  glListBase(base-32+(128*typ));
+  glScalef(sizex,sizey,1.0f);
+  glCallLists(strlen(text),GL_UNSIGNED_BYTE, text); // Write The Text To The Screen
+  
+  if(type>1)
+    {
+      glLoadIdentity();
+      glTranslated(x+1,y,0);
+      glListBase(base-32+(128*(type-2)));
+      glScalef(sizex,sizey,1.0f);
+      glCallLists(strlen(text),GL_UNSIGNED_BYTE, text); // Write The Text To The Screen
+    }
+
+  glBindTexture(GL_TEXTURE_2D, 0); // Fix everything up
+  glMatrixMode(GL_PROJECTION);
+  glPopMatrix();
+  glMatrixMode(GL_MODELVIEW);
+  glPopMatrix();
+
+  if (depthOn) glEnable(GL_DEPTH_TEST);
+  if (!textureOn) glDisable(GL_TEXTURE_2D);
+  if (!blendOn) glDisable(GL_BLEND);
+  if (!scissorOn) glDisable(GL_SCISSOR_TEST);
+  if (lightOn) glEnable(GL_LIGHTING);
+
+  glBlendFunc(blendSrc, blendDst);
+  glMatrixMode(matrixMode);
+
+  return 1;
+}
Index: /orxonox/branches/trackManager/src/lib/graphics/font/fontset.h
===================================================================
--- /orxonox/branches/trackManager/src/lib/graphics/font/fontset.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/graphics/font/fontset.h	(revision 3498)
@@ -0,0 +1,52 @@
+/*! 
+    \file fontset.h
+    \brief Handles the display of Text.
+*/
+
+/**
+  This file is extended to the needs of the orxonox-project.
+  The main difference to the version of Marius is, that textures get 
+  loaded by orxonox Texture-class
+*/
+
+#ifndef _FONTSET_H
+#define _FONTSET_H
+
+class Texture;
+
+//! A class to handle a FontSet.
+/**
+   A fontset is an entire Alphabet (256 entries) of one font.
+   It is made by creating a file containing a matrix with 256
+   little pictures in it, displaying the letters of this alphabet.
+   Then these letters are projected onto Quads, which can be aranged
+   in a sorted order, to display some text
+
+   usage:
+   1. initialize the Class by loading the source-font-picture
+   2. set the size
+   3. write some text with printText
+   4. delete the class again.
+*/ 
+class FontSet
+{
+ public:
+  FontSet();
+  FontSet(char *file);
+  ~FontSet();
+  
+  int buildFont(char* fontFile);
+  int printText(int x, int y, char type, char *fmt, ...);
+  int killFont(void);
+  int setSize(float x, float y);
+  
+ private:
+  int base;          //!< Save the glLists here.
+  float sizex;       //!< the width of the text.
+  float sizey;       //!< the height of the text.
+  Texture* font;     //!< texture of the font.
+
+};
+
+
+#endif /* _FONTSET_H */
Index: /orxonox/branches/trackManager/src/lib/graphics/font/glfont.cc
===================================================================
--- /orxonox/branches/trackManager/src/lib/graphics/font/glfont.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/graphics/font/glfont.cc	(revision 3498)
@@ -0,0 +1,545 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+   co-programmer: ...
+
+   ***
+   * This file is extended to the needs of the orxonox-project.         *
+   * the Copyright of the original file is below this copyright         *
+   *                                                                  ***
+
+*/
+
+/*
+    glfont:  An example of using the SDL_ttf library with OpenGL.
+    Copyright (C) 1997-2004 Sam Lantinga
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public
+    License along with this library; if not, write to the Free
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+    The SDL_GL_* functions in this file are available in the public domain.
+
+    Sam Lantinga
+    slouken@libsdl.org
+*/
+
+#include "glfont.h"
+
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <SDL/SDL.h>
+#include <SDL/SDL_ttf.h>
+
+#include "../glincl.h"
+#include "../debug.h"
+
+
+#define DEFAULT_PTSIZE	18
+#define DEFAULT_TEXT	"orxonox 1234567890"
+#define NUM_COLORS      256
+
+
+
+GLFont::GLFont()
+{
+  this->init("");
+
+}
+GLFont::GLFont(const char* fontFile)
+{
+  this->init(fontFile);
+}
+GLFont::~GLFont()
+{
+  
+}
+
+bool GLFont::init(const char* fontFile)
+{
+  // setting default values.
+  renderStyle = TTF_STYLE_NORMAL;
+
+
+  // Initializing lib-TTF if necesary.
+  if (TTF_WasInit() && TTF_Init() < 0 ) 
+    {
+      PRINTF(1)("Couldn't initialize TTF: %s\n", SDL_GetError());
+      return false;
+    }
+}
+
+bool GLFont::ttfInitialized = false;
+
+bool GLFont::setFont(const char* fonFile)
+{
+
+}
+void GLFont::setText(const char* text)
+{
+
+}
+
+void GLFont::setStyle(char* style)
+{
+  renderStyle = TTF_STYLE_NORMAL;
+  
+  for (int i = 0; i < strlen(style); i++)
+    if (strncmp(style+i, "b", 1) == 0) 
+      this->renderStyle |= TTF_STYLE_BOLD;
+    else if (strncmp(style+i, "i", 1) == 0)
+      this->renderStyle |= TTF_STYLE_ITALIC;
+    else if (strncmp(style+i, "u", 1) == 0) 
+      this->renderStyle |= TTF_STYLE_UNDERLINE;
+
+  // TTF_SetFontStyle(font, renderstyle);
+
+}
+void GLFont::setSize(void)
+{
+
+}
+void GLFont::setPosition(int x, int y)
+{
+
+}
+
+void GLFont::renderText(void)
+{
+
+}
+void GLFont::renderText(const char* text, int x, int y)
+{
+  // enter the 2D-Mode
+
+  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);
+
+
+
+
+
+  // Leave the 2D-Mode
+  glMatrixMode(GL_MODELVIEW);
+  glPopMatrix();
+  
+  glMatrixMode(GL_PROJECTION);
+  glPopMatrix();
+  
+  glPopAttrib();
+}
+
+
+bool GLFont::loadTexture()
+{
+  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 = powerOfTwo(surface->w);
+  h = powerOfTwo(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 */
+int GLFont::powerOfTwo(int input)
+{
+  int value = 1;
+  
+  while ( value < input ) {
+    value <<= 1;
+  }
+  return value;
+}
+
+
+/*
+private:
+char* fontFile;
+char* text;
+int positionX;
+int positionY;
+*/
+
+
+
+
+char Usage[100] = "orxonox test" ;
+void SDL_GL_Enter2DMode()
+{
+}
+
+void SDL_GL_Leave2DMode()
+{
+}
+
+/* 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);
+}
+
Index: /orxonox/branches/trackManager/src/lib/graphics/font/glfont.h
===================================================================
--- /orxonox/branches/trackManager/src/lib/graphics/font/glfont.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/graphics/font/glfont.h	(revision 3498)
@@ -0,0 +1,48 @@
+/*! 
+    \file glfont.h
+    \brief Handles the display of glFonts.
+*/
+
+#ifndef _GLFONT_H
+#define _GLFONT_H
+
+#include "../glincl.h"
+
+class GLFont
+{
+ public:
+  GLFont();
+  GLFont(const char* fontFile);
+  ~GLFont();
+  
+
+
+  bool setFont(const char* fontFile);
+  void setText(const char* text);
+
+  void setStyle(char* style);
+  void setSize(void);
+  void setPosition(int x, int y);
+  
+  void renderText(void);
+  void renderText(const char* text, int x, int y);
+
+ private:
+  char* fontFile;
+  char* text;
+  GLuint texture;
+  int positionX;
+  int positionY;
+  int renderStyle;
+  SDL_Surface* surface;
+  GLfloat* texcoord;
+
+  bool init(const char* fontFile);
+  bool loadTexture();
+  static int powerOfTwo(int input);
+
+  static bool ttfInitialized;
+
+};
+
+#endif /* _GLFONT_H */
Index: /orxonox/branches/trackManager/src/lib/graphics/font/sfont.c
===================================================================
--- /orxonox/branches/trackManager/src/lib/graphics/font/sfont.c	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/graphics/font/sfont.c	(revision 3498)
@@ -0,0 +1,178 @@
+/*  SFont: a simple font-library that uses special .pngs as fonts
+    Copyright (C) 2003 Karl Bartel
+
+    License: GPL or LGPL (at your choice)
+    WWW: http://www.linux-games.com/sfont/
+
+    This program is free software; you can redistribute it and/or modify        
+    it under the terms of the GNU General Public License as published by        
+    the Free Software Foundation; either version 2 of the License, or           
+    (at your option) any later version.                                         
+                                                                                
+    This program is distributed in the hope that it will be useful,       
+    but WITHOUT ANY WARRANTY; without even the implied warranty of              
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               
+    GNU General Public License for more details.                
+                                                                               
+    You should have received a copy of the GNU General Public License           
+    along with this program; if not, write to the Free Software                 
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   
+                                                                                
+    Karl Bartel
+    Cecilienstr. 14                                                    
+    12307 Berlin
+    GERMANY
+    karlb@gmx.net                                                      
+*/                                                                            
+#include <SDL.h>
+
+#include <assert.h>
+#include <stdlib.h>
+#include "SFont.h"
+
+static Uint32 GetPixel(SDL_Surface *Surface, Sint32 X, Sint32 Y)
+{
+   Uint8  *bits;
+   Uint32 Bpp;
+
+   assert(X>=0);
+   assert(X<Surface->w);
+   
+   Bpp = Surface->format->BytesPerPixel;
+   bits = ((Uint8 *)Surface->pixels)+Y*Surface->pitch+X*Bpp;
+
+   // Get the pixel
+   switch(Bpp) {
+      case 1:
+         return *((Uint8 *)Surface->pixels + Y * Surface->pitch + X);
+         break;
+      case 2:
+         return *((Uint16 *)Surface->pixels + Y * Surface->pitch/2 + X);
+         break;
+      case 3: { // Format/endian independent 
+         Uint8 r, g, b;
+         r = *((bits)+Surface->format->Rshift/8);
+         g = *((bits)+Surface->format->Gshift/8);
+         b = *((bits)+Surface->format->Bshift/8);
+         return SDL_MapRGB(Surface->format, r, g, b);
+         }
+         break;
+      case 4:
+         return *((Uint32 *)Surface->pixels + Y * Surface->pitch/4 + X);
+         break;
+   }
+
+   return -1;
+}
+
+SFont_Font* SFont_InitFont(SDL_Surface* Surface)
+{
+    int x = 0, i = 0;
+    Uint32 pixel;
+    SFont_Font* Font;
+    Uint32 pink;
+
+    if (Surface == NULL)
+	return NULL;
+
+    Font = (SFont_Font *) malloc(sizeof(SFont_Font));
+    Font->Surface = Surface;
+
+    SDL_LockSurface(Surface);
+
+    pink = SDL_MapRGB(Surface->format, 255, 0, 255);
+    while (x < Surface->w) {
+	if (GetPixel(Surface, x, 0) == pink) { 
+    	    Font->CharPos[i++]=x;
+    	    while((x < Surface->w) && (GetPixel(Surface, x, 0)== pink))
+		x++;
+	    Font->CharPos[i++]=x;
+	}
+	x++;
+    }
+    Font->MaxPos = x-1;
+    
+    pixel = GetPixel(Surface, 0, Surface->h-1);
+    SDL_UnlockSurface(Surface);
+    SDL_SetColorKey(Surface, SDL_SRCCOLORKEY, pixel);
+
+    return Font;
+}
+
+void SFont_FreeFont(SFont_Font* FontInfo)
+{
+    SDL_FreeSurface(FontInfo->Surface);
+    free(FontInfo);
+}
+
+void SFont_Write(SDL_Surface *Surface, const SFont_Font *Font,
+		 int x, int y, const char *text)
+{
+    const char* c;
+    int charoffset;
+    SDL_Rect srcrect, dstrect;
+
+    if(text == NULL)
+	return;
+
+    // these values won't change in the loop
+    srcrect.y = 1;
+    dstrect.y = y;
+    srcrect.h = dstrect.h = Font->Surface->h - 1;
+
+    for(c = text; *c != '\0' && x <= Surface->w ; c++) {
+	charoffset = ((int) (*c - 33)) * 2 + 1;
+	// skip spaces and nonprintable characters
+	if (*c == ' ' || charoffset < 0 || charoffset > Font->MaxPos) {
+	    x += Font->CharPos[2]-Font->CharPos[1];
+	    continue;
+	}
+
+	srcrect.w = dstrect.w = 
+	    (Font->CharPos[charoffset+2] + Font->CharPos[charoffset+1])/2 -
+	    (Font->CharPos[charoffset] + Font->CharPos[charoffset-1])/2;
+	srcrect.x = (Font->CharPos[charoffset]+Font->CharPos[charoffset-1])/2;
+	dstrect.x = x - (float)(Font->CharPos[charoffset]
+			      - Font->CharPos[charoffset-1])/2;
+
+	SDL_BlitSurface(Font->Surface, &srcrect, Surface, &dstrect); 
+
+	x += Font->CharPos[charoffset+1] - Font->CharPos[charoffset];
+    }
+}
+
+int SFont_TextWidth(const SFont_Font *Font, const char *text)
+{
+    const char* c;
+    int charoffset=0;
+    int width = 0;
+
+    if(text == NULL)
+	return 0;
+
+    for(c = text; *c != '\0'; c++) {
+	charoffset = ((int) *c - 33) * 2 + 1;
+	// skip spaces and nonprintable characters
+        if (*c == ' ' || charoffset < 0 || charoffset > Font->MaxPos) {
+            width += Font->CharPos[2]-Font->CharPos[1];
+	    continue;
+	}
+	
+	width += Font->CharPos[charoffset+1] - Font->CharPos[charoffset];
+    }
+
+    return width;
+}
+
+int SFont_TextHeight(const SFont_Font* Font)
+{
+    return Font->Surface->h - 1;
+}
+
+void SFont_WriteCenter(SDL_Surface *Surface, const SFont_Font *Font,
+		       int y, const char *text)
+{
+    SFont_Write(Surface, Font, Surface->w/2 - SFont_TextWidth(Font, text)/2,
+	    	y, text);
+}
+
Index: /orxonox/branches/trackManager/src/lib/graphics/font/sfont.h
===================================================================
--- /orxonox/branches/trackManager/src/lib/graphics/font/sfont.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/graphics/font/sfont.h	(revision 3498)
@@ -0,0 +1,83 @@
+/*  SFont: a simple font-library that uses special bitmaps as fonts
+    Copyright (C) 2003 Karl Bartel
+
+    License: GPL or LGPL (at your choice)
+    WWW: http://www.linux-games.com/sfont/
+
+    This program is free software; you can redistribute it and/or modify        
+    it under the terms of the GNU General Public License as published by        
+    the Free Software Foundation; either version 2 of the License, or           
+    (at your option) any later version.                                         
+                                                                                
+    This program is distributed in the hope that it will be useful,       
+    but WITHOUT ANY WARRANTY; without even the implied warranty of              
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               
+    GNU General Public License for more details.                
+                                                                               
+    You should have received a copy of the GNU General Public License           
+    along with this program; if not, write to the Free Software                 
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   
+                                                                                
+    Karl Bartel
+    Cecilienstr. 14                                                    
+    12307 Berlin
+    GERMANY
+    karlb@gmx.net                                                      
+*/                                                                            
+
+/************************************************************************ 
+*    SFONT - SDL Font Library by Karl Bartel <karlb@gmx.net>            *
+*                                                                       *
+*  All functions are explained below. For further information, take a   *
+*  look at the example files, the links at the SFont web site, or       *
+*  contact me, if you problem isn' addressed anywhere.                  *
+*                                                                       *
+************************************************************************/
+#ifndef SFONT_H
+#define SFONT_H
+
+#include <SDL.h>
+
+#ifdef __cplusplus 
+extern "C" {
+#endif
+
+// Delcare one variable of this type for each font you are using.
+// To load the fonts, load the font image into YourFont->Surface
+// and call InitFont( YourFont );
+typedef struct {
+	SDL_Surface *Surface;	
+	int CharPos[512];
+	int MaxPos;
+} SFont_Font;
+
+// Initializes the font
+// Font: this contains the suface with the font.
+//       The Surface must be loaded before calling this function
+SFont_Font* SFont_InitFont (SDL_Surface *Font);
+
+// Frees the font
+// Font: The font to free
+//       The font must be loaded before using this function.
+void SFont_FreeFont(SFont_Font* Font);
+
+// Blits a string to a surface
+// Destination: the suface you want to blit to
+// text: a string containing the text you want to blit.
+void SFont_Write(SDL_Surface *Surface, const SFont_Font *Font, int x, int y,
+				 const char *text);
+
+// Returns the width of "text" in pixels
+int SFont_TextWidth(const SFont_Font* Font, const char *text);
+// Returns the height of "text" in pixels (which is always equal to Font->Surface->h)
+int SFont_TextHeight(const SFont_Font* Font);
+
+// Blits a string to Surface with centered x position
+void SFont_WriteCenter(SDL_Surface *Surface, const SFont_Font* Font, int y,
+					   const char *text);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* SFONT_H */
Index: /orxonox/branches/trackManager/src/lib/graphics/importer/Makefile.am
===================================================================
--- /orxonox/branches/trackManager/src/lib/graphics/importer/Makefile.am	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/graphics/importer/Makefile.am	(revision 3498)
@@ -0,0 +1,58 @@
+MAINSRCDIR=../../..
+AM_CXXFLAGS=-I$(MAINSRCDIR)
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/world_entities
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/story_entities
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/data
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/gaphics
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/graphics/importer
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/lang
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/util
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/math
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/defs
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/font
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/network
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/glmenu
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/ai
+
+
+AM_LDFLAGS=$(MWINDOWS)
+
+#"-O3 -pedantic -fPIC -ffast-math -I/usr/X11R6/include"
+
+
+bin_PROGRAMS=importer
+importer_SOURCES= framework.cc \
+	          windowHandler.cc \
+	  	  model.cc \
+		  objModel.cc \
+	  	  array.cc \
+	  	  material.cc \
+		  texture.cc \
+		  $(MAINSRCDIR)/lib/math/vector.cc
+
+noinst_HEADERS= framework.h \
+	  	windowHandler.h \
+	  	model.h \
+		objModel.h \
+	  	array.h \
+		material.h \
+		texture.h
+
+
+
+#  uncomment the following if orxonox requires the math library
+#orxonox_LDADD=-lm
+
+#EXTRA_DIST=orxonox.lsm.in orxonox.spec.in orxonox.texinfo
+
+#  if you write a self-test script named `chk', uncomment the
+#  following and add `chk' to the EXTRA_DIST list
+#TESTS=chk
+
+#  build and install the .info pages
+#info_TEXINFOS = orxonox.texinfo
+#orxonox_TEXINFOS = gpl.texinfo
+
+#  install the man pages
+#man_MANS=orxonox.1
Index: /orxonox/branches/trackManager/src/lib/graphics/importer/Makefile.in
===================================================================
--- /orxonox/branches/trackManager/src/lib/graphics/importer/Makefile.in	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/graphics/importer/Makefile.in	(revision 3498)
@@ -0,0 +1,496 @@
+# Makefile.in generated by automake 1.8.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+SOURCES = $(importer_SOURCES)
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../../../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_triplet = @host@
+bin_PROGRAMS = importer$(EXEEXT)
+subdir = src/lib/graphics/importer
+DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
+	$(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am_importer_OBJECTS = framework.$(OBJEXT) windowHandler.$(OBJEXT) \
+	model.$(OBJEXT) objModel.$(OBJEXT) array.$(OBJEXT) \
+	material.$(OBJEXT) texture.$(OBJEXT) vector.$(OBJEXT)
+importer_OBJECTS = $(am_importer_OBJECTS)
+importer_LDADD = $(LDADD)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/array.Po ./$(DEPDIR)/framework.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/material.Po ./$(DEPDIR)/model.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/objModel.Po ./$(DEPDIR)/texture.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/vector.Po ./$(DEPDIR)/windowHandler.Po
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+	-o $@
+SOURCES = $(importer_SOURCES)
+DIST_SOURCES = $(importer_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CURL_CFLAGS = @CURL_CFLAGS@
+CURL_LIBS = @CURL_LIBS@
+CXX = @CXX@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEBUG = @DEBUG@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DOXYGEN = @DOXYGEN@
+DOXYGEN_FALSE = @DOXYGEN_FALSE@
+DOXYGEN_TRUE = @DOXYGEN_TRUE@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GTHREAD_CFLAGS = @GTHREAD_CFLAGS@
+GTHREAD_LIBS = @GTHREAD_LIBS@
+GTK2_CFLAGS = @GTK2_CFLAGS@
+GTK2_LIBS = @GTK2_LIBS@
+HAVE_CURL_FALSE = @HAVE_CURL_FALSE@
+HAVE_CURL_TRUE = @HAVE_CURL_TRUE@
+HAVE_GTHREAD_FALSE = @HAVE_GTHREAD_FALSE@
+HAVE_GTHREAD_TRUE = @HAVE_GTHREAD_TRUE@
+HAVE_GTK2_FALSE = @HAVE_GTK2_FALSE@
+HAVE_GTK2_TRUE = @HAVE_GTK2_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MSBITFIELDS = @MSBITFIELDS@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SUB_PROJECTS_FALSE = @SUB_PROJECTS_FALSE@
+SUB_PROJECTS_TRUE = @SUB_PROJECTS_TRUE@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+MAINSRCDIR = ../../..
+AM_CXXFLAGS = -I$(MAINSRCDIR) -I$(MAINSRCDIR)/world_entities -I$(MAINSRCDIR)/story_entities -I$(MAINSRCDIR)/lib -I$(MAINSRCDIR)/lib/data -I$(MAINSRCDIR)/lib/gaphics -I$(MAINSRCDIR)/lib/graphics/importer -I$(MAINSRCDIR)/lib/lang -I$(MAINSRCDIR)/lib/util -I$(MAINSRCDIR)/lib/math -I$(MAINSRCDIR)/defs -I$(MAINSRCDIR)/font -I$(MAINSRCDIR)/network -I$(MAINSRCDIR)/glmenu -I$(MAINSRCDIR)/ai
+AM_LDFLAGS = $(MWINDOWS)
+importer_SOURCES = framework.cc \
+	          windowHandler.cc \
+	  	  model.cc \
+		  objModel.cc \
+	  	  array.cc \
+	  	  material.cc \
+		  texture.cc \
+		  $(MAINSRCDIR)/lib/math/vector.cc
+
+noinst_HEADERS = framework.h \
+	  	windowHandler.h \
+	  	model.h \
+		objModel.h \
+	  	array.h \
+		material.h \
+		texture.h
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  src/lib/graphics/importer/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  src/lib/graphics/importer/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  if test -f $$p \
+	  ; then \
+	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+	   echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+	   $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+	  else :; fi; \
+	done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+	  echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(bindir)/$$f"; \
+	done
+
+clean-binPROGRAMS:
+	-test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+importer$(EXEEXT): $(importer_OBJECTS) $(importer_DEPENDENCIES) 
+	@rm -f importer$(EXEEXT)
+	$(CXXLINK) $(importer_LDFLAGS) $(importer_OBJECTS) $(importer_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/array.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/framework.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/material.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/model.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/objModel.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/texture.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/windowHandler.Po@am__quote@
+
+.cc.o:
+@am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+vector.o: $(MAINSRCDIR)/lib/math/vector.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT vector.o -MD -MP -MF "$(DEPDIR)/vector.Tpo" -c -o vector.o `test -f '$(MAINSRCDIR)/lib/math/vector.cc' || echo '$(srcdir)/'`$(MAINSRCDIR)/lib/math/vector.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/vector.Tpo" "$(DEPDIR)/vector.Po"; else rm -f "$(DEPDIR)/vector.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$(MAINSRCDIR)/lib/math/vector.cc' object='vector.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/vector.Po' tmpdepfile='$(DEPDIR)/vector.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 vector.o `test -f '$(MAINSRCDIR)/lib/math/vector.cc' || echo '$(srcdir)/'`$(MAINSRCDIR)/lib/math/vector.cc
+
+vector.obj: $(MAINSRCDIR)/lib/math/vector.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT vector.obj -MD -MP -MF "$(DEPDIR)/vector.Tpo" -c -o vector.obj `if test -f '$(MAINSRCDIR)/lib/math/vector.cc'; then $(CYGPATH_W) '$(MAINSRCDIR)/lib/math/vector.cc'; else $(CYGPATH_W) '$(srcdir)/$(MAINSRCDIR)/lib/math/vector.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/vector.Tpo" "$(DEPDIR)/vector.Po"; else rm -f "$(DEPDIR)/vector.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$(MAINSRCDIR)/lib/math/vector.cc' object='vector.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/vector.Po' tmpdepfile='$(DEPDIR)/vector.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 vector.obj `if test -f '$(MAINSRCDIR)/lib/math/vector.cc'; then $(CYGPATH_W) '$(MAINSRCDIR)/lib/math/vector.cc'; else $(CYGPATH_W) '$(srcdir)/$(MAINSRCDIR)/lib/math/vector.cc'; fi`
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(HEADERS)
+installdirs:
+	for dir in "$(DESTDIR)$(bindir)"; do \
+	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
+	clean-generic ctags distclean distclean-compile \
+	distclean-generic distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-binPROGRAMS \
+	install-data install-data-am install-exec install-exec-am \
+	install-info install-info-am install-man install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+	uninstall-am uninstall-binPROGRAMS uninstall-info-am
+
+
+#  uncomment the following if orxonox requires the math library
+#orxonox_LDADD=-lm
+
+#EXTRA_DIST=orxonox.lsm.in orxonox.spec.in orxonox.texinfo
+
+#  if you write a self-test script named `chk', uncomment the
+#  following and add `chk' to the EXTRA_DIST list
+#TESTS=chk
+
+#  build and install the .info pages
+#info_TEXINFOS = orxonox.texinfo
+#orxonox_TEXINFOS = gpl.texinfo
+
+#  install the man pages
+#man_MANS=orxonox.1
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
Index: /orxonox/branches/trackManager/src/lib/graphics/importer/array.cc
===================================================================
--- /orxonox/branches/trackManager/src/lib/graphics/importer/array.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/graphics/importer/array.cc	(revision 3498)
@@ -0,0 +1,134 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+   co-programmer: ...
+*/
+
+#include "array.h"
+
+/**
+   \brief creates a new Array
+*/
+Array::Array ()
+{
+  this->initializeArray ();
+}
+
+/**
+   \brief deletes an Array.
+   It does this by first deleting all the array-entries, and then delete the array[] itself
+*/
+Array::~Array()
+{
+  PRINTF(2)("deleting array\n");
+  Entry* walker = this->firstEntry;
+  Entry* previous;
+  while (walker)
+    {
+      previous = walker;
+      walker = walker->next;
+      delete previous;
+    }
+  if (finalized)
+    delete []this->array;
+}
+
+/**
+   \brief initializes an Array
+   the Function does this by setting up a fistEntry, and setting the entryCount.
+*/
+void Array::initializeArray ()
+{
+  PRINTF(2)("crating new Array\n");
+  this->firstEntry = new Entry;
+  this->firstEntry->next =NULL;
+  this->currentEntry=firstEntry;
+  this->finalized = false;
+  this->entryCount = 0; //0 means one entry
+  return;
+}
+
+/**
+   \brief finalizes an array.
+   This Function creates the array, and makes it ready to be sent to the application.
+*/
+void Array::finalizeArray (void)
+{
+  PRINTF(3)("Finalizing array. Length: %i\n", entryCount);  
+  //  if ((array = (GLfloat*)malloc( entryCount* sizeof(GLfloat))) == NULL)
+  if (!(this->array = new GLfloat [this->entryCount]))
+    PRINTF(1)("could not allocate %i data Blocks\n", this->entryCount);
+  Entry* walker = this->firstEntry;
+  for (int i=0; i<this->entryCount; i++)
+    {
+      this->array[i] = walker->value;
+      walker = walker->next;
+    }
+  this->finalized = true;
+
+  return;
+}
+
+/**
+   \brief adds a new Entry to the Array
+   \param entry Entry to add.
+*/
+void Array::addEntry (GLfloat entry)
+{
+  if (!this->finalized)
+    {
+      PRINTF(3)("adding new Entry to Array: %f\n", entry);
+      
+      this->currentEntry->value = entry;
+      this->currentEntry->next = new Entry;
+      this->currentEntry = currentEntry->next;
+      this->currentEntry->next = NULL;
+      ++this->entryCount;
+    }
+  else 
+    PRINTF(1)("adding failed, because list has been finalized\n");
+}
+
+/**
+   \brief Adds 3 entries at once (convenience)
+*/
+void Array::addEntry (GLfloat entry0, GLfloat entry1, GLfloat entry2)
+{
+  this->addEntry (entry0);
+  this->addEntry (entry1);
+  this->addEntry (entry2);
+}
+  
+/**
+   \brief Gives back the array !! MUST be executed AFTER finalize.
+   \returns The created array.
+*/
+GLfloat* Array::getArray ()
+{
+  return this->array;
+}
+
+/**
+   \returns The Count of entries in the Array
+*/
+int Array::getCount()
+{
+  return this->entryCount;
+}
+
+/**
+   \brief Simple debug info about the Array
+*/
+void Array::debug ()
+{
+  PRINTF(0)("entryCount=%i, address=%p\n", this->entryCount, this->array);
+}
Index: /orxonox/branches/trackManager/src/lib/graphics/importer/array.h
===================================================================
--- /orxonox/branches/trackManager/src/lib/graphics/importer/array.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/graphics/importer/array.h	(revision 3498)
@@ -0,0 +1,47 @@
+/*!
+  \file array.h
+  \brief Contains the Array Class that handles float arrays.
+  this class creates a Array of a semi-Dynamic length.
+  beware, that after finalizing the array may not be resized again.
+*/
+
+#ifndef _ARRAY_H
+#define _ARRAY_H
+
+extern int verbose; //!< will be obsolete soon
+
+#include "stdincl.h"
+
+//! Array Class that handles dynamic-float arrays.
+class Array
+{
+ public:
+  Array ();
+  ~Array();
+
+  void initializeArray ();
+  void finalizeArray (void);
+  void addEntry (GLfloat entry);
+  void addEntry(GLfloat entry0, GLfloat entry1, GLfloat entry2);
+  
+  GLfloat* getArray ();
+  int getCount();
+  void debug(void);
+ private:
+  //! One entry of the Array
+  struct Entry
+  {
+    GLfloat value;  //!< The value of this Entry.
+    Entry* next;    //!< Pointer to the Next entry.
+  };
+
+  GLfloat* array;      //!< The array that will be produced when finalizing the Array.
+  int entryCount;      //!< The count of Entries in this Array.
+  bool finalized;      //!< If this variable is set to true, the Array can not be changed anymore. true if finalized, false else (initially).
+  Entry* firstEntry;   //!< Pointer to the first Entry of this Array
+  Entry* currentEntry; //!< Pointer to the current Entry of this Array. The one Entry we are working with.
+  
+  
+};
+
+#endif
Index: /orxonox/branches/trackManager/src/lib/graphics/importer/framework.cc
===================================================================
--- /orxonox/branches/trackManager/src/lib/graphics/importer/framework.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/graphics/importer/framework.cc	(revision 3498)
@@ -0,0 +1,293 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+   co-programmer: ...
+*/
+
+#include "framework.h"
+
+#include "vector.h"
+
+int verbose;
+void DrawGLScene()
+{
+  currFrame = SDL_GetTicks();
+  dt = currFrame - lastFrame; 
+  if (dt == 0)
+    dist += (zoomTo-dist)/500;
+  else 
+    dist += (zoomTo-dist)/500 *(float)dt;
+
+  rotatorP += rotatorV *(float)dt;
+  
+
+  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
+  glLoadIdentity(); // Reset the view
+  
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();	
+  gluPerspective(45.0f,500/375,0.1f,dist * 5.0f);
+    gluLookAt (0, dist , dist, 0,0,0, up.x,up.y,up.z);
+
+  glMatrixMode(GL_MODELVIEW);
+  glPushMatrix();
+  //  glRotatef (180, dir.x, dir.y, dir.z);
+  glMultMatrixf (*matQ);
+  if (obj)
+    obj->draw();
+
+  glPopMatrix();
+
+  SDL_GL_SwapBuffers(); // Swap the buffers
+  lastFrame = currFrame;
+}
+
+
+int main(int argc, char *argv[])
+{
+  verbose = 3;
+
+  Uint8* keys; // This variable will be used in the keyboard routine
+  int done=FALSE; // We aren't done yet, are we?
+
+  // Create a new OpenGL window with the title "Cone3D Basecode" at
+  // 640x480x32, fullscreen and check for errors along the way
+  if(wHandler.CreateGLWindow("Whandler Basecode", 800, 600, 32, FALSE) == FALSE)
+  {
+    // If an error is found, display a message, kill the GL and SDL screens (if they were created) and exit
+    PRINTF(1)("Could not initalize OpenGL :(\n\n");
+    wHandler.KillGLWindow();
+    return 0;
+  }
+  
+  PRINTF(2)("screensize: %i, %i\n", wHandler.screen->w, wHandler.screen->h);
+  if (argc>=3)
+    obj = new OBJModel (argv[1], atof(argv[2]));
+  else if (argc>=2)
+    obj = new OBJModel(argv[1]);
+  else 
+    {
+      // This is an example, of how it is possible, to create a new Model, and adding some vertex-information.
+      // This also packs everything into a DisplayList, and can be handled exactly as any other model.
+      // This is an example of a cube with Texture-Coordinates, but without explicite Vertex-Normals. (they are soft-created).
+      /*
+      obj = (OBJModel*) new Model();
+      obj->setName("CUBE");
+      obj->addVertex (-0.5, -0.5, 0.5);
+      obj->addVertex (0.5, -0.5, 0.5);
+      obj->addVertex (-0.5, 0.5, 0.5);
+      obj->addVertex (0.5, 0.5, 0.5);
+      obj->addVertex (-0.5, 0.5, -0.5);
+      obj->addVertex (0.5, 0.5, -0.5);
+      obj->addVertex (-0.5, -0.5, -0.5);
+      obj->addVertex (0.5, -0.5, -0.5);
+      
+      obj->addVertexTexture (0.0, 0.0);
+      obj->addVertexTexture (1.0, 0.0);
+      obj->addVertexTexture (0.0, 1.0);
+      obj->addVertexTexture (1.0, 1.0);
+      obj->addVertexTexture (0.0, 2.0);
+      obj->addVertexTexture (1.0, 2.0);
+      obj->addVertexTexture (0.0, 3.0);
+      obj->addVertexTexture (1.0, 3.0);
+      obj->addVertexTexture (0.0, 4.0);
+      obj->addVertexTexture (1.0, 4.0);
+      obj->addVertexTexture (2.0, 0.0);
+      obj->addVertexTexture (2.0, 1.0);
+      obj->addVertexTexture (-1.0, 0.0);
+      obj->addVertexTexture (-1.0, 1.0);
+
+      obj->addFace ("1 2 4 3");
+      obj->addFace ("3 4 6 5");
+      obj->addFace ("5 6 8 7");
+      obj->addFace ("7 8 2 1");
+      obj->addFace ("2 8 6 4");
+      obj->addFace ("7 1 3 5");
+      obj->finalize();
+      */
+      obj = (OBJModel*) new Model(CYLINDER);
+    }
+  M = Vector(wHandler.screen->w/2, wHandler.screen->h/2, 0); 
+  rotAxis = Vector (0.0,1.0,0.0);
+  rotAngle = 0;
+
+  matQ[0][0] = matQ[1][1] = matQ[2][2] = matQ[3][3] = 1;
+  rotQ = Quaternion (rotAngle, rotAxis);
+  rotQlast = rotQ;
+  dir = Vector (0.0, 0.0, 1.0);
+  up = Vector (0.0, 1.0, 0.0);
+
+  glEnable(GL_LIGHTING);
+  glEnable(GL_DEPTH_TEST);
+
+  GLfloat whiteLight[] = {1.0, 1.0, 1.0,1.0};
+  GLfloat light0Position[] = {10.0, 10.0, 10.0, 0.0};
+  GLfloat light1Position[] = {-10.0, -7.0, -6.0, 0.0};
+  GLfloat lmodelAmbient[] = {.1, .1, .1, 1.0};
+
+  glEnable(GL_LIGHT0);
+  glLightfv(GL_LIGHT0, GL_POSITION, light0Position);
+  glLightfv(GL_LIGHT0, GL_DIFFUSE, whiteLight);
+  glLightfv(GL_LIGHT0, GL_SPECULAR, whiteLight);
+  
+  glEnable(GL_LIGHT1);
+  glLightfv(GL_LIGHT1, GL_POSITION, light1Position);
+  glLightfv(GL_LIGHT1, GL_DIFFUSE, whiteLight);
+  glLightfv(GL_LIGHT1, GL_SPECULAR, whiteLight);
+  
+
+  glEnable(GL_TEXTURE_2D);
+  rotatorP = .0;
+  rotatorV = .0;
+  dist = 5.0;
+  zoomTo = dist;
+  // Build the font from a TGA image font.tga in the data directory
+  // Hide the mouse cursor
+    SDL_ShowCursor(2);
+    mouse1Down = false;
+
+  // This is the main loop for the entire program and it will run until done==TRUE
+  while(!done)
+  {
+    // Draw the scene
+    DrawGLScene();
+    // And poll for events
+    SDL_Event event;
+    while ( SDL_PollEvent(&event) ) {
+      switch (event.type) {
+      case SDL_MOUSEMOTION:
+	PRINTF(3)("Mouse motion about %d,%d Pixels to (%d,%d).\n", 
+		  event.motion.xrel, event.motion.yrel,
+		  event.motion.x, event.motion.y);
+	// TRACKBALL
+	if (mouse1Down)
+	  {
+	    int mX = event.button.x;
+	    int mY = event.button.y;
+	    int wH = wHandler.screen->h;
+	    int wW = wHandler.screen->w;
+	    Vector tmpV (mX, mY, sqrt ( (float) abs(wH * wH/4 - (wW/2-mX) * (wW/2-mX) - (wH/2-mY) * (wH/2-mY)) ));
+	    //	    PRINTF(0)("tmpV: %f, %f, %f\n", tmpV.x, tmpV.y, tmpV.z);
+	    p2 = tmpV-M;
+	    p2.y = -p2.y;
+	    rotAxis = p1.cross(p2);
+	    //  PRINTF(0)("rotAxis: %f, %f, %f\n", rotAxis.x, rotAxis.y, rotAxis.z);
+
+	    // in case that there is no rotation-axis defined
+	    if (rotAxis.x != 0 || rotAxis.y != 0 || rotAxis.z != 0)
+	      {
+		rotAxis.normalize();
+		//		PRINTF(0)("rotAxis: %f, %f, %f\n", rotAxis.x, rotAxis.y, rotAxis.z, rotAngle);
+				
+		rotAngle = angleRad (p1, p2);
+		rotQ = Quaternion (rotAngle, rotAxis);
+		rotQ = rotQ * rotQlast;
+		rotQ.matrix (matQ);
+		//	dir = rotQ.apply(dir);
+		//      dir.normalize();
+		//	PRINTF(0)("rotAxis: %f, %f, %f, %f\n", dir.x, dir.y, dir.z, rotAngle);
+	      }
+	    rotQlast = rotQ;
+	    p1 = p2;
+
+	  }
+	break;
+      case SDL_MOUSEBUTTONDOWN:
+	if (event.button.button == 4)
+	  {
+	    PRINTF(0)("MouseWheel up\n");
+	    zoomTo *= .5;
+	  }
+	else if (event.button.button == 5)
+	  {
+	    PRINTF(2)("MouseWheel down\n");
+	    zoomTo *= 2.0;
+	  }
+	else if (event.button.button == 1)
+	  {
+	    mouse1Down = true;
+	    int mX = event.button.x;
+	    int mY = event.button.y;
+	    int wH = wHandler.screen->h;
+	    int wW = wHandler.screen->w;
+	    Vector tmpV (mX, mY, sqrt ( (float) abs(wH * wH/4 - (wW/2-mX) * (wW/2-mX) - (wH/2-mY) * (wH/2-mY)) ));
+	    p1 = tmpV-M;
+	    p1.y = -p1.y;
+
+	  }
+	else
+	  {
+	    PRINTF(0)("MouseButton %d pressed at (%d,%d).\n",
+		   event.button.button, event.button.x, event.button.y);
+	    rotatorV = ( (float)wHandler.screen->w/2 -event.button.x) / (float)wHandler.screen->w / 100.0;
+	  }
+	    
+	break;
+      case SDL_MOUSEBUTTONUP:
+	if (event.button.button == 4);
+	else if (event.button.button == 5);
+	else if (event.button.button == 1)
+	  mouse1Down =false;
+	else 
+	    {
+	      PRINTF(2)("MouseButton %d released at (%d,%d).\n",
+			event.button.button, event.button.x, event.button.y);
+	    }
+	break;
+
+
+      case SDL_KEYDOWN:
+	switch (event.key.keysym.sym)
+	  {
+	  case SDLK_x:
+	    delete obj;
+	    obj = NULL;
+	    break;
+	  case SDLK_c:
+	    if (!obj)
+	      obj = new OBJModel(argv[1]);
+	    break;
+	  case SDLK_a:
+	    zoomTo /=2;
+	    break;
+	  case SDLK_z:
+	    zoomTo *=2;
+
+	  }
+	break;
+	    
+        // If a quit event was recieved
+      case SDL_QUIT:
+	// then we're done and we'll end this program
+          done=TRUE;
+          break;
+      default:
+          break;
+      }
+
+
+    }
+
+    // Get the state of the keyboard keys
+    keys = SDL_GetKeyState(NULL);
+
+    // and check if ESCAPE has been pressed. If so then quit
+    if(keys[SDLK_ESCAPE]) done=TRUE;
+  }
+
+  // Kill the GL & SDL screens
+  if (obj)
+    delete obj;
+  wHandler.KillGLWindow();
+  // And quit
+  return 0;
+}
Index: /orxonox/branches/trackManager/src/lib/graphics/importer/framework.h
===================================================================
--- /orxonox/branches/trackManager/src/lib/graphics/importer/framework.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/graphics/importer/framework.h	(revision 3498)
@@ -0,0 +1,39 @@
+#ifndef _FRAMEWORK_H
+#define _FRAMEWORK_H
+ 
+#include "windowHandler.h" // Include the Whandler Basecode
+#include "objModel.h"
+
+class Vector;
+
+float rotatorP;
+float rotatorV;
+
+float dist;
+float zoomTo;
+
+Uint32 lastFrame;
+Uint32 currFrame;
+Uint32 dt;
+
+
+Vector dir;
+Vector up;
+
+float matQ[4][4];
+
+Vector M;
+Vector p1;
+Vector p2;
+Vector rotAxis;
+float rotAngle;
+Quaternion rotQ;
+Quaternion rotQlast;
+
+bool mouse1Down;
+
+WindowHandler wHandler;  // Create an instance of the whandler basecode class
+OBJModel* obj;
+
+
+#endif /* _FRAMEWORK_H */
Index: /orxonox/branches/trackManager/src/lib/graphics/importer/material.cc
===================================================================
--- /orxonox/branches/trackManager/src/lib/graphics/importer/material.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/graphics/importer/material.cc	(revision 3498)
@@ -0,0 +1,363 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+   co-programmer: ...
+
+*/
+
+#include "material.h"
+
+#include "texture.h"
+#include <stdlib.h>
+#include <string.h>
+
+using namespace std;
+
+
+/**
+   \brief creates a default Material with no Name
+   normally you call this to create a material List (for an obj-file) and then append with addMaterial()
+*/
+Material::Material()
+{
+  this->init();
+  
+  this->setName ("");
+}
+
+/**
+   \brief creates a Material.
+   \param mtlName Name of the Material to be added to the Material List
+*/
+Material::Material (char* mtlName)
+{
+  this->init();
+  
+  this->setName (mtlName);
+}
+
+/** 
+    \brief deletes a Material
+*/
+Material::~Material()
+{
+  PRINTF(2)("delete Material %s.\n", this->name);
+  if (this->name)
+    delete []this->name;
+  if (this->diffuseTexture)
+    this->diffuseTexture;
+  if (this->nextMat)
+    delete this->nextMat;
+}
+
+/**
+   \brief adds a new Material to the List.
+   this Function will append a new Material to the end of a Material List.
+   \param mtlName The name of the Material to be added.
+*/
+Material* Material::addMaterial(char* mtlName)
+{
+  PRINTF(2)("adding Material %s.\n", mtlName);
+   Material* tmpMat = this;
+  while (tmpMat->nextMat != NULL)
+    {
+      tmpMat = tmpMat->nextMat;
+    }
+  tmpMat->nextMat = new Material(mtlName);
+  return tmpMat->nextMat;
+  
+}
+
+/**
+   \brief initializes a new Material with its default Values
+*/
+void Material::init(void)
+{
+  PRINTF(2)("initializing new Material.\n");
+  this->nextMat = NULL;
+  this->name ="";
+  this->setIllum(1);
+  this->setDiffuse(0,0,0);
+  this->setAmbient(0,0,0);
+  this->setSpecular(.5,.5,.5);
+  this->setShininess(2.0);
+  this->setTransparency(0.0);
+
+
+  this->diffuseTexture = NULL;
+  this->ambientTexture = NULL;
+  this->specularTexture = NULL;
+
+  this->diffuseTextureSet = false;
+  this->ambientTextureSet = false;
+  this->specularTextureSet = false;
+
+  
+}
+
+/**
+   \brief Search for a Material called mtlName
+   \param mtlName the Name of the Material to search for
+   \returns Material named mtlName if it is found. NULL otherwise.
+*/
+Material* Material::search(char* mtlName)
+{
+  PRINTF(2)("Searching for material %s", mtlName);
+  Material* searcher = this;
+  while (searcher != NULL)
+    {
+      PRINT(2)(".");
+      if (!strcmp (searcher->getName(), mtlName))
+	{
+	  PRINT(2)("found.\n");
+	  return searcher;
+	}
+      searcher = searcher->nextMat;
+    }
+  PRINT(2)("not found\n");
+  return NULL;
+}
+
+/**
+   \brief sets the material with which the following Faces will be painted
+*/
+bool Material::select (void)
+{
+  // setting diffuse color
+  //  glColor3f (diffuse[0], diffuse[1], diffuse[2]);
+  glMaterialfv(GL_FRONT, GL_DIFFUSE, this->diffuse);
+
+  // setting ambient color
+  glMaterialfv(GL_FRONT, GL_AMBIENT, this->ambient);
+
+  // setting up Sprecular
+  glMaterialfv(GL_FRONT, GL_SPECULAR, this->specular);
+
+  // setting up Shininess
+  glMaterialf(GL_FRONT, GL_SHININESS, this->shininess);
+  
+  // setting illumination Model 
+  if (this->illumModel == 1) //! \todo make this work, if no vertex-normals are read.
+    glShadeModel(GL_FLAT);
+  else if (this->illumModel >= 2)
+    glShadeModel(GL_SMOOTH);
+
+  if (this->diffuseTextureSet)
+    glBindTexture(GL_TEXTURE_2D, this->diffuseTexture->getTexture());
+  else
+    glBindTexture(GL_TEXTURE_2D, 0);
+  
+}
+
+
+/**
+   \brief Set the Name of the Material. (Important for searching)
+   \param mtlName the Name of the Material to be set.
+*/ 
+void Material::setName (char* mtlName)
+{
+  PRINTF(3)("setting Material Name to %s.\n", this->name);
+  this->name = new char [strlen(mtlName)+1];
+  strcpy(this->name, mtlName);
+}
+
+/**
+   \returns The Name of The Material
+*/
+char* Material::getName (void)
+{
+  return this->name;
+}
+
+/**
+   \brief Sets the Material Illumination Model. 
+   \brief illu illumination Model in int form
+*/
+void Material::setIllum (int illum)
+{
+  PRINTF(3)("setting illumModel of Material %s to %i\n", this->name, illum);
+  this->illumModel = illum;
+  //  PRINTF(3)("setting illumModel to: %i\n", illumModel);
+}
+/**
+   \brief Sets the Material Illumination Model. 
+   \brief illu illumination Model in char* form
+*/void Material::setIllum (char* illum)
+{
+  this->setIllum (atoi(illum));
+}
+
+/**
+   \brief Sets the Material Diffuse Color.
+   \param r Red Color Channel.
+   \param g Green Color Channel.
+   \param b Blue Color Channel.
+*/
+void Material::setDiffuse (float r, float g, float b)
+{
+  PRINTF(3)("setting Diffuse Color of Material %s to r=%f g=%f b=%f.\n", this->name, r, g, b);
+  this->diffuse[0] = r;
+  this->diffuse[1] = g;
+  this->diffuse[2] = b;  
+  this->diffuse[3] = 1.0;
+
+}
+/**
+   \brief Sets the Material Diffuse Color.
+   \param rgb The red, green, blue channel in char format (with spaces between them)
+*/
+void Material::setDiffuse (char* rgb)
+{
+  float r,g,b;
+  sscanf (rgb, "%f %f %f", &r, &g, &b);
+  this->setDiffuse (r, g, b);
+}
+
+/**
+   \brief Sets the Material Ambient Color. 
+   \param r Red Color Channel.
+   \param g Green Color Channel.
+   \param b Blue Color Channel.
+*/
+void Material::setAmbient (float r, float g, float b)
+{
+  PRINTF(3)("setting Ambient Color of Material %s to r=%f g=%f b=%f.\n", this->name, r, g, b);
+  this->ambient[0] = r;
+  this->ambient[1] = g;
+  this->ambient[2] = b;
+  this->ambient[3] = 1.0;
+}
+/**
+   \brief Sets the Material Ambient Color.
+   \param rgb The red, green, blue channel in char format (with spaces between them)
+*/
+void Material::setAmbient (char* rgb)
+{
+  float r,g,b;
+  sscanf (rgb, "%f %f %f", &r, &g, &b);
+  this->setAmbient (r, g, b);
+}
+
+/**
+   \brief Sets the Material Specular Color. 
+   \param r Red Color Channel.
+   \param g Green Color Channel.
+   \param b Blue Color Channel.
+*/
+void Material::setSpecular (float r, float g, float b)
+{
+  PRINTF(3)("setting Specular Color of Material %s to r=%f g=%f b=%f.\n", this->name, r, g, b);
+  this->specular[0] = r;
+  this->specular[1] = g;
+  this->specular[2] = b;
+  this->specular[3] = 1.0;
+ }
+/**
+   \brief Sets the Material Specular Color.
+   \param rgb The red, green, blue channel in char format (with spaces between them)
+*/
+void Material::setSpecular (char* rgb)
+{
+  float r,g,b;
+  sscanf (rgb, "%f %f %f", &r, &g, &b);
+  this->setSpecular (r, g, b);
+}
+
+/**
+   \brief Sets the Material Shininess.
+   \param shini stes the Shininess from float.
+*/
+void Material::setShininess (float shini)
+{
+  this->shininess = shini;
+}
+/**
+   \brief Sets the Material Shininess.
+   \param shini stes the Shininess from char*.
+*/
+void Material::setShininess (char* shini)
+{
+  this->setShininess (atof(shini));
+}
+
+/**
+   \brief Sets the Material Transparency.
+   \param trans stes the Transparency from int.
+*/
+void Material::setTransparency (float trans)
+{
+  PRINTF(3)("setting Transparency of Material %s to %f.\n", this->name, trans);
+  this->transparency = trans;
+}
+/**
+   \brief Sets the Material Transparency.
+   \param trans stes the Transparency from char*.
+*/
+void Material::setTransparency (char* trans)
+{
+  this->setTransparency (atof(trans));
+}
+
+/**
+   \brief Adds a Texture Path to the List of already existing Paths
+   \param pathName The Path to add.
+*/
+void Material::addTexturePath(char* pathName)
+{
+  PathList::getInstance()->addPath(pathName);
+}
+
+// MAPPING //
+
+/**
+   \brief Sets the Materials Diffuse Map
+   \param dMap the Name of the Image to Use
+*/
+void Material::setDiffuseMap(char* dMap)
+{
+  PRINTF(3)("setting Diffuse Map %s\n", dMap);
+  diffuseTexture = new Texture();
+  this->diffuseTextureSet = diffuseTexture->loadImage(dMap);
+
+}
+
+/**
+   \brief Sets the Materials Ambient Map
+   \param aMap the Name of the Image to Use
+   \todo implement this
+*/
+void Material::setAmbientMap(char* aMap)
+{
+  SDL_Surface* ambientMap;
+
+}
+
+/**
+   \brief Sets the Materials Specular Map
+   \param sMap the Name of the Image to Use
+   \todo implement this
+*/
+void Material::setSpecularMap(char* sMap)
+{
+  SDL_Surface* specularMap;
+
+}
+
+/**
+   \brief Sets the Materials Bumpiness
+   \param bump the Name of the Image to Use
+   \todo implemet this
+*/
+void Material::setBump(char* bump)
+{
+
+}
Index: /orxonox/branches/trackManager/src/lib/graphics/importer/material.h
===================================================================
--- /orxonox/branches/trackManager/src/lib/graphics/importer/material.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/graphics/importer/material.h	(revision 3498)
@@ -0,0 +1,81 @@
+/*!
+  \file material.h
+  \brief Contains the Material Class that handles Material for 3D-Objects.
+  \todo free SDL-surface when deleting Material.
+  \todo delete imgNameWithPath after use creation.
+*/
+
+#ifndef _MATERIAL_H
+#define _MATERIAL_H
+
+
+
+extern int verbose; //!< will be obsolete soon.
+
+#if HAVE_CONFIG_H 
+#include <config.h> 
+#endif /* HAVE_CONFIG_H */
+
+// FORWARD DEFINITIONS //
+class Texture;
+
+
+//! Class to handle Materials.
+class Material
+{
+ public:
+  Material ();
+  Material (char* mtlName);
+  Material* addMaterial(char* mtlName);
+  ~Material ();
+  void init(void);
+
+  Material* search(char* mtlName);
+  bool select (void);
+
+  void setName (char* mtlName);
+  char* getName (void);
+  void setIllum (int illum);
+  void setIllum (char* illum);
+  void setDiffuse (float r, float g, float b);
+  void setDiffuse (char* rgb);
+  void setAmbient (float r, float g, float b);
+  void setAmbient (char* rgb);
+  void setSpecular (float r, float g, float b);
+  void setSpecular (char* rgb);
+  void setShininess (float shini);
+  void setShininess (char* shini);
+  void setTransparency (float trans);
+  void setTransparency (char* trans);
+
+
+ 
+  void addTexturePath(char* pathName);
+ // MAPPING //
+  void setDiffuseMap(char* dMap);
+  void setAmbientMap(char* aMap);
+  void setSpecularMap(char* sMap);
+  void setBump(char* bump);
+
+ private:
+  char* name;        //!< The Name of the Material.
+  int illumModel;    //!< The IlluminationModel is either flat or smooth.
+  float diffuse [4]; //!< The diffuse color of the Material.
+  float ambient [4]; //!< The ambient color of the Material.
+  float specular [4];//!< The specular color of the Material.
+  float shininess;   //!< The shininess of the Material.
+  float transparency;//!< The transperency of the Material.
+
+  Texture* diffuseTexture; //!< The diffuse texture of the Material.
+  Texture* ambientTexture; //!< The ambient texture of the Material.
+  Texture* specularTexture;//!< The specular texture of the Material.
+  
+  bool diffuseTextureSet; //!< Chekcs if the diffuse texture is Set.
+  bool ambientTextureSet; //!< Chekcs if the ambient texture is Set.
+  bool specularTextureSet;//!< Chekcs if the specular texture is Set.
+
+  Material* nextMat; //!< pointer to the Next Material of the List. NULL if no next exists.
+
+
+};
+#endif
Index: /orxonox/branches/trackManager/src/lib/graphics/importer/model.cc
===================================================================
--- /orxonox/branches/trackManager/src/lib/graphics/importer/model.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/graphics/importer/model.cc	(revision 3498)
@@ -0,0 +1,954 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+   co-programmer: ...
+*/
+
+#include "model.h"
+
+#include <math.h>
+#include <stdarg.h>
+
+#include "array.h"
+#include "vector.h"
+
+using namespace std;
+
+/**
+   \brief Creates a 3D-Model.
+
+   This only initializes a 3D-Model, but does not cleanup the Faces.
+*/
+Model::Model(void)
+{
+  this->initialize();
+}
+
+/**
+   \brief Creates a 3D-Model of Primitive-Type type
+
+   if you want to just display a Cube/Sphere/Cylinder/... without any material.
+   
+   \todo implement Cube/Sphere/Cylinder/...
+*/
+Model::Model(PRIMITIVE type)
+{
+  this->initialize();
+
+  switch (type)
+    {
+    default:
+    case CUBE:
+      this->cubeModel();
+      break;
+    case SPHERE:
+      this->sphereModel();
+      break;
+    case CYLINDER:
+      this->cylinderModel();
+      break;
+
+    }
+  this->importToGL ();
+
+  this->cleanup();
+}
+
+/**
+   \brief Creates a 3D-Model. and assigns it a Name.
+*/
+Model::Model(char* modelName)
+{
+  this->initialize();
+  this->setName(modelName);
+}
+
+/**
+   \brief deletes an Model.
+
+   Looks if any from model allocated space is still in use, and if so deleted it.
+*/
+Model::~Model(void)
+{
+  PRINTF(3)("Deleting Model ");
+  if (this->name)
+    {
+      PRINT(3)("%s\n", this->name);
+      delete []this->name;
+    }
+  else
+      PRINT(3)("\n");
+
+  PRINTF(3)("Deleting display Lists.\n");
+  Group* walker = this->firstGroup;
+  while (walker != NULL)
+    {
+      glDeleteLists (walker->listNumber, 1);
+      Group* delWalker = walker;
+      walker = walker->next;
+      delete delWalker;
+    }
+
+  PRINTF(3)("Deleting Materials.\n");
+  if (this->material)
+    delete this->material;
+}
+
+/**
+   \brief Finalizes an Object. This can be done outside of the Class.
+*/
+void Model::finalize(void)
+{
+  this->importToGL ();
+  
+  this->cleanup();
+
+  this->finalized = true;
+}
+
+/**
+   \brief Draws the Models of all Groups.
+   It does this by just calling the Lists that must have been created earlier.
+*/
+void Model::draw (void) const
+{
+  PRINTF(2)("drawing the 3D-Models\n"); 
+  Group* walker = this->firstGroup;
+  while (walker != NULL)
+    {
+      PRINTF(3)("Drawing model %s\n", walker->name);
+      glCallList (walker->listNumber);
+      walker = walker->next;
+    }
+}
+
+/**
+   \brief Draws the Model number groupNumber
+   \param groupNumber The number of the group that will be displayed.
+
+   It does this by just calling the List that must have been created earlier.
+*/
+void Model::draw (int groupNumber) const 
+{
+  if (groupNumber >= this->groupCount)
+    {
+      PRINTF(1)("You requested model number %i, but this File only contains of %i Models.\n", groupNumber-1, this->groupCount);
+      return;
+    }
+  PRINTF(2)("drawing the requested 3D-Models if found.\n"); 
+  Group* walker = this->firstGroup;
+  int counter = 0;
+  while (walker != NULL)
+    {
+      if (counter == groupNumber)
+	{
+	  PRINTF(2)("Drawing model number %i named %s\n", counter, walker->name);
+	  glCallList (walker->listNumber);
+	  return;
+	}
+      ++counter;
+      walker = walker->next;
+    }
+  PRINTF(1)("Model number %i in %s not Found.\n", groupNumber, this->name);
+  return;
+
+}
+
+/**
+   \brief Draws the Model with a specific groupName
+   \param groupName The name of the group that will be displayed.
+
+   It does this by just calling the List that must have been created earlier.
+*/
+void Model::draw (char* groupName) const
+{
+  PRINTF(2)("drawing the requested 3D-Models if found.\n"); 
+  Group* walker = this->firstGroup;
+  while (walker != NULL)
+    {
+      if (!strcmp(walker->name, groupName))
+	{
+	  PRINTF(2)("Drawing model %s\n", walker->name);
+	  glCallList (walker->listNumber);
+	  return;
+	}
+      walker = walker->next;
+    }
+  PRINTF(1)("Model Named %s in %s not Found.\n", groupName, this->name);
+  return;
+}
+
+/**
+   \returns Count of the Models in this File
+*/
+int Model::getGroupCount (void) const
+{
+  return this->groupCount;
+}
+
+/**
+    \brief initializes the Model.
+
+    This Function initializes all the needed arrays, Lists and clientStates.
+    It also defines default values.
+*/
+bool Model::initialize (void)
+{
+  PRINTF(2)("new 3D-Model is being created\n"); 
+
+  this->name = NULL;
+  this->finalized = false;
+  // setting the start group;
+  this->firstGroup = new Group;
+  this->currentGroup = this->firstGroup;
+  this->groupCount = 0;
+  
+  this->initGroup (this->currentGroup);
+  this->scaleFactor = 1;
+  this->material = new Material();
+
+  this->vertices = new Array();
+  this->vTexture = new Array();
+  this->normals = new Array();
+
+  return true;
+}
+
+/**
+   \brief sets a name to the Model
+   \param name The name to set to this Model
+*/
+void Model::setName(const char* name)
+{
+  if (this->name) 
+    delete this->name;
+  this->name = new char[strlen(name)+1];
+  strcpy(this->name, name);
+}
+/**
+   \brief initializes a new Group model
+   \param group the group that should be initialized.
+   \todo Maybe Group should be a Class, because it does a lot of stuff
+   
+*/
+bool Model::initGroup(Group* group)
+{
+  PRINTF(3)("Adding new Group\n");
+  group->name = "";
+  group->faceMode = -1;
+  group->faceCount = 0;  
+  group->next = NULL;
+
+  group->firstFace = new Face;
+  this->initFace (group->firstFace);
+  group->currentFace = group->firstFace;
+}
+
+/**
+   \brief initializes a new Face. (sets default Values)
+   \param face The face to initialize
+*/
+bool Model::initFace (Face* face)
+{
+  face->vertexCount = 0;
+
+  face->firstElem = NULL;
+  
+  face->materialString = NULL;
+  
+  face->next = NULL;
+
+  return true;
+}
+
+/**
+   \brief finalizes an Model.
+   This funcion is needed, to delete all the Lists, and arrays that are no more needed because they are already imported into openGL. This will be applied at the end of the importing Process.
+*/
+bool Model::cleanup(void)
+{
+  PRINTF(3)("cleaning up the 3D-Model to save Memory.\n");
+
+  if (this->vertices)
+    delete this->vertices;
+  if (this->vTexture)
+    delete this->vTexture;
+  if (this->normals)
+    delete this->normals;
+
+  this->cleanupGroup(this->firstGroup);
+  return true; 
+}
+
+/**
+   \brief Cleans up all groups starting from group.
+   \param group the first Group to clean
+*/
+bool Model::cleanupGroup (Group* group)
+{
+  PRINTF(3)("Cleaning up group\n");
+  if (group->firstFace != NULL)
+    {
+      cleanupFace (group->firstFace);
+      delete group->firstFace;
+    }
+
+  if (group->next !=NULL)
+    cleanupGroup (group->next);
+  return true;
+}
+
+/**
+   \brief Cleans up all Faces starting from face until NULL is reached.
+   \param face the first face to clean.
+*/
+bool Model::cleanupFace (Face* face)
+{
+  PRINTF(3)("Cleaning up Face\n");
+
+  if (face->materialString != NULL)
+      delete []face->materialString;
+  if (face->firstElem != NULL)
+    {
+      this->cleanupFaceElement(face->firstElem);
+      delete face->firstElem;
+    }
+      
+  if (face->next != NULL)
+    {
+      this->cleanupFace (face->next);
+      delete face->next;
+    }
+      
+}
+
+
+/**
+   \brief Cleans up all FaceElements starting from faceElem.
+   \param faceElem the first FaceElement to clean.
+*/
+bool Model::cleanupFaceElement(FaceElement* faceElem)
+{
+  if (faceElem->next != NULL)
+    {
+      this->cleanupFaceElement (faceElem->next);
+      delete faceElem->next;
+    }
+}
+
+/**
+   \brief parses a group String
+   \param groupString the new Group to create
+
+   This function initializes a new Group. 
+   With it you should be able to import .obj-files with more than one Models inside. 
+*/
+bool Model::addGroup (char* groupString)
+{
+  PRINTF(3)("Read Group: %s.\n", groupString);
+  if (this->groupCount != 0 && this->currentGroup->faceCount>0)
+    {
+      //      finalizeGroup(currentGroup);
+      this->currentGroup = this->currentGroup->next = new Group;
+      this->initGroup(this->currentGroup);
+    }
+  // setting the group name if not default.
+  if (strcmp(groupString, "default"))
+    {
+      this->currentGroup->name = new char [strlen(groupString)+1];
+      strcpy(this->currentGroup->name, groupString);
+    }
+  ++this->groupCount;
+
+}
+
+/**
+   \brief parses a vertex-String
+   \param vertexString The String that will be parsed.
+
+   If a vertex line is found this function will inject it into the vertex-Array
+*/
+bool Model::addVertex (char* vertexString)
+{
+  float subbuffer1;
+  float subbuffer2;
+  float subbuffer3;
+  sscanf (vertexString, "%f %f %f", &subbuffer1, &subbuffer2, &subbuffer3);
+  PRINTF(3)("reading in a vertex: %f %f %f\n", &subbuffer1, &subbuffer2, &subbuffer3);
+  this->vertices->addEntry(subbuffer1*scaleFactor, subbuffer2*scaleFactor, subbuffer3*scaleFactor);
+  return true;
+}
+
+/**
+   \brief parses a vertex-String
+   \param x the X-coordinate of the Vertex to add.
+   \param y the Y-coordinate of the Vertex to add.
+   \param z the Z-coordinate of the Vertex to add.
+   
+*/
+bool Model::addVertex(const float x, const float y, const float z)
+{
+  PRINTF(4)("reading in a vertex: %f %f %f\n", x, y, z);
+  this->vertices->addEntry(x*scaleFactor, y*scaleFactor, z*scaleFactor);
+  return true;
+}
+
+/**
+   \brief parses a face-string
+   \param faceString The String that will be parsed.
+
+   If a face line is found this function will add it to the glList.
+*/
+bool Model::addFace (char* faceString)
+{
+  if (this->currentGroup->faceCount >0)
+    this->currentGroup->currentFace = this->currentGroup->currentFace->next = new Face;
+  this->initFace (this->currentGroup->currentFace);
+
+  FaceElement* tmpElem = this->currentGroup->currentFace->firstElem = new FaceElement;
+  tmpElem->next = NULL;
+  while(strcmp (faceString, "\0"))
+    {
+      if (this->currentGroup->currentFace->vertexCount>0)
+	  tmpElem = tmpElem->next = new FaceElement;
+      tmpElem->next = NULL;
+
+      char tmpValue [50];
+      int tmpLen;
+      char* vertex = NULL;
+      char* texture = NULL;
+      char* normal = NULL;
+
+      sscanf (faceString, "%s", tmpValue);
+      tmpLen = strlen(tmpValue);
+      vertex = tmpValue;
+
+      if ((texture = strstr (vertex, "/")) != NULL)
+	{
+	  texture[0] = '\0';
+	  texture ++;
+	  
+	  if ((normal = strstr (texture, "/")) !=NULL)
+	    {
+	      normal[0] = '\0';
+	      normal ++;
+	    }	  
+	}
+      if (vertex)
+	tmpElem->vertexNumber = atoi(vertex)-1;
+      else
+	tmpElem->vertexNumber = -1;
+      if (texture)
+	tmpElem->texCoordNumber = atoi(texture)-1;
+      else
+	tmpElem->texCoordNumber = -1;
+      if (normal)
+	tmpElem->normalNumber = atoi(normal)-1;
+      else
+	tmpElem->normalNumber = -1;
+
+      faceString += tmpLen;
+      if (strcmp (faceString, "\0"))
+	faceString++;
+      this->currentGroup->currentFace->vertexCount++;
+    }
+
+  this->currentGroup->faceCount += this->currentGroup->currentFace->vertexCount -2;
+}
+
+/**
+   \brief adds a new Face
+   \param faceElemCount the number of Vertices to add to the Face.
+   \param type 0: vertex only, 1: vertex and normal, 2: vertex and Texture, 3 vertex, normal and texture
+*/
+bool Model::addFace(const float faceElemCount, int type, ...)
+{
+   if (this->currentGroup->faceCount > 0)
+    this->currentGroup->currentFace = this->currentGroup->currentFace->next = new Face;
+  this->initFace (this->currentGroup->currentFace);
+
+  FaceElement* tmpElem = this->currentGroup->currentFace->firstElem = new FaceElement;
+  tmpElem->next = NULL;
+  
+  va_list itemlist;
+  va_start (itemlist, type);
+
+  for (int i = 0; i < faceElemCount; i++)
+    {
+      if (this->currentGroup->currentFace->vertexCount>0)
+	  tmpElem = tmpElem->next = new FaceElement;
+      tmpElem->next = NULL;
+
+      tmpElem->vertexNumber = va_arg (itemlist, int) -1;
+      if (type >= 2)
+	tmpElem->texCoordNumber = va_arg (itemlist, int) -1;
+      if (type == 1 || type ==3)
+ 	tmpElem->normalNumber = va_arg(itemlist, int) -1;
+      this->currentGroup->currentFace->vertexCount++;
+    }
+  va_end(itemlist);
+
+  this->currentGroup->faceCount += this->currentGroup->currentFace->vertexCount - 2;
+}
+
+/**
+   \brief parses a vertexNormal-String
+   \param normalString The String that will be parsed.
+
+   If a vertexNormal line is found this function will inject it into the vertexNormal-Array
+*/
+bool Model::addVertexNormal (char* normalString)
+{
+  float subbuffer1;
+  float subbuffer2;
+  float subbuffer3;
+  sscanf (normalString, "%f %f %f", &subbuffer1, &subbuffer2, &subbuffer3);
+  PRINTF(3)("found vertex-Normal %f, %f, %f\n", &subbuffer1,&subbuffer2,&subbuffer3);
+  this->normals->addEntry(subbuffer1, subbuffer2, subbuffer3);
+  return true;
+}
+
+/**
+   \brief adds a VertexNormal.
+   \param x The x coordinate of the Normal.
+   \param y The y coordinate of the Normal.
+   \param z The z coordinate of the Normal.
+
+   If a vertexNormal line is found this function will inject it into the vertexNormal-Array
+*/
+bool Model::addVertexNormal(const float x, const float y, const float z)
+{
+  PRINTF(3)("found vertex-Normal %f, %f, %f\n", x, y, z);
+  this->normals->addEntry(x, y, z);
+}
+
+/**
+   \brief parses a vertexTextureCoordinate-String
+   \param vTextureString The String that will be parsed.
+
+   If a vertexTextureCoordinate line is found,
+   this function will inject it into the vertexTexture-Array
+*/
+bool Model::addVertexTexture (char* vTextureString)
+{
+  float subbuffer1;
+  float subbuffer2;
+  sscanf (vTextureString, "%f %f", &subbuffer1, &subbuffer2);
+  PRINTF(3)("found vertex-Texture %f, %f\n", &subbuffer1, &subbuffer2);
+  this->vTexture->addEntry(subbuffer1);
+  this->vTexture->addEntry(subbuffer2);
+  return true;
+}
+
+/**
+   \brief adds a Texture Coordinate
+   \param u The u coordinate of the TextureCoordinate.
+   \param v The y coordinate of the TextureCoordinate.
+
+   If a TextureCoordinate line is found this function will inject it into the TextureCoordinate-Array
+*/
+bool Model::addVertexTexture(const float u, const float v)
+{
+  PRINTF(3)("found vertex-Texture %f, %f\n", u, v);
+  this->vTexture->addEntry(u);
+  this->vTexture->addEntry(v);
+}
+
+/**
+   \brief Function that selects a material, if changed in the obj file.
+   \param matString the Material that will be set.
+*/
+bool Model::addUseMtl (char* matString)
+{
+  /*
+  if (!this->mtlFileName)
+    {
+      PRINTF(4)("Not using new defined material, because no mtlFile found yet\n");
+      return false;
+    }
+  */      
+  if (this->currentGroup->faceCount >0)
+    this->currentGroup->currentFace = this->currentGroup->currentFace->next = new Face;
+  this->initFace (this->currentGroup->currentFace);
+  
+  this->currentGroup->currentFace->materialString = new char[strlen(matString)+1];
+  strcpy (this->currentGroup->currentFace->materialString, matString);
+  
+  if (this->currentGroup->faceCount == 0)
+    this->currentGroup->faceCount ++;
+
+}
+
+/**
+   \brief reads and includes the Faces/Materials into the openGL state Machine
+*/
+bool Model::importToGL (void)
+{
+
+  // finalize the Arrays
+  this->vertices->finalizeArray();
+  this->vTexture->finalizeArray();
+  if (normals->getCount() == 0) // vertices-Array must be built for this
+    this->buildVertexNormals();
+  this->normals->finalizeArray();
+
+  this->currentGroup = this->firstGroup;
+
+  while (this->currentGroup != NULL)
+    {
+
+      // creating a glList for the Group
+      if ((this->currentGroup->listNumber = glGenLists(1)) == 0)
+	{
+	  PRINTF(1)("list could not be created for this Model\n");
+	  return false;
+	}
+      glNewList (this->currentGroup->listNumber, GL_COMPILE);
+
+      // Putting Faces to GL
+      Face* tmpFace = this->currentGroup->firstFace;
+      while (tmpFace != NULL)
+	{
+	  if (tmpFace->vertexCount == 0 && tmpFace->materialString != NULL)
+	    {
+	      if (this->currentGroup->faceMode != -1)
+		glEnd();
+	      this->currentGroup->faceMode = 0;
+	      Material* tmpMat;
+	      if ((tmpMat = material->search(tmpFace->materialString)) != NULL)
+		{
+		  tmpMat->select();
+		  PRINTF(2)("using material %s for coming Faces.\n", tmpFace->materialString);
+		}
+	      else 
+		PRINTF(1)("material %s not found.\n", tmpFace->materialString);
+
+
+	    }
+
+	  else if (tmpFace->vertexCount == 3)
+	    {
+	      if (this->currentGroup->faceMode != 3)
+		{
+		  if (this->currentGroup->faceMode != -1)
+		    glEnd();
+		  glBegin(GL_TRIANGLES);
+		}
+	      
+	      this->currentGroup->faceMode = 3;
+	      PRINTF(3)("found triag.\n");
+	    }
+	  
+	  else if (tmpFace->vertexCount == 4)
+	    {
+	      if (this->currentGroup->faceMode != 4)
+		{
+		  if (this->currentGroup->faceMode != -1)
+		    glEnd();
+		  glBegin(GL_QUADS);
+		}
+	      this->currentGroup->faceMode = 4;
+	      PRINTF(3)("found quad.\n");
+	    }
+	  
+	  else if (tmpFace->vertexCount > 4)
+	    {
+	      if (this->currentGroup->faceMode != -1)
+		glEnd();
+	      glBegin(GL_POLYGON);
+	      PRINTF(3)("Polygon with %i faces found.", tmpFace->vertexCount);
+	      this->currentGroup->faceMode = tmpFace->vertexCount;
+	    }
+	  
+	  FaceElement* tmpElem = tmpFace->firstElem;
+	  while (tmpElem != NULL)
+	    {
+	      //      PRINTF(2)("%s\n", tmpElem->value);
+	      this->addGLElement(tmpElem);
+	      tmpElem = tmpElem->next;
+	    }
+	  tmpFace = tmpFace->next;
+	}
+      glEnd();
+      glEndList();
+
+      this->currentGroup = this->currentGroup->next;
+    } 
+}
+
+/**
+   \brief Adds a Face-element (one vertex of a face) with all its information. 
+   \param elem The FaceElement to add to the OpenGL-environment.
+
+   It does this by searching:
+   1. The Vertex itself
+   2. The VertexNormale
+   3. The VertexTextureCoordinate
+   merging this information, the face will be drawn.
+*/
+bool Model::addGLElement (FaceElement* elem)
+{
+  PRINTF(3)("importing grafical Element to openGL.\n");
+
+  if (elem->texCoordNumber != -1)
+    glTexCoord2fv(this->vTexture->getArray() + elem->texCoordNumber * 2);
+  if (elem->normalNumber != -1)
+    glNormal3fv(this->normals->getArray() + elem->normalNumber * 3);
+  if (elem->vertexNumber != -1)
+    glVertex3fv(this->vertices->getArray() + elem->vertexNumber * 3);
+
+}
+
+/**
+   \brief A routine that is able to create normals.
+
+   The algorithm does the following:
+   1. It calculates creates Vectors for each normale, and sets them to zero.
+   2. It then Walks through a) all the Groups b) all the Faces c) all the FaceElements
+   3. It searches for a points two neighbours per Face, takes Vecotrs to them calculates FaceNormals and adds it to the Points Normal.
+   4. It goes through all the normale-Points and calculates the VertexNormale and includes it in the normals-Array.
+*/
+bool Model::buildVertexNormals ()
+{
+  
+  PRINTF(2)("Normals are being calculated.\n");
+
+  Vector* normArray = new Vector [vertices->getCount()/3];
+  for (int i=0; i<vertices->getCount()/3;i++)
+    normArray[i] = Vector(.0,.0,.0);
+  
+  int firstTouch;
+  int secondTouch;
+  Vector prevV;
+  Vector nextV;
+  Vector curV;
+
+  Group* tmpGroup = firstGroup;
+  while (tmpGroup)
+    {
+      Face* tmpFace = tmpGroup->firstFace;
+      while (tmpFace)
+	{
+	  if (tmpFace->firstElem)
+	    {
+	      FaceElement* firstElem = tmpFace->firstElem;
+	      FaceElement* prevElem;
+	      FaceElement* curElem = firstElem;
+	      FaceElement* nextElem;
+	      FaceElement* lastElem;
+	      // find last Element of the Chain. !! IMPORTANT:the last Element of the Chain must point to NULL, or it will resolv into an infinity-loop.
+	      while (curElem)
+		{
+		  prevElem = curElem;
+		  curElem = curElem->next;
+		}
+	      lastElem = prevElem;
+	      
+	      curElem = firstElem;
+	      for (int j=0; j<tmpFace->vertexCount; j++)
+		{
+		  if (!(nextElem = curElem->next))
+		    nextElem = firstElem;
+		  curElem->normalNumber = curElem->vertexNumber;
+		  
+		  curV = Vector (vertices->getArray()[curElem->vertexNumber*3], vertices->getArray()[curElem->vertexNumber*3+1], vertices->getArray()[curElem->vertexNumber*3+2]);
+		  prevV = Vector (vertices->getArray()[prevElem->vertexNumber*3], vertices->getArray()[prevElem->vertexNumber*3+1], vertices->getArray()[prevElem->vertexNumber*3+2]) - curV;
+		  nextV = Vector (vertices->getArray()[nextElem->vertexNumber*3], vertices->getArray()[nextElem->vertexNumber*3+1], vertices->getArray()[nextElem->vertexNumber*3+2]) - curV;
+		  normArray[curElem->vertexNumber] = normArray[curElem->vertexNumber] + nextV.cross(prevV);
+
+		  prevElem = curElem;
+		  curElem = curElem->next;
+		}
+	    }
+	  tmpFace = tmpFace->next;
+	}
+      tmpGroup = tmpGroup->next;
+    }
+
+  for (int i=0; i<vertices->getCount()/3;i++)
+    {
+      normArray[i].normalize();
+      PRINTF(3)("Found Normale number %d: (%f; %f, %f).\n", i, normArray[i].x, normArray[i].y, normArray[i].z);
+      
+      this->normals->addEntry(normArray[i].x, normArray[i].y, normArray[i].z);
+
+    }
+  delete []normArray; 
+  
+}
+
+
+/**
+   \brief Includes a default model
+
+   This will inject a Cube, because this is the most basic model.
+*/
+void Model::cubeModel(void)
+{
+  this->addVertex ("-0.5 -0.5 0.5");
+  this->addVertex ("0.5 -0.5 0.5");
+  this->addVertex ("-0.5 0.5 0.5");
+  this->addVertex ("0.5 0.5 0.5");
+  this->addVertex ("-0.5 0.5 -0.5");
+  this->addVertex ("0.5 0.5 -0.5");
+  this->addVertex ("-0.5 -0.5 -0.5");
+  this->addVertex ("0.5 -0.5 -0.5");
+
+  this->addVertexTexture ("0.0 0.0");
+  this->addVertexTexture ("1.0 0.0");
+  this->addVertexTexture ("0.0 1.0");
+  this->addVertexTexture ("1.0 1.0");
+  this->addVertexTexture ("0.0 2.0");
+  this->addVertexTexture ("1.0 2.0");
+  this->addVertexTexture ("0.0 3.0");
+  this->addVertexTexture ("1.0 3.0");
+  this->addVertexTexture ("0.0 4.0");
+  this->addVertexTexture ("1.0 4.0");
+  this->addVertexTexture ("2.0 0.0");
+  this->addVertexTexture ("2.0 1.0");
+  this->addVertexTexture ("-1.0 0.0");
+  this->addVertexTexture ("-1.0 1.0");
+
+  this->addVertexNormal ("0.0 0.0 1.0");
+  this->addVertexNormal ("0.0 0.0 1.0");
+  this->addVertexNormal ("0.0 0.0 1.0");
+  this->addVertexNormal ("0.0 0.0 1.0");
+  this->addVertexNormal ("0.0 1.0 0.0");
+  this->addVertexNormal ("0.0 1.0 0.0");
+  this->addVertexNormal ("0.0 1.0 0.0");
+  this->addVertexNormal ("0.0 1.0 0.0");
+  this->addVertexNormal ("0.0 0.0 -1.0");
+  this->addVertexNormal ("0.0 0.0 -1.0");
+  this->addVertexNormal ("0.0 0.0 -1.0");
+  this->addVertexNormal ("0.0 0.0 -1.0");
+  this->addVertexNormal ("0.0 -1.0 0.0");
+  this->addVertexNormal ("0.0 -1.0 0.0");
+  this->addVertexNormal ("0.0 -1.0 0.0");
+  this->addVertexNormal ("0.0 -1.0 0.0");
+  this->addVertexNormal ("1.0 0.0 0.0");
+  this->addVertexNormal ("1.0 0.0 0.0");
+  this->addVertexNormal ("1.0 0.0 0.0");
+  this->addVertexNormal ("1.0 0.0 0.0");
+  this->addVertexNormal ("-1.0 0.0 0.0");
+  this->addVertexNormal ("-1.0 0.0 0.0");
+  this->addVertexNormal ("-1.0 0.0 0.0");
+  this->addVertexNormal ("-1.0 0.0 0.0");
+
+  /* normaleLess-testingMode
+  this->addFace ("1 2 4 3");
+  this->addFace ("3 4 6 5");
+  this->addFace ("5 6 8 7");
+  this->addFace ("7 8 2 1");
+  this->addFace ("2 8 6 4");
+  this->addFace ("7 1 3 5");
+  */
+
+  this->addFace ("1/1/1 2/2/2 4/4/3 3/3/4");
+  this->addFace ("3/3/5 4/4/6 6/6/7 5/5/8");
+  this->addFace ("5/5/9 6/6/10 8/8/11 7/7/12");
+  this->addFace ("7/7/13 8/8/14 2/10/15 1/9/16");
+  this->addFace ("2/2/17 8/11/18 6/12/19 4/4/20");
+  this->addFace ("7/13/21 1/1/22 3/3/23 5/14/24");
+
+}
+
+/**
+   \brief Builds a Sphere into the Model
+*/
+void Model::sphereModel()
+{
+  int detail = 30;
+  if (detail <= 0) detail = 1;
+  float df = (float)detail;
+  for (float i = 0.0; i < df/2; i+=1.0)
+    {
+      for (float j = 0.0; j < df; j+=1.0)
+      {
+	float vz = i/df *2.0*PI - PI/2.0;
+	this->addVertex(cos(j/df*2.0*PI) * cos(vz) ,
+			sin(j/df*2.0*PI) * cos(vz),
+			sin(vz));
+	//if (j==0.0)
+	//printf ("%f %f\n", vz, sin (vz));
+	if (i==0.0)
+		  printf("%f, %f\n", j/df*2.0*PI, cos(j/df*PI));
+      }
+    }
+  vertices->debug();
+  for (int i = 0; i < detail/2; i++)
+    for (int j = 1; j < detail; j++)
+      {
+	unsigned int v1,v2,v3,v4;
+	v1 = i*detail +j;
+
+	/*	if (j+1 == detail)
+	  {
+	    v2 = i*detail +1;
+	    v3 = i*detail+detail + 1;
+	  }
+	  else*/
+	  {
+	    v2 = i*detail +j+1;
+	    v3 = i*detail+detail + j+1;
+	  }
+	v4 = i*detail+detail + j;
+	//printf("%i %i %i %i\n", v1, v2, v3, v4);
+	this->addFace(4, 0, v1, v2, v3, v4);
+      }
+}
+
+/**
+   \brief Creates a Cylinder.
+*/
+void Model::cylinderModel(void)
+{
+  unsigned int detail = 20;
+  float size = 1.0;
+
+  // check if devision by zero
+  if (detail <= 3)
+    detail = 3;
+  int count = 0;
+  // defining Points of the Cylinder.
+  for (float phi = 0.0; phi < 2.0*PI; phi += 2.0*PI/(float)detail)
+    {
+      this->addVertex(size*cos(phi), size*sin(phi), -size);
+      this->addVertex(size*cos(phi), size*sin(phi), size);
+      count ++;
+    }
+  this->addVertex(0, 0, -size);
+  this->addVertex(0, 0, size);
+
+  
+  if (count != detail)
+    PRINTF(1)("calculation error, count should be %d but is %d.\n", detail, count);
+  vertices->debug();
+
+  // adding Faces
+  for (int i = 0; i < detail-1; i++)
+    {
+      int p1, p2, p3, p4;
+      p1 = 2*i+1;
+      p2 = 2*i+2;
+      if (i <= detail);
+      p3 = 2*i+4;
+      p4 = 2*i+3;
+      // something is wrong here
+      this->addFace(4, 0, p1, p2, p3, p4);
+      this->addFace(3, 0, p4, p1, 2*detail+1);
+      this->addFace(3, 0, p2, p3, 2*detail+2);
+    }
+  addFace(4,0, 2*detail-1, 2*detail, 2, 1);
+  this->addFace(3, 0, 1, 2*detail-1, 2*detail+1);
+  this->addFace(3, 0, 2*detail, 2, 2*detail+2);
+
+}
Index: /orxonox/branches/trackManager/src/lib/graphics/importer/model.h
===================================================================
--- /orxonox/branches/trackManager/src/lib/graphics/importer/model.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/graphics/importer/model.h	(revision 3498)
@@ -0,0 +1,120 @@
+/*!
+  \file model.h
+  \brief Contains the Model Class that handles 3D-Models
+*/
+
+#ifndef _MODEL_H
+#define _MODEL_H
+
+#include "material.h"
+
+// FORWARD DEFINITION //
+class Array;
+class Vector;
+
+using namespace std;
+
+//! Specification of different primitives the Model knows
+enum PRIMITIVE {PLANE, CUBE, SPHERE, CYLINDER};
+
+//! Class that handles 3D-Models. it can also read them in and display them.
+class Model
+{
+ public:
+  Model(void);
+  Model(PRIMITIVE type);
+  Model(char* modelName);
+  virtual ~Model(void);
+
+  void setName(const char* name);
+  
+  void draw(void) const;
+  void draw(int groupNumber) const;
+  void draw(char* groupName) const;
+  int getGroupCount() const;
+
+ protected:
+  char* name;            //!< This is the name of the Model.
+  bool finalized;        //!< Sets the Object to be finalized.
+  
+  //! This is the placeholder of one Vertex beloning to a Face.
+  struct FaceElement
+  {
+    int vertexNumber;    //!< The number of the Vertex out of the Array* vertices, this vertex points to.
+    int normalNumber;    //!< The number of the Normal out of the Array* normals, this vertex points to.
+    int texCoordNumber;  //!< The number of the textureCoordinate out of the Array* vTexture, this vertex points to.
+    FaceElement* next;   //!< Point to the next FaceElement in this List.
+  };
+
+  //! This is the placeholder of a Face belonging to a Group of Faces.
+  struct Face
+  {
+    int vertexCount;        //!< The Count of vertices this Face has.
+    FaceElement* firstElem; //!< Points to the first Vertex (FaceElement) of this Face.
+
+    char* materialString;   //!< The Name of the Material to which to Change.
+
+    Face* next;             //!< Pointer to the next Face.
+  }; 
+
+  //! Group to handle multiple Models per obj-file.
+  struct Group
+  {
+    char* name;         //!< the Name of the Group. this is an identifier, that can be accessed via the draw (char* name) function.
+
+    unsigned int listNumber;//!< The number of the GL-List this Group gets.
+    Face* firstFace;    //!< The first Face in this group.
+    Face* currentFace;  //!< The current Face in this Group (the one we are currently working with.)
+    int faceMode;       //!< The Mode the Face is in: initially -1, 0 for FaceList opened, 1 for Material,  3 for triangle, 4 for Quad, 5+ for Poly \todo ENUM...
+    int faceCount;      //!< The Number of Faces this Group holds.
+
+    Group* next;        //!< Pointer to the next Group.
+  };
+
+
+  Array* vertices;      //!< The Array that handles the Vertices.
+  int verticesCount;    //!< A global Counter for vertices.
+  Array* normals;       //!< The Array that handles the Normals.
+  Array* vTexture;      //!< The Array that handles the VertexTextureCoordinates.
+
+  
+  Group* firstGroup;    //!< The first of all groups.
+  Group* currentGroup;  //!< The currentGroup. this is the one we will work with.
+  int groupCount;       //!< The Count of Groups.
+
+  Material* material;   //!< Initial pointer to the Material. This can hold many materials, because Material can be added with Material::addMaterial(..)
+  float scaleFactor;    //!< The Factor with which the Model should be scaled. \todo maybe one wants to scale the Model after Initialisation
+
+  bool initialize(void);
+  bool initGroup(Group* group);
+  bool initFace (Face* face);
+  bool cleanup(void);
+  bool cleanupGroup(Group* group);
+  bool cleanupFace(Face* face);
+  bool cleanupFaceElement(FaceElement* faceElem);
+
+ public:
+  bool addGroup(char* groupString);
+  bool addVertex(char* vertexString);
+  bool addVertex(const float x, const float y, const float z);
+  bool addFace(char* faceString);
+  bool addFace(const float faceElemCount, int type, ...);
+  bool addVertexNormal(char* normalString);
+  bool addVertexNormal(const float x, const float y, const float z);
+  bool addVertexTexture(char* vTextureString);
+  bool addVertexTexture(const float u, const float v);
+  bool addUseMtl(char* mtlString);
+  void finalize(void);
+
+ protected:
+  bool importToGL(void);
+  bool addGLElement(FaceElement* elem);
+
+  bool buildVertexNormals(void);
+
+  void cubeModel(void);
+  void sphereModel(void);
+  void cylinderModel(void);
+};
+
+#endif
Index: /orxonox/branches/trackManager/src/lib/graphics/importer/objModel.cc
===================================================================
--- /orxonox/branches/trackManager/src/lib/graphics/importer/objModel.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/graphics/importer/objModel.cc	(revision 3498)
@@ -0,0 +1,307 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+   co-programmer: ...
+*/
+
+#include "objModel.h"
+
+#include <fstream>
+
+#include "debug.h"
+
+/**
+   \brief Crates a 3D-Model and loads in a File.
+   \param fileName file to parse and load (must be a .obj file)
+*/
+OBJModel::OBJModel(char* fileName)
+{
+  this->initializeOBJ();
+
+  this->importFile (fileName);
+
+  this->importToGL ();
+
+  this->cleanup();
+}
+
+/**
+   \brief Crates a 3D-Model, loads in a File and scales it.
+   \param fileName file to parse and load (must be a .obj file)
+   \param scaling The factor that the model will be scaled with.
+*/
+OBJModel::OBJModel(char* fileName, float scaling)
+{
+  this->initializeOBJ();
+  this->scaleFactor = scaling;
+
+  this->importFile (fileName);
+
+  this->importToGL ();
+
+  this->cleanup();
+}
+
+/**
+   \brief deletes an OBJModel.
+
+   Looks if any from model allocated space is still in use, and if so deleted it.
+*/
+OBJModel::~OBJModel()
+{
+  PRINTF(4)("Deleting the obj-names\n");
+  if (this->objPath)
+    delete []this->objPath;
+  if (this->objFileName)
+    delete []this->objFileName;
+  if (this->mtlFileName)
+    delete []this->mtlFileName;
+}
+
+/**
+   \brief Initializes an obj-model
+*/
+void OBJModel::initializeOBJ(void)
+{
+  this->objPath = NULL;
+  this->objFileName = NULL;
+  this->mtlFileName = NULL;
+
+  this->initialize();
+}
+
+/**
+   \brief Imports a obj file and handles the the relative location
+   \param fileName The file to import
+*/
+bool OBJModel::importFile (char* fileName)
+{
+  PRINTF(3)("preparing to read in file: %s\n", fileName);
+
+
+#ifdef __WIN32__
+  // win32 path reading
+  char pathSplitter= '\\';
+#else /* __WIN32__ */
+  // unix path reading
+  char pathSplitter='/';
+#endif /* __WIN32__ */
+  char* tmpName = fileName;
+  if (tmpName[0] == pathSplitter)
+    tmpName++;
+  char* name = tmpName;
+  while (( tmpName = strchr (tmpName+1, pathSplitter)))
+    {
+      name = tmpName+1;
+    }
+  this->objPath = new char[name-fileName+1];
+  strncpy(this->objPath, fileName, name-fileName);
+  this->objPath[name-fileName] = '\0';
+  if (verbose>=2)
+    if (strlen(objPath)> 0)
+      PRINTF(0)("Resolved file %s to folder: %s.\n", name, objPath);
+    else
+      PRINTF(0)("Resolved file %s.\n", name);
+  
+  this->setName(name);
+  if (this->material)
+    this->material->addTexturePath(this->objPath);
+  this->objFileName = new char[strlen(name)+1];
+  strcpy (this->objFileName, name);
+  this->readFromObjFile ();
+  return true;
+}
+
+/**
+   \brief Reads in the .obj File and sets all the Values.
+   This function does read the file, parses it for the occurence of things like vertices, faces and so on, and executes the specific tasks
+*/
+bool OBJModel::readFromObjFile (void)
+{
+  char* fileName = new char [strlen(objPath)+strlen(objFileName)+1];
+  if (this->objFileName != NULL && !strcmp(this->objFileName, ""))
+    return false;
+  strcpy(fileName, this->objPath);
+  strcat(fileName, this->objFileName);
+
+  ifstream* OBJ_FILE = new ifstream(fileName);
+  if (OBJ_FILE->fail())
+    {
+      PRINTF(1)("unable to open .OBJ file: %s\n Loading cube-Model instead.\n", fileName);
+      cubeModel();
+      OBJ_FILE->close();
+      delete []fileName;
+      delete OBJ_FILE;
+      return false;
+    }
+  PRINTF(2)("Reading from opened file %s\n", fileName);
+  char Buffer[10000];
+  while(!OBJ_FILE->eof())
+    {
+      OBJ_FILE->getline(Buffer, 10000);
+      PRINTF(3)("Read input line: %s\n", Buffer);
+      
+
+      // case vertice
+      if (!strncmp(Buffer, "v ", 2))
+	{
+	  this->addVertex(Buffer+2);
+	}
+
+      // case face
+      else if (!strncmp(Buffer, "f ", 2))
+	{
+	  this->addFace (Buffer+2);
+	}
+      
+      else if (!strncmp(Buffer, "mtllib ", 7))
+	{
+	  this->readMtlLib (Buffer+7);
+	}
+
+      else if (!strncmp(Buffer, "usemtl ", 7))
+	{
+	  this->addUseMtl (Buffer+7);
+	}
+
+      // case VertexNormal
+      else if (!strncmp(Buffer, "vn ", 3))
+	{
+	  this->addVertexNormal(Buffer+3);
+	}
+      
+      // case VertexTextureCoordinate
+      else if (!strncmp(Buffer, "vt ", 3))
+	{
+	  this->addVertexTexture(Buffer+3);
+	}
+      // case group
+      else if (!strncmp(Buffer, "g ", 2))
+	{
+	  this->addGroup (Buffer+2);
+	}
+      else if (!strncmp(Buffer, "s ", 2)) //! \todo smoothing groups have to be implemented
+	{
+	  if (verbose >= 2)
+	    PRINTF(2)("smoothing groups not supportet yet. line: %s\n", Buffer);
+	}
+    }
+  OBJ_FILE->close();
+  delete OBJ_FILE;
+  delete []fileName;
+  return true;
+
+}
+
+/** 
+    \brief Function to read in a mtl File.
+    \param mtlFile The .mtl file to read
+
+    This Function parses all Lines of an mtl File.
+    The reason for it not to be in the materials-class is,
+    that a material does not have to be able to read itself in from a File.
+
+*/
+bool OBJModel::readMtlLib (char* mtlFile)
+{
+  this->mtlFileName = new char [strlen(mtlFile)+1];
+  strcpy(this->mtlFileName, mtlFile);
+  char* fileName = new char [strlen(objPath) + strlen(this->mtlFileName)+1];
+  strcpy(fileName, this->objPath);
+  strcat(fileName, this->mtlFileName);
+  
+
+  PRINTF(3)("Opening mtlFile: %s\n", fileName);
+
+  ifstream* MTL_FILE = new ifstream (fileName);
+  if (MTL_FILE->fail())
+    {
+      PRINTF(1)("unable to open file: %s\n", fileName);
+      MTL_FILE->close();
+      delete []fileName;
+      delete MTL_FILE;
+      return false;
+    }
+  char Buffer[500];
+  Material* tmpMat = material;
+  while(!MTL_FILE->eof())
+    {
+      MTL_FILE->getline(Buffer, 500);
+      PRINTF(4)("found line in mtlFile: %s\n", Buffer);
+      
+
+      // create new Material
+      if (!strncmp(Buffer, "newmtl ", 7))
+	{
+	  tmpMat = tmpMat->addMaterial(Buffer+7);
+	  //	  PRINTF(2)("%s, %p\n", tmpMat->getName(), tmpMat);
+	}
+      // setting a illumMode
+      else if (!strncmp(Buffer, "illum ", 6))
+	{
+	  tmpMat->setIllum(Buffer+6);
+
+	}
+      // setting Diffuse Color
+      else if (!strncmp(Buffer, "Kd ", 3))
+	{
+	  tmpMat->setDiffuse(Buffer+3);
+	}
+      // setting Ambient Color
+      else if (!strncmp(Buffer, "Ka ", 3))
+	{
+	  tmpMat->setAmbient(Buffer+3);
+	}
+      // setting Specular Color
+      else if (!strncmp(Buffer, "Ks ", 3))
+	{
+	  tmpMat->setSpecular(Buffer+3);
+	}
+      // setting The Specular Shininess
+      else if (!strncmp(Buffer, "Ns ", 3))
+	{
+	  tmpMat->setShininess(Buffer+3);
+	}
+      // setting up transparency
+      else if (!strncmp(Buffer, "d ", 2))
+	{
+	  tmpMat->setTransparency(Buffer+2);
+	}
+      else if (!strncmp(Buffer, "Tf ", 3))
+	{
+	  tmpMat->setTransparency(Buffer+3);
+	}
+      
+      else if (!strncmp(Buffer, "map_Kd ", 7))
+	{
+	  tmpMat->setDiffuseMap(Buffer+7);
+	}
+      else if (!strncmp(Buffer, "map_Ka ", 7))
+	{
+	  tmpMat->setAmbientMap(Buffer+7);
+	}
+      else if (!strncmp(Buffer, "map_Ks ", 7))
+	{
+	  tmpMat->setSpecularMap(Buffer+7);
+	}
+      else if (!strncmp(Buffer, "bump ", 5))
+	{
+	  tmpMat->setBump(Buffer+7);
+	}
+     
+
+    }
+  MTL_FILE->close();
+  delete []fileName;
+  delete MTL_FILE;
+  return true;
+}
Index: /orxonox/branches/trackManager/src/lib/graphics/importer/objModel.h
===================================================================
--- /orxonox/branches/trackManager/src/lib/graphics/importer/objModel.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/graphics/importer/objModel.h	(revision 3498)
@@ -0,0 +1,33 @@
+/*!
+  \file objModel.h
+  \brief Contains the OBJ-model Class, that reads in a Model from a .obj-file
+*/
+
+#ifndef _OBJMODEL_H
+#define _OBJMODEL_H
+
+#include "model.h"
+
+//! A Class, that handles the parsing of an obj-file, and inclusion as a Model.
+class OBJModel : public Model
+{
+ public:
+  OBJModel(char* fileName);
+  OBJModel(char* fileName, float scaling);
+  virtual ~OBJModel();
+  void initializeOBJ(void);
+
+ private:
+  // Variables
+  char* objPath;        //!< The Path where the obj and mtl-file are located.
+  char* objFileName;    //!< The Name of the obj-file.
+  char* mtlFileName;    //!< The Name of the mtl-file (parsed out of the obj-file)
+
+  ///// readin /////
+  bool importFile (char* fileName);
+  bool readFromObjFile (void);
+  bool readMtlLib (char* matFile);
+
+};
+
+#endif /* _OBJ_MODEL_H */
Index: /orxonox/branches/trackManager/src/lib/graphics/importer/texture.cc
===================================================================
--- /orxonox/branches/trackManager/src/lib/graphics/importer/texture.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/graphics/importer/texture.cc	(revision 3498)
@@ -0,0 +1,942 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+   co-programmer: ...
+
+   TGA-code: borrowed from nehe-Tutorials
+
+*/
+
+
+#include "texture.h"
+
+// headers only for PathList
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdlib.h>
+#include <fstream>
+
+/**
+   \brief creates a ned PathList.
+   
+   It is a good idea to use this as an initial List,
+   because if you give on a name the Path will not be checked for its existence.
+*/
+PathList::PathList()
+{
+  this->pathName = NULL;
+  this->next = NULL;
+}
+
+/**
+   \brief Creates a new PathList with a Name.
+   \param pName the Name of The Path.
+
+   This function just adds the Path without checking if it exists.
+*/
+PathList::PathList(char* pName)
+{
+  this->pathName = new char [strlen(pName)+1];
+  strcpy (this->pathName, pName);
+  this->next = NULL;
+}
+
+/**
+   \brief destroys a PathList
+
+   It does this by deleting the Name and then delete its preceding PathList.
+*/
+PathList::~PathList()
+{
+  if (this->pathName)
+    delete []this->pathName;
+  if (this->next)
+    delete this->next;
+}
+
+PathList* PathList::firstPath = NULL;
+
+/**
+   \returns A Pointer to the first Path of the Pathlist
+*/
+PathList* PathList::getInstance(void)
+{
+  if (firstPath)
+    return firstPath;
+  firstPath = new PathList();
+}
+/**
+   \brief Adds a new Pathlist Element.
+   \param pName
+   
+   Adding a Path automatically checks if the Path exists,
+   and if it does not it will not add it to the List.
+*/
+void PathList::addPath (char* pName)
+{
+  if (pName[0] == '\0')
+    {
+      PRINTF(3)("not Adding empty Path to the List.\n");
+      return;
+    }
+  char* tmpPName = new char[strlen(pName)];
+  strncpy(tmpPName, pName, strlen(pName)-1);
+  tmpPName[strlen(pName)-1] = '\0';
+  if (access (tmpPName, F_OK) == 0)
+    {
+      struct stat status;
+      stat(tmpPName, &status);
+      if (status.st_mode & S_IFDIR)
+	{
+	  PRINTF(2)("Adding Path %s to the PathList.\n", pName);
+	  PathList* tmpPathList = this;
+	  while (tmpPathList->next)
+	    tmpPathList = tmpPathList->next;
+	  tmpPathList->next = new PathList(pName);
+	}
+      else
+	PRINTF(2)("You tried to add non-folder %s to a PathList.\n", tmpPName);
+    }
+  else
+      PRINTF(2)("You tried to add non-existing folder %s to a PathList.\n", tmpPName);
+  delete []tmpPName;
+}
+
+
+
+/**
+   \brief Constructor for a Texture
+*/
+Texture::Texture(void)
+{
+  this->pImage = new Image;
+  this->pImage->data = NULL;
+  this->map = NULL;
+  this->texture = 0;
+}
+
+/**
+   \brief Destructor of a Texture
+   
+   Frees Data, and deletes the textures from GL
+*/
+Texture::~Texture(void)
+{
+  if (this->pImage->data)
+    delete []this->pImage->data;
+  delete pImage;
+  if (this->texture)
+    glDeleteTextures(1, &this->texture);
+}
+
+/**
+   \brief Searches for a Texture inside one of the defined Paths
+   \param texName The name of the texture o search for.
+   \returns pathName+texName if texName was found in the pathList. NULL if the Texture is not found.
+*/
+char* Texture::searchTextureInPaths(char* texName) const
+{
+  char* tmpName = NULL;
+  PathList* pList = PathList::getInstance();
+  while (pList)
+    {
+      if (pList->pathName)
+	{
+	  tmpName = new char [strlen(pList->pathName)+strlen(texName)+1];
+	  strcpy(tmpName, pList->pathName);
+	}
+      else
+	{
+	  tmpName = new char [strlen(texName)+1];
+	  tmpName[0]='\0';
+	}
+      strcat(tmpName, texName);
+      if (access (tmpName, F_OK) == 0)
+	return tmpName;
+      
+      if (tmpName)
+	delete []tmpName;
+      tmpName = NULL;
+      pList = pList->next;
+    }
+  return NULL;
+}
+
+/**
+   \brief a Simple function that switches two char values
+   \param a The first value
+   \param b The second value
+*/
+inline void Texture::swap (unsigned char &a, unsigned char &b)
+{
+  unsigned char temp;
+  temp = a;
+  a    = b;
+  b    = temp;
+}
+
+
+/**
+   \brief Loads a Texture to the openGL-environment.
+   \param pImage The Image to load to openGL
+*/
+bool Texture::loadTexToGL (Image* pImage)
+{
+  PRINTF(2)("Loading texture to OpenGL-Environment.\n");
+  glGenTextures(1, &this->texture);
+  glBindTexture(GL_TEXTURE_2D, this->texture);
+  /* not Working, and not needed. 
+  glTexImage2D( GL_TEXTURE_2D, 0, 3, width,
+		height, 0, GL_BGR,
+		GL_UNSIGNED_BYTE, map->pixels );
+  */ 
+  gluBuild2DMipmaps(GL_TEXTURE_2D, 3, pImage->width, pImage->height, pImage->format, GL_UNSIGNED_BYTE, pImage->data);
+  
+  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
+  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR_MIPMAP_LINEAR);	
+}
+
+
+#ifdef HAVE_SDL_SDL_IMAGE_H
+bool Texture::loadImage(char* imageName)
+{
+  char* imgNameWithPath = searchTextureInPaths(imageName);
+  if (imgNameWithPath)
+    {
+      this->map=IMG_Load(imgNameWithPath);
+      if(!map)
+	{
+	  PRINTF(1)("IMG_Load: %s\n", IMG_GetError());
+	  return false;
+	}
+      pImage->height = map->h;
+      pImage->width  = map->w;
+      pImage->data   = (GLubyte*)map->pixels;
+      pImage->bpp    = map->format->BytesPerPixel;
+      if (pImage->bpp == 3)
+	pImage->format = GL_RGB;
+      else if (pImage->bpp == 4)
+	pImage->format = GL_RGBA;
+	  
+      PRINTF(0)("Bits Per Pixel: %d\n", pImage->bpp);
+      if( !IMG_isPNG(SDL_RWFromFile(imgNameWithPath, "rb")) && !IMG_isJPG(SDL_RWFromFile(imgNameWithPath, "rb")))
+	for (int i=0;i<map->h * map->w *3;i+=3)
+	  { 
+	    GLuint temp = pImage->data[i];
+	    pImage->data[i] = pImage->data[i+2];
+	    pImage->data[i+2] = temp;
+	  }
+      /* this is the real swapping algorithm */
+      for( int i = 0 ; i < (pImage->height / 2) ; ++i )
+	for( int j = 0 ; j < pImage->width * pImage->bpp; j += pImage->bpp )
+	  for(int k = 0; k < pImage->bpp; ++k)
+	    swap( pImage->data[ (i * pImage->width * pImage->bpp) + j + k], pImage->data[ ( (pImage->height - i - 1) * pImage->width * pImage->bpp ) + j + k]);
+ 
+      this->loadTexToGL (this->pImage);
+      SDL_FreeSurface(map);
+      this->pImage->data = NULL;
+    }
+  else
+    {
+      PRINTF(1)("Image not Found: %s\n", imgNameWithPath);
+      return false;
+    }
+}
+
+
+#else /* HAVE_SDL_SDL_IMAGE_H */
+/**
+   \brief Makes the Programm ready to Read-in a texture-File
+   1. Checks what type of Image should be imported
+   \todo Checks where to find the Image
+*/
+bool Texture::loadImage(char* imageName)
+{
+  char* imgNameWithPath = searchTextureInPaths(imageName);
+  if (imgNameWithPath)
+    {
+      if (!strncmp(imgNameWithPath+strlen(imgNameWithPath)-4, ".bmp", 4))
+	{
+	  PRINTF(3)("Requested bmp-image. Trying to Import.\n");
+	  return this->loadBMP(imgNameWithPath);
+	}
+      
+      else if (!strncmp(imgNameWithPath+strlen(imgNameWithPath)-4, ".jpg", 4) || !strncmp(imgNameWithPath+strlen(imgNameWithPath)-5, ".jpg", 5))
+	{
+	  PRINTF(3)("Requested jpeg-image. Trying to Import\n");
+	  return this->loadJPG(imgNameWithPath);
+	}
+      else if (!strncmp(imgNameWithPath+strlen(imgNameWithPath)-4, ".tga", 4))
+	{
+	  PRINTF(3)("Requested tga-image. Trying to Import\n");
+	  return this->loadTGA(imgNameWithPath);
+	}
+      else if (!strncmp(imgNameWithPath+strlen(imgNameWithPath)-4, ".png", 4))
+	{
+	  PRINTF(3)("Requested png-image. Trying to Import\n");
+	  return this->loadPNG(imgNameWithPath);
+	}
+      else
+	{
+	  PRINTF(1)("Requested Image was not recognized in its type. (Maybe a type-Cast-error.)\n FileName: %s", imgNameWithPath);
+	  return false;
+	}
+    }
+  else
+    {
+      PRINTF(1)("Image not Found: %s\n", imgNameWithPath);
+      return false;
+    }
+}
+
+/**
+   \brief reads in a Windows BMP-file, and imports it to openGL.
+   \param bmpName The name of the Image to load.
+*/
+bool Texture::loadBMP (char* bmpName)
+{
+  FILE *file;
+  unsigned long size;                 // size of the image in bytes.
+  unsigned long i;                    // standard counter.
+  unsigned short int planes;          // number of planes in image (must be 1) 
+  unsigned short int bpp;             // number of bits per pixel (must be 24)
+  GLuint temp;                          // temporary color storage for bgr-rgb conversion.
+
+  // make sure the file is there.
+  if ((file = fopen(bmpName, "rb"))==NULL)
+    {
+      PRINTF(1)("File Not Found : %s\n",bmpName);
+      return false;
+    }
+  // seek through the bmp header, up to the width/height:
+  fseek(file, 18, SEEK_CUR);
+  
+  // read the width
+  if ((i = fread(&pImage->width, 4, 1, file)) != 1) 
+    {
+      PRINTF(1)("Error reading width from %s.\n", bmpName);
+      return false;
+    }
+  // read the height 
+  if ((i = fread(&pImage->height, 4, 1, file)) != 1) 
+    {
+      PRINTF(1)("Error reading height from %s.\n", bmpName);
+      return false;
+    }
+  
+  // calculate the size (assuming 24 bits or 3 bytes per pixel).
+  size = pImage->width * pImage->height * 3;
+  
+  // read the planes
+  if ((fread(&planes, 2, 1, file)) != 1) 
+    {
+      PRINTF(1)("Error reading planes from %s.\n", bmpName);
+      return false;
+    }
+  if (planes != 1) 
+    {
+      PRINTF(1)("Planes from %s is not 1: %u\n", bmpName, planes);
+      return false;
+    }
+  
+  // read the bpp
+  if ((i = fread(&bpp, 2, 1, file)) != 1) 
+    {
+      PRINTF(1)("Error reading bpp from %s.\n", bmpName);
+      return false;
+    }
+  if (bpp != 24) 
+    {
+      PRINTF(1)("Bpp from %s is not 24: %u\n", bmpName, bpp);
+      return false;
+    }
+  
+  // seek past the rest of the bitmap header.
+  fseek(file, 24, SEEK_CUR);
+  
+  // read the data. 
+  pImage->data = (GLubyte *) malloc(size);
+  if (pImage->data == NULL) 
+    {
+      PRINTF(1)("Error allocating memory for color-corrected image data");
+      return false;	
+    }
+  
+  if ((i = fread(pImage->data, size, 1, file)) != 1) 
+    {
+      PRINTF(1)("Error reading image data from %s.\n", bmpName);
+      return false;
+    }
+  fclose(file);
+
+  // reverse all of the colors. (bgr -> rgb)
+  for (i=0;i<size;i+=3) 
+    { 
+      temp = pImage->data[i];
+      pImage->data[i] = pImage->data[i+2];
+      pImage->data[i+2] = temp;
+    }
+  this->loadTexToGL (pImage);
+  
+
+  if (pImage)
+    {
+      if (pImage->data)
+	{
+	  free(pImage->data);
+	}
+      
+      free(pImage);
+    }
+  return true;
+
+}
+
+/**
+   \brief reads in a jpg-file
+   \param jpgName the Name of the Image to load
+*/
+bool Texture::loadJPG (char* jpgName)
+{
+#ifdef HAVE_JPEGLIB_H
+  struct jpeg_decompress_struct cinfo;
+  Image *pImage = NULL;
+  FILE *pFile;
+  
+  // Open a file pointer to the jpeg file and check if it was found and opened 
+  if((pFile = fopen(jpgName, "rb")) == NULL) 
+    {
+      // Display an error message saying the file was not found, then return NULL
+      PRINTF(1)("Unable to load JPG File %s.\n", jpgName);
+      return false;
+    }
+  
+  // Create an error handler
+  jpeg_error_mgr jerr;
+  
+  // Have our compression info object point to the error handler address
+  cinfo.err = jpeg_std_error(&jerr);
+  
+  // Initialize the decompression object
+  jpeg_create_decompress(&cinfo);
+  
+  // Specify the data source (Our file pointer)	
+  jpeg_stdio_src(&cinfo, pFile);
+  
+  // Allocate the structure that will hold our eventual jpeg data (must free it!)
+  pImage = (Image*)malloc(sizeof(Image));
+  
+  // DECOFING
+  // Read in the header of the jpeg file
+  jpeg_read_header(&cinfo, TRUE);
+  
+  // Start to decompress the jpeg file with our compression info
+  jpeg_start_decompress(&cinfo);
+  
+  // Get the image dimensions and row span to read in the pixel data
+  pImage->rowSpan = cinfo.image_width * cinfo.num_components;
+  pImage->width   = cinfo.image_width;
+  pImage->height   = cinfo.image_height;
+  
+  // Allocate memory for the pixel buffer
+  pImage->data = new unsigned char[pImage->rowSpan * pImage->height];
+  
+  // Here we use the library's state variable cinfo.output_scanline as the
+  // loop counter, so that we don't have to keep track ourselves.
+  
+  // Create an array of row pointers
+  unsigned char** rowPtr = new unsigned char*[pImage->height];
+  for (int i = 0; i < pImage->height; i++)
+    rowPtr[i] = &(pImage->data[i*pImage->rowSpan]);
+  
+  // Now comes the juice of our work, here we extract all the pixel data
+  int rowsRead = 0;
+  while (cinfo.output_scanline < cinfo.output_height) 
+    {
+      // Read in the current row of pixels and increase the rowsRead count
+      rowsRead += jpeg_read_scanlines(&cinfo, &rowPtr[rowsRead], cinfo.output_height - rowsRead);
+    }
+  
+  // Delete the temporary row pointers
+  delete [] rowPtr;
+  
+  // Finish decompressing the data
+  jpeg_finish_decompress(&cinfo);//  decodeJPG(&cinfo, pImage);
+  
+  // This releases all the stored memory for reading and decoding the jpeg
+  jpeg_destroy_decompress(&cinfo);
+  
+  // Close the file pointer that opened the file
+  fclose(pFile);
+  
+
+  if(pImage == NULL)
+    exit(0);
+  
+  this->loadTexToGL (pImage);
+  if (pImage)
+    {
+      if (pImage->data)
+	{
+	  free(pImage->data);
+	}
+      
+      free(pImage);
+    }
+  return true;
+#else /* HAVE_JPEGLIB_H */
+  PRINTF(1)("sorry, but you did not compile with jpeg-support.\nEither install SDL_image or jpeglib, and recompile to see the image\n");
+  return false;
+#endif /* HAVE_JPEGLIB_H */
+
+}
+
+/**
+   \brief reads in a tga-file
+   \param tgaName the Name of the Image to load
+*/
+bool Texture::loadTGA(const char * tgaName)
+{
+  typedef struct
+  {
+    GLubyte Header[12];
+  } TGAHeader;
+  TGAHeader tgaHeader;			
+  
+  GLubyte uTGAcompare[12] = {0,0,2, 0,0,0,0,0,0,0,0,0};	// Uncompressed TGA Header 
+  GLubyte cTGAcompare[12] = {0,0,10,0,0,0,0,0,0,0,0,0};	// Compressed TGA Header 
+  FILE * fTGA;
+  fTGA = fopen(tgaName, "rb");
+
+  if(fTGA == NULL)
+    {
+      PRINTF(1)("Error could not open texture file: %s\n", tgaName);
+      return false;
+    }
+  
+  if(fread(&tgaHeader, sizeof(TGAHeader), 1, fTGA) == 0)
+    {
+      PRINTF(1)("Error could not read file header of %s\n", tgaName);
+      if(fTGA != NULL)
+	{
+	  fclose(fTGA);
+	}
+      return false;
+    }
+  
+  if(memcmp(uTGAcompare, &tgaHeader, sizeof(TGAHeader)) == 0)
+    {
+      loadUncompressedTGA(tgaName, fTGA);
+      if (fTGA)
+	fclose (fTGA);
+    }
+  else if(memcmp(cTGAcompare, &tgaHeader, sizeof(TGAHeader)) == 0)
+    {
+      loadCompressedTGA(tgaName, fTGA);
+	if (fTGA)
+	  fclose (fTGA);
+    }
+  else
+    {
+      PRINTF(1)("Error TGA file be type 2 or type 10\n");
+      if (fTGA)
+	fclose(fTGA);
+      return false;
+    }
+  return true;
+}
+
+/**
+   \brief reads in an uncompressed tga-file
+   \param filename the Name of the Image to load
+   \param fTGA a Pointer to a File, that should be read
+*/
+bool Texture::loadUncompressedTGA(const char * filename, FILE * fTGA)
+{
+  GLubyte header[6];      // First 6 Useful Bytes From The Header 
+  GLuint  bytesPerPixel;  // Holds Number Of Bytes Per Pixel Used In The TGA File 
+  GLuint  imageSize;	  // Used To Store The Image Size When Setting Aside Ram 
+  GLuint  temp;		  // Temporary Variable
+  GLuint  type;
+  GLuint  Height;	  // Height of Image 
+  GLuint  Width;	  // Width of Image 
+  GLuint  Bpp;		  // Bits Per Pixel 
+
+  GLuint cswap;
+  if(fread(header, sizeof(header), 1, fTGA) == 0)
+    {
+      PRINTF(1)("Error could not read info header\n");
+      return false;
+    }
+  
+  Width = pImage->width  = header[1] * 256 + header[0];
+  Height =  pImage->height = header[3] * 256 + header[2];
+  Bpp = pImage->bpp = header[4];
+  // Make sure all information is valid
+  if((pImage->width <= 0) || (pImage->height <= 0) || ((pImage->bpp != 24) && (pImage->bpp !=32)))
+    {
+      PRINTF(1)("Error invalid texture information\n");
+      return false;
+    }
+  
+  if(pImage->bpp == 24)	
+    {
+      pImage->type = GL_RGB;
+    }
+  else
+    {
+      pImage->type = GL_RGBA;
+    }
+  
+  bytesPerPixel	= (Bpp / 8);
+  imageSize = (bytesPerPixel * Width * Height);
+  pImage->data = (GLubyte*) malloc(imageSize);
+  
+  if(pImage->data == NULL)
+    {
+      PRINTF(1)("Error could not allocate memory for image\n");
+      return false;
+    }
+  
+  if(fread(pImage->data, 1, imageSize, fTGA) != imageSize)
+    {
+      PRINTF(1)("Error could not read image data\n");
+      if(pImage->data != NULL)
+	{
+	  free(pImage->data);
+	}
+      return false;
+    }
+  
+  for(cswap = 0; cswap < (int)imageSize; cswap += bytesPerPixel)
+    {
+      pImage->data[cswap] ^= pImage->data[cswap+2] ^=
+	pImage->data[cswap] ^= pImage->data[cswap+2];
+    }
+  
+  this->loadTexToGL (pImage);
+
+  return true;
+}
+
+/**
+   \brief reads in a compressed tga-file
+   \param filename the Name of the Image to load
+   \param fTGA a Pointer to a File, that should be read
+*/
+bool Texture::loadCompressedTGA(const char * filename, FILE * fTGA)
+{
+  GLubyte header[6];      // First 6 Useful Bytes From The Header 
+  GLuint  bytesPerPixel;  // Holds Number Of Bytes Per Pixel Used In The TGA File 
+  GLuint  imageSize;	  // Used To Store The Image Size When Setting Aside Ram 
+  GLuint  temp;		  // Temporary Variable
+  GLuint  type;
+  GLuint  Height;	  // Height of Image 
+  GLuint  Width;	  // Width of Image 
+  GLuint  Bpp;		  // Bits Per Pixel 
+
+  if(fread(header, sizeof(header), 1, fTGA) == 0)
+    {
+      PRINTF(1)("Error could not read info header\n");
+      return false;
+    }
+  
+  Width = pImage->width  = header[1] * 256 + header[0];
+  Height = pImage->height = header[3] * 256 + header[2];
+  Bpp = pImage->bpp	= header[4];
+
+  GLuint pixelcount	= Height * Width;
+  GLuint currentpixel	= 0;
+  GLuint currentbyte	= 0;
+  GLubyte * colorbuffer = (GLubyte *)malloc(bytesPerPixel);
+
+  //Make sure all pImage info is ok 
+  if((pImage->width <= 0) || (pImage->height <= 0) || ((pImage->bpp != 24) && (pImage->bpp !=32)))
+    {
+      PRINTF(1)("Error Invalid pImage information\n");
+      return false;
+    }
+  
+  bytesPerPixel	= (Bpp / 8);
+  imageSize		= (bytesPerPixel * Width * Height);
+  pImage->data	= (GLubyte*) malloc(imageSize);
+  
+  if(pImage->data == NULL)
+    {
+      PRINTF(1)("Error could not allocate memory for image\n");
+      return false;
+    }
+  
+  do
+    {
+      GLubyte chunkheader = 0;
+      
+      if(fread(&chunkheader, sizeof(GLubyte), 1, fTGA) == 0)
+	{
+	  PRINTF(1)("Error could not read RLE header\n");
+	  if(pImage->data != NULL)
+	    {
+	      free(pImage->data);
+	    }
+	  return false;
+	}
+      // If the ehader is < 128, it means the that is the number of RAW color packets minus 1 
+      if(chunkheader < 128)
+	{
+	  short counter;
+	  chunkheader++;
+	  // Read RAW color values
+	  for(counter = 0; counter < chunkheader; counter++)
+	    { 
+	      // Try to read 1 pixel 
+	      if(fread(colorbuffer, 1, bytesPerPixel, fTGA) != bytesPerPixel)
+		{
+		  PRINTF(1)("Error could not read image data\n");
+		  if(colorbuffer != NULL)
+		    {
+		      free(colorbuffer);
+		    }
+		  
+		  if(pImage->data != NULL)
+		    {
+		      free(pImage->data);
+		    }
+		  
+		  return false;	
+		}
+	      // write to memory 
+	      // Flip R and B vcolor values around in the process 
+	      pImage->data[currentbyte	  ] = colorbuffer[2];				    
+	      pImage->data[currentbyte + 1] = colorbuffer[1];
+	      pImage->data[currentbyte + 2] = colorbuffer[0];
+	      
+	      if(bytesPerPixel == 4) // if its a 32 bpp image 
+		{
+		  pImage->data[currentbyte + 3] = colorbuffer[3];// copy the 4th byte 
+		}
+	      
+	      currentbyte += bytesPerPixel;
+	      currentpixel++;
+
+	      // Make sure we haven't read too many pixels 
+	      if(currentpixel > pixelcount)	
+		{
+		  PRINTF(1)("Error too many pixels read\n");
+		  if(colorbuffer != NULL)
+		    {
+		      free(colorbuffer);
+		    }
+		  
+		  if(pImage->data != NULL)
+		    {
+		      free(pImage->data);
+		    }
+		  
+		  return false;
+		}
+	    }
+	}
+      // chunkheader > 128 RLE data, next color  reapeated chunkheader - 127 times
+      else
+	{
+	  short counter;
+	  chunkheader -= 127;	// Subteact 127 to get rid of the ID bit 
+	  if(fread(colorbuffer, 1, bytesPerPixel, fTGA) != bytesPerPixel) // Attempt to read following color values 
+	    {
+	      PRINTF(1)("Error could not read from file");
+	      if(colorbuffer != NULL)
+		{
+		  free(colorbuffer);
+		}
+	      
+	      if(pImage->data != NULL)
+		{
+		  free(pImage->data);
+		}
+	      
+	      return false;
+	    }
+	  
+	  for(counter = 0; counter < chunkheader; counter++) //copy the color into the image data as many times as dictated
+	    {							
+	      // switch R and B bytes areound while copying
+	      pImage->data[currentbyte	  ] = colorbuffer[2];
+	      pImage->data[currentbyte + 1] = colorbuffer[1];
+	      pImage->data[currentbyte + 2] = colorbuffer[0];
+	      
+	      if(bytesPerPixel == 4)
+		{
+		  pImage->data[currentbyte + 3] = colorbuffer[3];
+		}
+	      
+	      currentbyte += bytesPerPixel;
+	      currentpixel++;
+	      
+	      if(currentpixel > pixelcount)
+		{
+		  PRINTF(1)("Error too many pixels read\n");
+		  if(colorbuffer != NULL)
+		    {
+		      free(colorbuffer);
+		    }
+		  
+		  if(pImage->data != NULL)
+		    {
+		      free(pImage->data);
+		    }
+		  
+		  return false;
+		}
+	    }
+	}
+    }
+  
+  while(currentpixel < pixelcount);	// Loop while there are still pixels left
+
+  this->loadTexToGL (pImage);
+
+  return true;
+}
+
+
+/**
+   \brief reads in a png-file
+   \param pngName the Name of the Image to load
+*/
+bool Texture::loadPNG(const char* pngName)
+{
+#ifdef HAVE_PNG_H
+
+  FILE *PNG_file = fopen(pngName, "rb");
+  if (PNG_file == NULL)
+    {
+      return 0;
+    }
+  
+  GLubyte PNG_header[8];
+  
+  fread(PNG_header, 1, 8, PNG_file);
+  if (png_sig_cmp(PNG_header, 0, 8) != 0)
+    {
+      PRINTF(2)("Not Recognized as a pngFile\n");
+      fclose (PNG_file);
+      return 0;
+    }
+  
+  png_structp PNG_reader = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
+  if (PNG_reader == NULL)
+    {
+      fclose(PNG_file);
+      return 0;
+    }
+  
+  png_infop PNG_info = png_create_info_struct(PNG_reader);
+  if (PNG_info == NULL)
+    {
+      png_destroy_read_struct(&PNG_reader, NULL, NULL);
+      fclose(PNG_file);
+      return 0;
+    }
+  
+  png_infop PNG_end_info = png_create_info_struct(PNG_reader);
+  if (PNG_end_info == NULL)
+    {
+      png_destroy_read_struct(&PNG_reader, &PNG_info, NULL);
+      fclose(PNG_file);
+      return 0;
+    }
+  
+  if (setjmp(png_jmpbuf(PNG_reader)))
+    {
+      png_destroy_read_struct(&PNG_reader, &PNG_info, &PNG_end_info);
+      fclose(PNG_file);
+      return (0);
+    }
+  
+  png_init_io(PNG_reader, PNG_file);
+  png_set_sig_bytes(PNG_reader, 8);
+  
+  png_read_info(PNG_reader, PNG_info);
+  
+  pImage->width = png_get_image_width(PNG_reader, PNG_info);
+  pImage->height = png_get_image_height(PNG_reader, PNG_info);
+  
+  png_uint_32 bit_depth, color_type;
+  bit_depth = png_get_bit_depth(PNG_reader, PNG_info);
+  color_type = png_get_color_type(PNG_reader, PNG_info);
+  
+  if (color_type == PNG_COLOR_TYPE_PALETTE)
+    {
+      png_set_palette_to_rgb(PNG_reader);
+    }
+  
+  if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8)
+    {
+      png_set_gray_1_2_4_to_8(PNG_reader);
+    }
+  
+  if (color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
+    {
+      png_set_gray_to_rgb(PNG_reader);
+    }
+  
+  if (png_get_valid(PNG_reader, PNG_info, PNG_INFO_tRNS))
+    {
+      png_set_tRNS_to_alpha(PNG_reader);
+    }
+  else
+    {
+      png_set_filler(PNG_reader, 0xff, PNG_FILLER_AFTER);
+    }
+  
+  if (bit_depth == 16)
+    {
+      png_set_strip_16(PNG_reader);
+    }
+  
+  png_read_update_info(PNG_reader, PNG_info);
+  
+  pImage->data = (png_byte*)malloc(4 * pImage->width * pImage->height);
+  png_byte** PNG_rows = (png_byte**)malloc(pImage->height * sizeof(png_byte*));
+  
+  unsigned int row;
+  for (row = 0; row < pImage->height; ++row)
+    {
+      PNG_rows[pImage->height - 1 - row] = pImage->data + (row * 4 * pImage->width);
+    }
+  
+  png_read_image(PNG_reader, PNG_rows);
+  
+  free(PNG_rows);
+  
+  png_destroy_read_struct(&PNG_reader, &PNG_info, &PNG_end_info);
+  fclose(PNG_file);
+  
+  /*  if (!ST_is_power_of_two(pImage->width) || !ST_is_power_of_two(pImage->height))
+    {
+      free(pImage->data);
+      return 0;
+    }
+  */
+  this->loadTexToGL (pImage);  
+  
+  free(pImage->data);
+  
+  return true;
+#else /* HAVE_PNG_H */
+  PRINTF(1)("sorry, but you did not compile with png-support.\nEither install SDL_image or libpng, and recompile to see the image\n");
+  return false;
+#endif /* HAVE_PNG_H */
+
+}
+#endif /* HAVE_SDL_SDL_IMAGE_H */
Index: /orxonox/branches/trackManager/src/lib/graphics/importer/texture.h
===================================================================
--- /orxonox/branches/trackManager/src/lib/graphics/importer/texture.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/graphics/importer/texture.h	(revision 3498)
@@ -0,0 +1,99 @@
+/*!
+  \file texture.h
+  \brief Contains the texture class, that handles the reading of Images into Texutre-files.
+
+  \todo free SDL-surface when deleting Material.
+  \todo delete imgNameWithPath after use creation.
+*/
+
+#ifndef _TEXTURE_H
+#define _TEXTURE_H
+
+#include "stdincl.h"
+#ifdef HAVE_SDL_SDL_IMAGE_H
+#include <SDL/SDL_image.h>
+#else
+// IMAGE LIBS //
+#ifdef HAVE_JPEGLIB_H
+extern "C"{         // This has to be done, because not a c++ lib
+#include <jpeglib.h>
+}
+#endif /* HAVE_JPEGLIB_H */
+#ifdef HAVE_PNG_H
+#include <png.h>
+#endif /* HAVE_PNG_H */
+#endif /* HAVE_SDL_SDL_IMAGE_H */
+
+
+
+//! Class to handle lists of paths.
+/**
+   \todo Ability to return Paths by itself.
+
+   It is simple to use, and good, for all PathList you want.
+   just create a new Pathlist, and add Paths.
+*/
+class PathList
+{
+ private:
+  PathList();
+  static PathList* firstPath; //!< A static Pointer to the first PathList in the List.
+ public:
+  PathList(char* pName);
+  ~PathList();
+  static PathList* getInstance(void);
+  
+  void addPath (char* pName);
+  char* pathName;              //!< The Name of the current Path.
+  PathList* next;              //!< Pointer to the next Pathlist.
+};
+
+//! A Class, that reads in Textures from different fileformats.
+class Texture
+{
+ private:
+  //! Struct to handle Infos about an Image
+  struct Image
+  {
+    int rowSpan;    //!< The count of the rows this Image has.
+    GLuint width;   //!< The width of the Image.
+    GLuint height;  //!< The height of the Image.
+    GLuint bpp;     //!< BytesPerPixel
+    GLenum format;  //!< The Format of the PixelData
+    GLuint type;    //!< Type of the Image.
+    GLubyte *data;  //!< The Image Data comes here! DANGER: uncompressed data.
+  };
+  Image* pImage;    //!< The data of an Image
+  GLuint texture;   //!< The Texture-ID of opengl from this Texture.
+  SDL_Surface* map; //!< The map SDL initializes for this element.
+  char* searchTextureInPaths(char* texName) const;
+  inline void swap(unsigned char &a, unsigned char &b);
+ public:
+  Texture(void);
+  ~Texture(void);
+  /** \returns The textureID of this texture.  */
+  inline GLuint getTexture(void) {return this->texture;} 
+  bool loadTexToGL (Image* pImage);
+
+  bool loadImage(char* imageName);
+#ifndef HAVE_SDL_SDL_IMAGE_H
+
+  bool loadBMP (char* bmpName);
+
+  bool loadJPG (char* jpgName);
+
+  /// TGA ///
+
+  bool loadTGA(const char * tgaName);
+  bool loadUncompressedTGA(const char * filename, FILE * fTGA);
+  bool loadCompressedTGA(const char * filename, FILE * fTGA);
+
+  bool loadPNG(const char* pngName);
+#endif
+
+
+};
+
+
+
+#endif /* _TEXTURE_H */
Index: /orxonox/branches/trackManager/src/lib/graphics/importer/toDo
===================================================================
--- /orxonox/branches/trackManager/src/lib/graphics/importer/toDo	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/graphics/importer/toDo	(revision 3498)
@@ -0,0 +1,6 @@
+toDO list for orxonox/importer:
+
+groupName is set on the wrong place, if set on the right programm will kill itself.
+
+ray03.obj from nomenes gives back a free, that has no reference.
+
Index: /orxonox/branches/trackManager/src/lib/graphics/importer/windowHandler.cc
===================================================================
--- /orxonox/branches/trackManager/src/lib/graphics/importer/windowHandler.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/graphics/importer/windowHandler.cc	(revision 3498)
@@ -0,0 +1,112 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+   co-programmer: ...
+*/
+
+#include "windowHandler.h"
+#include <stdio.h>
+
+/**
+   \brief Resizes the Window
+   \param width the new size in the width.
+   \param height the new size in the height.
+*/
+void WindowHandler::ReSizeGLScene(GLsizei width, GLsizei height) // Resize And Initialize The GL Window
+{
+	if (height==0)	// Prevent A Divide By Zero By
+	{
+		height=1;// Making Height Equal One
+	}
+
+	glViewport(0,0,width,height); // Reset The Current Viewport
+
+	
+	glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+	glLoadIdentity();	
+
+
+	// Calculate The Aspect Ratio Of The Window
+	gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
+	gluLookAt (0,0,15, 0,0,0, 0,1,0);
+
+	glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+	glLoadIdentity(); // Reset The Modelview Matrix
+
+}
+
+/**
+   \brief initializes openGL
+*/
+int WindowHandler::InitGL(GLvoid)										// All Setup For OpenGL Goes Here
+{
+	glEnable(GL_TEXTURE_2D); // Enable Texture Mapping
+	glShadeModel(GL_SMOOTH); // Enable Smooth Shading
+	glClearColor(0.00f, 0.00f, 0.00f, 0.0f); // Black Background
+	glClearDepth(1.0f);  // Depth Buffer Setup
+	glEnable(GL_DEPTH_TEST); // Enables Depth Testing
+	glDepthFunc(GL_LEQUAL);	// The Type Of Depth Testing To Do
+	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);  // Really Nice Perspective Calculations
+
+    return TRUE;
+}
+
+/**
+   \brief kills the window
+*/
+GLvoid WindowHandler::KillGLWindow(GLvoid) // Properly Kill The Window
+{
+	SDL_Quit();
+}
+
+/**
+   \brief creates a new Window for the scene
+   \param title the name of the Window
+   \param width the width of the window
+   \param height the height of the window
+   \param bits the bits per pixel to use
+   \param fullscreenflag TRUE if fullscreen FALSE if windowed/
+   \returns FALSE if initialisation failed, TRUE otherwise
+*/
+BOOL WindowHandler::CreateGLWindow(char* title, int width, int height, int bits, BOOL fullscreenflag)
+{
+	Uint32 flags;
+	int size;
+
+	/* Initialize SDL */
+	if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
+		fprintf(stderr, "Couldn't init SDL: %s\n", SDL_GetError());
+		return FALSE;
+	}
+
+	flags = SDL_OPENGL;
+	if ( fullscreenflag ) {
+		flags |= SDL_FULLSCREEN;
+	}
+	SDL_GL_SetAttribute( SDL_GL_STENCIL_SIZE, 1 );
+	if ( (screen = SDL_SetVideoMode(width, height, 0, flags)) == NULL ) {
+		return FALSE;
+	}
+	SDL_GL_GetAttribute( SDL_GL_STENCIL_SIZE, &size);
+
+	ReSizeGLScene(width, height); // Set Up Our Perspective GL Screen
+
+	if (!InitGL()) // Initialize Our Newly Created GL Window
+	{
+	  KillGLWindow();  // Reset The Display
+	  return FALSE;
+	}
+
+	return TRUE;
+}
+
+
Index: /orxonox/branches/trackManager/src/lib/graphics/importer/windowHandler.h
===================================================================
--- /orxonox/branches/trackManager/src/lib/graphics/importer/windowHandler.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/graphics/importer/windowHandler.h	(revision 3498)
@@ -0,0 +1,43 @@
+/*!
+  \file windowHandler.h
+  \brief contains the WindowHandler class for the minimal display system
+*/
+
+
+#ifndef _WINDOWHANDLER_H
+#define _WINDOWHANDLER_H
+
+extern int verbose;
+
+#include "stdincl.h"
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <math.h>
+
+#ifdef __WIN32__
+#include <windows.h>
+#endif /* __WIN32__ */
+
+#define TRUE 1     //!< define true
+#define FALSE 0    //!< define false
+#define BOOL int   //!< define BOOL
+
+//! A simple class to handle a minimal display system
+class WindowHandler
+{
+  public:
+    WindowHandler() { };
+    ~WindowHandler() { };
+    GLvoid KillGLWindow(GLvoid);
+    BOOL CreateGLWindow(char* title, int width, int height, int bits, BOOL fullscreenflag);
+    SDL_Surface* screen;   //!< The screen to which to display the rendered stuff
+  private:
+    int InitGL(GLvoid);
+    void ReSizeGLScene(GLsizei width, GLsizei height);  
+};
+
+
+#endif
Index: /orxonox/branches/trackManager/src/lib/gui/Makefile.am
===================================================================
--- /orxonox/branches/trackManager/src/lib/gui/Makefile.am	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/gui/Makefile.am	(revision 3498)
@@ -0,0 +1,2 @@
+SUBDIRS = gui \
+	  console
Index: /orxonox/branches/trackManager/src/lib/gui/Makefile.in
===================================================================
--- /orxonox/branches/trackManager/src/lib/gui/Makefile.in	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/gui/Makefile.in	(revision 3498)
@@ -0,0 +1,452 @@
+# Makefile.in generated by automake 1.8.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_triplet = @host@
+subdir = src/lib/gui
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+	html-recursive info-recursive install-data-recursive \
+	install-exec-recursive install-info-recursive \
+	install-recursive installcheck-recursive installdirs-recursive \
+	pdf-recursive ps-recursive uninstall-info-recursive \
+	uninstall-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CURL_CFLAGS = @CURL_CFLAGS@
+CURL_LIBS = @CURL_LIBS@
+CXX = @CXX@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEBUG = @DEBUG@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DOXYGEN = @DOXYGEN@
+DOXYGEN_FALSE = @DOXYGEN_FALSE@
+DOXYGEN_TRUE = @DOXYGEN_TRUE@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GTHREAD_CFLAGS = @GTHREAD_CFLAGS@
+GTHREAD_LIBS = @GTHREAD_LIBS@
+GTK2_CFLAGS = @GTK2_CFLAGS@
+GTK2_LIBS = @GTK2_LIBS@
+HAVE_CURL_FALSE = @HAVE_CURL_FALSE@
+HAVE_CURL_TRUE = @HAVE_CURL_TRUE@
+HAVE_GTHREAD_FALSE = @HAVE_GTHREAD_FALSE@
+HAVE_GTHREAD_TRUE = @HAVE_GTHREAD_TRUE@
+HAVE_GTK2_FALSE = @HAVE_GTK2_FALSE@
+HAVE_GTK2_TRUE = @HAVE_GTK2_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MSBITFIELDS = @MSBITFIELDS@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SUB_PROJECTS_FALSE = @SUB_PROJECTS_FALSE@
+SUB_PROJECTS_TRUE = @SUB_PROJECTS_TRUE@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+SUBDIRS = gui \
+	  console
+
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  src/lib/gui/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  src/lib/gui/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+uninstall-info-am:
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+	@set fnord $$MAKEFLAGS; amf=$$2; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	   || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+	@set fnord $$MAKEFLAGS; amf=$$2; \
+	dot_seen=no; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	rev=''; for subdir in $$list; do \
+	  if test "$$subdir" = "."; then :; else \
+	    rev="$$subdir $$rev"; \
+	  fi; \
+	done; \
+	rev="$$rev ."; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	   || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+ctags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d "$(distdir)/$$subdir" \
+	    || mkdir "$(distdir)/$$subdir" \
+	    || exit 1; \
+	    (cd $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="../$(top_distdir)" \
+	        distdir="../$(distdir)/$$subdir" \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-recursive
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \
+	clean clean-generic clean-recursive ctags ctags-recursive \
+	distclean distclean-generic distclean-recursive distclean-tags \
+	distdir dvi dvi-am html html-am info info-am install \
+	install-am install-data install-data-am install-exec \
+	install-exec-am install-info install-info-am install-man \
+	install-strip installcheck installcheck-am installdirs \
+	installdirs-am maintainer-clean maintainer-clean-generic \
+	maintainer-clean-recursive mostlyclean mostlyclean-generic \
+	mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \
+	uninstall uninstall-am uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
Index: /orxonox/branches/trackManager/src/lib/gui/console/Makefile.am
===================================================================
--- /orxonox/branches/trackManager/src/lib/gui/console/Makefile.am	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/gui/console/Makefile.am	(revision 3498)
@@ -0,0 +1,28 @@
+AM_CXXFLAGS=$(GTK2_CFLAGS) $(MSBITFIELDS)
+#AM_LDFLAGS=$(GTK2_LIBS)
+LIBS=$(GTK2_LIBS)
+
+bin_PROGRAMS=console
+console_SOURCES= orxonox_console.cc \
+	  	 orxonox_console_entry.cc \
+	  	 orxonox_console_log.cc
+
+noinst_HEADERS= orxonox_console.h \
+	        orxonox_console_entry.h \
+	   	orxonox_console_log.h
+
+#  uncomment the following if orxonox requires the math library
+#gui_LDADD=-lm
+
+#EXTRA_DIST=orxonox.lsm.in orxonox.spec.in orxonox.texinfo
+
+#  if you write a self-test script named `chk', uncomment the
+#  following and add `chk' to the EXTRA_DIST list
+#TESTS=chk
+
+#  build and install the .info pages
+#info_TEXINFOS = orxonox.texinfo
+#orxonox_TEXINFOS = gpl.texinfo
+
+#  install the man pages
+#man_MANS=orxonox.1
Index: /orxonox/branches/trackManager/src/lib/gui/console/Makefile.in
===================================================================
--- /orxonox/branches/trackManager/src/lib/gui/console/Makefile.in	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/gui/console/Makefile.in	(revision 3498)
@@ -0,0 +1,463 @@
+# Makefile.in generated by automake 1.8.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+SOURCES = $(console_SOURCES)
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../../../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_triplet = @host@
+bin_PROGRAMS = console$(EXEEXT)
+subdir = src/lib/gui/console
+DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
+	$(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am_console_OBJECTS = orxonox_console.$(OBJEXT) \
+	orxonox_console_entry.$(OBJEXT) orxonox_console_log.$(OBJEXT)
+console_OBJECTS = $(am_console_OBJECTS)
+console_LDADD = $(LDADD)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/orxonox_console.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/orxonox_console_entry.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/orxonox_console_log.Po
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+	-o $@
+SOURCES = $(console_SOURCES)
+DIST_SOURCES = $(console_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CURL_CFLAGS = @CURL_CFLAGS@
+CURL_LIBS = @CURL_LIBS@
+CXX = @CXX@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEBUG = @DEBUG@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DOXYGEN = @DOXYGEN@
+DOXYGEN_FALSE = @DOXYGEN_FALSE@
+DOXYGEN_TRUE = @DOXYGEN_TRUE@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GTHREAD_CFLAGS = @GTHREAD_CFLAGS@
+GTHREAD_LIBS = @GTHREAD_LIBS@
+GTK2_CFLAGS = @GTK2_CFLAGS@
+GTK2_LIBS = @GTK2_LIBS@
+HAVE_CURL_FALSE = @HAVE_CURL_FALSE@
+HAVE_CURL_TRUE = @HAVE_CURL_TRUE@
+HAVE_GTHREAD_FALSE = @HAVE_GTHREAD_FALSE@
+HAVE_GTHREAD_TRUE = @HAVE_GTHREAD_TRUE@
+HAVE_GTK2_FALSE = @HAVE_GTK2_FALSE@
+HAVE_GTK2_TRUE = @HAVE_GTK2_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+#AM_LDFLAGS=$(GTK2_LIBS)
+LIBS = $(GTK2_LIBS)
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MSBITFIELDS = @MSBITFIELDS@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SUB_PROJECTS_FALSE = @SUB_PROJECTS_FALSE@
+SUB_PROJECTS_TRUE = @SUB_PROJECTS_TRUE@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+AM_CXXFLAGS = $(GTK2_CFLAGS) $(MSBITFIELDS)
+console_SOURCES = orxonox_console.cc \
+	  	 orxonox_console_entry.cc \
+	  	 orxonox_console_log.cc
+
+noinst_HEADERS = orxonox_console.h \
+	        orxonox_console_entry.h \
+	   	orxonox_console_log.h
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  src/lib/gui/console/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  src/lib/gui/console/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  if test -f $$p \
+	  ; then \
+	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+	   echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+	   $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+	  else :; fi; \
+	done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+	  echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(bindir)/$$f"; \
+	done
+
+clean-binPROGRAMS:
+	-test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+console$(EXEEXT): $(console_OBJECTS) $(console_DEPENDENCIES) 
+	@rm -f console$(EXEEXT)
+	$(CXXLINK) $(console_LDFLAGS) $(console_OBJECTS) $(console_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orxonox_console.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orxonox_console_entry.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orxonox_console_log.Po@am__quote@
+
+.cc.o:
+@am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(HEADERS)
+installdirs:
+	for dir in "$(DESTDIR)$(bindir)"; do \
+	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
+	clean-generic ctags distclean distclean-compile \
+	distclean-generic distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-binPROGRAMS \
+	install-data install-data-am install-exec install-exec-am \
+	install-info install-info-am install-man install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+	uninstall-am uninstall-binPROGRAMS uninstall-info-am
+
+
+#  uncomment the following if orxonox requires the math library
+#gui_LDADD=-lm
+
+#EXTRA_DIST=orxonox.lsm.in orxonox.spec.in orxonox.texinfo
+
+#  if you write a self-test script named `chk', uncomment the
+#  following and add `chk' to the EXTRA_DIST list
+#TESTS=chk
+
+#  build and install the .info pages
+#info_TEXINFOS = orxonox.texinfo
+#orxonox_TEXINFOS = gpl.texinfo
+
+#  install the man pages
+#man_MANS=orxonox.1
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
Index: /orxonox/branches/trackManager/src/lib/gui/console/orxonox_console.cc
===================================================================
--- /orxonox/branches/trackManager/src/lib/gui/console/orxonox_console.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/gui/console/orxonox_console.cc	(revision 3498)
@@ -0,0 +1,68 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+   co-programmer:
+*/
+
+
+#include "orxonox_console.h"
+
+using namespace std;
+
+void OrxonoxConsole::createWindow ()
+{
+  
+  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  gtk_window_set_policy(GTK_WINDOW(window), TRUE, TRUE, FALSE);
+  gtk_window_set_title ( GTK_WINDOW (window), "orxonox console");
+  g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (gtk_main_quit), NULL);
+  g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);
+  gtk_container_set_border_width (GTK_CONTAINER (window), 5);
+
+  vbox_main = gtk_vbox_new(FALSE, 5);
+    {
+      gtk_box_pack_start(GTK_BOX(vbox_main), entry.createEntry(), FALSE, FALSE, 0);
+      gtk_box_pack_start(GTK_BOX(vbox_main), log.createLog(), TRUE, TRUE, 0);
+      entry.setLog(&log);
+    }
+  gtk_container_add(GTK_CONTAINER(window), vbox_main);
+  
+  gtk_widget_show_all(window);
+
+}
+
+
+
+
+int main( int argc, char *argv[] )
+{  
+  verbose = 0;
+
+  OrxonoxConsole console;
+  
+  gtk_init (&argc, &argv);
+
+  console.createWindow();
+
+  gtk_main ();
+  return (0);
+}
Index: /orxonox/branches/trackManager/src/lib/gui/console/orxonox_console.h
===================================================================
--- /orxonox/branches/trackManager/src/lib/gui/console/orxonox_console.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/gui/console/orxonox_console.h	(revision 3498)
@@ -0,0 +1,33 @@
+#ifndef ORXONOX_CONSOLE_H
+#define ORXONOX_CONSOLE_H
+
+/* standard headers */
+#include <stdio.h>
+
+/* GTK headers */
+#include <gtk/gtk.h> 
+
+/* other headers */
+#include "orxonox_console_entry.h"
+#include "orxonox_console_log.h"
+
+int verbose;
+  
+class OrxonoxConsole {
+  
+ private:
+  GtkWidget *window;
+  GtkWidget *vbox_main;
+  OrxonoxConsoleLog log;
+  OrxonoxConsoleEntry entry;
+
+
+ public:
+  void createWindow(void);
+
+    
+
+};
+
+#endif
+
Index: /orxonox/branches/trackManager/src/lib/gui/console/orxonox_console_entry.cc
===================================================================
--- /orxonox/branches/trackManager/src/lib/gui/console/orxonox_console_entry.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/gui/console/orxonox_console_entry.cc	(revision 3498)
@@ -0,0 +1,82 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+   co-programmer:
+*/
+
+
+#include "orxonox_console_entry.h"
+
+
+
+OrxonoxConsoleEntry::OrxonoxConsoleEntry(void)
+{}
+
+OrxonoxConsoleEntry::OrxonoxConsoleEntry(OrxonoxConsoleLog* log)
+{
+  consoleLog = log; 
+}
+
+
+GtkWidget* OrxonoxConsoleEntry::createEntry()
+{
+  frame = gtk_frame_new ("Console Entry:");
+
+
+  gtk_container_set_border_width (GTK_CONTAINER(frame), 5);
+  {
+    entrybox = gtk_hbox_new (FALSE, 5);
+    {
+      entry = gtk_entry_new();
+      g_signal_connect(GTK_ENTRY(entry), "activate", G_CALLBACK(submit), this);
+      gtk_box_pack_start(GTK_BOX(entrybox), entry, TRUE, TRUE, 5);
+      
+      
+      button = gtk_button_new_with_label("Submit");
+      g_signal_connect(GTK_BUTTON(button), "clicked", G_CALLBACK(submit), this);
+      gtk_box_pack_start(GTK_BOX(entrybox), button, FALSE, FALSE, 5);
+    }
+    gtk_container_add(GTK_CONTAINER(frame), entrybox);
+  }
+  return (frame);
+}
+
+void OrxonoxConsoleEntry::setLog(OrxonoxConsoleLog* log)
+{
+  consoleLog = log;
+}
+
+
+void OrxonoxConsoleEntry::submit(GtkWidget *widget,  OrxonoxConsoleEntry* entry)
+{
+  char* entryText = (char*)gtk_entry_get_text(GTK_ENTRY(entry->entry));
+  entry->sendtoLog(entryText);
+  gtk_entry_set_text(GTK_ENTRY(entry->entry),"");
+  return;
+}
+
+
+void OrxonoxConsoleEntry::sendtoLog(char* submitText)
+{
+  consoleLog->appendText(submitText);
+  return;
+}
Index: /orxonox/branches/trackManager/src/lib/gui/console/orxonox_console_entry.h
===================================================================
--- /orxonox/branches/trackManager/src/lib/gui/console/orxonox_console_entry.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/gui/console/orxonox_console_entry.h	(revision 3498)
@@ -0,0 +1,39 @@
+#ifndef ORXONOX_CONSOLE_ENTRY_H
+#define ORXONOX_CONSOLE_ENTRY_H
+
+/* standard headers */
+#include <stdio.h>
+
+/* GTK headers */
+#include <gtk/gtk.h> 
+
+#include "orxonox_console_log.h"
+
+extern int verbose;
+
+class OrxonoxConsoleEntry {
+  
+ private:
+  GtkWidget *frame;
+  GtkWidget *entrybox;
+  GtkWidget *label;
+  GtkWidget *button;
+  GtkWidget *entry;
+  OrxonoxConsoleLog* consoleLog;
+
+
+
+ public:
+  OrxonoxConsoleEntry(void);
+  OrxonoxConsoleEntry(OrxonoxConsoleLog* log);
+  
+  GtkWidget* createEntry(void);
+  void setLog(OrxonoxConsoleLog* log);
+  static void submit(GtkWidget *widget,  OrxonoxConsoleEntry* entry);
+  void sendtoLog(char* submitText);
+
+};
+  
+
+#endif
+
Index: /orxonox/branches/trackManager/src/lib/gui/console/orxonox_console_log.cc
===================================================================
--- /orxonox/branches/trackManager/src/lib/gui/console/orxonox_console_log.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/gui/console/orxonox_console_log.cc	(revision 3498)
@@ -0,0 +1,71 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+   co-programmer:
+*/
+
+
+#include "orxonox_console_log.h"
+
+GtkWidget* OrxonoxConsoleLog::createLog()
+{
+  frame = gtk_frame_new ("Console Log:");
+  {
+    scrollframe = gtk_scrolled_window_new (NULL, NULL);
+    logtext = new char;
+    
+    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrollframe),
+				    GTK_POLICY_AUTOMATIC,
+				    GTK_POLICY_AUTOMATIC);
+    
+    gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollframe),
+					 GTK_SHADOW_IN);
+    gtk_container_set_border_width (GTK_CONTAINER(scrollframe), 5);
+    
+    logView = gtk_text_view_new();
+    gtk_text_view_set_editable(GTK_TEXT_VIEW(logView), FALSE);
+    log = gtk_text_view_get_buffer (GTK_TEXT_VIEW (logView));
+    gtk_container_add(GTK_CONTAINER(scrollframe), logView);
+    gtk_container_add(GTK_CONTAINER(frame),scrollframe);
+    gtk_text_buffer_set_text (log, "Orxonox Console started.\n", -1);
+
+  }
+  return (frame);
+}
+
+void OrxonoxConsoleLog::appendText(char* append)
+{
+  GtkTextIter iter;
+  if (verbose>=1)
+    printf ("appending: %s\n", append);
+  strcat (append,"\n");
+  gtk_text_buffer_get_start_iter (log, &iter);
+  gtk_text_buffer_place_cursor (log, &iter);
+  gtk_text_buffer_insert_at_cursor (log, append, -1);
+  return;
+}
+
+void OrxonoxConsoleLog::clear()
+{
+  sprintf(logtext, "");
+  return;
+}
Index: /orxonox/branches/trackManager/src/lib/gui/console/orxonox_console_log.h
===================================================================
--- /orxonox/branches/trackManager/src/lib/gui/console/orxonox_console_log.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/gui/console/orxonox_console_log.h	(revision 3498)
@@ -0,0 +1,38 @@
+#ifndef ORXONOX_CONSOLE_LOG_H
+#define ORXONOX_CONSOLE_LOG_H
+
+/* standard headers */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* GTK headers */
+#include <gtk/gtk.h>
+
+extern int verbose;
+
+class OrxonoxConsoleLog {
+  
+ private:
+  GtkWidget *frame;
+  GtkWidget *scrollframe;
+  GtkWidget *logbox;
+  GtkWidget *logView;
+  GtkTextBuffer *log;
+  GtkWidget *label;
+
+  char *logtext;
+  
+  
+
+
+ public:
+  
+  GtkWidget* createLog(void);
+
+  void OrxonoxConsoleLog::appendText(char* append);  
+  void OrxonoxConsoleLog::clear();
+};
+
+#endif
+
Index: /orxonox/branches/trackManager/src/lib/gui/gui/Makefile.am
===================================================================
--- /orxonox/branches/trackManager/src/lib/gui/gui/Makefile.am	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/gui/gui/Makefile.am	(revision 3498)
@@ -0,0 +1,61 @@
+MAINSRCDIR=../../..
+AM_CXXFLAGS=$(GTK2_CFLAGS) $(GTHREAD_CFLAGS) $(CURL_CFLAGS) $(MSBITFIELDS)
+AM_CXXFLAGS+=-I$(MAINSRCDIR)
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/world_entities
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/story_entities
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/coord
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/data
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/gaphics
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/graphics/font
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/graphics/importer
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/gui
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/lang
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/util
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/math
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/defs
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/font
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/network
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/glmenu
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/ai
+
+#AM_LDFLAGS=$(GTK2_LIBS)   $(GTHREAD_LIBS)
+LIBS=$(GTK2_LIBS) $(GTHREAD_LIBS) $(CURL_LIBS)
+
+bin_PROGRAMS=gui
+gui_SOURCES=orxonox_gui.cc \
+	    orxonox_gui_gtk.cc \
+	    orxonox_gui_video.cc \
+	    orxonox_gui_audio.cc \
+	    orxonox_gui_exec.cc \
+	    orxonox_gui_flags.cc \
+	    orxonox_gui_banner.cc \
+	    orxonox_gui_keys.cc \
+	    orxonox_gui_update.cc
+
+noinst_HEADERS=orxonox_gui.h \
+	    orxonox_gui_gtk.h \
+	    orxonox_gui_video.h \
+	    orxonox_gui_audio.h \
+	    orxonox_gui_exec.h \
+	    orxonox_gui_flags.h \
+	    orxonox_gui_banner.h \
+	    orxonox_gui_keys.h \
+	    orxonox_gui_update.h
+
+#  uncomment the following if orxonox requires the mathlibrary
+#gui_LDADD=-lm
+
+#EXTRA_DIST=orxonox.lsm.in orxonox.spec.in orxonox.texinfo
+
+#  if you write a self-test script named `chk', uncomment the
+#  following and add `chk' to the EXTRA_DIST list
+#TESTS=chk
+EXTRA_DIST = rc banner.xpm
+
+#  build and install the .info pages
+#info_TEXINFOS = orxonox.texinfo
+#orxonox_TEXINFOS = gpl.texinfo
+
+#  install the man pages
+#man_MANS=orxonox.1
Index: /orxonox/branches/trackManager/src/lib/gui/gui/Makefile.in
===================================================================
--- /orxonox/branches/trackManager/src/lib/gui/gui/Makefile.in	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/gui/gui/Makefile.in	(revision 3498)
@@ -0,0 +1,493 @@
+# Makefile.in generated by automake 1.8.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+SOURCES = $(gui_SOURCES)
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../../../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_triplet = @host@
+bin_PROGRAMS = gui$(EXEEXT)
+subdir = src/lib/gui/gui
+DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
+	$(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am_gui_OBJECTS = orxonox_gui.$(OBJEXT) orxonox_gui_gtk.$(OBJEXT) \
+	orxonox_gui_video.$(OBJEXT) orxonox_gui_audio.$(OBJEXT) \
+	orxonox_gui_exec.$(OBJEXT) orxonox_gui_flags.$(OBJEXT) \
+	orxonox_gui_banner.$(OBJEXT) orxonox_gui_keys.$(OBJEXT) \
+	orxonox_gui_update.$(OBJEXT)
+gui_OBJECTS = $(am_gui_OBJECTS)
+gui_LDADD = $(LDADD)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/orxonox_gui.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/orxonox_gui_audio.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/orxonox_gui_banner.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/orxonox_gui_exec.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/orxonox_gui_flags.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/orxonox_gui_gtk.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/orxonox_gui_keys.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/orxonox_gui_update.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/orxonox_gui_video.Po
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+	-o $@
+SOURCES = $(gui_SOURCES)
+DIST_SOURCES = $(gui_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CURL_CFLAGS = @CURL_CFLAGS@
+CURL_LIBS = @CURL_LIBS@
+CXX = @CXX@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEBUG = @DEBUG@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DOXYGEN = @DOXYGEN@
+DOXYGEN_FALSE = @DOXYGEN_FALSE@
+DOXYGEN_TRUE = @DOXYGEN_TRUE@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GTHREAD_CFLAGS = @GTHREAD_CFLAGS@
+GTHREAD_LIBS = @GTHREAD_LIBS@
+GTK2_CFLAGS = @GTK2_CFLAGS@
+GTK2_LIBS = @GTK2_LIBS@
+HAVE_CURL_FALSE = @HAVE_CURL_FALSE@
+HAVE_CURL_TRUE = @HAVE_CURL_TRUE@
+HAVE_GTHREAD_FALSE = @HAVE_GTHREAD_FALSE@
+HAVE_GTHREAD_TRUE = @HAVE_GTHREAD_TRUE@
+HAVE_GTK2_FALSE = @HAVE_GTK2_FALSE@
+HAVE_GTK2_TRUE = @HAVE_GTK2_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+
+#AM_LDFLAGS=$(GTK2_LIBS)   $(GTHREAD_LIBS)
+LIBS = $(GTK2_LIBS) $(GTHREAD_LIBS) $(CURL_LIBS)
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MSBITFIELDS = @MSBITFIELDS@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SUB_PROJECTS_FALSE = @SUB_PROJECTS_FALSE@
+SUB_PROJECTS_TRUE = @SUB_PROJECTS_TRUE@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+MAINSRCDIR = ../../..
+AM_CXXFLAGS = $(GTK2_CFLAGS) $(GTHREAD_CFLAGS) $(CURL_CFLAGS) $(MSBITFIELDS) -I$(MAINSRCDIR) -I$(MAINSRCDIR)/world_entities -I$(MAINSRCDIR)/story_entities -I$(MAINSRCDIR)/lib -I$(MAINSRCDIR)/lib/coord -I$(MAINSRCDIR)/lib/data -I$(MAINSRCDIR)/lib/gaphics -I$(MAINSRCDIR)/lib/graphics/font -I$(MAINSRCDIR)/lib/graphics/importer -I$(MAINSRCDIR)/lib/gui -I$(MAINSRCDIR)/lib/lang -I$(MAINSRCDIR)/lib/util -I$(MAINSRCDIR)/lib/math -I$(MAINSRCDIR)/defs -I$(MAINSRCDIR)/font -I$(MAINSRCDIR)/network -I$(MAINSRCDIR)/glmenu -I$(MAINSRCDIR)/ai
+gui_SOURCES = orxonox_gui.cc \
+	    orxonox_gui_gtk.cc \
+	    orxonox_gui_video.cc \
+	    orxonox_gui_audio.cc \
+	    orxonox_gui_exec.cc \
+	    orxonox_gui_flags.cc \
+	    orxonox_gui_banner.cc \
+	    orxonox_gui_keys.cc \
+	    orxonox_gui_update.cc
+
+noinst_HEADERS = orxonox_gui.h \
+	    orxonox_gui_gtk.h \
+	    orxonox_gui_video.h \
+	    orxonox_gui_audio.h \
+	    orxonox_gui_exec.h \
+	    orxonox_gui_flags.h \
+	    orxonox_gui_banner.h \
+	    orxonox_gui_keys.h \
+	    orxonox_gui_update.h
+
+
+#  uncomment the following if orxonox requires the mathlibrary
+#gui_LDADD=-lm
+
+#EXTRA_DIST=orxonox.lsm.in orxonox.spec.in orxonox.texinfo
+
+#  if you write a self-test script named `chk', uncomment the
+#  following and add `chk' to the EXTRA_DIST list
+#TESTS=chk
+EXTRA_DIST = rc banner.xpm
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  src/lib/gui/gui/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  src/lib/gui/gui/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  if test -f $$p \
+	  ; then \
+	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+	   echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+	   $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+	  else :; fi; \
+	done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+	  echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(bindir)/$$f"; \
+	done
+
+clean-binPROGRAMS:
+	-test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+gui$(EXEEXT): $(gui_OBJECTS) $(gui_DEPENDENCIES) 
+	@rm -f gui$(EXEEXT)
+	$(CXXLINK) $(gui_LDFLAGS) $(gui_OBJECTS) $(gui_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orxonox_gui.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orxonox_gui_audio.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orxonox_gui_banner.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orxonox_gui_exec.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orxonox_gui_flags.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orxonox_gui_gtk.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orxonox_gui_keys.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orxonox_gui_update.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orxonox_gui_video.Po@am__quote@
+
+.cc.o:
+@am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(HEADERS)
+installdirs:
+	for dir in "$(DESTDIR)$(bindir)"; do \
+	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
+	clean-generic ctags distclean distclean-compile \
+	distclean-generic distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-binPROGRAMS \
+	install-data install-data-am install-exec install-exec-am \
+	install-info install-info-am install-man install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+	uninstall-am uninstall-binPROGRAMS uninstall-info-am
+
+
+#  build and install the .info pages
+#info_TEXINFOS = orxonox.texinfo
+#orxonox_TEXINFOS = gpl.texinfo
+
+#  install the man pages
+#man_MANS=orxonox.1
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
Index: /orxonox/branches/trackManager/src/lib/gui/gui/banner.xpm
===================================================================
--- /orxonox/branches/trackManager/src/lib/gui/gui/banner.xpm	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/gui/gui/banner.xpm	(revision 3498)
@@ -0,0 +1,526 @@
+/* XPM */
+static char * banner_xpm[] = {
+"127 382 141 2",
+"  	c None",
+". 	c #183016",
+"+ 	c #183316",
+"@ 	c #183416",
+"# 	c #193816",
+"$ 	c #193916",
+"% 	c #193B16",
+"& 	c #1A3E17",
+"* 	c #1B3F17",
+"= 	c #1B4318",
+"- 	c #1B4418",
+"; 	c #1B4818",
+"> 	c #1C4F18",
+", 	c #1A3D17",
+"' 	c #172D15",
+") 	c #162A15",
+"! 	c #1C4B18",
+"~ 	c #193716",
+"{ 	c #36AC2D",
+"] 	c #42B837",
+"^ 	c #4DC042",
+"/ 	c #53C447",
+"( 	c #60CC53",
+"_ 	c #69D05D",
+": 	c #6ED261",
+"< 	c #74D669",
+"[ 	c #7BD86E",
+"} 	c #80D972",
+"| 	c #54C549",
+"1 	c #58C84D",
+"2 	c #45BC3C",
+"3 	c #1F641B",
+"4 	c #2FA326",
+"5 	c #32A829",
+"6 	c #25921E",
+"7 	c #2B9D23",
+"8 	c #24871D",
+"9 	c #2A9C21",
+"0 	c #31A628",
+"a 	c #183116",
+"b 	c #162314",
+"c 	c #162915",
+"d 	c #216F1B",
+"e 	c #141F14",
+"f 	c #206A1B",
+"g 	c #23791C",
+"h 	c #1D5018",
+"i 	c #1E5719",
+"j 	c #258F1E",
+"k 	c #1E5B1A",
+"l 	c #27991F",
+"m 	c #162514",
+"n 	c #23801D",
+"o 	c #22741B",
+"p 	c #2EA225",
+"q 	c #9CE391",
+"r 	c #89DC7B",
+"s 	c #BDEDB5",
+"t 	c #F8FDF7",
+"u 	c #9DE494",
+"v 	c #183216",
+"w 	c #1D5119",
+"x 	c #182F16",
+"y 	c #172A15",
+"z 	c #1B4217",
+"A 	c #30A527",
+"B 	c #85DB79",
+"C 	c #44BA39",
+"D 	c #1D5419",
+"E 	c #20691B",
+"F 	c #248E1E",
+"G 	c #26971E",
+"H 	c #216E1B",
+"I 	c #20661B",
+"J 	c #162614",
+"K 	c #182E16",
+"L 	c #EEFBEB",
+"M 	c #72D566",
+"N 	c #1A3C17",
+"O 	c #39B030",
+"P 	c #23851D",
+"Q 	c #152114",
+"R 	c #237D1C",
+"S 	c #61CD55",
+"T 	c #B5EBAD",
+"U 	c #D7F5D2",
+"V 	c #183516",
+"W 	c #1C4C18",
+"X 	c #48BD3D",
+"Y 	c #4FC244",
+"Z 	c #8EDF82",
+"` 	c #3DB433",
+" .	c #1E601A",
+"..	c #22771C",
+"+.	c #248A1E",
+"@.	c #1E5A19",
+"#.	c #C3EFBD",
+"$.	c #1F611A",
+"%.	c #E3F8DF",
+"&.	c #94E087",
+"*.	c #2C9F23",
+"=.	c #3FB735",
+"-.	c #21721B",
+";.	c #FCFEFC",
+">.	c #2DA024",
+",.	c #152314",
+"'.	c #ADE8A5",
+").	c #F3FCF2",
+"!.	c #D9F5D4",
+"~.	c #289A20",
+"{.	c #162414",
+"].	c #1B4518",
+"^.	c #DEF6D9",
+"/.	c #FEFFFE",
+"(.	c #172C15",
+"_.	c #162814",
+":.	c #26961E",
+"<.	c #FFFFFF",
+"[.	c #162714",
+"}.	c #D0F3CB",
+"|.	c #152214",
+"1.	c #38AF2F",
+"2.	c #6AD15E",
+"3.	c #1E5519",
+"4.	c #33A92A",
+"5.	c #1E5E1A",
+"6.	c #35AB2C",
+"7.	c #152014",
+"8.	c #37AD2E",
+"9.	c #3EB534",
+"0.	c #23821D",
+"a.	c #F6FDF5",
+"b.	c #A6E69C",
+"c.	c #BAECB3",
+"d.	c #FCFEFB",
+"e.	c #91DF85",
+"f.	c #F1FCEF",
+"g.	c #3CB332",
+"h.	c #43B938",
+"i.	c #172B15",
+"j.	c #C0EFBA",
+". . . . . + + + @ @ @ # # $ $ $ % % & * * * * * = = = - ; ; > > > > > , = = + . ' ' ' ' . . . ' ' ' . ' ' ' ) . ! > > ! , @ . . ~ ! { ] ] ^ / ( _ : < [ } [ < < _ | 1 ( 2 > 3 4 5 6 7 3 8 9 . > 0 a b } [ c d e f g ! h i j f k j l l m ) 9 n o p q : r s t u ",
+". . . + v . + + @ @ @ @ $ # % % % % % & & = & & = = - = ; > ; ; ! w ! & & * . v ' ' ) ' . . ' ' v x v x ' # v ) . . ' ) y z o p A p 1 / ^ ^ ^ ( : : [ } B [ < : ( | ( ( C D E F G H 6 6 F * I o J @ K L M $ N e z O d h h d 8 j d P n Q m p G R C S r _ u T U ",
+"K . . . . . . . @ @ @ @ V # # # % % & * & * N * = = = - - ; > > > > ! & = = . . ' ' ' ' ' . x ' + ' ' x ' ' . ' J @ W o 7 { C X Y X 1 S ( | ^ ( : [ B Z B [ : _ ( ( : _ `  .o ..H G 6 +.3 @.a i j c e #.[ Q z Q R ! ! f $.j f j p { j ) @ { p G Y [ B [ u %.&.",
+". . . . @ @ @ + @ @ V V $ $ $ $ % % % & * * & * = = - = ; > ; > ! > ; , = = v v ' ' ) ' . . ' ' ' ) ' + ' J ' - *.A O ] =.=.` O 2 ] A 2 _ : ( : [ [ } B B < : ( ( S < : 2 @.H R *.-.6 P F D l k @ $ K ;.O a @ e > X i i f $.j { >.n k ,.' d I o / '.[ } ).!.t ",
+"' ' . . . + + + @ + # @ V $ $ # % % & & & * % * = = = = ; > ; > > w - $ & * . . ' ' y ' ' . ' ' ' ' ' @ . ) > A =.=.` ` ` ` =.X 1 / l { ( _ ( : < [ } } } < : _ : ( S < ^ ; @.6 G 7 6 ~. .. ,.i j J {.T M e N e n R i $.].N y ) b Q Q e ) @ e Q h S k s ^./.T ",
+". . . . . . + + + @ @ V # # $ $ % % % * * = * & = = - - - - > ; > > > , = = v . ' ' ' ' . . x ' v x (.. _.. n ^ ` ` ` { O ` X / ^ | j { ( ( ( ( } } [ } [ < : : [ S _ : X ; D :.P 7 P F H ' j g @ @ @ <.=.b c Q k f Q e e c c e e e e e J y e Q 7 8 N 1 t r %.",
+". . . . . . . @ + + # # V # $ # % % % & & & N N = = = = ; ; > ; > > > , & * v . ' ) ' ' ' . ' ' ' ' . v [.$ 7 2 ` ` =.` =.Y / | Y S P p ( S : [ } [ [ < < < < < _ : _ | ` ; D +.7 -.+.P H * y k j Q e }.C e z b j c e e e a J e e e Q |.@ a e e ! C K T %.}.M ",
+". . . + @ @ + + @ @ @ V $ $ $ $ % % & * * = & & = = = - ; ; ; > > ! > * & = @ . ' ' ' x v . . ' x ' ' ) ) + { =.=.` ` =.2 Y | / / 1 l A _ _ : < B Z [ < [ } [ B < : 1 1 1.;  .F 6 +.o P H J 0 $.$ @ z L S b e e d k Q e b K c e e b e e c y e e { R $ M ).2.%.",
+"' . . . . + . a @ @ @ @ # # $ # % % & & * * * N = = = = ; > ; > > ; ; & N * a . x ' ' ' . v v x . ' . ' ' @ { ] =.=.2 Y Y Y / / Y 1 l 0 1 1 _ _ : } Z } < : : B : _ / 1 1.- @.F ..6 6 P :.j J h l e e ^.0 b e K { J e e e K Q e Q e e e v c e e i C y !.%.T | ",
+". . . . . . @ @ @ V V V # $ $ $ % % % * & = & & = = = ; - ; > ; > ; > = & = V ' ' ' ' . . . x x x x ' x x $ { O ` 2 2 Y / / / Y 1 1 7 A _ ( _ _ : B Z Z B < _ : : S | 1 1.; D 8 6 $.n F n y R N z y h }.{ e e Q 8 ! Q e e e e e e e e e e c e Q 0 f N M t Z !.",
+"K K . . . @ + + + @ # V # # $ # # % % * & * * N = = = ; - ; > > > ; ; & N * @ . ' ' ' . . . . x ' . ' ' ' + { =.=.Y ^ / | Y / Y | / *.A _ : < : : [ [ [ Z Z < : _ / / _ ` = D P n H 7 +.*. .v 8 8 e b ;.j Q e @ 0 c e e e Q e a ].N ].e z $.i N h R ; s #.!.1 ",
+". . . + + . + + @ @ @ # V $ % $ % % & & * * & & = = = = ; ; ; ; w ; > = & * @ ' ' ' ' ' . . x x (.' . ' ) + { 2 Y Y / / Y / / 1 1 1 *.7 ] 2 ( : } B < < Z Z : / S | | _ ` ; 3.+.G +.+.A j @.>.K $.b 0 '.b e e J j $ e a z $.l 1 S _ j J y O 0 O 2.C O 2.M 1 [ ",
+". . . . . . . + @ @ @ # # # % % $ % % & & * * & = = = = ; > ; ; w ; ; & * = @ . ' ' ' . v . . x ' x . ' ) + ` ^ / / / ^ Y / | 1 / | :.I 3 H F 4.| : [ } q Z : / S 1 1 _ 1.- 5.+.6 6 *.6.P = ' 0 k Q e %.k Q e e ! 0 ! d >.R j l j 0 0 e v 8 >.0 { X 1 }.).L 1 ",
+". . . . v @ + + @ V V # V $ % $ % % & * * * & * = = ; ; ; ; > > > ; > * & * @ . ' ' ' ' . v x x x ' x ' . , =.| ^ Y Y / / / 1 | _ _ { o 3 i o F +.6.C ^ : [ } [ S | S | 9 = 3 6 >.6 ~.A 5 * Y y n b { %.b e e e 0 d f f i o $.$.g 0 j 7.; Y >.>.| R 0 u %.t ).",
+"K K . . . + . a @ @ @ # V # # # # * % & & * % & = = = ; ; ; ; ; > ; > & & = . . ' ' ' ' . v . x + . x x ~ ; Y | / ^ X Y / 1 | | ^ ^ 4.P R o o R :.*.9 F >.1.C | S S | / F % H ~.>.0 8.6.F * $ 0 f e J U $ e Q b ! 8 d i i j j R f { { Q f 2.O 0 X | 1 !.M %.T ",
+". . . . . . @ + @ @ V V # $ % % N % % * * * * * = = = = ; ; > > > ; ; & % * @ . ) ' . . . ' x ' x ' ) ~ W = 2 1 ^ Y ^ / 1 | | / 1 : p 3 3 F +.n 9 *.~.A A G 8 P :.:.j H > - H A 0 8.0 4.3 V P K f b 0 S c a ].Q { d i o o $.o o o 0 d e f Z >.O j O Z !.#.L s ",
+". . . . . @ @ + @ @ @ # # $ $ $ % & % & & & * * = = = = ; ; ; > > ; ; & % & . . x (.) ' x x x . ) + , = ; = 2 ^ ^ / / ^ Y / | 1 1 _ A o  .E o P 9 ~.:.9 A G F 8 o 3 @.> ; > -.>.8.6 8.^ :.v > n d e c ;.a N c c $.k ; h o j j l 0 { o 7.N C >.O | | M s u #.Z ",
+". . . + + . + + V @ V V # # # % # % & % % * & * = = ; ; ; ; > ; w > ; & % * @ . ' ) ) ' + ' x x (.$ = - , ; 2 ^ ^ / | 1 ^ ^ S : _ | j R 3 w D 3 3 3 o G 9 A G :.8 o  .3.> 3.P 0 8.8.>.*.H & j ' n Q *.| k {.h e 0 $.i o o R l 0 j O d 7.h Y j >.| [ [ [ !.t &.",
+"K . . . . . . . @ @ @ V # % # & # & % & & * & * = = = - ; ; > ; > ; ; & % * . . ' ' ' . + ' (.x & , , @ $ W ^ 2 | 1 1 _ 1 1 1 _ S 2 7 =.1 1.9 8 o 3 3 H 3 o P 8 o o o H w > n 6.8.>.4.4.*.% > 0 $.e z ;.c k y {.R *.$.; f j *.X Y p f J f 1 >.>.C [ Z [ T ).%.",
+". . . . + @ @ @ V @ V # $ V % V * % & * & & * * = = = = ; ; ; > > > ; , & & @ . ) ) ' v x (.v @ ; , , , = W 2 | ^ | ( _ < _ ( Y | p j ^ [ < < : ^ 1.G E = = @.E  .E R H D > o >.8.*.9.6.A P I J l e d }.O Q z J =.R f n $.k j O { C o 7.>.Z j 0 1 T 1 T Z %.&.",
+"' ' . . . + + . @ @ @ @ % # % V # & % * * * * * = = ; ; ; ; ; > > ; ; & % * . . ) ' ) ' ' . , ; , $ , , - - ` _ ( 1 | 1 1 ^ { p P n O _ } : : : q q < C G o @.@.@.3.3. . .3 P >.>.8.*.6.*._.k O z e $ <.Q h c e f o i h o o j X _ 7 > 7.W { { 0 Y Z #.T U T }.",
+". . . . . . + + V @ # # # % V % * % % & % & * * = = = = ; > > ; > > ; % & & @ . ' ' ' ) ' ~ = = v @ $ $ , @ 9 ] | 2 ` { 4.9 n  .n P _ [ : : : B [ B Z } : / =.4.F o  .@.@.@.R A 4.*.O 4 4 G I K 0 e X %.j e {.v | $.; d o o ` r O z 7.7.y K R >.1 u T %.Y U r ",
+". . . . . . @ a @ @ V V # % # # # & & & & & & * = = = - ; ; > > > ; > % % * @ x ' x ' (.@ * , v @ @ @ @ - x D i :.0.o H o ..n o ; k _ : _ < < } B B : | _ : : [ < ( ` 8 D = 5.:.*.4.*.9.:.' I 0 $ e k t y @ y J v e y R *.k $ z $ Q e Q 7.a '.[ l C Z j ; ).<.",
+"' ' . . . . . v # @ @ @ # @ & # * # # * * * * & = = * 3., ! ! > > 3.; $ & = x (.K b _., - , $ + $ x @ = @ , - $ D D D ..3 5.H o I  ./ _ < < < [ } } : _ S [ B } < [ Z 1 @.# D P 6 *.0 *.- = g @ >.e Y t f e a a 1 b e n j v e Q |.e @ T N N }.a.} X O b e }.0 ",
+". ' . . . @ . x @ @ # @ # # # # * N & # & & & & * > & , > 3.* ; = > > * & = v ' _.v , = , @ v . v & @ $ W * @ = $ = i o D D k o 3 3 | ( : < } [ Z } : : : [ } [ [ [ } S n % W P ~.*.G 0 :.) f 7 N e l ).z ; b b j z y ! o @ e e e c { ;.}.e t t 1 2.j 7.f ).h ",
+"' x . x x . @ @ V # @ # # # # # & # & * & & = = * , ; ; * & * > 3.> ; # # $ x ' J , - , $ v + + v @ $ , = = , = , 5.0. .= k 5.$.i d _ _ ( < } B Z < S [ B } [ } Z : : _ p - W ..6 -.*.0 * + % $ 0 e e a k l ! Q z {.e $.j a e e Q e e ;.Z N 2.L 2.M { 7.b !.*.",
+"' ' . . x . . . @ # # # @ # # V N # * N * & & & ; & > & = 3.3.; > ; = & * , v ' - - @ a @ a v + # @ - - $ $ $ $ 5.R 0.i ; 3 5.- D d : : ( _ < B Z B [ } Z B [ } } : _ _ ` ! = -.$.+.7 ~.*.[.j l $ J e K j *.J e e e c j n Q e Q e Q b ; >.b >.0 C } >.b i ;.).",
+". x x . . x @ @ @ @ @ @ # # N # # & & & & * * = * , * > 3.& $ > > 3.> = & + a $ - , a * , ' . v v $ = @ $ $ $ D R H ; , - - D W i  ._ < : : < B B Z q Z Z Z Z } : : : _ =.W ; 3 G -.n O 4.@.N z { j b $ $.O z b e Q e k >.N e e b $ }./.T /.s S r Z { J Q r %.",
+"' ' . . . . . @ @ @ # # # # # # * V * & % & * = * > = ; @ ; @.& > > - D 3 D ; - a y y , ' v I n 3 ~ $ # v = 5.o W @ ; 7 0 D $ ; > > ^ ( < < < < B q b.Z Z B Z } _ : : : =.- W H ..-.6 +.8 _.{ N K 8 z y C l |.e e e Q ! k J e Q e $ Y Z M Z &.r 2.| f J Q e e ",
+". x x . . . @ . @ # @ # V # # & # & % & & * * * * _ [ } [ c.[ @.:.S c.c.| 3 , = a y ' a @ 5 L d.e.- x = @ w o D = ; _ f.a.^ * ; $ # O / _ [ } } Z e.q q Z B [ [ : _ < _ =.- > o ..6 P 5 g.j T s Q e y $ j >.N Q J y K J b b J z ; f 1 u 0 } C N ; h ; @ @ b b ",
+"' ' . . . @ . @ @ # @ # # # # # # & & % & * * * * S > * 3.* E }.S ~.* , i D , ' ' a @ ' (.^ /.d.d.o J @ W -.3 = W i '.d.a.| x % ) @ 1.2 | _ B B q Z Z q q } : : [ ( : : 2 = D o +.+.~.A  .y )./.; e e a | S c e e e Q e Q e $ %.T $ >.%.!.Z !.R f c j T S N c ",
+"x . @ . . ' @ @ @ @ @ # @ # # # * V & % % & N N * G > = = * D S 3.; = D R @ $ ' ' ' ' a ' : d.t t H [.W o W $ ; W , b.a.d.M |.b J . =.X | [ [ } B e.e.Z } < : : : : _ _ ] - > P F ~.:.A 8 # { T z e e e b N J e e e e e e e i %.!.; K >.R J { >.; c v u <.<.O ",
+"' ' x ' . . @ @ @ @ @ @ # # # @ # & & % & * & * > S / / S : / _ S : S : ^ W ' y ' y ' $ @ : a.d.d.I ' w D w w ; - , T d.a.: Q b b . ` X / < } B B Z B } < < : : : _ ( S h.; D F *.A 5 6.3.7.Q Q e b Q e e Q @ O b Q e e $ v z L t v ; #.).&.Y >.R e e @ i ! l ",
+"' ' ' . . @ . @ @ @ # @ @ # # # % # & % % & * * % 3.= = > ; - > = n H = V @ a a y a @ & + _ d.d.t o ' @ $ W i W , , c.d.t 1 e ,.b . ` X / M [ e.Z } [ < : : : : ( ( ( _ 2 ; 3.:.7 :.~.*.> # @ Q J $ $ e y e $.r d y l k K $ h T '.i i B L @.j 8 c R C e P {.h ",
+"@ . ' . @ @ @ . @ @ @ # # # # V * # & & % & * N * & = = ; ; > ; H 3 * $ x $ y a y , - $ ) _ d.d.t j ) ) v * - 3., $ c.;.t 1 e b b a ] X Y _ [ Z B [ : : : : : : ( _ ( _ ^ W 5.~.4.A 6.O n 6.1.A @ $ c e Q e $ { Q e l l >.i $ s ^.- = 1.%.b.E z $ 0 _ i 7.e i ",
+"# @ @ ' ' . @ @ @ @ @ # @ # # # # & # & % & & & = $ ; = & = > 3.o w V $ V $ ' ' ~ = , a b _ d.d.d.n J . $ $ $ W ; % '.;.;.2.e b J . =.X ^ 1 _ } [ < : _ : : _ _ 1 ( : _ ^ > 3 A 0 >.4.8.8 >.A g.0 e e c | z y N c e y h o d [ s '.4 @.8.^.A _ ! 0 Z 2 D - e 0 ",
+"% @ @ . @ ' @ @ @ @ @ @ # # # # # & # & % & & & & > & > * = o n > = ~ K * a a ' ! $ (.x ) _ a.;.d.d ) = = , , & D % u d.;.2.e Q J . ] X X / S < : : < : : : _ _ 1 S : : / w 3 4 6.8.4.0 F G 9 =.% e e c M }.M =.e e *.f k l 1 s c.5 F S a.b.o @.j t >.A 1 - n ",
+". @ @ . @ . @ @ @ @ @ @ # @ # # & # * N & & & & ; ^ 3., = -.S ~.* @ , W =.$ a = , ' _.a x : d.;./.H ) , & = = $ D , '.t ;.2.e b J . =.Y / 1 S [ < [ [ < < : _ : _ : < < | D H >.>.*.0 >.*.+.8.4.> e b e i ! C Z z b z f R h | < c.q 8.} /.1.; J | ^.^ { G J C ",
+") ' . @ . . . @ @ @ @ @ # # # # # # # * # & & , & S v 3.k H : 6 $ $ V ' ^ = * - _.y y v ' [ d.;.;.n {.' % ; & & > $ '.;.t 2.e b J . ` / 1 ( _ [ < [ } < : : _ : S : < < | D H A >.>.8.*.~.+.9.A g.. Q e e J j 8 b e M l ; d 1 }.c.g.>.C '.S H N P !.=.@.N g l ",
+"(.(.x x @ @ @ . @ @ @ @ @ @ # # V * * & N N & % - q A O C 9 < S :.A F :.b.o x a ' y a , = [ ;.;.d.$._.v $ $ - W , @ '.t ;.2.e ,.,.+ C / 1 ( < [ B [ < < < < } < [ : } B / w H A 0 >.>.>.~.6 >.8.5 O 5.V |.e i P y c l C $.$.C q %.^ -.* ,.C ^ & _ S X E ! *.| ",
+"i.i.K K v v @ x # @ # @ @ @ @ # $ N N % & * = , ! ^ } } S ^ [ 2 S ^ | | S - (.a y ' $ = # S t /./.f b # + @ D $ - + q ;./._ Q |.) $ 2 | / ( < [ B B [ [ < < } } [ M } B 1 w H A A *.4.>.~.~.>.8.8.9.0 6.3 Q ) i b Q [ 0 z l 1 T }.} +.~ Q P g.E >.q { 8 A M f ",
+"i.(.x x x x v @ v V @ # # # # # % % & & N $ , , , n n ! V ~ V % + V 3.k > i.a ' K V * , a : /.;.;.f ,.~ - @ $ ; % x '.<.d.: |.|.{.+ X 1 / : [ [ Z B B } } } [ } [ : [ B | D H A A >.>.0 6 6 0 0 8.9.9.9.{ R z ! e Q { r k k | Z ^.} ^ -.Q H 3 N A } [ o h | $.",
+"i.i.(.(.x x v v @ @ V V # % $ # $ $ * & & # $ , H -.; v $ V V $ V ! w $ a @ K y $ , , ~ @ B <.;./.$.b Q ) = % $ $ b q /.d.2.e m J . =.( Y : : < B B B B B B } r [ [ } } 1 w H A A >.>.4.~.6 0 8.9.8.6.>.~. .J N a |.1 | d d [ s s c.5 -.$.5 n @ P } S b 8 | N ",
+"x ' i.(.(.x v v v V @ @ V V # $ # % % , V , ; 3.-., @ ~ $ , ! , ! > - ~ ~ K i., * v ~ * $ : ;.;.;.k 7.' ,.' = % ) Q './.;.: e J c ~ C S Y ( [ B Z Z e.q e.Z Z } } [ } Z ^ D 3 A A *.4.>.6 6 *.8.8.6.9.4.A P ) ].b e j | i R 1 }.L ^ *.! i.| A N 6._ _  .j S y ",
+"i.(.i.i.(.(.x x x v @ @ # # # % % , $ $ , ! 5.3 K = V V @ V v > ..w , v @ @ $ @ K $ > * (._ /.;.t O e ,.' 7._.y e ! %./.;.} Q m J $ 0 : S 1 : B q Z q e.q Z Z Z } < } Z | 3.H A A >.>.4.~.6 0 8.8.8.9.4 ~.G ' ].y b 2 n ! 8 2.s }.< 5.J Q :.A > 7 B } N | O J ",
+"(.(.(.(.i.' (.' v x v V v V V V $ % $ ~ ! $.$.! @ =.> v $ , * P - , V a = V = x J V ! V ,.( <.;./.L $.e |.m e |.$.} <./.;.1 b b _.. d X _ _ < } Z q q b.q e.Z B } } B Z | w H A >.*.4.>.~.6 >.0 9.>.6.6.~.o ) $.b c d C f 8 [ }.^._ { ! ,.:.n * G }.=.' >.=.e ",
+"y y (.' (.' x (.' ' . v V V # $ # $ $ , k -.> i., j.=.| S ^ Z ^ ^ | | | ^ , . x v _.x $ ) Y ;./././.L C y e b j t <.;.;.<.0 e J ' {.x G ( : B Z q q q b.b.q Z Z } [ [ Z | 3.3 A A >.>.>.~.6 0 8.0 8.9.5 4 g.$ $ N Q 0 n ].j 1 T }.u ^ n = j @.' A Z 1 7.C ; b ",
+"(.(.(.' ' ' (.' ' x V V ' V , V , K ; n k ~ @ v v ^ $ v @ * H $ * @ $ , v @ $ (.' v _.V @ $ T /./.;./.<.}.=.r ;.;./.;.;.t N e _.) ' ) + D F C : } q b.b.q q q } Z : [ q ^ 3.$.A A *.4.4.6 6 >.6.0 9.0 4.A E {.I J b n { k j O u ^.#.1.K , C G = ` Z ` > 8 h e ",
+"' K y (.' ' x ' ' (.x . v V V V x = $.3 ! v v ~ $ :.# $ * - k * a * , @ $ i ; v ) ' J ' & b @ T ;.<.;.;.<.;./.<./.t <.).8 e _.b ) ' (.' @ = 5.+.^ : } q q q q Z } : Z Z C 5.-.4.>.*.>.4.6 6 0 6.6.9.9.>.7 g.h ].].Q $.8 i O O u ).'.n 7.Q 9 > = | c.Y = 1 K e ",
+"(.(.' ' ' x (.' ' a K v v v v v , $.k , K @ @ x v & x V V @ > 3.* = @ $ w $., $ V v K V b # _.b ; &.;.;.<.<./.;.;.%.R b e y Q ) ) (.' + $ = 3.R +.>.8.C ^ ^ S : } Z q [ A 3 n A 4.~.4.A 6 6 >.0 6.0 0 6.~.3.{.k y b 8 { R j C #.L #.g.v & n o > A f.o { h b e ",
+"(.' (.(.(.' x x i.x i.' @ ' v * w > ~ i.i.$ $ x & (.$ V x V , w 3.~ ~ k H w y a V = K a a a (.) l ^.<.<./.;.<.<.<.;.O v e b _.' ' (.(.v $ - 3.n n *.>.*.~.~.6 +.4.8.^ 4.n 3.n >.4.~.4.A 6 6 A 0 6.6.h.4.+.{ I ].; e h C f M f &.).s A (.K 1 > # ^ j.1.* R e e ",
+"(.(.(.' ' x ' ' ) K ' K ' v ~ 3., v v @ @ V # v v v $ V V = V V $.> 5.3.- v v ) _.a ! ~ a |.D u <./.t /.<.<././.;.t /.%.d e . ) . _._.v $ = 3.H ~.*.4.4.>.*.+.n  . .o -.w k n 4.4.*.>.4.+.6 A 4.4.C 0 *.>.$.7.! $ Q k R j R >.s #.!.^ x ; 6.G > =.L ; ` ! e Q ",
+"(.(.(.(.(.(.(.K y a @ a K ' $ ! * K i.@ v x @ # (.8 8 F F *.:.:.~.0 h.G -._.@ ' ' Q , - @ $ '.<./.<.<.<.U M T /.<./././.!.W Q ' + J J . % = 3. .n :.~.*.>.~.~.+.-. .H o $.H n >.>.*.>.A +.6 A 4.O 4.*.0 4 6 @ h N Q N | ; 2.v T ).!.{ Q {.^ @.E S =.] 0.b Q e ",
+"' ' (.' ' ' K ' a @ @ K i.v ~ , > * @ x v @ x . ; } *.*.F 8 P G 4 g.=.{ _ $ . ' N ) 7., D { d.<./.<.L [ z e @ X ;.<.<./.<.0 7.) ' ) # D 3.3.3.5. .H n n F ~.F o -. .H R $.H n *.4.~.>.A 6 6 7 4.~.^ 9.>.*. .Q $.k Q h 8 8 l $.#.%.!.=.b V E * D S j.> D {.e v ",
+"' (.' (.' x x ' (.y ' i.i.V , @ ~ ! , x v # v @ x S V $ , $ = ; 3 -.~ ' | $ + @ + x x b b e.<./.<.'.W |.|.) Q {.i 2.;.<.<._ Q _.J @ P 1 : ( ^ ^ g.4 F -.H o n H 3 3.H -.$.H n *.>.~.4.>.6 6 A A 4.6.A >.>.R ' i N Q ; 1 8 | K Z ).!.O ' > =.; o b.[ G I Q e e ",
+"x (.) x ' i.) (.(.x K ' ~ ! , K K @ 3.- v v ' $ $ c.S | ^ 9 4.] 9.:.6 ^ j.= $ & y ) v # Q : <.<.<.d Q ' . . @ @ c J }.<.<.M e J m @ X ( ( : [ Z b.q [ S =.j 5.> 3 W  .H  .5.n 4.>.*.>.4.6 6 >.4.A 4.8.>.~.-.' ; f Q h f | >.; r ).L : _.$ :.G 9 | #./ % e e y ",
+". (.(.x ' ' (.' ' x ' (.v , $ v K ~ v 3.> _.@ v v $.o :.F g.^ 5 6 *.:.6 3.$ - J _._.$ ; ,.S /.<.<.d Q ' . ~ % % @ c s <.<.[ Q b J a C 1 1 _ < Z Z b.'.c.q } ^ ] n  .i i 5.E o ~.>.*.0 0 6 6 *.4.A 4.8.A 7 n @ - $ Q h 1 f | Q !.).%.2._.b 6.3.3 ] ^./ @ Q |.Q ",
+"(.. (.(.' ' ' ' (.v x (.i.v V V V i.v ; 3.= K v @ K @ $ - H > = $ - - $ - @ V y ) V ; , e 1 <.<./.o {.' ' * ; z @ c T ;.<.} e b J + 2 1 ( : : } q q b.b.'.q q Z < 1 *.i D 5.o 4.*.~.*.0 6 6 >.>.6.4.8.>.~.6 D n o e f i Z R i Z ).%.&.b v 3.*.-.C U 1 |.b e a ",
+") x x ' (.x x ' x x K x x K v V V v V K = 5., $ v , v , H 3.~ @ $ , , V  .@ ,.(.v $ % . e 2.<.<.<.o |.' v - ; % b b s <.<.} Q {.J @ X 1 ( : < B q q q b.b.q q Z q q : p 5.> H 8.>.*.0 0 6 6 >.A 6.4.8.*.6 P = k ; e f X *.1 e %.L d.X _., ^ 3.=.B <.p Q D - e ",
+"J ' x ) ) (.x (.x ' K K K v K v @ > v (.@ & w , @ , > -.5.w ! @ $ - - - b # v a ; v ) . e S /.<.<.o |.+ # , # ) Q Q s <.<.M e m J . C 1 1 : : } q q b.b.b.b.q q < B Z : :.> 3 *.*.6 *.0 6 6 >.>.A 4.4.4.~.F w  .k Q K R &.n $ 2.).%.}.b > H ~.6.q ^.P e ]._.z ",
+"{._.(.(.(.(.' ' x ' ' x x v K K ~ ; = V K ' , - , 6 O 9.+.7 *.9.:.8 G R W ' % + $ . ) ' e 2./.<.<.I |.$ $ . _.Q b b s <.<.M e ,.J @ 2 1 1 : < B q q q q q q Z Z Z [ Z e.g.@.H *.0 *.*.0 6 6 *.>.A 4.A >.6 F  .o ! Q h =.C Y Q t }.t | m ) A 6 5 g.f.n {.|.e e ",
+") ) ) (.x (.' (.(.K x v v x v x V K w ! ~ v _.- H '.^ A F F ..4.C 7 4 :.B $ , % (.x ) J e [ <./.<.f ,.~ ' [.,.Q J e T <.<.[ e ,.{.. =.1 ( _ : } q q b.b.b.q q Z } _ < q ^ 3 5.~.*.6 0 *.+.6 >.>.A 8.4.>.+.R ; ; $.e K $.&.R J 2.t f.%.7.J 5.-.H / ^.o Q b e $ ",
+") J ) ' v x K x (.v v K (.K v v K K ~ 3 3.v v K $ [ $ v V $ & a $ , ' # ^ z $ J ' [.|.J e [ <.<.<.o {.. b Q ,._.,.e T <.<.[ e b J @ =./ ( : < B q q q q q q q Z Z B } q ^ 3.w 4.>.~.0 0 6 6 *.A A 4.4.>.6 G o n $.Q ! 0 2.Y J ).}.).r J > 5 +.F ^ a.D b ' |.Q ",
+") ) x $ @ ) ) V v x (.' v v v v K @ i.@ $.5.$ i.$ '.[ S ^ ] F :.F :.F ^ '.; J |.b |.b ) J 2./.<.<.n Q Q ,.Q |.b Q e '.<.<.M e |.b . ^ 1 1 _ : } q q b.b.q q Z Z [ < } Z ( D $.~.*.6 *.*.6 +.*.>.*.4.4.>.G o ! v k e c n '.$.e M t ).^.Q , 3.A 6.e.s ].Q m e b ",
+"(.V % v (.x V $ v v x K (.i.i.K v K v v * 3.3.@ K 5.P 5 9 +.~.F *.~.F F n ) |.m Q 7.,.) _.M <.<.<.g Q |.J Q Q Q Q b T <.<.[ Q {.b a X 1 1 _ < B q q q b.b.q q Z } < [ B | D $.*.*.*.*.*.6 +.~.>.A A *.~.*.F i + $.b y l T *.K %.L ).'.z $ o >.6.^ a.].J $ Q e ",
+"% N v ) (.$ $ v _.x $ $ v ' x v K v v K _.; H 5.@ i.$ * ! V - * ~ $ 3.= {.) ,.,.Q b ) ' _.2.<.<./.I e e Q Q |.Q Q e T <.<.: e |.J . 2 | | _ : } q q q b.q q Z Z B [ } B | w $.~.*.6 *.*.6 +.*.A A 4.8.*.n P ..D h e c n s z _.[ ).).}.7.v x 6.3 X %.d e @ e b ",
+"- v _.) x v x ' i.(.x v v v K x (.$ x (.V , = 3.$.* V K * - > 3.- , ! a |.' J |.) ' ' ) J _ <.<.<.d Q Q |.Q ,.b b e s <.<.[ e {.b a C 1 1 S : B q q q b.b.q q } [ < } B | D 5.~.*.*.*.*.6 +.~.>.A *.A *.6 F D Q j e Q l r R K %.!./.u @ J F C A 1./.i @ z c Q ",
+"' ) _.(.(._.(.V (.i.i.x v v (._.v v (.V w , i., A 3.@ @ v > 3.3.k w 3.v , J b {.) ) ) ' ) _ <./.<.$.Q Q ,.,.Q 7.b e #.;./.} e J {.. X / | _ : } q q b.q q q Z Z } < } Z | > $.6 *.6 *.*.6 +.~.*.~.A 8.~.n 6 :.d z K e o %.@ e Z ).).T J * F 1.~.B }.0 Q ) m J ",
+"_.) (.(.' K x x x (.i.' $ , $ V x i.v * & v @ - , R n ~.6 O 0 6 *.0 5 :.*.. b [.) [.) v ~ [ <.<.<.$.Q e Q b Q e e b s /./.} Q e b . 2 | 1 _ : B q q q q b.q Z Z [ < [ B | > $.~.*.6 *.6 +.+.6 >.>.>.>.*.~.+.; Q n e Q ` } ; a !.L L M 7.# =.C 7 =.t d c $ c e ",
+"K x ) ) (.x x ) $ V K ) ) V > 3 * K @ $ i.v ! 3.K 6 ~.F 9 5 [ | 6 7 0 5 F * ) ) ) (.+ ~ + Y <.<.<.k |.,.|.,.b Q Q J Z <.<.1 J Q {.. =.| | ( : } Z q q q q q Z B } : } B | w 5.6 6 6 *.*.6 n ~.>.>.A >.6 n F F o ! a Q 0 ^.c e T ).;.2.J i.6.A 5.=.%.>.J N y b ",
+") ) ) ) ) (.K v ) V , $ i._.v = $.& v v @ ; ! v V K $ = & V | ~.$ @ *  ., - x (.) x , + Q G a./.u J e Q Q Q Q b b e 0 ;.;.j e e b a C / 1 ( : B Z q q q q q Z Z [ : [ Z / w 5.~.*.6 6 6 6 n 6 *.~.A >.*.~.R = (.n Q Q Y u @ @ #.;.;.1 c ) F C F j L o c @ e e ",
+"x ) ) (.' i.(.' K ' , = @ K K i.= ! v K ! * i.V v ^ ^ S | S j.Z | | ^ ^ | W @ v # * ' b b {._.~ |.Q e e _.e Q ,.J b e @ @ b e J b . ] / 1 ( : } q q q q q q Z B } < } B | w 5.~.6 6 *.6 6 +.~.>.A 0 >.6 6 P o  .; $ J =.U e b #.).<.1 7.3 C A 8.^ L O Q c c e ",
+"i.(.x (.(.K ' _.(._.K , * a K @ ' ' i.@ > k * i.v *.:.F :.F >.+.6 :.:.:.F * , , = (.b |.|.Q e |.|.e J e e e b e e b e b e e Q {.m a =.| 1 ( : } Z q q q q q } B } : < B 1 w 3.6 ~.6 *.*.+.n 6 *.*.>.>.G 6 n ; J g Q e u &.J @ T t L 2._.F >.8.*.| a.>.K ; Q e ",
+") v v (.) (.(.(.' x i.' = * K y (.x ' @ ! 3.- $ K V @ & ; @ x & v $ $ $ (.' % = (.b |.|.J _.,.e e c 7 [ T }.T } R a e e b b b b b K 2 / 1 S : [ Z Z q q q Z Z B [ < } B | D  .G 6 6 6 6 6 +.~.~.G *.4.~.n P H - I z Q 2.u e e }.%.;.{ ,.= 9.~.A =.L C e J y |.",
+") ) x v x _._.K i.a a K , w , _.y V $ * 3.* ~ > $ i.a a , w $ v , @ x V y V V y a ) {.Q m e e b 7 }.<.<./.;.<.<.<.L 0 e e Q b c b K =.| | S : [ Z q q q q q Z B } : [ } / D 3.6 ~.6 6 6 6 n ~.~.A *.*.G n 6 o + f y e T =.b a &.;.L M 7.-.6 ^ -.A %.>.v z e e ",
+"J J (.V V x i.) i.y a $ , , - ! x v @ - k > ~ * * , v = 3.* ' $ $ @ v @ . J _.' # x J J [.e ~ 1 ;.<.<./.<.<././.<.;.<.e.@ e @ e b K =./ 1 ( _ B Z Z Z q q Z Z B [ < [ B | >  .F 6 6 6 *.n n G ~.*.*.>.G n n i ) j @ J Z }.e {.}.L <.G ,.H ^ +.^ ~.f.=.y N J J ",
+"' i.) ) v V v i.v v * $ y a ! w @.V v , ! k k * K ^ : : O , H ( ( | | g.g.x _.K ) v x ' ) _.S <.<.<.<.t %.%.U /./.<.<.<.'.c e y b K =.Y 1 S _ [ Z q q q q Z Z B < < < B 1 > 3.F 6 6 6 6 6 -.6 ~.G *.A *.n n  .$ h b c #.C Q a 2.t ).1 Q 6.>.9.6 S L =.b v |.e ",
+"x v ' i.i.v V V $ = , a ' $ , a -.= @ @ @ > $.k ~ : 3.' v $ ] A V @ , 3.< & y b |.@ # ' {.> L <.<.<.r h Q b ) ~ }.<./.<.;.I e Q b K =.| / _ _ } B Z Z Z q e.B } } : < } / w 3.G 6 +.6 6 n +.6 ~.*.*.~.G F R w ' l $ e Z u Q b %.t ;.p 7.! 8.*.*.=.).0 e @ e e ",
+"i.v , & v _.' , , a _.' - & (._.a V , - ~ K ~ -.k ^ ~ - $ x 1 :., # a ' ( J ) a ) J (.+ ' j <.;.<.L . e ,.e Q e b #.<.<.<.o ,.m b K =.| / ( _ } B Z q q q Z Z B [ : < } / D 3.F 6 6 6 6 n n +.~.~.A *.~.+.o 3.- $ c c !.j e c 2./.^.0 |.3.+.8.+.*.^.| J v Q e ",
+"v $ (.y * V b = , x ' ' V , a ' ) $ V v * ~ @ * -.j.j.c.j.^.j.> $ { ^ ( '.& J _._.J ) ' m : <.<.<.C Q e 7.e ,.e Q > <.<.<.O e Q J y 0 1 Y _ : } Z q q Z Z q B [ _ [ [ < | 3.5.+.+.+.6 6 +.n G ~.~.*.~.6 F n  .- 0 y e M [ e N %.L <.f {.~.9.0 8.+.L O v K b e ",
+"3.$ ' (.i.v i.(.- V a y ' V v a V $ ' y $ ~ @ * * -.> * ~ _.$ a @ = v ) - Q . x ) ) ) ) b : <.<./.l e e b e Q Q e @ )./.<.C e ,.e b *._ 1 S _ [ B Z q Z Z q Z B : [ } [ / > 3.+.+.+.6 6 n -.+.~.6 ~.~.6 +.o 3.; o e y T f Q e M ;.L =.e 6.~.0 9.^ L Y b N Q Q ",
+"$ v i.b a $ ' K V ' (.y ' V V $ + v ) J i.a ~ * @ > k > $ $ $ V $ v $ x @ ' V ,._.J ) (.m 2.<.<./.g e Q m Q e Q e b #./.<.S e b c e @ n 2 : < } } B q q Z Z B } < _ : [ ^ > 3.n 6 +.6 6 +.n +.G *.~.G n n n o I P c b M X Q a ^.L <.h e 3.^ *.>.=.d.>.$ J Q e ",
+"b i.K J V = V $ y y (.) i.' V $ ' ) ) ) ) ) a @ ~ @ * 3.k - @ $ $ v $ ' (.a y ) _._.) (.{._ <.<.<.o e Q e Q Q Q Q Q u <.<.M e e m e e x D F ^ [ q q b.q Z Z Z [ B _ : B / D 3.+.+.+.6 6 n n +.G 6 6 *.G n o 5.> @ e N M o e b [ <.).Y e = *.8.-.5 ^.u e @ e e ",
+"K _.@ $ @ ! - v J i.x v . (.(.' [.) ' ' ) ) ' (.w @ a * 3.- $ ,  .v $ v x v b a ) ) ) ) J : <.<.<.d Q b e |.,.b ,.Q '.<.<.} e e |.J b b [.. 3.F ^ S } q b.q } [ : _ < B ] 3.@.+.6 +.6 6 n n +.G ~.>.~.+.n R o H k $ e Z { e z T t <.~ ) >.9.0 ~.5.a.O @ e Q e ",
+"a ' ~ $ , ! V i.) ' V $ V (.' ) ) _._.c y y ' ) _., * ~ * > 3.@ ^ @ @ V y ' J ) _.) ) ) m _ <.<.<.f e y b e e Q e Q '.<./.M e e Q |.Q b ' V = w 3 F 4.^ S } Z q < < Z } p > @.F +.n 6 +.n -.+.~.n G ~.G n H D = {.e ; C $ e e r <.L j b h.*.0 8.^ %.&.e $ e Q ",
+"J y i.a - $ b y K V v V @ x x (.) ) c c y K y ) . $ ~ ~ @ * > > | a @ @ v v ' J ) ) y ' m : /.<.<.d Q a ' b Q e e Q T <.<.: e 7.Q |.{.J ' , ; 3 o n n n n ~.6.g.S _ [ ( 8 > $.n +.n 6 6 n n n G ~.~.~.n n o 3 i J { e &.>.b a #.t <.@ b 3.^ *.>.C d.| v b Q e ",
+"a _.K @ ' i.J K $ $ v v x ) ) J _.) y y y y y K ' ) V , , ~ ~ > _ $ $ ' x (.(.J J _.) (.m : <.<.<.n Q ' . @ ' Q Q Q T <.<.2.e Q J Q {.) ' V &  .H n :.F n o H  . . .n n ; ; H n 6 n 6 6 n n +.6 6 6 ~.n n o 3 D @ @ @ f K e |.s ;.U j e * *.C +.4.%.r c y e Q ",
+"_._.(.y J i.@ @ 3., v J ,.) ) ) ) ) ) ) y K K . a + v (.' , $ , : 3.$ y a ' ' J ) ) ) _.b M <.<./.n Q J @ , . ,.e Q T <.<.M e 7.b 7.m m v & >  .H n 8 F 8 o 3 5.D * D 3.> > $.6 +.n n 6 -.-.n 6 +.~.+.+.+.n i ; @ }.y C h e z &.<.).@ ,.P *.9.n o ^.Z c b e Q ",
+"V y J _._.K * k * -.@ _.' {._._.) ) _.) ) K . . a . . . @ # $ V - - - a a @ _.) ) ) ) ) ,.2.<.<.<.H |.. @ $ ' b Q Q T <.<.M 7.7._.e J ' N = ; > 3. .o R P R o 3 i = D 3.w > 3.n +.+.n 6 n -.+.6 +.~.~.+.n -.o n @ o k K N e e %.t L f @ ~.8.*.9.7 f.2.K b e Q ",
+", v J ,.) @ * * k ! $., J (.m ) _._.) ) ' . . + # @ % @ @ (.% % . = ; - ' y ,.' ) ) (._.b : <.<.<.H |.@ + + x ,.e Q T <.<.M e e e e H { ^ g.*.n  . . .5. . . .3 D w i 3.w > k n 6 -.+.+.-.n n 6 ~.6 n 6 6 o 3.D z /.b C v e $ S <.!.J 7.A 8.8.*.: L u Q c e e ",
+"K @ @ a $ $ ' J 3.* > k v b ' [._.) ) ' . v v v # . # x @ @ # # = , @ D v $ ' J _.) ) ) ,.: <.<.<.o {.' v ~ ' Q e Q T <.<.M e 7.m c 0 / S _ < [ S ^ A P 3 3.3.D W ; D D 3.3.k +.+.n n 6 -.-.n 6 6 ~.6 +.n H 5. .8 2.j J c e e ^.t %.f 7., 8.9.*.7 f.Y y e e Q ",
+"_._.v w 5.$ _.) ~ * * k 3.v [.) ) _.) ' x . @ @ V V % % E j P n R n $ v $ $ . ) ) ) ) _.{.: <.<.<.0.b ' @ $ ) e e 7.T <.<.M e e e c ` 1 / | : < Z Z q } ( 1.j o @.D ; = > 3.3.n +.n +.n -.-.+.+.+.6 6 +.n 3 w $ ; t e R c e c 1 /.}.Q J 6 *.^ n F ^.}.b b e e ",
+"K _.J $ 3.> a J i.K > > > 3.K ) ) ' ) ' v v V V x ^ q q ( ` j p ( | '.b.:.) ; ) ) y y _.,.: <.<.<.o Q . $ ' Q e e e T /.<.M e e Q ' X Y Y ( : < B B Z Z Z B [ < ^ A n D - w k n +.n +.+.-.-.n 6 6 +.6 +.n 3 & ,.j !.{ e J e J '.;.L k N 4.8.0 9.5.f.[ y e e _.",
+"@ i.J J @ w - _._.i.i.! > > k v y ) . v v v v V & ^ = v + % @ ' . . ' W < $ b ' J ) ) ) b : <.<.<.o |.. ' b e Q e Q T <.<.[ e e Q c X / ( S S < [ } Z Z q Z B B e.< / :.3.- 3.n n n n +.-.-.n +.+.+.G +.n 3 3.D o /.e N e Q e | ;.}.7.7.4.0 6 6 g.f.T b e e e ",
+"K a v K i.$ w > ' i.J _.* 3.! $.i.(.x . v v v V a b.0.G j j *.n 9 j P R q a v x _.) ) _.b : <.<.<.o J ) e e Q Q e e T <.<.M e Q b _.C X 1 ( ( [ B Z q Z q B [ [ S < q / o - 3.n +.n n +.-.-.n +.6 n 6 6 -.3 D > l t 0 Q e Q J }.).%.> 7.5.9.8.6 6 L [ K Q e Q ",
+"_.i.@ v _._.V w $ J i.i.@ k > > 3.* i.$ 3.- (.@ % P 7 F 9 9 j p j G ..o A H v ) (.(.y x ) B <.<.<.d e Q Q 7.Q e e Q T <.<.[ e e e K =./ / 1 _ [ B B Z q Z Z B [ : ( _ < 4.* 3.+.-.-.n n -.-.n +.+.n +.6 +.$.> m { %.e e e e e S /.T 7.' 4.*.9.H +.%.T b e Q Q ",
+"i.K K _._.i.K v R = b i.i.@ k > > 3.! $ x V & $ v * ' @ & @ , ' $ . = @ @ ) , V ' {.) = # e.<./.<.d e 7.Q e Q e e e u <.<.M e e e y =.Y / ( _ [ B B Z Z Z B B } : S < B =.- 3.n n -.+.n -.-.n +.*.+.n n 6 H ; {.*.<.j e e e K s ;.U $ z *.8.0 6 > j.T c e e e ",
+"~ ~ K _._.v ~ v @ $.w i._._.K ! k - $ K y @ = = $ # + * $ v & & v ; = v a ' (.$ ' ,.v > + : <.<.<.f e Q 7.e Q e e Q T /.<.[ e e e K =./ / S S [ B Z Z q Z Z } } < _ : B 2 > 3.n n -.n n -.-.n +.n 6 6 n n H H i *.t ; b e e e [ <.M 7._.^ 0 0 0 ] L u J e e e ",
+"~ K _._.' @ a ' b i.H 3.i.K K i.! ! @ _.@ , , = @ v = $ $ = @ , , ; ; W b (.a V x _.. % m ( /.<./.$.e e 7.e e e e Q T <.<.M e Q e K =.Y Y S _ < } B Z Z Z B } [ < _ : B ^ D 3.n n -.n n H -.n n n +.+.n o $.> {.` <.$.e Q e K r %.%.z Q ! 9.8.+.5 f.!.$ Q e e ",
+"~ @ v $ $ ' y ' i._.a $.- _.v i.K * - K ' $ @ ) ' ..F R j :.:.F *.:.*.~.o y a @ V . ) [.b [ <.<./.f e e Q e Q e e e T /.<.M e e e y =.Y / ( _ [ B B B q B B } [ : : : } C > 3.-.n -.n n -.$.n +.+.n +.n n H 3.7.=.;.=.e e e e u <.[ 7.) O 6 0 *.+.}.u J e e e ",
+"w * $ * $ _.i.v _.a {.a 5.$ ,.K K K * * @ $ , _., B *.:.p j r 1 *.0.:.P c.$ (.b y . ' y J } <././.$.e e 7.e Q e e e T <.<.M e e e K C | Y 1 _ < } B B Z Z B } [ : 2._ } ^ > w o -.-.n n -.H n n 6 n 6 -.3.5.3 [.X ;.v e e e K 2.;.s c = A 9.8.n ! }.^.N e e e ",
+"$ & * @ i._._.' @ {.(._.$ 3 @ b ~ y ~ > > > 3.* y : @ ' $ x _ A 3 V ' y : ' D , {.(.V # m _ <.<./.f e e Q 7.Q Q e Q T <.<.[ e Q e y =.Y | ( _ [ B B Z e.Z B } } _ : : } C w > n n -.n n H 3 n +.+.n n n n n o ) | t M Q e e b e./.1 7.@ C 6 *.9...#.#.v e Q e ",
+"m ~ - ~ @ @ K _.' % (.(.@ & w ! _._.y a * > w > a '.7 ~.R ~ 2 H $ ( ^ h.j.! v $ (.,.) + Q / <.<./.f e Q Q e Q e e e T <.<.M e Q e K =.Y Y 1 _ [ } B Z e.Z } [ [ _ : : B Y w > n o H n n -.H n n n -.-.-.$.! ; ' U ;.; e Q e J 1 /.u J 7.n 8.*.*.| d.%.v e e e ",
+"|.{.$ > * @ K i.) J @ & V _.' H * i.y a K ~ > > k k o :.-., v , , o *.:.5.a J ' - a J v b [ <.<./.o e e e e Q Q Q e T <.<.} e e e y C Y / S _ < B } B Z e.B B } 2._ : [ ^ w 3.o -.-.H n H $.n n +.6 n -.3.H  .) u <.M Q e e e u <.X 7.' H *.9.*.G ^.}.N e e |.",
+"[.Q {.$ = = V i.(.(.v v y J _.* P ! y i.@ @ ~ > ! ! , a ' x @ + # + W W ' b ) b = & J ) |.: <.<.<.$.e e Q e e e e b './.<.M e b e y =.Y Y 1 S [ B B B Z Z B [ < _ S : [ / > D R o H -.-.H 3 n n n -.n -.3 @.. ; t t j 7.Q Q y X <.M c > O >.0 -.$.T %.v e e Q ",
+") ,.{.) $ ; * K v ' v ) J K $ , W 3., J i.v @ ~ > 3.! x i.$ * $ $ & @ x (.y y x V ; J J |._ <.<.<.k e e b Q Q b e {.T /.<.S e e e c C Y | ( _ : } B Z Z Z B } } _ _ : [ ^ w 3.o -.H H n H H -.n +.H -.-.5.> ' k }./.S Q Q e e }.<.0 7.> 8.8.0 8.H %.}.; e e {.",
+"J _.) {._.V - $ V K K ) ) V , V b V ! $ i._.K K * ! $.3.& v @ $ , W $ ) ' x x & ' % . (.,._ <.<.<.k b e Q Q b e e e T /.<.[ e e e y O Y Y 1 _ < } } B Z B B [ [ _ S : [ / W w o n H -.-.H H -.n n n $.H 3.3.> ! <.).O J e Q J 0 ;.u 7.7.*.6 *.6 9.#.).c e e e ",
+"_.) J b {.(.$ ! ~ K K v v v v ' ) (.& ! , i.i.@ @ , ! 5.> V a $ & V V (._.$ - a b b $ + b : /.<.<.$.e e e e Q e Q e %.<.;.M e Q e y C Y / S _ [ } B Z Z Z B } [ _ ( _ < ^ w w o o H -.n H H -.n n -.$.H 5.3.; h u /.| e ,.e e T <.j 7.* 9 0 8.8.5 f.#.! e Q b ",
+"$ ' b _.) ,.J V - ~ v @ ' ) K @ @ x (.$ w * K K K K ~ ! w w = V V v v V , - V ,.) 7.J y c r <.<.<.j e Q Q e Q Q e K t <.;.Y e e e c C Y Y 1 S < } } B Z B } [ < 2.S : < ^ W w o o 3 H -.$.H -.n n $.-.$.3 = J j <.L 2.J e ,.e | /.| c  .C >.9.-.R '.%.c e Q Q ",
+"N v ) J _.b b _.- ! * ~ v _.' x ' . ) ) , w , i.K K v $ - w = v i.V v V = x Q b . ,.7.,.c S <.;./.} e e Q e Q Q e 0 ;.<.<.0 e Q e y C Y | ( _ < } } B B Z B [ < _ ( : < ^ w w -.-.H -.-.H $.-.n n H -.$.5.> J >.L ;.C e ,.e e } <.j 7.D =.0 9.8.= j.).i e e e ",
+",.# # J m _.) J i.* * ~ @ K (.) v (.' (._.$ w * K v v v V , $ x @ (.& > x ,.i.& ' # Q Q 7.{ /.<.<.t z Q e e e e N ^.<.<.<.R e e e c O Y | 1 S < } } B B B B } < _ S : < Y W w H -.3 -.-.H $.-.n n n 5.k 3. .> 8 /.;.u ) e e e 1 /.1 7.,.4.~.*.9.O }.}.y e e Q ",
+"b ' # . J J c J b K = ; , v K ) ) ' v v ) _.v - K v K @ @ V = ~ V v = v J $ ' J b v @ b e $ t <.<.<.#.0 ; c @ j t <./.<.;.$ e Q 7.J =.| | S _ [ } B Z Z Z B < : _ S _ [ ^ w D n o H H -.$.H -.n n -.H 3 w 3.7.=.L /.>.e e e c } t j 7.J n 0 0 *.8 f./.i e e e ",
+"J J ' @ a ) c J _.b i.$ = , $ v (.' (.v ' (.K $ > K i.i.v $ v v $ $ & (.J 3.= ,.) ,.. ' Q Q 2.<./.<.;.;.<./.t /.<.<.<.;.u J e e e c C | Y 1 _ : } } B B } } [ : _ _ _ [ / > w o o H -.n $.$.-.-.H -.H 5.3 _.b C t ;.}.e m J e 1 <.0 J ].8.8.0 n P j.}.v e Q e ",
+"i.b J v @ a y _._.{._.' $ , , v v x (.' x v x i.i.3 w _._.V V , , ; * K J i.$ ' J J . [.@ Q _.Y /.<.<.<.<././.<.<.<.t =.y e e e 7.y O Y C 1 : ( B B B B B B < < _ ( : < ^ > w -.-.3 H -.$.H -.n -.n $.3.3.3 ) | ).;.f e e e y S t i 7.o C 4.C 6 V }.t h e e e ",
+"_._.J _.) @ @ K J ) ) _.(.V , $ v x (.(.x x v x (.< : : 6.V :.B ^ S B : S i._.V a b (.x ' . e e g &.<.<./.;.<.<.<.r $.e e Q Q e Q y O 1 Y | : < < < B Z Z B < : 2.( : < ^ W D o -.3 H -.$.$.-.-.H n -.H 5.j J 1 /.).Y b ,.b e M <.{ 7.@ C 8.0 ^ 6 j.#.$ e e e ",
+"J i.) J _.' @ N J c _._.) a $ = V v K (.(.x x v x ^ > 3.= ) ( ~.$ a @ w } K _.v , y b (.m @ # Q e ) $.O : r S 0 $ e e Q J e e J 7.7.j _ S / S } } } B Z Z Z } < _ S _ [ ^ > w -.H 3 H -.$.$.-.-.H H k 3.5.(.# s <.t d e Q e y 2.t d 7.' -.4.9.*.~.L ).N e Q Q ",
+"b _.) ) _.J ) N @ y J ) y ) ) $ $ $ V K i.' v v _.: v . 3 $ ] n a , $ , [ , a J ' ! _.J x (.(.) e e e e e e e Q Q Q e e e e b e b 7.h C _ S S : Z B B B } [ < : S S _ < ^ > w o H $.$.H $.5.-.-.-.-.H $.w (.7.&.<.}.O e ) Q e u ;.j J W =.9.*.~.:.j.}.N e e e ",
+"{._.) i.i.J J ' # @ K y ' J {.' ~ $ ~ V K ' ' ' $ ( q U j.j.c.a $ 5 | ^ S ! $ ' y y , v y b y + ' $ k 8 n d d g d $.$.k $.J e Q e 7.J $.O 1 _ } < } Z e.B [ < < _ ( _ < ^ ; D H H 3 H -.5.k -.-.-.H k $.3.R + ^.t /.$ |.b {.c X t ! 7.o ^ 0 *.+.w s L ; e e e ",
+"{.) J b _.i._.{.' $ # c _._._._.v V V V V v x i.(.x V x x # @ v y , y ~ ' y , , ' b , ' $ b a Y %.t <.<.;./.<.<.<.<.<.<.<.0 e Q e b 7.b . W d 7 | _ B Z Z } < : S ( : < ^ ; w o 3 $.$.H $.5.-.-.H -.$.5.5.[._.#.<.}.o e @ Q e u ;.>.7.* C 4.9.9.= q L k b e e ",
+"_.) _.J _._._.) J ' @ # . ) _.) J (., $ V V V (.i.V v v V ' . $ a @ @ y m ' y * , m b ) ) Q q <.<.d.<.<.<.<.<.<./.<.<.;.<.1 Q e b 7.,.) . @ # ; D R *.] S } B < : / ( [ 4.> > H 3 $.H H $.k H -.$.5.$.> - (.! a.;.t @ e K Q b X %.].Q . *.4.0 >.h.^.t $ e e e ",
+"_.J _._._.) ) ) (.J ' # V ) {.(.' _.a , $ V v K ' i.x V (.v & (.V ' y a ' J b ' * $ a _.) k L <./.<.<./.<.<.<./.<.<.<.<.;.0 e Q Q Q Q ,.) v * D 3. . . .H ~.1.=./ _ B _ R = 3.H 3 $.H H $.$.H H -.5.3 5.E x ~ T <.u b b a e e &./.k 7.o >.4.4.*.7 U /.i e e e ",
+"J _._.J _.) _.) ) _.J x @ v (.) ' J ) @ $ $ V v ' x _.' V x x a ' @ y ) v b y b v * $ ' b { <.<.<.d.Y p 0 0 0 l j 0 l l n ) e e e {.b {.' v - 3.3.3 o 3 5.@.3.> D P 9 8 ; = 5.5.$.$.H H k $.H H $.5.5.5.o , n /.%.}.y e K J c 1 !.; 7.j 8.=.9.-.R '.a.v e e b ",
+"_.J _.) J ) ) ) J ) ) _.(.# @ ) ) ) ) ) a , & V ! =.| C ^ ^ ^ 2 ^ ^ | : b.(.J ) {.@ = = {.^ <./.<.< |.e e e Q |.e Q e Q Q e |.,.e Q Q ,.. @ & = 3.3 H 3 E @.> ; @ @ N = = ; 3 3 5.$.$.H k $.H H H 3 3 3.D |.i }.<.Y Q J K e e Z /.! 7.> ^ *.8.6.* '.d.j e Q e ",
+"J _.J _._.) _.) ) (.(.J _.V # . ' ' ) J ) v $ $ (.V V v ' @ & ' a a ' _.( ) y J b _.$ D (.S <.<.;.j e m m ) ) ) ) m ,.a ' Q Q e J e Q [.% & ; ; @.@.3 E 3 3.3.= * @ & D > ; 3.H $.5.H $.k k H 3 H 5.5.3. .@ { t !.#.e e N Q v M !.h 7._.9 =.9.>.O c.f.@ e e Q ",
+"J _.J ) _.) _.) (.) ) y ) (.. @ # . ) (.(.) (.$ , , a ' a y a V $ i.v D q . Q b J b ) $ ) r <./.<.I b . ) ) ' @ % # # % @ ~ . e e e > j O A F 3 D D 3.3.5.@.3.> N @ % = ; ; >  .$.5.H 3 5.5.H H $.5.H @.; b { ^.;.=.e y N e Q M ).; 7.3.>.C *.:.~.j.a.o e b e ",
+") [._._.) ) ) ) ) _.) ) ) _.) x # + (.) ' ) _.x $ ^ : | | | ^ | ^ S | 4.~.(.|.y J b b [.J } <.<.<.H ,.[.@ x . $ x , , ~ $ $.* e Q |.7 2 ( _ _ S =.A 8  .> > W > * $ * = W 3.3.3.5.$.3 H k 5.H 3 H 5.3 ; + e | %.).Z b e K J N 1 #.N b F =.: ^ ..6 q L ].e e e ",
+"_.[.[._._.) _.) J ) ' ) ) ) ) {.. # x ) (.' ) ) V $ a $ ~ y ' a @ a ) , |.(.b _.J J y [.b : ;.<.<.$.7.(.d = . v $ @ @ # = I @ e Q ) X | X | _ [ B B < | 6.o 3.* * * ! ; ; ; 3.3 5.5.3 3 5.5.H 3 $.3.H @.> ' S #.t *.e y @ ,.a } ).- Q 3 C 4.^ 6 ! b./.n e Q e ",
+") ) _.[.[.) ) ) ) ) ) ) ) ) ) (.) ' + + . (.(.' (.' @ $ @ $ a ' ' V x (.(.b [.J J ) ) [.Q S <.<.<.H Q = o R W x @ $ + $ D ; y e e c =.Y | 1 : : < < } B B : 2 1.f W N ; > @.= 5.5.5.5.5.3.5.3 $.H 3.3. .I {.| %.!.[ e e z % E #.#.$ ,.x 1.C C G :.q ^.f e e e ",
+") [.J ) [._.) ) _._.) ) ) ) ) ) ) (.. @ @ . (._.) v (.@ @ @ (.@ v a x ' [.) ) b J ) ) ) b : <.<.<.I _.= # ;  .; v @ ;  .k & _.Q e ) X Y | 1 _ < [ [ } } Z B < _ S Y 9  .* ; 3.H 5.3.3 3 3.5.H 3 3 H 3 ; = K Z #.t 8 e J b ) n 1 ;.@ 7.; A ^ : 4.g.^./.$.e e Q ",
+"b J _.) ) ) ) _.) ) _.) ) i.) i._.) (.. # V . ) ) + J , ' $ $ ' a x a ) x [._.) _.J _.) m M <.<.<.n J ' ) @ W D ; , ;  .* _.|.e e c =.Y / | : : < < < [ } B < < _ [ _ O  .> > 3 @.5.5.5.3.5.3 $.5.3 5.; _.e u #.#.2.e b % |.' Z '.N ' G =.: C -.P '.^.n e J e ",
+"b m J ) ) ) J ) ) ) _.i.) i.) ) (._._.) . V @ + # q ] 2 / ^ ] _ ^ ^ ( ] ^ . b J J _.) ) m M <.<.<.j ,.) + v v = i $ ' x [.e e e e c C Y Y 1 _ : < < < < < < _ S | | : _ G ; =  .5.3.5.3 3.5.3 $.-.3.3.H > ].#.s ).h b b . . i S ;.) 7.:.C S : n @.c.<.i e e c ",
+"m m m J [.[.) _.) ) ) ) ) ) i.i.i.) y y (.. @ # ) ] ' ) ) . $ x $ a ) # ( b b ' [.y (.) Q _ /.<.<.f ) z x ' a x = x Q e |.Q e e e c =.X / / : : : < B B } < : _ _ 1 S [ 1.> > 3 3.3.5.5.3.3.3 5.5.5.3 * |.v u s #.X e Q D D D ^.q ' 7.V 4.S S *.3 c.t O Q e e ",
+"b b {.J _.[.J _.) ) _.) ) ) ) ) _._.i.y ) (.. + . q l n P N [.* $ @ x > } ' b {.[.) ) ) e S <.<./.d ,.$ % # x v $ v b e Q e e e e c C X Y | _ : < < [ [ [ < < : 1 | 1 [ 2 @.3. . .3.5.$.5.3.3 5.H 3 5.* _.i T T ).y b e e $ F < L J 7.= A 8.[ 8.A }.<.f Q e {.",
+"b b b b J [.[.) ) _.) i._._.i.i.i.i.y (.y (.' . z 0 { X / X C 2 C 1 / g.p {.|.) _.) ) _.b 2.<.<.<.g e ) ! = x $ % , v b e e e e e J C X / | _ _ [ } < [ < < _ S 1 _ 1 [ 2 > ; 3.3.5.5.5.3.5.3 3 $.$.3.> b $ s #.T R Q |.~ x # j.q . N *.C ^ S 8 6 j.d.0 e e e ",
+"m b b b b [.[.) _.) _.i.i.) ) _.K y y y ) y ) ' . + z . ) . ) ' v v + $ |.) [.{.) ) [.) _.[ <.<.<.I e ' # = , V @ # * @ ,.e e e e J C Y Y | _ _ : < [ } } } : _ 1 1 | [ ^ ; ; H 3.3.3.3.3.3.5.3 $.$.3.n N f %.s s Q e _.$ $ = < %.e 7.A 6.S [ 3 o q a.o e e Q ",
+"m m m ,.,.b {.[.) _.) ) ) i._._.y y y ) y (.y (.. . , $ (.x . ) ) ' ' ' [.x [.) b J y . ) } <.<.<.d Q . . . $ ; @ ; $ @ & ) e Q 7.c O | | 1 S : : < [ [ [ < _ _ S | S [ Y > > @. .3.5.$.3.3.$.$.$.$.- @.e R u }.[ ! e e ' % > }._ @ 7.; 4.4.}.:.; e./.| e Q {.",
+"_.m m m ,.m {.{.) ) ) ) ) ) ) ) y _.y (.y (.(.y ) (.' @ # ' ' @ ' ' ) ) @ Q ) . ' (.y (.b : <.<.<.o e _.' # = ; @ + v = D x e Q e J O | | 1 S : < < [ [ [ [ _ _ S 1 1 _ X > > @.3.3.3.5.3.3.5.5.$.> H N 7.>.).u T e e (.. @ n #.U 7.@ @ A S C ~.A }.d.l e e e ",
+"J [.J m J b b b [._._.) ) ) (.y ) (.) y (.(.y (.) R :.F :.F 8 o P P o E P |.[.) a x (.) Q S /.<.<.o e _.+ = = % # v $ D  .. 7.e 7.c O | Y 1 S : < < [ [ [ < _ _ S Y _ : Y W > @. .> 3.5.3.3.$.$.$.3. .H J 0 }.!.C . |.W z J R L Y Q J E A C j.*.F U /.7 _.e e ",
+"J _.J J J J b {.J J _._.) ) ) ) ) y ) ) y (.(.(.+ ` ^ ] ^ ( : 2 ^ Y Y ` 4.@ [.b (.) ) ) |.: <.<.<.d Q ' ~ * % @ # % W i D # {.e 7.c O | | 1 S _ : < [ [ } < _ _ 1 | _ : 2 > > @. .3.3. .3.3.$.$.H 3.3.@.7.1 !.[ O e e a J b Q O T 7.J ` 1.4.G x o c.t { b Q b ",
+"m m J J [.m {.,.{.b J ) ) _.) _.y ) y y y (.(.(.b v ) ) . ' # . . ' _.) ,.Q |._.J ) ) ) b _ <.<.<.d Q + ~ $ v v & ; > ; - & @ _.Q c =.| Y 1 _ < < [ < [ [ [ _ _ 1 Y _ _ Y > > 3.3.> 3.3.3.3.5.5.5.w  .(.y 2.u h e Q e 7.c y { 7.i y Q * i _.A ~ > _ ;.| e c e ",
+"m [._._.[.J J b b ,.{.J ) _.) ) y ) (.(.) y y (.. ' J x v ) + # v @ y _.Q m e 7.J ) [.J |.: <.<.<.d ,.. . . . # = & , & - ; z N J y C Y X | S : : < [ [ < < _ _ 1 Y _ _ 2 > > 3.3.> 3.3.w 3.5.$.5.5.> ' ,.! @ K f e Q K 7.1 Y k Q Q v $ 7.` ] ^ j { u z c s 0 ",
+"m m m J J _.J J {.J J J J ) (.y ) y ) ) y (.(.(.) x v + . ' x (.% * ) Q m Q e |.b [._.b Q _ <.<.<.o Q ' ' . @ = * $ @ % ; W W > @ N | 1 | 1 _ [ : < < [ [ : _ _ 1 | S _ X W > @.3.w 3. .3.3. .3 3. .o P ' j ; Q J e Q K Q ; L ; J @ J 7.N _ }.|. .0 L [ { R y ",
+"b m m [.m _.[._.[.[.J {.J ) x a ) y y (.) (.(.(.) ) ) J x v ' . (.% . ) $.J 7.e e b [.[.b < <.<.<.n ,.) ' ~ % * v % $ # - W ! > h k M [ | 1 S : : < < < [ : _ _ 1 Y _ : 2 ; > 3.D > w 3.3.3. .3 n E N e f }.| v e b e b b { [ ; Q J ' N 7.P $.. ~ C t ).).h e ",
+"m m [.J J m [.[.J ) _.|._.= = v _._.) ) y y ) ) ) | / : ( b./ = H ] u #.` _.e e e e b m Q : <.<.<.f e ) . ~ $ @ $ @ # & = = = =  .g _ _ M _ S [ : < [ [ [ < _ _ S | S : Y D > 3.5.= D > D > 3.7 g h v c ! M u Q b e e j >.j T z b J v a e N l v N { %.L ).>.e ",
+"m m m J J m [._.' {.,.' V # x (.) ) i.) ) y (.) @ 1.V ) . b z j.` R @ J b e ,.e e e e |.e : <.<.<.d e ' v # # + @ @ $ # ~ - D $.@. .1 [ [ 2.S 1 : : [ [ < : _ S S Y 1 : ^ > > i - 5.>  .D ;  .D c Y M e h =.n v e b e h O S T ; Q ' J b Q K f i c O <.%.t N r ",
+"_.J m m J _.[._.) b J @ & ' J J ) y ) y y (.y (.) j ) ) $ ' . ^ # . {.b ) e Q e Q Q e e Q _ <.<.<.d Q ' . + @ @ + % % @ $ = D 3.D > 1 r [ M [ : : < [ [ } < 2._ 1 | ( : X D W D D ; i > D * @ ,.{ y Q $ k 2.O e b e e 7.7.> Y E c z N h h @ z N c | %./.s Y ; ",
+"J m m m [._.[.[.|.' ~ $ x ) _.y ) _.) ) ) (.y (.x ] ^ ^ g.^ 2 ^ ] Y / C l K e e e Q Q Q Q : <.<.<.o ,.. . . . @ # @ # % ; > ! = * 3.: B _ 1 S 2._ : < < [ : _ S S Y 1 : X > > D w 3.i 3.I Q D @ ; R Q Q =.1 0 b e e c y b 7.].7 g I $.d ].v k N a M <.t ).$ T ",
+"b m m _.m m m b {.@ & . J J ) ) _.) _.y y ) (.) b + J . . + ) {.' ) {.J c e e e e Q b J Q _ <.<.<.o Q y ' v v @ V . . , W W ; * V  .< _ 1 | 1 S : : : < : : 2._ 1 | ( : ^ W > D D - i & = # . K T v b Q j u 7 J Q 7.7.N z J % A n h f d @ @ 8 @ $.S }.#.^.Z 8 ",
+"b m _._.m b {.[.$ # x ) J _._._.y y ) ) y ) (.) ' ) {.v ' ) x @ _.) _.Q b e b Q e m _.) Q _ <.<.<.o |.' ' . + # @ @ % ; > , N * > o : Y Y 1 1 S _ M < < < : _ S 1 Y S _ Y W > D = 5.7.$ > $.N J i j Q { S $.+ @ j z 7.K b _.k A d W $.k K $ 0 ! o r '.T u R ].",
+"m J _.m b m ) ' % (.b [.(.) ) _.) ) ) y ) (.y y ) (.v ' J x + |.J _.) ,.Q e Q e ,.J ) _.,._ <.<.<.o Q y ' v v v + * W > - $ , = o o / ^ Y Y 1 S S _ : < : : _ S 1 | 1 : 2 W W D 3.= |.> G D Q c } b &.#.I $ ' ! h h b J K v D =.0.i o f @ N >.; *.&.^.U /.L &.",
+"J m _.J {.{.' # ' J b J y _.) (.) ) ) (.y (.(.) x 3 n H :.n 3 n 8 o n $.$ Q Q e _._.J b Q _ <.<.<.I Q ' . + + v # ; W & @ $ > $.; $ 4./ | X 1 S _ _ 2.< : 2._ S 1 Y 1 : ^ W W D w v v / a.! e e j { P X $.- I ! o N 7.y b a f O j ].i i v v j @ j u '.^.).;.%.",
+"J {.,.b _.+ + ' ) _.J ) J ) ) ) ) ) ) ) ) ) _.i.v H P P G R d o o d n P s e ,.[.[.{.J [.Q _ <.<.<.o Q ) . + v # w @ , % . > P & 7._.G < _ ^ 1 1 S S _ : [ : S S | 1 1 ( 2 - w w > > J > j a e c l y K D o g ! h k i Q z $ K o =.I > i f c N j $ n s '.%.d.^.s ",
+"J b |.) x a ' ) J _.J ) _._.) ) ) _._.) ) ) ) i.b $ ' b J b J ) {.' ,.e X m ) b J J _.) Q : <.<.<.d e _.' @ $ $ @ x v = D , . Q v x  .] : < < ( _ S _ _ 2.[ 2.S 1 1 ( : ^ - W w W # m Q e c e e =.0 ].0 j ! ! @ f ; b y c a h =.n i i d N N O z =.!.}.L t }.T ",
+"b |.J ' a x J J ) [._._._.) _._._.) ) ) ) (.) ) x H P o o o d d F I n 4.'.@ |.) _.J [.[.Q _ <.<./.o ,.' ' ' # = & $ @ % i . e Q ; - W H 9 4.g.C | : } [ [ 2.S | / 2 / : ^ w - ; w - . e z ~ e $ } [ =.P f $ k i f $.e @ K Q n { o ! i $.{.k *.z 0 U &.s ).}.u ",
+"b J (.. (._.{.J _.[.[.) ) ) ) ) ) ) ) ) ) (.) ) x 3 o o n H o o 3 n j D W b ) Q [.J _.) Q : <.<.<.f e m @ + + . $ % W = , [.7.,.; H o 3  .W W H F { / _ [ [ [ [ S / _ : g.W - ; W 3 I e j ).K Q [ u 0 j @ N h h f a y y c N ! Y f ].! ; @ @ Y z 0 T &.%.t !.#.",
+"b ) ' y J {._._.[._._.) J ) ) _.J ) ) (.' ) ) ) ,.) {.|.J J m m ) b a x ) e m (.J J J ) Q _ <.<.;.0 K @ % ; W > = -  .i > ' ) , - 3 3  .H  . .o = ;  .P A { ] Y / 1 : | :.= - 3.; > |.e &.u c $ 2.f j z z ].$ ! i k e $ y e k *.I ].> k Q ! *.! j #.u #.;.%.&.",
+"y y ) b J [.) J [.[.J ) ) _.) ) _.) ) ) (.) ) _.b c b _.) _._.) J v x {.m [.|.b J J J ) Q : <.<.<.t t ;.t t t t d.d./.d.L ` . , $.H D ; 5.H o R H 3.= = > = = * H I n ..D = ! w ; I - _.m n e Q 2.{ z f $ N h ; h c y c Q @ N X $.h i i z y { $ O #.#.%.%.#.'.",
+"' (.J b J _.) J _._._._._.) ) ) _._.) y ) ) [.J b y c J J ,.) . ' , ' b J ) b [.[.m ) J |._ <.<./.<.<.<.<.<.<.<.<.<.<.<.<.| ) ! W ; W w 3.3 H -.F o 3.> ; ; % @ . {.(.# , - W - W = _.7.].k b N | >.k $ $ N ! z ].].Q @ c _.f Y n k f d $ ].j ].*.}.#.!.;.}.} ",
+") J J J ) J J ) J [.[.[.) ) _.) ) ) ) ) _.J J b y @ c J J c . . V ' _._.m b b b J J [.[.Q : <.<.<.<.<.<.<.<./.<.<.<.<.<.<.S . ; = = W D w  .o R o o 3 3.* = & $ . {.v = = = ; > ; % $ e o T b e &.{ N v $ ! z ].].v K ~ c a h 1 o i ! > z @ j N O }.#.!.L #.[ ",
+"J J J J J J J J ) _._._._._.) _.) y ) [.[.J m J J Y b c _.' 1 j i.a y b J b ) J [.b y J Q S <.;.;././.;.<.;.;./.<.;.d.<./.l ) @ = = W k 3 H -.o R +.R 3 w = , # ' ) . & = ! > ; W % ,.Q O M y z X 8 K K $ ; ; z $.z b @ J K i C l i h h N N $.z j u s !.t %.'.",
+"b J J J J _.J J J [.[.[.[._.) _.) ) ) J m m J J Q X c b _.N ^ j _.i.y _.) 7.|.J b ' m ) |.~ ; h > z ! ; a y @ $ % $ ! $ . |.. . , = W D 5.3 -...R F F o  .> , V ) ) @ & = - w ; = $ y ,.7 %.Q e r 0 N $ ].N @ z y b J a y K $.| l h h i ].z i N j &.u #.L L !.",
+"J {.J J J J _.J J _._._._.) ) ) ) ) {.b {.J [.J . &.Y ^ / / c.[ ^ ^ ^ ^ 4 @ b ,.b y |.) ) J |.J b e {.~ ! f k K b e e e Q ' @ + , - ! D i 3 H o R P F F R 3 ; @ ) ) @ = = - > > D . 7.7.U M c z | 0 h @ N $.N b e e J N e v N O *.! ].i ! N ! $ n &.#.%./.%.u ",
+"J b J J J J _._.J J ) ) ) _.) ) [.[.{.m b ,.{.{.Q 8 o G G R j R P P P R I ) b m [.b J b _.~ x J ' =.%./.<.<.<./.s l . _.@ @ {.! z ; W 3.5.3 H o R P P F F ..i = ' _.. & = - > > & 8 E 7.| %.7.N }.8 J e b $ % $ Q e $ K c c N 0 { ! z h z a N N l r T !.;.%.u ",
+"J J J J J J J [.J _.J ) ) ) ) _.m m m {.b ,.,.,._.% V V x J _.' K a y m (.|.m [.m |.y m ) ' . H ^.;.<.<.<.<.<.<.<.<.}.o b = W $ , - D D 5.3 o o ....0.+.6 F o 3.@ ' ' # = > > = D @ 7._.C @ J j r ! ,.e Q z N J e e K N e @ K 0 { ].].i ! y @ N 8 } u %.;.).T ",
+"J {.J J J J J J J _._.) ) J _.[.b b b ,.b ,.,.J v # $ v i.) (.a _.a y b m b b e [.{.J _., _.H L <.<.<.<.<././.<./.;.<.L j ,.$ W - - W D i  .o o P P ..R F F 0.H ; # x $ = w > = = @.d 7.v N e $ #.z e e e v $ a e e z K b b ' j { ].].k i a a N l } u !.t %.T ",
+"J J J J J J J _.J [.) J J J b b Q b J J ,.{.) (.$ v J J (.' y _.y ' y b ) b ) m m y J x @ y _ <.d.<.<./.).U %.;.<./.<.<.'.$ @ ; - ; W D i 3 H ......P P 0.F 0.R E ; * & * ; ! = & * 7.' > b 7.8 S a b e Q N y e e Q v z e K y *.X h ].$.i @ @ N n M u !.;.).T ",
+"J {.{.J J J J J J [.) ) ) J b b ,.b b ,.,.J ' $ @ v _._.x ) ) a ' (._.b [.Q {.J |.y @ , y 5././.<./._ z {.e b > q <.<.<.;.d . $ ; W W D i 5.H o ..P +.0.0.F 0.R n @.; = & = > = = ,.,.Q ].f y v }.v e e v K e y e e c K e J _.o M I ].i i $ $ z *.r T L ;.L T ",
+"J {.J J J J J J [.J ) _.{.b ,.,.7.J J Q J V = $ i._._.K _.i.y ' y ' ' ) J J b b ' @ $ a e X <.<.<.e.J e Q |.[.Q Q C <.<.<.{ {.~ - ; W D i H o o ....R 0.0.0.0.R o o d 3 3.; ; ; = = 7.@.T K 7.o =.@ e b K K Q y N b K d @ e y d Y d z ! i z a K C u X X #.u &.",
+"J m {.J J J J J [.J [.[.b b |.b J ,.Q [.@ $ @ i._.i._.i.K _.(.) (.' ) _.b b J _.@ V v y e Y <.<.<.O e e [.x . ' |.o d.<./.C {.@ , ].W D 5.3 H H o ..0.P 8 P n o E R n n 3 > - = *  .' @ o 8 7.! }.7.Q @ v v z h D K $ l h J c i 1 n ].! i z N N { u u Z &.M 1 ",
+"{.J J J J J J J [.J m ,.b ,.b |.[.|.J @ = $ i.J i.K i.i.' _.' (.) ) y J ,.b _.' , x ) ,.Q 1 <./.<.I e [.x # . . _.~ %.<./.S |.. $ W D D 5. . .R ....P F 8 n n R H o F j 8 H > * W E _.@ / - Q R >.K Q ; ].].N $ k y y j D b b z | *.! ! ! N @ $ 1 2.} s %.^.}.",
+"b J J J J J J [.b b b ,.,.,.|.|.|._.V * V ' _.i._.J i._.' J y x y ' (.J b _.@ , V ) Q e e S <./.<.k Q ' x a ' . @ K }.<.<.M b ' $ W W D  .5.3 R ....R 8 8 8 8 R o d R j 9 F 3 ; N ,.= b { O 7.].u b y y $ $ N ; h y y *.g . Q $ { l z ].h N $ N 0 2.} T }.%.!.",
+"J b J _.J _.J m b b b Q ,.|.|.Q J @ N V (.J ) i._._.a ' ' ' m y x a i.J _.v V x J Q Q e e 1 <././.d |.' ' ' v @ ~ ~ #.<.<.} |.a $ = W W 3 H 3 o o R P P 8 P n o n o H 8 9 *.P H V ; ' # P J J $.X ; c ; v $ ].! j N y j d K Q @ =.{ h ! h z $ z 1 u T %.!.r } ",
+"J J J _.J {.J m Q b b |.Q ,.{.J # , @ ) b _.i.J J @ b b _.a ) (.(.) i.i.~ , V ) Q e e e e 1 <.<./.n Q [.. . # + . N s <.<.[ b K ~ z i i  .H o o o R 8 F 8 P 8 o H o R n :.9 G G E * ; ,.n i e R T b K v ; z ! ; h y Q 8 l ].b ' { O ! ].h ].z i 2.#.T u r T u ",
+"b b J J J m b Q b b b Q ,.|.) v = @ ) J ) ) ) _.y *.a ' ' a y a _.i.a * = V [.Q e e e e e | <./.<.g |.[.+ . v . . ~ T <./.} Q a $ ; i i ; i ..o ....P 8 8 n R P H o n F j :.~.9 ] H [.' ) J e j O ! y $ ; i z $ i K {.P *.D {.y 0 C z $ ; N @ z Y T T u u T | ",
+"b b J J J b b Q Q b b Q |.J v , , (.{.i.) J J v ) Z H R n o o ..-.R 7 4 H . 7.e 7.e e e e 1 <./.<.k Q _.+ v ' @ ~ @ s <./.e.Q a $ - ! $ ) , H o o ..P 8 8 8 R R H o 8 j ~.9 :.j 9 @ = 7.> y e *.[ e b N v $ ! z $ c c l { $.J c l O N z ! z @ z Y #.#.u #.!.0 ",
+"J J J b ,.m b Q Q m m 7.{.$ = V J _._._.) _.) ) (.[ R ....0.H +.R G 5 9 o |.e e e e e Q e 1 <.<.<.d Q (.x . + + + . j.<.<.[ Q K N W ~ {.m ) , o P n 8 F F P R R o o n j :.G 9 9 ] D _.. . J 7.0 =.y J v $ @ z ! ; Q y =.Y n ) Q n C f ! ! z K ; | s !.T }.2.$ ",
+"b [.[.,.e Q Q Q J Q Q b a , $ K _._._.) ) i.) _._.4.' m a a b y * 3.* b ,.Q Q e e Q 7.7.7.} <./.<.d e ) . v + @ @ v s <.<.} b a N N c Q b _.x = o R R o ..F 8 o o H o P :.9 :.G E (. .c N c b { M J 7.$ v $ i ! $.a J O j 0 N c n | n ! ! z @ z O }.s } T *.c ",
+"b b ,.Q Q e b ,.Q |._.V , $ K J _.J J _.) ) ) ) ) a b @ J J , ~ ! > x ,.e b e e 7.e 7.[.) [ <.<.<.d Q ) ' + v + ~ + s <.<.} b K y c Q e J ) (.. W o F P o 0.+.o H o R j :.9 9 G ` H _.' ) J e { Y ; c J $ @ $ h f b % n C 0 $.{.i O h N N $ @ N [ #.}.!.u i h ",
+") b Q Q m Q Q {.7._.& > , i._._._.) ) _.) y ) y ) J y y i.i., 3.! a |.,.e e e e 7.|.y $ ) _ ;.<.<.d Q (.' + + + @ @ #.<.<.} b y Q e e ,.m ) ' . x W R 6 0.o R R o o R j :.9 ~.:. .Q = Q C N b >.2.J e v v v j [ Y h b *.k C $ |.i 0 z @ N K @ z 0 #.}.#.r e u ",
+") _.J |.7.|.|.Q b $ w , i.J J _._._.J ) ) ) ) ) ) x v Q (.- w w v J |.,.e b Q e e ' , x Q S <.<.<.d Q ) x v v @ v @ s <.<.[ e Q e e b b J c ' x (.@ W R F 0.o 0.H o o 8 :.~.9 9 p > ) ! b.q 7.o { J e v k O S 1 %.y J b {.> o e ! 0 ! $ z v $ ! *.'.Z #.k y r ",
+",.x . b e Q b Q , - , i.b J ) J _.) _.) _.) ) ) ) J J ' - ! > _._.,.J e b e Q ,.' . x J 7.: <./.<.f 7.) ' v v @ . @ #.<.<.M e e e e Q Q J ) ' x # ' x W 0.F ....H o n P G 9 :.G d @ v @ L 0 e k | >.C X | X 1 u S h e J Q 0 @ b z =.o N z z ; ! 0 }./.%.u u <.",
+"b y V ' b Q b i.- $ i.b J ) ) J _._.) _.) ) ) ) _.( 2 | h.w O [ 2 ] Y ` 1 Q e Q $ (.,.b b _ <.<.<.d Q ) x v + + @ + #.<.<.[ e e e e e Q J ) . + $ v a $ w ..F R o o n F :.G 9 ~.*.@ ) E ^.r e r L Z &.Z } %.t }.M v K Q b l n {.i Y *.! i h h ].0 &.;.| >.}.T ",
+"J b ' & @ |.J = , i.J _.i.J J (._._.) ) ) ) ) y _.h.* w w a g.H ,.|.J _.X e m # ) ) J b Q : <./.<.d Q ) ' + v + @ ~ #.<.<.[ e e e b b b c ) . $ . & = a $ i R R o o n P :.9 G G p ; . $ } j 7.Z %.M M Z T Z { h g a e Q K 0 @ ) ! { n z $.k z $ O L u v $.).[ ",
+"J b b b a 3.D V J J J J J _.) _.) _.J J [._.y _.J } k w ' Q / I b (.|.|.^ v = [.J J [._.Q _ <.<.<.o Q ) (.. + @ $ . j.<.<.M e e e e Q ,.[.' + # , , , , @ x - 0.d E o j :.:.:.:.F . ; @ >.k b '.).1 Z } f >.X e e b . e . n h K N C *.z ! ; $ h 2.).u Q T ^.h ",
+"_.i.J y ' V > (.b b J ) i._.J _.) _.{.) (._._.i.> [ b.j.j.c.r y y p 2 p < # ) J J [._.) Q : <.<./.H Q ) ' . + ~ . ' s <.<.: e e e e Q ,._.' V # $ & & = , . + ; I P n o 9 *.:.*.9 d y N >.! b >.Z 2.Z 0 i [ %.! Q b J e c i $ b $ O *.h $.h $ ].M ;.{ n t S e ",
+"J @ , , b Q V , ) {.b _.) ) J J (.{.[.' y J y ~ > ! * J ) J b b b |.b . ; J |.b [.m [._.Q _ <.<.<.d Q ' ' . @ ~ _.,.T /.<.M e e e Q Q ,._.x @ & & * = = = + (.) z d P 8 :.9 :.9 G n . ! 8 f y >.Z 2.O ; N 2.}.].e e J Q {.@ z z ; 0 j z ; ; $ ! } Z Q ; %.8 h ",
+"y ' W @ J _.,.V v ) ,.b _.) ) J J _.) ) J _.~ w ! a b 7._._.b ) ' |.. ; ) ) J _.J J [.[.Q : <.<.<.H e ) ' + . . Q Q './.<.M e e e e Q ,.) . # N = = * * = $ x ) [.$ o *.:.F 9 ~.:.; y $.r N v { ; h N 7.v S r @ J e y h o 8 n f N >.8 ! ! ].z i | l e l j {.{ ",
+"_.' * y y a 7._.V v (.{.b ) (._._.) _.J y $ ! w ' Q [.) ,.Q y Q 7.@ , ' Q J Q b [.{.[.) Q _ <.<.<.d e ) . . ) m e e '.<.<.[ e e e e Q m ) @ # & * = - = * % # x ,.J W j ~.:.~.:.P @.* ; !.}.j $.C j R $ N j R N z b y 8 0 l j k @ j R z z N h R X N K 1 ! c 0 ",
+"$ D a y ' J J J ) ' v x _.b _._._._.J i.* 3.- x Q [.Q b b _.J _.% # x |.) b [.) _.J [.[.Q : <.<.<.H Q ' + ' |.e e Q T <.<.M e e e e Q J ) @ $ * N * = - * $ + ' _.m (.D :.9 :.*.G D 7.R %.C $.| f b z ! ; N N g f J y R j 8 8 $.K l l h ! N ! o { N M &.K i s ",
+"$.; b J (.i.(.b J _.x V x J b ) _.J i., D - v b J q | =.=.X O / _ ] / ` 2 {.J [.J {.[.[.Q _ <.<.<.f Q ' c m e e e e T <.<.M e e e Q |.J ) @ # & = $ = ; = $ @ (.) J {.v  .F 9 9 H > N _.}.2.N k k y ! ! z i k n f e c R >.j o ; ! O 0 i h h i j i e f =.k u }.",
+"= J |.J J y ) ) _.,.b V v _.b _._._.$ k w ' |.b Q C Q J {.,.V D + ' ) ) ^ b b ) J {._.[.Q : <.<.<.d Q m Q e e Q e e '.<.<.2.e e e Q ,._.) @ # & ; & * ; = & $ . {.J ' ' ' 5.*.:.p n J N S Z b C $ b ; i N N ; ! d c ! { { 0 j o K >.>.h k h ! f y b ].y j T [ ",
+"J ,.,.J _.J J _.J b v = $ J b (.|.' w D ' Q b m J &.g k j % ; v ) ) . ; Z ,.[.{.[.J J [.Q _ <./.<.I Q e e e e e e e T <./.r e e e Q ,.J ' @ % * = = = = = % @ + ) m ) $ $ v D *.*.= z b | %.f k =.y z ! ! z ! f z 7.$ l h >.f ! ! l j h ! ! z h K > ; i T T X ",
+"|.J b J (.(.J _.b x , @ ) i.) b ' 3.D (.b b b b J g 0 =.2 ^ ^ C ^ ^ { C 8 ,.|.J [.{.J [.Q : <.<.<.g Q e e e e e e Q T <./.M e e e e ,.J ) @ # * * = = = = & @ + ) _.y # $ V * i P D J 7.; [ { 1 f b a v z z $ ; h e $ R 1 Z { k $ l 8 ! ; ! i ! v O j | s T Y ",
+"J Q ) . i.) ) ,.= $ v i.b b ' a D D a |.|.J b b b b J . ' @ ' b |.' x J Q J b {.J J [.[.Q _ <.<./.o e e e e Q e e Q './.<.M e e e Q ,.J ' . $ * = = = - = % @ . _._.x @ = & $ V 8 G = ; 0 i ; C { b v ! ].N i $.@ y h { j %.C ; N >.o ; ; ! h K e K j | T } C ",
+"J b (.@ _.Q b (.3.V J J J J V 3.W (.Q b |.{.[.,.b J ) N (.,.J $ ' ) ) J ) [.|.) J J [.[.Q : <.<./.$.e Q e e 7.e e e T <.<.M Q e e e ,.J ' . # * * = = = = N @ . _._.' @ - ; , @ ) D c >.!.k b 2.h a $ a ].! ; ; k e >.>.{ O l h N 8 k $ N h i a Q N =.[ T [ } ",
+",.$ v b {.,._.5.(._.J _.@ , - ! y _.y b 7.,._.,.J J ~ ) 7.$ (.{.' ' Q ' 7._.) Q [.J [.) Q _ <.<.<.$.e b e e e e |.e }.<.<.M e e e Q ,.J ) @ % * = = = = = , ~ v ) ) x $ = - = = @. .k 8 L R b f 8 _.N k N @ ! i v 7.z O | %.j ; v k f ; $ ; h i ! o | T &.u M ",
+"# V ' ,.,.@ ; - Q J _.y , , a y _.@ ' b |.b ,.J ,.z _.{.) _._.. ) + (.b (.7.(.{.{.{.[.[.e _ <.<./.I e Q e e e e e e ^.<.<.1 e e e e ,._.' @ # * * * = = z , @ . _._.. & = = = D P # 7.| /.Z 7.o ! z ! ; z N $ z N b j ! 2.%.2.z v k $.N @ z ; k i ; X [ r u S ",
+"= J {.) ) ; D ,._.J J ' a y m y a a _.J ) b Q J % d.a.}.#.'.}.T '.c.U '.b.x Q ) b b [.[.e S <.<./.0 e e e e e e e z )./.<.X e Q e Q ,.J ) . % & = = = = = % ~ v ) ) ' % = ; i o j > J ; L ).; i f K v ; v y ; k h Q h >.>.Y $.; K f i $ $ z ].; @ n C Y u 2.M ",
+"{.J ,.(.> = ) J {._.J b J _.y , y y _.(.b b _.J {.G 1 c.u { ].y + ' _.) _.Q {.[.{.b [.[.e S <./.<.M b ,.J e e e Q >.<.<.<.0 e e e e ,.J ' . # * = = = = = % @ . _.) ' @ - 5.8 4 G - ,.7.M %.R l f z z h ! z h f ; y ! ! Z ).M $.b R f v @ $ ! z k 0 C } u &.S ",
+"J b $ > v ,.b [.J ) J b y $ ~ y _._._.) ' [.,.J b K J _.> { e.u 1 P ) J + 7.J _.|._.) |.b  .<.<.<.;.0 J J e e e C <.<.<.<.$.e e e Q ,.[.) @ % N * * * ; = # . . _.[.[.% H *.*.G A = 7.N 1 O $ }.0 c h $.! z h $ Q K v Q { u t Z @ $.h $ @ h h k k ! 0 &.u 2.2.",
+",._.V x J b _.) J J b b ' @ ' _.|.i.' y ) b ,.) c b c K _.J ) (.k ` } r ` @ m Q (.|.J ' ,.+ }.<.;.<.;.}.[ / [ #.<./.;.<.%.v e e e e ,._.(.+ $ * * = * * * N # . y ,..  .j G 9 G P @ K 2.t 2.; &.y c j ; b y N 7.Q e N c r Y o j c f ! @ $ ! i ! ].$.} %.%.&.Z ",
+"a - V |.|.y ) b J y b _.$ y Q y J ' a ' ) {.J ) _._.. m {.. y c $ 7 [ '.` ,.7.x ,._.J b b e 7 <.<.;.<.<.<.<./.<././.<.t 0 e Q e e Q |.J ) . % * % * = * * * @ . _.{.= G 9 :.G G ` $.b =.t Z @ #.j J K Q Q y $ Q e c b h #.L T z y h ].J N o z $ $ k X %.^.Z s ",
+"@ - , m |._.(.J J |.' = a J J b ' V a ) (.' ) ) . ) J _.a $.2 #.: 0 @ e _._.+ m |.(.) {.+ J ,.{ <./.<./.;.<.<.<.<.<.a.{ e e J e e e |._.' v $ & * * = = * * @ ' J @  .G j :.9 9 d y 2.^.s j R %.! 7.K K c 7.J e e Q z Q 0 [ %.=.J f ~ K N $ i ! i 0 u }.%.S #.",
+"m ) @ $ y |.b _.|.a $ a ' b b x @ + y J y . x (.) ; A u c.=.f c _.' {.Q b e c ) x Q ) b |.. e b n [ ^.t <./.d.a.#._ k Q e Q e Q e Q ,.m ) @ $ * & = * ; = @ @ . # D n j j G 9 G A > f }.L U y [ k c K b b y @ c Q e 7.O t [ f N v i ! a N N v i o 1 } !.#.Z '.",
+"Q e ) = , _.b b @ - a Q J ) a W y ) J b ) (.(.x (.d.d./ 1 2 O X X =.C Y 7 ) Q J x b ' J Q ' ' c 7.y ) _.% - , . J {.e e Q b e Q e Q ,.[.' @ $ * = = = ; * N * = E g n F 9 *.G G P Q R [ !.0 j O b 7.@ y Q e Q Q e e $ $ T %.u h N f ' $ h K ].; ; O &.#.%.| #.",
+"J Q Q ' , $ ' y w _.' i.e $ H @ b J J J _.J _.' ' V J (.' _.. ' c K J e e e Q Q [.x (.[.) b c J J Q b J e Q Q e m ) _.m b e Q Q Q e |.J ) @ $ & & ; * ; * = > E P o o j 9 G G G # J 0 !.U #.y &.z @ $ b e Q J e e J c j | O | Q @ ! $ . N K z i e C u %.}.[ }.",
+"Q J Q Q x $ $ - y _.b b $ D @ Q [._.) ) (.J b y a a x (.' ' ) _.c K c Q Q e e e b ) ' ) {., [ s *.) _.' |.) ) ' ' |. .u '.% e e Q Q |.[.) @ $ & $ = ; * * > o j H E n F 8 :.A j 9 J ; T }.8 h 0 $ Q ,.b J Q b J Q e k [ %.n J 7.! d @ ) a {.z N i O =.| M =.}.",
+"{.Q ,.,.Q x w $ b _.b y = v b y ) J {.) ) J J J i.$ $ x (.. ' _.' y c J e e e e e |.x . J ( /.<.d.k Q a y ' . ' ' + './.;._ e e e Q |.{.. x @ = = = & $ > o P o o o o 8 G 9 G G { $ j 0 8 n # t z Q ; $.y J a a K e k &.[ $ J _.! N K ; a K k ! o [ 1 X 0 j X ",
+"b |.,.|.e [.$ _.m b y $ @ (.) b ) J ) J b _.' i.J i.V V (.' ' ' ) y J Q e e e Q e Q _.) J _ <.<.;.f Q . ) ' . . . ~ j.<.<.[ e b e Q b ) ' V % = = & ; ; E 8 n o E o n 8 G 9 9 G o ' 0 %.L X =.j @ e $ ! m J $ ! ) b h s 0 @ e c ].$ y N @ z h b o X { | u Z | ",
+"{.b ,.Q Q Q b Q y , , ' y _.b _._.J J ) ' $ = = i.J y v @ v a ) . ' c Q e e e e e e Q |.m : <.<.<.d ,.' ' . v v @ + j.<.<.} m y b 7.Q _.) @ = & $ = 3.o 8 8 n o o o g P :.~.G G ] N z T ).=.Q }.a e $ ].y y $ ].y 7.l '.| K Q Q h ].' c Q @ ; b k Y C 2.r r 2.",
+"{.{.b b b |.|.|.' 3.- _._.J b y _.) b y , @ i., $ _.J _.' @ v J ) ) _.e e e e e e e e e Q 2.<.<.<.d 7.) ' v + @ @ @ j.<.<.B m ' @ {.Q _.' v $ & = 3.o 8 F n o o o o n P G 9 G G  .$ | u u z =.Y N b K v J J y $ K e R } f Q e K N z % @ J @ N e j 2.| 2.1 Y =.",
+",.,.b b J b |.b |.(., * y _.K J _._.' V $ ) b J = $ ' _._.$ , a ' x ) |.e Q Q e e e e e e S <.<.<.d 7.) ' a + @ v @ c.<.<.} b ' ; % ) {.(.v $ = 3.o :.F n P 8 n H H n j :.9 9 G { @ E !.;.| J }.J e a z K c Q b e Q 1 }.8 e e ) k N K c Q $ $ y O [ | 1 M | >.",
+"m ,.m b b {.|.{.Q Q ' = , _.J _.J _.= = ) _.a b v V x J J K $ $ a ' ) |.e e e Q e e Q e e 1 <.<./.d 7.) x v x @ @ @ j.<./.} ,.K N > * _._.x $ > R 8 F R o 8 R d o o o P G 9 G G E _.{ X =.; =.` c b $ z y b Q c b K Y q K e e ].h a y c J N @ K C r Y X X =.*.",
+"b |.m ,.|.m |.b Q m m ' - @ b i._.K $ ' |.J (.b J ' v @ K _.i.- & % V ' ,.e e e e e Q e e 1 <.<.<.d 7._.' . . @ @ @ }.<.<.} ,.. + W D # i.v ; 3...P R R 8 8 P o E o n j :.G 9 G D y 0 s %.1 a #.b Q N z c Q e b e b [ C $ e J K $ c y J b ; $ K >.1 { >.O O 0 ",
+"m |._.{.|.c J b b |.) a V ! - J ~ * ' b i.) J x ) ; o 0.3.i.v +.>.*.:.n - J e e e e Q e e 2.<./.<.o Q ) ' x . @ + + j.<./.} ,.. , z i  .= ,  .R -.o R P F R R R H o o P :.9 G G E b ; &.#.0 l k c Q $ N c b J K Q z [ | e Q Q ~ $ c ) b J i N y =.[ C 0 0 0 0 ",
+",.,.b ,.b b b b c J J J y K * -.v ' J J _.x x [.[.e.d o 3 _.| g.5 :.F F c.~ c e e e e e e | <.<.<.i y . J @ x a v @ j.<.<.} Q . # W W D o R H o o R ..R R n R o o E n G G G 9 j ' _.7 1 &.>.h }.e K N J Q e e Q Q K T h Q e _.$ @ a v c b N $ k 1 | O =.| Y C ",
+",.,.,.b J J b b c Q [.) J @ > , J b J v a J J x . X + _.) J | 9.$ _.7.J ] x . b e e e e e 1 <.<.<.n e N % J v @ ' . #.<.;.[ m ' ~ ; ; > H o H o o R R R 8 n n o f g n n 8 A G @.@ 7.j !.L X ; f a . $ J Q e Q y Q { &.! e b b . ) ' a J b ; ; f | Y 0 O C O O ",
+"b b {.m b b J J b ) J Q y * ~ i._._.' $ @ ) J ) # '.` ] ^ ^ j.$.b 3 H :.q ; e {.Q Q e e e | <.<./.f e ) - , . . ~ . c.<.<.} |.' ~ ; ; W 5.H 3 ..o o R P R R o o H o n j 9 9 H # $.y ! C r f $.&.J K ! ' Q m a ) e D | _.e e ) $ K y y b b k $ $ C X 0 O | C 0 ",
+",.,.,.,.m b b m J @ ) J = , _.b ,.v $ x _.y i.J J  .j n 3 0.H _.y i 8 ~.8 (.(.[.|.Q e e e 1 <.<./.$.e e ' D ~ . ~ $ T <.<.} Q . ~ ; W ; i 3 E R o o o n n n n o g E o A G  .N @ ,.y =.L s ! n r k J J b Q e y $ b M j Q e Q a v c c y Q y 8 ; @ >.O 0 X 1 C { ",
+"b b ,.{.b m J b J ,.. = V y J b ) & w $ J b _.y J J = $ ) _.J ) b v $ x J V W J _.[.Q e e 1 <.<.<.o e Q e (.- , . ~ j././.} {.. $ - W D i 3 H o R R R R n R n n o d o j H # (.@ f Q N &.!.! $.[ @ J c Q Q J c e h '.> ,.Q Q $ y b c c e e k @ v 0 C Y Z S 0 O ",
+",.b ,.b b b J J b J ' $ ' Q J $ W % $ > = i.J _.b ' b $ , [.v Q (.& J 7.b i.K , a (.,.e e 1 <.<.<.D e Q e Q ) z z K T <./.[ {.) $ - D D i 3 H H o R R R 8 R o o E n E = V x . @ J K =.T X c { U e.n y e Q Q 7.b 0 0 K e Q e % y b c c Q v j N z l 0 | }.u j j ",
+",.b ,.b b J b b {.) {.b ) _.y W $ J ,.' - - K _.K J b ) $ V b ' @ J y a b Q J V , @ J 7.e 1 <.<.<.o e e Q |.e (.].].U <.<.} |.' $ - W D  .3 H o o o R P n n n R f E = ' (.v V v Q b >.}.}.N $.u &.&./ - m e c N M S Q Q Q J ' Q b b Q e ! 0 $ $ *.O | !.u h y ",
+",.b b {.b m J b J Q ,.[.[.& w @ Q b |.,.' w - i.b +.^ h.h.*.& ) (.' J ,.J _.b J - $ _.7.e 1 <.<.<.M m e Q e Q e ' 0 <./.;.r |.. , - W > i 3 H o o o o R R R o n 8 ; J _.V V ' x . _.{ 2.R e >.'.&.&.C N J e e K #.i e e e b _.b b J b e ; j K $ l X 1 s [ $ Q ",
+"|.b ,.,.b b b J [._.{.Q x - # |.J m ,.Q b a * > b ! R R ..W ; y ) J (._.Q v Q b _.- = b Q Y <./.<.<.1 ) e e e _.S <.<.;.<.2 Q . $ = D 3.i  .H H R n P 8 n R n n ; J _.' @ x (.W % b l X v e $ o 1 s S h Q Q Q 0 }.j J e Q ) c e b J e e $ o y h =.C =.u &.c e ",
+",.b ,.{.m m b b |.,.{.|.b ) m Q |.b ,.b ,._.v * = ,._.i.i._.(.' _.J y _.J 7.K J ,.v = D |.i t <.;.<.<.%.7 e D T <.;.<.<.t l e ' ~ , W D D  .H o H R o R 8 j H D _.7.) . x v & 8 * ,.b ) 7.K v Q Q K N e ,.,.y 1 O a Q Q e c m Q Q a J e h R e ; R 0 Y } u $.e ",
+"b b {.,.b b m m ,.J [.J b |.|.|.|.|.b m b |.J x - * v J J ) x (.(.. {.Q _.Q _.J _.b ' $ + _.d #.<./.;.<.<.f.t <.;.<./.t C m ) ~ , - W D 5. .H o R o R n j o ; ) [.,._._.v D :./ ' ) _.J y N ) m b c e b y e $.r l ,.Q J b K b Q b b b Q $ h e z j O 1 u u | { ",
+"b ,.,.b b ,.,.b [.J _._.J b b [.,.|.|.,.b ,.|.,.& , $ @ ' _.b (.J . ' v ,._.Q _._.,.J J > = 7.' 0 L <././.<.<./.<.;.[ N e a ' ' $ z ; W 3. .3 o +.o R 8 o = ) ,.{.Q {.) w A C C D N b y f j @ ,.J e ) ,.e ) j }.8 J e Q ,._.e e c e e J ].z J n >.8 R 0 f l [ ",
+"b b b b b m J {.,.m b b m m m b b ,.,.,.b m ,.|.|.H : b.Z Z h.^ j.c.[ p i.b _.b b J J Q m > > e b } /.<.<.<.<.<./.#.; e e c > , = ; W D 3. .H o o o n 8 3.. J ) {.7.J > G ^ ] A ] p . k Y [ Y k m c Q c 1 { } 0 @ Q e b J e e Q Q b e b o z e R d y . ! $ b e ",
+"b {.,.m b b b J ,.J _.,.,.m m ,.|.J _.b |.J J m ) _ 8 > * ' (.y _.b v g.q ) Q b {.) (.' [.m ; *.^./.<.<.<.<././.<.<.%.>.Q e z $.- ; W D 3.3 H o o 8 n @.# (.) ' J Q % :.g.=.4.A j p ' n Y C S g b ! Q % =.u | 0 Q Q e c y e e J Q Q e J d N b z J e e c O r j ",
+"{.b b b ,.m J b {.[.c _.m {._.J |.b m J b J J J m | y V 3 x y ' x $ b J ^ b ) ,._.b |.b ) ) 7 <.<.<.<.<.<.;.<.<././.<./.M 7.7.$ W W W W i 3 H o o R 5.$ x (.) J 7.) H =.g.4 *.9 0 n + n Y X P ,.k n z ! r Y S ~ Q Q Q b m e e e b e Q z k @ z v Q e b v @ y z ",
+",.b b m ,.b m m J b ,.m m J J _._.,.,.J J c J J _.] ^ ^ ^ [ C ^ C C ^ ` 2 J b _.[.b {.+ e H d./.<.<.t U { @ n T <././.<.<.o 7.Q D > D D i 3 H o o > v ) ' x (.{.(.D A 1.9 *.1.5 ; ' @ N O s j [.y K b *.S M X Q Q e J Q e e e Q e e b h f b y _.e y =.{ ].e Q ",
+"b ,.,.b m b b b m m m m m J J J J J J J _.J m b # @ y _._.@ 3.- a _.y b _.7.) |._.J [.[.Q _ <.<.<.;.n e b Q e e o }.<./.<.S Q e e .  . .>  .H H # v (.v v ) _.# o 4.9 8 9 j 9 { n ' @ ] 1 H $ > a ) P O j } f c Q Q |.b Q e e Q e Q e v N ) N e $ k { D e e e ",
+",.,.,.,.m b m m m m m _.[.J J _.c J c c _.b ) @ + ) J K i._., k ~ v _._.|.{.b ,.[.m [.[.Q : <.<./.O {.,.Q e b e e $.%.<.<.r c m e 7.z H E H H D . . x v x ) , H A P j j j O X O Y _ 8 r T D ~ $ @ ; 1 =.[ C a e Q Q |.Q Q e e e Q e e z y ~ z e Q b 1 | y e e ",
+"{.b b m b m b ,.m m m m m J [.J _.J _.c m J . , ' _.b J y _.y ~ > ! i.J b [.,.J [.J ) ) Q _ <.<.<. .e $ * {.7.e Q b #.<.<.r ) $ [.7._.D I E > @ ' . x ' ) , o A A n 8 P 7 A p O ( 1 : q p ' $ , - j l g 2.*.J |.e ,.|.|.Q Q Q Q ,.e ,.@ c y *.Q e > O } j e e ",
+"b b ,.b m m m m m m m J m J J J m c _.m _.+ ~ v {.y v x ' y J _.* 3.V Q @.Q |.[.[.{.[.) Q : <.<.<.$.e @  .; J x ~ ) #.<.<.} 7.$ ; ' 7._.; > @ (.. @ x ) @ o A *.F o n j A l P 0 S ` : l @ ~ % i n S j =./ ].b Q Q Q Q |.Q e e Q e e z h e ! j N b ! 0 2.{ . e ",
+",.,.,.b ,.b m b m m m m J [.J J [.) _.,.(.@ + [.. {.m _.) y ' (._.= w @ '.|.J |.J J [.[.Q _ <.<.<. .Q [.+ o  .= + @ j.<.<.} e . > = _.7.' % @ ' v (.' # 3.*.5 8 d 3 n 7 n P 1.0 Y Y | P . N D ' p 0 *.r X Q b e Q Q Q Q Q Q Q e Q m @ K J @ p J e e n r l Q e ",
+",.b ,.m m m m m m m m J m [._.J _.{.{.) ' ' ) ) m x ' ) ) x @ (.J x & N ^.e b ) J J [.[.Q : <.<.<.H Q b a H 3 = + @ j.<./.[ ) ' N ; ; + |._.# ' (.' = o 9 p F o H H o 7 n = P Y O C Y ` j =.e.X 0 I 0 2.i b ,.b b |.Q Q Q Q Q Q Q e Q b Q g k K h 0 0 2.X ' e ",
+"b b b ,.,.,.b m m m m m J J m J ) J [.) ) {.J ) ) { ^ 2 2 h.( ^ ( ^ / ^ %.* ) Q J J _.) Q _ <.<./.n 7.J , - V @ (.x s <.<.} ) ) @ ;  .@.V ) v (.x = o A A F o n H n H G G # @ O ` Y S 1 } } / _ 0 =.[ Y J ) e ,.b Q e e Q Q Q e e Q J Q ,.e _.e e I 7 l | j e ",
+",.b ,.m m m b m m m m J m _._.J ) _.J J J J ) ) ) F o o G H ..:.A F  .3 :.* a (.J J J [.Q 2.<.<./.o e # = x x v # & }.<.<.} [.~ @ z ; I  .$ ' v $ R 5 { G o H n o H n j G @.# @.Y 4./ S 7 o { Y 0 O S h K Q J e b |.Q e e Q Q e Q ,.a N a c e Q e Q @ N c Q b ",
+",.,.m ,.,.b b m m m m m m m m J J J c _._.) _.[._.. ) ) (.) a |.J ,.|.,.Q . - ' |.J ) J Q : <.<.<.H b @ v ' (.@ W D U <.<.} b , > ; ; = o R % ' R *.5 j R n 8 o H o F 9 { n . $ 0 { 7 j j ` 0 P 0 | 0 @ b b ,.,.Q Q Q Q |.Q Q Q e c . ].~ e Q Q e e $ i y c ].",
+",.,.b m {.m b ,.b b b m m m [.J _.J _._.J c _.) b ) ' ) ) ) _.(.[.) b Q e 7.+ ; a J J ) e _ <.<.<.o J (.(.a V $ & ; }.<.<.[ Q @ > > D >  .R H H F :.:.8 P o R R H n j G 2 Y P D j l j *.{ { j n 0 1 O N b ,.Q ,.b ,.|.Q Q Q Q e Q Q ) h ! J Q b e Q y z . _.$ ",
+"m ,.b ,.,.m b m m b b m m _.m [.J J J J c _.) [.' ) (.x _.(.y v ' . ,.Q ,.e e ) - ' _.[.e : <./.<.n |.[.) V = & x # j.<.<.B b ~ ; -  .D ; 3 o :.7 8 n P R R o n o 3 P 9 A G G C j 0 0 O O 7 f P 0 Y 7 $ ,.Q b J Q Q Q Q Q Q e Q Q e v f $.v Q e Q e e y ! ! a ",
+",.,.m m b m m b m m m m m m J J _.J _._._._._.) ,.b @ :.F D y ) + [.' o 7 ) e |.v * v |.7.: <.<.<.d 7.[.+ = = # . @ #.<.<.} Q . > ;  .E 3. .H F ~.P o R R R o o H P 9 d E 7 { 0 p 1.O 4.p j o G Y O $.y b Q Q Q b ,.|.Q Q Q Q e Q e _.J e e e Q Q e e e ,.@ @ ",
+"m ,.,.,.b m m m m m b m m J m [._._.J _._._.) _.) } ^ o P : S 0./ q '.2 $.b e e Q $ , x |._ <.<.<.I e v & % @ v + @ #.<.<.r [.~ D - W  .H H 5.R +.6 F P R n 8 o 8 :.1.` 1.` =.0 =.1.0 0 7 G 0 O X R a Q ,.m Q Q Q Q Q |.Q Q Q Q e b v _.e e e e e e ,.e e _.].",
+"{.,.b b b ,.m b b m m m m m m m [._.J _._._._.) (.7 m _.' |.; q W + _._.c e e Q e ,.@ = ) _ /.<.<.I Q $ , . x + . + s <.<.&.K z - N = 3 8 R 5.H n 6 :.+.R R P o o 9 / ^ 0 { =.O 2 { A l o  .j =.n N b Q J m b m b |.Q Q |.Q Q Q Q J y Q e e e Q e e e e Q e b ",
+",.,.b b b m b m m b b m m J m m [._.[.[._.[.[.J ) 1 n o o o P } R R P o d c e e e e b # v [ /.<./.g [.@ v . . + ~ @ s <.<.r c @ ~ =  .o 8 :.F -.o n :.:.F P R R F R ` q B 1.7 =.{ 0 G h @ J * d ! y Q c c b b Q Q Q |.|.Q Q Q e Q _.J e e e e Q e e e e e e e ",
+"m ,.b b b b b b m b ,.{.m m m m [.[._._._.) _._.|.j I P d P I l j F n I o K Q e Q Q e Q @ b.<././.n J ) ) . @ + . + #.<.<.} J . ~ = 3 3 w H :.o R H R :.:.o o P :.F 7 *.G 0 ^ _ ` O o y _.J ' % @ J b _.[.b _.m ,.Q Q Q Q Q Q Q e a ) e Q e e e b e e e e Q ,.",
+"Q b b b {.{.b ,.|.J @ @ {.|.) ) J J J _._.c c _._.. {.J J ' b |.' , ' J ) [.' ' 7.7.Q 7.|.C <.;.t z Q ' ' a x @ @ ~ [ <./.` Q . = ..F D D H H F R ..o R F 6 0.o H H o P 9 C A C | 0 z J b N  .j D & y ) ' |.|.(.|.m |.Q Q Q e Q {.' b e e e e e e e e e e e e ",
+"b ,.b J J J m ,.b & W v J {.[.m J J J c J c c _.) |.' ) J _.J b Q . @ b Q {.) (.J |.|.7.e a | u n Q Q ) . v v ~ ' x H } : - Q ' i H 8 3 w 3.H R 8 R P R 8 0.R o E o ..4 ] *.# . y J y $ 8 p S F > W = i W y m Q Q ,.,.|.Q Q e e b c Q e e e e e e e e e e e Q ",
+"m Q b J J b ,.J v D > K J ) [.{._.c c J _.) ) ) ) [.) b . . J + ) ) + ~ 7.|.{.V x b 7.|.,.e e b b Q ' x a a a ' , , ; x {.) (.D w =  .o  .5.3 o F F P P R R 0.0.6  .+.{ H v b ,.b J b >.=.C *.! x ; - i 5.5.3 y Q b b |.e e Q e b J e e Q e e e e e e e e e Q ",
+"J Q Q b b Q b (.D - x J y x ) [.[.J [._.J c c c b > $.j k E j E o f $.n z _.Q b $ v b 7.7.Q z i ! J ) ) (.@ v v v d W ' |.. D $ - $ D 8 8 8 8 P o R 8 8 0.P F j F H :.*., |.) _._.b J k 1 O W x m # @ $ W F A ..' b Q ,.e e b Q J Q e e Q e e e e e e e e e e ",
+",.,.,.,.Q b y % ; (.,.J ) (.x ) ) ) _._.[.J c c a u d o P j d o j f f P _ ) Q b _.a @ b 7.p t /.j.- . @ ' (.' $ D D . ~ , $ D = , = i ..8 o o o H o P P ....+.6 3 *.F W $ ) b {.,.Q b m p _ - _.(.(.. (.$ ; D p ; ) Q |.Q e Q b _.Q e Q Q e e e e e e e e e e ",
+"|.,.b m J . # = ) b J J ,.J . (.(.y ) [._.J c c 7.1 K y ) . ' _.,.. . e | b @ b {.J @ ' J | <.;.<.D . = $ a @ W = (.@ ; D ; + , , D D  . .i 5.o o R P P P 0.+.F G R ; J m b b ) _._.c J z 1 $ ) ) ) x ) , W v i i . Q |.b e Q b J e e e e e e e e e e e e e e ",
+",.,.,.b . # $ . |.J _._.J {.) ) x ' (.) _._._.c a u Y C X 9 $.j j f R 0 '.c b @ J 7.) (.) _ <./.<.D b @ , $ a @ ' , , D - @ W $ D  .i D i @.o o o R R P +.P F 6 :.x b J x x ) [.J 7.) Q . D N . ' . . ) i p i v D $ J Q ,.Q Q b Q e Q e e e e e e e e e e e e ",
+"m ,.,.,.+ $ x Q J ) b J (.[.{.(.V v a (.(.) ) y J z o o g o o o R R $.o c e ,.) ) ,.J J ) : <.<.<.d e J - ! , y @ $ D W $ - , =  .i ; W 5. .o 3 o o R R +.6 ~.~.) [.# x = $ [.) b ' Q . m @ ) c ' . ) (. .A I ) ; , ' Q ,.Q Q b e e Q e e e e e e e e e e e e ",
+",.,.[.v . (.J b J J J J [.J [.) _.@ V ' ) ' c ,.m @ Q . . ' ' _._.K b b Q e e e $ . _.b Q : <.<.<.I Q _., 3 w ' = W - v $ , W i W - ; i i @.3 P R R P R -.4 6 @ ) @ $ , - ; = ; % b [.b ) (.' . ) @ ' J I p ; $ + . m ,.Q Q e e Q e J K Q e e e e e e e e e e ",
+"|.m ) x (._.J J J J J J [._.J J J _.v V v ' ) [.) |.a ,.) _.@ ' y ' y 7.e e Q e |.' + ) 7.2.<.<.<.$.Q v a ~ - 3 , $ , @ $ = W W ; - ; i  .E 3 H R -.o P 6 7 ..a b |.) v @ - D D i @ [.) W = @ ' ) ' ' K H 9 ~ ~ , . |.e e e b % $.$ d ! e Q e e e e e e e e e ",
+"|.[.(.) J J J _.J J J J J [.[._._._.) @ , # (.) ) J ) _._.' b J ' J y b e Q e e e |.) . J _ <.<.<.H b a y (.! ..= @ @ $ $ - ; $ , ; D i H R o 3 R H 0.>.5 5 P 5.' Q Q [._.~ = # D ; ) . I - ' ' v @ y + d G $ v ; ' ) J {.. ! d k $ j d e e e Q e e e e Q e e ",
+"b [.J b b _.J b J J J [._._.[.J J _._.y V = , ' ' I ' ) _.' y . K ) c Q Q e Q e Q e 7.' ' [ /.<.<.n Q m ' - D - W $ ~ ~ , = - $ = D i i 3 P 8 o H R 9 5 ~.+.....w ' ,.b J ' . J ; w @ i :.$ ' @ K @ y _.> P ~ J m e J ,.b > g k J b ! n @ e b y e e e e e e e ",
+"J [._.b b _._.b J J J [.[.) _._.) y J J ' $ , $ a h.Z } '.Y { d J @ c 7.b e e e Q e e 7.b } <./.<.d Q ) = 5.= ' = = $ $ z = $ = - D  .w i H F 8 R 7 5 :.0...o R  ., ) ,.J ) v $ W W , 0.{ = @ . v N K _.D j $ b b |.J e b ].$ Q e Q c i k J e Q e e e e e e e ",
+",.[.) _.b J _._.J J J J J _.[._.) J J _._._.a - $ $ @ b ) % d O Y _ X C 0 b e e Q e Q 7.7.2.<.<.<.I Q $ ; , x @ v $ + @ , , ~ ; - W i > > 3.o 8 9 A *.P o 0.R H i ; ~ ) [.c N 3 $ - - :.4.$ . y @ z v v E l z J m _.Q ,., ~ b Q K J b K k h e e e e Q e e e e ",
+"|.b ) i.i.J b J J J [.[.[._.J [.) m _.y _.b ' , $ = a @ ' d j X / Y Y Y 0 J e e e e e ,.e 1 ;.<.<.d b $ $ (.' ; @ + @ ~ z , = ; ; W W D 3.5.H 8 4 *.F o H o ..H D ; , @ y ' ; H @ i 3 *.4.= @ v K N ' ' i 7 - ,.|.b e z $.' e J J Q e e a ! c e e b J Q e e e ",
+",.,.J (.i.i.J b J J J [.[.) [.) J [.) _._._.i.i.> q j.S 2 *.n ) ' ) ' 7.Q e Q Q e 7.e e e M <.;./.j J ) ) x @ = ; ~ ~ ~ ~ $ ! D D W D H H 3 3 ..:.F :.:.8 F *.{ ; % - ! + @ > i @ o ..9 { D @ ' $ i N ' @.{ $._.m Q ' P g {.Q Q e J e e Q y N c e b y J Q e e ",
+"Q b b ,.) x i.J J J J J [.[.[.[.[.) [.[._._.J J _.5 h.| : ^ ( ^ A n c J e e e e e e Q e e 1 <.<.<.d Q (.$ ; $ a W W $ $ - W i - $ - W D o R 3 R 3 P F +.:.A 9 H % - > ; . . d W W P I H 4.j = ' ' g g y ' P j ~ m ,.].i ~ m e Q e e e e e b J b e Q a @ Q e Q ",
+"b b b b ,._.(.K b J _.y [.b b ) [.) ) ) ) _._._.' m - w $ @ $ J  .E s T T Q Q e e e Q e e S <.<.<.o Q x $ = @ ' @ ; H @ , H , @ - i 3.3.0.4 P H ....P 4 g.4 o W W $ W ' ,.%  .i - o 4.7 { 0 N ' @ 8 G = . D P o . . k h Q e b J Q e e e e Q Q e e Q v N c e e ",
+"b b b Q Q b ) v J J J ) _.J m ) ) [.J [._.) ) ) J y $ 7 ^ S '.^ < X O f b e e e Q e e e e S <.<.<.o Q ) @ , + v @ @ D H = ; 3 , = ; 3.H :.F 3 H H ..5 ^ 4.F H i > = ) . ' ) o - . j Y ` ^ A # @ @ h E ].) . i j - z h a e Q _.b b J Q e e e e e e Q @ ! a e e ",
+"Q Q b J b Q {.(.V ' b ,.J ) J J ) ) ) _._._._.J @ q | { h.w , V $ ) ,.m e J b e ,.e e e e _ <.<.<.o e _.. ~ @ $ ' , x D H = W o = ; 5.0.:.o 5.o o 4 ^ { R o R H W ' _.' . . > D ' p ` ] ^ o @ . x @ $ N ) J # D k D $ ,.,.b 7.b J J Q e e e e e e Q a i N b e ",
+"b Q b J J ,.,.,.% v y J b ) ) b _.) J _.[.[._._.Q ' a J y w w @ - _.x Q Q e e Q e e Q Q |.: <.<.<.d e m ' @ @ = @ a $ v W i $ D D 5.i  .H o o o *.5 *.0.o P 0.i . ,.J ' @ ) % * ' H p X A % ' # # @ . . K ) _.) N i ].v v ' m ,.Q e e e e e e e e e a k z Q Q ",
+"c Q Q Q b b ,.Q _.. $ V J b J _.J ) ) ) ) _._._.y y J y ' x & W $ $ v b Q Q e e e 7.[.) _.M <./.<.o Q ) x . . $ W ' $ , . W  ., i 5.w D w 5.P ~.4 :.o o F P i # # = . * = b % ) ) . p 1 G * . N # # @ ' y ) _.{._.N W W N ].! K b e e e e e e e e e y i N e Q ",
+"b b b Q b b b b ,.[.@ $ v b b ) _._.J _._.) ) _.) ) J V ) Q = w k - $ b |.e {.) e b (.) _._ <.<.<.o Q ' . x a $ , D a $ = ~ D D 5.i D 5. .3 :.{ R o o :.j i z D o > D D > @ ) # @ ) o 1.o * @ @ . @ @ ' ) _._._.' ' y v @ z f > K c b Q e e e e e e c ; @ e e ",
+"7.,.b Q b J b Q b e {.$ , i.J _.) ) ) ) _.J ) _._.J x b _.x ,.a ! w $ $ |.{.) b ,.) . ) ,.1 /.<.<.o e _.' ' v - $ = D , @ = $ - ; W = - i 0.*.6 o 0.0.F 3 @ ; 0 > ; W p A ~ ' ' # # ' W ].' N @ @ @ @ . ' ) _.J J y b K $ K N ! $ a K y J e e e e e {.z @ e Q ",
+",.b b J b b J J ,.,.,.J V = v Q _.J J ) _.) ) _.J x J ) x _.' ) ' ! k a b _.b {._.) J ,.Q 2./.<.<. .|.x (., W v , $ = W , $ = = ; ; W  .3 D 5.F ..H 0.F > (.+ H i D D  .E ; . ) . # * N V @ @ N # $ # @ # $ ' Q b J J J Q ,.c ' N z $ K y K J e e e b b Q e e ",
+",.{.b b b b b b J J ,.,.) V , v ,.J y i.J J ) _.b ) _.y (.[.y y i.@ w ! y m b J _.J J ) ) [ <.<.<.P e b ; W . v a , = - D ; $ = , - > i & [.+ o 0.o R :.o = ' _.d  .N y * @.; ) ' ) @ = ; N @ % @ # . . @ N , % J _.J J b Q Q Q Q a z N @ K c b e e Q e e e e ",
+",.,.,.b m b b m _.J ,.,.b ' V = K i.J J _._.J ) y b ) ) ) _.J y _.J @ w = V _.b J J {.' . r <.<./.j {.) ~ W , (.$ = $ = i D = , - ; , x {.b y , o R 0.0.8 o = J @ + . + W H $.= ' . @ N - = = N % # @ ' ' + N ! % a ) J Q Q 7.e e Q b c $ ].a e e e e e e e e ",
+",.,.b b {.m b b m J J J Q ,.) V > $ J b _.) J (.i.J _.y v x ) (._.$ a y , D , b J b b _.) [ <.<.<.$._.$ (.~ D , , , , = ; D i ; ! % c Q |.. ' _.= o :.0.0.:.8 D Q Q # E o  .@.E # + + @ % * ; ; = * # @ ' _.) @ z N @ a ) c ,.Q Q e e e b c b e e e e e e e e ",
+",.,.b b b m m m J ,.b J {.Q Q J = * v J J _._.) J v _.[.) _.(.J ' 3.! b . * W b J J J b Q M <.<.<.I Q $ , v v i v @ W - $ - i i % c e ,.) [.(.v _.= H P P F 8 ..% J ' k H k  .H # + + & N + # ; z # @ @ . ) ) ) _.a N ].z a c J e |.Q e e e e e e e e e e e e ",
+"b ,.b b b b m ,._.J J J _.{.,.{.b , - v J _.y _.) H y J J |.i W , ' $ , H ' , ) J ) (.{.e : <.<.<.o e ) = - + $ @ = = , = , v $ y Q e b _.[.' + (.y $ o :.+.o R o % J ' i P d = + - W $ + ~ N # * # @ @ @ ' ' ' ,.) a @ a . K a K c Q e e e e e e e e e e e e ",
+",.,.,.,.b m ,.J b b b J J b b J 7.i.- * ' _._.) x g.x ) . ) 2 1.$ Q _.& ^ v . ) b J ) _.Q M <.<.<.o |.) ' ; - (.= = $ $ = + |.e Q e e Q b ' . ) V (.' = o P +.P P E N . = d  .N @.o E * . N * @ = * N # @ ' ) ) _.J J b b J y . @ K J Q e e e e e e e e e e e ",
+"b ,.,.,.,.m b J ,.b J J J J b ,.J ,.@ 3.; (.J y J ^ ) J x J 1 4.) v ) 7.1 = a b J b {.m e _ <.<.<.d e ) ' v @ , , @ , = x b Q e Q e e J J J ' v + $ V ' & o +...H P H ; # @ > o 4.G o H > # @ * # % N % + ' c _._.[.J J b ,.7.e J Q e e Q e e e e e e e e e e ",
+",.,.b b b b {.b b b b b J J J J ,.{.|._.; D V J _.L ^.u j.j.%.%.c.j.}.j.^.' $ = b ,.b b e 2.<./.<.d Q ) (.(.. @ , = ~ ) Q e Q e e e Q m _.) . . # $ $ # v @ D P H H F G H & &  .p 9 1.1.H % % = & $ * = * . ) ) _.J J J m b b Q Q Q e Q Q Q e e e e e e e e e ",
+",.,.,.b m b J J J J J b J J J b J J ) J (.; D V b K b @ ' J . ) ' @ ' Q ' 7.V = _._.J (.' r <.<.<.H Q . . x x @ @ $ . |.e e Q e e e Q b J ) ' ' ' . ' ' ) [.(.+ % N * = ; % + + o 9 A j o P o * & $ & = = @ ) ) c _.J b b b b Q Q Q Q e e e e e e e e e e e Q ",
+",.,.,.b b J b b b b b J b J J J y m J {.,.x - 3.J i._.{.,.) _.K (.) ' x J ,.|.J > y |.' ~ } ;.<.<.o b v + x ' . @ ~ y e e e Q e e Q Q Q b J _.) ) _.) y ) [.,.b . @ $ # % ; $ [.(.- W , i A ] G i ; # @ . (.) ' [._._.J b Q Q Q Q Q e Q Q e e e e e e e e e e ",
+",.b ,.,.b m m J J J J J J J J J c [.Q ,.{.b (.D > J y x _.) ' c [.' . ) Q ' [.Q v & @ b Q } <./.<.d Q . + + . + @ v ) e e e Q e e Q |.,.b m _._.' ) ) ' ' ) {.|.b K $ % N z * @ J J J y N D n 7 7 8 k = ~ . ) ) J J J J m b b Q Q Q e e Q Q e e e e e e Q e e ",
+"b ,.b b b b b b b b b J b J J J ,.' ' J J ,.J K  .= ) {.. J ' _.(.(.x ) ' Q |.|.Q @ W + e _ <./.<. .e ) @ @ + . . c ,.e e Q e Q Q Q Q Q m _.c ) ' ' ' ) ) (._._.7.J a N z z z z @ _.J @ N @ # ! E $.$.I @.z K _._._._.m b ,.Q Q Q Q Q Q e e e e e e e Q e e e ",
+"b b b J m J J J J J b J J J J J {._.@ % (.b b b V S < =.: ^ } _ | g.] ] { ' Q |.J 7.(.* ' S /.<.<.$.e ) a ' _.|.|.e e e Q Q e Q e e b b m _.y ) ) ' . ' ) ) [.[.J ,.J v * z z N N K _.y a $ # a ) ' a N N # K ) J J J J b ,.,.,.Q Q e Q e e e e e e e Q e e c ",
+"b b b b b b b b b ,.J J b J J J ) ,.(.= V _.b b Q , H D ) x g.P _.x ' b J Q [.m b b b [.{.Z <./.<.d e y _.b e e e e e e e e Q Q Q Q Q Q m [.) y _.) ' ) ) ) J |.b Q Q _.v N N N ].* @ J ,.@ $ c c c _.J _.c c c c _.J b b b Q Q Q Q Q e Q e e e e e e e e J N ",
+",.b b b b J J J J ,.b {.J _.[.[.[.) {.) $ , J ,.i.@ w = ) . ] n _.) ) ) |._.|.Q e _.) |.Q < <.<.<.d e J Q e e Q 7.Q Q Q Q Q Q e Q Q b ,.m m J _.) ' . . + $ ~ @ ) ' ) _.) @ N $ $ N ].@ J ' # ) c c c c c J b ,.J c _.J b b Q ,.Q Q Q e Q e e e e e e e b $ i ",
+"b ,.,.b m b b b b J J J {.{.[._.J ) _.J i.V ~ ' - j.^.'.j.c.j.j.j.'.j.c.'.. Q ~ [.,.|.|.) < <.<./.j e K Q e Q e e e Q e e e 7.b ,.e e Q m ' $ W H H n j G G G j n o o o d E $.E = N % N @ _._.K J c c c b b J b J J J m m b b Q Q e e Q Q Q Q e e e e e y ! k ",
+"b b b b m m b {.J {.b {.J _._.) {._.) ) {.) V % -  ., ) ,.Q Q y (.a _.,.x Q J -  .7.b v _.1 <.<.<.2.c b b J Q e e e e e J b e Q Q m K z k P 9 p 0 A p p *.G G j P P j G 9 9 G 9 1.9 R i = # (.,._.c J c _.b J m b b b b b ,.Q Q e Q b Q e e e e e e e K ! k k ",
+"b b b b b b b b J ,.{.{.) _._.J J {.) ) b b x V ; (._._.b & (.7.J J (.- . ' b i n $ e ) |.H <.<.<./.}.u s T u T T T T T s O c @ ! i o P j 9 j n H 3  .D - & $ $ , , & D  .H F 9 p 2 2 A F o i % ' _.J _.c _.,.b b ,.,.b b Q b ,.e b Q e e e e e e Q a h i i h ",
+"b b b b b J J {.{.,.{._.) ) _._.) b {.) _._.) J V (.(._.Q 3 i J J b @ ; |.7.,.F n 9 [.7.m ) u <.<.<.<.;./.<.<./.<.<.<./.<.q z H d n 0.o D ; @ x |.b J ) y y ) J ,.Q Q ,.J J (.a = o *.A 5 5 4 j D $ [.,.{.J J _.,.,.b ,.b Q Q ,.Q Q e e Q Q e e b N i k h h i ",
+"b b ,.b J ,.{.J ,.J ) ) _.{._.) ) _._._._.(.) {.b # ,.) ,.E P i Q [.* ) e Q , o F o w 7.b Q i U ;.<.<.<.<.<.<./.<.<./.;.<.r @ W E W + J |.b (.@ W D  .o R ......H 3 5. .D = a (.|.J $ i R 9 A 4.0 o = . J ,.b J ,.,.Q Q Q Q Q Q b e e Q Q e e Q ].i k h h i i ",
+"b b b b b b b m J ) ) _.J b J ) ,.) ) b ,.b _.) . p v [.Q D j 0.; ' ) 7.{.Q i 8 :.o R . Q e e z S }.;.;./.;.;.;././.<.<.<.} + x J Q 7.J @ > o :.~.~.*.*.*.~.:.F R 0.F 9 *.9 F 8 D $ ' (.v , 3 *.1.A G E * ) |.7.b b ,.,.,.,.Q Q b e Q Q e e Q y k i i i k i i ",
+"b b b b b J b b ) _.) _.J J J J ) ) {.Q ,.Q b ' ) < n E E 1./ C : 0  .I 3 ) 3 F H F 0.D ,.J y e e c $ @ ; $ N $ k h D k  .$ e |.Q (.- o :.~.:.:.:.:.:.6 F F +.P F n 8 :.9 9 9 9 9 F n o W @ v # E 8 :.F o D # ) {.b ,.Q Q Q Q b Q Q e Q e e K ! h i i k i h h ",
+"b b b b ,.b b ,.. ) J J ) ) _.b , @ _._.V y ,.) ) } n E d 1./ : ^ ( :.o w @ F P ..o o  .b Q Q c |.e b y $ @ ! ; @ K ) {.e 7.|.a w H F F R R F ~.:.:.~.7 ~.:.6 8 R o n :.9 9 :.:.:.:.j :.j R  .W # ;  .o P F H ; J {.,.|.Q Q Q Q ,.Q Q e b K h o h k k h h k k ",
+"b m ,.,.Q J ) x ) J {.i.' b J > V b ,.b $.8 = ,.{.p ' e _.E :.G 0...P - ,.5.~.H R :.= J Q _.J e Q { !.;.;.<.<.;.}.C J e ' W W 3 R -.H ..+.F F F ~.~.~.:.~.:.F +.R 8 F j 9 ~.9 :.j F :.F R o F 9 G H % . w o o o o % ,.Q b Q e m ,.m e |.z I $.k k $.k i i i i ",
+",.m |.Q b x . ) _._.) ' ) ,._.> * i.b ,.> G n  .Q ) 7.[.,. .:.P ~...6 -.~ H :.0.j @ [.7.J _.e ].}.;.<.<./.;.<.<.<.;.U n 3 d H H o o o P +.8 F :.:.:.~.:.:.:.F F ..R +.F ~.~.~.~.:.:.:.:.F ..P :.p A 8 ; @ v ; H 3 o W [.7.,.m Q e e Q ) z $.I i k k k i i i i ",
+"m ,.Q ,.' @ x |.b _.(._._._.@ , ; v ) {.$ j n F 3 x 7.[.(.n :.:.R 6 +.R n R ..:.> Q c Q J 7.* }.<.<.;.<.<.<.<.<.<.<.<.L 0 o H H H -...P 0.+.6 :.~.~.:.~.~.:.F 8 R R 8 :.:.~.:.:.:.F :.~.F P ....j 4.1.:.i $ v $ R 0.E = (.7.e ,.Q 7.) @ ~ ! k k k i i k i h h ",
+"{.Q J . + ) b |.b _.) ,._.$ > = v x ' J ) o o 8 F H D . J 3.R 7 - 3 6 6 ..R -...) ,.Q J Q b : <.;.<.<.t L L U <.<.<.;.<.}.i j 0.o o o ..R 8 6 :.:.:.:.:.:.:.F 8 P P +.:.~.*.~.:.:.F :.~.:.P R ..R :.p 5 4.F - _.$ 3 0.d ; ) Q e b J . ~ . @ ! I k h h k $.i k ",
+"|.b (.+ ' |.Q y ) J ,.,._.$ * , J ) ) ,.b o 8 8 o P :.5.$ $.+...$ ' ..7 o ..R N |.) Q ) Q z t <.<.<.e.d . |.b D j.<./.<.<.F H 0.F P o o P 6 :.:.~.~.:.~.~.:.6 F ..R 8 :.~.~.:.:.:.6 F ~.:.F 8 P R R F 9 5 A 8  .b . i j n ~ b ' ' @ + a . . $ i $.k k k k i i ",
+"{.' . ) ,.b ) a J b b _.v i.,.,.{._.J ,.Q W n R F :.:.R P 6 G +.= ) $ 5.~.F = |.m _.J ) 7.*.<.<.<.#.@ e e m % ~ - r /.<.;.^ % o F +.....0.F :.F :.~.:.:.~.:.F P R P P F ~.7 ~.~.:.6 F ~.~.F F :.+.R P F ~.5 A *. .' b - i K J N . @ + . ~ @ K N k k $.k k i k ",
+". . (.|.,.) x (.J _.J K , $ _.,.J Q ,.,.,.+ 0.8 R ..F R G ..+.{ - ' e ) n  .m e ) J m e e S <.<.<.X e Q , D H D % R <.<.<.Y , $.F F :.P R F 6 :.~.:.:.~.:.6 F +.P ..F :.:.9 ~.:.:.F :.~.~.:.~.~.F +.P 0.8 9 5 9 A o . e |.a @ a @ @ . @ @ @ a a ! k $.k i i i ",
+"= . b b ' v ' J _.@ ) J ! P H ; ' {.,.{.{._.F *.3.J $.:.P +.0 4 ~ |.Q |._.) m Q e c y Q Q [ ;.<./.f Q % i 0.H R I $.L <.<.[ . D 8 :.~.:.P 0.6 :.~.~.:.~.:.:.F P R R F :.~.~.~.:.:.:.:.~.~.:.:.9 6 +.+...o 8 *.*.*.{ d . ,.) @ ~ . K ~ ~ ' ' @ @ $ h $.k i $.$.",
+") |.|.y . y J b v & = J ' o P ..P 3 , ' Q _.3 ~...J |., R g.4 P v ,.b ,.e e |.e e |._.Q c } <.<./.I ) I n R n j n o ^.<.<.r . D ..:.~.:.:.:.+.F ~.~.~.:.~.~.:.F R P P :.:.9 :.:.6 6 :.:.9 ~.~.~.~.6 F F ..H 0.9 { o - @ . @ @ K . D ~ . @ $ K a K N k $.i k $.",
+"J b ) V v b b ' > - v ,.J w :.F P ..o o D = 3 o 6 ' e ) , 3 F ~.' ,.,.b e e Q e b e e ' ! '.<.;.<.o + H n +.F :.0.o U <.<.e.. > o :.7 ~.*.~.6 :.:.6 ~.~.~.6 +.+...P P :.~.7 ~.:.F :.~.~.~.9 ~.~.*.~.6 F F n P j P ; @ % % . @ z n l > + K ~ . a a $ ! k $.$.$.",
+"Q _.v a J b y , $ v {.b 7.(.o R ..+.F ~.8 ..P 6 :.w J J . . = k ) Q ,.b e e Q e |.e |.> d '.<.<.<.P ~ o 0.0.F :.P o U <.<.r . > o :.9 *.4 *.~.~.F F :.*.*.:.8 F R ..+.:.~.~.~.:.:.6 :.:.~.~.~.~.~.7 *.F F :.0.H , ' . , ~ . @ $ G { n N ' @ a @ a @ $ h $.k i ",
+"J ' ' b ,.x = - [.J J y |.|.W P ..P 0.~.~.F P P P H + ' ' Q b ) m Q ,.Q e e Q e e ,.$ P d q <.<.<.j ~ 3 R 0.P 8 P R ^./.<.r . W H +.~.~.4 A *.4 :.~.*.5 4 ~.8 +.R R P F ~.~.~.:.F 6 ~.:.~.~.~.~.6 ~.~.F :.G  .+ |.+ N @ + > > ' > 7 { $.. . a @ v @ v N k $.k ",
+"a . J Q J $ $ . J b ) [.b Q ) 3 0.R 3 D H ..P 6 +.0.v ,.J e ,.Q ,.Q Q b e Q Q e e ~ I G W [ <.<./.j $  .o 0.P F F R U <.<.r K ! o F ~.9 4 5 5 5 *.*.4 { 5 *.F P P P F :.:.~.~.:.:.F :.~.~.~.~.~.*.:.6 9 :.3 + Q ' , - ' z 9 G - . d O o $ ~ @ K a v K @ h k k ",
+"x J Q {.' ) {.Q [.|.b |.J b Q = :.0.W m ' = 5.+.{ A $ Q Q |._.m b b Q 7.e e e e Q i *.:.v _ /.<.<.j $ 3 ..+.0.F F R ^.<.<.r K ! o F ~.:.*.4 5 { 5 { { g.5 5 ~.P ..R +.:.~.~.~.:.:.6 :.~.9 ~.~.~.4 :.9 A H . |.) - ~ + , o g.{ P + - P h . @ ~ a a @ v v z i $.",
+"J |.b (.) ,.|.(.b Q 7.7.{.Q e b 0.*.o x |.m m @ o .., |.|.|.b ,.Q b b Q Q e Q Q @ d 7 I |.S /.<.<.G #  .P P P 6 0...U <.<.r . W o F :.~.*.4 4 5 5 { { 5 { 5 *.F R P 8 :.~.~.~.:.F F :.:.~.~.~.~.~.*.*...$ |.J % , + , o p { { 4.$.@ ; ~ . ~ @ @ a ~ @ K @ ! $.",
+",.y V a J b $ I D W $ $ V v $ v - F :.= (._.b ' Q ) b Q b b ,.b b J b e e Q e Q H R H $ Q [ <.<.<.j +  .P P ..F 8 R ^.<.<.r . W H F ~.~.4 4 *.4 5 { { 5 { O 4 F ..P 0.F ~.~.~.~.:.:.~.~.9 ~.~.~.~.*.o + |.' % N @ z R { g.4.5 { p v ~ @ @ @ + @ v @ $ v v ; $.",
+"i.- ~ J y J ) W :.9 6 P P F :.....0.0.F = ) @ b |.|.,.,.,.b b b Q b J e b Q e ~ o n $ e ' q <.<.<.F $ H 8 8 F :.P R U <.<.e.x D o F :.7 4 5 4 5 4.5 5 5 4 A { g.6 ..R ~.*.9 :.:.~.0.F *.F :.*.F *...@ |.@ z ~ ~ k 4.] { 4.g.{ *.].% @ ~ $ ~ + . @ @ a $ @ $ k ",
+"~ , y b $ $ _._.H :.~.G 6 P R R R ..+.5 R v b |.|.|.,.,.,.,.b ,.,.b b e b e e ; n  .m |.- u <.<.<.F ~ H R R P F P R U /.<.Z x W -.F :.~.4 5 4 5 5 4.4.4.{ 4 4 4 *.F R F :.9 *.A 8 9 :.:.p G :.{ 0.% ) ~ ; N ~ ! p *.4.{ 4 { *.W @ K $ % ) a ! - @ @ a $ @ @ h ",
+"* a b b ' @ (.Q $ o 6 ~.7 +.P 7 6 +.+.*.9 * 7.|.,.,.,.b b b b b b J b Q e e ) $.P , e + I q <.<.<.j $ 3 R ..R +.P o ^.<.<.r x w H F ~.*.4 5 *.4 5 4.5 { 5 5 4 4 { A :.8 F ~.5 { 9 :.:.9 :.*.9 n % ) x ; z . ! F ] 4.*.4.] 9 > . @ @ z ~ . D P n + @ v v v @ ].",
+"y b J m m ) x ) |.= o G ~.H - - o 8 :.F :. .m b ,.b Q b b ,.b b b J Q b e e % P d {.Q D o q <.<.<.j ~  .d o o R 8 o ^./.<.Z ' W -.F :.*.4 5 *.4 A 4 5 { { { A *.{ 5 4 ~.~.A O O =.9 j G j p n @ [.@ - $ ' , 0.g.{ { 5 g.g.i ' ~ $ z @ ' > l p j @ a @ @ v K N ",
+"|.b _.(.|.{.) (.|._.- 0.~...$ Q |.y a _.. + b 7.Q b b b b b {.b m J Q b e b i j W e . o I e.<./.<.P @ k H H H n P R U <.<.B . w H F ~.~.*.*.*.4 5 5 A 5 { { { 5 4 5 5 A { =.g.{ ] 1.*.:.7 o z ) . z % @ W 0.{ g.{ 4 g.{ k ~ ~ $ N @ @ W j { A p , a @ @ @ @ @ ",
+"' [.{.{.b J _.m (.|.b , -.~.o * v J J 7.e ,.b J b b b b b b b b m J Q Q Q @ d o (.e D n D q <.<.<.F + i E H o P P R ^.<.<.e.x W H :.9 7 A A *.A A 5 A 5 { { g.{ *.A { { =.h.=.6.=.1.g.1.n N @ N z N N i *.9.O O h.g.9 i @ v N N $ K > p { { A 0 i @ ~ $ @ @ a ",
+". (.|.Q b ,.|.{.x J |.m - +.6 F $ J Q |.|.Q Q |.b b b b {.b {.m J ,.b 7.b h P $.e x d R i q <.<.<.n @ i 3 H o P F o U <.<.r a w H F 7 9 *.*.*.*.5 4 { 5 5 5 5 { 5 5 5 { =.h.h.g.=.4 ` A ; . z ].z N  .5 h.{ 5 9.{ A i . ~ % a $ @ ! P { 4.9 A A P @ @ @ v $ . ",
+"Q ) J ,.,.7.7.[._.$ , ~ w o o :.I $ m m m b b Q b b b b b b b b J ,.m e J d G D e W o H  .u <.<.<.n . i 3 H o 8 P o U <.<.r x D H F 7 *.*.*.*.4 4 4 { 5 5 5 A 4.g.5 4 5 6.=.h.h.{ =.p @., N - z N > 9 2 O 0 O O 5 D + $ % % ~ . z 7 g.p A { 4.4.0 ~ @ $ K $ . ",
+"b ,.) @ v = 3 3 o -.+.G +.....0.:.$.x e m J e b b b b b {.J J J ,.,.b 7.$ d P - b I ..H I Z <.<./.j @ D E o R F P ..U <.<.e.~ = 3 F ~.~.4 *.*.*.5 5 4 A 4.4.{ 5 A 5 { 5 5 { g.h.C :.> ~ N ; ; N - l ] g.5 g.g.4 - ~ @ % $ @ @ , 4.0 { 4.4.A A p 4.$.. $ @ v K ",
+"{._.# E j 9 :.....n R +.*.6 P P 9 n - _.b Q e J b b b b b b b b c _.m ,.! j P v J H 0.d 3 q <.<.<.l ~ D  .E R ~.F n U <.<.} v D o F ~.:.7 *.4 4 *.4 5 5 5 4 4 4 4 5 O O { { g.C *.5.& N - N N ; F ` h.{ O ^ 1.H ~ + % - $ v W :.4.A 4.A 5 4.4 p 4.o . @ @ @ a ",
+",.Q _.& E n 8 P H +.+.6 6 R $.W ; - ~ _.b Q e {.b b {.b J J {.m Q b b m > j H [., 0.0.o d q <.<.<.j @ D E H o 9 R o }.<.<.} x W 3 8 :.7 A 5 4 5 5 5 5 4 5 5 { { A 5 4.1.=.C g.9 > % # * - z i P ` ^ ` h.] 4.R , + - - @ + D 7 ` A A A 5 A 4 A 4.A :.% a $ $ $ ",
+"J b ,.{.v , 5.~.G +.n ! _.|.J {.|.|.|.Q m b Q b {.b b b b J b m Q _.J ,.a - , b E 0.o o H q <.<./.o . k o o H 8 :.n U <.<.r . D o 6 ~.7 4 4 7 *.5 5 5 4 5 { { 4 *.5 A A ] C 9 D + % * ~ % $.p ] g.{ 1.^ A D % ~ $ - $ ' ; *.] 4 4.4.5 5 5 5 4 4.A p ! @ $ . @ ",
+"b J b b {.{.v w 6 G ~.H a Q b ) J m Q ,.m _.b {.b b {.J J m m m J ) Q Q e e ,.b 3 0.0...I q <.<.<.l @ i $.@.3.H j 8 ^./.<.e.+ W o F ~.~.4 4 4 5 4 5 5 4 5 { 5 *.A 4 5 O g.p  .@ $ - z # > 9 ] 2 { g.{ A I ~ @ % - a . D ~.{ 5 A 5 4.4 5 5 5 4 A 4.{ D @ $ y a ",
+") _.{._.(.J ) a -.7 ~.o 3.' Q _.{.[.m m b b b {.J b b b m m m J J _.7.J b 7.7.Q $ H :.0. .q <./.<.P c ' J Q Q J * ; U <.<.r v ; 3 +.7 *.5 5 4 4 5 { 5 5 5 { { 4 4 5 1.g.G D % N z ~ @ - P g.] { g.^ *.D @ N ! % . v > *.g.5 9 4.4.4.4 4 7 0 4 A *.l ; ) $ @ @ ",
+". (.b |.,.J J ) ) ; H 8 G E @ _.,.,.b ,.,.b J J b {.{.m m m [.J b ) {.- D , [.Q b , o F 3 q <./.<.P Q Q e 7.7.Q Q _.#.<.<.r . ; o :.~.+...H D 5.~.5 g.5 4 5 5 5 4 4 5 j i # $ - N ~ - P g.] g.g.2 g.H ~ @ z h % + i 9 4.{ A 5 5 { { 5 5 5 7 4 *.F R ].Q ' $ $ ",
+". . ) J b {.) y _.) > R n G F ; # a ' J |.,.c y b b b m m m m J ,.[.|.> j P W ' Q m - 0...q <.<.<.d e Q ) V V v {.,.T <.<.B + D o R 3 = ' y y ' @ H 4 { 4.5 5 5 4 5 F ; @ * ].N N ].n ` 2 4.4.^ 1.n = , z ~ N % i ~.g.5 *.4 4.A { { 5 5 5 4 4 *.R R > e {.@ a ",
+") + v {.Q Q b v n 8 8 R R P F *.0.' Q m c ' _.,.m ,.,.,.m J J J _.Q {. .....0.3 b Q ) 3 I './.<.<.d e * 3 o H :.o [.u <.<.q ) W o o @ b @ w W , @ (.; A { { 5 4 { F ; @ N z N N @.A h.g.1.h.g.4.D - N N ! N . i ` 5 4 5 5 5 { { A { { 4 A 5 :.H d o  .Q e e Q ",
+"Q Q |.J ' , 3...F G :.F 8 P H w . e Q _._.m ,.|.b b ,.m [._.J b m ,.J  .R R 0.H ' J |.5.o Z <.<./.$.) E H R o R R  .#./.<.} @ W I ; J v o 4 4 9 - x $ n 4.5 5 4 P D + @ - % ~ ].p 1.1.{ C ^ ~.D , $ - ; N + ! *.{ 5 4 5 { 5 4.4.5 4.5 4.*.F ..H o o k Q Q Q b ",
+"7.{.$ i ..P +.R o ~.A n w @ _.|.Q Q ) ' _.m Q ,.b b _._._.m b m J ,.[.3 P o ..R & |.e W H e./.<.<.$.) E H ..o n l j %.<.<._ + W d + b D 4 4.{ O o @ v i { 4.{ 5 3.~ . , ].z > 8 ` =.{ { h.5  .@ $ z ].z N i *.` { 5 5 5 { 5 4 A 4.p A { p ..3 o H R  .Q e e Q ",
+") = ..:.6 ~.6 -.P H ; (.J _.J |.|.J ) m b b Q b m m _._.m b b m J J [.3 0.H o 8 w e |.= H q /.<./.l . d R H o 8 o P t <.<.| ) D  .) b  .5 *.*.{ p , v ; { 4 { 4 @ @ $ z z - n ^ 1.4.O ^ { H , , - ! z $ z d ` ` 5 5 6.5 5 5 A 4.5 A A 5 9 0.H H H o  .Q Q e b ",
+"|.' D o o ..6 6 n 5.$ i._.m b {._.J ) ,.|.m Q ,.J _._.m m m m m _.J J 5.0.o R P > Q |.; 3 Z <./.<.M @ - n o H o o S <.<.<.=.c D I + J 3 A 4.4.O :., + W g.4.5 4 $ ~ @ $ % N $.4.1.g.g.^ ] :.D = z ! N z z ].R g.5 O 5 5 5 4.A 5 4 4.4.A A 9 F H H R k Q e Q Q ",
+"x b |._.' @ 5.6 P +.F R D # b e ) b _.J b b Q Q _.J J m ,.m m J b b b i R R 0.o ' ,.7.D H =.<.<.<.t 0 $.3  .d F r t <.<.<.7 . k o , b $ ..*.A ~.W v = H g.{ { 4.o ; . ~ - , z  .4.g.g.O h.h.*.o $ z z z % . - d 5 O 5 5 5 4 +.0.:.A 4.A 4 A :.H H R  .Q e e b ",
+"@ ' m ,.|.Q Q _.H -.P 6 ~.P 3 w @ Q Q |.Q Q ,.J _.J b ,.b b m m m ,.{.i ..8 0.5.|.,.J H ....U <.;.<.d.#.q < q %.<.<.;.<.%.> $ k F H . m @ W W , @ @  .A g.5 { { { n - % - N % z I A ` 4.g.^ 2 g.$.! z N $ , ~ $ n 4.O 5 5 F H H ..:.*.4.A ~.+.o H o k Q Q Q Q ",
+"(.@ ' ,.Q ,.Q Q |.$ k -.-.8 :.:.d ' ,.b ,.b _.) m m ,.b J m b ,.J m _. ...8 o = |.Q ; R R W ^ /.<./.<.<.<.<.d.<.<./.<./.C {.- $.0.9 D ) b ) a ' a - 6 ^ g.5 5 5 ` A 3 ~ ~ z z z @ o { g.g.O O g.] i , z % , ~ $ , n 4.{ 7 +.o ..H ..~.{ 4.0.o o d R  .Q e e b ",
+"|.) . ' b Q Q |.J ' w R :.6 P H ) Q b Q Q ) c m m b m m ,.m m m _.,.|.> ~. .$ Q Q ) H +...3 i ^ <.<.<.<./.<.<.<./.<.;.{ c @ D H P 0.0.3 , _.y , H 7 g.{ 5 { 5 5 *.{ A $.@ @ ].].- % I { g.O h.^ g.4. .~ $ z % % @ $ o p 6 ..R H 0.o n 7 F H H o o n W e Q Q e ",
+"J J _.' [.Q Q [.& 3 6 P P F W 7.,.e ,.b b [.m ,.m m b m m b b m Q J b ' $ b b Q [.W F o o R W W { c.<.<.<./.<./.<.q P . _.W I P 9 9 *.9 R 3 o ~.*.{ g.5 4 5 5 5 5 4 { 4 H z N N N ].z I { g.5 g.O ] :.W ~ ~ ~ z ].+ @ D 0...-...o 3 H R ..d o o H n z e Q e Q ",
+"{.,.J _.J ,.(.= F ..P :.3 v ,.Q m Q m ) _.J m _.m m m m m m b m Q J ,.Q Q 7.|.Q  .8 F -.P F H i + D 9 ^ _ : S /  .' ) + W I H F F :.9 *.j n :.A g.O 5 4 4 4 4 4 5 7 5 ^ 4.H z $ ].N $ z I 5 h.O { ^ g.:. ., @ $ a y Q {.= o ..H o o o o H o R ..o R @ e Q e e ",
+"' J Q Q _.= H F P P ..; [.e e _.,.{.c _.m ,.,.,.,.m m ,.m m m b m [.|.|.v $ $ b  .n o o +.o ..0...; . v + ' ) ) ~ $ W D i o 0.~.F 6 :.9 :.o ..:.g.{ 5 7 { { { 5 5 7 4 =.] 1.n W z $ z - , I 4.h.g.] ] ] A H , ~ ' {.|.e |.= 0...o ....o H H H o o d _.e b e Q ",
+"' [.|.(.D P 0.-.o F H # {._._.Q e ,.,.,.,.,.,.,.m b ,.m b m ,.m J b Q J  .P E [.~ 0.0...-.o 0.H o ..H W = ; W > ; i ..H ..:.F F ~.:.9 *.:.0.R 8 7 5 0 5 5 O 5 4 5 5 5 5 { ^ g.P N z N $ ]., I g.` g.g.g.g.*. ., $ _.m J e |.W F H H d o o o o o R  .b e b e e ",
+"7.,.+  .F 6 0.o F o E H o I i i ! - ' ,.,.,._._.b m m b b m b m {.,.|.{.i j d ) @ 0.F ....-.+...R ....H H H  .5.H o F :.:.+.P 7 6 F :.9 j R R :.7 { 6.0 7 5 5 5 5 5 5 { 5 g.C g.$.% K z ! N z I { ] h.{ { g.5 o $ . _.m |.e J - 0.0.o o R ..o d n W Q e Q e e ",
+"Q J ~ D 5.i H F 8 :.8 n F F 0...A P % m ,.,.m m m {.m m m m m m b b m Q $ H o $ [.k 0.R P ....o +.n o P 0.o ..F 0...0.~.4 G P 6 ~.:.~.9 j n F ~.4 5 5 7 4 5 5 { 5 *.{ O 8.{ =.g.A D ].].N z ! $ R 4.g.{ 6.h.9.4 W , ' J J Q e e W H 0.R R R o o ..$ 7.Q e e e ",
+"Q Q ,.Q Q |.) ) ~ N N > 3 -.+.4 F k ) Q m ,.,.,.m ,.m b {.m m ,.b m [.7.. I 0.! Q i 8 o o R P R -.+.+.R P :.F o P :.F P 6 7 :.+.6 F :.~.F 0.:.5 5 0 5 6.5 5 5 { 4.*.5 O O 8.O 5 C { I $ $ z z ; N d 4.g.O O 8.O ~.W # @ _.e b b Q = o o d H o o o . e Q e Q Q ",
+",.m _.Q Q J |.Q 7.,.7.Q D :.6 +.W |.e [.|.Q Q [.,.m m m m b ,.m Q c b e b W n  .e + o 0.o R R ....n P P P P P +.+.+.+.+.6 6 7 7 +.F ~.*.*.~.*.5 4 5 7 5 5 5 4 4 5 5 5 { { O { { 5 { { j W @ $ z , $ 3 O h.{ 6.{ O 5 E ~ K y Q b e Q ~ d R o o o D ,.e Q e b e ",
+"Q ,.' ) {.b Q Q m e Q , 0.7 6 H (.Q ,._.b [.,.,.m b m b b m ,.,.b J ,.e e % n H m b  .F H o R ..R P ..n P +.P P P +.+.+.6 6 ~.~.~.:.~.9 *.*.*.4 4 5 5 5 4 4 4 4 5 5 0 { 6.{ { 1.{ g.] ` F ! $ - , ~ ; o *.g.h.4 5 g.4 I % y Q e Q Q b - n o H n % e e Q e Q e ",
+"Q Q . @ J Q e ,.,.e ~ 0.:.F 5.' |.b {.Q Q |.,.|.b b m b m ,.J J J ,.b Q e ' I n $ e , j o 8 8 o R ..R +.P P +.+.F +.P 8 +.F 6 ~.*.~.:.7 *.*.7 A 4 4 4 4 5 5 4 4 4 5 5 5 { { O { { g.O ] ` o , $ - ]., $  .5 g.5 5 { ] A $.~ ' J e Q e {.- ..R o ) e e Q e Q e ",
+"|.e _.) |.Q Q b e v o A 0.5.@ e Q b b |.) ) b ,.b ,.m m m b m m _.,.Q Q e ,.W P  .e {.3 8 R n R P P R P n P P +.P F +.8 +.F F 6 *.7 *.4 4 *.4 4 4 4 5 4 4 5 4 4 4 5 5 { { { { { A { { { ` 4.I $ $ ].; $ , 3 *.g.O *.5 g.p i @ . J |.b e ,.! R $.Q e Q Q e Q e ",
+"b e |.,.Q b Q Q )  .:.0.o D $ @ - W 3.H R > ' {.b b ,.,.b m J J b b ,.Q e Q v d n + Q % 8 R P P R P n P P P P P F +.+.+.+.F +.6 :.:.*.4 4 7 ~.*.4 5 4 5 5 4 4 4 4 4 5 5 { { { O { O O 4.O ] 5 H z % N , $ $  .{ { { *.{ g.F = + . Q Q ,.e b , ! e e b Q e e Q ",
+",.Q |.Q Q b Q J o 9 F ..F 0.H j F 0.0.:.0.$ |.Q b b m m J {.J b Q m ,.Q ,.e {.D 0.i |.{. .o R 8 P +.P R P n P P P +.+.P +.6 F F +.6 *.4 A 7 7 4 4 4 4 A 4 4 4 4 A 4 A 5 4.{ { O ` 4.g.g.4.` ] { P W ~ z z + ~ i A ] 1.4 1.{ +.3 % K J ,.Q e |._.e e b e e e e ",
+"Q Q ,.|.b |._.W A ~.0.R 0.P 0.F R 0.0.R > ) |.{.,.b m _.J b b ,.,.Q Q e Q e e + o n , Q @ H H ..P ..P P P P P P +.P 8 F F F 6 6 :.F ~.4 5 4 4 *.4 4 4 5 5 5 5 4 *.A 4.4.{ { { { { { { { { O g.h.` j ; # , ~ . ~ $.A { *.4 g.O 1. .; K ,.Q Q e e e Q Q Q e e e ",
+"e ,.b |.b b v :.3 D  .i = z % J ; H F .., |.Q b |.b m _._.{.Q Q J Q Q Q Q Q e ) d n H Q |.H H H P P P R P ..P R 8 +.+.F F F F F ~.F F 7 { { 5 *.A 4 4 4 4 A 4 4 *.*.A 4.{ { { O 4.{ O g.] ] g.g.2 { o ~ ~ - z $ @ I { g.4 *.5 4.0 W @ . Q e b Q Q e e Q Q e e ",
+"|.e ,.m e m $ (.m |.m |.Q b Q Q 5.P :.; J b Q |.Q ) _.,.b e e J Q Q b e Q Q Q e ; o j $ Q = n o -.0.6 +...+.P R P P 8 F F :.6 :.F F :.~.7 A 5 { 7 4 5 5 5 4 4 5 A 4.A 4.{ g.{ 4.{ O { 5 A g.h.O 5 2 4. .$ $ - $ % . i { { *.A 4.F % ~ ~ ' _.e Q e |.b Q e e e ",
+"Q ,.|.|.b J m Q b b m b b |.|.@ ..F ..v Q |.|._.z o ; Q e y y e Q b b Q Q Q Q Q ' I o 3 . _. .n H o ..P P R P F P +.+.+.+.F F 6 6 6 :.:.~.4 5 4.4 4 5 5 5 4.4 4 *.A 4.{ 4.{ { { g.{ A ~.~.4.] g.O g.g.4.H + ' , . N -  .p g.4.4.$ ~ D > @ y Q Q e e e Q Q e e ",
+"|.|.b (.x y J b |.J b b m Q (. .8 ..3.y J , W H :.P a ,.J Q ,.b b Q b Q e Q |.e e $ 3 l D Q . E ..H H 0.:.8 o +.8 8 8 F P F :.F :.:.6 ~.9 7 4 5 5 A 4 4 5 5 5 5 *.A 5 4.4.4.{ g.{ *.~.F 0.9 g.h.=.O =.^ 4.3 $ $ $ % $ @ D p A k .  .{ j z @ a c c e e e Q e e ",
+"J |.x = y |.J J m ) J J b |., 0.H R E 5.o P n P F H |.e ,.e Q e J Q Q Q Q Q |.e e ,.- R o @ 7.. ..R o o F :.n R R 0.0.+.8 F :.F F F :.~.~.~.4 5 5 5 4 5 4 A 4 A 7 A 5 4.{ { { { *.F F F :.*.{ g.g.h.O { g.g.0., % ~ ~ a @ k  .. D p ` g $ @ $ a a J Q e e e Q ",
+"J J @ a |.|.J b J y m m |.) 3 j +.F 0.R F :.:.:.n D |.Q [.e b ) J Q |.b Q Q |.Q Q e ) - F H {.Q = o R 3 H F ~.6 8 P 0.8 +.F F :.:.:.6 :.~.*.7 *.4 5 { 5 5 4 4 5 5 4 4 5 { O 5 A :.0.0.:.:.p g.g.O ^ ^ 4 A 2 { P x % ~ + ~ . . - 9 { *.! K v N @ $ @ ) Q e e b ",
+"_.$ x |.|.) J b b m J |.|.= F 0.R F F 8 H i H 0.P % 7.Q |.|.$ d y Q Q Q e Q |.e e Q e . H P D b 7.= P P H o F :.8 8 8 8 0.F F :.6 F ~.~.~.*.*.4 7 5 { { 5 4 4 4 5 5 5 5 { { A 6 0.R n F l A ` g.{ g.h.g.{ { 1.{ i % ' ~ z a v ! { O o % @ $ N @ v $ $ m e e b ",
+"$ $ y |.J ) b |.b b {.Q y 3 8 H F o D W x (. .o H # |.e [.; n P y b Q b e e Q e Q |.e |.~ H n = 7.J w R o o R ..:.F F 8 8 8 F F F :.:.~.*.7 4 4 *.4 5 { { 5 A 7 5 7 5 5 { 4 :.0.F 0.0.n :.4.] ` g.O g.h.g.4.4.] 4. .# ~ ~ $ z ~ o 0.- @ @ v @ v @ ].i z Q e Q ",
+", b Q J [.{.m m J J J Q # 0.R i - @ J ) |.J 3 8 H b Q @ i n 8 P . b Q ,.e e |.e |.e b e Q  .R R - b ' 3 ..H o o :.F F +.F F F 6 F 6 :.~.9 *.*.4 4 4 7 A 5 { 5 7 7 4 5 5 5 7 0...0.0.F 0.j { ] { g.g.g.g.g.g.{ { g.A i + ~ @ . ~ ' W @ a $ $ $ @ $ h g k _.e Q ",
+"b b ,.b b {.{.{.m |.|.J ' ' b b e J . |.e + R ..D $ i n n o o +.x ,.,.e $ > e e Q e Q e e J h j n D b |.D R 3 o H 6 9 F ..P :.:.6 :.6 ~.7 7 7 7 4 5 4 7 5 5 { 5 4 7 5 7 6 P 0.F R 0.R o F A { { 1.{ 1.g.g.g.{ { O P - @ . @ % @ ~ @ ~ $ $ @ @ @ h f d d k ' e ",
+"b b b {.b m J J m |.|.b m b |.b J a # b |.W 0.H ..3 0.F o n 0.+.$ Q Q . $.o @ e Q Q e Q b e c k n o ; Q 7.; 8 0.E 0.:.F +.F F +.6 G 6 ~.7 7 4 7 7 7 5 4 0 5 5 6.5 4 7 6 0.+.P P 0.F F 8 F 4 { { g.{ g.g.1.5 g.g.0.~ x 0.G % ' z % @ a @ $ @ $ N f d f d o ! c ",
+",.{.{.{.{.{.J {.{.|.Q b b b b ) W , ) e e 3 0...H ..G d ; H 0.0.a |.) $.g n  .) e b Q Q Q e e _. .0.H & b e + n ..F :.9 ~.:.:.F 6 :.~.~.~.4 7 4 4 7 5 5 7 7 4 O 5 7 F P +.8 F 0.8 8 0.0.0.9 { h.5 O g.g.5 ] g.7 + , I 0 { I ~ ' $ @ @ $ v a N h R g f f R o - ",
+"b b b {.b b b {.b b b b b b ) v $ (.|.Q _.o o ..F R i + |.> R 0.' ) > j o d n > e e Q b Q e b e _.k P H W {.7.' :.F F :.7 ~.:.F 6 6 6 ~.~.7 7 7 7 4 5 5 5 7 5 5 *.:.P R P 8 P R P R R 8 R F *.{ ` O 4 { h.] n $ = n { 2 A D @ @ ~ @ @ ~ a v ! d d d o d f o f ",
+"{.{.{.b {.{.{.b b b {.J J J (.+ _.J {.b . n d R H ; ) e Q  .F n & $ o P I o H I # e e b Q e e Q e ) D j n i @ |., i F *.9 6 F 6 :.:.~.~.~.*.*.4 4 4 4 5 5 { 4 7 P +.8 P P P 8 8 R 8 F j F F j ~.{ g.g.{ *.i , ; p ` { 7 $.@ . % @ $ @ v ~ ].k g $.f o d k $.g ",
+"{.b {.b b b b b b {.J [.J {.[.) _.J ,.Q ; G H W ) m Q |.J I 8 R E H j k N @.H n I , Q e Q Q e Q Q e J ! o P H i b (.; 3 P 6 :.6 6 :.:.~.~.7 *.7 4 4 4 7 4 5 ~.F H R 8 F 8 8 8 8 8 j F P P j G G *.1.~.D , , 3 A ` =.n - @ ~ % @ $ @ @ $ ! $.f d f $.f o f I d ",
+"b {.J {.b b b b J J b J J b m _._.,.,.J $.I - b |.,.,.,.7.h R P 8 P d ' Q , o 0...o z b e b Q Q e _.Q e , P j j H = b b % ..:.8 :.:.:.~.9 *.*.A *.4 *.4 *.~.F ..o o R 8 8 P 8 P n 8 P P j 9 G F n  .% + D 9 ` O *.I $ ~ @ . ~ ~ ~ @ @ ].$.d d $.g $.$.d o f f ",
+"J {.{.{.b b b b J b |.J _.J J J _.,._._.> J |.Q {.{.,.J ,.k R R P P - Q 7.$ 0.5.o ..H z e e Q Q ,.e e b {.+  .n A 9  .' Q y w ..F :.:.~.9 *.*.A *.*.*.A *.F ..o ..R o R 8 P F 8 n P j :.l 9 o 3.v |.# F { { { 0 i z . $ $ ~ % a a @ - $.g d f $.o d f f f f d ",
+"_.J b b {.{.b J b b J b b J b J b b ,.b ,.J |.|.J ) Q Q Q D n n *.W ,.Q Q b ..o ..E n k Q e m e Q e Q J m Q ) D p j F P D ) |.(.- H 9 *.~.:.~.9 *.A A *.j R R P o o o R n F 8 8 j F :.l n ; (.,._.= o 7 ` =.G W ~ % , % ~ ~ $ $ @ ].$.g d f f d f f f f f f f ",
+"b {.{.J J b {.J m b J m b J b J b b ,.b ,.J J J J b ,._.,.> P :.i + Q e 7.Q i o o R H N 7.e Q e e Q b {.b m ) . ; I :.9 G H = ' |.) ,  .0.9 A 4.A A A ~.:.0.R R H o n j :.j P P P d D $ _.,.' = o P l G P I D % + ~ ~ $ % ~ @ . ].i f d f f f d f f I f I f f ",
+"7.Q J [.[.J b b b b b b J J J J J {.{.,.J _.) x ,.J ) _.7.i 0.D ) {.Q e e e $ ..H n z Q Q 7.e Q e ,.m b m c _.Q |.@ > k o A 7 H  .= . x + $ W  .0...d H H H H H H o o o E  .D > ' _.J ' z  .P l p l d ! @ y K ~ ~ ~ % % ~ $ z ! f f d d f f d o f f f f f f f ",
+"7.Q ,.J _.[.[.b b b J b J J J J b b {.{.b [.) ' _.) J |.Q D D b |.b {.Q e e ) o R  .) 7.7.7.7.|.J Q ,._._.J _.m |.b J ) + i j p G :.F 0.H W , @ ) b |.Q |.b b ,.Q ,.,.,.,.b {.[.z @.n j j l l l k z . J |.Q _.@ N $ @ . @ ! I n n R g d f f f o I $.f $.$.f f ",
+"Q 7.Q |.J ) [.b m m b m b m J J b b J J J {._.(.@ ) |.,.[.. _.Q b J J e Q e Q $.o @ Q 7.e 7.|.,.[.|.m ) J b _._.) J ,.b {.c ~ W j G p 7 G ~.9 7 D W , $ # @ ' (.(.. # * >  .o j G j j j 9 P i ~ ' ) J J J J J J $ ~ K K - I P P P n o o o d f $.$.f $.f f I I ",
+",.7.e Q ,._._.{.{.J b b b b J J b b {.J [.{.b J ' a ' b |.|.|.b J J b e e Q Q ; i b e Q e e [.J |.[.' c m b m Q _.c _.c J {.J _.' , H :.A { *.:.F F P 8 0.8 8 n o R P j j G j j j l l f - a _.c J c ) c _.{.{.,.c @ z > $.o n o g o o f f o f $.f f I f $.$.f ",
+",.Q 7.Q Q ,.[.) ) J b b b b b b J J J m [.J J b J @ @ [.e b _.J [._.Q e e e e v . e e Q e ,.) b b . . [.,.J m Q b b J b _.y y _.J ) ' @ - i d o n n F P P 0.n n n P j j :.P o H > z . _._.c y J y y c J b Q b c Q ' h d g I I n g o f f f f f f $.$.$.$.f f $.",
+"Q b Q Q Q e b ) [.[.J b b b b J _.J J m [.) J m J b x . m b _.J ) _.Q Q e e e J e Q e e Q J J J (.+ x [.[._.J _._.m m J c c J _.) m _.(.) b b b + ~ ; W ! ; ! D ! ; ; ! - N . c m ,.b J c ) y c c c c c c b b J b J $ $.n d I d n g f $.$.$.f f f f f $.$.f f ",
+"Q Q Q Q Q ,.Q Q ) (.[.b b b m J J J J b m m [.J J b b ) ) _.J J [.[._.Q e Q |.Q e e Q ,.b ,._.' a y ) [.) ) ) [.m m {._.c y ) c c ) ) _.m b b {.|.,.,.|.|.,.|.Q 7.Q b b m J J _.J J c c ) c c _.y c c J J m J J J _.e {.i o $.$.$.d g f k $.$.$.$.k k $.$.$.I ",
+"Q Q Q Q Q Q Q Q [.) ) [.b b b J J b J J {.J [.[.b [._.b ) v x b ) J ,.{.,.e e ,.e ,.[.m {.[.' . ) J J J ) ) (.' ' ' ) J m J J ) y c J b b ,.b b b Q ,.b b b b ,.Q b m J ) c c _._._.c c c c c c c _._.c c c c c c ,.b b y ! g f f $.$.$.I $.$.d $.$.$.$.$.$.f ",
+"Q Q Q Q Q |.Q |.,.[.(.(.[.b b J b m J J J J m m b ) [.b m @ V y b J J |.|.b b m |.m _.{.J ) ' ' J J J ) (.' ' ' ' . . ' _._._._.y c b ,.|.b b m ,.b b b b b ,.b b b J y c ) c J c c J J J {.c c c ) y ' K y y c c Q J Q e K $.d I k i f k $ $ $.f $.$.$.$.$.$.",
+"Q Q Q Q Q ,.Q Q Q ,.J (.) ) {.b b b b J J {.{.b ) ) J J {._.x $ _.J _.|.7._.. ,.b |.|.|.J ' (.J J _._.) ) ) ) ' ' ' . . K ' K y c m Q 7.Q b J b b b m m m b b b Q b b c c J _.b J J J J c c c y K a a a . y c J J J b Q Q Q a i f f $.k $ e e ! $.$.$.$.$.$.$.",
+"Q Q Q Q Q Q Q Q Q Q |.J (.(.[.b b b b b J J m m ) b J ) m |._.@ % (.J b |.|.m [.{.|.Q J ) _.b b b [.(.y ) ) ) ) ' ) ) ' + ~ @ @ b b Q Q ,.m m m ,.b b J J J ,.|.b b {.{.J c J c b {.c c y K @ @ $ ~ v . ' y c J J J b ,.c e e a k I k $ Q e y i $.k k k k k $.",
+"Q Q Q Q Q Q |.Q |.Q Q |.) ' (.J J J m b b J J {.m m J _._.[.J J v # _.|.J {.b ) b b {.) ) J b J b J [.) ) ) ) (.. ' ' . @ ~ K _.e e Q Q b b J J m m J J J J b b b b c y y ' y ' K K a a @ @ $ $ @ ~ a K ' ) ) c c J b Q Q Q Q e K z $ e e a i $.$.k k k k k $.",
+"Q Q Q Q Q Q Q |.,.Q 7.Q |.[.) ' ) _.b b b b J J {.{.J J [._.b b b a @ b Q ) x ) b J y ) {.|.b ) b {.) ) ) ) ' ) ' ' . @ ~ K b e e e Q b b m J J J c c y ) c _.J Q {.c a @ v a K @ @ @ @ @ @ a a @ a a K y y c c _.J m b e Q b e e b b e e % $.i i k i i k k k "};
Index: /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui.cc
===================================================================
--- /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui.cc	(revision 3498)
@@ -0,0 +1,139 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+
+*/
+
+#include <unistd.h>
+
+#include "orxonox_gui.h"
+#include "orxonox_gui_video.h"
+#include "orxonox_gui_audio.h"
+#include "orxonox_gui_exec.h"
+#include "orxonox_gui_flags.h"
+#include "orxonox_gui_banner.h"
+#include "orxonox_gui_keys.h"
+#include "orxonox_gui_update.h"
+
+  Window* orxonoxGUI;
+  OrxonoxGuiVideo* video;
+  OrxonoxGuiAudio* audio;
+  OrxonoxGuiExec* exec;
+  OrxonoxGuiFlags* flags;
+  OrxonoxGuiBanner* banner;
+  OrxonoxGuiKeys* keys;
+  OrxonoxGuiUpdate* update;
+int verbose = 4;
+
+int main(int argc, char *argv[])
+{
+  OrxonoxGui* orxonoxgui = new OrxonoxGui(argc, argv);
+  return 0;
+}
+
+/* ORXONOXGUI */
+
+/**
+   \brief Initializes the Gui
+*/
+OrxonoxGui::OrxonoxGui(int argc, char *argv[])
+{
+  initGUI(argc, argv);
+
+  orxonoxGUI = new Window( "grafical orxonox loader, "PACKAGE_VERSION);
+  
+  Box* windowBox = new Box ('h');
+
+  banner = new OrxonoxGuiBanner();
+  windowBox->fill (banner->getWidget());
+  
+  Box* optionBox = new Box('v');
+  
+  Box* avBox = new Box('h');
+
+  video = new OrxonoxGuiVideo();
+  avBox->fill(video->getWidget());
+  audio = new OrxonoxGuiAudio();
+  avBox->fill(audio->getWidget());
+      
+  optionBox->fill(avBox);
+
+  keys = new OrxonoxGuiKeys();
+  optionBox->fill(keys->getWidget());
+
+  exec = new OrxonoxGuiExec();
+  optionBox->fill(exec->getWidget());
+
+  flags = new OrxonoxGuiFlags();
+
+  optionBox->fill(flags->getWidget());
+  windowBox->fill(optionBox);
+
+  update = new OrxonoxGuiUpdate();
+  optionBox->fill(update->getWidget());
+  
+  orxonoxGUI->fill(windowBox);
+
+  // Reading Values from File
+  exec->setFilename("~/.orxonox.conf");
+  exec->readFromFile(orxonoxGUI);
+  // Merging changes to the Options from appended flags.
+  for (int optCount = 1; optCount < argc; optCount++)
+    orxonoxGUI->walkThrough(Widget::flagCheck, argv[optCount], 0);
+
+  flags->setTextFromFlags(orxonoxGUI);
+  orxonoxGUI->showall();
+
+  //// Handling special Cases. ///
+
+  // case update //
+#ifdef HAVE_CURL
+  if (static_cast<Option*>(orxonoxGUI->findWidgetByName("auto update", 0))->value == 1)
+    {
+      update->checkForUpdates();
+    }
+#endif /* HAVE_CURL */
+
+  // case start-with-gui.
+  if (!access(exec->getConfigFile(), F_OK) && static_cast<Option*>(orxonoxGUI->findWidgetByName("Always Show this Menu", 0))->value == 0)
+    OrxonoxGuiExec::startOrxonox(NULL, exec);
+  else
+    {
+      mainloopGUI();
+    }
+
+}
+
+
+/**
+   \brief Destructor.
+*/
+OrxonoxGui::~OrxonoxGui(void)
+{
+  delete video;
+  delete audio;
+  delete exec;
+  delete flags;
+  delete banner;
+  delete keys;
+  delete update;
+}
Index: /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui.h
===================================================================
--- /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui.h	(revision 3498)
@@ -0,0 +1,32 @@
+/*!
+ \file orxonox_gui.h
+ \brief Creation of the Gui
+
+ \todo way to start gui without GTK (textmode) AND IMPROOVE
+ \todo curl interface to Download cool stuff
+
+ \todo widgets save themselves
+ \todo good way to step through all the Widgets
+ \todo label -> protected : getlabel function
+*/
+
+#ifndef _ORXONOX_GUI_H
+#define _ORXONOX_GUI_H
+
+#include <iostream>
+using namespace std;
+
+#include "orxonox_gui_gtk.h"
+
+#include <stdlib.h>
+
+//! Class that creates the OrxonoxGui
+class OrxonoxGui
+{
+ public:
+  OrxonoxGui(int argc, char *argv[]);
+  ~OrxonoxGui(void);
+
+};
+
+#endif /* _ORXONOX_GUI_H */
Index: /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_audio.cc
===================================================================
--- /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_audio.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_audio.cc	(revision 3498)
@@ -0,0 +1,72 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+
+*/
+
+#include "orxonox_gui_audio.h"
+
+/**
+   \brief Creates an Audio-Frame
+*/
+OrxonoxGuiAudio::OrxonoxGuiAudio(void)
+{
+  this->audioFrame = new Frame("Audio-Options:");
+  this->audioBox = new Box('v');
+  this->audioFrame->setGroupName("audio");
+  
+  this->enableSound = new CheckButton("Disable Sound");
+  this->enableSound->setFlagName ("no-sound", 0);
+  this->enableSound->saveability();
+  this->audioBox->fill(this->enableSound);
+  Label* musicVolumeLabel = new Label("Music Volume");
+  this->audioBox->fill(musicVolumeLabel);
+  this->musicVolume = new Slider("Music Volume", 0, 100);
+  this->musicVolume->setFlagName("music-volume", "m", 80);
+  this->musicVolume->saveability();
+  this->audioBox->fill (this->musicVolume);
+  Label* effectsVolumeLabel = new Label ("Effects Volume");
+  this->audioBox->fill (effectsVolumeLabel);
+  this->effectsVolume = new Slider ("Effects Volume", 0, 100);
+  this->effectsVolume->setFlagName ("effects-volume", "e", 80);
+  this->effectsVolume->saveability();
+  this->audioBox->fill (this->effectsVolume);
+
+  this->audioFrame->fill (this->audioBox);
+}
+
+/** 
+    \brief Destructs the Audio-Stuff
+*/
+OrxonoxGuiAudio::~OrxonoxGuiAudio(void)
+{
+  // nothing to do here.
+}
+
+/**
+   \brief Return the Frame
+   \return Returns the Audio-frame
+*/
+Widget* OrxonoxGuiAudio::getWidget(void)
+{
+  return this->audioFrame;
+}
Index: /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_audio.h
===================================================================
--- /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_audio.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_audio.h	(revision 3498)
@@ -0,0 +1,26 @@
+/*!
+  \file orxonox_gui_audio.h
+  \brief File that holds the class that creates the Audio-Options.
+*/
+
+#ifndef _ORXONOX_GUI_AUDIO_H
+#define _ORXONOX_GUI_AUDIO_H
+
+#include "orxonox_gui.h"
+
+//! Class that creates the Audio-Options.
+class OrxonoxGuiAudio
+{
+ private:
+  Frame* audioFrame;        //!< The Frame that holds the audio Options.
+  Box* audioBox;            //!< The Box that holds the audio Options.
+  CheckButton* enableSound; //!< A Ckeckbutton for enabling Sound.
+  Slider* musicVolume;      //!< A Slider for music volume.
+  Slider* effectsVolume;    //!< A Slider for effects volume.
+ public:
+  OrxonoxGuiAudio(void);
+  ~OrxonoxGuiAudio(void);
+  
+  Widget* getWidget(void);
+};
+#endif /* _ORXONOX_GUI_AUDIO_H */
Index: /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_banner.cc
===================================================================
--- /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_banner.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_banner.cc	(revision 3498)
@@ -0,0 +1,81 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+
+*/
+
+#include "orxonox_gui_banner.h"
+
+/**
+   \brief Creates a new BannerEventBox and its content.
+*/
+OrxonoxGuiBanner::OrxonoxGuiBanner(void)
+{
+  // Banner Itself //
+  this->bannerEventBox = new EventBox("BannerEventBox");
+  this->bannerImage = new Image("banner.xpm");
+  this->bannerEventBox->fill(this->bannerImage);
+
+  // Banner Window //
+  this->logoWindow = new Window("Logo");
+
+#ifdef HAVE_GTK2
+  this->bannerEventBox->connectSignal("button_press_event", this->logoWindow, Window::windowOpen);
+
+  this->logoWindow->connectSignal("destroy", this->logoWindow, Window::windowClose);
+  this->logoWindow->connectSignal("delete_event", this->logoWindow, Window::windowClose);
+#endif /* HAVE_GTK2 */
+  this->logoEventBox = new EventBox();
+  this->logoBox = new Box('v');
+  this->logoLabel = new Label("OrxOnoX, Version: " PACKAGE_VERSION);
+  this->logoImage = new Image("banner.xpm");
+  this->logoEventBox->fill(this->logoImage);
+  
+  this->logoBox->fill(this->logoLabel);
+  this->logoBox->fill(this->logoEventBox);
+#ifdef HAVE_GTK2
+  this->logoEventBox->connectSignal("button_press_event", this->logoWindow, Window::windowClose);
+#endif /* HAVE_GTK2 */
+
+  this->logoWindow->fill(this->logoBox);
+  
+  Window::addWindow(this->logoWindow);
+}
+
+/**
+   \brief Destructs it.
+*/
+OrxonoxGuiBanner::~OrxonoxGuiBanner(void)
+{
+  // nothing to do here
+}
+
+/**
+   \brief Returns an EventBox
+   \return The EventBox, that holds the Banner.
+*/
+Widget* OrxonoxGuiBanner::getWidget(void)
+{
+  return this->bannerEventBox;
+}
+
+
Index: /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_banner.h
===================================================================
--- /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_banner.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_banner.h	(revision 3498)
@@ -0,0 +1,39 @@
+/*!
+  \file orxonox_gui_banner.h
+  \brief  File that holds the class that creates the Banner-Image.\n
+  This is Commercial :-)
+*/
+
+#ifndef _ORXONOX_GUI_BANNER_H
+#define _ORXONOX_GUI_BANNER_H
+
+#include "orxonox_gui.h"
+
+//! Class that creates the Banner-Image
+class OrxonoxGuiBanner
+{
+ private:
+  // the banner Frame
+  Frame* bannerFrame;       //!< The frame that holds the Banner.
+  Box* bannerBox;           //!< The box that holds the Banner.
+  EventBox* bannerEventBox; //!< an Image needs an EventBox to catch klicks.
+  Image* bannerImage;       //!< The Image for the Banner.
+  Label* bannerLabel;       //!< The Label of the Banner.
+
+  // the logo Window
+  Window* logoWindow;       //!< The Window that holds the Orxonox-CrewLogo.
+  EventBox* logoEventBox;   //!< The EventBox that holds the Orxonox-CrewLogo. it has to be an eventbox, because Images can not receive clicks.
+  Box* logoBox;             //!< The Box that holds the Orxonox-CrewLogo
+  Image* logoImage;         //!< The Orxonox-CrewLogo-Image
+  Label* logoLabel;         //!< The Label for the Orxonox-CrewLogo
+
+ public:
+  OrxonoxGuiBanner(void);
+  ~OrxonoxGuiBanner(void);
+
+  Widget* getWidget(void);
+
+};
+
+
+#endif /* _ORXONOX_GUI_BANNER_H */
Index: /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_exec.cc
===================================================================
--- /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_exec.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_exec.cc	(revision 3498)
@@ -0,0 +1,374 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+
+*/
+
+#include "orxonox_gui_exec.h"
+#include <iostream>
+#include <string>
+
+HashTable* orxonoxFlagHash;
+
+/** 
+    \brief Creates the Exec-Frame
+*/
+OrxonoxGuiExec::OrxonoxGuiExec(void)
+{
+  configFile =(char*)malloc(512*sizeof(char));
+
+  this->execFrame = new Frame("Execute-Tags:");
+  this->execBox = new Box('v');
+  this->execFrame->setGroupName("misc");
+  
+  this->start = new Button("Start");
+#ifdef HAVE_GTK2
+  this->start->connectSignal("clicked", this, startOrxonox);
+#endif /* HAVE_GTK2 */
+  this->execBox->fill(start);
+  this->saveSettings = new CheckButton("Save Settings");
+  this->saveSettings->value = 1;
+  this->saveSettings->saveability();
+  this->execBox->fill(this->saveSettings);
+  this->verboseMode = new Menu("verbose mode", "no output", "error", "warning", "info", "lastItem");
+  this->verboseMode->setFlagName("verbose", "v", 0);
+  this->verboseMode->saveability();
+  this->execBox->fill(this->verboseMode);
+  this->alwaysShow = new CheckButton("Always Show this Menu");
+  this->alwaysShow->setFlagName("gui", "g", 0);
+  this->alwaysShow->saveability();
+  this->execBox->fill(this->alwaysShow);
+  this->quit = new Button("Quit");
+#ifdef HAVE_GTK2
+  this->quit->connectSignal("clicked", this, OrxonoxGuiExec::quitOrxonox);
+  //  Window::mainWindow->connectSignal("remove", this, OrxonoxGuiExec::quitOrxonox);
+  Window::mainWindow->connectSignal("destroy", this, OrxonoxGuiExec::quitOrxonox);
+#endif /* HAVE_GTK2 */
+  this->execBox->fill(this->quit);
+
+  this->execFrame->fill(this->execBox);
+}
+
+/**
+   \brief Destructs the Execution-stuff
+*/
+OrxonoxGuiExec::~OrxonoxGuiExec(void)
+{
+  if(this->configFile)
+    delete []this->configFile;
+}
+
+/**
+   \brief Return the Frame
+   \return Returns the Exec-frame
+*/
+Widget* OrxonoxGuiExec::getWidget(void)
+{
+  return execFrame;
+}
+
+/* FILE HANDLING */
+
+/**
+   \brief Sets the location of the configuration File.
+   \param filename the location of the configFile
+
+   \todo: memory allocation could be better.
+
+   The name will be parsed from ~/ to /home/[username] on unix and c:/Documents and Settings/username/Settings/ on Windows
+*/
+void OrxonoxGuiExec::setFilename(char* filename)
+{
+  char* buffer = (char*)malloc(2048*sizeof(char));
+  sprintf(buffer, "%s", filename);
+  if(!strncmp(buffer, "~/", 2))
+  {
+#ifdef __WIN32__
+    sprintf(configFile, "%s/%s", getenv("USERPROFILE"), buffer+2);
+#else
+    sprintf(configFile, "%s/%s", getenv("HOME"), buffer+2);
+#endif
+  }
+  else if(buffer)
+    strcpy(this->configFile, buffer);
+  free (buffer);
+}
+
+/**
+   \returns The name of the Configuration-File
+*/
+char* OrxonoxGuiExec::getConfigFile(void)
+{
+  return this->configFile;
+}
+
+/**
+   \brief checks if a option should be saved.
+   \return 1 if it should 0 if not/
+*/
+int OrxonoxGuiExec::shouldsave()
+{
+  return(static_cast<Option*>(this->saveSettings)->value);
+}
+
+/** 
+    \brief Saves the configuration-file to the Disk.\n
+    \param widget from which Widget on should be saved.
+
+    this Function only opens and closes the file, in between OrxonoxGuiExec::writeFileText(Widget* widget) will execute the real writing process.
+*/
+void OrxonoxGuiExec::writeToFile(Widget* widget)
+{
+  this->CONFIG_FILE = fopen(configFile, "w");
+  if(this->CONFIG_FILE)
+    this->writeFileText(widget, 0);
+  fclose(this->CONFIG_FILE);
+}
+
+/**
+   \brief Actually writes into the configuration file to the disk.
+   \param widget from which Widget on should be saved.
+   \param depth initially "0", and grows higher, while new Groups are bundeled.
+*/
+void OrxonoxGuiExec::writeFileText(Widget* widget, int depth)
+{
+  int counter = 0;
+  while(counter < depth &&((widget->isOption>0
+			      &&(static_cast<Option*>(widget)->isSaveable()))
+			     ||(widget->isOption<0
+				&& static_cast<Packer*>(widget)->getGroupName())))
+    {
+      fprintf(this->CONFIG_FILE, "  ", depth);
+      counter++;
+    }
+  
+  // check if it is a Packer, and if it is, check if it has a name and if there is something in it.
+  if(widget->isOption <0)
+    {
+      if(static_cast<Packer*>(widget)->getGroupName())
+	{
+	  fprintf(CONFIG_FILE, "[%s]\n", static_cast<Packer*>(widget)->getGroupName());
+	  this->writeFileText(static_cast<Packer*>(widget)->down, depth+1);
+	  fprintf(CONFIG_FILE, "\n");
+	}
+      else
+	{
+	  this->writeFileText(static_cast<Packer*>(widget)->down, depth);
+	}
+    } 
+  //  if(widget->isOption == 0)
+  //    printf("%s\n",widget->title);
+  if(widget->isOption >= 1)
+    if (static_cast<Option*>(widget)->isSaveable())
+      {
+	char Buffer[256];
+	char* space2under;
+	strcpy(Buffer, static_cast<Option*>(widget)->title);
+	if(strchr(Buffer, '_'))
+	  cout << "Warning Optionname" << Buffer << " is not Valid for Saving, because it includes an underscore" << endl;
+	while(space2under = strchr(Buffer, ' '))
+	  {
+	    space2under[0] = '_';
+	  }
+	if(widget->isOption <=3)
+	  fprintf(CONFIG_FILE, "%s = %d\n", Buffer, static_cast<Option*>(widget)->value);
+	else if(widget->isOption == 5)
+	  fprintf(CONFIG_FILE, "%s = %s\n", Buffer, static_cast<OptionLabel*>(widget)->cValue);
+      }
+
+  if(widget->next != NULL)
+    this->writeFileText(widget->next, depth);
+}
+
+/**
+   \brief Reads in Configuration Data.
+   \param widget from which Widget on should be saved.
+*/
+void OrxonoxGuiExec::readFromFile(Widget* widget)
+{
+  this->CONFIG_FILE = fopen(configFile, "r");
+  VarInfo varInfo;
+  if(this->CONFIG_FILE)
+    {
+      Widget* groupWidget = widget;
+      char Buffer[256] = "";
+      char Variable[256]= "";
+      char* Value;
+      while(fscanf(this->CONFIG_FILE, "%s", Buffer) != EOF)
+	{
+	  // group-search //
+	  if(!strncmp(Buffer, "[", 1))
+	    {
+	      if((groupWidget = locateGroup(widget, Buffer, 1))==NULL)
+		{
+		  cout << "!!There is no group called " << Buffer << " in this GUI.\n First best Widget will get the Infos assigned.\n Config-File will be updated in next Save\n";
+		  groupWidget = widget;
+		}
+	      else
+		PRINT(3)("Group %s located.\n", static_cast<Packer*>(groupWidget)->groupName);
+	    }
+	  // option-setting //
+	  if(!strcmp(Buffer, "="))
+	    {
+	      char* under2space;
+	      while(under2space = strchr(Variable, '_'))
+		{
+		  sprintf(under2space, " %s", under2space+1);
+		}
+	      
+	      fscanf(this->CONFIG_FILE, "%s", Buffer);
+	      varInfo.variableName = Variable;
+	      varInfo.variableValue = Buffer;
+	      groupWidget->walkThrough(this->readFileText, &varInfo, 0);
+	      sprintf(Variable, "");
+	    }
+	  sprintf(Variable, "%s", Buffer);
+	}
+      widget->walkThrough(widget->setOptions, 0);
+    }
+}
+
+/**
+   \brief Maps Confugurations to the Options.
+   \param widget which widget downwards
+   \param varInfo Information about the Variable to read
+*/
+void OrxonoxGuiExec::readFileText(Widget* widget, void* varInfo)
+{
+  VarInfo* info =(VarInfo*)varInfo;
+  if(widget->title && !strcmp(widget->title, info->variableName))
+    {
+      PRINT(3)("Located Option %s.\n", widget->title);
+      if(widget->isOption >= 1 && widget->isOption <= 3)
+	{
+	  static_cast<Option*>(widget)->value = atoi(info->variableValue);
+	  static_cast<Option*>(widget)->redraw(); //!< \todo change this to setValue.
+	}
+      else if(widget->isOption == 5)
+	static_cast<OptionLabel*>(widget)->setValue(info->variableValue);
+    }
+}
+
+/**
+   \brief Locates a Group.
+   \param widget The Widget from where to search from
+   \param groupName The GroupName for which to search.
+   \param depth The Depth of the search seen from the first widget we searched from.
+   \returns The Widget that holds the Group, or the NULL if the Group wasn't found.
+
+   \todo do this in gui-gtk.
+*/
+Widget* OrxonoxGuiExec::locateGroup(Widget* widget, char* groupName, int depth)
+{
+  Widget* tmp;
+
+  // removes the trailing and ending [ ].
+  if(!strncmp(groupName, "[", 1))
+    {
+      groupName = groupName+1;
+      groupName[strlen(groupName)-1] = '\0';
+    }
+
+  if(widget->isOption < 0)
+    {
+      if(static_cast<Packer*>(widget)->getGroupName() && !strcmp(groupName, static_cast<Packer*>(widget)->getGroupName()))
+	{
+	  return widget;
+	}
+      else
+	{
+	  if((tmp = locateGroup(static_cast<Packer*>(widget)->down, groupName, depth+1)) != NULL)
+	    return tmp;
+	}
+    } 
+  
+  if(widget->next != NULL && depth != 0)
+    {
+      if((tmp = locateGroup(widget->next, groupName, depth)) != NULL)
+	return tmp;
+    }
+  return NULL;
+}
+
+#ifdef HAVE_GTK2
+/**
+   \brief Starts ORXONOX.(not really implemented yet, but the function is there.\n
+   \param widget the widget that executed the start command
+   \param data additional data
+
+   This is a Signal and can be executed through Widget::signal_connect
+*/
+int OrxonoxGuiExec::startOrxonox(GtkWidget* widget, void* data)
+{
+  OrxonoxGuiExec* exec =(OrxonoxGuiExec*)data;
+  if(exec->shouldsave())
+    exec->writeToFile(Window::mainWindow);
+  cout << "Starting Orxonox" <<endl;
+  gtk_main_quit();
+  system("cd ..;./orxonox"); //!< \todo fix this. should execute orxonox for real(coded not over the shell)
+}
+
+/**
+   \brief Starts ORXONOX.(not really implemented yet, but the function is there.\n
+   \param widget the widget that executed the start command
+   \param data additional data
+
+   This is a Signal and can be executed through Widget::signal_connect
+*/
+int OrxonoxGuiExec::quitOrxonox(GtkWidget* widget, void* data)
+{
+  OrxonoxGuiExec* exec =(OrxonoxGuiExec*)data;
+  PRINT(3)( "Quitting Orxonox %p\n", exec);
+  if(exec->shouldsave())
+    exec->writeToFile(Window::mainWindow);
+  gtk_main_quit();
+}
+#else /* HAVE_GTK2 */
+/**
+   \brief Starts ORXONOX.(not really implemented yet, but the function is there.\n
+   \param widget the widget that executed the start command
+   \param data additional data
+*/
+int OrxonoxGuiExec::startOrxonox(void* widget, void* data)
+{
+  OrxonoxGuiExec* exec =(OrxonoxGuiExec*)data;
+  PRINT(3)("Starting Orxonox\n");
+  if(exec->shouldsave())
+    exec->writeToFile(Window::mainWindow);
+  system("cd ..;./orxonox"); //!< \todo fix this. should execute orxonox for real(coded not over the shell)
+}
+/**
+   \brief Quits ORXONOX.
+   \param widget the widget that executed the Quit command
+   \param data additional data
+
+   This is a Signal and can be executed through Widget::signal_connect
+*/
+int OrxonoxGuiExec::quitOrxonox(void* widget, void* data)
+{
+  OrxonoxGuiExec* exec =(OrxonoxGuiExec*)data;
+  PRINT(3)("Quiting Orxonox");
+  if(exec->shouldsave())
+    exec->writeToFile(Window::mainWindow);
+}
+
+#endif /* HAVE_GTK2 */
Index: /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_exec.h
===================================================================
--- /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_exec.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_exec.h	(revision 3498)
@@ -0,0 +1,67 @@
+/*!
+  \file orxonox_gui_exec.h
+  \brief File that holds the class that creates the execute-Options.
+*/
+
+#ifndef _ORXONOX_GUI_EXEC_H
+#define _ORXONOX_GUI_EXEC_H
+
+#include "orxonox_gui.h"
+#include <stdio.h>
+using namespace std;
+
+//! Class that creates the execute-Options.
+class OrxonoxGuiExec
+{
+ private:
+  Frame* execFrame;            //!< The Frame that holds the ExecutionOptions.
+  Box* execBox;                //!< The Box that holds the ExecutionOptions.
+  Button* start;               //!< The start Button of orxonox.
+  CheckButton* saveSettings;   //!< A CheckBox for if the Options should be saved.
+  Menu* verboseMode;           //!< A Menu for setting the verbose-Mode. \todo setting up a verbose-class.
+  CheckButton* alwaysShow;     //!< A CheckButton, for if orxonox should start with or without gui.
+  Button* quit;                //!< A Button to quit the Gui without starting orxonox.
+  char* configFile;            //!< The name of the .orxonox.conf(ig)-file.
+  FILE* CONFIG_FILE;           //!< Filehandler for reading and writing.
+  
+  //! A struct that holds informations about variables.
+  struct VarInfo
+  {
+    char* variableName;        //!< The Name of this variable;
+    char* variableValue;       //!< The Value this variable gets.
+  };
+
+ public:
+  OrxonoxGuiExec(void);
+  ~OrxonoxGuiExec(void);
+  
+  Widget* getWidget(void);
+  
+  void setFilename(char* filename);
+  char* getConfigFile(void);
+  int shouldsave(void);
+  void writeToFile(Widget* widget);
+  void writeFileText(Widget* widget, int depth);
+  void readFromFile(Widget* widget);
+  static void readFileText(Widget* widget, void* varInfo);
+  Widget* locateGroup(Widget* widget, char* groupName, int depth);
+
+#ifdef HAVE_GTK2
+  static int startOrxonox(GtkWidget *widget, void* data);
+  static int quitOrxonox(GtkWidget *widget, void* data);
+#else /* HAVE_GTK2 */
+  static int startOrxonox(void* widget, void* data);
+  static int quitOrxonox(void* widget, void* data);
+#endif /* HAVE_GTK2 */
+};
+
+//! A simple hashtable 
+struct HashTable
+{
+  char* name;           //!< name of the entry
+  char* value;          //!< value of the entry
+  HashTable* next;      //!< pointer to the next entry
+};
+
+
+#endif /* _ORXONOX_GUI_EXEC_H */
Index: /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_flags.cc
===================================================================
--- /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_flags.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_flags.cc	(revision 3498)
@@ -0,0 +1,106 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+
+*/
+
+#include "orxonox_gui_flags.h"
+
+/**
+   \brief Creates the Flags-Frame
+*/
+OrxonoxGuiFlags::OrxonoxGuiFlags(void)
+{
+  this->flagsFrame = new Frame("Orxonox-Startup-Flags:");
+  this->flagsBox = new Box('v');
+
+  this->flagsLabel = new Label();
+  this->flagsLabel->setSize(260,60);
+  this->flagsBox->fill(flagsLabel);
+  this->shortFlags = new CheckButton("shortFlags");
+  this->flagsBox->fill(shortFlags);
+
+  this->flagsFrame->fill(flagsBox);
+}
+
+/**
+   \brief Destructs the Flags-stuff
+*/
+OrxonoxGuiFlags::~OrxonoxGuiFlags(void)
+{
+  // nothing to do here
+}
+
+/**
+   \brief Function to return the Frame that holds the Flagtext.
+   \returns Frame that holds the Flagtext.
+*/
+Widget* OrxonoxGuiFlags::getWidget(void)
+{
+  return this->flagsFrame;
+}
+
+/**
+   \brief Sets the Flags from widget downwards.
+   \param widget the Widget from which on to scan for deeper Options and their settings.
+*/
+void OrxonoxGuiFlags::setTextFromFlags(Widget* widget)
+{
+  FlagInfo flagInfo;
+  flagInfo.shortFlags = this->shortFlags;
+  flagInfo.flagsLabel = this->flagsLabel;
+
+  this->flagsLabel->ereaseText();
+  this->flagsLabel->appendText("orxonox");
+  widget->walkThrough(OrxonoxGuiFlags::flagsText, &flagInfo, 0);
+  //  flagsLabel->setTitle(flagText);
+}
+
+/** 
+    \brief this actually sets the flagtext, and appends it to flagText
+    \param widget like OrxonoxGuiFlags::setTextFromFlags(widget)
+    \param flagInfo Information aboout the Flag that should be updated.
+*/
+void OrxonoxGuiFlags::flagsText(Widget* widget, void* flagInfo)
+{
+  FlagInfo* info =(FlagInfo*)flagInfo;
+  if(widget->isOption >= 1)
+    if (static_cast<Option*>(widget)->value != static_cast<Option*>(widget)->defaultValue )
+      {
+	if(info->shortFlags->isActive() && static_cast<Option*>(widget)->flagNameShort)
+	  {
+	    info->flagsLabel->appendText(" -");
+	    info->flagsLabel->appendText(static_cast<Option*>(widget)->flagNameShort);
+	  }
+	else if(!info->shortFlags->isActive() && static_cast<Option*>(widget)->flagName)
+	  {
+	    info->flagsLabel->appendText(" --");
+	    info->flagsLabel->appendText(static_cast<Option*>(widget)->flagName);
+	  }
+
+	if(static_cast<Option*>(widget)->isOption == 2)
+	  {
+	    info->flagsLabel->appendText("=");
+	    info->flagsLabel->appendInt(static_cast<Option*>(widget)->value);
+	  }
+      }
+}
Index: /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_flags.h
===================================================================
--- /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_flags.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_flags.h	(revision 3498)
@@ -0,0 +1,35 @@
+/*!
+  \file orxonox_gui_flags.h
+  \brief File that holds the class that creates the flags-Text.
+*/
+
+#ifndef _ORXONOX_GUI_FLAGS_H
+#define _ORXONOX_GUI_FLAGS_H
+
+#include "orxonox_gui.h"
+
+//! Class that creates the flags-Text.
+class OrxonoxGuiFlags
+{
+ private:
+  Frame* flagsFrame;          //!< The Frame that holds the flagsDisplay.
+  Box* flagsBox;              //!< The Box that holds the flagsDisplay.
+  CheckButton* shortFlags;    //!< CheckButton to change the display of short and long flags \todo show long if long not availible...
+  Label* flagsLabel;          //!< The Label of the Flags
+
+ public:
+  OrxonoxGuiFlags(void);
+  ~OrxonoxGuiFlags(void);
+
+  void setTextFromFlags(Widget* widget);
+  static void flagsText(Widget* widget, void* flagInfo);
+  
+  //! Struct that handles flag information.
+  struct FlagInfo
+  {
+    CheckButton* shortFlags;     //!< Button for the flag.
+    Label* flagsLabel;           //!< Label for the flag.
+  };
+  Widget* getWidget(void);
+};
+#endif /* _ORXONOX_GUI_FLAGS_H */
Index: /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_gtk.cc
===================================================================
--- /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_gtk.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_gtk.cc	(revision 3498)
@@ -0,0 +1,1951 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+
+*/
+
+
+#include <iostream>
+
+#include "orxonox_gui_gtk.h"
+
+
+using namespace std;
+
+// temporarily.
+#include "orxonox_gui_flags.h"
+extern Window* orxonoxGUI;
+extern OrxonoxGuiFlags* flags;
+
+/**
+   \brief Initializes the Guis GTK-stuff.
+   \param argc the argument count.
+   \param argv The Argument strings.
+*/
+bool initGUI(int argc, char *argv[])
+{
+#ifdef HAVE_GTK2
+#ifdef HAVE_GTHREAD
+  PRINTF(3)("Initializing the ThreadSystem of the GUI\n");
+  g_thread_init(NULL);
+  gdk_threads_init();
+#endif /* HAVE_GTHREAD */
+  gtk_init(&argc, &argv);
+  gtk_rc_parse( "rc" );
+#endif /* HAVE_GTK2 */
+}
+
+
+/**
+   \brief enters the GUI's main-loop
+*/
+bool mainloopGUI(void)
+{
+#ifdef HAVE_GTK2
+  gdk_threads_enter();
+  gtk_main();
+  gdk_threads_leave();
+  delete Window::mainWindow;
+#else /* HAVE_GTK2 */
+  char boolAns = 'y';
+  char ans[10]; 
+  while(true)
+    {
+      PRINT(0)(" Listing all the Orxonox Options: \n");
+      PRINT(0)("  #############################\n");
+      Window::mainWindow->walkThrough(Widget::listOptionsAndGroups, 1);
+      
+      PRINT(0)("\nDo you want change any of the above values now? [Yn] ");
+      cin >>boolAns ;
+      if (boolAns =='n' || boolAns=='N')
+	break;
+      
+      PRINT(0)("\n Listing all groups\n");
+      PRINT(0)("  #################\n");
+      int groupCount = 0;
+      Window::mainWindow->walkThrough(Widget::listGroups, &groupCount, 1);
+      
+      PRINT(0)("\nIn which Group? [1-%d] ", groupCount);
+      Packer* group;
+      while(true)
+	{
+	  cin >> ans;
+	  int ansIp = atoi(ans);
+	  if (ansIp <= groupCount)
+	    {
+	      group = static_cast<Packer*>(Window::mainWindow->findGroupByNumber(&ansIp, 1));
+	      break;
+	    }
+	  else
+	    PRINT(0)("\nChoose a smaler Number please: [1-%d] ", groupCount);
+	}
+      PRINT(0)("\n\nGroup: [%s]\n\n", group->groupName);
+      int optionCount = 0;
+      group->walkThrough(Widget::listOptions, &optionCount, 0);
+      PRINT(0)("\nWhich Option? [1-%d] ", optionCount);
+      Option* option;
+      while(true)
+	{
+	  cin >> ans;
+	  int ansIp = atoi(ans);
+	  if (ansIp <= groupCount)
+	    {
+	      option = static_cast<Option*>(group->findOptionByNumber(&ansIp, 0));
+	      break;
+	    }
+	  else
+	    PRINT(0)("\nChoose a smaler Number please: [1-%d] ", optionCount);
+	}
+      PRINT(0)("\n\n:: %s ::\n", option->title);
+      option->changeOption();
+      
+      // here follows the rest.... this will be nasty.
+      //! \todo move this into the gui-gtk-file
+      //! \todo finish it.
+    }
+#endif /* HAVE_GTK2 */
+  
+}
+
+
+//////////////////////////////
+/// DEFINING WIDGET-CLASES ///
+//////////////////////////////
+
+/* WIDGET */
+
+/**
+   \brief deletes any given Widget
+   This is still pretty crappy.
+*/
+Widget::~Widget(void)
+{
+  this->destroy();
+}
+
+/**
+   \brief Initializes a widget.
+   Initializes the next Pointer and the other Widget-specific Defaults.
+*/
+void Widget::init(void)
+{
+  next = NULL;
+  this->title = NULL;
+  return;
+}
+
+/**
+   \brief Destroys a Widget 
+*/
+void Widget::destroy(void)
+{
+  if (this->title)
+    {
+      delete []this->title;
+    }
+  
+  PRINTF(4)("deleting the Widget part.\n");
+
+  PRINTF(4)("deleting recursively\n");
+
+  // deleting next item if existent
+  if (this->next)
+    delete this->next;
+  this->next = NULL;
+
+  //!  \todo not hiding widget, deleting.
+  //  this->hide();
+  //  delete this->widget;
+}
+
+/**
+   \brief makes the widget visible.
+*/
+void Widget::show(void)
+{
+#ifdef HAVE_GTK2
+  gtk_widget_show(this->widget);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief hides the widget.
+*/
+void Widget::hide(void)
+{
+#ifdef HAVE_GTK2
+  gtk_widget_hide(this->widget);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief Sets the resolution of a specific widget to the given size.
+   \param width the width of the widget to set.
+   \param height the height of the widget to set.
+*/
+void Widget::setSize(int width, int height)
+{
+#ifdef HAVE_GTK2
+  gtk_widget_set_usize(this->widget, width, height);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief searches through widgets for a Name.
+*/
+Widget* Widget::findWidgetByName(char* name, unsigned int depth)
+{
+
+  if (this->title && !strcmp(this->title, name))
+    return this;
+
+  if (this->isOption < 0 && static_cast<Packer*>(this)->down)
+    {
+      Widget* tmp = static_cast<Packer*>(this)->down->findWidgetByName(name, depth+1);
+      if (tmp)
+	return tmp;
+    }
+  
+  if (depth>0 && this->next)
+    return this->next->findWidgetByName(name, depth);
+
+  return NULL;
+}
+
+/**
+   \brief Moves through all the Widgets downwards from this and executes the function on them.
+   \param function must be of type void and takes a Widget* as an Input. 
+   \param depth the current depth. if > 0 then the next Widget will also be walked through.
+*/
+void Widget::walkThrough(void(*function)(Widget*), unsigned int depth)
+{
+  function(this);
+  if (this->isOption < 0)
+    {
+      static_cast<Packer*>(this)->down->walkThrough(function, depth+1);
+    } 
+
+  if (this->next && depth != 0)
+    this->next->walkThrough(function, depth);
+}
+
+/**
+   \brief Moves through all the Widgets downwards from this and executes the function on them.
+   \param function must be of type void and takes a Widget* as an Input.
+   \param data Additional Data you want to pass to the function.
+   \param depth the current depth. if > 0 then the next Widget will also be walked through.
+*/
+void Widget::walkThrough(void(*function)(Widget*, void*), void* data, unsigned int depth)
+{
+  function(this, data);
+  if (this->isOption < 0)
+    {
+      static_cast<Packer*>(this)->down->walkThrough(function, data, depth+1);
+    }
+  if (this->next && depth != 0)
+    this->next->walkThrough(function, data, depth);
+}
+
+/** 
+    \brief This is for listing the options of "widget"
+    \param widget specifies the widget that should be listed
+*/
+void Widget::listOptionsAndGroups(Widget* widget)
+{
+  if (widget->isOption < 0 && static_cast<Packer*>(widget)->groupName)
+    cout << "[" << static_cast<Packer*>(widget)->groupName << "]\n";
+  if (widget->isOption >= 1 && widget->isOption <= 3)
+    cout << "  " << static_cast<Option*>(widget)->title <<" is : " << static_cast<Option*>(widget)->value <<endl;
+  else if (widget->isOption == 5)
+    cout << "  " << static_cast<Option*>(widget)->title <<" is : " << static_cast<OptionLabel*>(widget)->cValue <<endl;
+}
+
+/** 
+    \brief This is for listing the options of "widget"
+    \param widget specifies the widget that should be listed
+*/
+void Widget::listOptions(Widget* widget)
+{
+  if (widget->isOption >= 1 && widget->isOption <= 3)
+    cout << "  " << static_cast<Option*>(widget)->title <<" is : " << static_cast<Option*>(widget)->value <<endl;
+  else if (widget->isOption == 5)
+    cout << "  " << static_cast<Option*>(widget)->title <<" is : " << static_cast<OptionLabel*>(widget)->cValue <<endl;
+}
+
+/** 
+    \brief This is for listing the options of "widget"
+    \param widget specifies the widget that should be listed
+    \param data A Counter, that always knows how many Options have been found yet.
+*/
+void Widget::listOptions(Widget* widget, void* data)
+{
+  
+  if (widget->isOption >= 1 && widget->isOption <= 3)
+    {
+      int* count =(int*)data;
+      *count = *count +1;
+      cout << *count << ": " << static_cast<Option*>(widget)->title <<" is : " << static_cast<Option*>(widget)->value <<endl;
+    }
+  else if (widget->isOption == 5)
+    {
+      int* count =(int*)data;
+      *count = *count +1;
+      cout << *count << ": " << static_cast<Option*>(widget)->title <<" is : " << static_cast<OptionLabel*>(widget)->cValue <<endl;
+    }
+}
+
+/** 
+    \brief Finds an Option by a given number(the n'th option found away from this Widget)
+    \param number The Count of options to wait(by reference)
+    \param depth The depth of the sarch. if 0 it will not search next pointer
+    
+    \todo should return Option* would be much sexier.
+*/
+Widget* Widget::findOptionByNumber(int* number, unsigned int depth)
+{
+  if (isOption > 0)
+    {
+      --*number;
+      if (*number <= 0)
+	{
+	  return this;
+	}
+    }
+  if (this->isOption < 0 && static_cast<Packer*>(this)->down)
+    {
+      Widget* tmp = static_cast<Packer*>(this)->down->findOptionByNumber(number, depth+1);
+      if (tmp)
+	return tmp;
+    }
+  if (depth>0 && this->next)
+    return this->next->findOptionByNumber(number, depth);
+
+  return NULL;
+}
+
+/** 
+    \brief This is for listing the groups of "widget"
+    \param widget specifies the widget that should be listed
+*/
+void Widget::listGroups(Widget* widget)
+{
+  if (widget->isOption < 0 && static_cast<Packer*>(widget)->groupName)
+    cout << "[" << static_cast<Packer*>(widget)->groupName << "]\n";
+}
+
+/** 
+    \brief This is for listing the Groups of "widget". It also displays the n'th number found.
+    \param widget specifies the widget that should be listed
+    \param data the Counter, that will show the number(this function will raise it by one if a Group is fount.
+*/
+void Widget::listGroups(Widget* widget, void* data)
+{
+  if (widget->isOption < 0 && static_cast<Packer*>(widget)->groupName)
+    {
+      int* count =(int*)data;
+      *count = *count +1;
+      cout << *count <<": [" << static_cast<Packer*>(widget)->groupName << "]\n";
+    }
+}
+
+/** 
+    \brief Finds a Group by a given number(the n'th Group found away from this Widget)
+    \param number The Count of options to wait(by reference)
+    \param depth The depth of the sarch. if 0 it will not search next pointer
+*/
+Widget* Widget::findGroupByNumber(int* number, unsigned int depth)
+{
+  if (isOption < 0 && static_cast<Packer*>(this)->groupName)
+    {
+      --*number;
+      if (*number <= 0)
+	{
+	  return this;
+	}
+    }
+  if (this->isOption < 0 && static_cast<Packer*>(this)->down)
+    {
+      Widget* tmp = static_cast<Packer*>(this)->down->findGroupByNumber(number, depth+1);
+      if (tmp)
+	return tmp;
+    }
+  if (depth>0 && this->next)
+    return this->next->findGroupByNumber(number, depth);
+
+  return NULL;
+}
+ 
+/** 
+    \brief This is for setting the option of "widget"
+    \param widget specifies the widget that should be set.
+*/
+void Widget::setOptions(Widget* widget)
+{
+  if (widget->isOption >= 1)
+    static_cast<Option*>(widget)->redraw();
+}
+
+/**
+   \brief Walks through all the Flags given at startuptime.
+*/
+void Widget::flagCheck(Widget* widget, void* flagName)
+{
+  if (widget->isOption>=1)
+    {      
+      Option* option =(Option*)widget;
+      char* name =(char*)flagName;
+      char* value = NULL;
+      bool found = false;
+      // check if long flag matches
+      if ((option->flagName && strlen(name)>2 && !strncmp(name+2, option->flagName, strlen(option->flagName)) &&(name[strlen(option->flagName)+2] == '\0' || name[strlen(option->flagName)+2] == '=') ))
+	{
+	  found = true;
+	  if (name[strlen(option->flagName)+2] == '=')
+	    {
+	      value = name+strlen(option->flagName)+3;
+	    }
+	}
+      else if (option->flagNameShort && strlen(name)>1 && !strncmp(name+1, option->flagNameShort, strlen(option->flagNameShort))&&(name[strlen(option->flagNameShort)+1] == '\0' || name[strlen(option->flagNameShort)+1] == '=')) // check if short flag matches
+	{
+	  found = true;
+	  if (name[strlen(option->flagNameShort)+1] == '=')
+	    {
+	      value = name+strlen(option->flagNameShort)+2;
+	    }	  
+	}
+
+      if (found)
+	{
+	  PRINT(3)("found matching Flag %s\n", name);
+	  if (value)
+	    {
+	      PRINT(3)("with Value %s\n", value);
+	      option->value = atoi(value);
+	    }
+	  else
+	    {
+	      option->value = !option->defaultValue;
+	    }
+	  option->redraw();
+	}
+
+    }
+}
+
+#ifdef HAVE_GTK2
+/** 
+    \brief Connect any signal to any given Sub-widget
+*/
+gulong Widget::connectSignal(char* event, gint(*signal)(GtkWidget*, GdkEvent*, void *))
+{
+  return g_signal_connect(G_OBJECT(this->widget), event, G_CALLBACK(signal), NULL);
+}
+
+/**
+   \brief Connect a signal with additionally passing the whole Object
+*/
+gulong Widget::connectSignal(char* event, gint(*signal)( GtkWidget*, Widget *))
+{
+  return g_signal_connect(G_OBJECT(this->widget), event, G_CALLBACK(signal), this);
+}
+
+/**
+   \brief Connect a signal with additionally passing a whole external Object
+*/
+gulong Widget::connectSignal(char* event, void* extObj, gint(*signal)(GtkWidget*, GdkEvent*, void *))
+{
+  return g_signal_connect(G_OBJECT(this->widget), event, G_CALLBACK(signal), extObj);
+}
+
+/**
+   \brief Connect a signal with additionally passing a whole external Object
+*/
+gulong Widget::connectSignal(char* event, void* extObj, gint(*signal)(GtkWidget*, void *))
+{
+  return g_signal_connect(G_OBJECT(this->widget), event, G_CALLBACK(signal), extObj);
+}
+
+/**
+   \brief Connect a signal with additionally passing a whole external Object
+*/
+gulong Widget::connectSignal(char* event, void* extObj, gint(*signal)(GtkWidget*, GdkEventKey*, void *))
+{
+  return g_signal_connect(G_OBJECT(this->widget), event, G_CALLBACK(signal), extObj);
+}
+
+void Widget::disconnectSignal(gulong signalID)
+{
+  g_signal_handler_disconnect(G_OBJECT(this->widget), signalID);
+}
+
+/**
+   \brief Signal that does absolutely nothing
+   \param widget The widget that initiated the Signal
+   \param event The event-type.
+   \param nothing nothin.
+*/
+gint Widget::doNothingSignal(GtkWidget *widget, GdkEvent* event, void* nothing)
+{
+}
+#endif /* HAVE_GTK2 */
+
+//void deleteWidget(Widget* lastWidget)
+
+
+/* PACKERS */
+
+/**
+   \brief Initializes a Packer.
+
+   Sets the down-pinter to NULL and other PackerSpecific-values to their defaults.
+*/
+void Packer::init(void)
+{
+  this->down = NULL;
+  this->groupName = NULL;
+
+
+  static_cast<Widget*>(this)->init();
+  return;
+}
+
+/**
+   \brief Destroys a Packer.
+*/
+void Packer::destroy(void)
+{ 
+  PRINTF(4)("deleting the Packer part.\n");
+  
+  if (this->groupName)
+    delete []this->groupName;
+
+  //deleting recursively.
+  if (this->down)
+    delete this->down;
+  this->down = NULL;
+
+  static_cast<Widget*>(this)->destroy();
+}
+
+/**
+   \brief Sets the group name under which all the lower widgets of this will be saved.
+   \param name The name of the group.
+*/
+void Packer::setGroupName(char* name)
+{
+  if (this->groupName)
+    delete []this->groupName;
+  this->groupName = new char[strlen(name)+1];
+  strcpy(this->groupName, name);
+}
+
+/**
+   \brief Retrieves the group name under which all the lower widgets of this will be saved.
+   \returns name The name of the group.
+*/
+char* Packer::getGroupName(void)
+{
+  return this->groupName;
+}
+
+/* CONTAINERS */
+
+/**
+   \brief Initializes a Container.
+
+   sets the Container-Specific defaults.
+*/
+void Container::init(void)
+{
+  this->isOption = -1;
+
+  static_cast<Packer*>(this)->init();
+
+  return;
+}
+
+/**
+   \brief Destroys a Container.
+*/
+void Container::destroy(void)
+{ 
+  PRINTF(4)("deleting the Container part.\n");
+
+  static_cast<Packer*>(this)->destroy();
+}
+
+/**
+   \briefFills a Container with lowerWidget.
+   \param lowerWidget the Widget that should be filled into the Container.
+
+   It does this by filling up the down pointer only if down points to NULL.
+*/
+void Container::fill(Widget *lowerWidget)
+{
+  if (this->down == NULL)
+    {
+#ifdef HAVE_GTK2
+      gtk_container_add(GTK_CONTAINER(this->widget), lowerWidget->widget);
+#endif /* HAVE_GTK2 */
+      this->down = lowerWidget;
+    }
+  else
+    PRINTF(1)("!!error!! You try to put more than one Widget into a Container. \nNot including this item.\nThis is only possible with Boxes.\n");
+}
+
+// gtk_container_set_border_width(GTK_CONTAINER(widget), 5);
+
+/* WINDOW */
+
+Window* Window::mainWindow = NULL;
+
+/**
+   \brief Adds a new Window Windows to the List of Windows.
+   \param windowToAdd The Windows that should be added to the List
+   \todo this instead of windowToAdd(possibly)
+*/
+void Window::addWindow(Window* windowToAdd)
+{
+  if (!mainWindow)
+    {
+      mainWindow = windowToAdd;
+      return;
+    }
+
+  Widget* tmpWindow = mainWindow;
+  while(tmpWindow->next)
+    tmpWindow = tmpWindow->next;
+  tmpWindow->next = windowToAdd;
+  
+  return;
+}
+      
+
+/**
+   \brief Creating a new Window without a Name
+*/
+Window::Window(void)
+{
+  this->init();
+}
+
+/**
+   \brief Creating a Window with a name
+   \param windowName the name the window should get.
+*/
+
+Window::Window(char* windowName)
+{
+  this->init();
+  this->setTitle(windowName);
+}
+
+/**
+   \brief Destructs a Window.
+*/
+Window::~Window(void)
+{
+  this->destroy();
+}
+
+/**
+   \brief initializes a new Window
+*/
+void Window::init(void)
+{
+  if (!mainWindow)
+    mainWindow = this;
+  
+  isOpen = false;
+
+  static_cast<Container*>(this)->init();
+
+#ifdef HAVE_GTK2
+  widget = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+  gtk_window_set_policy(GTK_WINDOW(widget), TRUE, TRUE, TRUE);
+#if !defined(__WIN32__)
+  //  gtk_window_set_decorated(GTK_WINDOW(widget), FALSE);
+#endif 
+  gtk_container_set_border_width(GTK_CONTAINER(widget), 3);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief Destroys a Window.
+*/
+void Window::destroy(void)
+{ 
+  if (this->title)
+    PRINTF(3)("deleting the Window: %s\n", this->title);
+  else 
+    PRINTF(3)("deleting the Window.\n");
+  //  this->hide();
+  static_cast<Container*>(this)->destroy();
+  
+}
+
+/**
+   \brief Shows all Widgets that are included within this->widget.
+*/
+void Window::showall(void)
+{
+  if (!this->isOpen)
+    {
+      //      printf("showall\n");
+#ifdef HAVE_GTK2
+      gtk_widget_show_all(this->widget);
+#endif /* HAVE_GTK2 */ 
+     this->isOpen = true;
+    }
+  else
+    {
+      //      printf("showone\n");
+#ifdef HAVE_GTK2
+      gtk_widget_show(this->widget);
+#endif /* HAVE_GTK2 */
+    }
+}
+
+/**
+   \brief Set The Window-title to title
+   \param title title the Window should get.
+*/
+void Window::setTitle(char* title)
+{
+  if (this->title)
+    delete []this->title;
+  this->title = new char[strlen(title)+1];
+  strcpy(this->title, title);
+#ifdef HAVE_GTK2
+  gtk_window_set_title(GTK_WINDOW(widget), title);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief opens up a Window and fixes the Focus to it
+*/
+void Window::open(void)
+{
+  if (this != mainWindow)
+    {
+      isOpen = true;
+#ifdef HAVE_GTK2
+      gtk_widget_show_all(this->widget);
+      gtk_grab_add(this->widget);
+#endif /* HAVE_GTK2 */
+    }
+}
+
+/**
+   \brief closes up a Window and removes the Focus from it
+*/
+void Window::close(void)
+{
+  if (this != mainWindow)
+    {
+      this->isOpen = false;
+#ifdef HAVE_GTK2
+      gtk_grab_remove(this->widget);
+      gtk_widget_hide(this->widget);
+#endif /* HAVE_GTK2 */
+    }
+}
+
+#ifdef HAVE_GTK2
+/**
+   \brief opens up a window(not topmost Window).
+   this is the Signal that does it. !!SIGNALS ARE STATIC!!
+   \param widget the widget that did it.
+   \param event the event that did it.
+   \param window the Window that should be opened
+*/
+gint Window::windowOpen(GtkWidget *widget, GdkEvent* event, void* window)
+{
+  static_cast<Window*>(window)->open();
+}
+
+/**
+   \brief closes a window(not topmost Window).
+   this is the Signal that does it. !!SIGNALS ARE STATIC!!
+   \param widget the widget that did it!
+   \param event the event that did it!
+   \param window the Window that should be closed
+*/
+gint Window::windowClose(GtkWidget *widget, GdkEvent* event, void* window)
+{
+  static_cast<Window*>(window)->close();
+}
+
+#endif /* HAVE_GTK2 */
+
+
+/* FRAME */
+
+/** 
+    \brief Creates a new Frame without a name
+*/
+Frame::Frame(void)
+{
+  this->init();
+}
+
+/**
+   \brief Creates a new Frame with name title
+*/
+Frame::Frame(char* title)
+{
+  this->init();
+  this->setTitle(title);
+}
+
+/**
+   \brief destrcucts a Frame
+*/
+Frame::~Frame(void)
+{
+  this->destroy();
+}
+
+/** 
+    \brief Initializes a new Frame with default settings
+*/
+void Frame::init(void)
+{
+  static_cast<Container*>(this)->init();
+
+#ifdef HAVE_GTK2
+  this->widget = gtk_frame_new("");
+  gtk_container_set_border_width(GTK_CONTAINER(this->widget), 3);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief Destroys a Frame.
+*/
+void Frame::destroy(void)
+{ 
+  if (this->title)
+    PRINTF(3)("deleting the Frame: %s\n", this->title);
+  else 
+    PRINTF(3)("deleting the Frame.\n");
+
+   static_cast<Container*>(this)->destroy();
+}
+
+/**
+   \brief Sets the Frames name to title
+   \param title The title the Frame should get.
+*/
+void Frame::setTitle(char* title)
+{
+  if (this->title)
+    delete []this->title;
+  this->title = new char[strlen(title)+1];
+  strcpy(this->title, title);
+#ifdef HAVE_GTK2
+  gtk_frame_set_label(GTK_FRAME(widget), title);
+#endif /* HAVE_GTK2 */
+}
+
+// EVENTBOX //
+
+/**
+   \brief Creates a new EventBox with default settings.
+*/
+EventBox::EventBox(void)
+{
+  this->init();
+}
+
+/**
+   \brief Creates a new EventBox with name title
+   \param title title the Eventbox should get(only data-structure-internal)
+*/
+EventBox::EventBox(char* title)
+{
+  this->init();
+  this->setTitle(title);
+}
+
+/**
+   \brief destructs an EventBox.
+*/
+EventBox::~EventBox(void)
+{
+  this->destroy();
+
+}
+
+/**
+   \brief Initializes a new EventBox
+*/
+void EventBox::init(void)
+{
+  this->isOption = -1;
+
+  static_cast<Container*>(this)->init();
+
+#ifdef HAVE_GTK2
+  this->widget = gtk_event_box_new();
+  gtk_container_set_border_width(GTK_CONTAINER(this->widget), 3);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief Destroys an EventBox.
+*/
+void EventBox::destroy(void)
+{ 
+  if (this->title)
+    PRINTF(3)("deleting the EventBox: %s\n", this->title);
+  else 
+    PRINTF(3)("deleting the EventBox.\n");
+
+  static_cast<Container*>(this)->destroy();
+}
+
+/**
+   \brief Sets the Title of the EventBox(not implemented)
+   \param title Name the EventBox should get(only datastructure-internal).
+*/
+void EventBox::setTitle(char* title)
+{
+  if (this->title)
+    delete []this->title;
+  this->title = new char[strlen(title)+1];
+  strcpy(this->title, title);
+}
+
+/* BOX */
+
+/**
+   \brief Creates a new horizontal Box
+*/
+Box::Box(void)
+{
+  this->init('h');
+}
+
+/**
+   \brief Creates a new Box of type boxtype
+   \param boxtype if 'v' the Box will be vertically, if 'h' the Box will be horizontally
+*/
+Box::Box(char boxtype)
+{
+  this->init(boxtype);
+}
+
+/**
+   \brief destructs a Box.
+*/
+Box::~Box(void)
+{
+  this->destroy();
+}
+
+/**
+   \brief Initializes a new Box with type boxtype
+   \param boxtype see Box(char boxtype)
+*/
+void Box::init(char boxtype)
+{
+  this->isOption = -2;
+
+  static_cast<Packer*>(this)->init();
+#ifdef HAVE_GTK2
+  if (boxtype == 'v')
+    {
+      this->widget = gtk_vbox_new(FALSE, 0);
+    }
+  else
+    {
+      this->widget = gtk_hbox_new(FALSE, 0);
+    }
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief Destroys a Box.
+*/
+void Box::destroy(void)
+{ 
+  if (this->title)
+    PRINTF(3)("deleting the Box: %s\n", this->title);
+  else 
+    PRINTF(3)("deleting the Box.\n");
+
+  static_cast<Packer*>(this)->destroy();
+}
+
+/** 
+    \brief Fills a box with a given Widget.
+    \param lowerWidget the next Widget that should be appendet to this Box
+
+    It does this by apending the first one to its down-pointer and all its following ones to the preceding next-pointer. The last one will receive a NULL pointer as Next
+*/
+void Box::fill(Widget* lowerWidget)
+{
+#ifdef HAVE_GTK2
+  gtk_box_pack_start(GTK_BOX(this->widget), lowerWidget->widget, TRUE, TRUE, 0);
+#endif /* HAVE_GTK2 */
+  if (this->down == NULL)
+    this->down = lowerWidget;
+  else
+    {
+      Widget* tmp;
+      tmp = this->down;
+      while(tmp->next != NULL)
+	{
+	  tmp = tmp->next;
+	}
+      tmp->next = lowerWidget;
+    }
+}
+
+/**
+   \brief Sets the Title of a Box.
+   \param title the new Title to set.
+*/
+void Box::setTitle(char* title)
+{
+  if (this->title)
+    delete []this->title;
+  this->title = new char[strlen(title)+1];
+  strcpy(this->title, title);
+}
+
+/* OPTION */
+
+/**
+   \brief Initializes a new Option.
+   sets all Option-Specific-Values to their defaults.
+*/
+void Option::init(void)
+{
+  this->value = 0;
+  this->flagName = NULL;
+  this->flagNameShort = NULL;
+  this->saveable = false;
+  this->defaultValue = 0;
+
+  static_cast<Widget*>(this)->init();
+
+  return;
+}
+
+/**
+   \brief Destroys an Option.
+*/
+void Option::destroy(void)
+{ 
+  PRINTF(4)("deleting the Option Part.\n");
+  if (this->flagName)
+    delete []this->flagName;
+  if (this->flagNameShort)
+    delete []this->flagNameShort;
+
+  static_cast<Widget*>(this)->destroy();
+}
+
+/**
+   \brief This sets The FlagName of an Option and defines its default Values
+   !! Options will be saved if flagname is different from NULL !!
+   \param flagname the Name that will be displayed in the output
+   \param defaultvalue the default Value for this Option(see definition of defaultvalue
+*/
+void Option::setFlagName(char* flagname, int defaultvalue)
+{
+  if (this->flagName)
+    delete this->flagName;
+  this->flagName = new char [strlen(flagname)+1];
+  strcpy(this->flagName, flagname);
+  this->defaultValue = defaultvalue;
+
+  //  cout << "Set Flagname of " << this->title << " to " << flagname << endl;
+}
+
+/** 
+    \brief see Option::setFlagName(char* flagname, int defaultvalue)
+    \param flagname the Name that will be displayed in the output
+    \param defaultvalue the default Value for this Option(see definition of defaultvalue
+    \param flagnameshort a short flagname to be displayed in the output
+*/
+void Option::setFlagName(char* flagname, char* flagnameshort,  int defaultvalue)
+{
+  if (this->flagName)
+    delete []this->flagName;
+  this->flagName = new char [strlen(flagname)+1];
+  strcpy(this->flagName, flagname);
+
+  if (this->flagNameShort)
+    delete []this->flagNameShort;
+  this->flagNameShort = new char [strlen(flagnameshort)+1];
+  strcpy(this->flagNameShort, flagnameshort);
+  this->defaultValue = defaultvalue;
+  //  cout << "Set Flagname of " << this->title << " to " << flagname << endl;
+}
+
+/**
+   \brief Sets the saveable-state of the option to true.
+*/
+void Option::saveability(void)
+{
+  this->saveable = true;
+}
+
+/**
+   \brief Sets the saveable-state of the option.
+   \param isSaveable the saveable-state to set.
+*/
+void Option::saveability(bool isSaveable)
+{
+  this->saveable = isSaveable;
+}
+
+/**
+   \returns The saveable-state.
+*/
+bool Option::isSaveable(void)
+{
+  return this->saveable;
+}
+
+#ifdef HAVE_GTK2
+/** 
+    \brief Signal OptionChange writes the Value from the Slider to its Object-Database.
+    \param widget The widget(Slider) that has a changed Value
+    \param slider the Slider-Object that should receive the change.
+*/
+gint Option::OptionChange(GtkWidget *widget, Widget* option)
+{
+  static_cast<Option*>(option)->changeOption();
+  flags->setTextFromFlags(Window::mainWindow);  //// must be different !!!
+}
+#endif /* HAVE_GTK2 */
+
+
+/* BUTTON */
+
+/**
+   \brief Creates a new Button with a buttonname
+   \param buttonname sets the Name of the Button
+*/
+Button::Button(char* buttonname)
+{
+  this->init();
+  this->setTitle(buttonname);
+}
+
+/**
+   \brief destructs a Button.
+*/
+Button::~Button(void)
+{
+  this->destroy();
+}
+
+/**
+   \brief Initializes a new Button
+*/
+void Button::init(void)
+{
+  isOption = 0;
+
+  static_cast<Option*>(this)->init();
+
+#ifdef HAVE_GTK2
+  widget = gtk_button_new_with_label("");
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief Destroys a Button.
+*/
+void Button::destroy(void)
+{ 
+  if (this->title)
+    PRINTF(3)("deleting the Label: %s\n", this->title);
+  else 
+    PRINTF(3)("deleting the Label.\n");
+
+  static_cast<Option*>(this)->destroy();
+}
+
+/**
+   \brief Sets a new name to the Button
+   \param title The name the Button should get
+*/
+void Button::setTitle(char *title)
+{
+  if (this->title)
+    delete []this->title;
+  this->title = new char[strlen(title)+1];
+  strcpy(this->title, title);
+#ifdef HAVE_GTK2
+  gtk_button_set_label(GTK_BUTTON(widget), title);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief redraws the Button
+   not implemented yet
+*/
+void Button::redraw(void)
+{
+}
+
+/**
+   \brief Button can not be changed, optionChange is empty)
+
+   \todo Actions for non-GTK-mode
+*/
+void Button::changeOption(void)
+{
+  // This will possibly be used for ACTIONS !
+}
+
+/* CHECKBUTTON */
+
+/**
+   \brief Creates a new CheckButton with an ame 
+   \param buttonname The name the CheckButton should display.
+*/
+CheckButton::CheckButton(char* buttonname)
+{
+  this->init();
+  this->setTitle(buttonname);
+
+#ifdef HAVE_GTK2
+  this->connectSignal("clicked", this->OptionChange);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief destructs a CheckButton.
+*/
+CheckButton::~CheckButton(void)
+{
+  this->destroy();
+}
+
+/**
+   \brief Initialize a new CheckButton with default settings
+*/
+void CheckButton::init(void)
+{
+  this->isOption = 1;
+
+  static_cast<Option*>(this)->init();
+
+#ifdef HAVE_GTK2
+  this->widget = gtk_check_button_new_with_label("");
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief Destroys a CheckButton.
+*/
+void CheckButton::destroy(void)
+{ 
+  if (this->title)
+    PRINTF(3)("deleting the CheckButton: %s\n", this->title);
+  else 
+    PRINTF(3)("deleting the CheckButton.\n");
+
+  static_cast<Option*>(this)->destroy();
+}
+
+/**
+   \brief Sets a new Title to a CheckButton
+   \param title The new Name the CheckButton should display.
+*/
+void CheckButton::setTitle(char* title)
+{
+  if (this->title)
+    delete []this->title;
+  this->title = new char[strlen(title)+1];
+  strcpy(this->title, title);
+#ifdef HAVE_GTK2
+  gtk_button_set_label(GTK_BUTTON(widget), title);
+#endif /* HAVE_GTK2 */
+}
+
+bool CheckButton::isActive(void)
+{
+#ifdef HAVE_GTK2
+  return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief Changed the Option, call this Function
+*/
+void CheckButton::changeOption(void)
+{
+#ifdef HAVE_GTK2
+  this->value =(int)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(this->widget));
+#else /* HAVE_GTK2 */
+  char tmpChar[20];
+  cout << "\nPlease give me a new value for " << this->title << " [0,1](defualt:" << this->defaultValue << "): ";
+  cin >> tmpChar;
+
+  if ((this->value = atoi(tmpChar))=!0)
+    this->value = 1;
+#endif /* HAVE_GTK2 */
+  cout << this->title << " set to: " << this->value << endl;
+}
+
+
+/**
+   \brief Redraws the CheckButton(if option has changed).
+   Example: if new settings are loaded the Button must be redrawn for the GUI to display that Change
+*/
+void CheckButton::redraw(void)
+{
+#ifdef HAVE_GTK2
+  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(this->widget), value);
+#endif /* HAVE_GTK2 */
+}
+
+/* SLIDER */
+
+/**
+   \brief Creates a new Slider
+   \param slidername The data-structure-name of the slider.
+   \param start The minimal Value of the slider.
+   \param end The maximal Value of the slider.
+*/
+Slider::Slider(char* slidername, int start, int end)
+{
+  this->init(start, end);
+  this->setValue(start);
+  this->setTitle(slidername);
+#ifdef HAVE_GTK2
+  this->connectSignal("value_changed", this->OptionChange);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief destructs a Slider.
+*/
+Slider::~Slider(void)
+{
+  this->destroy();
+}
+
+/**
+   \brief Initializes a Slider with start and end Values
+   params: see Slider::Slider(char* slidername, int start, int end)
+*/
+void Slider::init(int start, int end)
+{
+  this->isOption = 2;
+
+  static_cast<Option*>(this)->init();
+
+  this->start = start;
+  this->end = end;
+#ifdef HAVE_GTK2
+ widget = gtk_hscale_new_with_range(this->start, this->end, 5);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief Destroys a Slider.
+*/
+void Slider::destroy(void)
+{ 
+  if (this->title)
+    PRINTF(3)("deleting the Slider: %s\n", this->title);
+  else 
+    PRINTF(3)("deleting the Slider.\n");
+
+  static_cast<Option*>(this)->destroy();
+
+}
+
+/**
+   \brief Sets a new Title to the Slider
+   \param title The new Name of the slider
+*/
+void Slider::setTitle(char* title)
+{
+  if (this->title)
+    delete []this->title;
+  this->title = new char[strlen(title)+1];
+  strcpy(this->title, title);
+}
+
+/**
+   \brief Setting a new value to the Slider.
+   Maybe you also require a Slider::redraw() for this to display
+*/
+void Slider::setValue(int value)
+{
+  this->value = value;
+}
+
+/**
+   \brief Redraws the widget
+   Example: see void CheckButton::redraw(void)
+*/
+void Slider::redraw(void)
+{
+#ifdef HAVE_GTK2
+  gtk_range_set_value(GTK_RANGE(this->widget), value);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief Changed the Option, call this Function
+*/
+void Slider::changeOption(void)
+{
+#ifdef HAVE_GTK2
+  this->value =(int)gtk_range_get_value(GTK_RANGE(this->widget));
+#else /* HAVE_GTK2 */
+  char tmpChar[20];
+  cout << "\nPlease give me a new value for " << this->title << " [" <<this->start << "-" << this->end << "](defualt:" << this->defaultValue << "): ";
+  cin >> tmpChar;
+
+  if ((this->value = atoi(tmpChar))> this->end)
+    this->value = this->end;
+  if (this->value <= this->start)
+    this->value = this->start;
+#endif /* HAVE_GTK2 */
+  cout << this->title << " set to: " << this->value << endl;
+}
+
+/* MENU */
+
+/** 
+    \brief Creates a Menu-Item-list out of multiple input.
+    !! Consider, that the last input argument has to be "lastItem" for this to work!!
+    \param menuname The Database-Name of this Menu
+    \param ... items to be added to this Menu. !! Consider, that the last input argument has to be "lastItem" for this to work!!
+*/
+Menu::Menu(char* menuname, ...)
+{
+  this->init();
+  this->setTitle(menuname);
+    
+  char *itemName;
+
+#ifdef HAVE_GTK2             /////////////////////// REINPLEMENT
+  va_start(itemlist, menuname);
+  while(strcmp(itemName = va_arg(itemlist, char*), "lastItem"))
+    {
+      this->addItem(itemName);
+    }
+  va_end(itemlist);
+#endif /* HAVE_GTK2 */
+
+#ifdef HAVE_GTK2
+  gtk_option_menu_set_menu(GTK_OPTION_MENU(this->widget), menu);
+  this->connectSignal("changed", this->OptionChange);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief destructs a Menu.
+*/
+Menu::~Menu(void)
+{
+  this->destroy();
+}
+
+/**
+   \brief Initializes a new Menu with no items
+*/
+void Menu::init(void)
+{
+  this->isOption = 2;
+
+  static_cast<Option*>(this)->init();
+
+#ifdef HAVE_GTK2
+  this->widget = gtk_option_menu_new();
+  this->menu = gtk_menu_new();
+#endif /* HAVE_GTK2 */
+
+}
+
+/**
+   \brief Destroys a Menu.
+*/
+void Menu::destroy(void)
+{ 
+  if (this->title)
+    PRINTF(3)("deleting the Menu: %s\n", this->title);
+  else 
+    PRINTF(3)("deleting the Menu.\n");
+  //! \todo destroy menu
+  
+  static_cast<Option*>(this)->destroy();
+}
+
+
+/**
+ * Sets the Database-Name of this Menu
+ \param title Database-Name to be set.
+*/
+void Menu::setTitle(char* title)
+{
+  if (this->title)
+    delete []this->title;
+  this->title = new char[strlen(title)+1];
+  strcpy(this->title, title);
+}
+
+/**
+   \brief appends a new Item to the Menu-List.
+   \param itemName the itemName to be appendet.
+
+   \todo make the item-list readable without GTK
+*/
+void Menu::addItem(char* itemName)
+{
+#ifdef HAVE_GTK2
+  this->item = gtk_menu_item_new_with_label(itemName);
+  gtk_menu_shell_append(GTK_MENU_SHELL(this->menu), this->item);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief Redraws the widget
+   Example: see void CheckButton::redraw(void)
+*/
+void Menu::redraw(void)
+{
+#ifdef HAVE_GTK2
+ gtk_option_menu_set_history(GTK_OPTION_MENU(this->widget), this->value);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief Changed the Option, call this Function
+*/
+void Menu::changeOption(void)
+{
+#ifdef HAVE_GTK2
+  this->value =(int)gtk_option_menu_get_history(GTK_OPTION_MENU(this->widget));
+#else /* HAVE_GTK2 */
+  char tmpChar[20];
+  cout << "\nPlease give me a new value for " << this->title << "(defualt:" << this->defaultValue << "): ";
+  cin >> tmpChar;
+  this->value = atoi(tmpChar);
+
+#endif /* HAVE_GTK2 */
+  cout << this->title << " set to: " << this->value << endl;
+}
+
+/* OPTION LABEL */
+
+/**
+   \brief Creates a new OptionLabel with a LabelName and a Value.
+   \param label The name of the OptionLabel.
+   \param value The Value of the OptionLabel(what will be displayed).
+*/
+OptionLabel::OptionLabel(char* label, char* value)
+{
+  this->init();
+  this->setTitle(label);
+  this->setValue(value);
+}
+
+/**
+   \brief destructs an OptionLabel.
+*/
+OptionLabel::~OptionLabel(void)
+{
+  this->destroy();
+}
+
+/**
+   \brief Initializes an OptionLabel
+*/
+void OptionLabel::init(void)
+{
+  this->isOption = 5;
+  static_cast<Option*>(this)->init();
+
+  cValue = NULL;
+
+#ifdef HAVE_GTK2
+  this->widget = gtk_label_new("");
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief Destroys a OptionLabel.
+*/
+void OptionLabel::destroy(void)
+{ 
+  if (this->title)
+    PRINTF(3)("deleting the OptionLabel: %s\n", this->title);
+  else 
+    PRINTF(3)("deleting the OptionLabel.\n");
+  if (this->cValue)
+    delete []this->cValue;
+
+  static_cast<Option*>(this)->destroy();
+}
+
+
+/**
+   \brief Updates the value of an OptionLabel
+   \param newValue The new Name that should be displayed.
+*/
+void OptionLabel::setValue(char* newValue)
+{
+  if (this->cValue)
+    delete []this->cValue;
+  this->cValue = new char [strlen(newValue)+1];
+  strcpy(this->cValue, newValue);
+#ifdef HAVE_GTK2
+  gtk_label_set_text(GTK_LABEL(this->widget), this->cValue);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief Sets a ned Title to the OptionLabel.
+   \param title The now title of the OptionLabel.
+*/
+void OptionLabel::setTitle(char* title)
+{
+  if (this->title)
+    delete []this->title;
+  this->title = new char [strlen(title)+1];
+  strcpy(this->title, title);
+  this->redraw();
+}
+
+/**
+   \brief Redraws an OptionLabel(not implemented yet, but it works).
+*/
+void OptionLabel::redraw(void)
+{
+#ifdef HAVE_GTK2
+  gtk_label_set_text(GTK_LABEL(widget), title);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief Changed the Option, call this Function
+*/
+void OptionLabel::changeOption(void)
+{
+#ifdef HAVE_GTK2
+  this->cValue =(char*)gtk_label_get_text(GTK_LABEL(this->widget));
+#else /* HAVE_GTK2 */
+  cout << "\nPlease give me a new input for " << this->title << ": ";
+  cin >> this->cValue;
+#endif /* HAVE_GTK2 */
+  cout << this->title << " set to: " << this->cValue << endl;
+}
+
+
+/**
+   \brief Creates a new default Label with no Text.
+   You migth consider adding Label::setTitle with this.
+*/
+Label::Label(void)
+{
+  this->init();
+}
+
+/**
+   \brief Creates a new Label with a Text.
+   \param text The text to be displayed.
+*/
+Label:: Label(char* text)
+{
+  this->init();
+  this->setTitle(text);
+}
+
+/**
+   \brief destructs a Label.
+*/
+Label::~Label(void)
+{
+  this->destroy();
+}
+
+/**
+   \brief initializes a new Label
+*/
+void Label::init(void)
+{
+  this->isOption = 0;
+
+  static_cast<Widget*>(this)->init();
+
+#ifdef HAVE_GTK2
+  this->widget = gtk_label_new("");
+  gtk_label_set_line_wrap(GTK_LABEL(this->widget), TRUE);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief Destroys a Label.
+*/
+void Label::destroy(void)
+{ 
+  if (this->title)
+    PRINTF(3)("deleting the Label: %s\n", this->title);
+  else 
+    PRINTF(3)("deleting the Label.\n");
+
+  static_cast<Widget*>(this)->destroy();
+}
+
+/**
+   \brief Sets a new Text to a Label.
+   \param text The text to be inserted into the Label.
+*/
+void Label::setTitle(char* text)
+{
+  if (this->title)
+    delete []this->title;
+  this->title = new char[strlen(text)+1];
+  strcpy(this->title, text);
+#ifdef HAVE_GTK2
+  gtk_label_set_text(GTK_LABEL(this->widget), this->title);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief ereases the Text of a Label
+*/
+void Label::ereaseText(void)
+{
+  this->setTitle("");
+}
+
+/** 
+    \brief appends some Text to a Label
+    \param textToAppend The text that will be appended to this Label
+*/
+void Label::appendText(char* textToAppend)
+{
+  if (this->title)
+    {
+      char* tmpTitle = new char[strlen(this->title)+strlen(textToAppend)+1];
+      strcpy(tmpTitle, title);  
+      strcat(tmpTitle, textToAppend);
+      delete []this->title;
+      this->title = tmpTitle;
+    }
+  else
+    {
+      this->title = new char[strlen(textToAppend)];
+    }
+  
+#ifdef HAVE_GTK2
+  gtk_label_set_text(GTK_LABEL(this->widget), title);
+#endif /* HAVE_GTK2 */
+}
+
+/** 
+    \brief Appends some integer to the Label
+    \param intToAppend The Int that will be added.
+    
+    it does this by just converting the int into a char* and send it to appendText
+*/
+void Label::appendInt(int intToAppend)
+{
+  char append [32];
+  sprintf(append, "%d", intToAppend);
+  this->appendText(append);
+}
+
+
+/**
+   \brief get the Text of a Label
+   \return The Text the Label holds.
+*/
+char* Label::getText(void)
+{
+  return this->title;
+}
+
+/**
+   \brief Creates a new ProgressBar.
+*/
+ProgressBar::ProgressBar(void)
+{
+  this->init();
+}
+
+/**
+   \brief Creates a new ProgressBar.
+   \param label The name you want to get the ProgressBar.
+*/
+ProgressBar::ProgressBar(char* label)
+{
+  this->init();
+  this->setTitle(label);
+}
+
+/**
+   \brief destructs a ProgressBar
+*/
+ProgressBar::~ProgressBar(void)
+{
+  this->destroy();
+}
+
+/**
+   \brief Initializes a ProgressBar
+*/
+void ProgressBar::init(void)
+{
+  this->isOption = 0;
+  this->progress = 0.0;
+  this->totalSize = 0.0;
+
+  static_cast<Widget*>(this)->init();
+#ifdef HAVE_GTK2
+  this->adjustment =(GtkAdjustment*)gtk_adjustment_new(0, 0, 100, 0, 0, 0);
+  this->widget = gtk_progress_bar_new_with_adjustment(this->adjustment);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief Destroys a ProgressBar.
+*/
+void ProgressBar::destroy(void)
+{ 
+  if (this->title)
+    PRINTF(3)("deleting the ProgressBar: %s\n", this->title);
+  else 
+    PRINTF(3)("deleting the ProgressBar.\n");
+
+  static_cast<Widget*>(this)->destroy();
+}
+
+/**
+   \brief Sets a ned Title to the ProgressBar.
+   \param title The now title of the ProgressBar.
+*/
+void ProgressBar::setTitle(char* title)
+{
+  if (this->title)
+    delete []this->title;
+  this->title = new char [strlen(title)+1];
+  strcpy(this->title, title);
+}
+
+/**
+   \brief Sets the Total size of the Bar.(ex. The maximum one can download)
+*/
+void ProgressBar::setTotalSize(double totalSize)
+{
+  this->totalSize = totalSize;
+}
+
+/**
+   \brief Sets the progress maximum is this->totalSize
+*/
+void ProgressBar::setProgress(double progress)
+{
+  this->progress = progress;
+
+  if (this->progress > this->totalSize)
+    this->progress = this->totalSize;
+
+#ifdef HAVE_GTK2
+  gtk_progress_set_value(GTK_PROGRESS(widget), this->progress*100.0/this->totalSize);
+#endif /* HAVE_GTK2 */
+  PRINTF(3)("Progress: %f\n", this->progress*100.0/this->totalSize);
+}
+
+/**
+    \brief returns the Progress Status
+*/
+double ProgressBar::getProgress(void)
+{
+  return this->progress;
+}
+
+/* IMAGE */
+
+/**
+   \brief Creates a new Image
+   \param imagename the location of the Image on the Hard Disc
+*/
+Image::Image(char* imagename)
+{
+  this->init();
+  if (this->title)
+    delete []this->title;
+  this->title = new char[strlen(imagename)+1];
+  strcpy(this->title, imagename);
+
+#ifdef HAVE_GTK2
+  widget = gtk_image_new_from_file(imagename);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief destructs an Image.
+*/
+Image::~Image(void)
+{
+  this->destroy();
+}
+
+/** 
+    \brief Initializes a new Image
+*/
+void Image::init(void)
+{
+  isOption = 0;
+
+  static_cast<Widget*>(this)->init();
+}
+
+/**
+   \brief Destroys a Image.
+*/
+void Image::destroy(void)
+{ 
+  if (this->title)
+    PRINTF(3)("deleting the Image: %s\n", this->title);
+  else 
+    PRINTF(3)("deleting the Image.\n");
+
+  static_cast<Widget*>(this)->destroy();
+}
+
+/**
+   \brief Sets a ned Title to the Image.
+   \param title The now title of the OptionLabel.
+*/
+void Image::setTitle(char* title)
+{
+  if (this->title)
+    delete []this->title;
+  this->title = new char [strlen(title)+1];
+  strcpy(this->title, title);
+}
Index: /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_gtk.h
===================================================================
--- /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_gtk.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_gtk.h	(revision 3498)
@@ -0,0 +1,399 @@
+/*!
+ \file orxonox_gui_gtk.h
+ \brief Contains all th different Widgets.
+*/
+#ifndef _ORXONOX_GUI_GTK_H
+#define _ORXONOX_GUI_GTK_H
+
+#if HAVE_CONFIG_H 
+#include <config.h> 
+#endif
+
+//! verbose level, soon obsolete
+extern int verbose; // soon obsolete here
+
+#include "debug.h"
+
+#ifdef HAVE_GTK2
+#include <gtk/gtkmain.h>
+#include <gtk/gtkwindow.h>
+#include <gtk/gtkframe.h>
+#include <gtk/gtkhbox.h>
+#include <gtk/gtkvbox.h>
+#include <gtk/gtkbutton.h>
+#include <gtk/gtkcheckbutton.h>
+#include <gtk/gtkhscale.h>
+#include <gtk/gtkoptionmenu.h>
+#include <gtk/gtkmenu.h>
+#include <gtk/gtkmenuitem.h>
+#include <gtk/gtklabel.h>
+#include <gtk/gtkimage.h>
+#include <gtk/gtkeventbox.h>
+#include <gtk/gtkprogressbar.h>
+#endif /* HAVE_GTK2 */
+
+bool initGUI(int argc, char* argv[]);
+bool mainloopGUI(void);
+
+//! This is the topmost object that can be displayed all others are derived from it.
+class Widget
+{
+ private:
+
+ public:
+  virtual ~Widget(void);
+  void init(void);
+  void destroy(void);
+
+  void show(void);
+  void hide(void);
+  void setSize(int width, int height);
+  virtual void setTitle(char* title) = 0;  //!< An abstract Function, that sets the title of Widgets.
+
+  Widget* findWidgetByName(char* name, unsigned int depth);
+  void walkThrough(void(*function)(Widget*), unsigned int depth);
+  void walkThrough(void(*function)(Widget*, void*), void* data, unsigned int depth);
+  static void listOptionsAndGroups(Widget* widget);
+  static void listOptions(Widget* widget);
+  static void listOptions(Widget* widget, void* data);
+  Widget* findOptionByNumber(int* number, unsigned int depth);
+  static void listGroups(Widget* widget);
+  static void listGroups(Widget* widget, void* data);
+  Widget* findGroupByNumber(int* number, unsigned int depth);
+  static void setOptions(Widget* widget);
+  static void flagCheck(Widget* widget, void* flagName);
+  
+#ifdef HAVE_GTK2
+  // Connection - Functions
+
+  gulong connectSignal(char* event, gint(*signal)(GtkWidget*, GdkEvent*, void* ));
+  gulong connectSignal(char* event, gint(*signal)(GtkWidget*, Widget* ));
+  gulong connectSignal(char* event, void* extObj, gint(*signal)(GtkWidget*, GdkEvent*, void* ));
+  gulong connectSignal(char* event, void* extObj, gint(*signal)(GtkWidget*, void* ));
+  gulong connectSignal(char* event, void* extObj, gint(*signal)(GtkWidget*, GdkEventKey*, void* ));
+  void disconnectSignal(gulong signalID);
+
+  // Signals
+  static gint doNothingSignal(GtkWidget* widget, GdkEvent* event, void* nothing);
+#endif /* HAVE_GTK2 */
+
+  Widget* next;                     //!< next always points to the next Widget in the list. Every Widget has a next one, or has NULL as next
+#ifdef HAVE_GTK2
+  GtkWidget* widget;                //!< widget is the gtk_widget that the specific Object Contains.
+#endif /* HAVE_GTK2 */
+  int isOption;                     //!< with this Paramenter one can set the option-type: -2:Container, -1: Box, 0: not an Option, 1: Bool-option, 2: int-option, 3: float option, 4:char option, 5: char* option
+
+  //! defines isOption states
+  enum option { containerType = -2, boxType = -1, nothingType = 0, boolType = 1, intType = 2}; 
+  char* title;                      //!< The name of the Widget. Some do display it, Options need it to save;
+};
+
+//! This is a Packer Object, which has the ability to Pack other Widgets into itself.
+class Packer : public Widget
+{
+ public:
+  Widget* down; //!< this points to the Widget below this.
+  char* groupName; //!< For each Packer you can specify a Groupname under which the lowerWidgets will be saved.
+
+  void init(void);
+  void destroy(void);
+
+  void setGroupName(char* name);
+  char* getGroupName(void);
+
+  virtual void fill(Widget* lowerWidget) = 0; //!< An abstract function, that fills Packers.
+};
+
+//! This is a Container Class, it can contain one sub-Widget: down.
+/**
+ * A Container is a Widget that can hold a subWidget in addition to a next-Widget.
+ * The Container can by itself not be displayed created or used.
+ * The derived classes of Container can be displayed
+*/
+class Container : public Packer
+{
+ private:
+  int borderwidth;          //!< The width of The Container Boarder.
+  int policy;               //!< The Update Policy of a Container.
+  
+ public:
+  void init(void);
+  void destroy(void);
+
+  //  void setBorderWidth(int borderwidth);
+  //  virtual void setTitle(char* title) = 0;
+  void fill(Widget* lowerWidget);
+};
+
+//! Window is the class that creates new Windows, and handels them
+/**
+ * A Window is a class derived from Container that contains a window-widget.
+ * It has the ability to hold one sub-object
+ */
+class Window : public Container
+{
+ private:
+  bool isOpen;                      //!< A bool Variable that checks if a Window is already open.
+ public:
+  static Window* mainWindow;        //!< Pointer to the First Window that was opened. By default this should be the GUI's main-Window.
+  static void addWindow(Window* windowToAdd);
+
+  Window(void);
+  Window(char* windowName);
+  ~Window(void);
+  void init(void);
+  void destroy(void);
+  
+  void setTitle(char* title);
+  void showall(void);
+  void open(void);
+  void close(void);
+
+#ifdef HAVE_GTK2
+  // Signals
+  static gint windowOpen(GtkWidget* widget, GdkEvent* event, void* window);
+  static gint windowClose(GtkWidget* widget, GdkEvent* event, void* window);
+#endif /* HAVE_GTK2 */
+};
+
+//! Frame is the class that handles frames
+/**
+ * A Frame is an object, that has a border and if you like a name on it.
+ * It can contain a Widget, which means that you can insert anything you like inside of a frame
+ */
+class Frame :public Container
+{
+ public:
+  Frame(void);
+  Frame(char* frameName);
+  ~Frame(void);
+  void init(void);
+  void destroy(void);
+  
+  void setTitle(char* title);
+};
+
+//! EventBox is a Container that can Handle all Events happening inside of it.
+/**
+ * Example: if you have a picture, and you want it to catch mouse-clicks, you have to pack it inside a EventBox
+ */
+class EventBox : public Container
+{
+ public:
+  EventBox(void);
+  EventBox(char* eventBoxName);
+  ~EventBox(void);
+  void init(void);
+  void destroy(void);
+  
+  void setTitle(char* title);
+};
+
+//! A Box can contain multiple Widgets
+/**
+   A Box can Contain multiple Widgets, that are ordered either horizontally or vertically
+   I defined the standartbox to be horizontally.
+   A Box is always filled left->right(horizontally) or up->down(vertically)
+*/
+class Box : public Packer
+{
+ public:
+  Box(void);
+  Box(char boxtype);
+  ~Box(void);
+  void init(char boxtype);
+  void destroy(void);
+  
+  void fill(Widget* lowerWidget);
+
+  void setTitle(char* title);
+};
+
+//! An Option is a Widget that contains something that may change its state.
+/**
+ * Options are the essence of a GUI, they: Configure, Start, Quit, Execute, and make it worth something
+ */
+class Option : public Widget
+{
+ protected:
+  bool saveable;  //!< Options can be Saved.
+  
+ public:
+  void init(void);
+  void destroy(void);
+
+  int value; //!< every option has a value either true or false(0,1) or something else like 25 for 25% of the volume
+  char* flagName; //!< options have a flag name that will be appendet if you start the Program from the GUI.
+  char* flagNameShort; //!< like flag_name but shorter
+  int defaultValue; //!< A default value is good, for hiding a option if it is not needed.(hidden if value == default_value)
+
+  void saveability(void);
+  void saveability(bool isSaveable);
+  bool isSaveable(void);
+  void setFlagName(char* flagname, int defaultvalue);
+  void setFlagName(char* flagname, char* flagnameshort, int defaultvalue);
+  virtual void redraw(void) = 0; //!< A Option must be able to redraw itself.
+  virtual void changeOption(void) = 0; //!< What to do, if an Option is Changed. eacht option decides for itself.
+#ifdef HAVE_GTK2
+    // Signals  
+  static gint OptionChange(GtkWidget* widget, Widget* option); //!< Signal for Options that change.
+#endif /* HAVE_GTK2 */
+};
+
+//! Buttons can be pressed, and released.
+/**
+ * Buttons are mainly there for executing some action like Starting the Programm, or Quiting it.
+ */
+class Button : public Option 
+{
+ public:
+  Button(char* buttonname);
+  ~Button(void);
+  void init(void);
+  void destroy(void);
+
+  void setTitle(char* title);
+  void redraw(void);
+  void changeOption(void);
+};
+
+//! CheckButtons are a key in configuring bool Variables
+/** CheckButtons can configure bool Variables like wireframe on/off, enable_sound etc.
+ */
+class CheckButton : public Option
+{
+ public:
+  CheckButton(char* buttonname);
+  ~CheckButton(void);
+  void init(void);
+  void destroy(void);
+
+  void setTitle(char* title);
+  bool isActive(void);           //!< a Bool value to see, if this CheckButton is active.
+  void redraw(void);
+  void changeOption(void);
+};
+
+//! Sliders are Options that can be modified in their value
+/**
+ * good for volume, brightness, etc.
+ */
+class Slider : public Option
+{
+ private:
+  int start;                            //!< The beginning of the Slider-range.
+  int end;                              //!< The end of the Slider-range.
+ public:
+  Slider(char* slidername, int start, int end);
+  ~Slider(void);
+  void init(int start, int end);
+  void destroy(void);
+
+  void setTitle(char* title);
+  void setValue(int value);
+  void redraw(void);
+  void changeOption(void);
+};
+
+//! A Menu is an Option that has a dropdown menu, where you can chose between different Items
+class Menu : public Option
+{
+ private:
+#ifdef HAVE_GTK2
+  GtkWidget* menu;                      //!< The menu That will hold the Options.
+  GtkWidget* item;                      //!< One Item From a Menu.
+#endif /* HAVE_GTK2 */
+  va_list itemlist;                     //!< The list to readin multiple Options.
+  
+ public:
+  Menu(char* menuname, ...);
+  ~Menu(void);
+  void init(void);
+  void destroy(void);
+  
+  void setTitle(char* title);
+  void addItem(char* itemName);
+  void redraw(void);
+  void changeOption(void);
+};
+
+//! A OptionLabel is a simple Label, that holds a char*, and will be updated, if changed.
+class OptionLabel : public Option
+{
+ private:
+
+ public:
+  OptionLabel(char* label, char* value);
+  ~OptionLabel(void);
+  void init(void);
+  void destroy(void);
+  
+  
+  void setValue(char* newValue);
+  void setTitle(char* title);
+  void redraw(void);
+  void changeOption(void);
+
+  char* cValue;                          //!< The Value the Label will have. \todo make private
+
+};
+
+//! A label is a Widget, that displays a text
+class Label : public Widget
+{
+ public:
+  Label(void);
+  Label(char* text);
+  ~Label(void);
+  void init(void);
+  void destroy(void);
+  
+  void setTitle(char* text);
+  void ereaseText(void);
+  void appendText(char* textToAppend);
+  void appendInt(int intToAppend);
+  char* getText(void);
+};
+
+//! A ProgressBar is a Widget, that can display a Progress
+class ProgressBar : public Widget
+{
+ public:
+  ProgressBar(void);
+  ProgressBar(char* label);
+  ~ProgressBar(void);
+  void init(void);
+  void destroy(void);
+
+  void setTitle(char* title);
+  void setProgress(double progress);
+  void setTotalSize(double totalSize);
+  double getProgress(void);
+
+ private:
+  double totalSize;         //!< The total Size of a download Bar
+  double progress;          //!< The progress of a Bar.
+#ifdef HAVE_GTK2
+  GtkAdjustment* adjustment;
+#endif /* HAVE_GTK2 */
+};
+
+//! Image is the keeper of one Image 
+/** 
+ * Images are mighty cool.
+ * Images can help you lighten up the Programming process, and will give everyone a better impression of the Software.
+ */
+class Image : public Widget
+{
+ public:
+  Image(char* imgaename);
+  ~Image(void);
+  void init(void);
+  void destroy(void);
+
+  void setTitle(char* title);
+};
+
+//gint orxonox_gui_quit(GtkWidget* widget, GdkEvent* event, gpointer data);
+
+#endif /* _ORXONOX_GUI_GTK_H */
Index: /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_keys.cc
===================================================================
--- /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_keys.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_keys.cc	(revision 3498)
@@ -0,0 +1,276 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+
+*/
+
+#include "orxonox_gui_keys.h"
+
+/**
+   \brief Creates an Keyboard-Frame
+*/
+OrxonoxGuiKeys::OrxonoxGuiKeys(void)
+{
+  this->keysFrame = new Frame("Keyboard-Options:");
+  //  keysFrame->setGroupName("Keyboard");
+  this->keysBox = new Box('h');
+  this->player1 = new Player("player1");
+  this->player2 = new Player("player2");
+
+  this->keysBox->fill(this->player1->getOpenButton());
+  this->keysBox->fill(this->player2->getOpenButton());
+
+  this->keysFrame->fill(this->keysBox);
+}
+
+/**
+   \brief Destructs the Keys-stuff
+*/
+OrxonoxGuiKeys::~OrxonoxGuiKeys(void)
+{
+  // nothing to do here.
+}
+
+/**
+   \brief Return the Frame
+   \return Returns the Audio-frame
+*/
+Widget* OrxonoxGuiKeys::getWidget(void)
+{
+  return this->keysFrame;
+}
+
+/* PLAYER */
+
+/**
+   \brief Creates new inputs for a player
+   \param player the name of the Player
+*/
+Player::Player(char* player)
+{
+  char* windowName = new char[strlen(player)+25];
+  strcpy(windowName, "Keyboard settings of ");
+  strcat(windowName, player);
+  this->pKeyWindow = new Window(windowName);
+  this->pKeyFrame = new Frame(windowName);
+   this->pKeysBox = new Box('v');
+   this->pKeysBox->setGroupName(player);
+    this->pKeysBox->fill(addKey(UP, "up"));
+    this->pKeysBox->fill(addKey(DOWN, "down"));
+    this->pKeysBox->fill(addKey(LEFT, "left"));
+    this->pKeysBox->fill(addKey(RIGHT, "right"));
+    this->pKeysBox->fill(addKey(SHOOT, "shoot"));
+    delete windowName;
+    closeButton = new Button("close");
+#ifdef HAVE_GTK2
+    this->closeButton->connectSignal("button_press_event", this->pKeyWindow, Window::windowClose);
+#endif /* HAVE_GTK2 */
+
+    this->pKeysBox->fill(this->closeButton);
+    this->pKeyFrame->fill(this->pKeysBox);
+   this->pKeyWindow->fill(this->pKeyFrame);
+   Window::addWindow(this->pKeyWindow);
+#ifdef HAVE_GTK2
+   this->pKeyWindow->connectSignal("destroy", this->pKeyWindow, Window::windowClose);
+   this->pKeyWindow->connectSignal("delete_event", this->pKeyWindow, Window::windowClose);
+#endif /* HAVE_GTK2 */
+
+  this->openButton = new Button(player);
+#ifdef HAVE_GTK2
+  this->openButton->connectSignal("button_press_event", this->pKeyWindow, Window::windowOpen);
+#endif /* HAVE_GTK2 */
+
+  this->inputWindow = new Window("inputWindow");
+
+  this->inputButton = new Button("test");
+  this->inputWindow->fill(inputButton);
+#ifdef HAVE_GTK2
+  this->inputWindow->connectSignal("destroy",  Widget::doNothingSignal);
+  this->inputWindow->connectSignal("delete_event", Widget::doNothingSignal);
+#endif /* HAVE_GTK2 */
+
+}
+
+/**
+   \brief adds a new Key.
+   \param key the number of the Key
+   \param name The name of the new Key.
+   \returns A widget that has the Key-Box
+*/
+Widget* Player::addKey(KEYS key, char* name)
+{
+  this->inputKey[key] = new InputKey;
+  this->inputKey[key]->pKeyBox = new Box();
+  this->inputKey[key]->pKeyButton = new Button(name);
+  this->inputKey[key]->pKeyOLabel = new OptionLabel(name, name);
+  this->inputKey[key]->pKeyOLabel->saveability();
+
+#ifdef HAVE_GTK2
+  //inputKey[key]->pKeyButton->connectSignal("key_press_event", inputKey[key]->pKeyButton, key_cb);
+  this->inputKey[key]->pKeyButton->connectSignal("button_press_event", this->inputKey[key], inputWindowEvent);
+#endif /* HAVE_GTK2 */
+  this->inputKey[key]->pKeyBox->fill(this->inputKey[key]->pKeyButton);
+  this->inputKey[key]->pKeyBox->fill(this->inputKey[key]->pKeyOLabel);
+  return this->inputKey[key]->pKeyBox;
+}
+
+/**
+   \returns the OpenButton of a Player
+*/
+Button* Player::getOpenButton(void)
+{
+  return this->openButton;
+}
+
+/**
+   \brief sets a new Key(only output)
+   \param key the new Key.
+*/
+void Player::setkey(KEYS key)
+{
+  cout << "setting up Key: "<< key <<endl;
+}
+
+Window* Player::inputWindow = NULL;
+Button* Player::inputButton = NULL;
+long Player::keySignal = 0;
+
+#ifdef HAVE_GTK2
+gint Player::inputWindowEvent(GtkWidget* w, GdkEventKey* event, void* inputKey)
+{
+  inputButton->setTitle("press a Key");
+  keySignal = inputButton->connectSignal("key_press_event", inputKey, key_cb);
+  inputWindow->open();
+}
+  
+/**
+   \brief Function which gets keystrokes
+   \param w the widget that released the Function.
+   \param event The event that happened.
+   \param Widget the Widget which will be applied.
+   \returns Nothing
+*/
+gint Player::key_cb(GtkWidget* w, GdkEventKey* event, void* inputKey)
+{
+  InputKey* inputkey =(InputKey*) inputKey;
+  char title [20];
+
+  switch(event->keyval) 
+    {
+    case GDK_Up:
+      strcpy(title, "up");
+      break;
+    case GDK_Down:
+      strcpy(title, "down");
+      break;
+    case GDK_Left:
+      strcpy(title, "left");
+      break;
+    case GDK_Right:
+      strcpy(title, "right");
+      break;
+      
+    case GDK_space:
+      strcpy(title, "space");
+      break;
+      
+    case 65293:
+      strcpy(title, "enter");
+      break;
+      
+      // Special Keys //
+    case GDK_Escape:
+      strcpy(title, "esc");
+      break;
+    case GDK_Tab:
+      strcpy(title, "tab");
+      break;
+    case GDK_Shift_L:
+      strcpy(title, "l_shift");
+      break;
+    case GDK_Shift_R:
+      strcpy(title, "r_shift");
+      break;
+    case GDK_Control_L:
+      strcpy(title, "l_ctrl");
+      break;
+    case GDK_Control_R:
+      strcpy(title, "r_ctrl");
+      break;
+    case GDK_Alt_L:
+      strcpy(title, "l_alt");
+      break;
+    case GDK_Alt_R:
+      strcpy(title, "r_alt");
+      break;
+      // FXX KEYS //
+    case GDK_F1:
+      strcpy(title, "f1");
+      break;
+    case GDK_F2:
+      strcpy(title, "f2");
+      break;
+    case GDK_F3:
+      strcpy(title, "f3");
+      break;
+    case GDK_F4:
+      strcpy(title, "f4");
+      break;
+    case GDK_F5:
+      strcpy(title, "f5");
+      break;
+    case GDK_F6:
+      strcpy(title, "f6");
+      break;
+    case GDK_F7:
+      strcpy(title, "f7");
+      break;
+    case GDK_F8:
+      strcpy(title, "f8");
+      break;
+    case GDK_F9:
+      strcpy(title, "f9");
+      break;
+    case GDK_F10:
+      strcpy(title, "f10");
+      break;
+    case GDK_F11:
+      strcpy(title, "f11");
+      break;
+    case GDK_F12:
+      strcpy(title, "f12");
+      break;
+      
+      
+    default:
+      char* tmp;
+      sprintf(tmp, "%c", event->keyval);
+      printf("other key %s \n", tmp);
+      strcpy(title, tmp);
+      break;
+    }
+
+  inputkey->pKeyOLabel->setValue(title);
+  inputButton->disconnectSignal(keySignal);
+  inputWindow->close();
+}
+#endif /* HAVE_GTK2 */
Index: /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_keys.h
===================================================================
--- /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_keys.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_keys.h	(revision 3498)
@@ -0,0 +1,80 @@
+/*!
+  \file orxonox_gui_keys.h
+  \brief File that holds the class that creates the Keyboard-Options.
+*/
+
+#ifndef _ORXONOX_GUI_KEYS_H
+#define _ORXONOX_GUI_KEYS_H
+
+#include "orxonox_gui.h"
+#ifdef HAVE_GTK2
+#include <gdk/gdkkeysyms.h>
+#endif /* HAVE_GTK2 */
+
+/**
+   \brief defines the Possible Player Keys
+*/
+enum KEYS {UP, DOWN, LEFT, RIGHT, SHOOT};
+
+class Player;
+//! Class that creates the Keys-Options.
+class OrxonoxGuiKeys
+{
+ private:
+  Frame* keysFrame;      //!< The Frame that holds the keyOptions.
+  Box* keysBox;          //!< The Frame that holds the keyOptions.
+  Player* player1;       //!< The first Player's keys.
+  Player* player2;       //!< The seconds Player's keys.
+  Button* misc;          //!< Other keyboeard options come here. \todo include some like pause, quit and so on.
+
+ public:
+  OrxonoxGuiKeys(void);
+  ~OrxonoxGuiKeys(void);
+  
+  Widget* getWidget(void);
+};
+
+//! Class to hold infos about a Player
+/**
+   \todo split into subclass and superclass ButtonConfigurator
+*/
+class Player
+{
+ private:
+  Window* pKeyWindow;     //!< The Window for a new Key-setting.
+  Frame* pKeyFrame;       //!< The Frame for a new Key-setting.
+  Button* openButton;     //!< The OpenButton for this key-settings.
+  Button* closeButton;    //!< The CloseButton for this key-settings.
+  Box* pKeysBox;          //!< The Box that holds the Key-settings.
+  
+  //! One KeyOption has one InputKey
+  struct InputKey
+  {
+    Box* pKeyBox;           //!< One Box that holds the Keys
+    Button* pKeyButton;     //!< The Button for changing the Key.
+    OptionLabel* pKeyOLabel;//!< The Label for displaying the Key-setting.
+  };
+
+  InputKey* inputKey[10];     //!< Buttons-array. \todo make it dynamic.
+
+  static Window* inputWindow; //!< A Window that gets keyboard clicks. Static, because only one needed.
+  static Button* inputButton; //!< A Button that gets keyboard clicks. Static, because only one needed.
+  static long keySignal;      //!< A keySignal that handles keyboard clicks. Static, because only one needed.
+ public:
+  Player(char* player);
+
+  Widget* addKey(KEYS key, char* name);
+
+  Button* getOpenButton(void);
+
+#ifdef HAVE_GTK2
+  static gint inputWindowEvent(GtkWidget* w, GdkEventKey* event, void* widget);
+  static gint key_cb(GtkWidget* w, GdkEventKey* event, void* inputKey);
+#endif /* HAVE_GTK2 */
+  void setkey(KEYS key);
+  
+};
+
+
+
+#endif /* _ORXONOX_GUI_KEYS_H */
Index: /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_update.cc
===================================================================
--- /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_update.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_update.cc	(revision 3498)
@@ -0,0 +1,503 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+
+*/
+
+#include "orxonox_gui_update.h"
+#include <iostream>
+#include <string>
+
+#include "orxonox_gui.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+using namespace std;
+
+/**
+   \brief Creates an Update-Frame
+*/
+OrxonoxGuiUpdate::OrxonoxGuiUpdate(void)
+{
+  this->getSystemInfo();
+
+  this->updateFrame = new Frame("Update-Options:");
+  this->updateFrame->setGroupName("update");
+  this->updateBox = new Box('v');
+#ifdef HAVE_CURL
+
+  // the Button for autoUpdating
+  this->autoUpdate = new CheckButton("auto update");
+  this->updateBox->fill(this->autoUpdate);
+  this->autoUpdate->setFlagName("update", "u", 0);
+  this->autoUpdate->saveability();
+
+  this->updateSourceWindowCreate();
+  this->updateBox->fill(this->updateSourceWindowGetButton());
+
+  this->updateDataWindowCreate();
+  this->updateBox->fill(this->updateDataWindowGetButton());
+
+#else /* HAVE_CURL */
+  Label* noCurlLabel = new Label("since you do not have cURL,\nthis option is not availible");
+  this->updateBox->fill(noCurlLabel);  
+#endif /* HAVE_CURL */
+  this->updateFrame->fill(this->updateBox);
+}
+
+/**
+   \brief Destructs the Update-stuff
+*/
+OrxonoxGuiUpdate::~OrxonoxGuiUpdate(void)
+{
+  if(this->tmpDir)
+    delete []this->tmpDir;
+  if(this->homeDir)
+    delete []homeDir;
+  if(this->installDataDir)
+    delete []this->installDataDir;
+  if(this->installSourceDir)
+    delete []this->installSourceDir;
+  if(this->userName)
+    delete []this->userName;
+
+
+}
+
+/**
+   \brief Return the Frame
+   \return Returns the Audio-frame
+*/
+Widget* OrxonoxGuiUpdate::getWidget(void)
+{
+  return this->updateFrame;
+}
+
+/** 
+    \brief Look what info we can get from this system
+*/
+bool OrxonoxGuiUpdate::getSystemInfo(void)
+{
+  PRINTF(3)("Grabbing system information\n");
+  this->tmpDir = getenv("TMPDIR");
+  if(!tmpDir)
+    this->tmpDir = "/tmp";
+  PRINTF(4)("Temporary directory is: %s\n", this->tmpDir);
+
+#ifdef __WIN32__
+  this->homeDir = getenv("USERPROFILE");
+#else
+  this->homeDir = getenv("HOME");
+#endif
+  PRINTF(4)("Home directory is %s\n", homeDir);
+
+  this->installDataDir = "/usr/share/games/orxonox";
+  PRINTF(4)("Installation of orxonox-data will go to this directory: %s\n", this->installDataDir);
+
+  this->installSourceDir = "/usr/games/bin";
+  PRINTF(4)("Installation of orxonox-source will go to this directory: %s\n", this->installSourceDir);
+
+  this->userName = getenv("USER");
+  PRINTF(4)("Logged in username is: %s\n", this->userName);
+}
+
+#ifdef HAVE_CURL
+bool* OrxonoxGuiUpdate::checkForUpdates(void)
+{
+  PRINTF(3)("checking for new version of orxonox\n");
+  FileInfo updateFileInfo;
+  updateFileInfo.fileName = "update_info";
+  updateFileInfo.webRoot = "http://www.orxonox.ethz.ch/files/data";
+  updateFileInfo.localRoot = this->tmpDir;
+  
+  download(&updateFileInfo);
+}
+#endif /* HAVE_CURL */
+#ifdef HAVE_CURL
+/**
+   \brief Creates a window, and all it contains for the Data-update.
+*/
+void OrxonoxGuiUpdate::updateDataWindowCreate(void)
+{
+  this->updateDataWindow = new Window("update orxonox::Data");   
+  this->updateDataBox = new Box('v');
+
+  // the close-Button of the Update Window.
+  //  updateWindowClose = new Button("close");
+#ifdef HAVE_GTK2 
+  //  updateWindowClose->connectSignal("button_press_event", updateWindow, Window::windowClose);
+#endif /* HAVE_GTK2 */
+  //  updateWindowBox->fill(updateWindowClose);
+
+  this->updateDataBar = new ProgressBar();
+  this->updateDataBox->fill(this->updateDataBar);
+
+  FileInfo* dataInfo = new FileInfo;
+  dataInfo->bar = this->updateDataBar;
+
+  this->updateDataBegin = new Button("begin.");
+  dataInfo->stateButton = this->updateDataBegin;
+#ifdef HAVE_GTK2 
+  dataInfo->buttonSignal = updateDataBegin->connectSignal("button_press_event", dataInfo, updateDataFunc);
+#endif /* HAVE_GTK2 */
+  this->updateDataBox->fill(this->updateDataBegin);
+
+  this->updateDataWindow->fill(this->updateDataBox);
+
+  this->updateDataWindowButton = new Button("update orxonox::Data");
+#ifdef HAVE_GTK2 
+  this->updateDataWindowButton->connectSignal("button_press_event", this->updateDataWindow, Window::windowOpen);
+  this->updateDataWindow->connectSignal("destroy", this->updateDataWindow, Window::windowClose);
+  this->updateDataWindow->connectSignal("delete_event", this->updateDataWindow, Window::windowClose);
+#endif /* HAVE_GTK2 */
+
+}
+
+/**
+   \returns A Pointer to the Button of the UpdaterDataWindow
+*/
+Button* OrxonoxGuiUpdate::updateDataWindowGetButton(void)
+{
+  return this->updateDataWindowButton;
+}
+
+/**
+   \brief Creates a window, and all it contains for the Source-update.
+*/
+void OrxonoxGuiUpdate::updateSourceWindowCreate(void)
+{
+  // the button, that opens this Window.
+  this->updateSourceWindowButton = new Button("update orxonox::Source");
+
+  // the Window itself
+  this->updateSourceWindow = new Window("update orxonox::Source");
+
+  this->updateSourceBox = new Box();
+
+  this->updateSourceBar = new ProgressBar();
+  this->updateSourceBox->fill(this->updateSourceBar);
+  test = new Button("increment");
+
+#ifdef HAVE_GTK2 
+  test->connectSignal("button_press_event", updateSourceBar, updateSourceFunc);
+#endif /* HAVE_GTK2 */
+
+  this->updateSourceBox->fill(test);
+  this->updateSourceWindow->fill(updateSourceBox); 
+#ifdef HAVE_GTK2 
+  this->updateSourceWindowButton->connectSignal("button_press_event", this->updateSourceWindow, Window::windowOpen);
+  this->updateSourceWindow->connectSignal("destroy", this->updateSourceWindow, Window::windowClose);
+  this->updateSourceWindow->connectSignal("delete_event", this->updateSourceWindow, Window::windowClose);
+#endif /* HAVE_GTK2 */
+
+}
+
+/**
+   \returns A Pointer to the Button of the UpdaterSourceWindow
+*/
+Button* OrxonoxGuiUpdate::updateSourceWindowGetButton(void)
+{
+  return this->updateSourceWindowButton;
+}
+
+
+#ifdef HAVE_GTK2 
+/**
+   \brief updates the Data of orxonox.
+   \param w The widget, that executed this Function.
+   \param event The event that trigered this Function.
+   \param button The Button, that triggered this event.
+*/
+gint OrxonoxGuiUpdate::updateDataFunc(GtkWidget* w, GdkEventKey* event, void* info)
+{
+  FileInfo* dataInfo =(FileInfo*)info;
+
+  dataInfo->fileName = "02%20orxonox%203.mp3";
+  dataInfo->webRoot  = "http://www.orxonox.ethz.ch/files/";
+  dataInfo->localRoot = "./";
+  PRINTF(3)("Preparing to download file %s.\n", dataInfo->fileName);
+  downloadWithStyle(dataInfo);
+}
+
+/**
+   \brief updates the source of orxonox.
+   \param w The widget, that executed this Function.
+   \param event The event that trigered this Function.
+   \param button The Button, that triggered this event.
+*/
+gint OrxonoxGuiUpdate::updateSourceFunc(GtkWidget* w, GdkEventKey* event, void* bar)
+{
+  ProgressBar* tmpBar = static_cast<ProgressBar*>(bar);
+  tmpBar->setTotalSize(20);
+  tmpBar->setProgress(tmpBar->getProgress()+1);
+}
+#endif /* HAVE_GTK2 */
+
+/**
+   \brief The Function Curl calls to write out the File.
+   \param ptr A Pointer to the date to write.
+   \param size The size in bytes of one nmemb to write.
+   \param nmemb The Count of size to write.
+   \param stream Filehandler to write to.
+*/
+size_t OrxonoxGuiUpdate::curlWriteFunc(void* ptr, size_t size, size_t nmemb, FILE* stream)
+{
+  return fwrite(ptr, size, nmemb, stream);
+}
+
+/**
+   \brief The Function Curl calls to write out the File.
+   \param ptr A Pointer to the date to write to.
+   \param size The size in bytes of one nmemb to write.
+   \param nmemb The Count of size to write.
+   \param stream Filehandler to get data from.
+*/
+size_t OrxonoxGuiUpdate::curlReadFunc(void* ptr, size_t size, size_t nmemb, FILE* stream)
+{
+  return fread(ptr, size, nmemb, stream);
+}
+
+
+/**
+   \brief An update Function for the GUI, to show the progress.
+   \param Bar th ProgressBar to update
+   \param totalSize The total size of the download in bytes.
+   \param progress The current Progress of the download in bytes.
+   \param upTotal not needed
+   \param upProgress not needed
+*/
+int OrxonoxGuiUpdate::curlProgressFunc(ProgressBar* bar, double totalSize, double progress, double upTotal, double upProgress)
+{
+  bar->setProgress(progress);
+  bar->setTotalSize(totalSize);
+#ifdef HAVE_GTK2
+#ifndef HAVE_PTHREAD_H
+  while(gtk_events_pending()) gtk_main_iteration();
+#endif
+#endif
+  return 0;
+}
+
+/**
+   \brief The Curl handle for only one CURL(static).
+*/
+CURL* OrxonoxGuiUpdate::curlHandle = NULL;
+
+#ifdef HAVE_PTHREAD_H
+/** \brief The download Thread ID */
+pthread_t* OrxonoxGuiUpdate::downloadThreadID = new pthread_t;
+/**   \brief The download Thread ID*/
+pthread_t* OrxonoxGuiUpdate::downloadThreadFinishID = new pthread_t;
+#endif /* HAVE_PTHREAD_H */
+/**
+   \brief A bool parameter that shows if we are downloading.
+*/
+bool OrxonoxGuiUpdate::isDownloading = false;
+
+
+/**
+   \brief Initializes a Download without displaying it.
+   \param fileInfo the FileInfo.
+
+   !! BE AWARE THIS WILL NOT BE THREADED. !!
+*/
+bool OrxonoxGuiUpdate::download(void* fileInfo)
+{
+  if(isDownloading)
+    {
+      PRINTF(2)("unable to Download. already getting some file\n");
+      return false;
+    }
+  PRINTF(3)("Downloading.\n");
+  FileInfo* info =(FileInfo*)fileInfo;
+  CURLcode res;
+  CURL* localCurl;
+  localCurl = curl_easy_init();
+  char* fileOnNet = new char [strlen(info->webRoot)+strlen(info->fileName)+2];
+  strcpy(fileOnNet, info->webRoot);
+  if(fileOnNet[strlen(fileOnNet)] != '/') //!< \todo windows-shit
+    strcat(fileOnNet, "/");
+  strcat(fileOnNet, info->fileName);
+  char* fileOnDisk = new char [strlen(info->localRoot)+strlen(info->fileName)+2];
+  strcpy(fileOnDisk, info->localRoot);
+  if(fileOnDisk[strlen(fileOnDisk)] != '/') //!< \todo windows-shit
+    strcat(fileOnDisk, "/");
+  strcat(fileOnDisk, info->fileName);
+  
+  if(localCurl)
+    {
+      
+      info->fileHandle = fopen(fileOnDisk, "w");
+      
+      curl_easy_setopt(localCurl, CURLOPT_URL, fileOnNet);
+      curl_easy_setopt(localCurl, CURLOPT_WRITEDATA, info->fileHandle);
+      curl_easy_setopt(localCurl, CURLOPT_WRITEFUNCTION, curlWriteFunc);
+      curl_easy_setopt(localCurl, CURLOPT_READFUNCTION, curlReadFunc);
+      curl_easy_setopt(localCurl, CURLOPT_NOPROGRESS, true);
+      
+      curl_easy_perform(localCurl);
+
+      curl_easy_cleanup(localCurl);
+      fclose(info->fileHandle);
+    }
+}
+
+/**
+   \brief Initializes a Download with some style.
+   \param fileInfo the FileInfo.
+   \todo release thread-lock.
+
+   Downloading with a Button that gets a different Name while downloading, and a Bar, that gets to be updated. More to be followed
+*/
+bool OrxonoxGuiUpdate::downloadWithStyle(void* fileInfo)
+{
+  if(isDownloading)
+    {
+      PRINTF(2)("unable to Download. already getting some file\n");
+      return false;
+    }
+  PRINTF(3)("Downloading.\n");
+  FileInfo* info =(FileInfo*)fileInfo;
+  CURLcode res;
+  curlHandle = curl_easy_init();
+  char* fileOnNet = new char [strlen(info->webRoot)+strlen(info->fileName)+1];
+  strcpy(fileOnNet, info->webRoot);
+  strcat(fileOnNet, info->fileName);
+  char* fileOnDisk = new char [strlen(info->localRoot)+strlen(info->fileName)+1];
+  strcpy(fileOnDisk, info->localRoot);
+  strcat(fileOnDisk, info->fileName);
+
+  if(curlHandle)
+    {
+      
+      info->fileHandle = fopen(fileOnDisk, "w");
+      
+      curl_easy_setopt(curlHandle, CURLOPT_URL, fileOnNet);
+      curl_easy_setopt(curlHandle, CURLOPT_WRITEDATA, info->fileHandle);
+      curl_easy_setopt(curlHandle, CURLOPT_WRITEFUNCTION, curlWriteFunc);
+      curl_easy_setopt(curlHandle, CURLOPT_READFUNCTION, curlReadFunc);
+      curl_easy_setopt(curlHandle, CURLOPT_NOPROGRESS, false);
+      curl_easy_setopt(curlHandle, CURLOPT_PROGRESSFUNCTION, curlProgressFunc);
+      curl_easy_setopt(curlHandle, CURLOPT_PROGRESSDATA, info->bar);
+
+      if(!isDownloading)
+	{
+#ifdef HAVE_PTHREAD_H	  
+	  pthread_join(*downloadThreadFinishID, NULL);
+#endif /* HAVE_PTHREAD_H */
+#ifdef HAVE_GTK2 
+	  info->stateButton->disconnectSignal(info->buttonSignal);
+	  info->buttonSignal = info->stateButton->connectSignal("button_press_event", info, cancelDownload);
+#endif /* HAVE_GTK2 */
+#ifdef HAVE_PTHREAD_H
+	  info->stateButton->setTitle("cancel");
+#else /* HAVE_PTHREAD_H */
+	  info->stateButton->setTitle("please wait");
+#endif /* HAVE_PTHREAD_H */
+	  
+	  //! \todo check if threads really were created.
+#ifdef HAVE_PTHREAD_H
+	  pthread_create(downloadThreadID, NULL, downloadThread, info);
+	  pthread_create(downloadThreadFinishID, NULL, downloadThreadFinished, info);  
+#else
+	  downloadThread(info);
+	  downloadThreadFinished(info);
+#endif /* HAVE_PTHREAD_H */
+	 
+	  //      res = curl_easy_perform(curlHandle);
+	  
+	  //      fclose(outfile);
+	}
+      else 
+	PRINTF(1)("thread already in use\n");
+
+    }
+  return true;
+}
+
+/**
+   \brief The downloading process(either threaded or not).
+   \param fileInfo the FileInfo.
+
+   \todo Threads get locked, if the cancel button is pressed in to small intervals.
+*/
+void* OrxonoxGuiUpdate::downloadThread(void* fileInfo)
+{
+  isDownloading = true;
+  curl_easy_perform(curlHandle);
+}
+
+/**
+   \brief Finishes a downloading process. 
+   \param fileInfo the FileInfo.
+*/
+void* OrxonoxGuiUpdate::downloadThreadFinished(void* fileInfo)
+{ 
+  FileInfo* info =(FileInfo*)fileInfo;
+#ifdef HAVE_PTHREAD_H
+  pthread_join(*downloadThreadID, NULL);
+#ifdef HAVE_GTK2 
+  gdk_threads_enter();
+#endif /* HAVE_GTK2 */
+#endif /* HAVE_PTHREAD_H */
+  if(curlHandle)
+    curl_easy_cleanup(curlHandle);
+ 
+  PRINTF(3)("Closing the downloaded file.\n");
+  fclose(info->fileHandle);
+
+  if(isDownloading)
+    info->stateButton->setTitle("go on");
+  //  else
+  //    info->stateButton->setTitle("done");
+#ifdef HAVE_GTK2 
+  info->stateButton->disconnectSignal(info->buttonSignal);
+  info->buttonSignal = info->stateButton->connectSignal("button_press_event", info, updateDataFunc);
+#endif /* HAVE_GTK2 */
+  isDownloading = false;
+#ifdef HAVE_PTHREAD_H
+#ifdef HAVE_GTK2 
+  gdk_threads_leave();
+#endif /* HAVE_GTK2 */
+#endif /* HAVE_PTHREAD_H */
+
+}
+
+#ifdef HAVE_GTK2
+/**
+   \brief canceles a downloading session.
+   \param w The widget, that executed this Function.
+   \param event The event that trigered this Function.
+   \param bar The Bar, that triggered this event.
+
+   \todo canceling a session in non-threaded mode.
+*/
+gint OrxonoxGuiUpdate::cancelDownload(GtkWidget* w, GdkEventKey* event, void* bar)
+{
+#ifdef HAVE_PTHREAD_H
+  pthread_cancel(*downloadThreadID);
+#else
+  PRINTF(2)("Cannot cancle the Downloading process until after this File, because no threading was enabled");
+#endif /* HAVE_PTHREAD_H*/
+}
+#endif /* HAVE_GTK2 */
+
+#endif /* HAVE_CURL */
Index: /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_update.h
===================================================================
--- /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_update.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_update.h	(revision 3498)
@@ -0,0 +1,113 @@
+/*!
+  \file orxonox_gui_update.h
+  \brief File that holds the class that creates the update-menu.
+*/
+
+#ifndef _ORXONOX_GUI_UPDATE_H
+#define _ORXONOX_GUI_UPDATE_H
+
+#include "orxonox_gui.h"
+#include <stdio.h>
+#ifdef HAVE_CURL
+#include <curl/curl.h>
+#include <curl/types.h>
+#include <curl/easy.h>
+#endif /* HAVE_CURL */
+#ifdef HAVE_PTHREAD_H
+#define _MULTI_THREADED
+#include <pthread.h>
+#endif /* HAVE_PTHREAD_H */
+using namespace std;
+
+//! Class that creates the execute-Options.
+class OrxonoxGuiUpdate
+{
+ private:
+  // Defining Variables
+  char* tmpDir;                         //!< The Temporary directory.
+  char* homeDir;                        //!< The Home directory.
+  char* installDataDir;                 //!< Where to install the Data to.
+  char* installSourceDir;               //!< Where to install the Source to.
+  char* userName;                       //!< The user logged in.
+
+  bool getSystemInfo(void);
+ 
+  // Window creation.
+  Frame* updateFrame;                   //!< The Frame that holds the updateOptions.
+  Box* updateBox;                       //!< The Box that holds the updateOptions.
+  CheckButton* autoUpdate;              //!< A Checkbutton to enable the automatic Updating.
+
+  
+  Button* updateDataWindowButton;       //!< A Button to update the Data of orxonox.
+  Window* updateDataWindow;             //!< A Window for the data-update.
+  Box* updateDataBox;                   //!< A Box for the Window for the Data-update.
+  ProgressBar* updateDataBar;           //!< A Bar to display the progress of the download.
+  Button* updateDataBegin;              //!< A Button to start the process.
+
+  Button* updateSourceWindowButton;     //!< A Button to update the Source of orxonox. \todo tricky
+  Window* updateSourceWindow;           //!< A Window for the Source-update.
+  Box* updateSourceBox;                 //!< A Box for the Window for the Source-update.
+  ProgressBar* updateSourceBar;         //!< A Bar to display the progress of the download.
+
+  Button* test;                         //!< will be deleted soon.
+
+#ifdef HAVE_GTK2
+  static gint updateDataFunc(GtkWidget* w, GdkEventKey* event, void* info);
+  static gint updateSourceFunc(GtkWidget* w, GdkEventKey* event, void* info);
+#endif /* HAVE_GTK2 */
+
+#ifdef HAVE_CURL
+  //! A Struct to hold information about one File to download.
+  struct FileInfo
+  {
+    char* fileName;                     //!< The Name of the file we want to get.
+    char* webRoot;                      //!< The Root of the File on The Web
+    char* localRoot;                    //!< The Root directory to put the files on the local disk.
+    FILE* fileHandle;                   //!< A fileHandler.
+
+    Button* stateButton;                //!< A button that shows either start or cancel;
+    long int buttonSignal;              //!< The Signal of the stateButton.
+    ProgressBar* bar;                   //!< The ProgressBar, that sould be updated.
+  };
+
+  static size_t curlWriteFunc(void* ptr, size_t size, size_t nmemb, FILE* stream);
+  static size_t curlReadFunc(void* ptr, size_t size, size_t nmemb, FILE* stream);
+  static int curlProgressFunc(ProgressBar* bar, double totalSize, double progress, double upTotal, double upProgress);
+
+  static CURL* curlHandle;
+#ifdef HAVE_GTK2 
+  static gint cancelDownload(GtkWidget* w, GdkEventKey* event, void* bar);
+#endif /* HAVE_GTK2 */  
+#ifdef HAVE_PTHREAD_H
+  static pthread_t* downloadThreadID;
+  static pthread_t* downloadThreadFinishID;
+#endif /* HAVE_PTHREAD_H */
+  static bool isDownloading;
+
+  static bool download(void* fileInfo);
+  static bool downloadWithStyle(void* fileInfo);
+  static void* downloadThread(void* fileInfo);
+  static void* downloadThreadFinished(void* fileInfo);
+
+  
+#endif /* HAVE_CURL */
+
+ public:
+  OrxonoxGuiUpdate(void);
+  ~OrxonoxGuiUpdate(void);
+  
+  Widget* getWidget(void);
+#ifdef HAVE_CURL   
+  void updateDataWindowCreate(void);
+  Button* updateDataWindowGetButton(void);
+
+  void updateSourceWindowCreate(void);
+  Button* updateSourceWindowGetButton(void);
+
+  bool* checkForUpdates(void);
+ 
+#endif /* HAVE_CURL */
+
+};
+
+#endif /* _ORXONOX_GUI_UPDATE_H */
Index: /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_video.cc
===================================================================
--- /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_video.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_video.cc	(revision 3498)
@@ -0,0 +1,147 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+
+*/
+
+
+#include "orxonox_gui_video.h"
+
+/**
+   \brief Creates the Video-Option-Frame
+*/
+OrxonoxGuiVideo::OrxonoxGuiVideo(void)
+{
+  this->videoFrame = new Frame("Video-Options:");
+  this->videoBox = new Box('v');
+  this->videoFrame->setGroupName("video");
+  
+  this->fullscreen = new CheckButton("Fullscreen-mode");
+  this->fullscreen->setFlagName("windowed", "q", 1);
+  this->fullscreen->saveability();
+  this->videoBox->fill(this->fullscreen);
+  this->resolution = new Menu("Resolution", "640x480", "800x600", "1024x768", "1280x1024", "1400x1050", "1600x1200", "1920x1200", "lastItem");
+  this->resolution->saveability();
+  this->videoBox->fill(this->resolution);
+  this->wireframe = new CheckButton("WireFrame-mode");
+  this->wireframe->setFlagName("wireframe", "w", 0);
+  this->wireframe->saveability();
+  this->videoBox->fill(this->wireframe);
+
+  this->advancedWindowCreate();
+  this->videoBox->fill(this->advancedWindowGetButton());
+
+  this->videoFrame->fill(videoBox);
+}
+
+/**
+   \brief Destructs the Video-stuff
+*/
+OrxonoxGuiVideo::~OrxonoxGuiVideo(void)
+{
+  // nothing to do here.
+}
+
+/**
+   \return Returns the Video-frame
+*/
+Widget* OrxonoxGuiVideo::getWidget(void)
+{
+  return this->videoFrame;
+}
+
+
+/**
+   \brief Creates a window, and all it contains for the Source-update.
+*/
+void OrxonoxGuiVideo::advancedWindowCreate(void)
+{
+  // the button, that opens this Window.
+  this->advancedButton = new Button("advanced");
+
+  // the Window itself
+  this->advancedWindow = new Window("Advanced Video Options");
+  this->advancedWindow->setGroupName("advancedVideoOptions");
+
+  this->advancedBox = new Box('v');
+
+  // Advanced Performance Options
+  this->shadows = new CheckButton("Shadows");
+  this->shadows->saveability();
+  this->advancedBox->fill(this->shadows);
+
+  this->fog = new CheckButton("Fog");
+  this->fog->saveability();
+  this->advancedBox->fill(this->fog);
+
+  this->reflections = new CheckButton("Reflections");
+  this->reflections->saveability();
+  this->advancedBox->fill(this->reflections);
+
+  this->textures = new CheckButton("Textures");
+  this->textures->saveability();
+  this->advancedBox->fill(this->textures);
+
+  this->textureDetail = new Menu("Texture Detail", "low", "medium", "high", "lastItem");
+  this->textureDetail->saveability();
+  this->advancedBox->fill(this->textureDetail);
+
+  this->modelDetailLabel = new Label("Model Detail");
+  this->advancedBox->fill(this->modelDetailLabel);
+  this->modelDetail = new Menu("Model Detail", "low", "medium", "high", "lastItem");
+  this->modelDetail->saveability();
+  this->advancedBox->fill(this->modelDetail);
+
+  this->antiAliasingLabel = new Label("Anti-Aliasing-depth:");
+  this->advancedBox->fill(this->antiAliasingLabel);
+  this->antiAliasing = new Menu("Anti Aliasing", "0", "1", "2", "4", "8",  "lastItem");
+  this->antiAliasing->saveability();
+  this->advancedBox->fill(this->antiAliasing);
+
+  this->filterMethodLabel = new Label("Filtering Method:");
+  this->advancedBox->fill(this->filterMethodLabel);
+  this->filterMethod = new Menu("Filtering Method", "none", "linear", "bilinear", "trilinear", "anisortopic", "lastItem");
+  this->filterMethod->saveability();
+  this->advancedBox->fill(this->filterMethod);
+  
+  this->closeButton = new Button("close");
+  this->advancedBox->fill(this->closeButton);
+
+  this->advancedWindow->fill(advancedBox);
+#ifdef HAVE_GTK2 
+  this->advancedButton->connectSignal("button_press_event", this->advancedWindow, Window::windowOpen);
+  this->closeButton->connectSignal("button_press_event", this->advancedWindow, Window::windowClose);
+  this->advancedWindow->connectSignal("destroy", this->advancedWindow, Window::windowClose);
+  this->advancedWindow->connectSignal("delete_event", this->advancedWindow, Window::windowClose);
+#endif /* HAVE_GTK2 */
+   Window::addWindow(this->advancedWindow);
+
+}
+
+/**
+   \returns A Pointer to the Button of the UpdaterSourceWindow
+*/
+Button* OrxonoxGuiVideo::advancedWindowGetButton(void)
+{
+  return this->advancedButton;
+}
+
Index: /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_video.h
===================================================================
--- /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_video.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/gui/gui/orxonox_gui_video.h	(revision 3498)
@@ -0,0 +1,50 @@
+/*!
+  \file orxonox_gui_video.h
+  \brief File that holds the class that creates the Video-Options.
+*/
+#ifndef _ORXONOX_GUI_VIDEO_H
+#define _ORXONOX_GUI_VIDEO_H
+
+#include "orxonox_gui.h"
+
+//! Class that creates the Video-Options.
+class OrxonoxGuiVideo
+{
+ private:
+  Frame* videoFrame;        //!< The Frame that holds the video options.
+  Box* videoBox;            //!< The Box that holds the video options.
+  CheckButton* fullscreen;  //!< CheckButton for fullscreen-mode
+  Menu* resolution;         //!< Menu for the resolution
+  CheckButton* wireframe;   //!< CheckButton for wireframe Mode.
+
+  // advanced-Performance-Options
+  Window* advancedWindow;   //!< A Window to display advanced options.
+  Button* advancedButton;   //!< A Button to open the Advanced Video Performance Window.
+  Box* advancedBox;         //!< A Box to pack the options into.
+  CheckButton* shadows;     //!< CheckButton for shadows
+  CheckButton* fog;         //!< CheckButton for fog.
+  CheckButton* reflections; //!< CheckButton for reflections
+  CheckButton* textures;    //!< CheckButton for textures
+  Menu* textureDetail;      //!< Menu for the Texture-Detail.
+  
+  Label* modelDetailLabel;  //!< Label for model-detail.
+  Menu* modelDetail;        //!< model-detail.
+  
+  Label* antiAliasingLabel; //!< Label for the anti-aliasing mode.
+  Menu* antiAliasing;       //!< Menu for the Antialiasing-mode.
+
+  Label* filterMethodLabel; //!< Label for filtering-Method.
+  Menu* filterMethod;       //!< Menu for filtering Method.
+
+  Button* closeButton;      //!< A Button to close the Advanced-settingsWindow.
+
+  Button* advancedWindowGetButton(void);
+  void advancedWindowCreate(void);
+  
+ public:
+  OrxonoxGuiVideo(void);
+  ~OrxonoxGuiVideo(void);
+  
+  Widget* getWidget(void);
+};
+#endif /* _ORXONOX_GUI_VIDEO_H */
Index: /orxonox/branches/trackManager/src/lib/gui/gui/rc
===================================================================
--- /orxonox/branches/trackManager/src/lib/gui/gui/rc	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/gui/gui/rc	(revision 3498)
@@ -0,0 +1,139 @@
+# pixmap_path "<dir 1>:<dir 2>:<dir 3>:..."
+#
+pixmap_path "/usr/include/X11R6/pixmaps:/home/imain/pixmaps"
+#
+# style <name> [= <name>]
+# {
+#   <option>
+# }
+#
+# widget <widget_set> style <style_name>
+# widget_class <widget_class_set> style <style_name>
+
+# Here is a list of all the possible states.  Note that some do not apply to
+# certain widgets.
+#
+# NORMAL - The normal state of a widget, without the mouse over top of
+# it, and not being pressed, etc.
+#
+# PRELIGHT - When the mouse is over top of the widget, colors defined
+# using this state will be in effect.
+#
+# ACTIVE - When the widget is pressed or clicked it will be active, and
+# the attributes assigned by this tag will be in effect.
+#
+# INSENSITIVE - When a widget is set insensitive, and cannot be
+# activated, it will take these attributes.
+#
+# SELECTED - When an object is selected, it takes these attributes.
+#
+# Given these states, we can set the attributes of the widgets in each of
+# these states using the following directives.
+#
+# fg - Sets the foreground color of a widget.
+# bg - Sets the background color of a widget.
+# bg_pixmap - Sets the background of a widget to a tiled pixmap.
+# font - Sets the font to be used with the given widget.
+#
+
+# This sets a style called "button".  The name is not really important, as
+# it is assigned to the actual widgets at the bottom of the file.
+
+style "window"
+{
+  #This sets the padding around the window to the pixmap specified.
+  #bg_pixmap[<STATE>] = "<pixmap filename>"
+  #bg_pixmap[NORMAL] = "warning.xpm"
+  bg[NORMAL] = { 0, 0, 0 }
+  fg[NORMAL] = { 0, 1.0, 0 }
+  base[NORMAL] = { 0, 0, 0 }
+  base[INSENSITIVE] = { 0, 0, 0 }
+}
+
+style "scale"
+{
+  #Sets the foreground color (font color) to red when in the "NORMAL"
+  #state.
+  
+  fg[NORMAL] = { 0, 1.0, 0 }
+  bg[NORMAL] = { 0, 1.0, 0 }
+  bg[INSENSITIVE] = { 0, 1.0, 0 }
+  bg[PRELIGHT] = { 0, 1.0, 0 }
+  bg[ACTIVE] =   {0.2, 0.2, 0.2 }
+  
+  #Sets the background pixmap of this widget to that of its parent.
+  bg_pixmap[NORMAL] = "<parent>"
+}
+
+style "button"
+{
+  # This shows all the possible states for a button.  The only one that
+  # doesn't apply is the SELECTED state.
+  
+  fg[PRELIGHT] = { 0, 0, 0 }
+  bg[PRELIGHT] = { 0, 1.0, 0 }
+  bg[ACTIVE] = { 0, 1.0, 0 }
+  fg[ACTIVE] = { 0, 1.0, 0 }
+  bg[NORMAL] = { 0, 0, 0 }
+  fg[NORMAL] = { 0, 1.0, 0 }
+  bg[INSENSITIVE] = { 1.0, 0, 1.0 }
+  fg[INSENSITIVE] = { 1.0, 0, 1.0 }
+  base[NORMAL] = { 0, 1.0, 0 }
+  base[PRELIGHT] = { 0, 1.0, 0 }
+}
+
+# In this example, we inherit the attributes of the "button" style and then
+# override the font and background color when prelit to create a new
+# "main_button" style.
+
+style "main_button" = "button"
+{
+  font = "-adobe-helvetica-medium-r-normal--*-100-*-*-*-*-*-*"
+  bg[PRELIGHT] = { 0, 0.75, 0 }
+}
+
+style "toggle_button" = "button"
+{
+  fg[NORMAL] = { 0, 1.0, 0 }
+  fg[ACTIVE] = { 0, 1.0, 0 }
+  text[NORMAL] = { 0, 0, 0}
+  # This sets the background pixmap of the toggle_button to that of its
+  # parent widget (as defined in the application).
+  #bg_pixmap[NORMAL] = "<parent>"
+}
+
+style "text"
+{
+  #bg_pixmap[NORMAL] = "marble.xpm"
+  fg[NORMAL] = { 0, 1.0, 0 }
+}
+
+style "ruler"
+{
+  font = "-adobe-helvetica-medium-r-normal--*-20-*-*-*-*-*-*"
+}
+
+# pixmap_path "~/.pixmaps"
+
+# These set the widget types to use the styles defined above.
+# The widget types are listed in the class hierarchy, but could probably be
+# just listed in this document for the users reference.
+
+widget_class "GtkWindow"           style "window"
+widget_class "GtkFrame"            style "window"
+widget_class "Gtk*EventBox"        style "window"
+widget_class "GtkDialog"           style "window"
+widget_class "GtkFileSelection"    style "window"
+widget_class "*Gtk*Scale"          style "scale"
+widget_class "*GtkCheckButton*"    style "toggle_button"
+widget_class "*Gtk*Menu*"          style "toggle_button"
+widget_class "*GtkRadioButton*"    style "toggle_button"
+widget_class "*GtkButton*"         style "button"
+widget_class "*Ruler"              style "ruler"
+widget_class "*GtkText"            style "text"
+widget_class "*GtkLabel"           style "text"
+
+
+# This sets all the buttons that are children of the "main window" to
+# the main_button style.  These must be documented to be taken advantage of.
+widget "main window.*GtkButton*" style "main_button"
Index: /orxonox/branches/trackManager/src/lib/lang/base_entity.cc
===================================================================
--- /orxonox/branches/trackManager/src/lib/lang/base_entity.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/lang/base_entity.cc	(revision 3498)
@@ -0,0 +1,32 @@
+
+
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: Patrick Boenzli
+   co-programmer: ...
+*/
+
+
+#include "base_entity.h"
+
+
+using namespace std;
+
+
+
+BaseEntity::BaseEntity () {}
+
+
+
+BaseEntity::~BaseEntity () {}
+
+
Index: /orxonox/branches/trackManager/src/lib/lang/base_entity.h
===================================================================
--- /orxonox/branches/trackManager/src/lib/lang/base_entity.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/lang/base_entity.h	(revision 3498)
@@ -0,0 +1,20 @@
+/*! 
+  \file base_entity.h
+  \brief This includes the default values every entity should have.						\
+*/
+
+#ifndef _BASE_ENTITY_H
+#define _BASE_ENTITY_H
+
+#include "stdincl.h"
+
+//! The Base of each entity-Class
+class BaseEntity {
+
+ public:
+  BaseEntity ();
+  ~BaseEntity ();
+
+};
+
+#endif /* _BASE_ENTITY_H */
Index: /orxonox/branches/trackManager/src/lib/lang/base_object.cc
===================================================================
--- /orxonox/branches/trackManager/src/lib/lang/base_object.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/lang/base_object.cc	(revision 3498)
@@ -0,0 +1,52 @@
+
+
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: Patrick Boenzli
+   co-programmer: ...
+*/
+
+
+#include "base_object.h"
+
+
+using namespace std;
+
+
+/**
+   \brief standard constructor
+*/
+BaseObject::BaseObject () {}
+
+
+/**
+   \brief standard deconstructor
+*/
+BaseObject::~BaseObject () {}
+
+
+void BaseObject::setClassName (char* className)
+{
+  this->className = className;
+}
+
+char* BaseObject::getClassName(void) const
+{
+  return className;
+}
+
+bool BaseObject::isA (char* className)
+{
+  if( this->className == className)
+    return false;
+  return true;
+}
Index: /orxonox/branches/trackManager/src/lib/lang/base_object.h
===================================================================
--- /orxonox/branches/trackManager/src/lib/lang/base_object.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/lang/base_object.h	(revision 3498)
@@ -0,0 +1,28 @@
+/*! 
+    \file proto_class.h
+    \brief Definition of the proto class template, used quickly start work
+*/
+
+
+#ifndef _BASE_OBJECT_H
+#define _BASE_OBJECT_H
+
+#include "stdincl.h"
+
+
+class BaseObject {
+
+ public:
+  BaseObject ();
+  ~BaseObject ();
+
+  void setClassName (char* className);
+  char* getClassName(void) const;
+  bool isA (char* className);
+
+ private:
+  char* className;
+
+};
+
+#endif /* _BASE_OBJECT_H */
Index: /orxonox/branches/trackManager/src/lib/math/curve.cc
===================================================================
--- /orxonox/branches/trackManager/src/lib/math/curve.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/math/curve.cc	(revision 3498)
@@ -0,0 +1,462 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+   co-programmer: Patrick Boenzli
+
+   ADD: Patrick Boenzli           B-Spline 
+
+
+   TODO: 
+     local-Time implementation
+     NURBS
+     
+*/
+
+#include "curve.h"
+#include "matrix.h"
+#include "debug.h"
+
+#include <math.h>
+#include <stdio.h>
+
+/**
+   \brief adds a new Node to the bezier Curve
+   \param newNode a Vector to the position of the new node
+*/
+void Curve::addNode(const Vector& newNode)
+{
+  if (nodeCount != 0 )
+    {
+      currentNode = currentNode->next = new PathNode;
+    }
+  currentNode->position = newNode;
+  currentNode->next = 0;
+  currentNode->number = (++nodeCount);
+  this->rebuild();
+  return;
+}
+
+void Curve::addNode(const Vector& newNode, unsigned int insertPosition)
+{
+
+  if (this->nodeCount == 0 || insertPosition > this->nodeCount)
+    return addNode(newNode);
+
+  if (insertPosition == 0)
+    insertPosition = 1;
+
+  PathNode* insNode = new PathNode;
+
+  // relinking
+  PathNode* tmpNode = this->firstNode;
+  if (insertPosition > 1)
+    {
+      while (tmpNode->next->number != insertPosition)
+	tmpNode= tmpNode->next;
+      insNode->next = tmpNode->next;
+      tmpNode->next = insNode;
+    }
+  else
+    {
+      insNode->next = this->firstNode;
+      this->firstNode = insNode;
+    }
+  // renumbering
+  insNode->number = insertPosition;
+  tmpNode = insNode->next;
+  while (tmpNode)
+    {
+      tmpNode->number++;
+      tmpNode = tmpNode->next;
+    }
+
+    // finished
+  insNode->position = newNode;
+  ++nodeCount;
+  this->rebuild();
+  return;
+}
+
+/**
+   \brief Finds a Node by its Number, and returns its Position
+   \param nodeToFind the n'th node in the List of nodes
+   \returns A Vector to the Position of the Node.
+*/
+Vector Curve::getNode(unsigned int nodeToFind)
+{
+  if (nodeToFind > this->nodeCount || nodeToFind < 0)
+    return Vector(0,0,0);
+  PathNode* tmpNode = this->firstNode;
+  for (int i = 1; i < nodeToFind; i++)
+    tmpNode = tmpNode->next;
+  return tmpNode->position;
+}
+
+/**
+   \brief Outputs information about the state of this Curve
+*/
+void Curve::debug(void)
+{
+  printf("<<-------------------------------\n");
+  printf("Curve Information:\n");
+  printf("NodeCount: %d\n", this->nodeCount);
+  PathNode* tmpNode = this->firstNode;
+  while (tmpNode)
+    {
+      printf("node #%d: %f, %f, %f\n", tmpNode->number, tmpNode->position.x, tmpNode->position.y, tmpNode->position.z);
+      tmpNode = tmpNode->next;
+    }
+  printf("------------------------------->>\n");
+}
+
+
+///////////////////////////////////
+/// Bezier Curve //////////////////
+///////////////////////////////////
+
+/**
+   \brief Creates a new BezierCurve
+*/
+BezierCurve::BezierCurve (void)
+{
+  this->derivation = 0;
+  dirCurve = new BezierCurve(1);
+  this->init();
+}
+
+/**
+   \brief Creates a new BezierCurve-Derivation-Curve
+*/
+BezierCurve::BezierCurve (int derivation)
+{
+  this->derivation = derivation;
+  dirCurve=NULL;
+  this->init();
+}
+
+/**
+   \brief Deletes a BezierCurve.
+
+   It does this by freeing all the space taken over from the nodes
+*/
+BezierCurve::~BezierCurve(void)
+{
+  PathNode* tmpNode;
+  currentNode = firstNode;
+  while (tmpNode != 0)
+    {
+      tmpNode = currentNode;
+      currentNode = currentNode->next;
+      delete tmpNode;
+    }
+  if (dirCurve)
+    delete dirCurve;
+}
+
+/**
+   \brief Initializes a BezierCurve
+*/
+void BezierCurve::init(void)
+{
+  nodeCount = 0;
+  firstNode = new PathNode;
+  currentNode = firstNode;
+
+  firstNode->position = Vector (.0, .0, .0);
+  firstNode->number = 0;
+  firstNode->next = 0; // not sure if this really points to NULL!!
+
+  return;
+}
+
+/**
+   \brief Rebuilds a Curve
+*/
+void BezierCurve::rebuild(void)
+{
+  PathNode* tmpNode = firstNode;
+
+  // rebuilding the Curve itself
+  float k=0;
+  float n = nodeCount -1;
+  float binCoef = 1;
+  while(tmpNode)
+    {
+      tmpNode->factor = binCoef;
+      if (tmpNode =tmpNode->next)
+	{
+	  binCoef *=(n-k)/(k+1);
+	  ++k;
+	}
+    }
+
+  // rebuilding the Derivation curve
+  if(this->derivation <= 1)
+    {
+      tmpNode = firstNode;
+      delete dirCurve;
+      dirCurve = new BezierCurve(1);
+      while(tmpNode->next)
+	{
+	  Vector tmpVector = (tmpNode->next->position)- (tmpNode->position);
+	  tmpVector.x*=(float)nodeCount;
+	  tmpVector.y*=(float)nodeCount;
+	  tmpVector.z*=(float)nodeCount;
+	  tmpVector.normalize();
+	  this->dirCurve->addNode(tmpVector);
+	  tmpNode = tmpNode->next;
+	}
+    }
+}
+
+/**
+   \brief calculates the Position on the curve
+   \param t The position on the Curve (0<=t<=1)
+   \return the Position on the Path
+*/
+Vector BezierCurve::calcPos(float t) 
+{
+  Vector ret = Vector(0.0,0.0,0.0);
+  if (this->nodeCount >= 3)
+    {
+      PathNode* tmpNode = this->firstNode;
+      double factor = pow(1.0-t,nodeCount-1);
+      while(tmpNode)
+	{
+	  ret.x += tmpNode->factor * factor * tmpNode->position.x;
+	  ret.y += tmpNode->factor * factor * tmpNode->position.y;
+	  ret.z += tmpNode->factor * factor * tmpNode->position.z;
+	  factor *= t/(1.0-t); // same as pow but much faster.
+	  
+	  tmpNode = tmpNode->next;
+	}
+    }
+  else if (nodeCount == 2)
+    {
+      ret = this->firstNode->position *(1.0-t);
+      ret = ret + this->firstNode->next->position * t;
+    }
+  else if (nodeCount == 1)
+    ret = this->firstNode->position;
+  return ret;
+}
+
+/**
+   \brief Calulates the direction of the Curve at time t.
+   \param The time at which to evaluate the curve.
+   \returns The vvaluated Vector.
+*/
+Vector BezierCurve::calcDir (float t)
+{
+  return dirCurve->calcPos(t);
+}
+
+Vector BezierCurve::calcAcc (float t)
+{
+  return dirCurve->dirCurve->calcPos(t);
+}
+
+/**
+   \brief Calculates the Quaternion needed for our rotations
+   \param t The time at which to evaluate the cuve.
+   \returns The evaluated Quaternion.
+*/
+Quaternion BezierCurve::calcQuat (float t)
+{
+  return Quaternion (calcDir(t), Vector(0,0,1));
+}
+
+
+/**
+  \brief returns the Position of the point calculated on the Curve
+  \return a Vector to the calculated position
+*/
+Vector BezierCurve::getPos(void) const
+{
+  return curvePoint;
+}
+
+
+
+///////////////////////////////////
+//// Uniform Point curve  /////////
+///////////////////////////////////
+/**
+   \brief Creates a new UPointCurve
+*/
+UPointCurve::UPointCurve (void)
+{
+  this->derivation = 0;
+  this->init();
+}
+
+/**
+   \brief Creates a new UPointCurve-Derivation-Curve of deriavation'th degree
+*/
+UPointCurve::UPointCurve (int derivation)
+{
+  this->derivation = derivation;
+  dirCurve=NULL;
+  this->init();
+}
+
+/**
+   \brief Deletes a UPointCurve.
+
+   It does this by freeing all the space taken over from the nodes
+*/
+UPointCurve::~UPointCurve(void)
+{
+  PathNode* tmpNode;
+  currentNode = firstNode;
+  while (tmpNode != 0)
+    {
+      tmpNode = currentNode;
+      currentNode = currentNode->next;
+      delete tmpNode;
+    }
+  if (dirCurve)
+    delete dirCurve;
+}
+
+/**
+   \brief Initializes a UPointCurve
+*/
+void UPointCurve::init(void)
+{
+  nodeCount = 0;
+  firstNode = new PathNode;
+  currentNode = firstNode;
+
+  firstNode->position = Vector (.0, .0, .0);
+  firstNode->number = 0;
+  firstNode->next = 0; // not sure if this really points to NULL!!
+
+  return;
+}
+
+/**
+   \brief Rebuilds a UPointCurve
+   
+   \todo very bad algorithm
+*/
+void UPointCurve::rebuild(void)
+{
+  // rebuilding the Curve itself
+  PathNode* tmpNode = this->firstNode;
+  int i=0;
+  Matrix xTmpMat = Matrix(this->nodeCount, this->nodeCount);
+  Matrix yTmpMat = Matrix(this->nodeCount, this->nodeCount);
+  Matrix zTmpMat = Matrix(this->nodeCount, this->nodeCount);
+  Matrix xValMat = Matrix(this->nodeCount, 3);
+  Matrix yValMat = Matrix(this->nodeCount, 3);
+  Matrix zValMat = Matrix(this->nodeCount, 3);
+  while(tmpNode)
+    {
+      Vector fac = Vector(1,1,1);
+      for (int j = 0; j < this->nodeCount; j++)
+	{
+	  xTmpMat(i,j) = fac.x; fac.x *= (float)i/(float)this->nodeCount;//tmpNode->position.x;
+	  yTmpMat(i,j) = fac.y; fac.y *= (float)i/(float)this->nodeCount;//tmpNode->position.y;
+	  zTmpMat(i,j) = fac.z; fac.z *= (float)i/(float)this->nodeCount;//tmpNode->position.z;
+	}
+      xValMat(i,0) = tmpNode->position.x;
+      yValMat(i,0) = tmpNode->position.y;
+      zValMat(i,0) = tmpNode->position.z;
+      ++i;
+      tmpNode = tmpNode->next;
+    }
+  tmpNode = this->firstNode;
+  xValMat = xTmpMat.Inv() *= xValMat;
+  yValMat = yTmpMat.Inv() *= yValMat;
+  zValMat = zTmpMat.Inv() *= zValMat;
+  i = 0;
+  while(tmpNode)
+    {
+      tmpNode->vFactor.x = xValMat(i,0);
+      tmpNode->vFactor.y = yValMat(i,0);
+      tmpNode->vFactor.z = zValMat(i,0);
+
+      i++;
+      tmpNode = tmpNode->next;
+    }
+}
+
+/**
+   \brief calculates the Position on the curve
+   \param t The position on the Curve (0<=t<=1)
+   \return the Position on the Path
+*/
+Vector UPointCurve::calcPos(float t) 
+{
+  PathNode* tmpNode = firstNode;
+  Vector ret = Vector(0.0,0.0,0.0);
+  float factor = 1.0;
+  while(tmpNode)
+    {
+      ret.x += tmpNode->vFactor.x * factor;
+      ret.y += tmpNode->vFactor.y * factor;
+      ret.z += tmpNode->vFactor.z * factor;
+      factor *= t;
+
+      tmpNode = tmpNode->next;
+    }
+  return ret;
+}
+
+/**
+   \brief Calulates the direction of the Curve at time t.
+   \param The time at which to evaluate the curve.
+   \returns The vvaluated Vector.
+*/
+Vector UPointCurve::calcDir (float t)
+{
+  PathNode* tmpNode = firstNode;
+  Vector ret = Vector(0.0,0.0,0.0);
+  float factor = 1.0/t;
+  int k=0;
+  while(tmpNode)
+    {
+      ret.x += tmpNode->vFactor.x * factor *k;
+      ret.y += tmpNode->vFactor.y * factor *k;
+      ret.z += tmpNode->vFactor.z * factor *k;
+      factor *= t;
+      k++;
+      tmpNode = tmpNode->next;
+    }
+  ret.normalize();
+  return ret;
+}
+
+Vector UPointCurve::calcAcc (float t)
+{
+}
+
+/**
+   \brief Calculates the Quaternion needed for our rotations
+   \param t The time at which to evaluate the cuve.
+   \returns The evaluated Quaternion.
+*/
+Quaternion UPointCurve::calcQuat (float t)
+{
+  return Quaternion (calcDir(t), Vector(0,0,1));
+}
+
+
+/**
+  \brief returns the Position of the point calculated on the Curve
+  \return a Vector to the calculated position
+*/
+Vector UPointCurve::getPos(void) const
+{
+  return curvePoint;
+}
Index: /orxonox/branches/trackManager/src/lib/math/curve.h
===================================================================
--- /orxonox/branches/trackManager/src/lib/math/curve.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/math/curve.h	(revision 3498)
@@ -0,0 +1,118 @@
+
+/*! 
+    \file curve.h
+    \brief A basic 3D curve framework
+    
+    Contains classes to handle curves
+*/ 
+
+#ifndef _CURVE_H
+#define _CURVE_H
+
+#include "vector.h"
+
+//! An Enumerator that defines what sort of Curves are availible
+enum CurveType {BEZIERCURVE, UPOINTCURVE};
+
+
+//! An abstract class to handle curves. Needed for the Tracking system in orxonox.
+class Curve
+{
+ protected:
+  int nodeCount;         //!< The count of nodes the Curve has.
+  Vector curvePoint;     //!< The point on the Cureve at a local Time.
+  float localTime;       //!< If the time of one point is asked more than once the programm will not calculate it again.
+  int derivation;        //!< Which derivation of a Curve is this.
+
+  //! Handles the curve-points (dynamic List)
+  struct PathNode
+  {
+    int number;          //!< The N-th node of this curve.
+    float factor;        //!< Curve specific multiplier factor.
+    Vector vFactor;      //!< A Vector-factor for multipliing.
+    Vector position;     //!< Vector Pointung to this curve-point.
+    PathNode* next;      //!< Pointer to the next Node.
+  };
+
+  PathNode* firstNode;   //!< First node of the curve.
+  PathNode* currentNode; //!< The node we are working with (the Last node).
+
+ private:
+  virtual void rebuild(void) = 0;
+ public:
+  Curve* dirCurve;       //!< The derivation-curve of this Curve.
+  void addNode(const Vector& newNode);
+  void addNode(const Vector& newNode, unsigned int insertPosition);
+  Vector getNode(unsigned int nodeToFind);
+  inline int getNodeCount(void) { return this->nodeCount;}
+
+  virtual Vector calcPos(float t) = 0;
+  virtual Vector calcDir(float t) = 0;
+  virtual Vector calcAcc(float t) = 0;
+  virtual Quaternion calcQuat(float t) = 0;
+ 
+  // DEBUG
+  void debug(void);
+};
+
+//!    Class to handle bezier curves in 3-dimesnsional space
+/**
+   This Curve is good, for Fast Interaction. If you want to change it during the game, go on.
+   !!be aware!! BezierCurves only flow through their first and last Node. Their Tangents at those Points a directed to the second and second-last Point.
+*/
+class BezierCurve : public Curve
+{
+ private:
+  void rebuild(void);
+ public:
+  BezierCurve(void);
+  BezierCurve(int derivation);
+  ~BezierCurve(void);
+  void init(void);
+
+  Vector calcPos(float t);
+  Vector calcDir(float t);
+  Vector calcAcc(float t);
+  Quaternion calcQuat(float t);
+  
+  
+  Vector getPos(void) const;
+};
+
+
+//! B-Spline
+/**
+   class to handle b-spline in 3d space
+*/
+class BSplieCurve : public Curve
+{
+
+
+};
+
+//! Uniform Point Curve-class
+/**
+   A UPoint Curve is a A Curve, that flows through all the nodes given it.
+   The Algorithm to buid the curve is rather slow, but Painting and tracing along the curve has high speed, so do not change this curve during the Game.
+
+   This Curve is very erattic, so i do not recommend to use it.
+*/
+class UPointCurve : public Curve
+{
+ private:
+  void rebuild(void);
+ public:
+  UPointCurve(void);
+  UPointCurve(int derivation);
+  ~UPointCurve(void);
+  void init(void);
+
+  Vector calcPos(float t);
+  Vector calcDir(float t);
+  Vector calcAcc(float t);
+  Quaternion calcQuat(float t);
+  
+  Vector getPos(void) const;
+};
+
+#endif /* _CURVE_H */
Index: /orxonox/branches/trackManager/src/lib/math/matrix.cc
===================================================================
--- /orxonox/branches/trackManager/src/lib/math/matrix.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/math/matrix.cc	(revision 3498)
@@ -0,0 +1,746 @@
+
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+   co-programmer: ...
+
+   \todo Null-Parent => center of the coord system - singleton
+   \todo Smooth-Parent: delay, speed
+   \todo destroy the stuff again, delete...
+*/
+
+#include "matrix.h"
+
+Matrix::Matrix (size_t row, size_t col)
+{
+  _m = new base_mat( row, col, 0);
+}
+
+// copy constructor
+Matrix::Matrix (const Matrix& m)
+{
+    _m = m._m;
+    _m->Refcnt++;
+}
+
+// Internal copy constructor
+void Matrix::clone ()
+{
+    _m->Refcnt--;
+    _m = new base_mat( _m->Row, _m->Col, _m->Val);
+}
+
+// destructor
+Matrix::~Matrix ()
+{
+   if (--_m->Refcnt == 0) delete _m;
+}
+
+// assignment operator
+Matrix& Matrix::operator = (const Matrix& m) 
+{
+    m._m->Refcnt++;
+    if (--_m->Refcnt == 0) delete _m;
+    _m = m._m;
+    return *this;
+}
+
+//  reallocation method
+void Matrix::realloc (size_t row, size_t col)
+{
+   if (row == _m->RowSiz && col == _m->ColSiz)
+   {
+      _m->Row = _m->RowSiz;
+      _m->Col = _m->ColSiz;
+      return;
+   }
+
+   base_mat *m1 = new base_mat( row, col, NULL);
+   size_t colSize = min(_m->Col,col) * sizeof(float);
+   size_t minRow = min(_m->Row,row);
+
+   for (size_t i=0; i < minRow; i++)
+      memcpy( m1->Val[i], _m->Val[i], colSize);
+
+   if (--_m->Refcnt == 0) 
+       delete _m;
+   _m = m1;
+
+   return;
+}
+
+// public method for resizing Matrix
+void Matrix::SetSize (size_t row, size_t col) 
+{
+   size_t i,j;
+   size_t oldRow = _m->Row;
+   size_t oldCol = _m->Col;
+
+   if (row != _m->RowSiz || col != _m->ColSiz)
+      realloc( row, col);
+
+   for (i=oldRow; i < row; i++)
+      for (j=0; j < col; j++)
+	 _m->Val[i][j] = float(0);
+
+   for (i=0; i < row; i++)                      
+      for (j=oldCol; j < col; j++)
+	 _m->Val[i][j] = float(0);
+
+   return;
+}
+
+// subscript operator to get/set individual elements
+float& Matrix::operator () (size_t row, size_t col) 
+{
+   if (row >= _m->Row || col >= _m->Col)
+      printf( "Matrix::operator(): Index out of range!\n");
+   if (_m->Refcnt > 1) clone();
+   return _m->Val[row][col];
+}
+
+// subscript operator to get/set individual elements
+float Matrix::operator () (size_t row, size_t col) const 
+{
+   if (row >= _m->Row || col >= _m->Col)
+      printf( "Matrix::operator(): Index out of range!\n");
+   return _m->Val[row][col];
+}
+
+// input stream function
+istream& operator >> (istream& istrm, Matrix& m)
+{
+   for (size_t i=0; i < m.RowNo(); i++)
+      for (size_t j=0; j < m.ColNo(); j++)
+      {
+         float x;
+         istrm >> x;
+         m(i,j) = x;
+      }
+   return istrm;
+}
+
+// output stream function
+ostream& operator << (ostream& ostrm, const Matrix& m)
+{
+   for (size_t i=0; i < m.RowNo(); i++)
+   {
+      for (size_t j=0; j < m.ColNo(); j++)
+      {
+         float x = m(i,j);
+         ostrm << x << '\t';
+      }
+      ostrm << endl;
+   }
+   return ostrm;
+}
+
+
+// logical equal-to operator
+bool operator == (const Matrix& m1, const Matrix& m2) 
+{
+   if (m1.RowNo() != m2.RowNo() || m1.ColNo() != m2.ColNo())
+      return false;
+
+   for (size_t i=0; i < m1.RowNo(); i++)
+      for (size_t j=0; j < m1.ColNo(); j++)
+	      if (m1(i,j) != m2(i,j))
+	         return false;
+
+   return true;
+}
+
+// logical no-equal-to operator
+bool operator != (const Matrix& m1, const Matrix& m2) 
+{
+    return (m1 == m2) ? false : true;
+}
+
+// combined addition and assignment operator
+Matrix& Matrix::operator += (const Matrix& m) 
+{
+   if (_m->Row != m._m->Row || _m->Col != m._m->Col)
+     printf("Matrix::operator+= : Inconsistent Matrix sizes in addition!\n");
+   if (_m->Refcnt > 1) clone();
+   for (size_t i=0; i < m._m->Row; i++)
+      for (size_t j=0; j < m._m->Col; j++)
+	 _m->Val[i][j] += m._m->Val[i][j];
+   return *this;
+}
+
+// combined subtraction and assignment operator
+Matrix& Matrix::operator -= (const Matrix& m) 
+{
+   if (_m->Row != m._m->Row || _m->Col != m._m->Col)
+      printf( "Matrix::operator-= : Inconsistent Matrix sizes in subtraction!\n");
+   if (_m->Refcnt > 1) clone();
+   for (size_t i=0; i < m._m->Row; i++)
+      for (size_t j=0; j < m._m->Col; j++)
+	 _m->Val[i][j] -= m._m->Val[i][j];
+   return *this;
+}
+
+// combined scalar multiplication and assignment operator
+ Matrix&
+Matrix::operator *= (const float& c) 
+{
+    if (_m->Refcnt > 1) clone();
+    for (size_t i=0; i < _m->Row; i++)
+	for (size_t j=0; j < _m->Col; j++)
+	    _m->Val[i][j] *= c;
+    return *this;
+}
+
+// combined Matrix multiplication and assignment operator
+ Matrix&
+Matrix::operator *= (const Matrix& m) 
+{
+   if (_m->Col != m._m->Row)
+      printf( "Matrix::operator*= : Inconsistent Matrix sizes in multiplication!\n");
+
+   Matrix temp(_m->Row,m._m->Col);
+
+   for (size_t i=0; i < _m->Row; i++)
+      for (size_t j=0; j < m._m->Col; j++)
+      {
+         temp._m->Val[i][j] = float(0);
+         for (size_t k=0; k < _m->Col; k++)
+            temp._m->Val[i][j] += _m->Val[i][k] * m._m->Val[k][j];
+      }
+   *this = temp;
+
+   return *this;
+}
+
+// combined scalar division and assignment operator
+ Matrix&
+Matrix::operator /= (const float& c) 
+{
+    if (_m->Refcnt > 1) clone();
+    for (size_t i=0; i < _m->Row; i++)
+	for (size_t j=0; j < _m->Col; j++)
+	    _m->Val[i][j] /= c;
+
+    return *this;
+}
+
+// combined power and assignment operator
+ Matrix&
+Matrix::operator ^= (const size_t& pow) 
+{
+  Matrix temp(*this);
+
+  for (size_t i=2; i <= pow; i++)
+    *this *=  temp; // changed from *this = *this * temp;
+
+  return *this;
+}
+
+// unary negation operator
+ Matrix
+Matrix::operator - () 
+{
+   Matrix temp(_m->Row,_m->Col);
+
+   for (size_t i=0; i < _m->Row; i++)
+      for (size_t j=0; j < _m->Col; j++)
+	 temp._m->Val[i][j] = - _m->Val[i][j];
+
+   return temp;
+}
+
+// binary addition operator
+ Matrix
+operator + (const Matrix& m1, const Matrix& m2) 
+{
+   Matrix temp = m1;
+   temp += m2;
+   return temp;
+}
+
+// binary subtraction operator
+ Matrix
+operator - (const Matrix& m1, const Matrix& m2) 
+{
+   Matrix temp = m1;
+   temp -= m2;
+   return temp;
+}
+
+// binary scalar multiplication operator
+ Matrix
+operator * (const Matrix& m, const float& no) 
+{
+   Matrix temp = m;
+   temp *= no;
+   return temp;
+}
+
+
+// binary scalar multiplication operator
+ Matrix
+operator * (const float& no, const Matrix& m) 
+{
+   return (m * no);
+}
+
+// binary Matrix multiplication operator
+ Matrix
+operator * (const Matrix& m1, const Matrix& m2) 
+{
+   Matrix temp = m1;
+   temp *= m2;
+   return temp;
+}
+
+// binary scalar division operator
+ Matrix
+operator / (const Matrix& m, const float& no) 
+{
+    return (m * (float(1) / no));
+}
+
+
+// binary scalar division operator
+ Matrix
+operator / (const float& no, const Matrix& m) 
+{
+    return (!m * no);
+}
+
+// binary Matrix division operator
+ Matrix
+operator / (const Matrix& m1, const Matrix& m2) 
+{
+    return (m1 * !m2);
+}
+
+// binary power operator
+ Matrix
+operator ^ (const Matrix& m, const size_t& pow) 
+{
+   Matrix temp = m;
+   temp ^= pow;
+   return temp;
+}
+
+// unary transpose operator
+ Matrix
+operator ~ (const Matrix& m) 
+{
+   Matrix temp(m.ColNo(),m.RowNo());
+
+   for (size_t i=0; i < m.RowNo(); i++)
+      for (size_t j=0; j < m.ColNo(); j++)
+      {
+         float x = m(i,j);
+	      temp(j,i) = x;
+      }
+   return temp;
+}
+
+// unary inversion operator
+ Matrix
+operator ! (const Matrix m) 
+{
+   Matrix temp = m;
+   return temp.Inv();
+}
+
+// inversion function
+ Matrix
+Matrix::Inv () 
+{
+   size_t i,j,k;
+   float a1,a2,*rowptr;
+
+   if (_m->Row != _m->Col)
+      printf( "Matrix::operator!: Inversion of a non-square Matrix\n");
+
+   Matrix temp(_m->Row,_m->Col);
+   if (_m->Refcnt > 1) clone();
+
+
+   temp.Unit();
+   for (k=0; k < _m->Row; k++)
+   {
+      int indx = pivot(k);
+      if (indx == -1)
+	      printf( "Matrix::operator!: Inversion of a singular Matrix\n");
+
+      if (indx != 0)
+      {
+	      rowptr = temp._m->Val[k];
+	      temp._m->Val[k] = temp._m->Val[indx];
+	      temp._m->Val[indx] = rowptr;
+      }
+      a1 = _m->Val[k][k];
+      for (j=0; j < _m->Row; j++)
+      {
+	      _m->Val[k][j] /= a1;
+	      temp._m->Val[k][j] /= a1;
+      }
+      for (i=0; i < _m->Row; i++)
+	   if (i != k)
+	   {
+	      a2 = _m->Val[i][k];
+	      for (j=0; j < _m->Row; j++)
+	      {
+	         _m->Val[i][j] -= a2 * _m->Val[k][j];
+	         temp._m->Val[i][j] -= a2 * temp._m->Val[k][j];
+	      }
+	   }
+   }
+   return temp;
+}
+
+// solve simultaneous equation
+ Matrix
+Matrix::Solve (const Matrix& v) const 
+{
+   size_t i,j,k;
+   float a1;
+
+   if (!(_m->Row == _m->Col && _m->Col == v._m->Row))
+      printf( "Matrix::Solve():Inconsistent matrices!\n");
+
+   Matrix temp(_m->Row,_m->Col+v._m->Col);
+   for (i=0; i < _m->Row; i++)
+   {
+      for (j=0; j < _m->Col; j++)
+	 temp._m->Val[i][j] = _m->Val[i][j];
+      for (k=0; k < v._m->Col; k++)
+	 temp._m->Val[i][_m->Col+k] = v._m->Val[i][k];
+   }
+   for (k=0; k < _m->Row; k++)
+   {
+      int indx = temp.pivot(k);
+      if (indx == -1)
+	 printf( "Matrix::Solve(): Singular Matrix!\n");
+
+      a1 = temp._m->Val[k][k];
+      for (j=k; j < temp._m->Col; j++)
+	 temp._m->Val[k][j] /= a1;
+
+      for (i=k+1; i < _m->Row; i++)
+      {
+	 a1 = temp._m->Val[i][k];
+	 for (j=k; j < temp._m->Col; j++)
+	   temp._m->Val[i][j] -= a1 * temp._m->Val[k][j];
+      }
+   }
+   Matrix s(v._m->Row,v._m->Col);
+   for (k=0; k < v._m->Col; k++)
+      for (int m=int(_m->Row)-1; m >= 0; m--)
+      {
+	 s._m->Val[m][k] = temp._m->Val[m][_m->Col+k];
+	 for (j=m+1; j < _m->Col; j++)
+	    s._m->Val[m][k] -= temp._m->Val[m][j] * s._m->Val[j][k];
+      }
+   return s;
+}
+
+// set zero to all elements of this Matrix
+ void
+Matrix::Null (const size_t& row, const size_t& col) 
+{
+    if (row != _m->Row || col != _m->Col)
+	realloc( row,col);
+
+    if (_m->Refcnt > 1) 
+	clone();
+
+    for (size_t i=0; i < _m->Row; i++)
+	for (size_t j=0; j < _m->Col; j++)
+	    _m->Val[i][j] = float(0);
+    return;
+}
+
+// set zero to all elements of this Matrix
+ void
+Matrix::Null() 
+{
+    if (_m->Refcnt > 1) clone();   
+    for (size_t i=0; i < _m->Row; i++)
+	for (size_t j=0; j < _m->Col; j++)
+		_m->Val[i][j] = float(0);
+    return;
+}
+
+// set this Matrix to unity
+ void
+Matrix::Unit (const size_t& row) 
+{
+    if (row != _m->Row || row != _m->Col)
+	realloc( row, row);
+	
+    if (_m->Refcnt > 1) 
+	clone();
+
+    for (size_t i=0; i < _m->Row; i++)
+	for (size_t j=0; j < _m->Col; j++)
+	    _m->Val[i][j] = i == j ? float(1) : float(0);
+    return;
+}
+
+// set this Matrix to unity
+ void
+Matrix::Unit () 
+{
+    if (_m->Refcnt > 1) clone();   
+    size_t row = min(_m->Row,_m->Col);
+    _m->Row = _m->Col = row;
+
+    for (size_t i=0; i < _m->Row; i++)
+	for (size_t j=0; j < _m->Col; j++)
+	    _m->Val[i][j] = i == j ? float(1) : float(0);
+    return;
+}
+
+// private partial pivoting method
+ int
+Matrix::pivot (size_t row)
+{
+  int k = int(row);
+  double amax,temp;
+
+  amax = -1;
+  for (size_t i=row; i < _m->Row; i++)
+    if ( (temp = abs( _m->Val[i][row])) > amax && temp != 0.0)
+     {
+       amax = temp;
+       k = i;
+     }
+  if (_m->Val[k][row] == float(0))
+     return -1;
+  if (k != int(row))
+  {
+     float* rowptr = _m->Val[k];
+     _m->Val[k] = _m->Val[row];
+     _m->Val[row] = rowptr;
+     return k;
+  }
+  return 0;
+}
+
+// calculate the determinant of a Matrix
+ float
+Matrix::Det () const 
+{
+   size_t i,j,k;
+   float piv,detVal = float(1);
+
+   if (_m->Row != _m->Col)
+      printf( "Matrix::Det(): Determinant a non-squareMatrix!\n");
+   
+   Matrix temp(*this);
+   if (temp._m->Refcnt > 1) temp.clone();
+
+   for (k=0; k < _m->Row; k++)
+   {
+      int indx = temp.pivot(k);
+      if (indx == -1)
+	 return 0;
+      if (indx != 0)
+	 detVal = - detVal;
+      detVal = detVal * temp._m->Val[k][k];
+      for (i=k+1; i < _m->Row; i++)
+      {
+	 piv = temp._m->Val[i][k] / temp._m->Val[k][k];
+	 for (j=k+1; j < _m->Row; j++)
+	    temp._m->Val[i][j] -= piv * temp._m->Val[k][j];
+      }
+   }
+   return detVal;
+}
+
+// calculate the norm of a Matrix
+ float
+Matrix::Norm () 
+{
+   float retVal = float(0);
+
+   for (size_t i=0; i < _m->Row; i++)
+      for (size_t j=0; j < _m->Col; j++)
+	 retVal += _m->Val[i][j] * _m->Val[i][j];
+   retVal = sqrt( retVal);
+
+   return retVal;
+}
+
+// calculate the condition number of a Matrix
+ float
+Matrix::Cond () 
+{
+   Matrix inv = ! (*this);
+   return (Norm() * inv.Norm());
+}
+
+// calculate the cofactor of a Matrix for a given element
+ float
+Matrix::Cofact (size_t row, size_t col) 
+{
+   size_t i,i1,j,j1;
+
+   if (_m->Row != _m->Col)
+      printf( "Matrix::Cofact(): Cofactor of a non-square Matrix!\n");
+
+   if (row > _m->Row || col > _m->Col)
+      printf( "Matrix::Cofact(): Index out of range!\n");
+
+   Matrix temp (_m->Row-1,_m->Col-1);
+
+   for (i=i1=0; i < _m->Row; i++)
+   {
+      if (i == row)
+	continue;
+      for (j=j1=0; j < _m->Col; j++)
+      {
+	 if (j == col)
+	    continue;
+	 temp._m->Val[i1][j1] = _m->Val[i][j];
+	 j1++;
+      }
+      i1++;
+   }
+   float  cof = temp.Det();
+   if ((row+col)%2 == 1)
+      cof = -cof;
+
+   return cof;
+}
+
+
+// calculate adjoin of a Matrix
+ Matrix
+Matrix::Adj () 
+{
+   if (_m->Row != _m->Col)
+      printf( "Matrix::Adj(): Adjoin of a non-square Matrix.\n");
+
+   Matrix temp(_m->Row,_m->Col);
+
+   for (size_t i=0; i < _m->Row; i++)
+      for (size_t j=0; j < _m->Col; j++)
+	  temp._m->Val[j][i] = Cofact(i,j);
+   return temp;
+}
+
+// Determine if the Matrix is singular
+ bool
+Matrix::IsSingular () 
+{
+   if (_m->Row != _m->Col)
+      return false;
+   return (Det() == float(0));
+}
+
+// Determine if the Matrix is diagonal
+ bool
+Matrix::IsDiagonal () 
+{
+   if (_m->Row != _m->Col)
+      return false;
+   for (size_t i=0; i < _m->Row; i++)
+     for (size_t j=0; j < _m->Col; j++)
+	if (i != j && _m->Val[i][j] != float(0))
+	  return false;
+   return true;
+}
+
+// Determine if the Matrix is scalar
+ bool
+Matrix::IsScalar () 
+{
+   if (!IsDiagonal())
+     return false;
+   float v = _m->Val[0][0];
+   for (size_t i=1; i < _m->Row; i++)
+     if (_m->Val[i][i] != v)
+	return false;
+   return true;
+}
+
+// Determine if the Matrix is a unit Matrix
+ bool
+Matrix::IsUnit () 
+{
+   if (IsScalar() && _m->Val[0][0] == float(1))
+     return true;
+   return false;
+}
+
+// Determine if this is a null Matrix
+ bool
+Matrix::IsNull () 
+{
+   for (size_t i=0; i < _m->Row; i++)
+      for (size_t j=0; j < _m->Col; j++)
+	 if (_m->Val[i][j] != float(0))
+	    return false;
+   return true;
+}
+
+// Determine if the Matrix is symmetric
+ bool
+Matrix::IsSymmetric () 
+{
+   if (_m->Row != _m->Col)
+      return false;
+   for (size_t i=0; i < _m->Row; i++)
+      for (size_t j=0; j < _m->Col; j++)
+	 if (_m->Val[i][j] != _m->Val[j][i])
+	    return false;
+   return true;
+}
+	   
+// Determine if the Matrix is skew-symmetric
+ bool
+Matrix::IsSkewSymmetric () 
+{
+   if (_m->Row != _m->Col)
+      return false;
+   for (size_t i=0; i < _m->Row; i++)
+      for (size_t j=0; j < _m->Col; j++)
+	 if (_m->Val[i][j] != -_m->Val[j][i])
+	    return false;
+   return true;
+}
+   
+// Determine if the Matrix is upper triangular
+ bool
+Matrix::IsUpperTriangular () 
+{
+   if (_m->Row != _m->Col)
+      return false;
+   for (size_t i=1; i < _m->Row; i++)
+      for (size_t j=0; j < i-1; j++)
+	 if (_m->Val[i][j] != float(0))
+	    return false;
+   return true;
+}
+
+// Determine if the Matrix is lower triangular
+ bool
+Matrix::IsLowerTriangular () 
+{
+   if (_m->Row != _m->Col)
+      return false;
+
+   for (size_t j=1; j < _m->Col; j++)
+      for (size_t i=0; i < j-1; i++)
+	 if (_m->Val[i][j] != float(0))
+	    return false;
+
+   return true;
+}
+
Index: /orxonox/branches/trackManager/src/lib/math/matrix.h
===================================================================
--- /orxonox/branches/trackManager/src/lib/math/matrix.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/math/matrix.h	(revision 3498)
@@ -0,0 +1,110 @@
+#ifndef _MATRIX_H
+#define _MATRIX_H
+
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <iostream>
+
+using namespace std;
+
+class Matrix
+{
+public:
+  // Constructors
+  Matrix (const Matrix& m);
+  Matrix (size_t row, size_t col);
+  
+  // Destructor
+  ~Matrix ();
+  
+  // Assignment operators
+  Matrix& operator = (const Matrix& m) ;
+  
+  // Value extraction method
+  size_t RowNo () const { return _m->Row; }
+  size_t ColNo () const { return _m->Col; }
+  
+  // Subscript operator
+  float& operator () (size_t row, size_t col);
+   float  operator () (size_t row, size_t col) const;
+
+   // Unary operators
+   Matrix operator + ()  { return *this; }
+   Matrix operator - () ;
+
+   // Combined assignment - calculation operators
+   Matrix& operator += (const Matrix& m);
+   Matrix& operator -= (const Matrix& m);
+   Matrix& operator *= (const Matrix& m);
+   Matrix& operator *= (const float& c) ;
+   Matrix& operator /= (const float& c) ;
+   Matrix& operator ^= (const size_t& pow);
+
+   // Miscellaneous -methods
+   void Null (const size_t& row, const size_t& col) ;
+   void Null () ;
+   void Unit (const size_t& row) ;
+   void Unit () ;
+   void SetSize (size_t row, size_t col) ;
+
+   // Utility methods
+   Matrix Solve (const Matrix& v) const;
+   Matrix Adj ();
+   Matrix Inv ();
+   float Det () const;
+   float Norm () ;
+   float Cofact (size_t row, size_t col);
+   float Cond () ;
+
+   // Type of matrices
+   bool IsSquare ()  { return (_m->Row == _m->Col); } 
+   bool IsSingular ();
+   bool IsDiagonal ();
+   bool IsScalar ();
+   bool IsUnit ();
+   bool IsNull ();
+   bool IsSymmetric ();
+   bool IsSkewSymmetric ();
+   bool IsUpperTriangular ();
+   bool IsLowerTriangular ();
+
+private:
+   struct base_mat
+    {
+	float **Val;
+	size_t Row, Col, RowSiz, ColSiz;
+	int Refcnt;
+
+	base_mat (size_t row, size_t col, float** v)
+	{
+	    Row = row; RowSiz = row;
+	    Col = col; ColSiz = col;
+	    Refcnt = 1;
+
+	    Val = new float* [row];
+	    size_t rowlen = col * sizeof(float);
+
+	    for (size_t i=0; i < row; i++)
+	    {
+		Val[i] = new float [col];
+		if (v) memcpy( Val[i], v[i], rowlen);
+	    }
+	}
+	~base_mat ()
+	{
+	    for (size_t i=0; i < RowSiz; i++)
+		delete [] Val[i];
+	    delete [] Val;
+	}
+    };
+    base_mat *_m;
+
+    void clone ();
+    void realloc (size_t row, size_t col);
+    int pivot (size_t row);
+};
+
+Matrix operator ! (const Matrix m);
+
+#endif /*_MATRIX_H */
Index: /orxonox/branches/trackManager/src/lib/math/vector.cc
===================================================================
--- /orxonox/branches/trackManager/src/lib/math/vector.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/math/vector.cc	(revision 3498)
@@ -0,0 +1,856 @@
+
+
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: Christian Meyer 
+   co-programmer: Patrick Boenzli : Vector::scale()
+                                    Vector::abs()
+   
+   Quaternion code borrowed from an Gamasutra article by Nick Bobick and Ken Shoemake
+*/
+
+
+#include "vector.h"
+
+
+using namespace std;
+
+/**
+   \brief add two vectors
+   \param v: the other vector
+   \return the sum of both vectors
+*/
+Vector Vector::operator+ (const Vector& v) const
+{
+  Vector r;
+
+  r.x = x + v.x;
+  r.y = y + v.y;
+  r.z = z + v.z;
+  
+  return r;
+}
+
+/**
+   \brief subtract a vector from another
+   \param v: the other vector
+   \return the difference between the vectors
+*/
+Vector Vector::operator- (const Vector& v) const
+{
+  Vector r;
+  
+  r.x = x - v.x;
+  r.y = y - v.y;
+  r.z = z - v.z;
+  
+  return r;
+}
+
+/**
+   \brief calculate the dot product of two vectors
+   \param v: the other vector
+   \return the dot product of the vectors
+*/
+float Vector::operator* (const Vector& v) const
+{
+  return x*v.x+y*v.y+z*v.z;
+}
+
+/**
+   \brief multiply a vector with a float
+   \param f: the factor
+   \return the vector multipied by f
+*/
+Vector Vector::operator* (float f) const
+{  
+  Vector r;
+  
+  r.x = x * f;
+  r.y = y * f;
+  r.z = z * f;
+  
+  return r;
+}
+
+/**
+   \brief divide a vector with a float
+   \param f: the divisor
+   \return the vector divided by f   
+*/
+Vector Vector::operator/ (float f) const
+{
+  Vector r;
+  
+  if( f == 0.0)
+  {
+    // Prevent divide by zero
+    return Vector (0,0,0);
+  }
+  
+  r.x = x / f;
+  r.y = y / f;
+  r.z = z / f;
+  
+  return r;
+}
+
+/**
+   \brief calculate the dot product of two vectors
+   \param v: the other vector
+   \return the dot product of the vectors
+*/
+float Vector::dot (const Vector& v) const
+{
+  return x*v.x+y*v.y+z*v.z;
+}
+
+/**
+  \brief calculate the cross product of two vectors
+  \param v: the other vector
+	\return the cross product of the vectors
+*/
+Vector Vector::cross (const Vector& v) const
+{
+  Vector r;
+  
+  r.x = y * v.z - z * v.y;
+  r.y = z * v.x - x * v.z;
+  r.z = x * v.y - y * v.x;
+  
+  return r;
+}
+  
+/**
+   \brief normalizes the vector to lenght 1.0
+*/
+void Vector::normalize ()
+{
+  float l = len();
+  
+  if( l == 0.0)
+  {
+    // Prevent divide by zero
+    return;
+  }
+  
+  x = x / l;
+  y = y / l;
+  z = z / l;
+}
+
+
+/**
+   \brief returns the voctor normalized to length 1.0
+*/
+
+Vector* Vector::getNormalized()
+{
+  float l = len();
+  if(l != 1.0)
+    {
+      return this;
+    }
+  else if(l == 0.0)
+    {
+      return 0;
+    }
+  
+  Vector *normalizedVector = new Vector(x / l, y /l, z / l);
+  return normalizedVector;
+}
+
+/**
+   \brief scales this Vector with Vector v.
+   \param v the vector to scale this vector with
+*/
+void Vector::scale(const Vector& v)
+{
+  x *= v.x;
+  y *= v.y;
+  z *= v.z;
+}
+
+ 
+/**
+   \brief calculates the lenght of the vector
+   \return the lenght of the vector
+*/
+float Vector::len () const
+{
+  return sqrt (x*x+y*y+z*z);
+}
+
+
+/**
+   \brief Vector is looking in the positive direction on all axes after this
+*/
+Vector Vector::abs() 
+{
+  Vector v(fabs(x), fabs(y), fabs(z));
+  return v;
+}
+
+
+/**
+   \brief calculate the angle between two vectors in radiances
+   \param v1: a vector
+   \param v2: another vector
+   \return the angle between the vectors in radians
+*/
+float angleRad (const Vector& v1, const Vector& v2)
+{
+  return acos( v1 * v2 / (v1.len() * v2.len()));
+}
+
+
+/**
+   \brief calculate the angle between two vectors in degrees
+   \param v1: a vector
+   \param v2: another vector
+   \return the angle between the vectors in degrees
+*/
+float angleDeg (const Vector& v1, const Vector& v2)
+{
+  float f;
+  f = acos( v1 * v2 / (v1.len() * v2.len()));
+  return f * 180 / PI;
+}
+
+/**
+	\brief creates a multiplicational identity Quaternion
+*/
+Quaternion::Quaternion ()
+{
+	w = 1;
+	v = Vector(0,0,0);
+}
+
+/**
+	\brief turns a rotation along an axis into a Quaternion
+	\param angle: the amount of radians to rotate
+	\param axis: the axis to rotate around
+*/
+Quaternion::Quaternion (float angle, const Vector& axis)
+{
+	w = cos(angle/2);
+	v = axis * sin(angle/2);
+}
+
+/**
+   \brief calculates a lookAt rotation
+   \param dir: the direction you want to look
+   \param up: specify what direction up should be
+   
+   Mathematically this determines the rotation a (0,0,1)-Vector has to undergo to point
+   the same way as dir. If you want to use this with cameras, you'll have to reverse the
+   dir Vector (Vector(0,0,0) - your viewing direction) or you'll point the wrong way. You
+   can use this for meshes as well (then you do not have to reverse the vector), but keep 
+   in mind that if you do that, the model's front has to point in +z direction, and left 
+   and right should be -x or +x respectively or the mesh wont rotate correctly.
+*/
+Quaternion::Quaternion (const Vector& dir, const Vector& up)
+{
+  Vector z = dir;
+  z.normalize(); 
+  Vector x = up.cross(z);
+  x.normalize(); 
+  Vector y = z.cross(x);
+  
+  float m[4][4];
+  m[0][0] = x.x;
+  m[0][1] = x.y;
+  m[0][2] = x.z;
+  m[0][3] = 0;
+  m[1][0] = y.x;
+  m[1][1] = y.y;
+  m[1][2] = y.z;
+  m[1][3] = 0;
+  m[2][0] = z.x;
+  m[2][1] = z.y;
+  m[2][2] = z.z;
+  m[2][3] = 0;
+  m[3][0] = 0;
+  m[3][1] = 0;
+  m[3][2] = 0;
+  m[3][3] = 1;
+  
+  *this = Quaternion (m);
+}
+
+/**
+	\brief calculates a rotation from euler angles
+	\param roll: the roll in radians
+	\param pitch: the pitch in radians
+	\param yaw: the yaw in radians
+	
+	I DO HONESTLY NOT EXACTLY KNOW WHICH ANGLE REPRESENTS WHICH ROTATION. And I do not know 
+	in what order they are applied,	I just copy-pasted the code.
+*/
+Quaternion::Quaternion (float roll, float pitch, float yaw)
+{
+	float cr, cp, cy, sr, sp, sy, cpcy, spsy;
+	
+	// calculate trig identities
+	cr = cos(roll/2);
+	cp = cos(pitch/2);
+	cy = cos(yaw/2);
+	
+	sr = sin(roll/2);
+	sp = sin(pitch/2);
+	sy = sin(yaw/2);
+	
+	cpcy = cp * cy;
+	spsy = sp * sy;
+	
+	w = cr * cpcy + sr * spsy;
+	v.x = sr * cpcy - cr * spsy;
+	v.y = cr * sp * cy + sr * cp * sy;
+	v.z = cr * cp * sy - sr * sp * cy;
+}
+
+/**
+	\brief rotates one Quaternion by another
+	\param q: another Quaternion to rotate this by
+	\return a quaternion that represents the first one rotated by the second one (WARUNING: this operation is not commutative! e.g. (A*B) != (B*A))
+*/
+Quaternion Quaternion::operator*(const Quaternion& q) const
+{
+	float A, B, C, D, E, F, G, H;
+	Quaternion r;
+	
+	A = (w   + v.x)*(q.w   + q.v.x);
+	B = (v.z - v.y)*(q.v.y - q.v.z);
+	C = (w   - v.x)*(q.v.y + q.v.z); 
+	D = (v.y + v.z)*(q.w   - q.v.x);
+	E = (v.x + v.z)*(q.v.x + q.v.y);
+	F = (v.x - v.z)*(q.v.x - q.v.y);
+	G = (w   + v.y)*(q.w   - q.v.z);
+	H = (w   - v.y)*(q.w   + q.v.z);
+	
+	r.w = B +  (-E - F + G + H)/2;
+	r.v.x = A - (E + F + G + H)/2; 
+	r.v.y = C + (E - F + G - H)/2; 
+	r.v.z = D + (E - F - G + H)/2;
+	
+	return r;
+}
+
+/**
+	\brief add two Quaternions
+	\param q: another Quaternion
+	\return the sum of both Quaternions
+*/
+Quaternion Quaternion::operator+(const Quaternion& q) const
+{
+	Quaternion r(*this);
+	r.w = r.w + q.w;
+	r.v = r.v + q.v;
+	return r;
+}
+
+/**
+	\brief subtract two Quaternions
+	\param q: another Quaternion
+	\return the difference of both Quaternions
+*/
+Quaternion Quaternion::operator- (const Quaternion& q) const
+{
+	Quaternion r(*this);
+	r.w = r.w - q.w;
+	r.v = r.v - q.v;
+	return r;
+}
+
+/**
+	\brief rotate a Vector by a Quaternion
+	\param v: the Vector
+	\return a new Vector representing v rotated by the Quaternion
+*/
+Vector Quaternion::apply (Vector& v) const
+{
+	Quaternion q;
+	q.v = v;
+	q.w = 0;
+	q = *this * q * conjugate();
+	return q.v;
+}
+
+/**
+	\brief multiply a Quaternion with a real value
+	\param f: a real value
+	\return a new Quaternion containing the product
+*/
+Quaternion Quaternion::operator*(const float& f) const
+{
+	Quaternion r(*this);
+	r.w = r.w*f;
+	r.v = r.v*f;
+	return r;
+}
+
+/**
+	\brief divide a Quaternion by a real value
+	\param f: a real value
+	\return a new Quaternion containing the quotient
+*/
+Quaternion Quaternion::operator/(const float& f) const
+{
+	if( f == 0) return Quaternion();
+	Quaternion r(*this);
+	r.w = r.w/f;
+	r.v = r.v/f;
+	return r;
+}
+
+/**
+	\brief calculate the conjugate value of the Quaternion
+	\return the conjugate Quaternion
+*/
+Quaternion Quaternion::conjugate() const
+{
+	Quaternion r(*this);
+	r.v = Vector() - r.v;
+	return r;
+}
+
+/**
+	\brief calculate the norm of the Quaternion
+	\return the norm of The Quaternion
+*/
+float Quaternion::norm() const
+{
+	return w*w + v.x*v.x + v.y*v.y + v.z*v.z;
+}
+
+/**
+	\brief calculate the inverse value of the Quaternion
+	\return the inverse Quaternion
+	
+	Note that this is equal to conjugate() if the Quaternion's norm is 1
+*/
+Quaternion Quaternion::inverse() const
+{
+	float n = norm();
+	if (n != 0)
+	{
+		return conjugate() / norm();
+	}
+	else return Quaternion();
+}
+
+/**
+	\brief convert the Quaternion to a 4x4 rotational glMatrix
+	\param m: a buffer to store the Matrix in
+*/
+void Quaternion::matrix (float m[4][4]) const
+{
+  float wx, wy, wz, xx, yy, yz, xy, xz, zz, x2, y2, z2; 
+  
+  // calculate coefficients
+  x2 = v.x + v.x;
+  y2 = v.y + v.y; 
+  z2 = v.z + v.z;
+  xx = v.x * x2; xy = v.x * y2; xz = v.x * z2;
+  yy = v.y * y2; yz = v.y * z2; zz = v.z * z2;
+  wx = w * x2; wy = w * y2; wz = w * z2;
+  
+  m[0][0] = 1.0 - (yy + zz); m[1][0] = xy - wz;
+  m[2][0] = xz + wy; m[3][0] = 0.0;
+	
+  m[0][1] = xy + wz; m[1][1] = 1.0 - (xx + zz);
+  m[2][1] = yz - wx; m[3][1] = 0.0;
+  
+  m[0][2] = xz - wy; m[1][2] = yz + wx;
+  m[2][2] = 1.0 - (xx + yy); m[3][2] = 0.0;
+  
+  m[0][3] = 0; m[1][3] = 0;
+  m[2][3] = 0; m[3][3] = 1;
+}
+
+/**
+   \brief performs a smooth move.
+   \param from from where
+   \param to to where
+   \param t the time this transformation should take
+   \param res The approximation-density
+*/
+void Quaternion::quatSlerp(const Quaternion* from, const Quaternion* to, float t, Quaternion* res)
+{
+  float tol[4];
+  double omega, cosom, sinom, scale0, scale1;
+  DELTA = 0.2;
+
+  cosom = from->v.x * to->v.x + from->v.y * to->v.y + from->v.z * to->v.z + from->w * to->w;
+
+  if( cosom < 0.0 ) 
+    { 
+      cosom = -cosom; 
+      tol[0] = -to->v.x;
+      tol[1] = -to->v.y;
+      tol[2] = -to->v.z;
+      tol[3] = -to->w;
+    }
+  else
+    {
+      tol[0] = to->v.x;
+      tol[1] = to->v.y;
+      tol[2] = to->v.z;
+      tol[3] = to->w;
+    }
+  
+  //if( (1.0 - cosom) > DELTA )
+  //{
+      omega = acos(cosom);
+      sinom = sin(omega);
+      scale0 = sin((1.0 - t) * omega) / sinom;
+      scale1 = sin(t * omega) / sinom;
+      //}
+      /*
+  else
+    {
+      scale0 = 1.0 - t;
+      scale1 = t;
+    }
+      */
+  res->v.x = scale0 * from->v.x + scale1 * tol[0];
+  res->v.y = scale0 * from->v.y + scale1 * tol[1];
+  res->v.z = scale0 * from->v.z + scale1 * tol[2];
+  res->w = scale0 * from->w + scale1 * tol[3];
+}
+
+
+/**
+   \brief convert a rotational 4x4 glMatrix into a Quaternion
+   \param m: a 4x4 matrix in glMatrix order
+*/
+Quaternion::Quaternion (float m[4][4])
+{
+	
+  float  tr, s, q[4];
+  int    i, j, k;
+
+  int nxt[3] = {1, 2, 0};
+
+  tr = m[0][0] + m[1][1] + m[2][2];
+
+  	// check the diagonal
+  if (tr > 0.0) 
+  {
+    s = sqrt (tr + 1.0);
+    w = s / 2.0;
+    s = 0.5 / s;
+    v.x = (m[1][2] - m[2][1]) * s;
+    v.y = (m[2][0] - m[0][2]) * s;
+    v.z = (m[0][1] - m[1][0]) * s;
+	} 
+	else 
+	{
+ 		// diagonal is negative
+  	i = 0;
+  	if (m[1][1] > m[0][0]) i = 1;
+    if (m[2][2] > m[i][i]) i = 2;
+    j = nxt[i];
+    k = nxt[j];
+
+    s = sqrt ((m[i][i] - (m[j][j] + m[k][k])) + 1.0);
+      
+    q[i] = s * 0.5;
+            
+    if (s != 0.0) s = 0.5 / s;
+	
+	  q[3] = (m[j][k] - m[k][j]) * s;
+    q[j] = (m[i][j] + m[j][i]) * s;
+    q[k] = (m[i][k] + m[k][i]) * s;
+
+  	v.x = q[0];
+  	v.y = q[1];
+  	v.z = q[2];
+  	w = q[3];
+  }
+}
+
+/**
+   \brief create a rotation from a vector
+   \param v: a vector
+*/
+Rotation::Rotation (const Vector& v)
+{
+  Vector x = Vector( 1, 0, 0);
+  Vector axis = x.cross( v);
+  axis.normalize();
+  float angle = angleRad( x, v);
+  float ca = cos(angle);
+  float sa = sin(angle);
+  m[0] = 1.0f+(1.0f-ca)*(axis.x*axis.x-1.0f);
+  m[1] = -axis.z*sa+(1.0f-ca)*axis.x*axis.y;
+  m[2] = axis.y*sa+(1.0f-ca)*axis.x*axis.z;
+  m[3] = axis.z*sa+(1.0f-ca)*axis.x*axis.y;
+  m[4] = 1.0f+(1.0f-ca)*(axis.y*axis.y-1.0f);
+  m[5] = -axis.x*sa+(1.0f-ca)*axis.y*axis.z;
+  m[6] = -axis.y*sa+(1.0f-ca)*axis.x*axis.z;
+  m[7] = axis.x*sa+(1.0f-ca)*axis.y*axis.z;
+  m[8] = 1.0f+(1.0f-ca)*(axis.z*axis.z-1.0f);
+}
+
+/**
+   \brief creates a rotation from an axis and an angle (radians!)
+   \param axis: the rotational axis
+   \param angle: the angle in radians
+*/
+Rotation::Rotation (const Vector& axis, float angle)
+{
+  float ca, sa;
+  ca = cos(angle);
+  sa = sin(angle);
+  m[0] = 1.0f+(1.0f-ca)*(axis.x*axis.x-1.0f);
+  m[1] = -axis.z*sa+(1.0f-ca)*axis.x*axis.y;
+  m[2] = axis.y*sa+(1.0f-ca)*axis.x*axis.z;
+  m[3] = axis.z*sa+(1.0f-ca)*axis.x*axis.y;
+  m[4] = 1.0f+(1.0f-ca)*(axis.y*axis.y-1.0f);
+  m[5] = -axis.x*sa+(1.0f-ca)*axis.y*axis.z;
+  m[6] = -axis.y*sa+(1.0f-ca)*axis.x*axis.z;
+  m[7] = axis.x*sa+(1.0f-ca)*axis.y*axis.z;
+  m[8] = 1.0f+(1.0f-ca)*(axis.z*axis.z-1.0f);
+}
+
+/**
+   \brief creates a rotation from euler angles (pitch/yaw/roll)
+   \param pitch: rotation around z (in radians)
+   \param yaw: rotation around y (in radians)
+   \param roll: rotation around x (in radians)
+*/
+Rotation::Rotation ( float pitch, float yaw, float roll)
+{
+  float cy, sy, cr, sr, cp, sp;
+  cy = cos(yaw);
+  sy = sin(yaw);
+  cr = cos(roll);
+  sr = sin(roll);
+  cp = cos(pitch);
+  sp = sin(pitch);
+  m[0] = cy*cr;
+  m[1] = -cy*sr;
+  m[2] = sy;
+  m[3] = cp*sr+sp*sy*cr;
+  m[4] = cp*cr-sp*sr*sy;
+  m[5] = -sp*cy;
+  m[6] = sp*sr-cp*sy*cr;
+  m[7] = sp*cr+cp*sy*sr;
+  m[8] = cp*cy;
+}
+
+/**
+   \brief creates a nullrotation (an identity rotation)
+*/
+Rotation::Rotation ()
+{
+  m[0] = 1.0f;
+  m[1] = 0.0f;
+  m[2] = 0.0f;
+  m[3] = 0.0f;
+  m[4] = 1.0f;
+  m[5] = 0.0f;
+  m[6] = 0.0f;
+  m[7] = 0.0f;
+  m[8] = 1.0f;
+}
+
+/**
+   \brief fills the specified buffer with a 4x4 glmatrix
+   \param buffer: Pointer to an array of 16 floats
+   
+   Use this to get the rotation in a gl-compatible format
+*/
+void Rotation::glmatrix (float* buffer)
+{
+	buffer[0] = m[0];
+	buffer[1] = m[3];
+	buffer[2] = m[6];
+	buffer[3] = m[0];
+	buffer[4] = m[1];
+	buffer[5] = m[4];
+	buffer[6] = m[7];
+	buffer[7] = m[0];
+	buffer[8] = m[2];
+	buffer[9] = m[5];
+	buffer[10] = m[8];
+	buffer[11] = m[0];
+	buffer[12] = m[0];
+	buffer[13] = m[0];
+	buffer[14] = m[0];
+	buffer[15] = m[1];
+}
+
+/**
+   \brief multiplies two rotational matrices
+   \param r: another Rotation
+   \return the matrix product of the Rotations
+   
+   Use this to rotate one rotation by another
+*/
+Rotation Rotation::operator* (const Rotation& r)
+{
+	Rotation p;
+	
+	p.m[0] = m[0]*r.m[0] + m[1]*r.m[3] + m[2]*r.m[6];
+	p.m[1] = m[0]*r.m[1] + m[1]*r.m[4] + m[2]*r.m[7];
+	p.m[2] = m[0]*r.m[2] + m[1]*r.m[5] + m[2]*r.m[8];
+	
+	p.m[3] = m[3]*r.m[0] + m[4]*r.m[3] + m[5]*r.m[6];
+	p.m[4] = m[3]*r.m[1] + m[4]*r.m[4] + m[5]*r.m[7];
+	p.m[5] = m[3]*r.m[2] + m[4]*r.m[5] + m[5]*r.m[8];
+
+	p.m[6] = m[6]*r.m[0] + m[7]*r.m[3] + m[8]*r.m[6];
+	p.m[7] = m[6]*r.m[1] + m[7]*r.m[4] + m[8]*r.m[7];
+	p.m[8] = m[6]*r.m[2] + m[7]*r.m[5] + m[8]*r.m[8];
+	
+	return p;
+}
+
+
+/**
+   \brief rotates the vector by the given rotation
+   \param v: a vector
+   \param r: a rotation
+   \return the rotated vector
+*/
+Vector rotateVector( const Vector& v, const Rotation& r)
+{
+  Vector t;
+  
+  t.x = v.x * r.m[0] + v.y * r.m[1] + v.z * r.m[2];
+  t.y = v.x * r.m[3] + v.y * r.m[4] + v.z * r.m[5];
+  t.z = v.x * r.m[6] + v.y * r.m[7] + v.z * r.m[8];
+
+  return t;
+}
+
+/**
+   \brief calculate the distance between two lines
+   \param l: the other line
+   \return the distance between the lines
+*/
+float Line::distance (const Line& l) const
+{
+  float q, d;
+  Vector n = a.cross(l.a);
+  q = n.dot(r-l.r);
+  d = n.len();
+  if( d == 0.0) return 0.0;
+  return q/d;
+}
+
+/**
+   \brief calculate the distance between a line and a point
+   \param v: the point
+   \return the distance between the Line and the point
+*/
+float Line::distancePoint (const Vector& v) const
+{
+  Vector d = v-r;
+  Vector u = a * d.dot( a);
+  return (d - u).len();
+}
+
+/**
+   \brief calculate the two points of minimal distance of two lines
+   \param l: the other line
+   \return a Vector[2] (!has to be deleted after use!) containing the two points of minimal distance
+*/
+Vector* Line::footpoints (const Line& l) const
+{
+  Vector* fp = new Vector[2];
+  Plane p = Plane (r + a.cross(l.a), r, r + a);
+  fp[1] = p.intersectLine (l);
+  p = Plane (fp[1], l.a);
+  fp[0] = p.intersectLine (*this);
+  return fp;
+}
+
+/**
+  \brief calculate the length of a line
+  \return the lenght of the line 
+*/
+float Line::len() const
+{
+  return a.len();
+}
+
+/**
+   \brief rotate the line by given rotation
+   \param rot: a rotation
+*/
+void Line::rotate (const Rotation& rot)
+{
+  Vector t = a + r;
+  t = rotateVector( t, rot);
+  r = rotateVector( r, rot),
+  a = t - r;
+}
+
+/**
+   \brief create a plane from three points
+   \param a: first point
+   \param b: second point
+   \param c: third point
+*/
+Plane::Plane (Vector a, Vector b, Vector c)
+{
+  n = (a-b).cross(c-b);
+  k = -(n.x*b.x+n.y*b.y+n.z*b.z);
+}
+
+/**
+   \brief create a plane from anchor point and normal
+   \param norm: normal vector
+   \param p: anchor point
+*/
+Plane::Plane (Vector norm, Vector p)
+{
+  n = norm;
+  k = -(n.x*p.x+n.y*p.y+n.z*p.z);
+}
+
+/**
+   \brief returns the intersection point between the plane and a line
+   \param l: a line
+*/
+Vector Plane::intersectLine (const Line& l) const
+{
+  if (n.x*l.a.x+n.y*l.a.y+n.z*l.a.z == 0.0) return Vector(0,0,0);
+  float t = (n.x*l.r.x+n.y*l.r.y+n.z*l.r.z+k) / (n.x*l.a.x+n.y*l.a.y+n.z*l.a.z);
+  return l.r + (l.a * t);
+}
+
+/**
+   \brief returns the distance between the plane and a point
+   \param p: a Point
+   \return the distance between the plane and the point (can be negative)
+*/
+float Plane::distancePoint (const Vector& p) const
+{
+  float l = n.len();
+  if( l == 0.0) return 0.0;
+  return (n.dot(p) + k) / n.len();
+}
+
+/**
+   \brief returns the side a point is located relative to a Plane
+   \param p: a Point
+   \return 0 if the point is contained within the Plane, positive(negative) if the point is in the positive(negative) semi-space of the Plane
+*/
+float Plane::locatePoint (const Vector& p) const
+{
+  return (n.dot(p) + k);
+}
+
Index: /orxonox/branches/trackManager/src/lib/math/vector.h
===================================================================
--- /orxonox/branches/trackManager/src/lib/math/vector.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/math/vector.h	(revision 3498)
@@ -0,0 +1,154 @@
+/*! 
+    \file vector.h
+    \brief A basic 3D math framework
+    
+    Contains classes to handle vectors, lines, rotations and planes
+*/ 
+
+#ifndef _VECTOR_H
+#define _VECTOR_H
+
+#include <math.h>
+//! PI the circle-constant
+#define PI 3.14159265359f
+
+//! 3D Vector
+/**
+	Class to handle 3D Vectors
+*/
+class Vector {
+
+  public:
+ 
+  float x; //!< The x Coordinate of the Vector.
+  float y; //!< The y Coordinate of the Vector.
+  float z; //!< The z Coordinate of the Vector.
+
+  Vector (float x, float y, float z) : x(x), y(y), z(z) {}  //!< assignment constructor
+  Vector () : x(0), y(0), z(0) {}
+  ~Vector () {}
+
+  Vector operator+ (const Vector& v) const;
+  Vector operator- (const Vector& v) const;
+  float operator* (const Vector& v) const;
+  Vector operator* (float f) const;
+  Vector operator/ (float f) const;
+  float dot (const Vector& v) const;
+  Vector cross (const Vector& v) const;
+  void scale(const Vector& v);
+  float len() const;
+  void normalize();
+  Vector* getNormalized();
+  Vector abs();
+};
+
+float angleDeg (const Vector& v1, const Vector& v2);
+float angleRad (const Vector& v1, const Vector& v2);
+
+//! Quaternion
+/**
+	Class to handle 3-dimensional rotation efficiently
+*/
+class Quaternion
+{
+ public:
+	Vector v;	//!< Imaginary Vector
+	float w;        //!< Real part of the number
+
+ 	Quaternion ();
+ 	Quaternion (float m[4][4]);
+ 	Quaternion (float angle, const Vector& axis);
+ 	Quaternion (const Vector& dir, const Vector& up);
+ 	Quaternion (float roll, float pitch, float yaw);
+ 	
+ 	Quaternion operator/ (const float& f) const;
+ 	Quaternion operator* (const float& f) const;
+ 	Quaternion operator* (const Quaternion& q) const;
+	Quaternion operator+ (const Quaternion& q) const;
+	Quaternion operator- (const Quaternion& q) const;
+	Quaternion conjugate () const;
+	Quaternion inverse () const;
+ 	Vector apply (Vector& f) const;
+	float norm () const;
+	void matrix (float m[4][4]) const;
+	void quatSlerp(const Quaternion* from, const Quaternion* to, const float t, Quaternion* res);
+
+ private:
+	float DELTA;      //!< resolution of calculation
+
+};
+
+//! 3D rotation (OBSOLETE)
+/**
+  Class to handle 3-dimensional rotations.
+  Can create a rotation from several inputs, currently stores rotation using a 3x3 Matrix
+*/
+class Rotation {
+  public:
+  
+  float m[9]; //!< 3x3 Rotation Matrix
+  
+  Rotation ( const Vector& v);
+  Rotation ( const Vector& axis, float angle);
+  Rotation ( float pitch, float yaw, float roll);
+  Rotation ();
+  ~Rotation () {}
+  
+  Rotation operator* (const Rotation& r);
+  
+  void glmatrix (float* buffer);
+};
+
+//!< Apply a rotation to a vector
+Vector rotateVector( const Vector& v, const Rotation& r);
+
+//! 3D line
+/**
+  Class to store Lines in 3-dimensional space
+
+  Supports line-to-line distance measurements and rotation
+*/
+class Line
+{
+  public:
+  
+  Vector r;   //!< Offset
+  Vector a;   //!< Direction
+  
+  Line ( Vector r, Vector a) : r(r), a(a) {}  //!< assignment constructor
+  Line () : r(Vector(0,0,0)), a(Vector (1,1,1)) {}
+  ~Line () {}
+  
+  float distance (const Line& l) const;
+  float distancePoint (const Vector& v) const;
+  Vector* footpoints (const Line& l) const;
+  float len () const;
+  
+  void rotate(const Rotation& rot);
+};
+
+//! 3D plane
+/**
+  Class to handle planes in 3-dimensional space
+  
+  Critical for polygon-based collision detection
+*/
+class Plane
+{
+  public:
+  
+  Vector n;   //!< Normal vector
+  float k;    //!< Offset constant
+  
+  Plane (Vector a, Vector b, Vector c);
+  Plane (Vector norm, Vector p);
+  Plane (Vector n, float k) : n(n), k(k) {} //!< assignment constructor
+  Plane () : n(Vector(1,1,1)), k(0) {}
+  ~Plane () {}
+  
+  Vector intersectLine (const Line& l) const;
+  float distancePoint (const Vector& p) const;
+  float locatePoint (const Vector& p) const;
+};
+
+#endif /* _VECTOR_H */
Index: /orxonox/branches/trackManager/src/lib/util/ini_parser.cc
===================================================================
--- /orxonox/branches/trackManager/src/lib/util/ini_parser.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/util/ini_parser.cc	(revision 3498)
@@ -0,0 +1,163 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: Christian Meyer
+   co-programmer: ...
+*/
+
+
+#include "ini_parser.h"
+
+using namespace std;
+
+/**
+	\brief constructs an IniParser using a file
+	\param filename: the path and name of the file to parse
+*/
+IniParser::IniParser (char* filename)
+{
+  stream = NULL;
+  bInSection = false;
+  openFile(filename);
+}
+
+/**
+	\brief removes the IniParser from memory
+*/
+IniParser::~IniParser ()
+{
+  if( stream != NULL) fclose (stream);
+}
+
+/**
+   \brief opens another file to parse
+   \param filename: path and name of the new file to parse
+   \return zero on success or -1 if an error occured;
+*/
+int IniParser::openFile( char* filename)
+{
+  if( filename == NULL) return -1;
+  if( stream != NULL)	fclose (stream);
+  if( (stream = fopen (filename, "r")) == NULL)
+    {
+      printf("IniParser could not open %s\n", filename);
+      return -1;
+    }
+  bInSection = false;
+  return 0;
+}
+
+/**
+   \brief set the parsing cursor to the specified section
+   \param section: the name of the section to set the cursor to
+   \return zero on success or -1 if the section could not be found
+*/
+int IniParser::getSection( char* section)
+{
+  bInSection = false;
+  if( stream == NULL) return -1;
+  
+  char linebuffer[PARSELINELENGHT];
+  char secbuffer[PARSELINELENGHT];
+  char* ptr;
+  
+  rewind (stream);
+  while( !feof( stream))
+    {
+      // get next line
+      fgets (linebuffer, PARSELINELENGHT, stream);
+      // remove newline char
+      if( (ptr = strchr( linebuffer, '\n')) != NULL) *ptr = 0;
+      // check for section identifyer
+      if( sscanf (linebuffer, "[%s", secbuffer) == 1)
+	{
+	  if( (ptr = strchr( secbuffer, ']')) != NULL)
+	    {
+	      *ptr = 0;
+	      if( !strcmp( secbuffer, section))
+		{
+		  bInSection = true;
+		  return 0;
+		}
+	    }
+	}
+    }
+  return -1;
+}
+
+/**
+   \brief gets the next VarName=VarValue pair from the parsing stream
+   \param name: a pointer to a buffer to store the name of the entry
+   \param value: a pointer to a buffer to store the value of the entry
+   \return zero if the buffers have been filled with data or -1 if there are no entries left in the current section
+*/
+int IniParser::nextVar( char* name, char* value)
+{
+  if( stream == NULL)
+    {
+      bInSection = false;
+      return -1;
+    }
+  if( !bInSection) return -1;
+  
+  char linebuffer[PARSELINELENGHT];
+  char* ptr;
+  
+  while( !feof( stream))
+    {
+      // get next line
+      fgets (linebuffer, PARSELINELENGHT, stream);
+      // remove newline char
+      if( (ptr = strchr( linebuffer, '\n')) != NULL) *ptr = 0;
+      if( linebuffer[0] == '[')
+	{
+	  bInSection = false;
+	  return -1;
+	}
+      if( (ptr = strchr( linebuffer, '=')) != NULL)
+	{
+	  if( ptr == linebuffer) continue;
+	  strcpy (value, &ptr[1]);
+	  strncpy (name, linebuffer, strlen (linebuffer) - strlen (value) - 1);
+	  return 0;
+	}
+    }
+  return -1;	
+}
+
+/**
+   \brief directly acesses an entry in a section
+   \param name: the name of the entry to find
+   \param section: the section where the entry is to be found
+   \param defvalue: what should be returned in case the entry cannot be found
+   \return a pointer to a buffer conatining the value of the specified entry. This buffer will contain the data specified in defvalue in case the entry wasn't found
+   
+   The returned pointer points to an internal buffer, so do not free it on your own. Do not give a NULL pointer to defvalue, this will certainly
+   lead to unwanted behaviour.
+*/
+char* IniParser::getVar( char* name, char* section, char* defvalue = "")
+{
+  strcpy (internbuf, defvalue);
+  if( getSection (section) == -1) return internbuf;
+  
+  char namebuf[PARSELINELENGHT];
+  char valuebuf[PARSELINELENGHT];
+  
+  while( nextVar (namebuf, valuebuf) != -1)
+    {
+      if( !strcmp (name, namebuf))
+	{
+	  strcpy (internbuf, valuebuf);
+	  return internbuf;
+	}
+    }
+  return internbuf;
+}
Index: /orxonox/branches/trackManager/src/lib/util/ini_parser.h
===================================================================
--- /orxonox/branches/trackManager/src/lib/util/ini_parser.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/util/ini_parser.h	(revision 3498)
@@ -0,0 +1,37 @@
+/*!
+    \file ini_parser.h
+    \brief A small ini file parser
+    
+    Can be used to find a defined [Section] in an ini file and get the VarName=Value entries
+*/
+
+#ifndef _INI_PARSER_H
+#define _INI_PARSER_H
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#define PARSELINELENGHT 512
+
+//! ini-file parser
+/**
+	This class can be used to load an initializer file and parse it's contents for variablename=value pairs.
+*/
+class IniParser {
+ private:
+	FILE* stream;
+	bool bInSection;
+	char internbuf[PARSELINELENGHT];
+	
+ public:
+  IniParser (char* filename);
+  ~IniParser ();
+  
+  char* getVar( char* name, char* section, char* defvalue);
+	int openFile( char* name);
+  int getSection( char* section);
+  int nextVar( char* name, char* value);
+};
+
+#endif /* _INI_PARSER_H */
Index: /orxonox/branches/trackManager/src/lib/util/list.cc
===================================================================
--- /orxonox/branches/trackManager/src/lib/util/list.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/util/list.cc	(revision 3498)
@@ -0,0 +1,148 @@
+
+
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: Patrick Boenzli
+   co-programmer: ...
+*/
+
+
+#include "list.h"
+#include "world_entity.h"
+
+using namespace std;
+
+
+
+List::List () 
+{
+  this->first = NULL;
+  this->last = NULL;
+  this->size = 0;
+}
+
+List::~List () 
+{}
+
+
+void List::add(WorldEntity* entity)
+{
+  printf("List::add() \n");
+  listElement* el = new listElement;
+  el->prev = this->last;
+  el->curr = entity;
+  el->next = NULL;
+
+  this->last = el;
+
+  if(this->size == 0) this->first = el;
+  else el->prev->next = el;
+  this->size++;
+}
+
+
+void List::remove(WorldEntity* entity)
+{
+  this->currentEl = this->first;
+  listElement* te;
+  while( this->currentEl != NULL)
+    {
+      if( this->currentEl->curr == entity)
+	{
+	  printf("List::remove() - object found\n");
+	  
+	  if( this->currentEl->prev  == NULL ) this->first = this->currentEl->next;
+	  else this->currentEl->prev->next = this->currentEl->next;
+
+	  if( this->currentEl->next == NULL) this->last = this->currentEl->prev;
+	  else this->currentEl->next->prev = this->currentEl->prev;
+
+	  te = this->currentEl->next;
+	  delete this->currentEl;
+	  this->currentEl = te;
+	  return;
+	}
+      this->currentEl = this->currentEl->next;
+    }
+}
+
+
+void List::destroy()
+{
+  printf("List::clear() - clearing all world objects, releasing mem\n");
+  this->currentEl = this->first;
+  listElement* le = NULL;
+  while(this->currentEl != NULL)
+    {
+      le = this->currentEl->next;
+      delete this->currentEl->curr;
+      delete this->currentEl;
+      this->currentEl = le;
+    }
+  this->first = NULL;
+  this->last = NULL;
+  this->size = 0;
+}
+
+
+WorldEntity* List::firstElement()
+{
+  return this->first->curr;
+}
+
+
+bool List::isEmpty()
+{
+  return (this->size==0)?true:false;
+}
+
+
+int List::getSize()
+{
+  return this->size;
+}
+
+
+WorldEntity* List::enumerate()
+{
+  if(this->size == 0) return NULL;
+  this->currentEl = this->first;
+  return this->currentEl->curr;
+}
+
+
+WorldEntity* List::nextElement()
+{
+  if(this->size == 0) return NULL;
+  this->currentEl = this->currentEl->next;
+  if(this->currentEl == NULL) return NULL;
+  return this->currentEl->curr;
+}
+
+
+WorldEntity* List::toArray()
+{}
+
+
+void List::debug()
+{
+  int counter = 1;
+  this->currentEl = this->first;
+  printf("List:debug() =====================\n");
+  while(this->currentEl != NULL)
+    {
+      printf("element: nr %d/%d\n", counter, size);
+      this->currentEl = this->currentEl->next;
+      counter++;
+    }
+  printf("List:debug()END =====================\n");
+}
Index: /orxonox/branches/trackManager/src/lib/util/list.h
===================================================================
--- /orxonox/branches/trackManager/src/lib/util/list.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/util/list.h	(revision 3498)
@@ -0,0 +1,207 @@
+
+#ifndef _LIST_H
+#define _LIST_H
+
+#include "stdincl.h"
+
+//! An enum to list all the modes available when adding an object to a List
+//enum ADDMODE {LIST_ADD_FIRST, LIST_ADD_LAST};
+//! An enum to list the two searching directions available when removing an object from a List
+//enum FINDMODE {LIST_FIND_BW, LIST_FIND_FW};
+
+
+
+class WorldEntity;
+
+class List {
+
+ public:
+  List ();
+  ~List ();
+
+  void add(WorldEntity* entity);
+  void remove(WorldEntity* entity);
+  void destroy();
+  WorldEntity* firstElement();
+  bool isEmpty();
+  int getSize();
+  WorldEntity* enumerate();
+  WorldEntity* nextElement();
+  WorldEntity* toArray();
+  void debug();
+
+ private:
+  struct listElement
+  {
+    listElement* prev;
+    WorldEntity* curr;
+    listElement* next;
+  };
+  Uint32 size;
+  listElement* first;
+  listElement* last;
+  listElement* currentEl;
+
+
+};
+
+class Iterator
+{
+
+ public:
+  bool hasNext();
+  WorldEntity* next();
+
+ private:
+
+};
+
+
+template<class T> class tList 
+{
+ private:
+  struct listElement
+  {
+    listElement* prev;
+    T* curr;
+    listElement* next;
+  };
+
+  Uint32 size;
+  listElement* first;
+  listElement* last;
+  listElement* currentEl;
+  
+ public:
+  tList ();
+  ~tList ();
+  
+
+  void add(T* entity);
+  void remove(T* entity);
+  void destroy();
+  T* firstElement();
+  bool isEmpty();
+  int getSize();
+  T* enumerate();
+  T* nextElement();
+  T* toArray();
+  void debug();
+};
+
+
+template<class T>
+tList<T>::tList () 
+{
+  this->first = NULL;
+  this->last = NULL;
+  this->size = 0;
+}
+
+template<class T>
+tList<T>::~tList () 
+{}
+
+template<class T>
+void tList<T>::add(T* entity)
+{
+  listElement* el = new listElement;
+  el->prev = this->last;
+  el->curr = entity;
+  el->next = NULL;
+
+  this->last = el;
+
+  if(this->size == 0) this->first = el;
+  else el->prev->next = el;
+  this->size++;
+}
+
+
+template<class T>
+void tList<T>::remove(T* entity)
+{
+  this->currentEl = this->first;
+  listElement* te;
+  while( this->currentEl != NULL)
+    {
+      if( this->currentEl->curr == entity)
+	{ 
+	  if( this->currentEl->prev  == NULL ) this->first = this->currentEl->next;
+	  else this->currentEl->prev->next = this->currentEl->next;
+
+	  if( this->currentEl->next == NULL) this->last = this->currentEl->prev;
+	  else this->currentEl->next->prev = this->currentEl->prev;
+
+	  te = this->currentEl->next;
+	  delete this->currentEl;
+	  this->currentEl = te;
+	  return;
+	}
+      this->currentEl = this->currentEl->next;
+    }
+}
+
+
+template<class T>
+void tList<T>::destroy()
+{
+  this->currentEl = this->first;
+  while(this->currentEl != NULL)
+    {
+      listElement* le = this->currentEl->next;
+      delete this->currentEl->curr;
+      delete this->currentEl;
+      this->currentEl = le;
+    }
+  this->first = NULL;
+  this->last = NULL;
+  this->size = 0;
+}
+
+
+template<class T>
+T* tList<T>::firstElement()
+{
+  return this->first->curr;
+}
+
+
+template<class T>
+bool tList<T>::isEmpty()
+{
+  return (this->size==0)?true:false;
+}
+
+
+template<class T>
+int tList<T>::getSize()
+{
+  return this->size;
+}
+
+
+template<class T>
+T* tList<T>::enumerate()
+{
+  if(this->size == 0) return NULL;
+  this->currentEl = this->first;
+  return this->currentEl->curr;
+}
+
+
+template<class T>
+T* tList<T>::nextElement()
+{
+  if(this->size == 0) return NULL;
+  this->currentEl = this->currentEl->next;
+  if(this->currentEl == NULL) return NULL;
+  return this->currentEl->curr;
+}
+
+
+template<class T>
+T* tList<T>::toArray()
+{}
+
+#endif /* _LIST_H */
Index: /orxonox/branches/trackManager/src/lib/util/list_template.h
===================================================================
--- /orxonox/branches/trackManager/src/lib/util/list_template.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/lib/util/list_template.h	(revision 3498)
@@ -0,0 +1,308 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: Christian Meyer
+
+   ADDONS/FIXES:
+  
+   Patrick Boenzli     :          Implemented getSize() function
+*/
+
+
+/*!
+  \file list.h
+  \brief Contains a template for a doubly linked list
+*/
+
+#ifndef _LIST_TEMPLATE_H
+#define _LIST_TEMPLATE_H
+
+#include "stdincl.h"
+
+//! An enum to list all the modes available when adding an object to a List
+enum ADDMODE {LIST_ADD_NEXT, LIST_ADD_PREV, LIST_ADD_FIRST, LIST_ADD_LAST};
+//! An enum to list the two searching directions available when removing an object from a List
+enum FINDMODE {LIST_FIND_BW, LIST_FIND_FW};
+
+//! A generic doubly linked list
+template<class T> class ListTemplate 
+{
+  T* object;
+  ListTemplate<T>* next;
+  ListTemplate<T>* prev;
+  bool bReference;
+  int size;
+  
+ public:
+  ListTemplate (T* obj, ListTemplate<T>* n, ListTemplate<T>* p, bool bRef);
+  ~ListTemplate ();
+  
+  int add(T* obj, ADDMODE mode, bool bRef);
+  T* getObject();
+  ListTemplate<T>* getNext();
+  ListTemplate<T>* getPrevious();
+  ListTemplate<T>* getLast();
+  ListTemplate<T>* getFirst();
+  void setNext(ListTemplate<T>* ptr);
+  void setPrev(ListTemplate<T>* ptr);
+  int remove (T* obj, FINDMODE mode);
+  int getSize();
+  void destroy();
+};
+
+
+/**
+  \brief Standard constructor
+  
+  Call this without any parameters to generate a new ListTemplate which can be filled with content.
+  DO NOT create a ListTemplate element that contains an object on your own, you'll lose the data
+  contained in that object and will have trouble removing the list from your memory.
+*/
+template<class T>
+ListTemplate<T>::ListTemplate (T* obj = NULL, ListTemplate<T>* n = NULL, ListTemplate<T>* p = NULL, bool bRef = false)
+{
+  object = obj;
+  next = n;
+  prev = p;
+  bReference = bRef;
+  if(obj != NULL)
+    ++size;
+}
+
+/**
+  \brief Standard destructor
+  
+  Call this on the initially generated base ListTemplate element to remove the whole ListTemplate from the memory.
+  You can safely do this to any ListTemplate element you want without messing up the rest of the ListTemplate, but keep in mind
+  that the contained object will be deleted as well when bRef had been set to false.
+*/
+template<class T>
+ListTemplate<T>::~ListTemplate ()
+{
+  if (object == NULL) // deleted foot node => disband the list
+  {
+    while( next != NULL)
+    {
+      delete next;
+    }
+    while( prev != NULL)
+    {
+      delete prev;
+    }
+  }
+  else
+  {
+    if (prev != NULL) prev->setNext (next);
+    if (next != NULL) next->setPrev (prev);
+    if (!bReference) delete object;
+  }
+}
+ 
+/**
+  \brief Add an object to the ListTemplate
+  \param obj: A pointer to an allocated object
+  \param mode: A Value of ADDMODE (default: LIST_ADD_NEXT)
+  \param bRef: Sets whether the element is serving as a storage point or a simple listing (default: false)
+  \return 0 if the operation succeded, -1 if the element could not be added
+  
+  This adds a new ListTemplate element to the chain. The mode parameter can be used to specify
+  the location where the element should be added. LIST_ADD_NEXT will add the new element directly
+  after the base element. LIST_ADD_PREV will add the new element directly before the base element.
+  LIST_ADD_FIRST will add the element at the beginning of the ListTemplate whereas LIST_ADD_LAST will add
+  it to the end of the chain. If the bRef parameter is set to true, the object pointer will not be deleted
+  when the element containing that object is deleted, thus the ListTemplate can be used for temporary listings as
+  well as permanent data storage.
+*/
+template<class T> 
+int ListTemplate<T>::add (T* obj, ADDMODE mode = LIST_ADD_NEXT, bool bRef = false)
+{
+  ListTemplate<T>* p;
+  if( obj == NULL) return -1;
+  switch (mode)
+  {
+    case LIST_ADD_NEXT:
+      p = new ListTemplate<T>( obj, next, this, bRef);
+      if( next != NULL) next->setPrev (p);
+      next = p;
+      break;
+    case LIST_ADD_PREV:
+      p = new ListTemplate<T>( obj, this, prev, bRef);
+      if( prev != NULL) prev->setNext (p);
+      prev = p;
+      break;
+    case LIST_ADD_FIRST:
+      if (prev == NULL) prev = new ListTemplate<T> (obj, this, NULL, bRef);
+      else return prev->add (obj, mode, bRef);
+      break;
+    case LIST_ADD_LAST:
+      if (next == NULL) next = new ListTemplate<T> (obj, NULL, this, bRef);
+      else return next->add (obj, mode, bRef);
+      break;
+    default:
+        return -1;
+      break;
+  }
+  ++size;
+  return 0;
+}
+
+/**
+  \brief Get the next element of the ListTemplate
+  \return The ListTemplate element after the current ListTemplate element
+*/
+template<class T>
+ListTemplate<T>* ListTemplate<T>::getNext ()
+{
+  return next;
+}
+ 
+/**
+  \brief Get the previous element of the ListTemplate
+  \return The ListTemplate element before the current ListTemplate element
+*/
+template<class T>
+ListTemplate<T>* ListTemplate<T>::getPrevious ()
+{
+  return prev;
+}
+
+/**
+  \brief Get the last element of the ListTemplate
+  \return The last ListTemplate element
+*/
+template<class T>
+ListTemplate<T>* ListTemplate<T>::getLast ()
+{
+  if (next == NULL) return this;
+  else return next->getLast();
+}
+
+/**
+  \brief Get the first element of the ListTemplate
+  \return The first ListTemplate element
+*/
+template<class T>
+ListTemplate<T>* ListTemplate<T>::getFirst ()
+{
+  if (prev == NULL) return this;
+  else return prev->getFirst();
+}
+
+/**
+  \brief Removes a certain element from the ListTemplate
+  \param obj: A pointer to the object that should be removed
+  \param mode: A value of FINDMODE
+  \return 0 if the element was found and removed, -1 if the element was not found
+  
+  This searches the part of the ListTemplate specified with mode for the object in question.
+  When the object is found it is deleted and the ListTemplate element is removed from the chain.
+  If mode is LIST_FIND_FW all elements AFTER the base element are searched, if mode is
+  LIST_FIND_BW all elements BEFORE the base element are searched. Note that the object
+  contained within the ListTemplate element is NOT deleted when bRef was set to true.
+*/
+template<class T>
+int ListTemplate<T>::remove (T* obj, FINDMODE mode = LIST_FIND_FW)
+{
+  if (obj == NULL) return -1;
+  else
+  {
+    switch (mode)
+    {
+      case LIST_FIND_BW:
+        if (prev == NULL) return -1;
+        else
+        {
+          if( prev->getObject() == obj)
+          {
+            delete prev;
+          }
+          else
+          {
+            return prev->remove( obj, mode);
+          }
+        }
+        break;
+      case LIST_FIND_FW:
+        if (next == NULL) return -1;
+        else
+        {
+          if( next->getObject() == obj)
+          {
+            delete next;
+          }
+          else
+          {
+            return next->remove( obj, mode);
+          }
+        }
+        break;
+      default:
+        return -1;
+    }
+  }
+  --size;
+  return 0;
+}
+
+/**
+  \brief Set the next element of a ListTemplate element
+  \param ptr: A pointer to the new next element
+    
+  Sets the next element of a ListTemplate element... Better not touch this, it can really mess up a ListTemplate.
+*/
+template<class T>
+void ListTemplate<T>::setNext (ListTemplate<T>* ptr)
+{
+  next = ptr;
+}
+
+/**
+  \brief Set the prev element of a ListTemplate element
+  \param ptr: A pointer to the new previous element
+    
+  Sets the previous element of a ListTemplate element... Better not touch this, it can really mess up a ListTemplate.
+*/
+template<class T>
+void ListTemplate<T>::setPrev (ListTemplate<T>* ptr)
+{
+  prev = ptr;
+}
+
+/**
+  \brief Get the pointer to the object the element is containing
+  \return The contained object (will be NULL if called on the base element).
+*/
+template<class T>
+T* ListTemplate<T>::getObject()
+{
+  return object;
+}
+
+
+/**
+  \brief Returns the current size of the ListTemplate
+  \return Size of ListTemplate
+*/
+template<class T>
+int ListTemplate<T>::getSize()
+{
+  return this->size;
+}
+
+
+template<class T>
+void ListTemplate<T>::destroy()
+{
+  /* \todo at the moment - doing nothing. should delete everything */
+}
+
+#endif /* _LIST_TENMPLATE_H */
+
Index: /orxonox/branches/trackManager/src/light.cc
===================================================================
--- /orxonox/branches/trackManager/src/light.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/light.cc	(revision 3498)
@@ -0,0 +1,395 @@
+
+
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+   co-programmer: ...
+*/
+
+
+#include "light.h"
+
+#include "glincl.h"
+
+using namespace std;
+
+//! Definition of the Lights
+int lightsV[] = {GL_LIGHT0, GL_LIGHT1, GL_LIGHT2, GL_LIGHT3, GL_LIGHT4, GL_LIGHT5, GL_LIGHT6, GL_LIGHT7};
+
+
+/**
+   \brief standard constructor for a Light
+*/
+Light::Light () 
+{
+  this->setClassName ("Light");
+
+  glEnable (GL_LIGHTING);
+  this->setAmbientColor(.3, .3, .3);
+  this->lights = new LightValue*[NUMBEROFLIGHTS];
+  for (int i = 0; i < NUMBEROFLIGHTS; i++)
+    lights[i] = NULL;
+  this->currentLight = NULL;
+}
+
+/**
+   \brief standard deconstructor
+   
+   first disables Lighting
+   then deletes all the lights
+   then deletes the rest of the allocated memory
+   and in the end sets the singleton Reference to zero.
+*/
+Light::~Light () 
+{
+  glDisable(GL_LIGHTING);
+  
+  for (int i = 0; i < NUMBEROFLIGHTS; i++)
+    this->deleteLight(i);
+  delete lights;
+  Light::singletonRef = NULL;
+}
+
+/**
+   \brief singleton-Reference to the Light-class
+*/
+Light* Light::singletonRef = NULL;
+
+/**
+   \returns The Instance of the Lights
+*/
+Light* Light::getInstance(void)
+{
+  if (singletonRef)
+    return singletonRef;
+  else
+    return Light::singletonRef = new Light();
+}
+
+/**
+   \brief initializes a new Light with default values, and enables GL_LIGHTING
+*/
+void Light::init(int lightNumber)
+{
+  PRINTF(3)("initializing Light number %d.\n", lightNumber);
+  // enable The light
+  glEnable(lightsV[lightNumber]);
+  this->currentLight = lights[lightNumber] = new LightValue;
+  
+  // set default values
+  this->currentLight->lightNumber = lightNumber;
+  this->setPosition(0.0, 0.0, 0.0);
+  this->setDiffuseColor(1.0, 1.0, 1.0);
+  this->setSpecularColor(1.0, 1.0, 1.0);
+}
+
+/**
+   \brief Adds a new Light, by selecting the First free slot.
+
+   if no slot is free error
+*/
+int Light::addLight(void)
+{
+  for (int i = 0; i < NUMBEROFLIGHTS; i++)
+    if (!this->lights[i])
+      return addLight(i); 
+  PRINTF(1)("no more light slots availiable. All %d already taken\n", NUMBEROFLIGHTS);
+  return -1;
+}
+
+/**
+   \brief Adds a new Light
+   \param lightNumber The number of the light to add.
+
+   if the Number is not free: warn, automatically choose another slot.
+*/
+int Light::addLight(int lightNumber)
+{
+  if (this->lights[lightNumber])
+    {
+      PRINTF(2)("Lightslot %d is allready taken, trying another one\n", lightNumber);
+      return this->addLight();
+    }
+  this->init(lightNumber);
+  this->currentLight = this->lights[lightNumber];
+  return lightNumber;
+}
+
+/**
+   \brief select the light to work with
+   \param lightNumber the light to work with
+*/
+void Light::editLightNumber(int lightNumber)
+{
+  if (!this->currentLight)
+    { 
+      PRINTF(1)("no Light defined yet\n");
+      return;
+    }
+
+  this->currentLight = lights[lightNumber];
+}
+
+/**
+   \brief Delete the current Light
+*/
+void Light::deleteLight(void)
+{
+  if (!this->currentLight)
+    { 
+      PRINTF(1)("no Light defined yet\n");
+      return;
+    }
+
+  this->deleteLight(this->currentLight->lightNumber);
+}
+
+/**
+   \brief delete light.
+   \param lightNumber the number of the light to delete
+*/
+void Light::deleteLight(int lightNumber)
+{
+  if (this->lights[lightNumber])
+    {
+      PRINTF(3)("deleting Light number %d\n", lightNumber);
+      delete this->lights[lightNumber];
+      glDisable(lightsV[lightNumber]);
+      this->lights[lightNumber] = NULL;
+    }
+}
+
+// set Attributes
+/**
+   \brief Sets a Position for the Light.
+   \param position The new position of the Light.
+   \todo patrick: is it ok to set a Light Position even if it is derived from p_node??
+*/
+void Light::setPosition(Vector position)
+{
+  if (!this->currentLight)
+    { 
+      PRINTF(1)("no Light defined yet\n");
+      return;
+    }
+  this->currentLight->lightPosition[0] = position.x;
+  this->currentLight->lightPosition[1] = position.y;
+  this->currentLight->lightPosition[2] = position.z;
+  this->currentLight->lightPosition[3] = 0.0;
+
+  glLightfv (GL_LIGHT0, GL_POSITION, this->currentLight->lightPosition);
+}
+
+/**
+   \brief Sets a Position for the Light.
+   \param x the x-coordinate
+   \param y the y-coordinate
+   \param z the z-coordinate
+*/
+void Light::setPosition(GLfloat x, GLfloat y, GLfloat z)
+{
+  if (!this->currentLight)
+    { 
+      PRINTF(1)("no Light defined yet\n");
+      return;
+    }
+
+  this->currentLight->lightPosition[0] = x;
+  this->currentLight->lightPosition[1] = y;
+  this->currentLight->lightPosition[2] = z;
+  this->currentLight->lightPosition[3] = 0.0;
+
+  glLightfv (GL_LIGHT0, GL_POSITION, this->currentLight->lightPosition);
+}
+
+/**
+   \brief sets an emitting Diffuse color for the Light
+   \param r red
+   \param g green
+   \param b blue
+*/
+void Light::setDiffuseColor(GLfloat r, GLfloat g, GLfloat b)
+{
+  if (!this->currentLight)
+    { 
+      PRINTF(1)("no Light defined yet\n");
+      return;
+    }
+
+  this->currentLight->diffuseColor[0] = r;
+  this->currentLight->diffuseColor[1] = g;
+  this->currentLight->diffuseColor[2] = b;
+  this->currentLight->diffuseColor[3] = 1.0;
+
+  glLightfv (GL_LIGHT0, GL_DIFFUSE, this->currentLight->diffuseColor);
+}
+
+
+/**
+   \brief sets an emitting Ambient color for the Light
+   \param r red
+   \param g green
+   \param b blue
+*/
+void Light::setSpecularColor(GLfloat r, GLfloat g, GLfloat b)
+{
+  if (!this->currentLight)
+    { 
+      PRINTF(1)("no Light defined yet\n");
+      return;
+    }
+
+  this->currentLight->specularColor[0] = r;
+  this->currentLight->specularColor[1] = g;
+  this->currentLight->specularColor[2] = b;
+  this->currentLight->specularColor[3] = 1.0;
+
+  glLightfv (GL_LIGHT0, GL_SPECULAR, this->currentLight->specularColor);
+}
+
+/**
+   \brief Sets the AttenuationType of this Light Source
+   \param type the AttenuationType to set
+   \param factor the Factor to multipy the attenuation with
+
+   this actually just sets the following: glLightf(currentLight, type, factor)
+*/
+void Light::setAttenuation(AttenuationType type, float factor)
+{
+  if (!this->currentLight)
+    { 
+      PRINTF(1)("no Light defined yet\n");
+      return;
+    }
+  this->currentLight->attenuationFactor = factor;
+  this->currentLight->attenuationType = type;
+  switch (type)
+    {
+    case CONSTANT:
+      glLightf(lightsV[this->currentLight->lightNumber], GL_CONSTANT_ATTENUATION, factor);
+      break;
+    case LINEAR:
+      glLightf(lightsV[this->currentLight->lightNumber], GL_LINEAR_ATTENUATION, factor);
+      break;
+    case QUADRATIC:
+      glLightf(lightsV[this->currentLight->lightNumber], GL_QUADRATIC_ATTENUATION, factor);
+      break;
+    }
+}
+
+
+/**
+   \brief sets the ambient Color of the Scene
+   \param r red
+   \param g green
+   \param b blue
+*/
+void Light::setAmbientColor(GLfloat r, GLfloat g, GLfloat b)
+{
+  this->ambientColor[0] = r;
+  this->ambientColor[1] = g;
+  this->ambientColor[2] = b;
+  this->ambientColor[3] = 1.0;
+
+  glLightfv (GL_LIGHT0, GL_AMBIENT, this->ambientColor);
+}
+
+/**
+   \brief stets the direction of the Spot Light.
+   \param direction The direction of the Spot Light.
+*/
+void Light::setSpotDirection(Vector direction)
+{
+  this->currentLight->spotDirection[0] = direction.x;
+  this->currentLight->spotDirection[1] = direction.y;
+  this->currentLight->spotDirection[2] = direction.z;
+
+  glLightfv(lightsV[this->currentLight->lightNumber], GL_SPOT_DIRECTION, this->currentLight->spotDirection);
+}
+
+
+/**
+   \brief sets the cutoff angle of the Light.
+   \param cutoff The cutoff angle.
+*/
+void Light::setSpotCutoff(GLfloat cutoff)
+{
+  this->currentLight->spotCutoff = cutoff;
+  glLightf(lightsV[this->currentLight->lightNumber], GL_SPOT_CUTOFF, cutoff);
+}
+
+
+// get Attributes
+
+/**
+   \returns the Position of the Light
+*/
+Vector Light::getPosition(void)
+{
+  if (!this->currentLight)
+    { 
+      PRINTF(1)("no Light defined yet\n");
+      return Vector(.0, .0, .0);
+    }
+  else
+    return getPosition(currentLight->lightNumber);
+}
+
+
+
+
+/**
+   \brief outputs debug information about the Class and its lights
+*/
+void Light::debug(void)
+{
+  PRINT(0)("=================================\n");
+  PRINT(0)("= DEBUG INFORMATION CLASS LIGHT =\n");
+  PRINT(0)("=================================\n");
+  PRINT(0)("Reference: %p\n", Light::singletonRef);
+  if (this->currentLight)
+    PRINT(0)("current Light Nr: %d\n", this->currentLight->lightNumber);
+  PRINT(0)("Ambient Color: %f:%f:%f\n", this->ambientColor[0], this->ambientColor[0], this->ambientColor[0]);
+  PRINT(0)("=== Lights ===\n");
+  for (int i = 0; i < NUMBEROFLIGHTS; i++)
+    if (this->lights[i])
+      {
+	PRINT(0)(":: %d ::  -- reference %p\n", i, lights[i]);
+	PRINT(0)(" GL-state: ");
+	GLboolean param; 
+	glGetBooleanv(lightsV[i], &param);
+	if (param)
+	  PRINT(0)("ON\n");
+	else
+	  PRINT(0)("OFF\n");
+
+	if (i != lights[i]->lightNumber)
+	  PRINTF(1)(" Lights are out of sync, this really should not happen,\n   %d % should be equal.\n", i, lights[i]->lightNumber);
+	PRINT(0)(" Position:      %f/%f/%f\n", lights[i]->lightPosition[0], lights[i]->lightPosition[1], lights[i]->lightPosition[2]);
+	PRINT(0)(" DiffuseColor:  %f/%f/%f\n", lights[i]->diffuseColor[0], lights[i]->diffuseColor[1], lights[i]->diffuseColor[2]);
+	PRINT(0)(" SpecularColor: %f/%f/%f\n", lights[i]->specularColor[0], lights[i]->specularColor[1], lights[i]->specularColor[2]);
+	PRINT(0)(" Attenuation:   ");
+	switch (lights[i]->attenuationType)
+	  {
+	  case CONSTANT:
+	    PRINT(0)("constant");
+	  case LINEAR:
+	    PRINT(0)("linear");
+	    break;
+	  case QUADRATIC:
+	    PRINT(0)("quadratic");
+	    break;
+	  }
+	PRINT(0)(" with Factor %f\n", lights[i]->attenuationFactor);
+      }
+  PRINT(0)("--------------------------------\n");
+}
Index: /orxonox/branches/trackManager/src/light.h
===================================================================
--- /orxonox/branches/trackManager/src/light.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/light.h	(revision 3498)
@@ -0,0 +1,98 @@
+/*! 
+    \file light.h
+    \brief Handles Lights.
+
+    A Light is one of the more important things in a 3D-environment,
+    without it one sees nothing :)
+    It is here for diffuse-, specular- and Bump-Mappings.
+*/
+
+#ifndef _LIGHT_H
+#define _LIGHT_H
+
+#include "world_entity.h"
+#include "glincl.h"
+
+//! The maximum number of Lights this OpenGL-implementation supports
+#define NUMBEROFLIGHTS GL_MAX_LIGHTS
+
+//! Enumerator for the attenuation-Type.
+/**
+   CONSTANT means GL_CONSTANT_ATTENUATION
+   LINEAR means   GL_LINEAR_ATTENUATION
+   QUADRATIC means GL_QUADRATIC_ATTENUATION
+*/
+enum AttenuationType {CONSTANT, LINEAR, QUADRATIC};
+
+// FORWARD DEFINITIONS //
+class Vector;
+
+//! A class that handles Lights
+/**
+   A Light is a source that emits light rays (photons)
+*/
+class Light : public WorldEntity
+{
+ private:
+  //! A struct that holds information about a Light
+  struct LightValue
+  {
+    int lightNumber;            //!< The number of this Light.
+    GLfloat lightPosition[4];   //!< The Position of this Light.
+    GLfloat diffuseColor[4];    //!< The Diffuse Color this Light emmits.
+    GLfloat specularColor[4];   //!< The specular Color of this Light.
+    AttenuationType attenuationType;//!< The AttenuationType of this Light.
+    float attenuationFactor;    //!< The Factor the attenuation should have.
+    GLfloat spotDirection[4];   //!< The direction of the Spot Light.
+    GLfloat spotCutoff;         //!< The cutoff Angle of the Light Source
+  };
+
+  static Light* singletonRef;    //!< This is the LightHandlers Reference.
+  GLfloat ambientColor[4];       //!< The ambient Color of the scene.
+
+
+  Light(void);
+
+  void init(int LightNumber);  
+  LightValue** lights;           //!< An array of Lenght NUMBEROFLIGHTS, that holds pointers to all LightValues.
+  LightValue* currentLight;      //!< The current Light, we are working with.
+  
+ public:
+  static Light* getInstance();
+  ~Light(void);
+
+  // set Attributes
+  int addLight(void);
+  int addLight(int lightNumber);
+  void editLightNumber(int lightNumber);
+  void deleteLight(void);
+  void deleteLight(int lightNumber);
+
+  void setPosition(Vector position);
+  void setPosition(GLfloat x, GLfloat y, GLfloat z);
+  void setDiffuseColor(GLfloat r, GLfloat g, GLfloat b);
+  void setSpecularColor(GLfloat r, GLfloat g, GLfloat b);
+  void setAttenuation(AttenuationType type, float factor);
+  void setAmbientColor(GLfloat r, GLfloat g, GLfloat b);
+  void setSpotDirection(Vector direction);
+  void setSpotCutoff(GLfloat cutoff);
+
+  // get Attributes
+  Vector getPosition(void);
+  /**
+     \returns the Position of Light 
+     \param lightNumber lightnumber
+  */
+  inline Vector getPosition(int lightNumber)
+    {
+      if (!this->lights[lightNumber])
+	return Vector(.0,.0,.0);
+      return Vector(this->lights[lightNumber]->lightPosition[0],
+		    this->lights[lightNumber]->lightPosition[1],
+		    this->lights[lightNumber]->lightPosition[2]);
+    }
+
+  void debug(void);
+};
+
+#endif /* _LIGHT_H */
Index: xonox/branches/trackManager/src/list.cc
===================================================================
--- /orxonox/branches/trackManager/src/list.cc	(revision 3497)
+++ 	(revision )
@@ -1,148 +1,0 @@
-
-
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   ### File Specific:
-   main-programmer: Patrick Boenzli
-   co-programmer: ...
-*/
-
-
-#include "list.h"
-#include "world_entity.h"
-
-using namespace std;
-
-
-
-List::List () 
-{
-  this->first = NULL;
-  this->last = NULL;
-  this->size = 0;
-}
-
-List::~List () 
-{}
-
-
-void List::add(WorldEntity* entity)
-{
-  printf("List::add() \n");
-  listElement* el = new listElement;
-  el->prev = this->last;
-  el->curr = entity;
-  el->next = NULL;
-
-  this->last = el;
-
-  if(this->size == 0) this->first = el;
-  else el->prev->next = el;
-  this->size++;
-}
-
-
-void List::remove(WorldEntity* entity)
-{
-  this->currentEl = this->first;
-  listElement* te;
-  while( this->currentEl != NULL)
-    {
-      if( this->currentEl->curr == entity)
-	{
-	  printf("List::remove() - object found\n");
-	  
-	  if( this->currentEl->prev  == NULL ) this->first = this->currentEl->next;
-	  else this->currentEl->prev->next = this->currentEl->next;
-
-	  if( this->currentEl->next == NULL) this->last = this->currentEl->prev;
-	  else this->currentEl->next->prev = this->currentEl->prev;
-
-	  te = this->currentEl->next;
-	  delete this->currentEl;
-	  this->currentEl = te;
-	  return;
-	}
-      this->currentEl = this->currentEl->next;
-    }
-}
-
-
-void List::destroy()
-{
-  printf("List::clear() - clearing all world objects, releasing mem\n");
-  this->currentEl = this->first;
-  listElement* le = NULL;
-  while(this->currentEl != NULL)
-    {
-      le = this->currentEl->next;
-      delete this->currentEl->curr;
-      delete this->currentEl;
-      this->currentEl = le;
-    }
-  this->first = NULL;
-  this->last = NULL;
-  this->size = 0;
-}
-
-
-WorldEntity* List::firstElement()
-{
-  return this->first->curr;
-}
-
-
-bool List::isEmpty()
-{
-  return (this->size==0)?true:false;
-}
-
-
-int List::getSize()
-{
-  return this->size;
-}
-
-
-WorldEntity* List::enumerate()
-{
-  if(this->size == 0) return NULL;
-  this->currentEl = this->first;
-  return this->currentEl->curr;
-}
-
-
-WorldEntity* List::nextElement()
-{
-  if(this->size == 0) return NULL;
-  this->currentEl = this->currentEl->next;
-  if(this->currentEl == NULL) return NULL;
-  return this->currentEl->curr;
-}
-
-
-WorldEntity* List::toArray()
-{}
-
-
-void List::debug()
-{
-  int counter = 1;
-  this->currentEl = this->first;
-  printf("List:debug() =====================\n");
-  while(this->currentEl != NULL)
-    {
-      printf("element: nr %d/%d\n", counter, size);
-      this->currentEl = this->currentEl->next;
-      counter++;
-    }
-  printf("List:debug()END =====================\n");
-}
Index: xonox/branches/trackManager/src/list.h
===================================================================
--- /orxonox/branches/trackManager/src/list.h	(revision 3497)
+++ 	(revision )
@@ -1,207 +1,0 @@
-
-#ifndef _LIST_H
-#define _LIST_H
-
-#include "stdincl.h"
-
-//! An enum to list all the modes available when adding an object to a List
-//enum ADDMODE {LIST_ADD_FIRST, LIST_ADD_LAST};
-//! An enum to list the two searching directions available when removing an object from a List
-//enum FINDMODE {LIST_FIND_BW, LIST_FIND_FW};
-
-
-
-class WorldEntity;
-
-class List {
-
- public:
-  List ();
-  ~List ();
-
-  void add(WorldEntity* entity);
-  void remove(WorldEntity* entity);
-  void destroy();
-  WorldEntity* firstElement();
-  bool isEmpty();
-  int getSize();
-  WorldEntity* enumerate();
-  WorldEntity* nextElement();
-  WorldEntity* toArray();
-  void debug();
-
- private:
-  struct listElement
-  {
-    listElement* prev;
-    WorldEntity* curr;
-    listElement* next;
-  };
-  Uint32 size;
-  listElement* first;
-  listElement* last;
-  listElement* currentEl;
-
-
-};
-
-class Iterator
-{
-
- public:
-  bool hasNext();
-  WorldEntity* next();
-
- private:
-
-};
-
-
-template<class T> class tList 
-{
- private:
-  struct listElement
-  {
-    listElement* prev;
-    T* curr;
-    listElement* next;
-  };
-
-  Uint32 size;
-  listElement* first;
-  listElement* last;
-  listElement* currentEl;
-  
- public:
-  tList ();
-  ~tList ();
-  
-
-  void add(T* entity);
-  void remove(T* entity);
-  void destroy();
-  T* firstElement();
-  bool isEmpty();
-  int getSize();
-  T* enumerate();
-  T* nextElement();
-  T* toArray();
-  void debug();
-};
-
-
-template<class T>
-tList<T>::tList () 
-{
-  this->first = NULL;
-  this->last = NULL;
-  this->size = 0;
-}
-
-template<class T>
-tList<T>::~tList () 
-{}
-
-template<class T>
-void tList<T>::add(T* entity)
-{
-  listElement* el = new listElement;
-  el->prev = this->last;
-  el->curr = entity;
-  el->next = NULL;
-
-  this->last = el;
-
-  if(this->size == 0) this->first = el;
-  else el->prev->next = el;
-  this->size++;
-}
-
-
-template<class T>
-void tList<T>::remove(T* entity)
-{
-  this->currentEl = this->first;
-  listElement* te;
-  while( this->currentEl != NULL)
-    {
-      if( this->currentEl->curr == entity)
-	{ 
-	  if( this->currentEl->prev  == NULL ) this->first = this->currentEl->next;
-	  else this->currentEl->prev->next = this->currentEl->next;
-
-	  if( this->currentEl->next == NULL) this->last = this->currentEl->prev;
-	  else this->currentEl->next->prev = this->currentEl->prev;
-
-	  te = this->currentEl->next;
-	  delete this->currentEl;
-	  this->currentEl = te;
-	  return;
-	}
-      this->currentEl = this->currentEl->next;
-    }
-}
-
-
-template<class T>
-void tList<T>::destroy()
-{
-  this->currentEl = this->first;
-  while(this->currentEl != NULL)
-    {
-      listElement* le = this->currentEl->next;
-      delete this->currentEl->curr;
-      delete this->currentEl;
-      this->currentEl = le;
-    }
-  this->first = NULL;
-  this->last = NULL;
-  this->size = 0;
-}
-
-
-template<class T>
-T* tList<T>::firstElement()
-{
-  return this->first->curr;
-}
-
-
-template<class T>
-bool tList<T>::isEmpty()
-{
-  return (this->size==0)?true:false;
-}
-
-
-template<class T>
-int tList<T>::getSize()
-{
-  return this->size;
-}
-
-
-template<class T>
-T* tList<T>::enumerate()
-{
-  if(this->size == 0) return NULL;
-  this->currentEl = this->first;
-  return this->currentEl->curr;
-}
-
-
-template<class T>
-T* tList<T>::nextElement()
-{
-  if(this->size == 0) return NULL;
-  this->currentEl = this->currentEl->next;
-  if(this->currentEl == NULL) return NULL;
-  return this->currentEl->curr;
-}
-
-
-template<class T>
-T* tList<T>::toArray()
-{}
-
-#endif /* _LIST_H */
Index: xonox/branches/trackManager/src/list_template.h
===================================================================
--- /orxonox/branches/trackManager/src/list_template.h	(revision 3497)
+++ 	(revision )
@@ -1,308 +1,0 @@
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   ### File Specific:
-   main-programmer: Christian Meyer
-
-   ADDONS/FIXES:
-  
-   Patrick Boenzli     :          Implemented getSize() function
-*/
-
-
-/*!
-  \file list.h
-  \brief Contains a template for a doubly linked list
-*/
-
-#ifndef _LIST_TEMPLATE_H
-#define _LIST_TEMPLATE_H
-
-#include "stdincl.h"
-
-//! An enum to list all the modes available when adding an object to a List
-enum ADDMODE {LIST_ADD_NEXT, LIST_ADD_PREV, LIST_ADD_FIRST, LIST_ADD_LAST};
-//! An enum to list the two searching directions available when removing an object from a List
-enum FINDMODE {LIST_FIND_BW, LIST_FIND_FW};
-
-//! A generic doubly linked list
-template<class T> class ListTemplate 
-{
-  T* object;
-  ListTemplate<T>* next;
-  ListTemplate<T>* prev;
-  bool bReference;
-  int size;
-  
- public:
-  ListTemplate (T* obj, ListTemplate<T>* n, ListTemplate<T>* p, bool bRef);
-  ~ListTemplate ();
-  
-  int add(T* obj, ADDMODE mode, bool bRef);
-  T* getObject();
-  ListTemplate<T>* getNext();
-  ListTemplate<T>* getPrevious();
-  ListTemplate<T>* getLast();
-  ListTemplate<T>* getFirst();
-  void setNext(ListTemplate<T>* ptr);
-  void setPrev(ListTemplate<T>* ptr);
-  int remove (T* obj, FINDMODE mode);
-  int getSize();
-  void destroy();
-};
-
-
-/**
-  \brief Standard constructor
-  
-  Call this without any parameters to generate a new ListTemplate which can be filled with content.
-  DO NOT create a ListTemplate element that contains an object on your own, you'll lose the data
-  contained in that object and will have trouble removing the list from your memory.
-*/
-template<class T>
-ListTemplate<T>::ListTemplate (T* obj = NULL, ListTemplate<T>* n = NULL, ListTemplate<T>* p = NULL, bool bRef = false)
-{
-  object = obj;
-  next = n;
-  prev = p;
-  bReference = bRef;
-  if(obj != NULL)
-    ++size;
-}
-
-/**
-  \brief Standard destructor
-  
-  Call this on the initially generated base ListTemplate element to remove the whole ListTemplate from the memory.
-  You can safely do this to any ListTemplate element you want without messing up the rest of the ListTemplate, but keep in mind
-  that the contained object will be deleted as well when bRef had been set to false.
-*/
-template<class T>
-ListTemplate<T>::~ListTemplate ()
-{
-  if (object == NULL) // deleted foot node => disband the list
-  {
-    while( next != NULL)
-    {
-      delete next;
-    }
-    while( prev != NULL)
-    {
-      delete prev;
-    }
-  }
-  else
-  {
-    if (prev != NULL) prev->setNext (next);
-    if (next != NULL) next->setPrev (prev);
-    if (!bReference) delete object;
-  }
-}
- 
-/**
-  \brief Add an object to the ListTemplate
-  \param obj: A pointer to an allocated object
-  \param mode: A Value of ADDMODE (default: LIST_ADD_NEXT)
-  \param bRef: Sets whether the element is serving as a storage point or a simple listing (default: false)
-  \return 0 if the operation succeded, -1 if the element could not be added
-  
-  This adds a new ListTemplate element to the chain. The mode parameter can be used to specify
-  the location where the element should be added. LIST_ADD_NEXT will add the new element directly
-  after the base element. LIST_ADD_PREV will add the new element directly before the base element.
-  LIST_ADD_FIRST will add the element at the beginning of the ListTemplate whereas LIST_ADD_LAST will add
-  it to the end of the chain. If the bRef parameter is set to true, the object pointer will not be deleted
-  when the element containing that object is deleted, thus the ListTemplate can be used for temporary listings as
-  well as permanent data storage.
-*/
-template<class T> 
-int ListTemplate<T>::add (T* obj, ADDMODE mode = LIST_ADD_NEXT, bool bRef = false)
-{
-  ListTemplate<T>* p;
-  if( obj == NULL) return -1;
-  switch (mode)
-  {
-    case LIST_ADD_NEXT:
-      p = new ListTemplate<T>( obj, next, this, bRef);
-      if( next != NULL) next->setPrev (p);
-      next = p;
-      break;
-    case LIST_ADD_PREV:
-      p = new ListTemplate<T>( obj, this, prev, bRef);
-      if( prev != NULL) prev->setNext (p);
-      prev = p;
-      break;
-    case LIST_ADD_FIRST:
-      if (prev == NULL) prev = new ListTemplate<T> (obj, this, NULL, bRef);
-      else return prev->add (obj, mode, bRef);
-      break;
-    case LIST_ADD_LAST:
-      if (next == NULL) next = new ListTemplate<T> (obj, NULL, this, bRef);
-      else return next->add (obj, mode, bRef);
-      break;
-    default:
-        return -1;
-      break;
-  }
-  ++size;
-  return 0;
-}
-
-/**
-  \brief Get the next element of the ListTemplate
-  \return The ListTemplate element after the current ListTemplate element
-*/
-template<class T>
-ListTemplate<T>* ListTemplate<T>::getNext ()
-{
-  return next;
-}
- 
-/**
-  \brief Get the previous element of the ListTemplate
-  \return The ListTemplate element before the current ListTemplate element
-*/
-template<class T>
-ListTemplate<T>* ListTemplate<T>::getPrevious ()
-{
-  return prev;
-}
-
-/**
-  \brief Get the last element of the ListTemplate
-  \return The last ListTemplate element
-*/
-template<class T>
-ListTemplate<T>* ListTemplate<T>::getLast ()
-{
-  if (next == NULL) return this;
-  else return next->getLast();
-}
-
-/**
-  \brief Get the first element of the ListTemplate
-  \return The first ListTemplate element
-*/
-template<class T>
-ListTemplate<T>* ListTemplate<T>::getFirst ()
-{
-  if (prev == NULL) return this;
-  else return prev->getFirst();
-}
-
-/**
-  \brief Removes a certain element from the ListTemplate
-  \param obj: A pointer to the object that should be removed
-  \param mode: A value of FINDMODE
-  \return 0 if the element was found and removed, -1 if the element was not found
-  
-  This searches the part of the ListTemplate specified with mode for the object in question.
-  When the object is found it is deleted and the ListTemplate element is removed from the chain.
-  If mode is LIST_FIND_FW all elements AFTER the base element are searched, if mode is
-  LIST_FIND_BW all elements BEFORE the base element are searched. Note that the object
-  contained within the ListTemplate element is NOT deleted when bRef was set to true.
-*/
-template<class T>
-int ListTemplate<T>::remove (T* obj, FINDMODE mode = LIST_FIND_FW)
-{
-  if (obj == NULL) return -1;
-  else
-  {
-    switch (mode)
-    {
-      case LIST_FIND_BW:
-        if (prev == NULL) return -1;
-        else
-        {
-          if( prev->getObject() == obj)
-          {
-            delete prev;
-          }
-          else
-          {
-            return prev->remove( obj, mode);
-          }
-        }
-        break;
-      case LIST_FIND_FW:
-        if (next == NULL) return -1;
-        else
-        {
-          if( next->getObject() == obj)
-          {
-            delete next;
-          }
-          else
-          {
-            return next->remove( obj, mode);
-          }
-        }
-        break;
-      default:
-        return -1;
-    }
-  }
-  --size;
-  return 0;
-}
-
-/**
-  \brief Set the next element of a ListTemplate element
-  \param ptr: A pointer to the new next element
-    
-  Sets the next element of a ListTemplate element... Better not touch this, it can really mess up a ListTemplate.
-*/
-template<class T>
-void ListTemplate<T>::setNext (ListTemplate<T>* ptr)
-{
-  next = ptr;
-}
-
-/**
-  \brief Set the prev element of a ListTemplate element
-  \param ptr: A pointer to the new previous element
-    
-  Sets the previous element of a ListTemplate element... Better not touch this, it can really mess up a ListTemplate.
-*/
-template<class T>
-void ListTemplate<T>::setPrev (ListTemplate<T>* ptr)
-{
-  prev = ptr;
-}
-
-/**
-  \brief Get the pointer to the object the element is containing
-  \return The contained object (will be NULL if called on the base element).
-*/
-template<class T>
-T* ListTemplate<T>::getObject()
-{
-  return object;
-}
-
-
-/**
-  \brief Returns the current size of the ListTemplate
-  \return Size of ListTemplate
-*/
-template<class T>
-int ListTemplate<T>::getSize()
-{
-  return this->size;
-}
-
-
-template<class T>
-void ListTemplate<T>::destroy()
-{
-  /* \todo at the moment - doing nothing. should delete everything */
-}
-
-#endif /* _LIST_TENMPLATE_H */
-
Index: xonox/branches/trackManager/src/matrix.cc
===================================================================
--- /orxonox/branches/trackManager/src/matrix.cc	(revision 3497)
+++ 	(revision )
@@ -1,746 +1,0 @@
-
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   ### File Specific:
-   main-programmer: Benjamin Grauer
-   co-programmer: ...
-
-   \todo Null-Parent => center of the coord system - singleton
-   \todo Smooth-Parent: delay, speed
-   \todo destroy the stuff again, delete...
-*/
-
-#include "matrix.h"
-
-Matrix::Matrix (size_t row, size_t col)
-{
-  _m = new base_mat( row, col, 0);
-}
-
-// copy constructor
-Matrix::Matrix (const Matrix& m)
-{
-    _m = m._m;
-    _m->Refcnt++;
-}
-
-// Internal copy constructor
-void Matrix::clone ()
-{
-    _m->Refcnt--;
-    _m = new base_mat( _m->Row, _m->Col, _m->Val);
-}
-
-// destructor
-Matrix::~Matrix ()
-{
-   if (--_m->Refcnt == 0) delete _m;
-}
-
-// assignment operator
-Matrix& Matrix::operator = (const Matrix& m) 
-{
-    m._m->Refcnt++;
-    if (--_m->Refcnt == 0) delete _m;
-    _m = m._m;
-    return *this;
-}
-
-//  reallocation method
-void Matrix::realloc (size_t row, size_t col)
-{
-   if (row == _m->RowSiz && col == _m->ColSiz)
-   {
-      _m->Row = _m->RowSiz;
-      _m->Col = _m->ColSiz;
-      return;
-   }
-
-   base_mat *m1 = new base_mat( row, col, NULL);
-   size_t colSize = min(_m->Col,col) * sizeof(float);
-   size_t minRow = min(_m->Row,row);
-
-   for (size_t i=0; i < minRow; i++)
-      memcpy( m1->Val[i], _m->Val[i], colSize);
-
-   if (--_m->Refcnt == 0) 
-       delete _m;
-   _m = m1;
-
-   return;
-}
-
-// public method for resizing Matrix
-void Matrix::SetSize (size_t row, size_t col) 
-{
-   size_t i,j;
-   size_t oldRow = _m->Row;
-   size_t oldCol = _m->Col;
-
-   if (row != _m->RowSiz || col != _m->ColSiz)
-      realloc( row, col);
-
-   for (i=oldRow; i < row; i++)
-      for (j=0; j < col; j++)
-	 _m->Val[i][j] = float(0);
-
-   for (i=0; i < row; i++)                      
-      for (j=oldCol; j < col; j++)
-	 _m->Val[i][j] = float(0);
-
-   return;
-}
-
-// subscript operator to get/set individual elements
-float& Matrix::operator () (size_t row, size_t col) 
-{
-   if (row >= _m->Row || col >= _m->Col)
-      printf( "Matrix::operator(): Index out of range!\n");
-   if (_m->Refcnt > 1) clone();
-   return _m->Val[row][col];
-}
-
-// subscript operator to get/set individual elements
-float Matrix::operator () (size_t row, size_t col) const 
-{
-   if (row >= _m->Row || col >= _m->Col)
-      printf( "Matrix::operator(): Index out of range!\n");
-   return _m->Val[row][col];
-}
-
-// input stream function
-istream& operator >> (istream& istrm, Matrix& m)
-{
-   for (size_t i=0; i < m.RowNo(); i++)
-      for (size_t j=0; j < m.ColNo(); j++)
-      {
-         float x;
-         istrm >> x;
-         m(i,j) = x;
-      }
-   return istrm;
-}
-
-// output stream function
-ostream& operator << (ostream& ostrm, const Matrix& m)
-{
-   for (size_t i=0; i < m.RowNo(); i++)
-   {
-      for (size_t j=0; j < m.ColNo(); j++)
-      {
-         float x = m(i,j);
-         ostrm << x << '\t';
-      }
-      ostrm << endl;
-   }
-   return ostrm;
-}
-
-
-// logical equal-to operator
-bool operator == (const Matrix& m1, const Matrix& m2) 
-{
-   if (m1.RowNo() != m2.RowNo() || m1.ColNo() != m2.ColNo())
-      return false;
-
-   for (size_t i=0; i < m1.RowNo(); i++)
-      for (size_t j=0; j < m1.ColNo(); j++)
-	      if (m1(i,j) != m2(i,j))
-	         return false;
-
-   return true;
-}
-
-// logical no-equal-to operator
-bool operator != (const Matrix& m1, const Matrix& m2) 
-{
-    return (m1 == m2) ? false : true;
-}
-
-// combined addition and assignment operator
-Matrix& Matrix::operator += (const Matrix& m) 
-{
-   if (_m->Row != m._m->Row || _m->Col != m._m->Col)
-     printf("Matrix::operator+= : Inconsistent Matrix sizes in addition!\n");
-   if (_m->Refcnt > 1) clone();
-   for (size_t i=0; i < m._m->Row; i++)
-      for (size_t j=0; j < m._m->Col; j++)
-	 _m->Val[i][j] += m._m->Val[i][j];
-   return *this;
-}
-
-// combined subtraction and assignment operator
-Matrix& Matrix::operator -= (const Matrix& m) 
-{
-   if (_m->Row != m._m->Row || _m->Col != m._m->Col)
-      printf( "Matrix::operator-= : Inconsistent Matrix sizes in subtraction!\n");
-   if (_m->Refcnt > 1) clone();
-   for (size_t i=0; i < m._m->Row; i++)
-      for (size_t j=0; j < m._m->Col; j++)
-	 _m->Val[i][j] -= m._m->Val[i][j];
-   return *this;
-}
-
-// combined scalar multiplication and assignment operator
- Matrix&
-Matrix::operator *= (const float& c) 
-{
-    if (_m->Refcnt > 1) clone();
-    for (size_t i=0; i < _m->Row; i++)
-	for (size_t j=0; j < _m->Col; j++)
-	    _m->Val[i][j] *= c;
-    return *this;
-}
-
-// combined Matrix multiplication and assignment operator
- Matrix&
-Matrix::operator *= (const Matrix& m) 
-{
-   if (_m->Col != m._m->Row)
-      printf( "Matrix::operator*= : Inconsistent Matrix sizes in multiplication!\n");
-
-   Matrix temp(_m->Row,m._m->Col);
-
-   for (size_t i=0; i < _m->Row; i++)
-      for (size_t j=0; j < m._m->Col; j++)
-      {
-         temp._m->Val[i][j] = float(0);
-         for (size_t k=0; k < _m->Col; k++)
-            temp._m->Val[i][j] += _m->Val[i][k] * m._m->Val[k][j];
-      }
-   *this = temp;
-
-   return *this;
-}
-
-// combined scalar division and assignment operator
- Matrix&
-Matrix::operator /= (const float& c) 
-{
-    if (_m->Refcnt > 1) clone();
-    for (size_t i=0; i < _m->Row; i++)
-	for (size_t j=0; j < _m->Col; j++)
-	    _m->Val[i][j] /= c;
-
-    return *this;
-}
-
-// combined power and assignment operator
- Matrix&
-Matrix::operator ^= (const size_t& pow) 
-{
-  Matrix temp(*this);
-
-  for (size_t i=2; i <= pow; i++)
-    *this *=  temp; // changed from *this = *this * temp;
-
-  return *this;
-}
-
-// unary negation operator
- Matrix
-Matrix::operator - () 
-{
-   Matrix temp(_m->Row,_m->Col);
-
-   for (size_t i=0; i < _m->Row; i++)
-      for (size_t j=0; j < _m->Col; j++)
-	 temp._m->Val[i][j] = - _m->Val[i][j];
-
-   return temp;
-}
-
-// binary addition operator
- Matrix
-operator + (const Matrix& m1, const Matrix& m2) 
-{
-   Matrix temp = m1;
-   temp += m2;
-   return temp;
-}
-
-// binary subtraction operator
- Matrix
-operator - (const Matrix& m1, const Matrix& m2) 
-{
-   Matrix temp = m1;
-   temp -= m2;
-   return temp;
-}
-
-// binary scalar multiplication operator
- Matrix
-operator * (const Matrix& m, const float& no) 
-{
-   Matrix temp = m;
-   temp *= no;
-   return temp;
-}
-
-
-// binary scalar multiplication operator
- Matrix
-operator * (const float& no, const Matrix& m) 
-{
-   return (m * no);
-}
-
-// binary Matrix multiplication operator
- Matrix
-operator * (const Matrix& m1, const Matrix& m2) 
-{
-   Matrix temp = m1;
-   temp *= m2;
-   return temp;
-}
-
-// binary scalar division operator
- Matrix
-operator / (const Matrix& m, const float& no) 
-{
-    return (m * (float(1) / no));
-}
-
-
-// binary scalar division operator
- Matrix
-operator / (const float& no, const Matrix& m) 
-{
-    return (!m * no);
-}
-
-// binary Matrix division operator
- Matrix
-operator / (const Matrix& m1, const Matrix& m2) 
-{
-    return (m1 * !m2);
-}
-
-// binary power operator
- Matrix
-operator ^ (const Matrix& m, const size_t& pow) 
-{
-   Matrix temp = m;
-   temp ^= pow;
-   return temp;
-}
-
-// unary transpose operator
- Matrix
-operator ~ (const Matrix& m) 
-{
-   Matrix temp(m.ColNo(),m.RowNo());
-
-   for (size_t i=0; i < m.RowNo(); i++)
-      for (size_t j=0; j < m.ColNo(); j++)
-      {
-         float x = m(i,j);
-	      temp(j,i) = x;
-      }
-   return temp;
-}
-
-// unary inversion operator
- Matrix
-operator ! (const Matrix m) 
-{
-   Matrix temp = m;
-   return temp.Inv();
-}
-
-// inversion function
- Matrix
-Matrix::Inv () 
-{
-   size_t i,j,k;
-   float a1,a2,*rowptr;
-
-   if (_m->Row != _m->Col)
-      printf( "Matrix::operator!: Inversion of a non-square Matrix\n");
-
-   Matrix temp(_m->Row,_m->Col);
-   if (_m->Refcnt > 1) clone();
-
-
-   temp.Unit();
-   for (k=0; k < _m->Row; k++)
-   {
-      int indx = pivot(k);
-      if (indx == -1)
-	      printf( "Matrix::operator!: Inversion of a singular Matrix\n");
-
-      if (indx != 0)
-      {
-	      rowptr = temp._m->Val[k];
-	      temp._m->Val[k] = temp._m->Val[indx];
-	      temp._m->Val[indx] = rowptr;
-      }
-      a1 = _m->Val[k][k];
-      for (j=0; j < _m->Row; j++)
-      {
-	      _m->Val[k][j] /= a1;
-	      temp._m->Val[k][j] /= a1;
-      }
-      for (i=0; i < _m->Row; i++)
-	   if (i != k)
-	   {
-	      a2 = _m->Val[i][k];
-	      for (j=0; j < _m->Row; j++)
-	      {
-	         _m->Val[i][j] -= a2 * _m->Val[k][j];
-	         temp._m->Val[i][j] -= a2 * temp._m->Val[k][j];
-	      }
-	   }
-   }
-   return temp;
-}
-
-// solve simultaneous equation
- Matrix
-Matrix::Solve (const Matrix& v) const 
-{
-   size_t i,j,k;
-   float a1;
-
-   if (!(_m->Row == _m->Col && _m->Col == v._m->Row))
-      printf( "Matrix::Solve():Inconsistent matrices!\n");
-
-   Matrix temp(_m->Row,_m->Col+v._m->Col);
-   for (i=0; i < _m->Row; i++)
-   {
-      for (j=0; j < _m->Col; j++)
-	 temp._m->Val[i][j] = _m->Val[i][j];
-      for (k=0; k < v._m->Col; k++)
-	 temp._m->Val[i][_m->Col+k] = v._m->Val[i][k];
-   }
-   for (k=0; k < _m->Row; k++)
-   {
-      int indx = temp.pivot(k);
-      if (indx == -1)
-	 printf( "Matrix::Solve(): Singular Matrix!\n");
-
-      a1 = temp._m->Val[k][k];
-      for (j=k; j < temp._m->Col; j++)
-	 temp._m->Val[k][j] /= a1;
-
-      for (i=k+1; i < _m->Row; i++)
-      {
-	 a1 = temp._m->Val[i][k];
-	 for (j=k; j < temp._m->Col; j++)
-	   temp._m->Val[i][j] -= a1 * temp._m->Val[k][j];
-      }
-   }
-   Matrix s(v._m->Row,v._m->Col);
-   for (k=0; k < v._m->Col; k++)
-      for (int m=int(_m->Row)-1; m >= 0; m--)
-      {
-	 s._m->Val[m][k] = temp._m->Val[m][_m->Col+k];
-	 for (j=m+1; j < _m->Col; j++)
-	    s._m->Val[m][k] -= temp._m->Val[m][j] * s._m->Val[j][k];
-      }
-   return s;
-}
-
-// set zero to all elements of this Matrix
- void
-Matrix::Null (const size_t& row, const size_t& col) 
-{
-    if (row != _m->Row || col != _m->Col)
-	realloc( row,col);
-
-    if (_m->Refcnt > 1) 
-	clone();
-
-    for (size_t i=0; i < _m->Row; i++)
-	for (size_t j=0; j < _m->Col; j++)
-	    _m->Val[i][j] = float(0);
-    return;
-}
-
-// set zero to all elements of this Matrix
- void
-Matrix::Null() 
-{
-    if (_m->Refcnt > 1) clone();   
-    for (size_t i=0; i < _m->Row; i++)
-	for (size_t j=0; j < _m->Col; j++)
-		_m->Val[i][j] = float(0);
-    return;
-}
-
-// set this Matrix to unity
- void
-Matrix::Unit (const size_t& row) 
-{
-    if (row != _m->Row || row != _m->Col)
-	realloc( row, row);
-	
-    if (_m->Refcnt > 1) 
-	clone();
-
-    for (size_t i=0; i < _m->Row; i++)
-	for (size_t j=0; j < _m->Col; j++)
-	    _m->Val[i][j] = i == j ? float(1) : float(0);
-    return;
-}
-
-// set this Matrix to unity
- void
-Matrix::Unit () 
-{
-    if (_m->Refcnt > 1) clone();   
-    size_t row = min(_m->Row,_m->Col);
-    _m->Row = _m->Col = row;
-
-    for (size_t i=0; i < _m->Row; i++)
-	for (size_t j=0; j < _m->Col; j++)
-	    _m->Val[i][j] = i == j ? float(1) : float(0);
-    return;
-}
-
-// private partial pivoting method
- int
-Matrix::pivot (size_t row)
-{
-  int k = int(row);
-  double amax,temp;
-
-  amax = -1;
-  for (size_t i=row; i < _m->Row; i++)
-    if ( (temp = abs( _m->Val[i][row])) > amax && temp != 0.0)
-     {
-       amax = temp;
-       k = i;
-     }
-  if (_m->Val[k][row] == float(0))
-     return -1;
-  if (k != int(row))
-  {
-     float* rowptr = _m->Val[k];
-     _m->Val[k] = _m->Val[row];
-     _m->Val[row] = rowptr;
-     return k;
-  }
-  return 0;
-}
-
-// calculate the determinant of a Matrix
- float
-Matrix::Det () const 
-{
-   size_t i,j,k;
-   float piv,detVal = float(1);
-
-   if (_m->Row != _m->Col)
-      printf( "Matrix::Det(): Determinant a non-squareMatrix!\n");
-   
-   Matrix temp(*this);
-   if (temp._m->Refcnt > 1) temp.clone();
-
-   for (k=0; k < _m->Row; k++)
-   {
-      int indx = temp.pivot(k);
-      if (indx == -1)
-	 return 0;
-      if (indx != 0)
-	 detVal = - detVal;
-      detVal = detVal * temp._m->Val[k][k];
-      for (i=k+1; i < _m->Row; i++)
-      {
-	 piv = temp._m->Val[i][k] / temp._m->Val[k][k];
-	 for (j=k+1; j < _m->Row; j++)
-	    temp._m->Val[i][j] -= piv * temp._m->Val[k][j];
-      }
-   }
-   return detVal;
-}
-
-// calculate the norm of a Matrix
- float
-Matrix::Norm () 
-{
-   float retVal = float(0);
-
-   for (size_t i=0; i < _m->Row; i++)
-      for (size_t j=0; j < _m->Col; j++)
-	 retVal += _m->Val[i][j] * _m->Val[i][j];
-   retVal = sqrt( retVal);
-
-   return retVal;
-}
-
-// calculate the condition number of a Matrix
- float
-Matrix::Cond () 
-{
-   Matrix inv = ! (*this);
-   return (Norm() * inv.Norm());
-}
-
-// calculate the cofactor of a Matrix for a given element
- float
-Matrix::Cofact (size_t row, size_t col) 
-{
-   size_t i,i1,j,j1;
-
-   if (_m->Row != _m->Col)
-      printf( "Matrix::Cofact(): Cofactor of a non-square Matrix!\n");
-
-   if (row > _m->Row || col > _m->Col)
-      printf( "Matrix::Cofact(): Index out of range!\n");
-
-   Matrix temp (_m->Row-1,_m->Col-1);
-
-   for (i=i1=0; i < _m->Row; i++)
-   {
-      if (i == row)
-	continue;
-      for (j=j1=0; j < _m->Col; j++)
-      {
-	 if (j == col)
-	    continue;
-	 temp._m->Val[i1][j1] = _m->Val[i][j];
-	 j1++;
-      }
-      i1++;
-   }
-   float  cof = temp.Det();
-   if ((row+col)%2 == 1)
-      cof = -cof;
-
-   return cof;
-}
-
-
-// calculate adjoin of a Matrix
- Matrix
-Matrix::Adj () 
-{
-   if (_m->Row != _m->Col)
-      printf( "Matrix::Adj(): Adjoin of a non-square Matrix.\n");
-
-   Matrix temp(_m->Row,_m->Col);
-
-   for (size_t i=0; i < _m->Row; i++)
-      for (size_t j=0; j < _m->Col; j++)
-	  temp._m->Val[j][i] = Cofact(i,j);
-   return temp;
-}
-
-// Determine if the Matrix is singular
- bool
-Matrix::IsSingular () 
-{
-   if (_m->Row != _m->Col)
-      return false;
-   return (Det() == float(0));
-}
-
-// Determine if the Matrix is diagonal
- bool
-Matrix::IsDiagonal () 
-{
-   if (_m->Row != _m->Col)
-      return false;
-   for (size_t i=0; i < _m->Row; i++)
-     for (size_t j=0; j < _m->Col; j++)
-	if (i != j && _m->Val[i][j] != float(0))
-	  return false;
-   return true;
-}
-
-// Determine if the Matrix is scalar
- bool
-Matrix::IsScalar () 
-{
-   if (!IsDiagonal())
-     return false;
-   float v = _m->Val[0][0];
-   for (size_t i=1; i < _m->Row; i++)
-     if (_m->Val[i][i] != v)
-	return false;
-   return true;
-}
-
-// Determine if the Matrix is a unit Matrix
- bool
-Matrix::IsUnit () 
-{
-   if (IsScalar() && _m->Val[0][0] == float(1))
-     return true;
-   return false;
-}
-
-// Determine if this is a null Matrix
- bool
-Matrix::IsNull () 
-{
-   for (size_t i=0; i < _m->Row; i++)
-      for (size_t j=0; j < _m->Col; j++)
-	 if (_m->Val[i][j] != float(0))
-	    return false;
-   return true;
-}
-
-// Determine if the Matrix is symmetric
- bool
-Matrix::IsSymmetric () 
-{
-   if (_m->Row != _m->Col)
-      return false;
-   for (size_t i=0; i < _m->Row; i++)
-      for (size_t j=0; j < _m->Col; j++)
-	 if (_m->Val[i][j] != _m->Val[j][i])
-	    return false;
-   return true;
-}
-	   
-// Determine if the Matrix is skew-symmetric
- bool
-Matrix::IsSkewSymmetric () 
-{
-   if (_m->Row != _m->Col)
-      return false;
-   for (size_t i=0; i < _m->Row; i++)
-      for (size_t j=0; j < _m->Col; j++)
-	 if (_m->Val[i][j] != -_m->Val[j][i])
-	    return false;
-   return true;
-}
-   
-// Determine if the Matrix is upper triangular
- bool
-Matrix::IsUpperTriangular () 
-{
-   if (_m->Row != _m->Col)
-      return false;
-   for (size_t i=1; i < _m->Row; i++)
-      for (size_t j=0; j < i-1; j++)
-	 if (_m->Val[i][j] != float(0))
-	    return false;
-   return true;
-}
-
-// Determine if the Matrix is lower triangular
- bool
-Matrix::IsLowerTriangular () 
-{
-   if (_m->Row != _m->Col)
-      return false;
-
-   for (size_t j=1; j < _m->Col; j++)
-      for (size_t i=0; i < j-1; i++)
-	 if (_m->Val[i][j] != float(0))
-	    return false;
-
-   return true;
-}
-
Index: xonox/branches/trackManager/src/matrix.h
===================================================================
--- /orxonox/branches/trackManager/src/matrix.h	(revision 3497)
+++ 	(revision )
@@ -1,110 +1,0 @@
-#ifndef _MATRIX_H
-#define _MATRIX_H
-
-#include <math.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <iostream>
-
-using namespace std;
-
-class Matrix
-{
-public:
-  // Constructors
-  Matrix (const Matrix& m);
-  Matrix (size_t row, size_t col);
-  
-  // Destructor
-  ~Matrix ();
-  
-  // Assignment operators
-  Matrix& operator = (const Matrix& m) ;
-  
-  // Value extraction method
-  size_t RowNo () const { return _m->Row; }
-  size_t ColNo () const { return _m->Col; }
-  
-  // Subscript operator
-  float& operator () (size_t row, size_t col);
-   float  operator () (size_t row, size_t col) const;
-
-   // Unary operators
-   Matrix operator + ()  { return *this; }
-   Matrix operator - () ;
-
-   // Combined assignment - calculation operators
-   Matrix& operator += (const Matrix& m);
-   Matrix& operator -= (const Matrix& m);
-   Matrix& operator *= (const Matrix& m);
-   Matrix& operator *= (const float& c) ;
-   Matrix& operator /= (const float& c) ;
-   Matrix& operator ^= (const size_t& pow);
-
-   // Miscellaneous -methods
-   void Null (const size_t& row, const size_t& col) ;
-   void Null () ;
-   void Unit (const size_t& row) ;
-   void Unit () ;
-   void SetSize (size_t row, size_t col) ;
-
-   // Utility methods
-   Matrix Solve (const Matrix& v) const;
-   Matrix Adj ();
-   Matrix Inv ();
-   float Det () const;
-   float Norm () ;
-   float Cofact (size_t row, size_t col);
-   float Cond () ;
-
-   // Type of matrices
-   bool IsSquare ()  { return (_m->Row == _m->Col); } 
-   bool IsSingular ();
-   bool IsDiagonal ();
-   bool IsScalar ();
-   bool IsUnit ();
-   bool IsNull ();
-   bool IsSymmetric ();
-   bool IsSkewSymmetric ();
-   bool IsUpperTriangular ();
-   bool IsLowerTriangular ();
-
-private:
-   struct base_mat
-    {
-	float **Val;
-	size_t Row, Col, RowSiz, ColSiz;
-	int Refcnt;
-
-	base_mat (size_t row, size_t col, float** v)
-	{
-	    Row = row; RowSiz = row;
-	    Col = col; ColSiz = col;
-	    Refcnt = 1;
-
-	    Val = new float* [row];
-	    size_t rowlen = col * sizeof(float);
-
-	    for (size_t i=0; i < row; i++)
-	    {
-		Val[i] = new float [col];
-		if (v) memcpy( Val[i], v[i], rowlen);
-	    }
-	}
-	~base_mat ()
-	{
-	    for (size_t i=0; i < RowSiz; i++)
-		delete [] Val[i];
-	    delete [] Val;
-	}
-    };
-    base_mat *_m;
-
-    void clone ();
-    void realloc (size_t row, size_t col);
-    int pivot (size_t row);
-};
-
-Matrix operator ! (const Matrix m);
-
-#endif /*_MATRIX_H */
Index: /orxonox/branches/trackManager/src/network/synchronisable.cc
===================================================================
--- /orxonox/branches/trackManager/src/network/synchronisable.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/network/synchronisable.cc	(revision 3498)
@@ -0,0 +1,32 @@
+
+
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: Patrick Boenzli
+   co-programmer: ...
+*/
+
+
+#include "synchronisable.h"
+
+
+using namespace std;
+
+
+
+Synchronisable::Synchronisable () {}
+
+
+
+Synchronisable::~Synchronisable () {}
+
+
Index: /orxonox/branches/trackManager/src/network/synchronisable.h
===================================================================
--- /orxonox/branches/trackManager/src/network/synchronisable.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/network/synchronisable.h	(revision 3498)
@@ -0,0 +1,24 @@
+
+#ifndef _SYNCHRONISABLE_H
+#define _SYNCHRONISABLE_H
+
+#include "data_tank.h"
+
+
+class Synchronisable {
+
+ public:
+  Synchronisable ();
+  ~Synchronisable ();
+
+  struct worldEntityState {
+    /*Vector position; */
+    /*Vector orientation; */
+  };
+
+  worldEntityState* getState();
+  void setState(worldEntityState*);
+
+};
+
+#endif /* _SYNCHRONISABLE_H */
Index: xonox/branches/trackManager/src/npc.cc
===================================================================
--- /orxonox/branches/trackManager/src/npc.cc	(revision 3497)
+++ 	(revision )
@@ -1,94 +1,0 @@
-
-
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   ### File Specific:
-   main-programmer: Patrick Boenzli
-   co-programmer:
-*/
-
-#include <iostream>
-#include <GL/glut.h>
-
-#include "ai.h"
-#include "data_tank.h"
-
-#include "npc.h"
-
-using namespace std;
-
-
-NPC::NPC()
-  : WorldEntity()
-{
-  hasDied = 0;
-}
-
-NPC::~NPC () {}
-
-
-void NPC::setPosition(float x, float y, float z)
-{
-  xCor = x; yCor = y; zCor = z;
-}
-
-void NPC::getPosition(float* x, float* y, float* z) 
-{
-  *x = xCor; 
-  *y = yCor; 
-  *z = zCor;
-}
-
-void NPC::setCollisionRadius(float r) 
-{
-  collisionRadius = r;
-}
-
-float NPC::getCollisionRadius() 
-{
-  return collisionRadius;
-}
-
-
-void NPC::addAI(AI* ai)
-{}
-
-void NPC::paint()
-{
-  //cout << "WorldEntity::WorldEntity();" << endl;  
-  /* fix: died flag approach is very stupid, just to show @ convention */
-  if( hasDied == 0 ) {
-    glPushMatrix();
-    glTranslatef(xCor, yCor, 3.0);
-    //glScalef(1.0, 3.0, 1.0);
-    glutWireSphere(1.0, 10, 10);
-    glPopMatrix();
-  }
-}
-
-void NPC::drawNPC() 
-{
-
-}
-
-
-/* define the reaction, if the ship is been hit */
-int NPC::hit()
-{
-  die();
-  return 0;
-}
-
-
-void NPC::die()
-{
-  hasDied = 1;
-}
Index: xonox/branches/trackManager/src/npc.h
===================================================================
--- /orxonox/branches/trackManager/src/npc.h	(revision 3497)
+++ 	(revision )
@@ -1,43 +1,0 @@
-
-#ifndef _NPC_H
-#define _NPC_H
-
-#include "world_entity.h"
-
-class AI;
-
-class NPC : public WorldEntity {
-
- public:
-  NPC ();
-  ~NPC ();
-
-  /* collision control */
-  float collisionRadius;
-
-  float xCor;
-  float yCor;
-  float zCor;
-
-  void drawNPC(void);
-  void paint(void);
-  void setPosition(float x, float y, float z);
-  void getPosition(float* x, float* y, float* z);
-  void addAI(AI* ai);
-  void setCollisionRadius(float r);
-  float getCollisionRadius(void);
-  int hit(void);
-  void die(void);
-
- private:
-  /* position of the non player space craft */
-
-  int npcType;
-  int hasDied;
-
-
-;
-
-};
-
-#endif /* _NPC_H */
Index: xonox/branches/trackManager/src/null_parent.cc
===================================================================
--- /orxonox/branches/trackManager/src/null_parent.cc	(revision 3497)
+++ 	(revision )
@@ -1,96 +1,0 @@
-
-
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   ### File Specific:
-   main-programmer: Patrick Boenzli
-   co-programmer: ...
-*/
-
-
-#include "null_parent.h"
-
-
-using namespace std;
-
-NullParent* NullParent::singletonRef = 0;
-
-NullParent* NullParent::getInstance ()
-{
-  if( singletonRef == NULL)
-    singletonRef = new NullParent ();
-  return singletonRef;
-}
-
-/**
-   \brief standard constructor
-
-   \todo this constructor is not jet implemented - do it
-*/
-NullParent::NullParent () 
-{
-  this->parent = this;
-  this->mode = ALL;
-}
-
-
-NullParent::NullParent (Vector* absCoordinate)
-{
-  this->parent = this;
-  this->mode = ALL;
-  this->absCoordinate = *absCoordinate;
-}
-
-
-/**
-   \brief standard deconstructor
-
-   \todo this deconstructor is not jet implemented - do it
-*/
-NullParent::~NullParent () 
-{
-  delete singletonRef;
-  singletonRef = NULL;
-}
-
-
-
-
-/**
-   \brief updates the absCoordinate/absDirection
-
-   this is used to go through the parent-tree to update all the absolute coordinates
-   and directions. this update should be done by the engine, so you don't have to 
-   worry, normaly...
-*/
-void NullParent::update (float timeStamp)
-{
-  this->absCoordinate = this->relCoordinate;
-  this->absDirection = parent->getAbsDir () * this->relDirection;
-  
-  PNode* pn = this->children->enumerate ();
-  while( pn != NULL) 
-    { 
-      /* if this node has changed, make sure, that all children are updated also */
-      if( this->bRelCoorChanged || this->bAbsCoorChanged)
-	pn->parentCoorChanged ();
-      if( this->bRelDirChanged || this->bAbsDirChanged)
-	pn->parentDirChanged ();
-      pn->update (timeStamp);
-      pn = this->children->nextElement ();
-    }
-
-  this->timeStamp = timeStamp;
-  this->bRelCoorChanged = false;
-  this->bAbsCoorChanged = false;
-  this->bRelDirChanged = false;
-  this->bAbsDirChanged = false;
-}
Index: xonox/branches/trackManager/src/null_parent.h
===================================================================
--- /orxonox/branches/trackManager/src/null_parent.h	(revision 3497)
+++ 	(revision )
@@ -1,30 +1,0 @@
-/*! 
-    \file proto_class.h
-    \brief Definition of the proto class template, used quickly start work
-*/
-
-
-#ifndef _NULL_PARENT_H
-#define _NULL_PARENT_H
-
-#include "stdincl.h"
-#include "p_node.h"
-
-
-class NullParent : public PNode {
-
- public:
-  static NullParent* getInstance ();
-  ~NullParent ();
-  
-  static NullParent* singletonRef;
-
-  virtual void update (float timeStamp);
-
- private:
-  NullParent ();
-  NullParent (Vector* absCoordinate);
-
-};
-
-#endif /* _NULL_PARENT_H */
Index: /orxonox/branches/trackManager/src/orxonox.cc
===================================================================
--- /orxonox/branches/trackManager/src/orxonox.cc	(revision 3497)
+++ /orxonox/branches/trackManager/src/orxonox.cc	(revision 3498)
@@ -56,7 +56,10 @@
 
 
-/* this is a singleton class to prevent duplicates */
+/** \brief this is a singleton class to prevent duplicates */
 Orxonox* Orxonox::singletonRef = 0;
 
+/**
+   \returns reference or new Object of Orxonox if not existent.
+*/
 Orxonox* Orxonox::getInstance (void)
 {
@@ -173,25 +176,5 @@
   glClearColor (0.0, 0.0, 0.0, 0.0);
   glEnable (GL_DEPTH_TEST);
- 
-  // LIGHTING
-  GLfloat lmodelAmbient[] = {.1, .1, .1, 1.0};
-  GLfloat whiteLight[] = {1.0, 1.0, 1.0,1.0};
-  GLfloat lightPosition[] = {10.0, 10, 19.0, 0.0};
-
-  glLightfv (GL_LIGHT0, GL_DIFFUSE, whiteLight);
-  glLightfv (GL_LIGHT0, GL_SPECULAR, whiteLight);
-  glEnable (GL_LIGHTING);
-  glEnable (GL_LIGHT0);
-  glEnable (GL_DEPTH_TEST);
-  glLightfv (GL_LIGHT0, GL_POSITION, lightPosition);
-  glLightfv (GL_LIGHT0, GL_DIFFUSE, whiteLight);
    
-  //glEnable (GL_TEXTURE_2D); 
-  //  glEnable(GL_COLOR);
-  //  glShadeModel(GL_SMOOTH);
-  
-  // create camera
-  //localcamera = new Camera(world); /* \todo camera/input node not used anymore*/
-  
   return 0;
 }
@@ -342,5 +325,7 @@
 }
 
-
+/**
+   \return The reference of the SDL-screen of orxonox
+*/
 SDL_Surface* Orxonox::getScreen ()
 {
@@ -348,5 +333,9 @@
 }
 
-
+/**
+   \brief main function
+
+   here the journey begins
+*/
 int main(int argc, char** argv) 
 {  
Index: /orxonox/branches/trackManager/src/orxonox.h
===================================================================
--- /orxonox/branches/trackManager/src/orxonox.h	(revision 3497)
+++ /orxonox/branches/trackManager/src/orxonox.h	(revision 3498)
@@ -26,15 +26,15 @@
   ~Orxonox ();
   
-  char configfilename[256];
-  World* world;
-  DataTank* resources;
-  CommandNode* localinput;
-  Camera* localcamera;
-  SDL_Surface* screen;
-  GameLoader* gameLoader;
+  char configfilename[256];   //!< Filename of the configuration-file.
+  World* world;               //!< Reference to the current running world.
+  DataTank* resources;        //!< DataContainer
+  CommandNode* localinput;    //!< Command Handler
+  Camera* localcamera;        //!< The current Camera
+  SDL_Surface* screen;        //!< The current Screen
+  GameLoader* gameLoader;     //!< The gameLoader
   
-  bool bQuitOrxonox;
-  bool pause;
-  Uint32 lastframe;
+  bool bQuitOrxonox;          //!< If Orxonox should Quit
+  bool pause;                 //!< Pause mode
+  Uint32 lastframe;           //!< Time of the last Frame
   
   void getConfigFile (int argc, char** argv);
Index: xonox/branches/trackManager/src/p_node.cc
===================================================================
--- /orxonox/branches/trackManager/src/p_node.cc	(revision 3497)
+++ 	(revision )
@@ -1,447 +1,0 @@
-
-
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   ### File Specific:
-   main-programmer: Patrick Boenzli
-   co-programmer: ...
-
-   \todo Null-Parent => center of the coord system - singleton
-   \todo Smooth-Parent: delay, speed
-   \todo destroy the stuff again, delete...
-*/
-
-
-#include "p_node.h"
-
-
-using namespace std;
-
-
-/**
-   \brief standard constructor
-
-   \todo this constructor is not jet implemented - do it
-*/
-PNode::PNode () 
-{
-  this->children = new tList<PNode>();
-  this->bRelCoorChanged = true;
-  this->bAbsCoorChanged = false;
-  this->bRelDirChanged = true;
-  this->bAbsDirChanged = false;
-  this->parent = NULL;
-}
-
-
-/**
-   \brief constructor with coodinates
-*/
-PNode::PNode (Vector* absCoordinate, PNode* parent )
-{
-  this->absCoordinate = *absCoordinate;
-  this->relCoordinate = this->absCoordinate - parent->getAbsCoor ();
-  
-  this->children = new tList<PNode>();
-  this->bRelCoorChanged = true;
-  this->bAbsCoorChanged = false;
-  this->bRelDirChanged = true;
-  this->bAbsDirChanged = false;
-  this->parent = parent;
-
-  parent->addChild (this);
-}
-
-
-/**
-   \brief standard deconstructor
-
-   \todo this deconstructor is not jet implemented - do it
-*/
-PNode::~PNode () 
-{
-  /*
-  delete &this->children;
-  delete &this->relCoordinate;
-  delete &this->absCoordinate;
-  delete &this->relDirection;
-  delete &this->absDirection;
-  */
-  this->parent = NULL;
-  /* there is currently a problem with cleaning up - fix*/
-}
-
-
-/**
-   \brief deletes the hole pnode tree
-
-   cleans up all pnodes
-*/
-void PNode::destroy ()
-{
-  PNode* pn = this->children->enumerate();
-  while( pn != NULL) 
-    { 
-      pn->destroy ();
-      pn = this->children->nextElement();
-    } 
-  this->children->destroy ();
-}
-
-
-/**
-   \brief get relative coordinates
-   \returns relative coordinates to its parent
-*/
-Vector PNode::getRelCoor ()
-{
-  Vector r = this->relCoordinate; /* return a copy, so it can't be modified */
-  return r;
-}
-
-
-/**
-   \brief set relative coordinates
-   \param relative coordinates to its parent
-
-   it is very importand, that you use this function, if you want to update the
-   relCoordinates. If you don't use this, the PNode won't recognize, that something
-   has changed and won't update the children Nodes.
-*/
-void PNode::setRelCoor (Vector* relCoord)
-{
-  this->bRelCoorChanged = true;
-  this->relCoordinate = *relCoord;
-}
-
-
-/**
-   \brief get absolute coordinates
-   \returns absolute coordinates from (0,0,0)
-*/
-Vector PNode::getAbsCoor ()
-{
-  return this->absCoordinate;
-}
-
-
-/**
-   \brief get relative coordinates
-   \returns relative coordinates to its parent
-
-   it is very importand, that you use this function, if you want to update the
-   absCoordinates. If you don't use this, the PNode won't recognize, that something
-   has changed and won't update the children Nodes.
-*/
-void PNode::setAbsCoor (Vector* absCoord)
-{
-  this->bAbsCoorChanged = true;
-  this->absCoordinate = *absCoord;
-}
-
-
-/**
-   \brief shift coordinate (abs and rel)
-   \param shift vector
-
-   this function shifts the current coordinates about the vector shift. this is
-   usefull because from some place else you can:
-   PNode* someNode = ...;
-   Vector objectMovement = calculateShift();
-   someNode->shiftCoor(objectMovement);
-
-   elsewhere you would have to:
-   PNode* someNode = ...;
-   Vector objectMovement = calculateShift();
-   Vector currentCoor = someNode->getRelCoor();
-   Vector newCoor = currentCoor + objectMovement;
-   someNode->setRelCoor(newCoor);
-   
-   yea right... shorter...
-
-*/
-void PNode::shiftCoor (Vector* shift)
-{
-  if( this->bAbsCoorChanged)
-    {
-      this->absCoordinate = this->absCoordinate + *shift;
-    }
-  else 
-    {
-      this->relCoordinate = this->relCoordinate + *shift;
-      this->bRelCoorChanged = true;
-    }
-}
-
-
-
-/**
-   \brief get relative direction
-   \returns relative direction to its parent
-*/
-Quaternion PNode::getRelDir ()
-{
-  return this->relDirection;
-}
-
-
-/**
-   \brief set relative direction
-   \param relative direction to its parent
-
-   it is very importand, that you use this function, if you want to update the
-   relDirection. If you don't use this, the PNode won't recognize, that something
-   has changed and won't update the children Nodes.
-*/
-void PNode::setRelDir (Quaternion* relDir)
-{
-  this->bRelCoorChanged = true;
-  this->relDirection = *relDir;
-}
-
-
-/**
-   \brief gets the absolute direction (0,0,1)
-   \returns absolute coordinates
-*/
-Quaternion PNode::getAbsDir ()
-{
-  return this->absDirection;
-}
-
-
-/**
-   \brief sets the absolute direction (0,0,1)
-   \param absolute coordinates
-
-   it is very importand, that you use this function, if you want to update the
-   absDirection. If you don't use this, the PNode won't recognize, that something
-   has changed and won't update the children Nodes.
-*/
-void PNode::setAbsDir (Quaternion* absDir)
-{
-  this->bAbsDirChanged = true;
-  this->absDirection = *absDir;
-}
-
-
-/**
-   \brief shift coordinate (abs and rel)
-   \param shift vector
-
-   this function shifts the current coordinates about the vector shift. this is
-   usefull because from some place else you can:
-   PNode* someNode = ...;
-   Quaternion objectMovement = calculateShift();
-   someNode->shiftCoor(objectMovement);
-
-   elsewhere you would have to:
-   PNode* someNode = ...;
-   Quaternion objectMovement = calculateShift();
-   Quaternion currentCoor = someNode->getRelCoor();
-   Quaternion newCoor = currentCoor + objectMovement;
-   someNode->setRelCoor(newCoor);
-   
-   yea right... shorter...
-
-*/
-void PNode::shiftDir (Quaternion* shift)
-{}
-
-
-
-/**
-   \brief adds a child and makes this node to a parent
-   \param child reference
-
-   use this to add a child to this node.
-*/
-void PNode::addChild (PNode* pNode)
-{
-  this->addChild(pNode, DEFAULT_MODE);
-}
-
-
-/**
-   \brief adds a child and makes this node to a parent
-   \param child reference
-   \param on which changes the child should also change ist state
-
-   use this to add a child to this node.
-*/
-void PNode::addChild (PNode* pNode, parentingMode mode)
-{
-  pNode->mode = mode;
-  pNode->parent = this;
-  this->children->add (pNode);
-}
-
-
-/**
-   /brief removes a child from the node
-*/
-void PNode::removeChild (PNode* pNode)
-{
-  this->children->remove (pNode);
-}
-
-
-/**
-   \brief sets the parent of this PNode
-*/
-void PNode::setParent (PNode* parent)
-{
-  this->parent = parent;
-}
-
-/**
-   \brief set the mode of this parent manualy
-*/
-void PNode::setMode (parentingMode mode)
-{
-  this->mode = mode;
-}
-
-/**
-   \brief has to be called, if the parent coordinate has changed
-   
-   normaly this will be done by the parent itself automaticaly. If you call this, you
-   will force an update of the coordinated of the node.
-*/
-void PNode::parentCoorChanged ()
-{
-  this->bRelCoorChanged = true;
-}
-
-
-/**
-   \brief has to be called, if the parent direction has changed
-   
-   normaly this will be done by the parent itself automaticaly. If you call this, you
-   will force an update of the direction of the node.
-*/
-void PNode::parentDirChanged ()
-{
-  this->bRelDirChanged = true;
-}
-
-
-/**
-   \brief updates the absCoordinate/absDirection
-
-   this is used to go through the parent-tree to update all the absolute coordinates
-   and directions. this update should be done by the engine, so you don't have to 
-   worry, normaly...
-*/
-void PNode::update (float timeStamp)
-{
-  printf ("PNode::update - %s - (%f, %f, %f)\n", this->objectName, this->absCoordinate.x, this->absCoordinate.y, this->absCoordinate.z);
-
-      if( this->mode == MOVEMENT || this->mode == ALL)
-	{
-	  if( this->bAbsCoorChanged /*&& this->timeStamp != DataTank::timeStamp*/)
-	    {
-	      printf("PNode::update () - this->bAbsCoorChanged = true\n");
-	      /* if you have set the absolute coordinates this overrides all other changes */
-	      this->relCoordinate = this->absCoordinate - parent->getAbsCoor ();
-	    }
-	  else if( this->bRelCoorChanged /*&& this->timeStamp != DataTank::timeStamp*/)
-	    {
-	      /*this is bad style... must be deleted later - just for testing*/
-	      if( this->parent == NULL)
-		{
-		this->absCoordinate = this->relCoordinate;
-		}
-	      else
-		this->absCoordinate = parent->getAbsCoor () + this->relCoordinate;	      /* update the current absCoordinate */
-	    }
-	}
-      
-      if( this->mode == ROTATION && this->mode == ALL)
-	{
-	  if( this->bAbsDirChanged /*&& this->timeStamp != DataTank::timeStamp*/)
-	    {
-	      /* if you have set the absolute coordinates this overrides all other changes */
-	      this->relDirection = this->absDirection - parent->getAbsDir ();
-	    }
-	  else if( this->bRelDirChanged /*&& this->timeStamp != DataTank::timeStamp*/)
-	    {
-	      /* update the current absDirection - remember * means rotation around sth.*/
-	      this->absDirection = parent->getAbsDir () * this->relDirection;
-	    }
-	}    
-      // }
-  PNode* pn = this->children->enumerate();
-  while( pn != NULL) 
-    { 
-      /* if this node has changed, make sure, that all children are updated also */
-      if( this->bRelCoorChanged || this->bAbsCoorChanged)
-	pn->parentCoorChanged ();
-      if( this->bRelDirChanged || this->bAbsDirChanged)
-	pn->parentDirChanged ();
-      pn->update(timeStamp);
-      pn = this->children->nextElement();
-    }
-
-  this->timeStamp = timeStamp;
-  this->bRelCoorChanged = false;
-  this->bAbsCoorChanged = false;
-  this->bRelDirChanged = false;
-  this->bAbsDirChanged = false;
-}
-
-
-/*
-  \brief tick
-*/
-void PNode::processTick (float dt)
-{
-  this->tick (dt);
-  PNode* pn = this->children->enumerate();
-  while( pn != NULL) 
-    { 
-      pn->processTick (dt);
-      pn = this->children->nextElement();
-    } 
-}
-
-
-void PNode::tick (float dt)
-{}
-
-
-void PNode::debug()
-{
-  printf("PNode::debug() - absCoord: (%f, %f, %f)\n", 
-	 this->absCoordinate.x, 
-	 this->absCoordinate.y,
-	 this->absCoordinate.z);
-}
-
-
-/*
-  \brief set the name of the node
-
-  for debug purposes realy usefull, not used to work properly
-*/
-void PNode::setName (char* newName)
-{
-  this->objectName = newName;
-}
-
-
-/*
-  \brief gets the name of the node
-*/
-char* PNode::getName ()
-{
-  return this->objectName;
-}
Index: xonox/branches/trackManager/src/p_node.h
===================================================================
--- /orxonox/branches/trackManager/src/p_node.h	(revision 3497)
+++ 	(revision )
@@ -1,92 +1,0 @@
-/*! 
-    \file p_node.h
-    \brief Definition of a parenting node
-
-    parenting is how coordinates are handled in orxonox, meaning, that all coordinates
-    are representet relative to another parent node. this nodes build a parenting
-    tree of one-sided references (from up to down referenced).
-    Every node manages itself a list of childrens (of whos it is parent - easy...)
-
-    absCoordinate, absDirection have to be recalculated as soon as there was a change in
-    place or ortientation. this is only the case if 
-    o bDirChanged is true (so changed) AND timeStamp != now
-    o bCoorChanged is true (so moved) AND timeStamp != now
-    this conditions make it cheaper to recalculate the tree (reduces redundant work).
-
-    remember: if you have to change the coordinates or the directions, use the functions
-    that are defined to execute this operation - otherwhise there will be big problems...
-*/
-
-
-#ifndef _P_NODE_H
-#define _P_NODE_H
-
-#include "stdincl.h"
-
-class PNode; /* forward decleration, so that parentEntry has access to PNode */
-
-typedef enum parentingMode {MOVEMENT = 0, ROTATION, ALL};
-#define DEFAULT_MODE ALL
-
-class PNode : public BaseObject {
-
- public:
-  PNode ();
-  PNode (Vector* absCoordinate, PNode* pNode);
-  virtual ~PNode ();
-
-  void destroy ();
-
-  PNode* parent; //! a pointer to the parent node
-  tList<PNode>* children; //! list of the children
-
-  parentingMode mode;
-
-  Vector getRelCoor ();
-  void setRelCoor (Vector* relCoord);
-  //void setRelCoor (Vector relCoord);
-  Vector getAbsCoor ();
-  void setAbsCoor (Vector* absCoord);
-  //void setAbsCoor (Vector absCoord);
-  void shiftCoor (Vector* shift);
-  //void shiftCoor (Vector shift);
-
-  Quaternion getRelDir ();
-  void setRelDir (Quaternion* relDir);
-  Quaternion getAbsDir ();
-  void setAbsDir (Quaternion* absDir);
-  void shiftDir (Quaternion* shift);
-
-  void addChild (PNode* pNode);
-  void addChild (PNode* pNode, parentingMode mode);
-  void removeChild (PNode* pNode);
-  void setParent (PNode* parent);
-  void parentCoorChanged ();
-  void parentDirChanged ();
-  void setMode (parentingMode mode);
-
-  virtual void update (float timeStamp);
-  void processTick (float dt);
-  virtual void tick (float dt);
-
-  void setName (char* newName);
-  char* getName ();
-
-
-  void debug ();
-
-  float timeStamp;   //! this the timeStamp of when the abs{Coordinat, Direction} has been calculated
-  char* objectName;
-  bool bAbsCoorChanged;
-  bool bRelCoorChanged;
-  bool bRelDirChanged;
-  bool bAbsDirChanged;
-
-  Vector relCoordinate;  //! coordinates relative to the parent
-  Vector absCoordinate; //! absolute coordinates in the world ( from (0,0,0) )
-  Quaternion relDirection; //! direction relative to the parent
-  Quaternion absDirection; //! absolute direvtion in the world ( from (0,0,1) )
-
-};
-
-#endif /* _P_NODE_H */
Index: xonox/branches/trackManager/src/player.cc
===================================================================
--- /orxonox/branches/trackManager/src/player.cc	(revision 3497)
+++ 	(revision )
@@ -1,168 +1,0 @@
-
-
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   ### File Specific:
-   main-programmer: Patrick Boenzli
-   co-programmer: Christian Meyer
-*/
-
-#include "player.h"
-#include "stdincl.h"
-#include "collision.h"
-#include "importer/objModel.h"
-
-using namespace std;
-
-
-Player::Player(bool isFree) : WorldEntity(isFree)
-{
-
-  this->model = new OBJModel("../data/models/reaplow.obj");
-  /*
-  objectList = glGenLists(1);
-  glNewList (objectList, GL_COMPILE);
-
-  glBegin(GL_TRIANGLES);
-  glColor3f(1,1,1);
-  glVertex3f(0,0,0.5);
-  glVertex3f(-0.5,0,-1);
-  glVertex3f(0.5,0,-1);
-
-  glVertex3f(0,0,0.5);
-  glVertex3f(0,0.5,-1);
-  glVertex3f(0,-0.5,-1);
-  glEnd();
-    
-  glBegin(GL_QUADS);
-  glColor3f(0,0,1);
-  glVertex3f(0.5,0.5,-1);
-  glVertex3f(0.5,-0.5,-1);
-  glVertex3f(-0.5,-0.5,-1);
-  glVertex3f(-0.5,0.5,-1);
-  glEnd();
-  
-  glEndList ();
-  */
-}
-
-Player::~Player ()
-{
-  delete this->model;
-}
-
-void Player::postSpawn ()
-{
-  travelSpeed = 15.0;
-  velocity = Vector();
-  bUp = bDown = bLeft = bRight = bAscend = bDescend = false;
-  bFire = false;
-  acceleration = 10.0;
-  setCollision(new CollisionCluster(1.0, Vector(0,0,0)));
-}
-
-void Player::tick (float time)
-{
-  // movement
-  this->move (time);
-}
-
-void Player::hit (WorldEntity* weapon, Vector loc)
-{
-}
-
-void Player::destroy ()
-{
-}
-
-void Player::collide (WorldEntity* other, Uint32 ownhitflags, Uint32 otherhitflags)
-{
-}
-
-void Player::command (Command* cmd)
-{
-  //printf("Player|recieved command [%s]\n", cmd->cmd);
-  if( !strcmp( cmd->cmd, "up")) bUp = !cmd->bUp;
-  else if( !strcmp( cmd->cmd, "down")) bDown = !cmd->bUp;
-  else if( !strcmp( cmd->cmd, "left")) bLeft = !cmd->bUp;
-  else if( !strcmp( cmd->cmd, "right")) bRight = !cmd->bUp;
-  else if( !strcmp( cmd->cmd, "fire")) bFire = !cmd->bUp;
-}
-
-void Player::draw ()
-{ 
-  glMatrixMode(GL_MODELVIEW);
-  glLoadIdentity();
-  float matrix[4][4];
-  
-  /* translate */
-  glTranslatef (this->getAbsCoor ().x, 
-		this->getAbsCoor ().y, 
-		this->getAbsCoor ().z);
-  /* rotate */
-  this->getAbsDir ().matrix (matrix);
-  glMultMatrixf((float*)matrix);
-  
-  glMatrixMode(GL_MODELVIEW);
-  this->model->draw();
-  // glCallList(objectList);
-}
-
-
-/*PN
-void Player::getLookat(Location* locbuf)
-{
-  *locbuf = *getLocation();
-  //locbuf->dist += 5.0;
-}
-*/
-
-void Player::leftWorld ()
-{
-}
-
-void Player::move (float time)
-{
-  Vector accel(0.0, 0.0, 0.0);
-  /* FIXME: calculating the direction and orthDirection every timeSlice is redundant! save it somewhere */
-  //Placement *pos = getPlacement();
-  
-  /* calculate the direction in which the craft is heading  */
-  Vector direction (1.0, 0.0, 0.0);
-  //direction = this->absDirection.apply (direction);
-  Vector orthDirection (0.0, 0.0, 1.0);
-  //orthDirection = orthDirection.cross (direction);
-
-  if( bUp) { accel = accel+(direction*acceleration); }
-  if( bDown) { accel = accel-(direction*acceleration); }
-  if( bLeft ) { accel = accel - (orthDirection*acceleration); }
-  if( bRight ) { accel = accel + (orthDirection*acceleration); }
-  if( bAscend ) { /* not yet implemented but just: (0,0,1)*acceleration */}
-  if( bDescend) {/* FIXME */} /* \todo up and down player movement */
-
-  //Location* l = getLocation();
-  
-  // r(t) = r(0) + v(0)*t + 1/2*a*t^2
-  // r = position
-  // v = velocity
-  // a = acceleration
-
-  /* this the base-speed of the player: determines how fast and how the player follows the track*/
-  //l->dist = l->dist + travelSpeed * time;
-  
-  Vector* shift = new Vector (this->travelSpeed * time, 0, 0);
-  this->shiftCoor (shift);
-  
-  /* this updates the player position on the track - user interaction */
-  //l->pos = l->pos + accel*time;
-  Vector move = accel * time;
-  this->shiftCoor (&move);
-}
Index: xonox/branches/trackManager/src/player.h
===================================================================
--- /orxonox/branches/trackManager/src/player.h	(revision 3497)
+++ 	(revision )
@@ -1,46 +1,0 @@
-/*! 
-    \file player.h
-    \brief Implements a basic controllable WorldEntity
-*/
-
-#ifndef _PLAYER_H
-#define _PLAYER_H
-
-#include "world_entity.h"
-
-class OBJModel;
-
-//! Basic controllable WorldEntity
-class Player : public WorldEntity 
-{
-  friend class World;
-  
- public:
-  Player(bool isFree = false);
-  ~Player();
-  
-  virtual void postSpawn();
-  virtual void tick(float time);
-  virtual void hit(WorldEntity* weapon, Vector loc);
-  virtual void destroy();
-  virtual void collide(WorldEntity* other, Uint32 ownhitflags, Uint32 otherhitflags);
-  virtual void command(Command* cmd);
-  
-  virtual void draw();
-  // virtual void getLookat(Location* locbuf);
-  
-  virtual void leftWorld();
-  
- private:
-  bool bUp, bDown, bLeft, bRight, bAscend, bDescend;
-  bool bFire;
-  Vector velocity;
-  float travelSpeed;
-  float acceleration;
-  GLuint objectList;
-  
-  void move(float time);
-  
-};
-
-#endif /* _PLAYER_H */
Index: xonox/branches/trackManager/src/power_up.cc
===================================================================
--- /orxonox/branches/trackManager/src/power_up.cc	(revision 3497)
+++ 	(revision )
@@ -1,32 +1,0 @@
-
-
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   ### File Specific:
-   main-programmer: ...
-   co-programmer: ...
-*/
-
-
-#include "power_up.h"
-
-
-using namespace std;
-
-
-
-PowerUp::PowerUp () {}
-
-
-
-PowerUp::~PowerUp () {}
-
-
Index: xonox/branches/trackManager/src/power_up.h
===================================================================
--- /orxonox/branches/trackManager/src/power_up.h	(revision 3497)
+++ 	(revision )
@@ -1,21 +1,0 @@
-/*! 
-    \file power_up.h
-    \brief A class representing a PowerUp in the world.
-*/ 
-
-#ifndef _POWER_UP_H
-#define _POWER_UP_H
-
-#include "data_tank.h"
-#include "ability.h"
-#include "world_entity.h"
-
-class PowerUp : Ability, WorldEntity { 
-
- public:
-  PowerUp ();
-  ~PowerUp ();
-  
-};
-
-#endif /* _POWER_UP_H */
Index: xonox/branches/trackManager/src/shoot_laser.cc
===================================================================
--- /orxonox/branches/trackManager/src/shoot_laser.cc	(revision 3497)
+++ 	(revision )
@@ -1,153 +1,0 @@
-
-
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   ### File Specific:
-   main-programmer: Patrick Boenzli
-   co-programmer: 
-*/
-
-
-
-
-#include <GL/glut.h>
-#include <iostream>
-
-#include "stdincl.h"
-#include "data_tank.h"
-
-#include "shoot_laser.h"
-
-using namespace std;
-
-
-
-ShootLaser::ShootLaser () 
-{
-  lastShoot = null;
-  step = 1.0;
-  inhibitor = 0;
-}
-
-
-ShootLaser::~ShootLaser () {}
-
-
-void ShootLaser::drawShoot() 
-{
-
-  //cout << "ShootLaser::drawShoot" << endl;
-  /* now draw all the shoots (many) */
-  shoot* tmpShoot = lastShoot;
-  shoot* lastRef = null;
-  while( tmpShoot != null )
-    {
-      glPushMatrix(); 
-      glTranslatef(tmpShoot->xCor, tmpShoot->yCor, tmpShoot->zCor);
-      tmpShoot->xCor+=tmpShoot->xVel;
-      tmpShoot->yCor+=tmpShoot->yVel;
-      glScalef(0.1, 0.1, 0.1);
-      glutWireCube(1.0);
-      glPopMatrix();
-
-      /* garbage collection: look if shoot is outside world */
-      /* fix1: weak boundaries check all four sides */
-      /* fix2: conditions, that a struct tree can be cut off */
-      /* fix3: more efficent and nicer please */
-      if (tmpShoot->yCor - DataTank::yOffset > 20) 
-	{
-	  /* normal case: delete one element, link the others */
-	  if (lastRef != null) 
-	    {
-	      //cout << "garbage collection" << endl;
-	      lastRef->next = tmpShoot->next;
-	      delete tmpShoot;
-	      tmpShoot = lastRef->next;
-	      //cout << "garbage collection left" << endl;
-	    }
-	  else
-	    {
-	      /* special case: first element to be processed */
-	      //cout << "garbage collecton: first el in queue" << endl;
-	      lastRef = tmpShoot->next;
-	      delete tmpShoot;
-	      tmpShoot = lastRef;
-	      lastShoot = tmpShoot;
-	      if (tmpShoot != null) 
-		{
-		  tmpShoot = tmpShoot->next;
-		  //cout << "noch nich null" << endl;
-		}
-	      else 
-		{
-		  lastRef = null;
-		  tmpShoot = null;
-		  lastShoot = null;
-		  //cout << "endl null" << endl;
-		}
-	      
-	      //cout << "garbage collection: firtst el in queue left" << endl;
-	    }
-	}
-      else 
-	{
-	  lastRef = tmpShoot;
-	  tmpShoot = tmpShoot->next;
-	}
-    }
-  //cout << "ShootLaser::drawShoot - finished" << endl;
-}
-
-
-void ShootLaser::addShoot(shoot* sh) 
-{
-  sh->next = null;
-  lastShoot = sh;
-}
-
-void ShootLaser::addShoot(float x, float y, float z)
-{
-  //cout << "ShootLaser::addShoot" << endl;
-  shoot* sh = new shoot;
-  sh->xCor = x; sh->yCor = y; sh->zCor = z;
-  sh->xVel = 0; sh->yVel = .4/step; sh->zVel = 0;
-  sh->next = lastShoot;
-  lastShoot = sh;
-}
-
-void ShootLaser::addShootExt(float x, float y, float z, 
-			     float xVel, float yVel, float zVel)
-{
-  //cout << "ShootLaser::addShootExtended" << endl;
-  shoot* sh = new shoot;
-  sh->xCor = x; sh->yCor = y; sh->zCor = z;
-  sh->xVel = xVel/step; sh->yVel = yVel/step; sh->zVel = zVel/step;
-  sh->next = lastShoot;
-  lastShoot = sh;
-}
-
-void ShootLaser::setShootStep(float step) 
-{
-  cout << "ShootLaser::setShootStep to " << step << endl;
-  this->step = step;
-  cout << "ShootLaser::setShootStep end " << step << endl;
-}
-
-
-/* Exterminate shoot from game, implement this method  */
-/* if you like to add animatiion */
-void ShootLaser::removeShoot(shoot* sh)
-{
-  glPushMatrix(); 
-  glTranslatef(sh->xCor, sh->yCor, sh->zCor);
-  glutWireCube(1.0);
-  glPopMatrix();
-}
Index: xonox/branches/trackManager/src/shoot_laser.h
===================================================================
--- /orxonox/branches/trackManager/src/shoot_laser.h	(revision 3497)
+++ 	(revision )
@@ -1,42 +1,0 @@
-
-#ifndef _SHOOT_LASER_H
-#define _SHOOT_LASER_H
-
-
-class ShootLaser {
-
- public:
-  
-  /* a list of all shoot-amental objects */
-  struct shoot {
-    shoot *next;
-    float xCor;
-    float yCor;
-    float zCor;    
-    float xVel;
-    float yVel;
-    float zVel;
-    float collisionRadius;
-  };
-  shoot* lastShoot;
-
-  ShootLaser ();
-  ~ShootLaser ();
-
-  int inhibitor;
-
-  void drawShoot(void);
-  void addShoot(shoot* sh);
-  void addShoot(float x, float y, float z);
-  void addShootExt(float x, float y, float z, float xVel, float yVel, float zVel);
-  void setShootStep(float step);
-  void removeShoot(shoot* sh);
-
-
- private:
-
-  float step;
-
-};
-
-#endif /* _SHOOT_LASER_H */
Index: xonox/branches/trackManager/src/shoot_rocket.cc
===================================================================
--- /orxonox/branches/trackManager/src/shoot_rocket.cc	(revision 3497)
+++ 	(revision )
@@ -1,220 +1,0 @@
-
-
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   ### File Specific:
-   main-programmer: Patrick Boenzli
-   co-programmer:  Benjamin Grauer
-*/
-
-
-#include <iostream>
-#include <math.h>
-#include <GL/glut.h>
-
-#include "stdincl.h"
-#include "data_tank.h"
-#include "npc.h"
-
-#include "shoot_rocket.h"
-
-using namespace std;
-
-
-
-ShootRocket::ShootRocket ()
-{
-  lastShoot = null;
-  step = 1.0;
-  inhibitor =0;
-  rotateAngle = 0.0;
-}
-
-
-ShootRocket::~ShootRocket () {}
-
-
-void ShootRocket::drawShoot() 
-{
-
-  //cout << "ShootRocket::drawShoot" << endl;
-  /* now draw all the shoots (many) */
-  shoot* tmpShoot = lastShoot;
-  shoot* lastRef = null;
-  while( tmpShoot != null )
-    {
-      glPushMatrix(); 
-      glTranslatef(tmpShoot->xCor, tmpShoot->yCor, tmpShoot->zCor);
-      tmpShoot->age+=step;
-      switch (tmpShoot->type)
-	{
-	case BACKPARABLE:
-	  tmpShoot->xCor+=tmpShoot->xVel;
-	  tmpShoot->yCor+=tmpShoot->yVel;
-	  tmpShoot->xVel+=tmpShoot->xAcc;
-	  tmpShoot->yVel+=tmpShoot->yAcc;
-	  break;
-	
-	case SIDEACC:
-	  if (tmpShoot->xVel >= .01 || tmpShoot->xVel <= -.01)
-	    {
-	      tmpShoot->xCor+=tmpShoot->xVel;
-	      tmpShoot->yCor+=tmpShoot->yVel;
-	      tmpShoot->xVel*=tmpShoot->xAcc;
-	    }
-	  else
-	    {
-	      tmpShoot->xCor+=tmpShoot->xVel;
-	      tmpShoot->yCor+=tmpShoot->yVel;
-	      tmpShoot->yVel+=tmpShoot->yVel*tmpShoot->yAcc;
-	    }
-	  break;
-	
-	case ROTATER:
-	  tmpShoot->xCor+=tmpShoot->xVel;
-	  tmpShoot->yCor+=tmpShoot->yVel;
-	  tmpShoot->zCor+=tmpShoot->zVel;
-	  break;
-	
-	}
-      
-      glScalef(0.1, 0.1, 0.1);
-      glutWireCube(1.0);
-      glPopMatrix();
-
-      /* garbage collection: look if shoot is outside world */
-      /* fix1: weak boundaries check all four sides */
-      /* fix2: conditions, that a struct tree can be cut off */
-      /* fix3: more efficent and nicer please */
-      if (tmpShoot->age > tmpShoot->lifetime) 
-	{
-	  /* normal case: delete one element, link the others */
-	  if (lastRef != null) 
-	    {
-	      //cout << "garbage collection" << endl;
-	      lastRef->next = tmpShoot->next;
-	      delete tmpShoot;
-	      tmpShoot = lastRef->next;
-	      //cout << "garbage collection left" << endl;
-	    }
-	  else
-	    {
-	      /* special case: first element to be processed */
-	      //cout << "garbage collecton: first el in queue" << endl;
-	      lastRef = tmpShoot->next;
-	      delete tmpShoot;
-	      tmpShoot = lastRef;
-	      lastShoot = tmpShoot;
-	      if (tmpShoot != null) 
-		{
-		  tmpShoot = tmpShoot->next;
-		  //cout << "noch nich null" << endl;
-		}
-	      else 
-		{
-		  lastRef = null;
-		  tmpShoot = null;
-		  lastShoot = null;
-		  //cout << "endl null" << endl;
-		}
-	      
-	      //cout << "garbage collection: firtst el in queue left" << endl;
-	    }
-	}
-      else 
-	{
-	  lastRef = tmpShoot;
-	  tmpShoot = tmpShoot->next;
-	}
-    }
-  //cout << "ShootRocket::drawShoot - finished" << endl;
-}
-
-
-void ShootRocket::addShoot(shoot* sh) 
-{
-  sh->next = null;
-  lastShoot = sh;
-}
-
-void ShootRocket::addBackParable(float x, float y, float z)
-{
-  
-  //cout << "ShootRocket::addShoot" << endl;
-  shoot* sh = new shoot;
-  sh->type = BACKPARABLE;
-  sh->xCor = x; sh->yCor = y; sh->zCor = z;
-  sh->xVel = (-1+(float)rand() / 1000000000/step)/5; 
-  sh->yVel = -.3;
-  sh->zVel = (1-(float)rand() / 1000000000/step)/5;
-  sh->xAcc = 0; sh->yAcc = .01/step; sh->zAcc = 0;
-  sh->age=0;
-  sh->lifetime=5; 
-  sh->next = lastShoot;
-  lastShoot = sh;
-  }
-void ShootRocket::addSideAcc(float x, float y, float z, enum RocketDirection direction)
-{
-  //cout << "ShootRocket::addShoot" << endl;
-  shoot* sh = new shoot;
-  sh->type = SIDEACC;
-  sh->xCor = x; sh->yCor = y; sh->zCor = z;
-  switch (direction)
-    {
-    case LEFT:
-      sh->xVel = -.5; sh->yVel = .05; sh->zVel = 0;
-      break;
-    case RIGHT:
-      sh->xVel = .5; sh->yVel = .05; sh->zVel = 0;
-      break;
-    }
-  sh->xAcc = .9; sh->yAcc = .02; sh->zAcc = 0;
-  sh->age=0;
-  sh->lifetime=10; 
-  sh->next = lastShoot;
-  lastShoot = sh;
-}
-
-void ShootRocket::addRotater(float x, float y, float z)
-{
-  
-  static float radius = 2;
-  rotateAngle+=.1;
-  //cout << "ShootRocket::addShoot" << endl;
-  shoot* sh = new shoot;
-  sh->type = ROTATER;
-  sh->xCor = x+radius*sin(rotateAngle); sh->yCor = y; sh->zCor = z+radius*cos(rotateAngle);
-  sh->xVel = 1*cos(rotateAngle)*step;
-  sh->yVel = 4*step;
-  sh->zVel = 1*sin(rotateAngle)*step;
-  sh->xAcc = 1.01; sh->yAcc = 1- step; sh->zAcc = 1.01;
-  sh->age=0;
-  sh->lifetime=10; 
-  sh->next = lastShoot;
-  lastShoot = sh;
-}
-
-void ShootRocket::setShootStep(float step) 
-{
-  cout << "ShootRocket::setShootStep to " << step << endl;
-  this->step = step;
-}
-
-
-/* Exterminate shoot from game, implement this method  */
-/* if you like to add animatiion */
-void ShootRocket::removeShoot(shoot* sh)
-{
-  glPushMatrix(); 
-  glTranslatef(sh->xCor, sh->yCor, sh->zCor);
-  glutWireCube(1.0);
-  glPopMatrix();
-}
Index: xonox/branches/trackManager/src/shoot_rocket.h
===================================================================
--- /orxonox/branches/trackManager/src/shoot_rocket.h	(revision 3497)
+++ 	(revision )
@@ -1,56 +1,0 @@
-
-#ifndef _SHOOT_ROCKET_H
-#define _SHOOT_ROCKET_H
-
-
-
-enum RocketType { HOMING, SIDEACC, BACKPARABLE, ROTATER};
-enum RocketDirection {LEFT, RIGHT, UP, DOWN};
-
-
-class ShootRocket {
-
- public:
-  
-  /* a list of all shoot-amental objects */
-  struct shoot {
-    enum RocketType type;
-    shoot *next;
-    float xCor;
-    float yCor;
-    float zCor;    
-    float xVel;
-    float yVel;
-    float zVel;
-    float xAcc;
-    float yAcc;
-    float zAcc;
-    float age;
-    float lifetime;
-    float collisionRadius;
-  };
-  shoot* lastShoot;
-  
-  ShootRocket ();
-  ~ShootRocket ();
-  
-  int inhibitor;
-  float rotateAngle;
-
-  void drawShoot(void);
-  void addShoot(shoot* sh);
-  void addBackParable(float x, float y, float z);
-  void addSideAcc(float x, float y, float z, enum RocketDirection direction);
-  void addRotater(float x, float y, float z);
-
-  void setShootStep(float step);
-  void removeShoot(shoot* sh);
-
-
- private:
-
-  float step;
-
-};
-
-#endif /* _SHOOT_ROCKET_H */
Index: xonox/branches/trackManager/src/skysphere.cc
===================================================================
--- /orxonox/branches/trackManager/src/skysphere.cc	(revision 3497)
+++ 	(revision )
@@ -1,129 +1,0 @@
-
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   ### File Specific:
-   main-programmer: David Gruetter
-   co-programmer: Benjamin Grauer
-
-    Created by Dave: this file is actually quite similar to player.cc and so is 
-    skybox.h similar to player.h
-    With that said, things should be clear:)
-
-    Edited by Bensch: more constructors, changeability, comments...
-
-*/
-
-#include "importer/material.h"
-#include "skysphere.h"
-#include "stdincl.h"
-#include "vector.h"
-#include "world_entity.h"
-
-
-using namespace std;
-
-/**
-   \brief Standart Constructor
-*/
-Skysphere::Skysphere()
-{  
-  initialize("../data/pictures/sky-replace.jpg");
-}
-
-/**
-   \brief Constructs a SkySphere and takes fileName as a map.
-   \param fileName the file to take as input for the skysphere
-*/
-Skysphere::Skysphere(char* fileName)
-{
-  initialize(fileName);
-}
-
-/**
-   \brief default destructor
-*/
-Skysphere::~Skysphere()
-{
-  PRINTF(3)("Deleting the SkySphere\n");
-  delete skyMaterial;
-  free(sphereObj);
-}
-
-/**
-   \brief initializes the Skysphere.
-   \param fileName the file to take as input for the skysphere
-*/
-void Skysphere::initialize(char* fileName)
-{
-  PRINTF(1)("initializing the Skysphere with Material %s.\n", fileName);
-  this->sphereObj = gluNewQuadric();
-  gluQuadricTexture(this->sphereObj, GL_TRUE);
-  this->setRadius(250.0);
-
-  this->skyMaterial = new Material("Sky");
-  this->setTexture(fileName);
-  this->skyMaterial->setIllum(3);
-  this->skyMaterial->setAmbient(1.0, 1.0, 1.0);
-}
-
-/**
-   \brief sets the Radius of the Sphere.
-   \param radius The Radius of The Sphere
-*/
-void Skysphere::setRadius(float radius)
-{
-  this->sphereRadius = radius;
-}
-
-/**
-   \brief Defines which texture should be loaded onto the skysphere.
-   \param fileName The filename of the Texture
-*/
-void Skysphere::setTexture(char* fileName)
-{
-  this->skyMaterial->setDiffuseMap(fileName);
-}
-
-/**
-   \brief updates the position of the Skysphere
-   \param x the x-coordinate of the Center of the Sphere
-   \param y the y-coordinate of the Center of the Sphere
-   \param z the z-coordinate of the Center of the Sphere
-   
-   This is normally done in the update-phase of world, so the Skysphere is always centered at the Camera.
-*/
-void Skysphere::updatePosition(Vector sphereCenter)
-{
-  this->sphereCenter = sphereCenter;
-}
-
-/**
-   \brief draws the Skysphere
-   
-   This part is normally precessed in the "Painting Phase".
-*/
-
-void Skysphere::draw()
-{
-  glEnable(GL_TEXTURE_2D);
-  skyMaterial->select();
-  glPushMatrix();
-  glTranslatef(this->sphereCenter.x,this->sphereCenter.y,this->sphereCenter.z);
-  
-  glRotatef(-30, 1, 0, 0);
-  glRotatef(95.0f, 0.0f, 0.0f, 1.0f);
-  glRotatef(-250.0f, 0.0, 1.0f, 0.0f);
-  
-  gluSphere(sphereObj, sphereRadius, 20, 20);
-  glPopMatrix();
-  glDisable(GL_TEXTURE_2D);
-
-}
Index: xonox/branches/trackManager/src/skysphere.h
===================================================================
--- /orxonox/branches/trackManager/src/skysphere.h	(revision 3497)
+++ 	(revision )
@@ -1,48 +1,0 @@
-/*! 
-    \file skysphere.h
-    \brief Definition of the Skysphere, that handles the Display of an atmosphere of orxonox.
-
-    A SkySphere is always centered at the current working Camera, and will only obey the cameras
-    movment but not its rotation.
-
-    \todo self-rotation
-    \todo handle reference to parent-object
-*/
-
-#ifndef _SKYSPHERE_H
-#define _SKYSPHERE_H
-
-/* INCLUDES */
-#include "p_node.h"
-
-/* FORWARD DEFINITION */
-class Material;
-class Vector;
-
-//! A Class to handle a SkySphere
-class Skysphere: public PNode 
-{
- private: 
-  GLUquadricObj *sphereObj; //!< A Placeholder for the SkySphere.
-  Material *skyMaterial;    //!< A Material for the SkySphere.
-  Vector sphereCenter;      //!< Center of the SkySphere.
-  float sphereRadius;       //!< Radius of the SkySphere. This should match the frustum maximum range.
-
- public:
-  Skysphere();
-  Skysphere(char* fileName);
-  ~Skysphere();
-
-  void setRadius(float radius);
-  void setTexture(char* fileName);
-
-  void updatePosition(Vector sphereCenter);
-  void draw();
-
- private:
-  void initialize(char* fileName);  
-};
-
-#endif
-
-
Index: xonox/branches/trackManager/src/stdincl.h
===================================================================
--- /orxonox/branches/trackManager/src/stdincl.h	(revision 3497)
+++ 	(revision )
@@ -1,47 +1,0 @@
-/*!
-  \file stdincl.h
-  \brief This file includes default headers that nearly every Class needs.
-  
-  no Class is defined here, but many headers to classes, and more general Headers like the openGL-header.
-*/
-
-#ifndef _STDINCL_H
-#define _STDINCL_H
-
-#define null 0   //!< null
-
-typedef unsigned char byte;
-
-// this includes the information from configure/makefiles
-#if HAVE_CONFIG_H 
-#include <config.h> 
-#endif
-
-#ifdef __WIN32__
-#include <windows.h>
-#endif
-
-#ifndef __APPLE__
-#include <SDL/SDL.h>
-#include <GL/gl.h>
-#include <GL/glu.h>
-#else
-#include <SDL.h>
-#include <OpenGL/gl.h>
-#include <OpenGL/glu.h>
-#endif
-
-#include "vector.h"
-#include "matrix.h"
-#include "curve.h"
-//#include "coordinates.h"
-#include "list.h"
-#include "list_template.h"
-#include "error.h"
-#include "debug.h"
-#include "message_structures.h"
-#include "orxonox.h"
-#include "data_tank.h"
-#include "base_object.h"
-
-#endif /* _STDINCL_H */
Index: xonox/branches/trackManager/src/story_def.h
===================================================================
--- /orxonox/branches/trackManager/src/story_def.h	(revision 3497)
+++ 	(revision )
@@ -1,24 +1,0 @@
-
-#ifndef _STORY_DEF_H
-#define _STORY_DEF_H
-
-
-#define DEBUG_CAMPAIGN_0 1000
-#define DEBUG_CAMPAIGN_1 1001
-#define DEBUG_CAMPAIGN_2 1002
-
-#define DEBUG_WORLD_0 100
-#define DEBUG_WORLD_1 101
-#define DEBUG_WORLD_2 102
-
-#define WORLD_ID_0 0
-#define WORLD_ID_1 1
-#define WORLD_ID_2 2
-#define WORLD_ID_3 3
-#define WORLD_ID_4 4
-#define WORLD_ID_5 5
-#define WORLD_ID_GAMEEND 999
-
-#define MAX_STORY_ENTITIES 99 //!> maximal StoryEntities in a Campaign
-
-#endif /* _STORY_DEF_H */
Index: /orxonox/branches/trackManager/src/story_entities/campaign.cc
===================================================================
--- /orxonox/branches/trackManager/src/story_entities/campaign.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/story_entities/campaign.cc	(revision 3498)
@@ -0,0 +1,202 @@
+
+
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: Patrick Boenzli
+   co-programmer: 
+*/
+
+
+#include "campaign.h"
+#include "world.h"
+#include "camera.h"
+#include "story_entity.h"
+
+using namespace std;
+
+
+Campaign::Campaign () 
+{
+  this->entities = new ListTemplate<StoryEntity>();
+  this->isInit = false;
+}
+
+Campaign::~Campaign () {}
+
+
+ErrorMessage Campaign::init()
+{
+  this->isInit = true;
+}
+
+
+ErrorMessage Campaign::start()
+{
+  this->start(0);
+}
+
+
+ErrorMessage Campaign::start(int storyID = 0)
+{
+  printf("World::start() - starting new StoryEntity Nr:%i\n", storyID);
+  ErrorMessage errorCode;
+  if( !this->isInit) return errorCode; 
+  if( storyID == WORLD_ID_GAMEEND) return errorCode;
+  this->running = true;
+  StoryEntity* se = this->getStoryEntity(storyID);
+  this->currentEntity = se;
+  while( se != NULL && this->running)
+    {
+      se->displayLoadScreen();
+      se->load();
+      se->init();
+      se->releaseLoadScreen();
+      se->start();
+      se->destroy();
+     
+      delete se;
+
+      int nextWorldID = se->getNextStoryID();
+      //printf("Campaing::start() - got nextWorldID = %i\n", nextWorldID);
+      se = this->getStoryEntity(nextWorldID);
+      this->currentEntity = se;
+      if( ( nextWorldID == WORLD_ID_GAMEEND) ||( se == NULL) ) 
+	{
+	  printf("Campaign::start() - quitting campaing story loop\n");
+	  if(se != NULL)
+	    delete se;
+	  return errorCode;
+	}
+      
+    }
+}
+
+
+ErrorMessage Campaign::pause()
+{
+  if(this->currentEntity != NULL)
+    this->isPaused = true;
+}
+
+
+ErrorMessage Campaign::resume()
+{
+  if(this->currentEntity != NULL)
+    this->isPaused = false;
+}
+
+
+ErrorMessage Campaign::stop()
+{
+  this->running = false;
+  if(this->currentEntity != NULL) 
+    {
+      this->currentEntity->stop();
+      //delete this->currentEntity;
+      //this->currentEntity = NULL;
+    }
+}
+
+
+ErrorMessage Campaign::destroy()
+{
+  if(this->currentEntity != NULL)
+    {
+      this->currentEntity->destroy();
+      delete this->currentEntity;
+      this->currentEntity = NULL;
+    }
+}
+
+
+/** 
+    \brief adds an game stroy entity to the campaign
+
+    \param se: The entity
+    \param storyID: The number that identifies the entity in the campaign. Each ID only used once in a Campaign
+
+    An entity can be a world (playable), a cinematic, a shop, sounds, whatever you
+    want to queue up in the campaign.
+*/
+void Campaign::addEntity(StoryEntity* se, int storyID)
+{
+  se->setStoryID(storyID);
+  this->addEntity(se);
+}
+
+void Campaign::addEntity(StoryEntity* se)
+{
+  this->entities->add(se);
+}
+
+
+void Campaign::removeEntity(int storyID)
+{
+  this->removeEntity(this->getStoryEntity(storyID));
+  
+}
+
+
+void Campaign::removeEntity(StoryEntity* se)
+{
+  this->entities->remove(se);
+}
+
+
+/*
+  \brief this changes to the next level
+*/
+void Campaign::nextLevel()
+{
+  printf("Campaign:nextLevel()\n");
+  //int nextID = this->currentEntity->getNextStoryID();
+  //this->stop();
+  //this->start(nextID);
+  this->currentEntity->stop();
+}
+
+/*
+  \brief change to the previous level - not implemented
+
+  this propably useless
+*/
+void Campaign::previousLevel()
+{}
+
+
+/*
+  \brief lookup a entity with a given id
+  \param story id to be lookuped
+  \returns the entity found or NULL if search ended without match
+*/
+StoryEntity* Campaign::getStoryEntity(int storyID)
+{
+  //printf("Campaing::getStoryEntity(%i) - getting next Entity\n", storyID);
+  if( storyID == WORLD_ID_GAMEEND)
+    return NULL;
+  ListTemplate<StoryEntity>* l;
+  StoryEntity* entity = NULL;
+  l = this->entities->getNext();  
+  while( l != NULL) 
+    { 
+      entity = l->getObject();
+      l = l->getNext();
+      int id = entity->getStoryID();
+      //printf("Campaing::getStoryEntity() - now looping, found entity nr=%i\n", id);
+      if(id == storyID)
+	{
+	  //printf("Campaing::getStoryEntity() - yea, this is what we where looking for: %id\n");
+	  return entity;
+	}
+    }
+  return NULL;
+}
Index: /orxonox/branches/trackManager/src/story_entities/campaign.h
===================================================================
--- /orxonox/branches/trackManager/src/story_entities/campaign.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/story_entities/campaign.h	(revision 3498)
@@ -0,0 +1,42 @@
+
+#ifndef _CAMPAIGN_H
+#define _CAMPAIGN_H
+
+#include "stdincl.h"
+#include "story_entity.h"
+
+
+class World;
+
+class Campaign : public StoryEntity {
+
+ public:
+  Campaign ();
+  ~Campaign ();
+
+  StoryEntity* currentEntity;
+
+  virtual ErrorMessage init();
+  virtual ErrorMessage start();
+  virtual ErrorMessage start(int storyID);
+  virtual ErrorMessage pause();
+  virtual ErrorMessage resume();
+  virtual ErrorMessage stop();
+  virtual ErrorMessage destroy();
+
+  void addEntity(StoryEntity* se, int storyID);
+  void addEntity(StoryEntity* se);
+  void removeEntity(int storyID);
+  void removeEntity(StoryEntity* se);
+  
+  void nextLevel();
+  void previousLevel();
+
+ private:
+  ListTemplate<StoryEntity>* entities;
+  bool running;
+
+  StoryEntity* getStoryEntity(int storyID);
+};
+
+#endif /* _CAMPAIGN_H */
Index: /orxonox/branches/trackManager/src/story_entities/story_def.h
===================================================================
--- /orxonox/branches/trackManager/src/story_entities/story_def.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/story_entities/story_def.h	(revision 3498)
@@ -0,0 +1,24 @@
+
+#ifndef _STORY_DEF_H
+#define _STORY_DEF_H
+
+
+#define DEBUG_CAMPAIGN_0 1000
+#define DEBUG_CAMPAIGN_1 1001
+#define DEBUG_CAMPAIGN_2 1002
+
+#define DEBUG_WORLD_0 100
+#define DEBUG_WORLD_1 101
+#define DEBUG_WORLD_2 102
+
+#define WORLD_ID_0 0
+#define WORLD_ID_1 1
+#define WORLD_ID_2 2
+#define WORLD_ID_3 3
+#define WORLD_ID_4 4
+#define WORLD_ID_5 5
+#define WORLD_ID_GAMEEND 999
+
+#define MAX_STORY_ENTITIES 99 //!> maximal StoryEntities in a Campaign
+
+#endif /* _STORY_DEF_H */
Index: /orxonox/branches/trackManager/src/story_entities/story_entity.cc
===================================================================
--- /orxonox/branches/trackManager/src/story_entities/story_entity.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/story_entities/story_entity.cc	(revision 3498)
@@ -0,0 +1,177 @@
+
+
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: Patrick Boenzli
+   co-programmer: 
+*/
+
+
+#include "story_entity.h"
+
+
+using namespace std;
+
+
+
+StoryEntity::StoryEntity () {}
+StoryEntity::~StoryEntity () {}
+
+
+/** 
+    \brief sets the story ID
+
+    sets the story id of the current entity, this enables it to be identified in a 
+    global context.
+*/
+void StoryEntity::setStoryID(int storyID)
+{
+  this->storyID = storyID;
+}
+
+
+/** 
+    \brief this reads the story id of the current entity
+    \returns the story entity id
+*/
+int StoryEntity::getStoryID()
+{
+  return this->storyID;
+}
+
+
+/** 
+    \brief sets the id of the next story entity
+    
+    StoryEntities can choose their following entity themselfs. the entity id defined here
+    will be startet after this entity ends. this can be convenient if you want to have a
+    non linear story with switches.
+*/
+void StoryEntity::setNextStoryID(int nextStoryID)
+{
+  this->nextStoryID = nextStoryID;
+}
+
+/** 
+    \brief gets the story id of the current entity
+    \returns story id
+*/
+int StoryEntity::getNextStoryID()
+{
+  return this->nextStoryID;
+}
+
+
+/** 
+    \brief initialize the entity before use. 
+    \returns an error code if not able to apply.
+
+    After execution of this function, the Entity is ready to be played/executed, 
+    this shifts the initialisation work before the execution - very important...
+*/
+ErrorMessage StoryEntity::init()
+{}
+
+
+/** 
+    \brief loads the current entity
+
+    this is here to enable you loading maps into the entities. for all other actions you
+    should take the init() function.
+*/
+ErrorMessage StoryEntity::load()
+{}
+
+/** 
+    \brief starts the entity with the choosen id. only for entities with lists.
+    \param story id
+    \returns error code if this action has caused a error
+
+    this simply starts the story with the id storyID. the story with the choosen id has
+    to be part of the current entity else, this doesn't make sense. this is used for
+    campaigns or the GameLoader, they have lists of Campaigns/Worlds with their own
+    storyID.
+*/
+ErrorMessage StoryEntity::start(int storyID)
+{}
+
+
+/** 
+    \brief starts the current entity
+    \returns error code if this action has caused a error    
+*/
+ErrorMessage StoryEntity::start()
+{}
+
+
+/** 
+    \brief pause the current entity
+    \returns error code if this action has caused a error
+
+    this pauses the current entity or passes this call forth to the running entity.
+*/
+ErrorMessage StoryEntity::pause()
+{}
+
+
+/** 
+    \brief resumes a pause
+    \returns error code if this action has caused a error
+
+    this resumess the current entity or passes this call forth to the running entity.
+*/
+ErrorMessage StoryEntity::resume()
+{}
+
+
+/** 
+    \brief stops the current entity
+    \returns error code if this action has caused a error
+
+    ATTENTION: this function shouldn't call other functions, or if so, they must return
+    after finishing. If you ignore or forget to do so, the current entity is not able to
+    terminate and it will run in the background or the ressources can't be freed or even
+    worse: are freed and the program will end in a segmentation fault!
+    hehehe, all seen... :)
+*/
+ErrorMessage StoryEntity::stop()
+{}
+
+
+/** 
+    \brief destroys and cleans up the current entity. 
+
+    this cleans up ressources before the deconstructor is called. for terminating 
+    the entity please use the stop() function.
+*/
+ErrorMessage StoryEntity::destroy()
+{}
+
+
+/** 
+    \brief this displays the load screen
+
+    it will need some time to load maps or things like that. to inform the user about 
+    progress and to just show him/her something for the eyes, put here this stuff
+*/
+void StoryEntity::displayLoadScreen()
+{}
+
+
+/** 
+    \brief undisplay the load screen
+
+    the load process has terminated, you now can release the load screen and start this
+    entity.
+*/
+void StoryEntity::releaseLoadScreen()
+{}
Index: /orxonox/branches/trackManager/src/story_entities/story_entity.h
===================================================================
--- /orxonox/branches/trackManager/src/story_entities/story_entity.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/story_entities/story_entity.h	(revision 3498)
@@ -0,0 +1,48 @@
+/*! 
+    \file story_entity.h
+    \brief holds the base class of everything that is playable - that is part of the story
+*/ 
+
+
+#ifndef _STORY_ENTITY_H
+#define _STORY_ENTITY_H
+
+#include "stdincl.h"
+#include "story_def.h"
+
+//! A class that represents something to play in orxonox. it is a container for worlds, movies, mission briefings, etc...
+class StoryEntity : public BaseObject {
+
+ public:
+  StoryEntity ();
+  virtual ~StoryEntity ();
+
+  bool isInit;  //! if the entity is initialized, this has to be true
+  bool isPaused; //! is true if the entity is paused
+
+  virtual ErrorMessage load();
+  virtual ErrorMessage init();
+  virtual ErrorMessage start(int storyID);
+  virtual ErrorMessage start();
+  virtual ErrorMessage pause();
+  virtual ErrorMessage resume();
+  virtual ErrorMessage stop();
+  virtual ErrorMessage destroy();
+
+
+  virtual void displayLoadScreen();
+  virtual void releaseLoadScreen();
+
+  void setStoryID(int storyID);
+  int getStoryID();
+
+  void setNextStoryID(int nextStoryID);
+  int getNextStoryID();
+
+
+ private:
+  int storyID; //! this is the number of this entity, identifying it in a list/tree...
+  int nextStoryID; //! if this entity has finished, this entity shall be called
+};
+
+#endif /* _STORY_ENTITY_H */
Index: /orxonox/branches/trackManager/src/story_entities/world.cc
===================================================================
--- /orxonox/branches/trackManager/src/story_entities/world.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/story_entities/world.cc	(revision 3498)
@@ -0,0 +1,903 @@
+
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: Patrick Boenzli
+   co-programmer: Christian Meyer
+*/
+
+#include "world.h"
+#include "world_entity.h"
+#include "track_manager.h"
+#include "player.h"
+#include "command_node.h"
+#include "camera.h"
+#include "environment.h"
+#include "p_node.h"
+#include "null_parent.h"
+#include "helper_parent.h"
+#include "glmenu_imagescreen.h"
+#include "skysphere.h"
+#include "light.h"
+#include "fontset.h"
+
+using namespace std;
+
+
+/** 
+    \brief create a new World
+    
+    This creates a new empty world!
+*/
+World::World (char* name)
+{
+  this->setClassName ("World");
+  this->worldName = name;
+  this->debugWorldNr = -1;
+  this->entities = new tList<WorldEntity>();
+}
+
+/**
+   \brief creates a new World...
+   \param worldID with this ID
+*/
+World::World (int worldID)
+{
+  this->debugWorldNr = worldID;
+  this->worldName = NULL;
+  this->entities = new tList<WorldEntity>();
+}
+
+/** 
+    \brief remove the World from memory
+    
+    delete everything explicitly, that isn't contained in the parenting tree!
+    things contained in the tree are deleted automaticaly
+*/
+World::~World ()
+{
+  printf("World::~World() - deleting current world\n");
+  CommandNode* cn = Orxonox::getInstance()->getLocalInput();
+  cn->unbind(this->localPlayer);
+  cn->reset();
+
+  this->localCamera->destroy();
+  this->nullParent->destroy();  
+  delete this->skySphere;
+
+  //delete this->trackManager;
+
+  /*
+  WorldEntity* entity = entities->enumerate();  
+  while( entity != NULL ) 
+    { 
+      entity->destroy();
+      entity = entities->nextElement();
+    }
+  this->entities->destroy();
+  */
+
+  /* FIX the parent list has to be cleared - not possible if we got the old list also*/
+
+
+  //delete this->entities;
+  //delete this->localCamera;
+  /* this->localPlayer hasn't to be deleted explicitly, it is 
+     contained in entities*/
+}
+
+
+/**
+   \brief loads the World by initializing all resources, and set their default values.
+*/
+ErrorMessage World::load()
+{
+  //  BezierCurve* tmpCurve = new BezierCurve();
+  if(this->debugWorldNr != -1)
+    {
+      // initializing Font
+      testFont = new FontSet();
+      testFont->buildFont("../data/pictures/font.tga");
+
+      // initializing the TrackManager
+      trackManager = TrackManager::getInstance();
+      trackManager->addPoint(Vector(0,-5,0));
+      trackManager->addPoint(Vector(10,0,5));
+      trackManager->addPoint(Vector(20,0,-5));
+      trackManager->addPoint(Vector(30,0,5));
+      trackManager->addPoint(Vector(40,0,5));
+      trackManager->setDuration(2);
+      trackManager->setSavePoint();
+      trackManager->addPoint(Vector(50,10,10));
+      trackManager->addPoint(Vector(60,0, 10));
+      trackManager->addPoint(Vector(70,0, 10));
+      trackManager->addPoint(Vector(80,0,-10));
+      trackManager->addPoint(Vector(90,0,-10));
+      trackManager->setDuration(5);
+      trackManager->setSavePoint();
+      trackManager->addPoint(Vector(110,0,5));
+      trackManager->addPoint(Vector(120,0, 10));
+      trackManager->addPoint(Vector(130,0, 10));
+      trackManager->addPoint(Vector(140,0,-10));
+      trackManager->addPoint(Vector(150,0,-10));
+      trackManager->setDuration(3);
+      int fork11, fork12, fork13, fork14;
+      trackManager->fork(4, &fork11, &fork12, &fork13, &fork14);
+      trackManager->workOn(fork11);
+      trackManager->addPoint(Vector(170, 0, -15));
+      trackManager->addPoint(Vector(180, 0, -15));
+      trackManager->setDuration(3);
+      trackManager->workOn(fork12);
+      trackManager->addPoint(Vector(170, 0, 10));
+      trackManager->addPoint(Vector(180, 0, 10));
+      trackManager->addPoint(Vector(190,2,5));
+      trackManager->addPoint(Vector(200,2,5));
+      trackManager->setDuration(7);
+      int fork21, fork22;
+      trackManager->fork(2, &fork21, &fork22);
+      trackManager->workOn(fork21);
+      trackManager->addPoint(Vector(220, 10,-10));
+      trackManager->addPoint(Vector(230, 0,-10));
+      trackManager->addPoint(Vector(240, 0, 2));
+      trackManager->addPoint(Vector(250, 0, 0));
+      trackManager->addPoint(Vector(260, 0, 5));
+      trackManager->setDuration(3);
+      trackManager->join(2, fork12, fork11);
+      trackManager->workOn(fork22);
+      trackManager->addPoint(Vector(220, -10,10));
+      trackManager->addPoint(Vector(230, 0, 10));
+      trackManager->addPoint(Vector(240, 0, 10));
+      trackManager->addPoint(Vector(250, 0, 5));
+      trackManager->setDuration(6);
+      trackManager->workOn(fork13);
+      trackManager->addPoint(Vector(200,-10,5));
+      trackManager->addPoint(Vector(250,-10,5));
+      trackManager->setDuration(3);
+      trackManager->workOn(fork14);
+      trackManager->addPoint(Vector(200,15,0));
+      trackManager->addPoint(Vector(210,0,10));
+      trackManager->setDuration(1);
+      trackManager->join(4, fork21, fork22, fork13, fork14);
+      trackManager->workOn(10);
+      trackManager->addPoint(Vector(250,-10,5));
+      trackManager->addPoint(Vector(260,-10,5));
+      trackManager->finalize();
+      
+      /*monitor progress*/
+      this->glmis->step();
+
+      /*
+	tmpCurve->addNode(Vector(10,  -1,  -1));
+	tmpCurve->addNode(Vector(10,  -2,   2));
+	tmpCurve->addNode(Vector(10,   3,   3));
+	tmpCurve->addNode(Vector(10,   4,  -4), 0);
+	tmpCurve->addNode(Vector(10,  -1,  -1));
+	tmpCurve->addNode(Vector(10,  -2,   2));
+	tmpCurve->addNode(Vector(10,   3,   3));
+	tmpCurve->addNode(Vector(10,   4,  -4), 0);
+	tmpCurve->debug();
+      */
+      switch(this->debugWorldNr)
+	{
+	  /*
+	    this loads the hard-coded debug world. this only for simplicity and will be 
+	    removed by a reald world-loader, which interprets a world-file.
+	    if you want to add an own debug world, just add a case DEBUG_WORLD_[nr] and
+	    make whatever you want...
+	   */
+	case DEBUG_WORLD_0:
+	  {
+	    this->nullParent = NullParent::getInstance ();
+	    this->nullParent->setName ("NullParent");
+
+	    // !\todo old track-system has to be removed
+
+	    //create helper for player
+	    HelperParent* hp = new HelperParent ();
+	    /* the player has to be added to this helper */
+
+	    // create a player
+	    WorldEntity* myPlayer = new Player ();
+	    myPlayer->setName ("player");
+	    this->spawn (myPlayer);
+	    this->localPlayer = myPlayer;
+	    /*monitor progress*/
+	    this->glmis->step();	    
+
+	    // bind input
+	    Orxonox *orx = Orxonox::getInstance ();
+	    orx->getLocalInput()->bind (myPlayer);
+	    
+	    // bind camera
+	    this->localCamera = new Camera(this);
+	    this->localCamera->setName ("camera");
+	    this->localCamera->bind (myPlayer);
+	    this->localPlayer->addChild (this->localCamera);
+
+	    // Create SkySphere
+	    skySphere = new Skysphere("../data/pictures/sky-replace.jpg");
+
+	    /*monitor progress*/
+	    this->glmis->step();
+
+	    Vector* es = new Vector (50, 2, 0);
+	    Quaternion* qs = new Quaternion ();
+	    WorldEntity* env = new Environment();
+	    env->setName ("env");
+	    this->spawn(env, es, qs);
+	   
+	    /*monitor progress*/
+	    this->glmis->step();
+
+	    trackManager->setBindSlave(env);
+
+	    break;
+	  }
+	case DEBUG_WORLD_1:
+	  {
+	    /*
+	    this->testCurve = new UPointCurve();
+	    this->testCurve->addNode(Vector( 0, 0, 0));
+	    this->testCurve->addNode(Vector(10, 0, 5));
+	    this->testCurve->addNode(Vector(20, -5,-5));
+	    this->testCurve->addNode(Vector(30, 5, 10));
+	    this->testCurve->addNode(Vector(40, 0,-10));
+	    this->testCurve->addNode(Vector(50, 0,-10));
+	    */
+
+	    this->nullParent = NullParent::getInstance ();
+	    this->nullParent->setName ("NullParent");
+
+
+
+	    // create a player
+	    WorldEntity* myPlayer = new Player();
+	    myPlayer->setName ("player");
+	    this->spawn(myPlayer);
+	    this->localPlayer = myPlayer;	    
+	    
+	    // bind input
+	    Orxonox *orx = Orxonox::getInstance();
+	    orx->getLocalInput()->bind (myPlayer);
+	    
+	    // bind camera
+	    this->localCamera = new Camera (this);
+	    this->localCamera->setName ("camera");
+	    this->localCamera->bind (myPlayer);	
+	    this->localPlayer->addChild (this->localCamera);
+
+	    // Create SkySphere
+	    skySphere = new Skysphere("../data/pictures/sky-replace.jpg");
+
+	    break;
+
+
+	  }
+	default:
+	  printf("World::load() - no world with ID %i found", this->debugWorldNr );
+	}
+    }
+  else if(this->worldName != NULL)
+    {
+
+    }
+
+  // initialize debug coord system
+  objectList = glGenLists(1);
+  glNewList (objectList, GL_COMPILE);
+  glLoadIdentity();
+  glColor3f(1.0,0,0);
+  glBegin(GL_QUADS);
+
+  int sizeX = 100;
+  int sizeZ = 80;
+  float length = 1000;
+  float width = 200;
+  float widthX = float (length /sizeX);
+  float widthZ = float (width /sizeZ);
+  
+  float height [sizeX][sizeZ];
+  Vector normal_vectors[sizeX][sizeZ];
+  
+  
+  for ( int i = 0; i<sizeX-1; i+=1)
+    for (int j = 0; j<sizeZ-1;j+=1)
+      //height[i][j] = rand()/20046 + (j-25)*(j-25)/30;
+#ifdef __WIN32__
+      height[i][j]=(sin((float)j/3)*rand()*i/182400)*.5;
+#else
+      height[i][j]=(sin((float)j/3)*rand()*(long)i/6282450500.0)*.5;
+#endif
+
+  //Die Huegel ein wenig glaetten
+  for (int h=1; h<2;h++)
+    for (int i=1;i<sizeX-2 ;i+=1 )
+      for(int j=1;j<sizeZ-2;j+=1)
+	height[i][j]=(height[i+1][j]+height[i][j+1]+height[i-1][j]+height[i][j-1])/4;
+  
+  //Berechnung von normalen Vektoren
+  for(int i=1;i<sizeX-2;i+=1)
+    for(int j=1;j<sizeZ-2 ;j+=1)
+      {
+	Vector v1 = Vector (widthX*(1),      height[i][j],      widthZ*(j) );
+	Vector v2 = Vector (widthX*(i-1),    height[i-1][j],    widthZ*(j));
+	Vector v3 = Vector (widthX*(i),      height[i][j+1],    widthZ*(j+1));
+	Vector v4 = Vector (widthX*(i+1),    height[i+1][j],    widthZ*(j));
+	Vector v5 = Vector (widthX*(i),      height[i][j-1],    widthZ*(j-1));
+	
+	Vector c1 = v2 - v1;
+	Vector c2 = v3 - v1;
+	Vector c3=  v4 - v1;
+	Vector c4 = v5 - v1;
+	Vector zero = Vector (0,0,0);
+	normal_vectors[i][j]=c1.cross(v3-v5)+c2.cross(v4-v2)+c3.cross(v5-v3)+c4.cross(v2-v4);
+	normal_vectors[i][j].normalize();
+      }
+
+  int snowheight=3;
+  for ( int i = 0; i<sizeX; i+=1)
+    for (int j = 0; j<sizeZ;j+=1)
+      {	  
+	Vector v1 = Vector (widthX*(i),      height[i][j]-20,       widthZ*(j)  -width/2);
+	Vector v2 = Vector (widthX*(i+1),    height[i+1][j]-20,     widthZ*(j)  -width/2);
+	Vector v3 = Vector (widthX*(i+1),    height[i+1][j+1]-20,   widthZ*(j+1)-width/2);
+	Vector v4 = Vector (widthX*(i),      height[i][j+1]-20,     widthZ*(j+1)-width/2);
+	float a[3];
+	if(height[i][j]<snowheight){
+	  a[0]=0;
+	  a[1]=1.0-height[i][j]/10-.3;
+	  a[2]=0;
+	  glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
+	}
+	else{
+	    a[0]=1.0;
+	    a[1]=1.0;
+	    a[2]=1.0;
+	    glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
+	    
+	}
+	glNormal3f(normal_vectors[i][j].x, normal_vectors[i][j].y, normal_vectors[i][j].z);
+	glVertex3f(v1.x, v1.y, v1.z);
+	if(height[i+1][j]<snowheight){
+	  a[0]=0;
+	  a[1] =1.0-height[i+1][j]/10-.3;
+	  a[2]=0;
+	  glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
+	}
+	else{
+	  a[0]=1.0;
+	  a[1]=1.0;
+	  a[2]=1.0;
+	  glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
+	  
+	}
+	glNormal3f(normal_vectors[i+1][j].x, normal_vectors[i+1][j].y, normal_vectors[i+1][j].z);
+	glVertex3f(v2.x, v2.y, v2.z);
+	if(height[i+1][j+1]<snowheight){
+	  a[0]=0;
+	  a[1] =1.0-height[i+1][j+1]/10-.3;
+	  a[2]=0;
+	  glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
+	}
+	else{
+	  a[0]=1.0;
+	  a[1]=1.0;
+	  a[2]=1.0;
+	  glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
+	  
+	  
+	}
+	glNormal3f(normal_vectors[i+1][j+1].x, normal_vectors[i+1][j+1].y, normal_vectors[i+1][j+1].z);
+	glVertex3f(v3.x, v3.y, v3.z);
+	if(height[i][j+1]<snowheight){
+	  a[0]=0;
+	  a[1] =1.0-height[i+1][j+1]/10-.3;
+	  a[2]=0;
+	  glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
+	}
+	else{
+	  a[0]=1.0;
+	  a[1]=1.0;
+	  a[2]=1.0;
+	  glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
+	}
+	glNormal3f(normal_vectors[i][j+1].x, normal_vectors[i][j+1].y, normal_vectors[i][j+1].z);
+	glVertex3f(v4.x, v4.y, v4.z);
+	
+      }
+  glEnd();
+  /*  
+  glBegin(GL_LINES);
+  for( float x = -128.0; x < 128.0; x += 25.0)
+    {
+      for( float y = -128.0; y < 128.0; y += 25.0)
+	{
+	  glColor3f(1,0,0);
+	  glVertex3f(x,y,-128.0);
+	  glVertex3f(x,y,0.0);
+	  glColor3f(0.5,0,0);
+	  glVertex3f(x,y,0.0);
+	  glVertex3f(x,y,128.0);
+	}
+    }
+  for( float y = -128.0; y < 128.0; y += 25.0)
+    {
+      for( float z = -128.0; z < 128.0; z += 25.0)
+	{
+	  glColor3f(0,1,0);
+	  glVertex3f(-128.0,y,z);
+	  glVertex3f(0.0,y,z);
+	  glColor3f(0,0.5,0);
+	  glVertex3f(0.0,y,z);
+	  glVertex3f(128.0,y,z);
+	}
+    }
+  for( float x = -128.0; x < 128.0; x += 25.0)
+    {
+      for( float z = -128.0; z < 128.0; z += 25.0)
+	{
+	  glColor3f(0,0,1);
+	  glVertex3f(x,-128.0,z);
+	  glVertex3f(x,0.0,z);
+	  glColor3f(0,0,0.5);
+	  glVertex3f(x,0.0,z);
+	  glVertex3f(x,128.0,z);
+	}
+      
+    }
+  */  
+  /*
+  glBegin(GL_LINE_STRIP);
+  glColor3f(1.0, 5.0, 1.0);
+  for( int i = 0; i <= 30; i++)
+    {
+      glEvalCoord1f ((GLfloat) i/30.0);
+    }
+  glEnd();
+  */
+
+  trackManager->drawGraph(.01);
+  trackManager->debug(2);
+  /*  
+  glBegin(GL_LINES);
+  float i;
+  for(i = 0.0; i<1; i+=.01)
+    {
+      printf("%f, %f, %f\n",tmpCurve->calcPos(i).x, tmpCurve->calcPos(i).y, tmpCurve->calcPos(i).z);
+      glVertex3f(tmpCurve->calcPos(i).x, tmpCurve->calcPos(i).y, tmpCurve->calcPos(i).z);
+    }
+  glEnd();
+  */
+  glEndList();
+  // LIGHT initialisation
+  light = Light::getInstance();
+  light->addLight(0);
+  light->setAttenuation(QUADRATIC, 1.0);
+  light->setAttenuation(CONSTANT, 2.0);
+  light->setAttenuation(QUADRATIC, 1.0);
+  light->setPosition(10.0, 10.0, 50.0);
+  light->setDiffuseColor(1,1,1);
+  //  light->addLight(1);
+  //  light->setPosition(20, 10, -20);
+  //  light->setDiffuseColor(0,0,0);
+  light->debug();
+
+
+}
+
+/**
+   \brief initializes a new World
+*/
+ErrorMessage World::init()
+{
+  this->bPause = false;
+  CommandNode* cn = Orxonox::getInstance()->getLocalInput();
+  cn->addToWorld(this);
+  cn->enable(true);
+
+  //glMap1f (GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]);
+  //glEnable (GL_MAP1_VERTEX_3);
+  
+  //theNurb = gluNewNurbsRenderer ();
+  //gluNurbsProperty (theNurb, GLU_NURBS_MODE, GLU_NURBS_TESSELLATOR);
+  //gluNurbsProperty (theNurb, GLU_NURBS_VERTEX, vertexCallback );
+
+}
+
+
+/**
+   \brief starts the World
+*/
+ErrorMessage World::start()
+{
+  printf("World::start() - starting current World: nr %i\n", this->debugWorldNr);
+  this->bQuitOrxonox = false;
+  this->bQuitCurrentGame = false;
+  this->mainLoop();
+}
+
+/**
+   \brief stops the world.
+
+   This happens, when the player decides to end the Level.
+*/
+ErrorMessage World::stop()
+{
+  printf("World::stop() - got stop signal\n");
+  this->bQuitCurrentGame = true;
+}
+
+/**
+   \brief pauses the Game
+*/
+ErrorMessage World::pause()
+{
+  this->isPaused = true;
+}
+
+/**
+   \brief ends the pause Phase
+*/
+ErrorMessage World::resume()
+{
+  this->isPaused = false;
+}
+
+/**
+   \brief destroys the World
+*/
+ErrorMessage World::destroy()
+{
+  delete trackManager;
+}
+
+/**
+   \brief shows the loading screen
+*/
+void World::displayLoadScreen ()
+{
+  printf ("World::displayLoadScreen - start\n"); 
+  
+  //GLMenuImageScreen* 
+  this->glmis = GLMenuImageScreen::getInstance();
+  this->glmis->init();
+  this->glmis->setMaximum(10);
+  this->glmis->draw();
+ 
+  printf ("World::displayLoadScreen - end\n"); 
+}
+
+/**
+   \brief removes the loadscreen, and changes over to the game
+
+   \todo take out the delay
+*/
+void World::releaseLoadScreen ()
+{
+  printf ("World::releaseLoadScreen - start\n"); 
+  this->glmis->setValue(this->glmis->getMaximum());
+  SDL_Delay(500);
+  printf ("World::releaseLoadScreen - end\n"); 
+}
+
+
+/** 
+    \brief checks for collisions
+    
+    This method runs through all WorldEntities known to the world and checks for collisions 
+    between them. In case of collisions the collide() method of the corresponding entities 
+    is called.
+*/
+void World::collide ()
+{
+  /*
+  List *a, *b;
+  WorldEntity *aobj, *bobj;
+   
+  a = entities;
+  
+  while( a != NULL)
+    {
+      aobj = a->nextElement();
+      if( aobj->bCollide && aobj->collisioncluster != NULL)
+	{
+	  b = a->nextElement();
+	  while( b != NULL )
+	    {
+	      bobj = b->nextElement();
+	      if( bobj->bCollide && bobj->collisioncluster != NULL )
+		{
+		  unsigned long ahitflg, bhitflg;
+		  if( check_collision ( &aobj->place, aobj->collisioncluster, 
+					&ahitflg, &bobj->place, bobj->collisioncluster, 
+					&bhitflg) );
+		  {
+		    aobj->collide (bobj, ahitflg, bhitflg);
+		    bobj->collide (aobj, bhitflg, ahitflg);
+		  }
+		}
+	      b = b->nextElement();
+	    }
+	}
+      a = a->enumerate();
+    }
+  */
+}
+
+/** 
+    \brief runs through all entities calling their draw() methods
+*/
+void World::draw ()
+{
+  /* draw entities */
+  WorldEntity* entity;
+  entity = this->entities->enumerate();
+  while( entity != NULL ) 
+    { 
+      if( entity->bDraw ) entity->draw();
+      entity = this->entities->nextElement();
+    } 
+  
+  glCallList (objectList);
+  //! \todo skysphere is a WorldEntity and should be inside of the world-entity-list.
+  skySphere->draw();
+
+  testFont->printText(0, 0, 1, "orxonox_" PACKAGE_VERSION);
+
+}
+
+
+/**
+   \brief function to put your own debug stuff into it. it can display informations about
+   the current class/procedure
+*/
+void World::debug()
+{
+  printf ("World::debug() - starting debug\n");
+  PNode* p1 = NullParent::getInstance ();
+  PNode* p2 = new PNode (new Vector(2, 2, 2), p1);
+  PNode* p3 = new PNode (new Vector(4, 4, 4), p1);
+  PNode* p4 = new PNode (new Vector(6, 6, 6), p2);
+
+  p1->debug ();
+  p2->debug ();
+  p3->debug ();
+  p4->debug ();
+
+  p1->shiftCoor (new Vector(-1, -1, -1));
+
+  printf("World::debug() - shift\n");
+  p1->debug ();
+  p2->debug ();
+  p3->debug ();
+  p4->debug ();
+  
+  p1->update (1);
+
+  printf ("World::debug() - update\n");
+  p1->debug ();
+  p2->debug ();
+  p3->debug ();
+  p4->debug ();
+
+  p2->shiftCoor (new Vector(-1, -1, -1));
+  p1->update (2);
+
+  p1->debug ();
+  p2->debug ();
+  p3->debug ();
+  p4->debug ();
+
+  p2->setAbsCoor (new Vector(1,2,3));
+
+
+ p1->update (2);
+
+  p1->debug ();
+  p2->debug ();
+  p3->debug ();
+  p4->debug ();
+
+  p1->destroy ();
+  
+  
+  /*
+  WorldEntity* entity;
+  printf("counting all entities\n");
+  printf("World::debug() - enumerate()\n");
+  entity = entities->enumerate();  
+  while( entity != NULL ) 
+    { 
+      if( entity->bDraw ) printf("got an entity\n");
+      entity = entities->nextElement();
+    }
+  */
+}
+
+
+/**
+  \brief main loop of the world: executing all world relevant function
+
+  in this loop we synchronize (if networked), handle input events, give the heart-beat to
+  all other member-entities of the world (tick to player, enemies etc.), checking for
+  collisions drawing everything to the screen.
+*/
+void World::mainLoop()
+{
+  this->lastFrame = SDL_GetTicks ();
+  printf("World::mainLoop() - Entering main loop\n");
+  while( !this->bQuitOrxonox && !this->bQuitCurrentGame) /* \todo implement pause */
+    {
+      // Network
+      this->synchronize ();
+      // Process input
+      this->handleInput ();
+      if( this->bQuitCurrentGame || this->bQuitOrxonox)
+	{
+	  printf("World::mainLoop() - leaving loop earlier...\n");
+	  break;
+	}
+      // Process time
+      this->timeSlice ();
+      // Process collision
+      this->collide ();
+      // Draw
+      this->display ();
+  
+      for( int i = 0; i < 5000000; i++) {}
+      /* \todo this is to slow down the program for openGl Software emulator computers, reimplement*/
+    }
+  printf("World::mainLoop() - Exiting the main loop\n");
+}
+
+
+/**
+   \brief synchronize local data with remote data
+*/
+void World::synchronize ()
+{
+  // Get remote input
+  // Update synchronizables
+}
+
+
+/**
+   \brief run all input processing
+
+   the command node is the central input event dispatcher. the node uses the even-queue from
+   sdl and has its own event-passing-queue.
+*/
+void World::handleInput ()
+{
+  // localinput
+  CommandNode* cn = Orxonox::getInstance()->getLocalInput();
+  cn->process();
+  // remoteinput
+}
+
+
+/**
+   \brief advance the timeline
+
+   this calculates the time used to process one frame (with all input handling, drawing, etc)
+   the time is mesured in ms and passed to all world-entities and other classes that need
+   a heart-beat.
+*/
+void World::timeSlice ()
+{
+  Uint32 currentFrame = SDL_GetTicks();
+  if(!this->bPause)
+    {
+      Uint32 dt = currentFrame - this->lastFrame;
+      
+      if(dt > 0)
+	{
+	  float fps = 1000/dt;
+	  printf("fps = %f\n", fps);
+	}
+      else
+	{
+	  /* the frame-rate is limited to 100 frames per second, all other things are for
+	     nothing.
+	  */
+	  printf("fps = 1000 - frame rate is adjusted\n");
+	  SDL_Delay(10);
+	  dt = 10;
+	}
+      //this->timeSlice (dt);
+      
+      /* function to let all entities tick (iterate through list) */
+      WorldEntity* entity;
+      float seconds = dt / 1000.0;      
+      this->nullParent->update (seconds);
+      entity = entities->enumerate(); 
+      while( entity != NULL) 
+	{ 
+	  entity->tick (seconds);
+	  entity = entities->nextElement();
+	}
+      skySphere->updatePosition(localCamera->absCoordinate);
+      
+      /* update tick the rest */
+      this->localCamera->timeSlice(dt);
+      this->trackManager->tick(dt);
+    }
+  this->lastFrame = currentFrame;
+}
+
+
+/**
+   \brief render the current frame
+   
+   clear all buffers and draw the world
+*/
+void World::display ()
+{
+  // clear buffer
+  glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+  // set camera
+  this->localCamera->apply ();
+  // draw world
+  this->draw();
+  // draw HUD
+  /* \todo draw HUD */
+  // flip buffers
+  SDL_GL_SwapBuffers();
+  //SDL_Surface* screen = Orxonox::getInstance()->getScreen ();
+  //SDL_Flip (screen);
+}
+
+
+/**
+   \brief add and spawn a new entity to this world
+   \param entity to be added
+*/
+void World::spawn(WorldEntity* entity)
+{
+  if( this->nullParent != NULL && entity->parent == NULL)
+    this->nullParent->addChild (entity);
+
+  this->entities->add (entity);
+
+  entity->postSpawn ();
+}
+
+
+/**
+   \brief add and spawn a new entity to this world
+   \param entity to be added
+   \param absCoor At what coordinates to add this entity.
+   \param absDir In which direction should it look.
+*/
+void World::spawn(WorldEntity* entity, Vector* absCoor, Quaternion* absDir)
+{
+  entity->setAbsCoor (absCoor);
+  entity->setAbsDir (absDir);
+  
+  if( this->nullParent != NULL && entity->parent == NULL)
+    this->nullParent->addChild (entity);
+
+  this->entities->add (entity);
+
+  entity->postSpawn ();
+}
+
+
+
+/**
+  \brief commands that the world must catch
+  \returns false if not used by the world
+*/
+bool World::command(Command* cmd)
+{
+  return false;
+}
+
Index: /orxonox/branches/trackManager/src/story_entities/world.h
===================================================================
--- /orxonox/branches/trackManager/src/story_entities/world.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/story_entities/world.h	(revision 3498)
@@ -0,0 +1,90 @@
+/*! 
+    \file world.h
+    \brief Holds and manages all game data
+*/ 
+
+#ifndef _WORLD_H
+#define _WORLD_H
+
+#include "stdincl.h"
+#include "story_entity.h"
+
+
+class TrackManager;
+class WorldEntity;
+class Camera;
+class PNode;
+class GLMenuImageScreen;
+class Skysphere;
+class Light;
+class FontSet;
+
+//! The game world
+/**
+   this class initializes everything that should be displayed inside of the current level.
+   it is the main driving factor during gameplay.
+*/
+class World : public StoryEntity {
+
+ public:
+  World (char* name);
+  World (int worldID);
+  virtual ~World ();
+
+
+  /* classes from story-entity */
+  virtual ErrorMessage load ();
+  virtual ErrorMessage init ();
+  virtual ErrorMessage start ();
+  virtual ErrorMessage stop ();
+  virtual ErrorMessage pause ();
+  virtual ErrorMessage resume ();
+  virtual ErrorMessage destroy ();
+
+  virtual void displayLoadScreen();
+  virtual void releaseLoadScreen();
+  
+  /* command node functions */
+  bool command (Command* cmd);
+
+  /* interface to world */
+  void spawn (WorldEntity* entity);
+  void spawn (WorldEntity* entity, Vector* absCoor, Quaternion* absDir);
+
+
+
+ private:
+  Uint32 lastFrame;             //!< last time of frame
+  bool bQuitOrxonox;            //!< quit this application
+  bool bQuitCurrentGame;        //!< quit only the current game and return to menu
+  bool bPause;                  //!< pause mode
+
+  FontSet* testFont;            //!< A test Font. \todo fix this, so it is for real.
+  GLMenuImageScreen* glmis;     //!< The Level-Loader Display
+
+  char* worldName;              //!< The name of this World
+  int debugWorldNr;             //!< The Debug Nr. needed, if something goes wrong
+
+  PNode* nullParent;            //!< The zero-point, that everything has as its parent.
+  TrackManager* trackManager;  //!< The reference of the TrackManager that handles the course through the Level.
+  Camera* localCamera;         //!< The current Camera
+  Skysphere* skySphere;         //!< The Environmental Heaven of orxonox \todo insert this to environment insted
+  Light* light;                 //!< The Lights of the Level
+
+  GLuint objectList;            //!< temporary: \todo this will be ereased soon
+  tList<WorldEntity>* entities;//!< A template List of all entities. Every moving thing should be included here, and world automatically updates them.
+  WorldEntity* localPlayer;     //!< The Player, you fly through the level.
+ 
+  /* function for main-loop */
+  void mainLoop ();
+  void synchronize ();
+  void handleInput ();
+  void timeSlice ();
+  void collide ();
+  void draw ();
+  void display ();
+  void debug ();
+
+};
+
+#endif /* _WORLD_H */
Index: xonox/branches/trackManager/src/story_entity.cc
===================================================================
--- /orxonox/branches/trackManager/src/story_entity.cc	(revision 3497)
+++ 	(revision )
@@ -1,178 +1,0 @@
-
-
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   ### File Specific:
-   main-programmer: Patrick Boenzli
-   co-programmer: 
-*/
-
-
-#include "story_entity.h"
-
-
-using namespace std;
-
-
-
-StoryEntity::StoryEntity () {}
-StoryEntity::~StoryEntity () {}
-
-
-/** 
-    \brief initialize the entity before use. 
-    \returns an error code if not able to apply.
-
-    After execution of this function, the Entity is ready to be played/executed, 
-    this shifts the initialisation work before the execution - very important...
-*/
-ErrorMessage StoryEntity::init()
-{}
-
-
-/** 
-    \brief sets the story ID
-
-    sets the story id of the current entity, this enables it to be identified in a 
-    global context.
-*/
-void StoryEntity::setStoryID(int storyID)
-{
-  this->storyID = storyID;
-}
-
-
-/** 
-    \brief this reads the story id of the current entity
-    \returns the story entity id
-*/
-int StoryEntity::getStoryID()
-{
-  return this->storyID;
-}
-
-
-/** 
-    \brief sets the id of the next story entity
-    
-    StoryEntities can choose their following entity themselfs. the entity id defined here
-    will be startet after this entity ends. this can be convenient if you want to have a
-    non linear story with switches.
-*/
-void StoryEntity::setNextStoryID(int nextStoryID)
-{
-  this->nextStoryID = nextStoryID;
-}
-
-/** 
-    \brief gets the story id of the current entity
-    \returns story id
-*/
-int StoryEntity::getNextStoryID()
-{
-  return this->nextStoryID;
-}
-
-
-/** 
-    \brief starts the entity with the choosen id. only for entities with lists.
-    \param story id
-    \returns error code if this action has caused a error
-
-    this simply starts the story with the id storyID. the story with the choosen id has
-    to be part of the current entity else, this doesn't make sense. this is used for
-    campaigns or the GameLoader, they have lists of Campaigns/Worlds with their own
-    storyID.
-*/
-ErrorMessage StoryEntity::start(int storyID)
-{}
-
-
-/** 
-    \brief starts the current entity
-    \returns error code if this action has caused a error    
-*/
-ErrorMessage StoryEntity::start()
-{}
-
-
-/** 
-    \brief stops the current entity
-    \returns error code if this action has caused a error
-
-    ATTENTION: this function shouldn't call other functions, or if so, they must return
-    after finishing. If you ignore or forget to do so, the current entity is not able to
-    terminate and it will run in the background or the ressources can't be freed or even
-    worse: are freed and the program will end in a segmentation fault!
-    hehehe, all seen... :)
-*/
-ErrorMessage StoryEntity::stop()
-{}
-
-
-/** 
-    \brief pause the current entity
-    \returns error code if this action has caused a error
-
-    this pauses the current entity or passes this call forth to the running entity.
-*/
-ErrorMessage StoryEntity::pause()
-{}
-
-
-/** 
-    \brief resumes a pause
-    \returns error code if this action has caused a error
-
-    this resumess the current entity or passes this call forth to the running entity.
-*/
-ErrorMessage StoryEntity::resume()
-{}
-
-
-/** 
-    \brief loads the current entity
-
-    this is here to enable you loading maps into the entities. for all other actions you
-    should take the init() function.
-*/
-void StoryEntity::load()
-{}
-
-
-/** 
-    \brief destroys and cleans up the current entity. 
-
-    this cleans up ressources before the deconstructor is called. for terminating 
-    the entity please use the stop() function.
-*/
-void StoryEntity::destroy()
-{}
-
-
-/** 
-    \brief this displays the load screen
-
-    it will need some time to load maps or things like that. to inform the user about 
-    progress and to just show him/her something for the eyes, put here this stuff
-*/
-void StoryEntity::displayLoadScreen()
-{}
-
-
-/** 
-    \brief undisplay the load screen
-
-    the load process has terminated, you now can release the load screen and start this
-    entity.
-*/
-void StoryEntity::releaseLoadScreen()
-{}
Index: xonox/branches/trackManager/src/story_entity.h
===================================================================
--- /orxonox/branches/trackManager/src/story_entity.h	(revision 3497)
+++ 	(revision )
@@ -1,48 +1,0 @@
-/*! 
-    \file story_entity.h
-    \brief holds the base class of everything that is playable - that is part of the story
-*/ 
-
-
-#ifndef _STORY_ENTITY_H
-#define _STORY_ENTITY_H
-
-#include "stdincl.h"
-#include "story_def.h"
-
-//! A class that represents something to play in orxonox. it is a container for worlds, movies, mission briefings, etc...
-class StoryEntity : public BaseObject {
-
- public:
-  StoryEntity ();
-  virtual ~StoryEntity ();
-
-  bool isInit;  //! if the entity is initialized, this has to be true
-  bool isPaused; //! is true if the entity is paused
-
-  virtual ErrorMessage init();
-  virtual ErrorMessage start(int storyID);
-  virtual ErrorMessage start();
-  virtual ErrorMessage stop();
-  virtual ErrorMessage pause();
-  virtual ErrorMessage resume();
-
-  virtual void load();
-  virtual void destroy();
-
-  virtual void displayLoadScreen();
-  virtual void releaseLoadScreen();
-
-  void setStoryID(int storyID);
-  int getStoryID();
-
-  void setNextStoryID(int nextStoryID);
-  int getNextStoryID();
-
-
- private:
-  int storyID; //! this is the number of this entity, identifying it in a list/tree...
-  int nextStoryID; //! if this entity has finished, this entity shall be called
-};
-
-#endif /* _STORY_ENTITY_H */
Index: xonox/branches/trackManager/src/synchronisable.cc
===================================================================
--- /orxonox/branches/trackManager/src/synchronisable.cc	(revision 3497)
+++ 	(revision )
@@ -1,32 +1,0 @@
-
-
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   ### File Specific:
-   main-programmer: Patrick Boenzli
-   co-programmer: ...
-*/
-
-
-#include "synchronisable.h"
-
-
-using namespace std;
-
-
-
-Synchronisable::Synchronisable () {}
-
-
-
-Synchronisable::~Synchronisable () {}
-
-
Index: xonox/branches/trackManager/src/synchronisable.h
===================================================================
--- /orxonox/branches/trackManager/src/synchronisable.h	(revision 3497)
+++ 	(revision )
@@ -1,24 +1,0 @@
-
-#ifndef _SYNCHRONISABLE_H
-#define _SYNCHRONISABLE_H
-
-#include "data_tank.h"
-
-
-class Synchronisable {
-
- public:
-  Synchronisable ();
-  ~Synchronisable ();
-
-  struct worldEntityState {
-    /*Vector position; */
-    /*Vector orientation; */
-  };
-
-  worldEntityState* getState();
-  void setState(worldEntityState*);
-
-};
-
-#endif /* _SYNCHRONISABLE_H */
Index: /orxonox/branches/trackManager/src/track_manager.cc
===================================================================
--- /orxonox/branches/trackManager/src/track_manager.cc	(revision 3497)
+++ /orxonox/branches/trackManager/src/track_manager.cc	(revision 3498)
@@ -16,4 +16,7 @@
 
 #include "track_manager.h"
+
+#include "p_node.h"
+
 #include <stdarg.h>
 #include "p_node.h"
Index: /orxonox/branches/trackManager/src/track_manager.h
===================================================================
--- /orxonox/branches/trackManager/src/track_manager.h	(revision 3497)
+++ /orxonox/branches/trackManager/src/track_manager.h	(revision 3498)
@@ -13,4 +13,5 @@
 
 #include "stdincl.h"
+#include "curve.h"
 
 class PNode;
Index: xonox/branches/trackManager/src/vector.cc
===================================================================
--- /orxonox/branches/trackManager/src/vector.cc	(revision 3497)
+++ 	(revision )
@@ -1,845 +1,0 @@
-
-
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   ### File Specific:
-   main-programmer: Christian Meyer 
-   co-programmer: Patrick Boenzli : Vector::scale()
-                                    Vector::abs()
-   
-   Quaternion code borrowed from an Gamasutra article by Nick Bobick and Ken Shoemake
-*/
-
-
-#include "vector.h"
-
-
-using namespace std;
-
-/**
-   \brief add two vectors
-   \param v: the other vector
-   \return the sum of both vectors
-*/
-Vector Vector::operator+ (const Vector& v) const
-{
-  Vector r;
-
-  r.x = x + v.x;
-  r.y = y + v.y;
-  r.z = z + v.z;
-  
-  return r;
-}
-
-/**
-   \brief subtract a vector from another
-   \param v: the other vector
-   \return the difference between the vectors
-*/
-Vector Vector::operator- (const Vector& v) const
-{
-  Vector r;
-  
-  r.x = x - v.x;
-  r.y = y - v.y;
-  r.z = z - v.z;
-  
-  return r;
-}
-
-/**
-   \brief calculate the dot product of two vectors
-   \param v: the other vector
-   \return the dot product of the vectors
-*/
-float Vector::operator* (const Vector& v) const
-{
-  return x*v.x+y*v.y+z*v.z;
-}
-
-/**
-   \brief multiply a vector with a float
-   \param f: the factor
-   \return the vector multipied by f
-*/
-Vector Vector::operator* (float f) const
-{  
-  Vector r;
-  
-  r.x = x * f;
-  r.y = y * f;
-  r.z = z * f;
-  
-  return r;
-}
-
-/**
-   \brief divide a vector with a float
-   \param f: the divisor
-   \return the vector divided by f   
-*/
-Vector Vector::operator/ (float f) const
-{
-  Vector r;
-  
-  if( f == 0.0)
-  {
-    // Prevent divide by zero
-    return Vector (0,0,0);
-  }
-  
-  r.x = x / f;
-  r.y = y / f;
-  r.z = z / f;
-  
-  return r;
-}
-
-/**
-   \brief calculate the dot product of two vectors
-   \param v: the other vector
-   \return the dot product of the vectors
-*/
-float Vector::dot (const Vector& v) const
-{
-  return x*v.x+y*v.y+z*v.z;
-}
-
-/**
-  \brief calculate the cross product of two vectors
-  \param v: the other vector
-	\return the cross product of the vectors
-*/
-Vector Vector::cross (const Vector& v) const
-{
-  Vector r;
-  
-  r.x = y * v.z - z * v.y;
-  r.y = z * v.x - x * v.z;
-  r.z = x * v.y - y * v.x;
-  
-  return r;
-}
-  
-/**
-   \brief normalizes the vector to lenght 1.0
-*/
-void Vector::normalize ()
-{
-  float l = len();
-  
-  if( l == 0.0)
-  {
-    // Prevent divide by zero
-    return;
-  }
-  
-  x = x / l;
-  y = y / l;
-  z = z / l;
-}
-
-
-/**
-   \bref returns the voctor normalized to length 1.0
-*/
-
-Vector* Vector::getNormalized()
-{
-  float l = len();
-  if(l != 1.0)
-    {
-      return this;
-    }
-  else if(l == 0.0)
-    {
-      return 0;
-    }
-  
-  Vector *normalizedVector = new Vector(x / l, y /l, z / l);
-  return normalizedVector;
-}
-
-
-void Vector::scale(const Vector& v)
-{
-  x *= v.x;
-  y *= v.y;
-  z *= v.z;
-}
-
- 
-/**
-   \brief calculates the lenght of the vector
-   \return the lenght of the vector
-*/
-float Vector::len () const
-{
-  return sqrt (x*x+y*y+z*z);
-}
-
-
-
-Vector Vector::abs() 
-{
-  Vector v(fabs(x), fabs(y), fabs(z));
-  return v;
-}
-
-
-/**
-   \brief calculate the angle between two vectors in radiances
-   \param v1: a vector
-   \param v2: another vector
-   \return the angle between the vectors in radians
-*/
-float angleRad (const Vector& v1, const Vector& v2)
-{
-  return acos( v1 * v2 / (v1.len() * v2.len()));
-}
-
-
-/**
-   \brief calculate the angle between two vectors in degrees
-   \param v1: a vector
-   \param v2: another vector
-   \return the angle between the vectors in degrees
-*/
-float angleDeg (const Vector& v1, const Vector& v2)
-{
-  float f;
-  f = acos( v1 * v2 / (v1.len() * v2.len()));
-  return f * 180 / PI;
-}
-
-/**
-	\brief creates a multiplicational identity Quaternion
-*/
-Quaternion::Quaternion ()
-{
-	w = 1;
-	v = Vector(0,0,0);
-}
-
-/**
-	\brief turns a rotation along an axis into a Quaternion
-	\param angle: the amount of radians to rotate
-	\param axis: the axis to rotate around
-*/
-Quaternion::Quaternion (float angle, const Vector& axis)
-{
-	w = cos(angle/2);
-	v = axis * sin(angle/2);
-}
-
-/**
-   \brief calculates a lookAt rotation
-   \param dir: the direction you want to look
-   \param up: specify what direction up should be
-   
-   Mathematically this determines the rotation a (0,0,1)-Vector has to undergo to point
-   the same way as dir. If you want to use this with cameras, you'll have to reverse the
-   dir Vector (Vector(0,0,0) - your viewing direction) or you'll point the wrong way. You
-   can use this for meshes as well (then you do not have to reverse the vector), but keep 
-   in mind that if you do that, the model's front has to point in +z direction, and left 
-   and right should be -x or +x respectively or the mesh wont rotate correctly.
-*/
-Quaternion::Quaternion (const Vector& dir, const Vector& up)
-{
-  Vector z = dir;
-  z.normalize(); 
-  Vector x = up.cross(z);
-  x.normalize(); 
-  Vector y = z.cross(x);
-  
-  float m[4][4];
-  m[0][0] = x.x;
-  m[0][1] = x.y;
-  m[0][2] = x.z;
-  m[0][3] = 0;
-  m[1][0] = y.x;
-  m[1][1] = y.y;
-  m[1][2] = y.z;
-  m[1][3] = 0;
-  m[2][0] = z.x;
-  m[2][1] = z.y;
-  m[2][2] = z.z;
-  m[2][3] = 0;
-  m[3][0] = 0;
-  m[3][1] = 0;
-  m[3][2] = 0;
-  m[3][3] = 1;
-  
-  *this = Quaternion (m);
-}
-
-/**
-	\brief calculates a rotation from euler angles
-	\param roll: the roll in radians
-	\param pitch: the pitch in radians
-	\param yaw: the yaw in radians
-	
-	I DO HONESTLY NOT EXACTLY KNOW WHICH ANGLE REPRESENTS WHICH ROTATION. And I do not know 
-	in what order they are applied,	I just copy-pasted the code.
-*/
-Quaternion::Quaternion (float roll, float pitch, float yaw)
-{
-	float cr, cp, cy, sr, sp, sy, cpcy, spsy;
-	
-	// calculate trig identities
-	cr = cos(roll/2);
-	cp = cos(pitch/2);
-	cy = cos(yaw/2);
-	
-	sr = sin(roll/2);
-	sp = sin(pitch/2);
-	sy = sin(yaw/2);
-	
-	cpcy = cp * cy;
-	spsy = sp * sy;
-	
-	w = cr * cpcy + sr * spsy;
-	v.x = sr * cpcy - cr * spsy;
-	v.y = cr * sp * cy + sr * cp * sy;
-	v.z = cr * cp * sy - sr * sp * cy;
-}
-
-/**
-	\brief rotates one Quaternion by another
-	\param q: another Quaternion to rotate this by
-	\return a quaternion that represents the first one rotated by the second one (WARUNING: this operation is not commutative! e.g. (A*B) != (B*A))
-*/
-Quaternion Quaternion::operator*(const Quaternion& q) const
-{
-	float A, B, C, D, E, F, G, H;
-	Quaternion r;
-	
-	A = (w   + v.x)*(q.w   + q.v.x);
-	B = (v.z - v.y)*(q.v.y - q.v.z);
-	C = (w   - v.x)*(q.v.y + q.v.z); 
-	D = (v.y + v.z)*(q.w   - q.v.x);
-	E = (v.x + v.z)*(q.v.x + q.v.y);
-	F = (v.x - v.z)*(q.v.x - q.v.y);
-	G = (w   + v.y)*(q.w   - q.v.z);
-	H = (w   - v.y)*(q.w   + q.v.z);
-	
-	r.w = B +  (-E - F + G + H)/2;
-	r.v.x = A - (E + F + G + H)/2; 
-	r.v.y = C + (E - F + G - H)/2; 
-	r.v.z = D + (E - F - G + H)/2;
-	
-	return r;
-}
-
-/**
-	\brief add two Quaternions
-	\param q: another Quaternion
-	\return the sum of both Quaternions
-*/
-Quaternion Quaternion::operator+(const Quaternion& q) const
-{
-	Quaternion r(*this);
-	r.w = r.w + q.w;
-	r.v = r.v + q.v;
-	return r;
-}
-
-/**
-	\brief subtract two Quaternions
-	\param q: another Quaternion
-	\return the difference of both Quaternions
-*/
-Quaternion Quaternion::operator- (const Quaternion& q) const
-{
-	Quaternion r(*this);
-	r.w = r.w - q.w;
-	r.v = r.v - q.v;
-	return r;
-}
-
-/**
-	\brief rotate a Vector by a Quaternion
-	\param v: the Vector
-	\return a new Vector representing v rotated by the Quaternion
-*/
-Vector Quaternion::apply (Vector& v) const
-{
-	Quaternion q;
-	q.v = v;
-	q.w = 0;
-	q = *this * q * conjugate();
-	return q.v;
-}
-
-/**
-	\brief multiply a Quaternion with a real value
-	\param f: a real value
-	\return a new Quaternion containing the product
-*/
-Quaternion Quaternion::operator*(const float& f) const
-{
-	Quaternion r(*this);
-	r.w = r.w*f;
-	r.v = r.v*f;
-	return r;
-}
-
-/**
-	\brief divide a Quaternion by a real value
-	\param f: a real value
-	\return a new Quaternion containing the quotient
-*/
-Quaternion Quaternion::operator/(const float& f) const
-{
-	if( f == 0) return Quaternion();
-	Quaternion r(*this);
-	r.w = r.w/f;
-	r.v = r.v/f;
-	return r;
-}
-
-/**
-	\brief calculate the conjugate value of the Quaternion
-	\return the conjugate Quaternion
-*/
-Quaternion Quaternion::conjugate() const
-{
-	Quaternion r(*this);
-	r.v = Vector() - r.v;
-	return r;
-}
-
-/**
-	\brief calculate the norm of the Quaternion
-	\return the norm of The Quaternion
-*/
-float Quaternion::norm() const
-{
-	return w*w + v.x*v.x + v.y*v.y + v.z*v.z;
-}
-
-/**
-	\brief calculate the inverse value of the Quaternion
-	\return the inverse Quaternion
-	
-	Note that this is equal to conjugate() if the Quaternion's norm is 1
-*/
-Quaternion Quaternion::inverse() const
-{
-	float n = norm();
-	if (n != 0)
-	{
-		return conjugate() / norm();
-	}
-	else return Quaternion();
-}
-
-/**
-	\brief convert the Quaternion to a 4x4 rotational glMatrix
-	\param m: a buffer to store the Matrix in
-*/
-void Quaternion::matrix (float m[4][4]) const
-{
-  float wx, wy, wz, xx, yy, yz, xy, xz, zz, x2, y2, z2; 
-  
-  // calculate coefficients
-  x2 = v.x + v.x;
-  y2 = v.y + v.y; 
-  z2 = v.z + v.z;
-  xx = v.x * x2; xy = v.x * y2; xz = v.x * z2;
-  yy = v.y * y2; yz = v.y * z2; zz = v.z * z2;
-  wx = w * x2; wy = w * y2; wz = w * z2;
-  
-  m[0][0] = 1.0 - (yy + zz); m[1][0] = xy - wz;
-  m[2][0] = xz + wy; m[3][0] = 0.0;
-	
-  m[0][1] = xy + wz; m[1][1] = 1.0 - (xx + zz);
-  m[2][1] = yz - wx; m[3][1] = 0.0;
-  
-  m[0][2] = xz - wy; m[1][2] = yz + wx;
-  m[2][2] = 1.0 - (xx + yy); m[3][2] = 0.0;
-  
-  m[0][3] = 0; m[1][3] = 0;
-  m[2][3] = 0; m[3][3] = 1;
-}
-
-
-void Quaternion::quatSlerp(const Quaternion* from, const Quaternion* to, float t, Quaternion* res)
-{
-  float tol[4];
-  double omega, cosom, sinom, scale0, scale1;
-  DELTA = 0.2;
-
-  cosom = from->v.x * to->v.x + from->v.y * to->v.y + from->v.z * to->v.z + from->w * to->w;
-
-  if( cosom < 0.0 ) 
-    { 
-      cosom = -cosom; 
-      tol[0] = -to->v.x;
-      tol[1] = -to->v.y;
-      tol[2] = -to->v.z;
-      tol[3] = -to->w;
-    }
-  else
-    {
-      tol[0] = to->v.x;
-      tol[1] = to->v.y;
-      tol[2] = to->v.z;
-      tol[3] = to->w;
-    }
-  
-  //if( (1.0 - cosom) > DELTA )
-  //{
-      omega = acos(cosom);
-      sinom = sin(omega);
-      scale0 = sin((1.0 - t) * omega) / sinom;
-      scale1 = sin(t * omega) / sinom;
-      //}
-      /*
-  else
-    {
-      scale0 = 1.0 - t;
-      scale1 = t;
-    }
-      */
-  res->v.x = scale0 * from->v.x + scale1 * tol[0];
-  res->v.y = scale0 * from->v.y + scale1 * tol[1];
-  res->v.z = scale0 * from->v.z + scale1 * tol[2];
-  res->w = scale0 * from->w + scale1 * tol[3];
-}
-
-
-/**
-   \brief convert a rotational 4x4 glMatrix into a Quaternion
-   \param m: a 4x4 matrix in glMatrix order
-*/
-Quaternion::Quaternion (float m[4][4])
-{
-	
-  float  tr, s, q[4];
-  int    i, j, k;
-
-  int nxt[3] = {1, 2, 0};
-
-  tr = m[0][0] + m[1][1] + m[2][2];
-
-  	// check the diagonal
-  if (tr > 0.0) 
-  {
-    s = sqrt (tr + 1.0);
-    w = s / 2.0;
-    s = 0.5 / s;
-    v.x = (m[1][2] - m[2][1]) * s;
-    v.y = (m[2][0] - m[0][2]) * s;
-    v.z = (m[0][1] - m[1][0]) * s;
-	} 
-	else 
-	{
- 		// diagonal is negative
-  	i = 0;
-  	if (m[1][1] > m[0][0]) i = 1;
-    if (m[2][2] > m[i][i]) i = 2;
-    j = nxt[i];
-    k = nxt[j];
-
-    s = sqrt ((m[i][i] - (m[j][j] + m[k][k])) + 1.0);
-      
-    q[i] = s * 0.5;
-            
-    if (s != 0.0) s = 0.5 / s;
-	
-	  q[3] = (m[j][k] - m[k][j]) * s;
-    q[j] = (m[i][j] + m[j][i]) * s;
-    q[k] = (m[i][k] + m[k][i]) * s;
-
-  	v.x = q[0];
-  	v.y = q[1];
-  	v.z = q[2];
-  	w = q[3];
-  }
-}
-
-/**
-   \brief create a rotation from a vector
-   \param v: a vector
-*/
-Rotation::Rotation (const Vector& v)
-{
-  Vector x = Vector( 1, 0, 0);
-  Vector axis = x.cross( v);
-  axis.normalize();
-  float angle = angleRad( x, v);
-  float ca = cos(angle);
-  float sa = sin(angle);
-  m[0] = 1.0f+(1.0f-ca)*(axis.x*axis.x-1.0f);
-  m[1] = -axis.z*sa+(1.0f-ca)*axis.x*axis.y;
-  m[2] = axis.y*sa+(1.0f-ca)*axis.x*axis.z;
-  m[3] = axis.z*sa+(1.0f-ca)*axis.x*axis.y;
-  m[4] = 1.0f+(1.0f-ca)*(axis.y*axis.y-1.0f);
-  m[5] = -axis.x*sa+(1.0f-ca)*axis.y*axis.z;
-  m[6] = -axis.y*sa+(1.0f-ca)*axis.x*axis.z;
-  m[7] = axis.x*sa+(1.0f-ca)*axis.y*axis.z;
-  m[8] = 1.0f+(1.0f-ca)*(axis.z*axis.z-1.0f);
-}
-
-/**
-   \brief creates a rotation from an axis and an angle (radians!)
-   \param axis: the rotational axis
-   \param angle: the angle in radians
-*/
-Rotation::Rotation (const Vector& axis, float angle)
-{
-  float ca, sa;
-  ca = cos(angle);
-  sa = sin(angle);
-  m[0] = 1.0f+(1.0f-ca)*(axis.x*axis.x-1.0f);
-  m[1] = -axis.z*sa+(1.0f-ca)*axis.x*axis.y;
-  m[2] = axis.y*sa+(1.0f-ca)*axis.x*axis.z;
-  m[3] = axis.z*sa+(1.0f-ca)*axis.x*axis.y;
-  m[4] = 1.0f+(1.0f-ca)*(axis.y*axis.y-1.0f);
-  m[5] = -axis.x*sa+(1.0f-ca)*axis.y*axis.z;
-  m[6] = -axis.y*sa+(1.0f-ca)*axis.x*axis.z;
-  m[7] = axis.x*sa+(1.0f-ca)*axis.y*axis.z;
-  m[8] = 1.0f+(1.0f-ca)*(axis.z*axis.z-1.0f);
-}
-
-/**
-   \brief creates a rotation from euler angles (pitch/yaw/roll)
-   \param pitch: rotation around z (in radians)
-   \param yaw: rotation around y (in radians)
-   \param roll: rotation around x (in radians)
-*/
-Rotation::Rotation ( float pitch, float yaw, float roll)
-{
-  float cy, sy, cr, sr, cp, sp;
-  cy = cos(yaw);
-  sy = sin(yaw);
-  cr = cos(roll);
-  sr = sin(roll);
-  cp = cos(pitch);
-  sp = sin(pitch);
-  m[0] = cy*cr;
-  m[1] = -cy*sr;
-  m[2] = sy;
-  m[3] = cp*sr+sp*sy*cr;
-  m[4] = cp*cr-sp*sr*sy;
-  m[5] = -sp*cy;
-  m[6] = sp*sr-cp*sy*cr;
-  m[7] = sp*cr+cp*sy*sr;
-  m[8] = cp*cy;
-}
-
-/**
-   \brief creates a nullrotation (an identity rotation)
-*/
-Rotation::Rotation ()
-{
-  m[0] = 1.0f;
-  m[1] = 0.0f;
-  m[2] = 0.0f;
-  m[3] = 0.0f;
-  m[4] = 1.0f;
-  m[5] = 0.0f;
-  m[6] = 0.0f;
-  m[7] = 0.0f;
-  m[8] = 1.0f;
-}
-
-/**
-   \brief fills the specified buffer with a 4x4 glmatrix
-   \param buffer: Pointer to an array of 16 floats
-   
-   Use this to get the rotation in a gl-compatible format
-*/
-void Rotation::glmatrix (float* buffer)
-{
-	buffer[0] = m[0];
-	buffer[1] = m[3];
-	buffer[2] = m[6];
-	buffer[3] = m[0];
-	buffer[4] = m[1];
-	buffer[5] = m[4];
-	buffer[6] = m[7];
-	buffer[7] = m[0];
-	buffer[8] = m[2];
-	buffer[9] = m[5];
-	buffer[10] = m[8];
-	buffer[11] = m[0];
-	buffer[12] = m[0];
-	buffer[13] = m[0];
-	buffer[14] = m[0];
-	buffer[15] = m[1];
-}
-
-/**
-   \brief multiplies two rotational matrices
-   \param r: another Rotation
-   \return the matrix product of the Rotations
-   
-   Use this to rotate one rotation by another
-*/
-Rotation Rotation::operator* (const Rotation& r)
-{
-	Rotation p;
-	
-	p.m[0] = m[0]*r.m[0] + m[1]*r.m[3] + m[2]*r.m[6];
-	p.m[1] = m[0]*r.m[1] + m[1]*r.m[4] + m[2]*r.m[7];
-	p.m[2] = m[0]*r.m[2] + m[1]*r.m[5] + m[2]*r.m[8];
-	
-	p.m[3] = m[3]*r.m[0] + m[4]*r.m[3] + m[5]*r.m[6];
-	p.m[4] = m[3]*r.m[1] + m[4]*r.m[4] + m[5]*r.m[7];
-	p.m[5] = m[3]*r.m[2] + m[4]*r.m[5] + m[5]*r.m[8];
-
-	p.m[6] = m[6]*r.m[0] + m[7]*r.m[3] + m[8]*r.m[6];
-	p.m[7] = m[6]*r.m[1] + m[7]*r.m[4] + m[8]*r.m[7];
-	p.m[8] = m[6]*r.m[2] + m[7]*r.m[5] + m[8]*r.m[8];
-	
-	return p;
-}
-
-
-/**
-   \brief rotates the vector by the given rotation
-   \param v: a vector
-   \param r: a rotation
-   \return the rotated vector
-*/
-Vector rotateVector( const Vector& v, const Rotation& r)
-{
-  Vector t;
-  
-  t.x = v.x * r.m[0] + v.y * r.m[1] + v.z * r.m[2];
-  t.y = v.x * r.m[3] + v.y * r.m[4] + v.z * r.m[5];
-  t.z = v.x * r.m[6] + v.y * r.m[7] + v.z * r.m[8];
-
-  return t;
-}
-
-/**
-   \brief calculate the distance between two lines
-   \param l: the other line
-   \return the distance between the lines
-*/
-float Line::distance (const Line& l) const
-{
-  float q, d;
-  Vector n = a.cross(l.a);
-  q = n.dot(r-l.r);
-  d = n.len();
-  if( d == 0.0) return 0.0;
-  return q/d;
-}
-
-/**
-   \brief calculate the distance between a line and a point
-   \param v: the point
-   \return the distance between the Line and the point
-*/
-float Line::distancePoint (const Vector& v) const
-{
-  Vector d = v-r;
-  Vector u = a * d.dot( a);
-  return (d - u).len();
-}
-
-/**
-   \brief calculate the two points of minimal distance of two lines
-   \param l: the other line
-   \return a Vector[2] (!has to be deleted after use!) containing the two points of minimal distance
-*/
-Vector* Line::footpoints (const Line& l) const
-{
-  Vector* fp = new Vector[2];
-  Plane p = Plane (r + a.cross(l.a), r, r + a);
-  fp[1] = p.intersectLine (l);
-  p = Plane (fp[1], l.a);
-  fp[0] = p.intersectLine (*this);
-  return fp;
-}
-
-/**
-  \brief calculate the length of a line
-  \return the lenght of the line 
-*/
-float Line::len() const
-{
-  return a.len();
-}
-
-/**
-   \brief rotate the line by given rotation
-   \param rot: a rotation
-*/
-void Line::rotate (const Rotation& rot)
-{
-  Vector t = a + r;
-  t = rotateVector( t, rot);
-  r = rotateVector( r, rot),
-  a = t - r;
-}
-
-/**
-   \brief create a plane from three points
-   \param a: first point
-   \param b: second point
-   \param c: third point
-*/
-Plane::Plane (Vector a, Vector b, Vector c)
-{
-  n = (a-b).cross(c-b);
-  k = -(n.x*b.x+n.y*b.y+n.z*b.z);
-}
-
-/**
-   \brief create a plane from anchor point and normal
-   \param n: normal vector
-   \param p: anchor point
-*/
-Plane::Plane (Vector norm, Vector p)
-{
-  n = norm;
-  k = -(n.x*p.x+n.y*p.y+n.z*p.z);
-}
-
-/**
-   \brief returns the intersection point between the plane and a line
-   \param l: a line
-*/
-Vector Plane::intersectLine (const Line& l) const
-{
-  if (n.x*l.a.x+n.y*l.a.y+n.z*l.a.z == 0.0) return Vector(0,0,0);
-  float t = (n.x*l.r.x+n.y*l.r.y+n.z*l.r.z+k) / (n.x*l.a.x+n.y*l.a.y+n.z*l.a.z);
-  return l.r + (l.a * t);
-}
-
-/**
-   \brief returns the distance between the plane and a point
-   \param p: a Point
-   \return the distance between the plane and the point (can be negative)
-*/
-float Plane::distancePoint (const Vector& p) const
-{
-  float l = n.len();
-  if( l == 0.0) return 0.0;
-  return (n.dot(p) + k) / n.len();
-}
-
-/**
-   \brief returns the side a point is located relative to a Plane
-   \param p: a Point
-   \return 0 if the point is contained within the Plane, positive(negative) if the point is in the positive(negative) semi-space of the Plane
-*/
-float Plane::locatePoint (const Vector& p) const
-{
-  return (n.dot(p) + k);
-}
-
Index: xonox/branches/trackManager/src/vector.h
===================================================================
--- /orxonox/branches/trackManager/src/vector.h	(revision 3497)
+++ 	(revision )
@@ -1,151 +1,0 @@
-/*! 
-    \file vector.h
-    \brief A basic 3D math framework
-    
-    Contains classes to handle vectors, lines, rotations and planes
-*/ 
-
-#ifndef _VECTOR_H
-#define _VECTOR_H
-
-#include <math.h>
-#define PI 3.14159265359f
-
-//! 3D Vector
-/**
-	Class to handle 3D Vectors
-*/
-class Vector {
-
-  public:
- 
-  float x, y, z;
-
-  Vector (float x, float y, float z) : x(x), y(y), z(z) {}  //!< assignment constructor
-  Vector () : x(0), y(0), z(0) {}
-  ~Vector () {}
-
-  Vector operator+ (const Vector& v) const;
-  Vector operator- (const Vector& v) const;
-  float operator* (const Vector& v) const;
-  Vector operator* (float f) const;
-  Vector operator/ (float f) const;
-  float dot (const Vector& v) const;
-  Vector cross (const Vector& v) const;
-  void scale(const Vector& v);
-  float len() const;
-  void normalize();
-  Vector* getNormalized();
-  Vector abs();
-};
-
-float angleDeg (const Vector& v1, const Vector& v2);
-float angleRad (const Vector& v1, const Vector& v2);
-
-//! Quaternion
-/**
-	Class to handle 3-dimensional rotation efficiently
-*/
-class Quaternion
-{
- public:
-	Vector v;	//!< Imaginary Vector
-	float w; //!< Real part of the number
-
- 	Quaternion ();
- 	Quaternion (float m[4][4]);
- 	Quaternion (float angle, const Vector& axis);
- 	Quaternion (const Vector& dir, const Vector& up);
- 	Quaternion (float roll, float pitch, float yaw);
- 	
- 	Quaternion operator/ (const float& f) const;
- 	Quaternion operator* (const float& f) const;
- 	Quaternion operator* (const Quaternion& q) const;
-	Quaternion operator+ (const Quaternion& q) const;
-	Quaternion operator- (const Quaternion& q) const;
-	Quaternion conjugate () const;
-	Quaternion inverse () const;
- 	Vector apply (Vector& f) const;
-	float norm () const;
-	void matrix (float m[4][4]) const;
-	void quatSlerp(const Quaternion* from, const Quaternion* to, const float t, Quaternion* res);
-
- private:
-	float DELTA;
-
-};
-
-//! 3D rotation (OBSOLETE)
-/**
-  Class to handle 3-dimensional rotations.
-  Can create a rotation from several inputs, currently stores rotation using a 3x3 Matrix
-*/
-class Rotation {
-  public:
-  
-  float m[9]; //!< 3x3 Rotation Matrix
-  
-  Rotation ( const Vector& v);
-  Rotation ( const Vector& axis, float angle);
-  Rotation ( float pitch, float yaw, float roll);
-  Rotation ();
-  ~Rotation () {}
-  
-  Rotation operator* (const Rotation& r);
-  
-  void glmatrix (float* buffer);
-};
-
-//!< Apply a rotation to a vector
-Vector rotateVector( const Vector& v, const Rotation& r);
-
-//! 3D line
-/**
-  Class to store Lines in 3-dimensional space
-
-  Supports line-to-line distance measurements and rotation
-*/
-class Line
-{
-  public:
-  
-  Vector r;   //!< Offset
-  Vector a;   //!< Direction
-  
-  Line ( Vector r, Vector a) : r(r), a(a) {}  //!< assignment constructor
-  Line () : r(Vector(0,0,0)), a(Vector (1,1,1)) {}
-  ~Line () {}
-  
-  float distance (const Line& l) const;
-  float distancePoint (const Vector& v) const;
-  Vector* footpoints (const Line& l) const;
-  float len () const;
-  
-  void rotate(const Rotation& rot);
-};
-
-//! 3D plane
-/**
-  Class to handle planes in 3-dimensional space
-  
-  Critical for polygon-based collision detection
-*/
-class Plane
-{
-  public:
-  
-  Vector n;   //!< Normal vector
-  float k;    //!< Offset constant
-  
-  Plane (Vector a, Vector b, Vector c);
-  Plane (Vector norm, Vector p);
-  Plane (Vector n, float k) : n(n), k(k) {} //!< assignment constructor
-  Plane () : n(Vector(1,1,1)), k(0) {}
-  ~Plane () {}
-  
-  Vector intersectLine (const Line& l) const;
-  float distancePoint (const Vector& p) const;
-  float locatePoint (const Vector& p) const;
-};
-
-#endif /* _VECTOR_H */
Index: xonox/branches/trackManager/src/world.cc
===================================================================
--- /orxonox/branches/trackManager/src/world.cc	(revision 3497)
+++ 	(revision )
@@ -1,972 +1,0 @@
-
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   ### File Specific:
-   main-programmer: Patrick Boenzli
-   co-programmer: Christian Meyer
-*/
-
-#include "world.h"
-#include "world_entity.h"
-#include "collision.h"
-#include "track_manager.h"
-#include "player.h"
-#include "command_node.h"
-#include "camera.h"
-#include "environment.h"
-#include "p_node.h"
-#include "null_parent.h"
-#include "helper_parent.h"
-#include "glmenu_imagescreen.h"
-#include "skysphere.h"
-#include "track_node.h"
-
-using namespace std;
-
-
-/** 
-    \brief create a new World
-    
-    This creates a new empty world!
-*/
-World::World (char* name)
-{
-  this->setClassName ("World");
-  this->worldName = name;
-  this->debugWorldNr = -1;
-  this->entities = new tList<WorldEntity>();
-}
-
-World::World (int worldID)
-{
-  this->debugWorldNr = worldID;
-  this->worldName = NULL;
-  this->entities = new tList<WorldEntity>();
-}
-
-/** 
-    \brief remove the World from memory
-    
-    delete everything explicitly, that isn't contained in the parenting tree!
-    things contained in the tree are deleted automaticaly
-*/
-World::~World ()
-{
-  printf("World::~World() - deleting current world\n");
-  CommandNode* cn = Orxonox::getInstance()->getLocalInput();
-  cn->unbind(this->localPlayer);
-  cn->reset();
-  this->localCamera->destroy();
-
-  this->nullParent->destroy();
-  
-  delete this->skySphere;
-
-  //delete this->trackManager;
-
-  /*
-  WorldEntity* entity = entities->enumerate();  
-  while( entity != NULL ) 
-    { 
-      entity->destroy();
-      entity = entities->nextElement();
-    }
-  this->entities->destroy();
-  */
-
-  /* FIX the parent list has to be cleared - not possible if we got the old list also*/
-
-
-  //delete this->entities;
-  //delete this->localCamera;
-  /* this->localPlayer hasn't to be deleted explicitly, it is 
-     contained in entities*/
-}
-
-GLfloat ctrlpoints[4][3] = {
-  {20.0, 10.0, 5.0}, {40.0, -10.0, 0.0},
-  {60.0, -10.0, 5.0}, {80.0, 10.0, 5.0}};
-
-
-ErrorMessage World::init()
-{
-  this->bPause = false;
-  CommandNode* cn = Orxonox::getInstance()->getLocalInput();
-  cn->addToWorld(this);
-  cn->enable(true);
-
-  //glMap1f (GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]);
-  //glEnable (GL_MAP1_VERTEX_3);
-  
-  //theNurb = gluNewNurbsRenderer ();
-  //gluNurbsProperty (theNurb, GLU_NURBS_MODE, GLU_NURBS_TESSELLATOR);
-  //gluNurbsProperty (theNurb, GLU_NURBS_VERTEX, vertexCallback );
-
-}
-
-
-
-ErrorMessage World::start()
-{
-  printf("World::start() - starting current World: nr %i\n", this->debugWorldNr);
-  this->bQuitOrxonox = false;
-  this->bQuitCurrentGame = false;
-  this->mainLoop();
-}
-
-ErrorMessage World::stop()
-{
-  printf("World::stop() - got stop signal\n");
-  this->bQuitCurrentGame = true;
-}
-
-ErrorMessage World::pause()
-{
-  this->isPaused = true;
-}
-
-
-ErrorMessage World::resume()
-{
-  this->isPaused = false;
-}
-
-
-void World::destroy()
-{
-  delete trackManager;
-}
-
-
-void World::displayLoadScreen ()
-{
-  printf ("World::displayLoadScreen - start\n"); 
-  
-  //GLMenuImageScreen* 
-  this->glmis = GLMenuImageScreen::getInstance();
-  this->glmis->init();
-  this->glmis->setMaximum(10);
-  this->glmis->draw();
- 
-  printf ("World::displayLoadScreen - end\n"); 
-}
-
-
-void World::releaseLoadScreen ()
-{
-  printf ("World::releaseLoadScreen - start\n"); 
-  this->glmis->setValue(this->glmis->getMaximum());
-  SDL_Delay(500);
-  printf ("World::releaseLoadScreen - end\n"); 
-}
-
-
-void World::load()
-{
-  //  BezierCurve* tmpCurve = new BezierCurve();
-  if(this->debugWorldNr != -1)
-    {
-      trackManager = TrackManager::getInstance();
-      trackManager->addPoint(Vector(0,-5,0));
-      trackManager->addPoint(Vector(10,0,5));
-      trackManager->addPoint(Vector(20,0,-5));
-      trackManager->addPoint(Vector(30,0,5));
-      trackManager->addPoint(Vector(40,0,5));
-      trackManager->setDuration(2);
-      trackManager->setSavePoint();
-      trackManager->addPoint(Vector(50,10,10));
-      trackManager->addPoint(Vector(60,0, 10));
-      trackManager->addPoint(Vector(70,0, 10));
-      trackManager->addPoint(Vector(80,0,-10));
-      trackManager->addPoint(Vector(90,0,-10));
-      trackManager->setDuration(5);
-      trackManager->setSavePoint();
-      trackManager->addPoint(Vector(110,0,5));
-      trackManager->addPoint(Vector(120,0, 10));
-      trackManager->addPoint(Vector(130,0, 10));
-      trackManager->addPoint(Vector(140,0,-10));
-      trackManager->addPoint(Vector(150,0,-10));
-      trackManager->setDuration(3);
-      int fork11, fork12, fork13, fork14;
-      trackManager->fork(4, &fork11, &fork12, &fork13, &fork14);
-      trackManager->workOn(fork11);
-      trackManager->addPoint(Vector(170, 0, -15));
-      trackManager->addPoint(Vector(180, 0, -15));
-      trackManager->setDuration(3);
-      trackManager->workOn(fork12);
-      trackManager->addPoint(Vector(170, 0, 10));
-      trackManager->addPoint(Vector(180, 0, 10));
-      trackManager->addPoint(Vector(190,2,5));
-      trackManager->addPoint(Vector(200,2,5));
-      trackManager->setDuration(7);
-      int fork21, fork22;
-      trackManager->fork(2, &fork21, &fork22);
-      trackManager->workOn(fork21);
-      trackManager->addPoint(Vector(220, 10,-10));
-      trackManager->addPoint(Vector(230, 0,-10));
-      trackManager->addPoint(Vector(240, 0, 2));
-      trackManager->addPoint(Vector(250, 0, 0));
-      trackManager->addPoint(Vector(260, 0, 5));
-      trackManager->setDuration(3);
-      trackManager->join(2, fork12, fork11);
-      trackManager->workOn(fork22);
-      trackManager->addPoint(Vector(220, -10,10));
-      trackManager->addPoint(Vector(230, 0, 10));
-      trackManager->addPoint(Vector(240, 0, 10));
-      trackManager->addPoint(Vector(250, 0, 5));
-      trackManager->setDuration(6);
-      trackManager->workOn(fork13);
-      trackManager->addPoint(Vector(200,-10,5));
-      trackManager->addPoint(Vector(250,-10,5));
-      trackManager->setDuration(3);
-      trackManager->workOn(fork14);
-      trackManager->addPoint(Vector(200,15,0));
-      trackManager->addPoint(Vector(210,0,10));
-      trackManager->setDuration(1);
-      trackManager->join(4, fork21, fork22, fork13, fork14);
-      trackManager->workOn(10);
-      trackManager->addPoint(Vector(250,-10,5));
-      trackManager->addPoint(Vector(260,-10,5));
-      trackManager->finalize();
-      
-      /*
-	tmpCurve->addNode(Vector(10,  -1,  -1));
-	tmpCurve->addNode(Vector(10,  -2,   2));
-	tmpCurve->addNode(Vector(10,   3,   3));
-	tmpCurve->addNode(Vector(10,   4,  -4), 0);
-	tmpCurve->addNode(Vector(10,  -1,  -1));
-	tmpCurve->addNode(Vector(10,  -2,   2));
-	tmpCurve->addNode(Vector(10,   3,   3));
-	tmpCurve->addNode(Vector(10,   4,  -4), 0);
-	tmpCurve->debug();
-      */
-      switch(this->debugWorldNr)
-	{
-	  /*
-	    this loads the hard-coded debug world. this only for simplicity and will be 
-	    removed by a reald world-loader, which interprets a world-file.
-	    if you want to add an own debug world, just add a case DEBUG_WORLD_[nr] and
-	    make whatever you want...
-	   */
-	case DEBUG_WORLD_0:
-	  {
-	    this->nullParent = NullParent::getInstance ();
-	    this->nullParent->setName ("NullParent");
-
-	    // !\todo old track-system has to be removed
-
-	    //create helper for player
-	    HelperParent* hp = new HelperParent ();
-	    /* the player has to be added to this helper */
-
-	    // create a player
-	    WorldEntity* myPlayer = new Player ();
-	    myPlayer->setName ("player");
-	    this->spawn (myPlayer);
-	    this->localPlayer = myPlayer;	    
-	    // bind input
-	    Orxonox *orx = Orxonox::getInstance ();
-	    orx->getLocalInput()->bind (myPlayer);
-	    
-	    // bind camera
-	    this->localCamera = new Camera(this);
-	    this->localCamera->setName ("camera");
-	    this->getCamera()->bind (myPlayer);
-	    this->localPlayer->addChild (this->localCamera);
-	    
-
-	    // Create SkySphere
-	    skySphere = new Skysphere("../data/pictures/sky-replace.jpg");
-
-	    /*monitor progress*/
-	    this->glmis->step();
-
-	    Vector* es = new Vector (50, 2, 0);
-	    Quaternion* qs = new Quaternion ();
-	    WorldEntity* env = new Environment();
-	    env->setName ("env");
-	    this->spawn(env, es, qs);
-	    
-	    trackNode = TrackNode::getInstance();
-
-	    env->setParent(trackNode);
-
-	    trackManager->setBindSlave(trackNode);
-
-	    break;
-	  }
-	case DEBUG_WORLD_1:
-	  {
-	    /*
-	    this->testCurve = new UPointCurve();
-	    this->testCurve->addNode(Vector( 0, 0, 0));
-	    this->testCurve->addNode(Vector(10, 0, 5));
-	    this->testCurve->addNode(Vector(20, -5,-5));
-	    this->testCurve->addNode(Vector(30, 5, 10));
-	    this->testCurve->addNode(Vector(40, 0,-10));
-	    this->testCurve->addNode(Vector(50, 0,-10));
-	    */
-
-	    this->nullParent = NullParent::getInstance ();
-	    this->nullParent->setName ("NullParent");
-
-	    // create some path nodes
-	    this->pathnodes = new Vector[6];
-	    this->pathnodes[0] = Vector(0, 0, 0);
-	    this->pathnodes[1] = Vector(20, 10, 10);
-	    this->pathnodes[2] = Vector(40, 0, 10);
-	    this->pathnodes[3] = Vector(60, 10, 0);
-	    this->pathnodes[4] = Vector(80, 20, 10);
-	    this->pathnodes[5] = Vector(30, 50, 0);
-	    
-
-
-
-	    // create a player
-	    WorldEntity* myPlayer = new Player();
-	    myPlayer->setName ("player");
-	    this->spawn(myPlayer);
-	    this->localPlayer = myPlayer;	    
-	    
-	    // bind input
-	    Orxonox *orx = Orxonox::getInstance();
-	    orx->getLocalInput()->bind (myPlayer);
-	    
-	    // bind camera
-	    this->localCamera = new Camera (this);
-	    this->localCamera->setName ("camera");
-	    this->getCamera()->bind (myPlayer);	
-	    this->localPlayer->addChild (this->localCamera);
-
-	    // Create SkySphere
-	    skySphere = new Skysphere("../data/pictures/sky-replace.jpg");
-
-	    break;
-
-
-	  }
-	default:
-	  printf("World::load() - no world with ID %i found", this->debugWorldNr );
-	}
-    }
-  else if(this->worldName != NULL)
-    {
-
-    }
-
-  // initialize debug coord system
-  objectList = glGenLists(1);
-  glNewList (objectList, GL_COMPILE);
-  glLoadIdentity();
-  glColor3f(1.0,0,0);
-  glBegin(GL_QUADS);
-
-  int sizeX = 100;
-  int sizeZ = 80;
-  float length = 1000;
-  float width = 200;
-  float widthX = float (length /sizeX);
-  float widthZ = float (width /sizeZ);
-  
-  float height [sizeX][sizeZ];
-  Vector normal_vectors[sizeX][sizeZ];
-  
-  
-  for ( int i = 0; i<sizeX-1; i+=1)
-    for (int j = 0; j<sizeZ-1;j+=1)
-      //height[i][j] = rand()/20046 + (j-25)*(j-25)/30;
-#ifdef __WIN32__
-      height[i][j]=(sin((float)j/3)*rand()*i/182400)*.5;
-#else
-      height[i][j]=(sin((float)j/3)*rand()*(long)i/6282450500.0)*.5;
-#endif
-
-  //Die Huegel ein wenig glaetten
-  for (int h=1; h<2;h++)
-    for (int i=1;i<sizeX-2 ;i+=1 )
-      for(int j=1;j<sizeZ-2;j+=1)
-	height[i][j]=(height[i+1][j]+height[i][j+1]+height[i-1][j]+height[i][j-1])/4;
-  
-  //Berechnung von normalen Vektoren
-  for(int i=1;i<sizeX-2;i+=1)
-    for(int j=1;j<sizeZ-2 ;j+=1)
-      {
-	Vector v1 = Vector (widthX*(1),      height[i][j],      widthZ*(j) );
-	Vector v2 = Vector (widthX*(i-1),    height[i-1][j],    widthZ*(j));
-	Vector v3 = Vector (widthX*(i),      height[i][j+1],    widthZ*(j+1));
-	Vector v4 = Vector (widthX*(i+1),    height[i+1][j],    widthZ*(j));
-	Vector v5 = Vector (widthX*(i),      height[i][j-1],    widthZ*(j-1));
-	
-	Vector c1 = v2 - v1;
-	Vector c2 = v3 - v1;
-	Vector c3=  v4 - v1;
-	Vector c4 = v5 - v1;
-	Vector zero = Vector (0,0,0);
-	normal_vectors[i][j]=c1.cross(v3-v5)+c2.cross(v4-v2)+c3.cross(v5-v3)+c4.cross(v2-v4);
-	normal_vectors[i][j].normalize();
-      }
-
-  int snowheight=3;
-  for ( int i = 0; i<sizeX; i+=1)
-    for (int j = 0; j<sizeZ;j+=1)
-      {	  
-	Vector v1 = Vector (widthX*(i),      height[i][j]-20,       widthZ*(j)  -width/2);
-	Vector v2 = Vector (widthX*(i+1),    height[i+1][j]-20,     widthZ*(j)  -width/2);
-	Vector v3 = Vector (widthX*(i+1),    height[i+1][j+1]-20,   widthZ*(j+1)-width/2);
-	Vector v4 = Vector (widthX*(i),      height[i][j+1]-20,     widthZ*(j+1)-width/2);
-	float a[3];
-	if(height[i][j]<snowheight){
-	  a[0]=0;
-	  a[1]=1.0-height[i][j]/10-.3;
-	  a[2]=0;
-	  glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
-	}
-	else{
-	    a[0]=1.0;
-	    a[1]=1.0;
-	    a[2]=1.0;
-	    glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
-	    
-	}
-	glNormal3f(normal_vectors[i][j].x, normal_vectors[i][j].y, normal_vectors[i][j].z);
-	glVertex3f(v1.x, v1.y, v1.z);
-	if(height[i+1][j]<snowheight){
-	  a[0]=0;
-	  a[1] =1.0-height[i+1][j]/10-.3;
-	  a[2]=0;
-	  glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
-	}
-	else{
-	  a[0]=1.0;
-	  a[1]=1.0;
-	  a[2]=1.0;
-	  glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
-	  
-	}
-	glNormal3f(normal_vectors[i+1][j].x, normal_vectors[i+1][j].y, normal_vectors[i+1][j].z);
-	glVertex3f(v2.x, v2.y, v2.z);
-	if(height[i+1][j+1]<snowheight){
-	  a[0]=0;
-	  a[1] =1.0-height[i+1][j+1]/10-.3;
-	  a[2]=0;
-	  glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
-	}
-	else{
-	  a[0]=1.0;
-	  a[1]=1.0;
-	  a[2]=1.0;
-	  glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
-	  
-	  
-	}
-	glNormal3f(normal_vectors[i+1][j+1].x, normal_vectors[i+1][j+1].y, normal_vectors[i+1][j+1].z);
-	glVertex3f(v3.x, v3.y, v3.z);
-	if(height[i][j+1]<snowheight){
-	  a[0]=0;
-	  a[1] =1.0-height[i+1][j+1]/10-.3;
-	  a[2]=0;
-	  glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
-	}
-	else{
-	  a[0]=1.0;
-	  a[1]=1.0;
-	  a[2]=1.0;
-	  glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
-	}
-	glNormal3f(normal_vectors[i][j+1].x, normal_vectors[i][j+1].y, normal_vectors[i][j+1].z);
-	glVertex3f(v4.x, v4.y, v4.z);
-	
-      }
-  glEnd();
-  /*  
-  glBegin(GL_LINES);
-  for( float x = -128.0; x < 128.0; x += 25.0)
-    {
-      for( float y = -128.0; y < 128.0; y += 25.0)
-	{
-	  glColor3f(1,0,0);
-	  glVertex3f(x,y,-128.0);
-	  glVertex3f(x,y,0.0);
-	  glColor3f(0.5,0,0);
-	  glVertex3f(x,y,0.0);
-	  glVertex3f(x,y,128.0);
-	}
-    }
-  for( float y = -128.0; y < 128.0; y += 25.0)
-    {
-      for( float z = -128.0; z < 128.0; z += 25.0)
-	{
-	  glColor3f(0,1,0);
-	  glVertex3f(-128.0,y,z);
-	  glVertex3f(0.0,y,z);
-	  glColor3f(0,0.5,0);
-	  glVertex3f(0.0,y,z);
-	  glVertex3f(128.0,y,z);
-	}
-    }
-  for( float x = -128.0; x < 128.0; x += 25.0)
-    {
-      for( float z = -128.0; z < 128.0; z += 25.0)
-	{
-	  glColor3f(0,0,1);
-	  glVertex3f(x,-128.0,z);
-	  glVertex3f(x,0.0,z);
-	  glColor3f(0,0,0.5);
-	  glVertex3f(x,0.0,z);
-	  glVertex3f(x,128.0,z);
-	}
-      
-    }
-  */  
-  /*
-  glBegin(GL_LINE_STRIP);
-  glColor3f(1.0, 5.0, 1.0);
-  for( int i = 0; i <= 30; i++)
-    {
-      glEvalCoord1f ((GLfloat) i/30.0);
-    }
-  glEnd();
-  */
-
-  trackManager->drawGraph(.01);
-  trackManager->debug(2);
-  /*  
-  glBegin(GL_LINES);
-  float i;
-  for(i = 0.0; i<1; i+=.01)
-    {
-      printf("%f, %f, %f\n",tmpCurve->calcPos(i).x, tmpCurve->calcPos(i).y, tmpCurve->calcPos(i).z);
-      glVertex3f(tmpCurve->calcPos(i).x, tmpCurve->calcPos(i).y, tmpCurve->calcPos(i).z);
-    }
-  glEnd();
-  */
-  glEndList();
-}
-
-
-/** 
-    \brief checks for collisions
-    
-    This method runs through all WorldEntities known to the world and checks for collisions 
-    between them. In case of collisions the collide() method of the corresponding entities 
-    is called.
-*/
-void World::collide ()
-{
-  /*
-  List *a, *b;
-  WorldEntity *aobj, *bobj;
-   
-  a = entities;
-  
-  while( a != NULL)
-    {
-      aobj = a->nextElement();
-      if( aobj->bCollide && aobj->collisioncluster != NULL)
-	{
-	  b = a->nextElement();
-	  while( b != NULL )
-	    {
-	      bobj = b->nextElement();
-	      if( bobj->bCollide && bobj->collisioncluster != NULL )
-		{
-		  unsigned long ahitflg, bhitflg;
-		  if( check_collision ( &aobj->place, aobj->collisioncluster, 
-					&ahitflg, &bobj->place, bobj->collisioncluster, 
-					&bhitflg) );
-		  {
-		    aobj->collide (bobj, ahitflg, bhitflg);
-		    bobj->collide (aobj, bhitflg, ahitflg);
-		  }
-		}
-	      b = b->nextElement();
-	    }
-	}
-      a = a->enumerate();
-    }
-  */
-}
-
-/** 
-    \brief runs through all entities calling their draw() methods
-*/
-void World::draw ()
-{
-  // draw entities
-  WorldEntity* entity;
-  entity = this->entities->enumerate();
-  while( entity != NULL ) 
-    { 
-      if( entity->bDraw ) entity->draw();
-      entity = this->entities->nextElement();
-    } 
-  
-  //glmis = new GLMenuImageScreen();
-  ///glmis->init();
-
-  // draw debug coord system
-  glCallList (objectList);
-
-  //! \todo skysphere is a WorldEntity and should be inside of the world-entity-list.
-  skySphere->draw();
-
-}
-
-/** 
-    \brief updates Placements and notifies entities when they left the 
-    world
-    
-    This runs trough all WorldEntities and maps Locations to Placements 
-    if they are bound, checks whether they left the level boundaries 
-    and calls appropriate functions.
-*/
-void World::update ()
-{
-  /*
-  //List<WorldEntity> *l;
-  WorldEntity* entity;
-  Location* loc;
-  Placement* plc;
-  Uint32 t;
-  
-  //  l = entities->enumerate(); 
-  entity = this->entities->enumerate();
-  while( entity != NULL ) 
-    { 
-
-      
-      if( !entity->isFree() )
-	{
-	  loc = entity->getLocation();
-	  plc = entity->getPlacement();
-	  t = loc->part;
-	  
-	  if( t >= traclen )
-	    {
-	      printf("An entity is out of the game area\n");
-	      entity->leftWorld ();
-	    }
-	  else
-	    {
-	      while( track[t].mapCoords( loc, plc) )
-		{
-		  track[t].postLeave (entity);
-		  if( loc->part >= tracklen )
-		    {
-		      printf("An entity has left the game area\n");
-		      entity->leftWorld ();
-		      break;
-		    }
-		  track[loc->part].postEnter (entity);
-		}
-	    }
-	}
-      else
-	{
-	}
-      
-      entity = entities->nextElement();
-    }
-  */  
-}
-
-/** 
-    \brief relays the passed time since the last frame to entities and Track parts
-    \param deltaT: the time passed since the last frame in milliseconds
-*/
-void World::timeSlice (Uint32 deltaT)
-{
-  //List<WorldEntity> *l;
-  WorldEntity* entity;
-  float seconds = deltaT / 1000.0;
-  
-  this->nullParent->update (seconds);
-  //this->nullParent->processTick (seconds);
-
-  entity = entities->enumerate(); 
-  while( entity != NULL) 
-    { 
-      entity->tick (seconds);
-      entity = entities->nextElement();
-    }
-
-  skySphere->updatePosition(localCamera->absCoordinate);
-  //for( int i = 0; i < tracklen; i++) track[i].tick (seconds);
-}
-
-/**
-   \brief removes level data from memory
-*/
-void World::unload()
-{
-
-}
-
-
-/**
-   \brief function to put your own debug stuff into it. it can display informations about
-   the current class/procedure
-*/
-void World::debug()
-{
-  printf ("World::debug() - starting debug\n");
-  PNode* p1 = NullParent::getInstance ();
-  PNode* p2 = new PNode (new Vector(2, 2, 2), p1);
-  PNode* p3 = new PNode (new Vector(4, 4, 4), p1);
-  PNode* p4 = new PNode (new Vector(6, 6, 6), p2);
-
-  p1->debug ();
-  p2->debug ();
-  p3->debug ();
-  p4->debug ();
-
-  p1->shiftCoor (new Vector(-1, -1, -1));
-
-  printf("World::debug() - shift\n");
-  p1->debug ();
-  p2->debug ();
-  p3->debug ();
-  p4->debug ();
-  
-  p1->update (1);
-
-  printf ("World::debug() - update\n");
-  p1->debug ();
-  p2->debug ();
-  p3->debug ();
-  p4->debug ();
-
-  p2->shiftCoor (new Vector(-1, -1, -1));
-  p1->update (2);
-
-  p1->debug ();
-  p2->debug ();
-  p3->debug ();
-  p4->debug ();
-
-  p2->setAbsCoor (new Vector(1,2,3));
-
-
- p1->update (2);
-
-  p1->debug ();
-  p2->debug ();
-  p3->debug ();
-  p4->debug ();
-
-  p1->destroy ();
-  
-  
-  /*
-  WorldEntity* entity;
-  printf("counting all entities\n");
-  printf("World::debug() - enumerate()\n");
-  entity = entities->enumerate();  
-  while( entity != NULL ) 
-    { 
-      if( entity->bDraw ) printf("got an entity\n");
-      entity = entities->nextElement();
-    }
-  */
-}
-
-
-/*
-  \brief main loop of the world: executing all world relevant function
-
-  in this loop we synchronize (if networked), handle input events, give the heart-beat to
-  all other member-entities of the world (tick to player, enemies etc.), checking for
-  collisions drawing everything to the screen.
-*/
-void World::mainLoop()
-{
-  this->lastFrame = SDL_GetTicks ();
-  printf("World::mainLoop() - Entering main loop\n");
-  while( !this->bQuitOrxonox && !this->bQuitCurrentGame) /* \todo implement pause */
-    {
-      // Network
-      this->synchronize ();
-      // Process input
-      this->handleInput ();
-      if( this->bQuitCurrentGame || this->bQuitOrxonox)
-	{
-	  printf("World::mainLoop() - leaving loop earlier...\n");
-	  break;
-	}
-      // Process time
-      this->timeSlice ();
-      // Process collision
-      this->collision ();
-      // Draw
-      this->display ();
-  
-      for( int i = 0; i < 5000000; i++) {}
-      /* \todo this is to slow down the program for openGl Software emulator computers, reimplement*/
-    }
-  printf("World::mainLoop() - Exiting the main loop\n");
-}
-
-/**
-   \brief synchronize local data with remote data
-*/
-void World::synchronize ()
-{
-  // Get remote input
-  // Update synchronizables
-}
-
-/**
-   \brief run all input processing
-
-   the command node is the central input event dispatcher. the node uses the even-queue from
-   sdl and has its own event-passing-queue.
-*/
-void World::handleInput ()
-{
-  // localinput
-  CommandNode* cn = Orxonox::getInstance()->getLocalInput();
-  cn->process();
-  // remoteinput
-}
-
-/**
-   \brief advance the timeline
-
-   this calculates the time used to process one frame (with all input handling, drawing, etc)
-   the time is mesured in ms and passed to all world-entities and other classes that need
-   a heart-beat.
-*/
-void World::timeSlice ()
-{
-  Uint32 currentFrame = SDL_GetTicks();
-  if(!this->bPause)
-    {
-      Uint32 dt = currentFrame - this->lastFrame;
-      
-      if(dt > 0)
-	{
-	  float fps = 1000/dt;
-	  printf("fps = %f\n", fps);
-	}
-      else
-	{
-	  /* the frame-rate is limited to 100 frames per second, all other things are for
-	     nothing.
-	  */
-	  printf("fps = 1000 - frame rate is adjusted\n");
-	  SDL_Delay(10);
-	  dt = 10;
-	}
-      this->timeSlice (dt);
-      this->update ();
-      this->localCamera->timeSlice(dt);
-      this->trackManager->tick(dt);
-    }
-  this->lastFrame = currentFrame;
-}
-
-
-/**
-   \brief compute collision detection
-*/
-void World::collision ()
-{
-  this->collide ();
-}
-
-
-/**
-   \brief render the current frame
-   
-   clear all buffers and draw the world
-*/
-void World::display ()
-{
-  // clear buffer
-  glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
-  // set camera
-  this->localCamera->apply ();
-  // draw world
-  this->draw();
-  // draw HUD
-  /* \todo draw HUD */
-  // flip buffers
-  SDL_GL_SwapBuffers();
-  //SDL_Surface* screen = Orxonox::getInstance()->getScreen ();
-  //SDL_Flip (screen);
-}
-
-/**
-   \brief give back active camera
-   
-   this passes back the actualy active camera
-   \todo ability to define more than one camera or camera-places
-*/
-Camera* World::getCamera()
-{
-  return this->localCamera;
-}
-
-
-/**
-   \brief add and spawn a new entity to this world
-   \param entity to be added
-*/
-void World::spawn(WorldEntity* entity)
-{
-  if( this->nullParent != NULL && entity->parent == NULL)
-    this->nullParent->addChild (entity);
-
-  this->entities->add (entity);
-
-  entity->postSpawn ();
-}
-
-
-/**
-   \brief add and spawn a new entity to this world
-   \param entity to be added
-   \param location where to add
-*/
-void World::spawn(WorldEntity* entity, Vector* absCoor, Quaternion* absDir)
-{
-  entity->setAbsCoor (absCoor);
-  entity->setAbsDir (absDir);
-  
-  if( this->nullParent != NULL && entity->parent == NULL)
-    this->nullParent->addChild (entity);
-
-  this->entities->add (entity);
-
-  entity->postSpawn ();
-}
-
-
-
-/*
-  \brief commands that the world must catch
-  \returns false if not used by the world
-*/
-bool World::command(Command* cmd)
-{
-  return false;
-}
-
-
-
-
-void World::swap (unsigned char &a, unsigned char &b)
-{
-  unsigned char temp;
-  temp = a;
-  a    = b;
-  b    = temp;
-}
Index: xonox/branches/trackManager/src/world.h
===================================================================
--- /orxonox/branches/trackManager/src/world.h	(revision 3497)
+++ 	(revision )
@@ -1,95 +1,0 @@
-/*! 
-    \file world.h
-    \brief Holds and manages all game data
-*/ 
-
-#ifndef _WORLD_H
-#define _WORLD_H
-
-#include "stdincl.h"
-#include "story_entity.h"
-
-
-class TrackManager;
-class WorldEntity;
-class Camera;
-class PNode;
-class GLMenuImageScreen;
-class Skysphere;
-
-//! The game environment
-class World : public StoryEntity {
-
- public:
-  World (char* name);
-  World (int worldID);
-  virtual ~World ();
-  
-  virtual ErrorMessage init ();
-  virtual ErrorMessage start ();
-  virtual ErrorMessage stop ();
-  virtual ErrorMessage pause ();
-  virtual ErrorMessage resume ();
-
-  virtual void load ();
-  virtual void destroy ();
-
-  //static void vertexCallback (GLfloat* vertex);
-
-  void timeSlice (Uint32 deltaT);
-  void collide ();
-  void draw ();
-  void update ();	// maps Locations to Placements
-  //void calcCameraPos (Location* loc, Placement* plc);
-	
-  void unload ();
-  bool command (Command* cmd);
-  virtual void displayLoadScreen();
-  virtual void releaseLoadScreen();
-  
-  //bool system_command (Command* cmd);
-  Camera* getCamera ();
-
-  void spawn (WorldEntity* entity);
-  void spawn (WorldEntity* entity, Vector* absCoor, Quaternion* absDir);
-
-  tList<WorldEntity>* entities;
-  
-  // base level data
-  TrackManager* trackManager;
-  Vector* pathnodes;
-  Camera* localCamera;  
-
-
-  UPointCurve* testCurve;
- private:
-  Uint32 lastFrame; //!> last time of frame
-  bool bQuitOrxonox; //!> quit this application
-  bool bQuitCurrentGame; //!> quit only the current game and return to menu
-  bool bPause;
-
-  GLMenuImageScreen* glmis;
-
-  char* worldName;
-  int debugWorldNr;
-  GLuint objectList;
-  SDL_Surface *loadImage;
-  Skysphere* skySphere;
-
-  WorldEntity* localPlayer;
- 
-  PNode* nullParent;
-  PNode* trackNode;
- 
-  void mainLoop ();
-  void synchronize ();
-  void handleInput ();
-  void timeSlice ();
-  void collision ();
-  void display ();
-  void debug ();
-
-  void swap (unsigned char &a, unsigned char &b); /* \todo: this function doesn't belong here, this should be part of a image class*/
-};
-
-#endif /* _WORLD_H */
Index: /orxonox/branches/trackManager/src/world_entities/environment.cc
===================================================================
--- /orxonox/branches/trackManager/src/world_entities/environment.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/world_entities/environment.cc	(revision 3498)
@@ -0,0 +1,62 @@
+
+
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific
+   main-programmer: Patrick Boenzli
+   co-programmer: 
+*/
+
+
+#include "environment.h"
+#include "stdincl.h"
+#include "world_entity.h"
+#include "vector.h"
+#include "objModel.h"
+
+using namespace std;
+
+
+
+Environment::Environment () : WorldEntity()
+{
+  this->model = new OBJModel("../data/models/fighter.obj");
+}
+
+
+
+Environment::~Environment () 
+{
+  delete this->model;
+}
+
+void Environment::tick (float time) {}
+
+void Environment::hit (WorldEntity* weapon, Vector loc) {}
+
+void Environment::destroy () {}
+
+void Environment::collide (WorldEntity* other,  Uint32 ownhitflags, Uint32 otherhitflags) {}
+
+void Environment::draw () 
+{
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
+  float matrix[4][4];
+  
+  glTranslatef (this->getAbsCoor ().x, this->getAbsCoor ().y, this->getAbsCoor ().z);
+  //rotate
+  this->getAbsDir().matrix (matrix);
+  glMultMatrixf((float*)matrix);
+  
+  this->model->draw();
+}
+
Index: /orxonox/branches/trackManager/src/world_entities/environment.h
===================================================================
--- /orxonox/branches/trackManager/src/world_entities/environment.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/world_entities/environment.h	(revision 3498)
@@ -0,0 +1,31 @@
+#ifndef _ENVIRONEMENT_H
+#define _ENVIRONEMENT_H
+
+#include "world_entity.h"
+
+
+class Environment : public WorldEntity 
+{
+  friend class World;
+
+ private:
+  float xCor;
+  float yCor;
+  float zCor;
+
+  float mountainTest[10][10];
+
+ public:
+  Environment ();
+  ~Environment ();
+
+  
+  virtual void tick (float time);
+  virtual void hit (WorldEntity* weapon, Vector loc);
+  virtual void destroy ();
+  virtual void collide (WorldEntity* other,  Uint32 ownhitflags, Uint32 otherhitflags);
+  virtual void draw ();
+
+};
+
+#endif /* _ENVIRONEMENT_H */
Index: /orxonox/branches/trackManager/src/world_entities/npc.cc
===================================================================
--- /orxonox/branches/trackManager/src/world_entities/npc.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/world_entities/npc.cc	(revision 3498)
@@ -0,0 +1,94 @@
+
+
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: Patrick Boenzli
+   co-programmer:
+*/
+
+#include <iostream>
+#include <GL/glut.h>
+
+#include "ai.h"
+#include "data_tank.h"
+
+#include "npc.h"
+
+using namespace std;
+
+
+NPC::NPC()
+  : WorldEntity()
+{
+  hasDied = 0;
+}
+
+NPC::~NPC () {}
+
+
+void NPC::setPosition(float x, float y, float z)
+{
+  xCor = x; yCor = y; zCor = z;
+}
+
+void NPC::getPosition(float* x, float* y, float* z) 
+{
+  *x = xCor; 
+  *y = yCor; 
+  *z = zCor;
+}
+
+void NPC::setCollisionRadius(float r) 
+{
+  collisionRadius = r;
+}
+
+float NPC::getCollisionRadius() 
+{
+  return collisionRadius;
+}
+
+
+void NPC::addAI(AI* ai)
+{}
+
+void NPC::paint()
+{
+  //cout << "WorldEntity::WorldEntity();" << endl;  
+  /* fix: died flag approach is very stupid, just to show @ convention */
+  if( hasDied == 0 ) {
+    glPushMatrix();
+    glTranslatef(xCor, yCor, 3.0);
+    //glScalef(1.0, 3.0, 1.0);
+    glutWireSphere(1.0, 10, 10);
+    glPopMatrix();
+  }
+}
+
+void NPC::drawNPC() 
+{
+
+}
+
+
+/* define the reaction, if the ship is been hit */
+int NPC::hit()
+{
+  die();
+  return 0;
+}
+
+
+void NPC::die()
+{
+  hasDied = 1;
+}
Index: /orxonox/branches/trackManager/src/world_entities/npc.h
===================================================================
--- /orxonox/branches/trackManager/src/world_entities/npc.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/world_entities/npc.h	(revision 3498)
@@ -0,0 +1,43 @@
+
+#ifndef _NPC_H
+#define _NPC_H
+
+#include "world_entity.h"
+
+class AI;
+
+class NPC : public WorldEntity {
+
+ public:
+  NPC ();
+  ~NPC ();
+
+  /* collision control */
+  float collisionRadius;
+
+  float xCor;
+  float yCor;
+  float zCor;
+
+  void drawNPC(void);
+  void paint(void);
+  void setPosition(float x, float y, float z);
+  void getPosition(float* x, float* y, float* z);
+  void addAI(AI* ai);
+  void setCollisionRadius(float r);
+  float getCollisionRadius(void);
+  int hit(void);
+  void die(void);
+
+ private:
+  /* position of the non player space craft */
+
+  int npcType;
+  int hasDied;
+
+
+;
+
+};
+
+#endif /* _NPC_H */
Index: /orxonox/branches/trackManager/src/world_entities/player.cc
===================================================================
--- /orxonox/branches/trackManager/src/world_entities/player.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/world_entities/player.cc	(revision 3498)
@@ -0,0 +1,211 @@
+
+
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: Patrick Boenzli
+   co-programmer: Christian Meyer
+*/
+
+#include "player.h"
+#include "stdincl.h"
+//#include "collision.h"
+#include "objModel.h"
+
+using namespace std;
+
+/**
+   \brief creates a new Player
+   \param isFree if the player is free
+*/
+Player::Player(bool isFree) : WorldEntity(isFree)
+{
+
+  this->model = new OBJModel("../data/models/reaplow.obj");
+  /*
+  objectList = glGenLists(1);
+  glNewList (objectList, GL_COMPILE);
+
+  glBegin(GL_TRIANGLES);
+  glColor3f(1,1,1);
+  glVertex3f(0,0,0.5);
+  glVertex3f(-0.5,0,-1);
+  glVertex3f(0.5,0,-1);
+
+  glVertex3f(0,0,0.5);
+  glVertex3f(0,0.5,-1);
+  glVertex3f(0,-0.5,-1);
+  glEnd();
+    
+  glBegin(GL_QUADS);
+  glColor3f(0,0,1);
+  glVertex3f(0.5,0.5,-1);
+  glVertex3f(0.5,-0.5,-1);
+  glVertex3f(-0.5,-0.5,-1);
+  glVertex3f(-0.5,0.5,-1);
+  glEnd();
+  
+  glEndList ();
+  */
+}
+
+/**
+   \brief destructs the player
+*/
+Player::~Player ()
+{
+  delete this->model;
+}
+
+/**
+   \brief effect that occurs after the player is spawned
+*/
+void Player::postSpawn ()
+{
+  travelSpeed = 15.0;
+  velocity = Vector();
+  bUp = bDown = bLeft = bRight = bAscend = bDescend = false;
+  bFire = false;
+  acceleration = 10.0;
+  //setCollision(new CollisionCluster(1.0, Vector(0,0,0)));
+}
+
+/**
+   \brief the function called for each passing timeSnap
+   \param time The timespan passed since last update
+*/
+void Player::tick (float time)
+{
+  // movement
+  this->move (time);
+}
+
+/**
+   \brief if the player is hit, call this function
+   \param weapon hit by this weapon
+   \param loc ??
+*/
+void Player::hit (WorldEntity* weapon, Vector loc)
+{
+}
+
+/**
+   \brief action that happens when the player is destroyed.
+*/
+void Player::destroy ()
+{
+}
+
+/** 
+    \brief Collision with another Entity has this effect
+    \param other the other colider
+    \param ownhitflags ??
+    \param otherhitflags ??
+*/
+void Player::collide (WorldEntity* other, Uint32 ownhitflags, Uint32 otherhitflags)
+{
+}
+
+/**
+   \brief The connection to the command node
+   \param cmd the Command unit from witch to map
+
+   here the commands are mapped to the players movement/weaponary
+*/
+void Player::command (Command* cmd)
+{
+  //printf("Player|recieved command [%s]\n", cmd->cmd);
+  if( !strcmp( cmd->cmd, "up")) bUp = !cmd->bUp;
+  else if( !strcmp( cmd->cmd, "down")) bDown = !cmd->bUp;
+  else if( !strcmp( cmd->cmd, "left")) bLeft = !cmd->bUp;
+  else if( !strcmp( cmd->cmd, "right")) bRight = !cmd->bUp;
+  else if( !strcmp( cmd->cmd, "fire")) bFire = !cmd->bUp;
+}
+
+/**
+   \brief draws the player after transforming him.
+*/
+void Player::draw ()
+{ 
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
+  float matrix[4][4];
+  
+  /* translate */
+  glTranslatef (this->getAbsCoor ().x, 
+		this->getAbsCoor ().y, 
+		this->getAbsCoor ().z);
+  /* rotate */
+  this->getAbsDir ().matrix (matrix);
+  glMultMatrixf((float*)matrix);
+  
+  glMatrixMode(GL_MODELVIEW);
+  this->model->draw();
+  // glCallList(objectList);
+}
+
+
+/*PN
+  void Player::getLookat(Location* locbuf)
+  {
+  *locbuf = *getLocation();
+  //locbuf->dist += 5.0;
+  }
+*/
+
+/**
+   \brief the action occuring if the player left the game
+*/
+void Player::leftWorld ()
+{
+}
+
+/**
+   \brief action if player moves
+   \param time the timeslice since the last frame
+*/
+void Player::move (float time)
+{
+  Vector accel(0.0, 0.0, 0.0);
+  /* FIXME: calculating the direction and orthDirection every timeSlice is redundant! save it somewhere */
+  //Placement *pos = getPlacement();
+  
+  /* calculate the direction in which the craft is heading  */
+  Vector direction (1.0, 0.0, 0.0);
+  //direction = this->absDirection.apply (direction);
+  Vector orthDirection (0.0, 0.0, 1.0);
+  //orthDirection = orthDirection.cross (direction);
+
+  if( bUp) { accel = accel+(direction*acceleration); }
+  if( bDown) { accel = accel-(direction*acceleration); }
+  if( bLeft ) { accel = accel - (orthDirection*acceleration); }
+  if( bRight ) { accel = accel + (orthDirection*acceleration); }
+  if( bAscend ) { /* not yet implemented but just: (0,0,1)*acceleration */}
+  if( bDescend) {/* FIXME */} /* \todo up and down player movement */
+
+  //Location* l = getLocation();
+  
+  // r(t) = r(0) + v(0)*t + 1/2*a*t^2
+  // r = position
+  // v = velocity
+  // a = acceleration
+
+  /* this the base-speed of the player: determines how fast and how the player follows the track*/
+  //l->dist = l->dist + travelSpeed * time;
+  
+  Vector* shift = new Vector (this->travelSpeed * time, 0, 0);
+  this->shiftCoor (shift);
+  
+  /* this updates the player position on the track - user interaction */
+  //l->pos = l->pos + accel*time;
+  Vector move = accel * time;
+  this->shiftCoor (&move);
+}
Index: /orxonox/branches/trackManager/src/world_entities/player.h
===================================================================
--- /orxonox/branches/trackManager/src/world_entities/player.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/world_entities/player.h	(revision 3498)
@@ -0,0 +1,51 @@
+/*! 
+    \file player.h
+    \brief Implements a basic controllable WorldEntity
+*/
+
+#ifndef _PLAYER_H
+#define _PLAYER_H
+
+#include "world_entity.h"
+
+class OBJModel;
+
+//! Basic controllable WorldEntity
+class Player : public WorldEntity 
+{
+  friend class World;
+  
+ public:
+  Player(bool isFree = false);
+  ~Player();
+  
+  virtual void postSpawn();
+  virtual void tick(float time);
+  virtual void hit(WorldEntity* weapon, Vector loc);
+  virtual void destroy();
+  virtual void collide(WorldEntity* other, Uint32 ownhitflags, Uint32 otherhitflags);
+  virtual void command(Command* cmd);
+  
+  virtual void draw();
+  // virtual void getLookat(Location* locbuf);
+  
+  virtual void leftWorld();
+  
+ private:
+  bool bUp;              //!< up button pressed.
+  bool bDown;            //!< down button pressed.
+  bool bLeft;            //!< left button pressed.
+  bool bRight;           //!< right button pressed.
+  bool bAscend;          //!< ascend button pressed.
+  bool bDescend;         //!< descend button presses.
+  bool bFire;            //!< fire button pressed.
+
+  Vector velocity;       //!< the velocity of the player.
+  float travelSpeed;     //!< the current speed of the player (to make soft movement)
+  float acceleration;    //!< the acceleration of the player.
+  
+  void move(float time);
+  
+};
+
+#endif /* _PLAYER_H */
Index: /orxonox/branches/trackManager/src/world_entities/power_up.cc
===================================================================
--- /orxonox/branches/trackManager/src/world_entities/power_up.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/world_entities/power_up.cc	(revision 3498)
@@ -0,0 +1,32 @@
+
+
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: ...
+   co-programmer: ...
+*/
+
+
+#include "power_up.h"
+
+
+using namespace std;
+
+
+
+PowerUp::PowerUp () {}
+
+
+
+PowerUp::~PowerUp () {}
+
+
Index: /orxonox/branches/trackManager/src/world_entities/power_up.h
===================================================================
--- /orxonox/branches/trackManager/src/world_entities/power_up.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/world_entities/power_up.h	(revision 3498)
@@ -0,0 +1,21 @@
+/*! 
+    \file power_up.h
+    \brief A class representing a PowerUp in the world.
+*/ 
+
+#ifndef _POWER_UP_H
+#define _POWER_UP_H
+
+#include "data_tank.h"
+#include "ability.h"
+#include "world_entity.h"
+
+class PowerUp : Ability, WorldEntity { 
+
+ public:
+  PowerUp ();
+  ~PowerUp ();
+  
+};
+
+#endif /* _POWER_UP_H */
Index: /orxonox/branches/trackManager/src/world_entities/shoot_laser.cc
===================================================================
--- /orxonox/branches/trackManager/src/world_entities/shoot_laser.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/world_entities/shoot_laser.cc	(revision 3498)
@@ -0,0 +1,153 @@
+
+
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: Patrick Boenzli
+   co-programmer: 
+*/
+
+
+
+
+#include <GL/glut.h>
+#include <iostream>
+
+#include "stdincl.h"
+#include "data_tank.h"
+
+#include "shoot_laser.h"
+
+using namespace std;
+
+
+
+ShootLaser::ShootLaser () 
+{
+  lastShoot = null;
+  step = 1.0;
+  inhibitor = 0;
+}
+
+
+ShootLaser::~ShootLaser () {}
+
+
+void ShootLaser::drawShoot() 
+{
+
+  //cout << "ShootLaser::drawShoot" << endl;
+  /* now draw all the shoots (many) */
+  shoot* tmpShoot = lastShoot;
+  shoot* lastRef = null;
+  while( tmpShoot != null )
+    {
+      glPushMatrix(); 
+      glTranslatef(tmpShoot->xCor, tmpShoot->yCor, tmpShoot->zCor);
+      tmpShoot->xCor+=tmpShoot->xVel;
+      tmpShoot->yCor+=tmpShoot->yVel;
+      glScalef(0.1, 0.1, 0.1);
+      glutWireCube(1.0);
+      glPopMatrix();
+
+      /* garbage collection: look if shoot is outside world */
+      /* fix1: weak boundaries check all four sides */
+      /* fix2: conditions, that a struct tree can be cut off */
+      /* fix3: more efficent and nicer please */
+      if (tmpShoot->yCor - DataTank::yOffset > 20) 
+	{
+	  /* normal case: delete one element, link the others */
+	  if (lastRef != null) 
+	    {
+	      //cout << "garbage collection" << endl;
+	      lastRef->next = tmpShoot->next;
+	      delete tmpShoot;
+	      tmpShoot = lastRef->next;
+	      //cout << "garbage collection left" << endl;
+	    }
+	  else
+	    {
+	      /* special case: first element to be processed */
+	      //cout << "garbage collecton: first el in queue" << endl;
+	      lastRef = tmpShoot->next;
+	      delete tmpShoot;
+	      tmpShoot = lastRef;
+	      lastShoot = tmpShoot;
+	      if (tmpShoot != null) 
+		{
+		  tmpShoot = tmpShoot->next;
+		  //cout << "noch nich null" << endl;
+		}
+	      else 
+		{
+		  lastRef = null;
+		  tmpShoot = null;
+		  lastShoot = null;
+		  //cout << "endl null" << endl;
+		}
+	      
+	      //cout << "garbage collection: firtst el in queue left" << endl;
+	    }
+	}
+      else 
+	{
+	  lastRef = tmpShoot;
+	  tmpShoot = tmpShoot->next;
+	}
+    }
+  //cout << "ShootLaser::drawShoot - finished" << endl;
+}
+
+
+void ShootLaser::addShoot(shoot* sh) 
+{
+  sh->next = null;
+  lastShoot = sh;
+}
+
+void ShootLaser::addShoot(float x, float y, float z)
+{
+  //cout << "ShootLaser::addShoot" << endl;
+  shoot* sh = new shoot;
+  sh->xCor = x; sh->yCor = y; sh->zCor = z;
+  sh->xVel = 0; sh->yVel = .4/step; sh->zVel = 0;
+  sh->next = lastShoot;
+  lastShoot = sh;
+}
+
+void ShootLaser::addShootExt(float x, float y, float z, 
+			     float xVel, float yVel, float zVel)
+{
+  //cout << "ShootLaser::addShootExtended" << endl;
+  shoot* sh = new shoot;
+  sh->xCor = x; sh->yCor = y; sh->zCor = z;
+  sh->xVel = xVel/step; sh->yVel = yVel/step; sh->zVel = zVel/step;
+  sh->next = lastShoot;
+  lastShoot = sh;
+}
+
+void ShootLaser::setShootStep(float step) 
+{
+  cout << "ShootLaser::setShootStep to " << step << endl;
+  this->step = step;
+  cout << "ShootLaser::setShootStep end " << step << endl;
+}
+
+
+/* Exterminate shoot from game, implement this method  */
+/* if you like to add animatiion */
+void ShootLaser::removeShoot(shoot* sh)
+{
+  glPushMatrix(); 
+  glTranslatef(sh->xCor, sh->yCor, sh->zCor);
+  glutWireCube(1.0);
+  glPopMatrix();
+}
Index: /orxonox/branches/trackManager/src/world_entities/shoot_laser.h
===================================================================
--- /orxonox/branches/trackManager/src/world_entities/shoot_laser.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/world_entities/shoot_laser.h	(revision 3498)
@@ -0,0 +1,42 @@
+
+#ifndef _SHOOT_LASER_H
+#define _SHOOT_LASER_H
+
+
+class ShootLaser {
+
+ public:
+  
+  /* a list of all shoot-amental objects */
+  struct shoot {
+    shoot *next;
+    float xCor;
+    float yCor;
+    float zCor;    
+    float xVel;
+    float yVel;
+    float zVel;
+    float collisionRadius;
+  };
+  shoot* lastShoot;
+
+  ShootLaser ();
+  ~ShootLaser ();
+
+  int inhibitor;
+
+  void drawShoot(void);
+  void addShoot(shoot* sh);
+  void addShoot(float x, float y, float z);
+  void addShootExt(float x, float y, float z, float xVel, float yVel, float zVel);
+  void setShootStep(float step);
+  void removeShoot(shoot* sh);
+
+
+ private:
+
+  float step;
+
+};
+
+#endif /* _SHOOT_LASER_H */
Index: /orxonox/branches/trackManager/src/world_entities/shoot_rocket.cc
===================================================================
--- /orxonox/branches/trackManager/src/world_entities/shoot_rocket.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/world_entities/shoot_rocket.cc	(revision 3498)
@@ -0,0 +1,220 @@
+
+
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: Patrick Boenzli
+   co-programmer:  Benjamin Grauer
+*/
+
+
+#include <iostream>
+#include <math.h>
+#include <GL/glut.h>
+
+#include "stdincl.h"
+#include "data_tank.h"
+#include "npc.h"
+
+#include "shoot_rocket.h"
+
+using namespace std;
+
+
+
+ShootRocket::ShootRocket ()
+{
+  lastShoot = null;
+  step = 1.0;
+  inhibitor =0;
+  rotateAngle = 0.0;
+}
+
+
+ShootRocket::~ShootRocket () {}
+
+
+void ShootRocket::drawShoot() 
+{
+
+  //cout << "ShootRocket::drawShoot" << endl;
+  /* now draw all the shoots (many) */
+  shoot* tmpShoot = lastShoot;
+  shoot* lastRef = null;
+  while( tmpShoot != null )
+    {
+      glPushMatrix(); 
+      glTranslatef(tmpShoot->xCor, tmpShoot->yCor, tmpShoot->zCor);
+      tmpShoot->age+=step;
+      switch (tmpShoot->type)
+	{
+	case BACKPARABLE:
+	  tmpShoot->xCor+=tmpShoot->xVel;
+	  tmpShoot->yCor+=tmpShoot->yVel;
+	  tmpShoot->xVel+=tmpShoot->xAcc;
+	  tmpShoot->yVel+=tmpShoot->yAcc;
+	  break;
+	
+	case SIDEACC:
+	  if (tmpShoot->xVel >= .01 || tmpShoot->xVel <= -.01)
+	    {
+	      tmpShoot->xCor+=tmpShoot->xVel;
+	      tmpShoot->yCor+=tmpShoot->yVel;
+	      tmpShoot->xVel*=tmpShoot->xAcc;
+	    }
+	  else
+	    {
+	      tmpShoot->xCor+=tmpShoot->xVel;
+	      tmpShoot->yCor+=tmpShoot->yVel;
+	      tmpShoot->yVel+=tmpShoot->yVel*tmpShoot->yAcc;
+	    }
+	  break;
+	
+	case ROTATER:
+	  tmpShoot->xCor+=tmpShoot->xVel;
+	  tmpShoot->yCor+=tmpShoot->yVel;
+	  tmpShoot->zCor+=tmpShoot->zVel;
+	  break;
+	
+	}
+      
+      glScalef(0.1, 0.1, 0.1);
+      glutWireCube(1.0);
+      glPopMatrix();
+
+      /* garbage collection: look if shoot is outside world */
+      /* fix1: weak boundaries check all four sides */
+      /* fix2: conditions, that a struct tree can be cut off */
+      /* fix3: more efficent and nicer please */
+      if (tmpShoot->age > tmpShoot->lifetime) 
+	{
+	  /* normal case: delete one element, link the others */
+	  if (lastRef != null) 
+	    {
+	      //cout << "garbage collection" << endl;
+	      lastRef->next = tmpShoot->next;
+	      delete tmpShoot;
+	      tmpShoot = lastRef->next;
+	      //cout << "garbage collection left" << endl;
+	    }
+	  else
+	    {
+	      /* special case: first element to be processed */
+	      //cout << "garbage collecton: first el in queue" << endl;
+	      lastRef = tmpShoot->next;
+	      delete tmpShoot;
+	      tmpShoot = lastRef;
+	      lastShoot = tmpShoot;
+	      if (tmpShoot != null) 
+		{
+		  tmpShoot = tmpShoot->next;
+		  //cout << "noch nich null" << endl;
+		}
+	      else 
+		{
+		  lastRef = null;
+		  tmpShoot = null;
+		  lastShoot = null;
+		  //cout << "endl null" << endl;
+		}
+	      
+	      //cout << "garbage collection: firtst el in queue left" << endl;
+	    }
+	}
+      else 
+	{
+	  lastRef = tmpShoot;
+	  tmpShoot = tmpShoot->next;
+	}
+    }
+  //cout << "ShootRocket::drawShoot - finished" << endl;
+}
+
+
+void ShootRocket::addShoot(shoot* sh) 
+{
+  sh->next = null;
+  lastShoot = sh;
+}
+
+void ShootRocket::addBackParable(float x, float y, float z)
+{
+  
+  //cout << "ShootRocket::addShoot" << endl;
+  shoot* sh = new shoot;
+  sh->type = BACKPARABLE;
+  sh->xCor = x; sh->yCor = y; sh->zCor = z;
+  sh->xVel = (-1+(float)rand() / 1000000000/step)/5; 
+  sh->yVel = -.3;
+  sh->zVel = (1-(float)rand() / 1000000000/step)/5;
+  sh->xAcc = 0; sh->yAcc = .01/step; sh->zAcc = 0;
+  sh->age=0;
+  sh->lifetime=5; 
+  sh->next = lastShoot;
+  lastShoot = sh;
+  }
+void ShootRocket::addSideAcc(float x, float y, float z, enum RocketDirection direction)
+{
+  //cout << "ShootRocket::addShoot" << endl;
+  shoot* sh = new shoot;
+  sh->type = SIDEACC;
+  sh->xCor = x; sh->yCor = y; sh->zCor = z;
+  switch (direction)
+    {
+    case LEFT:
+      sh->xVel = -.5; sh->yVel = .05; sh->zVel = 0;
+      break;
+    case RIGHT:
+      sh->xVel = .5; sh->yVel = .05; sh->zVel = 0;
+      break;
+    }
+  sh->xAcc = .9; sh->yAcc = .02; sh->zAcc = 0;
+  sh->age=0;
+  sh->lifetime=10; 
+  sh->next = lastShoot;
+  lastShoot = sh;
+}
+
+void ShootRocket::addRotater(float x, float y, float z)
+{
+  
+  static float radius = 2;
+  rotateAngle+=.1;
+  //cout << "ShootRocket::addShoot" << endl;
+  shoot* sh = new shoot;
+  sh->type = ROTATER;
+  sh->xCor = x+radius*sin(rotateAngle); sh->yCor = y; sh->zCor = z+radius*cos(rotateAngle);
+  sh->xVel = 1*cos(rotateAngle)*step;
+  sh->yVel = 4*step;
+  sh->zVel = 1*sin(rotateAngle)*step;
+  sh->xAcc = 1.01; sh->yAcc = 1- step; sh->zAcc = 1.01;
+  sh->age=0;
+  sh->lifetime=10; 
+  sh->next = lastShoot;
+  lastShoot = sh;
+}
+
+void ShootRocket::setShootStep(float step) 
+{
+  cout << "ShootRocket::setShootStep to " << step << endl;
+  this->step = step;
+}
+
+
+/* Exterminate shoot from game, implement this method  */
+/* if you like to add animatiion */
+void ShootRocket::removeShoot(shoot* sh)
+{
+  glPushMatrix(); 
+  glTranslatef(sh->xCor, sh->yCor, sh->zCor);
+  glutWireCube(1.0);
+  glPopMatrix();
+}
Index: /orxonox/branches/trackManager/src/world_entities/shoot_rocket.h
===================================================================
--- /orxonox/branches/trackManager/src/world_entities/shoot_rocket.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/world_entities/shoot_rocket.h	(revision 3498)
@@ -0,0 +1,56 @@
+
+#ifndef _SHOOT_ROCKET_H
+#define _SHOOT_ROCKET_H
+
+
+
+enum RocketType { HOMING, SIDEACC, BACKPARABLE, ROTATER};
+enum RocketDirection {LEFT, RIGHT, UP, DOWN};
+
+
+class ShootRocket {
+
+ public:
+  
+  /* a list of all shoot-amental objects */
+  struct shoot {
+    enum RocketType type;
+    shoot *next;
+    float xCor;
+    float yCor;
+    float zCor;    
+    float xVel;
+    float yVel;
+    float zVel;
+    float xAcc;
+    float yAcc;
+    float zAcc;
+    float age;
+    float lifetime;
+    float collisionRadius;
+  };
+  shoot* lastShoot;
+  
+  ShootRocket ();
+  ~ShootRocket ();
+  
+  int inhibitor;
+  float rotateAngle;
+
+  void drawShoot(void);
+  void addShoot(shoot* sh);
+  void addBackParable(float x, float y, float z);
+  void addSideAcc(float x, float y, float z, enum RocketDirection direction);
+  void addRotater(float x, float y, float z);
+
+  void setShootStep(float step);
+  void removeShoot(shoot* sh);
+
+
+ private:
+
+  float step;
+
+};
+
+#endif /* _SHOOT_ROCKET_H */
Index: /orxonox/branches/trackManager/src/world_entities/skysphere.cc
===================================================================
--- /orxonox/branches/trackManager/src/world_entities/skysphere.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/world_entities/skysphere.cc	(revision 3498)
@@ -0,0 +1,131 @@
+
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: David Gruetter
+   co-programmer: Benjamin Grauer
+   
+   Created by Dave: this file is actually quite similar to player.cc and so is 
+   skybox.h similar to player.h
+   With that said, things should be clear:)
+   
+   Edited:
+   Bensch: more constructors, changeability, comments...
+   Patrick: giving it the common orxonox style, not much to do... good work Dave!
+
+*/
+
+#include "material.h"
+#include "skysphere.h"
+#include "stdincl.h"
+#include "vector.h"
+#include "world_entity.h"
+
+
+using namespace std;
+
+/**
+   \brief Standart Constructor
+*/
+Skysphere::Skysphere()
+{  
+  initialize("../data/pictures/sky-replace.jpg");
+}
+
+/**
+   \brief Constructs a SkySphere and takes fileName as a map.
+   \param fileName the file to take as input for the skysphere
+*/
+Skysphere::Skysphere(char* fileName)
+{
+  initialize(fileName);
+}
+
+/**
+   \brief default destructor
+*/
+Skysphere::~Skysphere()
+{
+  PRINTF(3)("Deleting the SkySphere\n");
+  delete skyMaterial;
+  free(sphereObj);
+}
+
+/**
+   \brief initializes the Skysphere.
+   \param fileName the file to take as input for the skysphere
+*/
+void Skysphere::initialize(char* fileName)
+{
+  PRINTF(1)("initializing the Skysphere with Material %s.\n", fileName);
+  this->sphereObj = gluNewQuadric();
+  gluQuadricTexture(this->sphereObj, GL_TRUE);
+  this->setRadius(250.0);
+
+  this->skyMaterial = new Material("Sky");
+  this->setTexture(fileName);
+  this->skyMaterial->setIllum(3);
+  this->skyMaterial->setAmbient(1.0, 1.0, 1.0);
+}
+
+
+/**
+   \brief sets the Radius of the Sphere.
+   \param radius The Radius of The Sphere
+*/
+void Skysphere::setRadius(float radius)
+{
+  this->sphereRadius = radius;
+}
+
+
+/**
+   \brief Defines which texture should be loaded onto the skysphere.
+   \param fileName The filename of the Texture
+*/
+void Skysphere::setTexture(char* fileName)
+{
+  this->skyMaterial->setDiffuseMap(fileName);
+}
+
+
+/**
+   \brief updates the position of the Skysphere
+   \param sphereCenter The coordinate of the Center of the Sphere
+   
+   This is normally done in the update-phase of world, so the Skysphere is always centered at the Camera.
+*/
+void Skysphere::updatePosition(Vector sphereCenter)
+{
+  this->sphereCenter = sphereCenter;
+}
+
+
+/**
+   \brief draws the Skysphere
+   
+   This part is normally precessed in the "Painting Phase".
+*/
+void Skysphere::draw()
+{
+  glEnable(GL_TEXTURE_2D);
+  skyMaterial->select();
+  glPushMatrix();
+  glTranslatef(this->sphereCenter.x,this->sphereCenter.y,this->sphereCenter.z);
+  
+  glRotatef(-30, 1, 0, 0);
+  glRotatef(95.0f, 0.0f, 0.0f, 1.0f);
+  glRotatef(-250.0f, 0.0, 1.0f, 0.0f);
+  
+  gluSphere(sphereObj, sphereRadius, 20, 20);
+  glPopMatrix();
+  glDisable(GL_TEXTURE_2D);
+}
Index: /orxonox/branches/trackManager/src/world_entities/skysphere.h
===================================================================
--- /orxonox/branches/trackManager/src/world_entities/skysphere.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/world_entities/skysphere.h	(revision 3498)
@@ -0,0 +1,50 @@
+/*! 
+    \file skysphere.h
+    \brief Definition of the Skysphere, that handles the Display of an atmosphere of orxonox.
+
+    A SkySphere is always centered at the current working Camera, and will only obey the cameras
+    movment but not its rotation.
+
+    \todo self-rotation
+    \todo handle reference to parent-object
+*/
+
+#ifndef _SKYSPHERE_H
+#define _SKYSPHERE_H
+
+/* INCLUDES */
+#include "p_node.h"
+
+/* FORWARD DEFINITION */
+class Material;
+class Vector;
+
+//! A Class to handle a SkySphere
+class Skysphere : public PNode 
+{
+
+ public:
+  Skysphere();
+  Skysphere(char* fileName);
+  ~Skysphere();
+
+  void setRadius(float radius);
+  void setTexture(char* fileName);
+
+  void updatePosition(Vector sphereCenter);
+  void draw();
+
+ private: 
+  GLUquadricObj *sphereObj; //!< A Placeholder for the SkySphere.
+  Material *skyMaterial;    //!< A Material for the SkySphere.
+  Vector sphereCenter;      //!< Center of the SkySphere.
+  float sphereRadius;       //!< Radius of the SkySphere. This should match the frustum maximum range.
+
+
+  void initialize(char* fileName);  
+};
+
+#endif  /* _SKYSPHERE_H */
+
+
+
Index: /orxonox/branches/trackManager/src/world_entities/world_entity.cc
===================================================================
--- /orxonox/branches/trackManager/src/world_entities/world_entity.cc	(revision 3498)
+++ /orxonox/branches/trackManager/src/world_entities/world_entity.cc	(revision 3498)
@@ -0,0 +1,208 @@
+
+
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: Patrick Boenzli
+   co-programmer: Christian Meyer
+*/
+
+#include <iostream>
+
+#include "world_entity.h"
+#include "stdincl.h"
+//#include "collision.h"
+
+using namespace std;
+
+/**
+   \brief standard constructor
+   
+   Every derived contructor HAS to call the previous one supplying the isFree parameter. This is necessary to distunguish
+   between free and bound entities. The difference between them is simply the fact that the movement of a free entity is
+   not bound to the track of a world. Use this to implement projectile or effect classes that do not have to travel along the track.
+   To specify an entity to be free or bound set the default parameter in the declaration of the constructor.
+   Theoretically you should never have to call the constructor of an Entity directly, for it is called by the spawn() function of the World
+   class. So if you want to create a new entity at any time, call World::spawn(). It will handle everything that is necessary.
+*/
+WorldEntity::WorldEntity (bool isFree) : bFree(isFree)
+{
+  this->setClassName ("WorldEntity");
+  this->bDraw = true;
+  //  collisioncluster = NULL;
+}
+
+/**
+   \brief standard destructor
+*/
+WorldEntity::~WorldEntity ()
+{
+  // if( collisioncluster != NULL) delete collisioncluster;
+}
+
+/**
+   \brief get the Location of the WorldEntity
+   \return a pointer to location
+*/
+/*PN
+Location* WorldEntity::getLocation ()
+{
+  return &loc;
+}
+*/
+
+/**
+   \brief get the Placement of the WorldEntity
+   \return a pointer to placement
+*/
+ /*PN
+Placement* WorldEntity::getPlacement ()
+{
+  return &place;
+}
+ */
+/**
+   \brief query whether the WorldEntity in question is free
+   \return true if the WorldEntity is free or false if it isn't
+*/
+bool WorldEntity::isFree ()
+{
+  return bFree;
+}
+
+/**
+   \brief set the WorldEntity's collision hull
+   \param newhull: a pointer to a completely assembled CollisionCluster
+   
+   Any previously assigned collision hull will be deleted on reassignment
+*/
+/*
+void WorldEntity::setCollision (CollisionCluster* newhull)
+{
+  if( newhull == NULL) return;
+  if( collisioncluster != NULL) delete collisioncluster;
+  collisioncluster = newhull;
+}
+*/
+
+/**
+   \brief this method is called every frame
+   \param time: the time in seconds that has passed since the last tick
+   
+   Handle all stuff that should update with time inside this method (movement, animation, etc.)
+*/
+void WorldEntity::tick(float time) 
+{
+}
+
+
+/** 
+    \brief process draw function 
+*/
+void WorldEntity::processDraw ()
+{
+  this->draw ();
+  PNode* pn = this->children->enumerate ();
+  while( pn != NULL) 
+    { 
+      ((WorldEntity*)pn)->processDraw ();
+      pn = this->children->nextElement();
+    } 
+}
+
+/**
+   \brief sets the drawable state of this entity.
+   \param bDraw TRUE if draweable, FALSE otherwise
+*/
+void WorldEntity::setDrawable (bool bDraw)
+{
+  this->bDraw = bDraw;
+}
+
+
+/**
+   \brief the entity is drawn onto the screen with this function
+   
+   This is a central function of an entity: call it to let the entity painted to the screen. Just override this function with whatever you want to be drawn.
+*/
+void WorldEntity::draw() 
+{}
+
+/**
+   \brief this function is called, when two entities collide
+   \param other: the world entity with whom it collides
+   \param ownhitflags: flags to the CollisionCluster subsections that registered an impact
+   \param otherhitflags: flags to the CollisionCluster subsections of the other entity that registered an impact
+
+   Implement behaviour like damage application or other miscellaneous collision stuff in this function
+*/
+void WorldEntity::collide(WorldEntity* other, Uint32 ownhitflags, Uint32 otherhitflags) {}
+
+/**
+   \brief this function is called, when the ship is hit by a waepon
+   \param weapon: the laser/rocket/shoot that hits.
+   \param loc: place where it is hit
+
+   calculate the damage depending
+*/
+void WorldEntity::hit(WorldEntity* weapon, Vector loc) {}
+
+/**
+   \brief this function is called when the entity is to be destroied
+   
+   This can be called, if eg. something realy bad happens :)
+*/
+void WorldEntity::destroy() {}
+
+
+/**
+   \brief this is called immediately after the Entity has been constructed and initialized
+   
+   Put any initialisation code that requires knowledge of location (placement if the Entity is free) and owner of the entity here.
+   DO NOT place such code in the constructor, those variables are set AFTER the entity is constucted.
+*/
+void WorldEntity::postSpawn ()
+{
+}
+
+/**
+   \brief this handles incoming command messages
+   \param cmd: a pointer to the incoming Command structure
+   
+   Put all code that handles Command messages here, this will mainly be called by the assigned CommandNode but can also be used
+   to send commands from one WorldEntity to another.
+*/
+void WorldEntity::command (Command* cmd)
+{
+}
+
+/**
+   \brief this is called by the local Camera to determine the point it should look at on the WorldEntity
+   \param locbuf: a pointer to the buffer to fill with a location to look at
+	
+   You may put any Location you want into locbuf, the Camera will determine via the corresponding Track how
+   to look at the location you return with this.
+*/
+/*PN
+void WorldEntity::getLookat (Location* locbuf)
+{
+}
+*/
+
+/**
+   \brief this method is called by the world if the WorldEntity leaves valid gamespace
+   
+   For free entities this means it left the Track boundaries. With bound entities it means its Location adresses a
+   place that is not in the world anymore. In both cases you might have to take extreme measures (a.k.a. call destroy).
+*/
+void WorldEntity::leftWorld ()
+{
+}
Index: /orxonox/branches/trackManager/src/world_entities/world_entity.h
===================================================================
--- /orxonox/branches/trackManager/src/world_entities/world_entity.h	(revision 3498)
+++ /orxonox/branches/trackManager/src/world_entities/world_entity.h	(revision 3498)
@@ -0,0 +1,54 @@
+/*! 
+    \file world_entity.h
+    \brief Definition of the basic WorldEntity
+*/
+
+#ifndef _WORLD_ENTITY_H
+#define _WORLD_ENTITY_H
+
+#include "stdincl.h"
+#include "p_node.h"
+
+//class CollisionCluster;
+class OBJModel;
+
+//! Basic class from which all interactive stuff in the world is derived from
+class WorldEntity : public PNode
+{	
+  friend class World;
+
+ public:
+  WorldEntity (bool isFree = false);
+  virtual ~WorldEntity ();
+
+  OBJModel* model;                  //!< The model that should be loaded for this entity.
+  
+  //void setCollision (CollisionCluster* newhull);
+  
+  bool isFree ();
+  
+  //void addAbility(Ability* ability);
+  //void removeAbility(Ability* ability);
+  
+  virtual void postSpawn ();
+  virtual void tick (float time);
+  virtual void hit (WorldEntity* weapon, Vector loc);
+  virtual void destroy ();
+  virtual void collide (WorldEntity* other,  Uint32 ownhitflags, Uint32 otherhitflags);
+  virtual void command (Command* cmd);
+
+  void processDraw ();
+  virtual void draw ();
+  void setDrawable (bool bDraw);
+  
+  virtual void leftWorld ();
+  
+ private:
+  const bool bFree;	              //!< If the entity is free.
+  bool bCollide;                      //!< If it should be considered for the collisiontest.
+  bool bDraw;                         //!< If it should be visible.
+
+  //CollisionCluster* collisioncluster; //!< The collision-Cluster of this entity.
+};
+
+#endif /* _WORLD_ENTITY_H */
Index: xonox/branches/trackManager/src/world_entity.cc
===================================================================
--- /orxonox/branches/trackManager/src/world_entity.cc	(revision 3497)
+++ 	(revision )
@@ -1,204 +1,0 @@
-
-
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   ### File Specific:
-   main-programmer: Patrick Boenzli
-   co-programmer: Christian Meyer
-*/
-
-#include <iostream>
-
-#include "world_entity.h"
-#include "stdincl.h"
-#include "collision.h"
-
-using namespace std;
-
-/**
-   \brief standard constructor
-   
-   Every derived contructor HAS to call the previous one supplying the isFree parameter. This is necessary to distunguish
-   between free and bound entities. The difference between them is simply the fact that the movement of a free entity is
-   not bound to the track of a world. Use this to implement projectile or effect classes that do not have to travel along the track.
-   To specify an entity to be free or bound set the default parameter in the declaration of the constructor.
-   Theoretically you should never have to call the constructor of an Entity directly, for it is called by the spawn() function of the World
-   class. So if you want to create a new entity at any time, call World::spawn(). It will handle everything that is necessary.
-*/
-WorldEntity::WorldEntity (bool isFree) : bFree(isFree)
-{
-  this->setClassName ("WorldEntity");
-  this->bDraw = true;
-  collisioncluster = NULL;
-}
-
-/**
-   \brief standard destructor
-*/
-WorldEntity::~WorldEntity ()
-{
-  if( collisioncluster != NULL) delete collisioncluster;
-}
-
-/**
-   \brief get the Location of the WorldEntity
-   \return a pointer to location
-*/
-/*PN
-Location* WorldEntity::getLocation ()
-{
-  return &loc;
-}
-*/
-
-/**
-   \brief get the Placement of the WorldEntity
-   \return a pointer to placement
-*/
- /*PN
-Placement* WorldEntity::getPlacement ()
-{
-  return &place;
-}
- */
-/**
-   \brief query whether the WorldEntity in question is free
-   \return true if the WorldEntity is free or false if it isn't
-*/
-bool WorldEntity::isFree ()
-{
-  return bFree;
-}
-
-/**
-   \brief set the WorldEntity's collision hull
-   \param newhull: a pointer to a completely assembled CollisionCluster
-   
-   Any previously assigned collision hull will be deleted on reassignment
-*/
-void WorldEntity::setCollision (CollisionCluster* newhull)
-{
-  if( newhull == NULL) return;
-  if( collisioncluster != NULL) delete collisioncluster;
-  collisioncluster = newhull;
-}
-
-
-/**
-   \brief this method is called every frame
-   \param time: the time in seconds that has passed since the last tick
-   
-   Handle all stuff that should update with time inside this method (movement, animation, etc.)
-*/
-void WorldEntity::tick(float time) 
-{
-}
-
-
-/** 
-    \brief process draw function 
-*/
-void WorldEntity::processDraw ()
-{
-  this->draw ();
-  PNode* pn = this->children->enumerate ();
-  while( pn != NULL) 
-    { 
-      ((WorldEntity*)pn)->processDraw ();
-      pn = this->children->nextElement();
-    } 
-}
-
-
-void WorldEntity::setDrawable (bool bDraw)
-{
-  this->bDraw = bDraw;
-}
-
-
-/**
-   \brief the entity is drawn onto the screen with this function
-   
-   This is a central function of an entity: call it to let the entity painted to the screen. Just override this function with whatever you want to be drawn.
-*/
-void WorldEntity::draw() 
-{}
-
-/**
-   \brief this function is called, when two entities collide
-   \param other: the world entity with whom it collides
-   \param ownhitflags: flags to the CollisionCluster subsections that registered an impact
-   \param otherhitflags: flags to the CollisionCluster subsections of the other entity that registered an impact
-
-   Implement behaviour like damage application or other miscellaneous collision stuff in this function
-*/
-void WorldEntity::collide(WorldEntity* other, Uint32 ownhitflags, Uint32 otherhitflags) {}
-
-/**
-   \brief this function is called, when the ship is hit by a waepon
-   \param weapon: the laser/rocket/shoot that hits.
-   \param loc: place where it is hit
-
-   calculate the damage depending
-*/
-void WorldEntity::hit(WorldEntity* weapon, Vector loc) {}
-
-/**
-   \brief this function is called when the entity is to be destroied
-   
-   This can be called, if eg. something realy bad happens :)
-*/
-void WorldEntity::destroy() {}
-
-
-/**
-   \brief this is called immediately after the Entity has been constructed and initialized
-   
-   Put any initialisation code that requires knowledge of location (placement if the Entity is free) and owner of the entity here.
-   DO NOT place such code in the constructor, those variables are set AFTER the entity is constucted.
-*/
-void WorldEntity::postSpawn ()
-{
-}
-
-/**
-   \brief this handles incoming command messages
-   \param cmd: a pointer to the incoming Command structure
-   
-   Put all code that handles Command messages here, this will mainly be called by the assigned CommandNode but can also be used
-   to send commands from one WorldEntity to another.
-*/
-void WorldEntity::command (Command* cmd)
-{
-}
-
-/**
-   \brief this is called by the local Camera to determine the point it should look at on the WorldEntity
-   \param locbuf: a pointer to the buffer to fill with a location to look at
-	
-   You may put any Location you want into locbuf, the Camera will determine via the corresponding Track how
-   to look at the location you return with this.
-*/
-/*PN
-void WorldEntity::getLookat (Location* locbuf)
-{
-}
-*/
-
-/**
-   \brief this method is called by the world if the WorldEntity leaves valid gamespace
-   
-   For free entities this means it left the Track boundaries. With bound entities it means its Location adresses a
-   place that is not in the world anymore. In both cases you might have to take extreme measures (a.k.a. call destroy).
-*/
-void WorldEntity::leftWorld ()
-{
-}
Index: xonox/branches/trackManager/src/world_entity.h
===================================================================
--- /orxonox/branches/trackManager/src/world_entity.h	(revision 3497)
+++ 	(revision )
@@ -1,54 +1,0 @@
-/*! 
-    \file world_entity.h
-    \brief Definition of the basic WorldEntity
-*/
-
-#ifndef _WORLD_ENTITY_H
-#define _WORLD_ENTITY_H
-
-#include "stdincl.h"
-#include "p_node.h"
-
-class CollisionCluster;
-class OBJModel;
-
-//! Basic class from which all interactive stuff in the world is derived from
-class WorldEntity : public PNode
-{	
-  friend class World;
-
- public:
-  WorldEntity (bool isFree = false);
-  virtual ~WorldEntity ();
-
-  OBJModel* model;
-  
-  void setCollision (CollisionCluster* newhull);
-  
-  bool isFree ();
-  
-  //void addAbility(Ability* ability);
-  //void removeAbility(Ability* ability);
-  
-  virtual void postSpawn ();
-  virtual void tick (float time);
-  virtual void hit (WorldEntity* weapon, Vector loc);
-  virtual void destroy ();
-  virtual void collide (WorldEntity* other,  Uint32 ownhitflags, Uint32 otherhitflags);
-  virtual void command (Command* cmd);
-
-  void processDraw ();
-  virtual void draw ();
-  void setDrawable (bool bDraw);
-  
-  virtual void leftWorld ();
-  
- private:
-  const bool bFree;	
-  bool bCollide;
-  bool bDraw;
-
-  CollisionCluster* collisioncluster;
-};
-
-#endif /* _WORLD_ENTITY_H */
