Index: /orxonox/branches/parenting/src/Makefile.am
===================================================================
--- /orxonox/branches/parenting/src/Makefile.am	(revision 3359)
+++ /orxonox/branches/parenting/src/Makefile.am	(revision 3360)
@@ -24,5 +24,5 @@
 		 story_entity.cc \
 		 environment.cc \
-		 importer/object.cc \
+		 importer/model.cc \
 		 importer/array.cc \
 		 importer/material.cc \
Index: /orxonox/branches/parenting/src/Makefile.in
===================================================================
--- /orxonox/branches/parenting/src/Makefile.in	(revision 3359)
+++ /orxonox/branches/parenting/src/Makefile.in	(revision 3360)
@@ -59,5 +59,5 @@
 	track.$(OBJEXT) base_entity.$(OBJEXT) game_loader.$(OBJEXT) \
 	campaign.$(OBJEXT) story_entity.$(OBJEXT) \
-	environment.$(OBJEXT) object.$(OBJEXT) array.$(OBJEXT) \
+	environment.$(OBJEXT) model.$(OBJEXT) array.$(OBJEXT) \
 	material.$(OBJEXT) texture.$(OBJEXT) list.$(OBJEXT) \
 	p_node.$(OBJEXT) null_parent.$(OBJEXT) base_object.$(OBJEXT) \
@@ -81,6 +81,6 @@
 @AMDEP_TRUE@	./$(DEPDIR)/ini_parser.Po ./$(DEPDIR)/keynames.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/list.Po ./$(DEPDIR)/material.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/matrix.Po ./$(DEPDIR)/null_parent.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/object.Po ./$(DEPDIR)/orxonox.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/matrix.Po ./$(DEPDIR)/model.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/null_parent.Po ./$(DEPDIR)/orxonox.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/p_node.Po ./$(DEPDIR)/player.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/story_entity.Po ./$(DEPDIR)/texture.Po \
@@ -222,5 +222,5 @@
 		 story_entity.cc \
 		 environment.cc \
-		 importer/object.cc \
+		 importer/model.cc \
 		 importer/array.cc \
 		 importer/material.cc \
@@ -299,7 +299,7 @@
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  src/Makefile'; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Makefile'; \
 	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  src/Makefile
+	  $(AUTOMAKE) --foreign  src/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@@ -370,6 +370,6 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/material.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matrix.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/model.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/null_parent.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/object.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orxonox.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/p_node.Po@am__quote@
@@ -399,19 +399,19 @@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
-object.o: importer/object.cc
-@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT object.o -MD -MP -MF "$(DEPDIR)/object.Tpo" -c -o object.o `test -f 'importer/object.cc' || echo '$(srcdir)/'`importer/object.cc; \
-@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/object.Tpo" "$(DEPDIR)/object.Po"; else rm -f "$(DEPDIR)/object.Tpo"; exit 1; fi
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='importer/object.cc' object='object.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/object.Po' tmpdepfile='$(DEPDIR)/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 object.o `test -f 'importer/object.cc' || echo '$(srcdir)/'`importer/object.cc
-
-object.obj: importer/object.cc
-@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT object.obj -MD -MP -MF "$(DEPDIR)/object.Tpo" -c -o object.obj `if test -f 'importer/object.cc'; then $(CYGPATH_W) 'importer/object.cc'; else $(CYGPATH_W) '$(srcdir)/importer/object.cc'; fi`; \
-@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/object.Tpo" "$(DEPDIR)/object.Po"; else rm -f "$(DEPDIR)/object.Tpo"; exit 1; fi
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='importer/object.cc' object='object.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/object.Po' tmpdepfile='$(DEPDIR)/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 object.obj `if test -f 'importer/object.cc'; then $(CYGPATH_W) 'importer/object.cc'; else $(CYGPATH_W) '$(srcdir)/importer/object.cc'; fi`
+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; \
+@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@	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_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@	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`
 
 array.o: importer/array.cc
Index: /orxonox/branches/parenting/src/environment.cc
===================================================================
--- /orxonox/branches/parenting/src/environment.cc	(revision 3359)
+++ /orxonox/branches/parenting/src/environment.cc	(revision 3360)
@@ -21,5 +21,5 @@
 #include "world_entity.h"
 #include "vector.h"
-#include "importer/object.h"
+#include "importer/model.h"
 
 using namespace std;
@@ -29,5 +29,5 @@
 Environment::Environment () : WorldEntity()
 {
-  this->model = new Object("reaplow.obj");
+  this->model = new Model("reaplow.obj");
 }
 
Index: /orxonox/branches/parenting/src/importer/Makefile.am
===================================================================
--- /orxonox/branches/parenting/src/importer/Makefile.am	(revision 3359)
+++ /orxonox/branches/parenting/src/importer/Makefile.am	(revision 3360)
@@ -8,5 +8,5 @@
 importer_SOURCES= framework.cc \
 	          windowHandler.cc \
-	  	  object.cc \
+	  	  model.cc \
 	  	  array.cc \
 	  	  material.cc \
@@ -16,5 +16,5 @@
 noinst_HEADERS= framework.h \
 	  	windowHandler.h \
-	  	object.h \
+	  	model.h \
 	  	array.h \
 		material.h \
Index: /orxonox/branches/parenting/src/importer/Makefile.in
===================================================================
--- /orxonox/branches/parenting/src/importer/Makefile.in	(revision 3359)
+++ /orxonox/branches/parenting/src/importer/Makefile.in	(revision 3360)
@@ -54,5 +54,5 @@
 PROGRAMS = $(bin_PROGRAMS)
 am_importer_OBJECTS = framework.$(OBJEXT) windowHandler.$(OBJEXT) \
-	object.$(OBJEXT) array.$(OBJEXT) material.$(OBJEXT) \
+	model.$(OBJEXT) array.$(OBJEXT) material.$(OBJEXT) \
 	texture.$(OBJEXT) vector.$(OBJEXT)
 importer_OBJECTS = $(am_importer_OBJECTS)
@@ -62,5 +62,5 @@
 am__depfiles_maybe = depfiles
 @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/array.Po ./$(DEPDIR)/framework.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/material.Po ./$(DEPDIR)/object.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/material.Po ./$(DEPDIR)/model.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/texture.Po ./$(DEPDIR)/vector.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/windowHandler.Po
@@ -177,5 +177,5 @@
 importer_SOURCES = framework.cc \
 	          windowHandler.cc \
-	  	  object.cc \
+	  	  model.cc \
 	  	  array.cc \
 	  	  material.cc \
@@ -185,5 +185,5 @@
 noinst_HEADERS = framework.h \
 	  	windowHandler.h \
-	  	object.h \
+	  	model.h \
 	  	array.h \
 		material.h \
@@ -259,5 +259,5 @@
 @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)/object.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/model.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@
Index: /orxonox/branches/parenting/src/importer/framework.cc
===================================================================
--- /orxonox/branches/parenting/src/importer/framework.cc	(revision 3359)
+++ /orxonox/branches/parenting/src/importer/framework.cc	(revision 3360)
@@ -71,9 +71,9 @@
   PRINTF(2)("screensize: %i, %i\n", wHandler.screen->w, wHandler.screen->h);
   if (argc>=3)
-    obj = new Object (argv[1], atof(argv[2]));
+    obj = new Model (argv[1], atof(argv[2]));
   else if (argc>=2)
-    obj = new Object(argv[1]);
+    obj = new Model(argv[1]);
   else 
-    obj = new Object();
+    obj = new Model();
   
   M = Vector(wHandler.screen->w/2, wHandler.screen->h/2, 0); 
@@ -215,5 +215,5 @@
 	  case SDLK_c:
 	    if (!obj)
-	      obj = new Object(argv[1]);
+	      obj = new Model(argv[1]);
 	    break;
 	  }
Index: /orxonox/branches/parenting/src/importer/framework.h
===================================================================
--- /orxonox/branches/parenting/src/importer/framework.h	(revision 3359)
+++ /orxonox/branches/parenting/src/importer/framework.h	(revision 3360)
@@ -3,5 +3,5 @@
  
 #include "windowHandler.h" // Include the Whandler Basecode
-#include "object.h"
+#include "model.h"
 #include "vector.h"
 
@@ -33,5 +33,5 @@
 
 WindowHandler wHandler;  // Create an instance of the whandler basecode class
-Object* obj;
+Model* obj;
 
 
Index: /orxonox/branches/parenting/src/importer/model.cc
===================================================================
--- /orxonox/branches/parenting/src/importer/model.cc	(revision 3360)
+++ /orxonox/branches/parenting/src/importer/model.cc	(revision 3360)
@@ -0,0 +1,976 @@
+/* 
+   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"
+int verbose = 1; //! \todo should be GLOBAL
+using namespace std;
+
+/**
+   \brief Creates a 3D-Model, but does not load any 3D-models.
+
+   This Constructor is pretty useless, because why load no model in an model-loader??
+*/
+Model::Model ()
+{
+
+  this->initialize();
+
+  this->BoxModel();
+
+  this->importToGL ();
+
+  this->cleanup();
+}
+
+/**
+   \brief Crates a 3D-Model and loads in a File.
+   \param fileName file to parse and load (must be a .obj file)
+*/
+Model::Model(char* fileName)
+{
+  this->initialize();
+
+  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.
+*/
+Model::Model(char* fileName, float scaling)
+{
+  this->initialize();
+  this->scaleFactor = scaling;
+
+  this->importFile (fileName);
+
+  this->importToGL ();
+
+  this->cleanup();
+}
+
+/**
+   \brief deletes an Model.
+
+   Looks if any from model allocated space is still in use, and if so deleted it.
+*/
+Model::~Model()
+{
+  PRINTF(2)("Deleting display Lists.\n");
+  Group* walker = this->firstGroup;
+  while (walker != NULL)
+    {
+      glDeleteLists (walker->listNumber, 1);
+      Group* delWalker = walker;
+      walker = walker->next;
+      delete delWalker;
+    }
+
+  if (this->objPath)
+    delete []this->objPath;
+  if (this->objFileName)
+    delete []this->objFileName;
+  if (this->mtlFileName)
+    delete []this->mtlFileName;
+  PRINTF(2)("Deleting Materials.\n");
+  if (this->material)
+    delete this->material;
+}
+
+
+/**
+   \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->objFileName);
+  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->objFileName);
+  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"); 
+
+  // setting the start group;
+  this->firstGroup = new Group;
+  this->currentGroup = this->firstGroup;
+  this->groupCount = 0;
+  
+  this->initGroup (this->currentGroup);
+  this->objPath = NULL;
+  this->objFileName = NULL;
+  this->mtlFileName = NULL;
+  this->scaleFactor = 1;
+  this->material = new Material();
+
+  this->vertices = new Array();
+  this->vTexture = new Array();
+  this->normals = new Array();
+
+  return true;
+}
+
+/**
+   \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 Imports a obj file and handles the the relative location
+   \param fileName The file to import
+*/
+bool Model::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];
+  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);
+  
+  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 Model::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 Box Model instead.\n", fileName);
+      BoxModel();
+      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->readVertex(Buffer+2);
+	}
+
+      // case face
+      else if (!strncmp(Buffer, "f ", 2))
+	{
+	  this->readFace (Buffer+2);
+	}
+      
+      else if (!strncmp(Buffer, "mtllib ", 7))
+	{
+	  this->readMtlLib (Buffer+7);
+	}
+
+      else if (!strncmp(Buffer, "usemtl ", 7))
+	{
+	  this->readUseMtl (Buffer+7);
+	}
+
+      // case VertexNormal
+      else if (!strncmp(Buffer, "vn ", 3))
+	{
+	  this->readVertexNormal(Buffer+3);
+	}
+      
+      // case VertexTextureCoordinate
+      else if (!strncmp(Buffer, "vt ", 3))
+	{
+	  this->readVertexTexture(Buffer+3);
+	}
+      // case group
+      else if (!strncmp(Buffer, "g ", 2))
+	{
+	  this->readGroup (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 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::readGroup (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::readVertex (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 face-string
+   \param faceString The String that will be parsed.
+
+   If a face line is found this function will add it to the glList.
+   The function makes a difference between QUADS and TRIANGLES, and will if changed re-open, set and re-close the gl-processe.
+*/
+bool Model::readFace (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 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::readVertexNormal (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 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::readVertexTexture (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 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 Model::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;
+}
+
+/**
+   \brief Function that selects a material, if changed in the obj file.
+   \param matString the Material that will be set.
+*/
+bool Model::readUseMtl (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 uilt 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;
+	      PRINTF(2)("using material %s for coming Faces.\n", tmpFace->materialString);
+	      Material* tmpMat;
+	      if ((tmpMat = material->search(tmpFace->materialString)) != NULL)
+		tmpMat->select();
+
+	    }
+
+	  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::BoxModel(void)
+{
+  this->readVertex ("-0.5 -0.5 0.5");
+  this->readVertex ("0.5 -0.5 0.5");
+  this->readVertex ("-0.5 0.5 0.5");
+  this->readVertex ("0.5 0.5 0.5");
+  this->readVertex ("-0.5 0.5 -0.5");
+  this->readVertex ("0.5 0.5 -0.5");
+  this->readVertex ("-0.5 -0.5 -0.5");
+  this->readVertex ("0.5 -0.5 -0.5");
+
+  this->readVertexTexture ("0.0 0.0");
+  this->readVertexTexture ("1.0 0.0");
+  this->readVertexTexture ("0.0 1.0");
+  this->readVertexTexture ("1.0 1.0");
+  this->readVertexTexture ("0.0 2.0");
+  this->readVertexTexture ("1.0 2.0");
+  this->readVertexTexture ("0.0 3.0");
+  this->readVertexTexture ("1.0 3.0");
+  this->readVertexTexture ("0.0 4.0");
+  this->readVertexTexture ("1.0 4.0");
+  this->readVertexTexture ("2.0 0.0");
+  this->readVertexTexture ("2.0 1.0");
+  this->readVertexTexture ("-1.0 0.0");
+  this->readVertexTexture ("-1.0 1.0");
+
+  this->readVertexNormal ("0.0 0.0 1.0");
+  this->readVertexNormal ("0.0 0.0 1.0");
+  this->readVertexNormal ("0.0 0.0 1.0");
+  this->readVertexNormal ("0.0 0.0 1.0");
+  this->readVertexNormal ("0.0 1.0 0.0");
+  this->readVertexNormal ("0.0 1.0 0.0");
+  this->readVertexNormal ("0.0 1.0 0.0");
+  this->readVertexNormal ("0.0 1.0 0.0");
+  this->readVertexNormal ("0.0 0.0 -1.0");
+  this->readVertexNormal ("0.0 0.0 -1.0");
+  this->readVertexNormal ("0.0 0.0 -1.0");
+  this->readVertexNormal ("0.0 0.0 -1.0");
+  this->readVertexNormal ("0.0 -1.0 0.0");
+  this->readVertexNormal ("0.0 -1.0 0.0");
+  this->readVertexNormal ("0.0 -1.0 0.0");
+  this->readVertexNormal ("0.0 -1.0 0.0");
+  this->readVertexNormal ("1.0 0.0 0.0");
+  this->readVertexNormal ("1.0 0.0 0.0");
+  this->readVertexNormal ("1.0 0.0 0.0");
+  this->readVertexNormal ("1.0 0.0 0.0");
+  this->readVertexNormal ("-1.0 0.0 0.0");
+  this->readVertexNormal ("-1.0 0.0 0.0");
+  this->readVertexNormal ("-1.0 0.0 0.0");
+  this->readVertexNormal ("-1.0 0.0 0.0");
+
+  /* normaleLess-testingMode
+  this->readFace ("1 2 4 3");
+  this->readFace ("3 4 6 5");
+  this->readFace ("5 6 8 7");
+  this->readFace ("7 8 2 1");
+  this->readFace ("2 8 6 4");
+  this->readFace ("7 1 3 5");
+  */
+
+  this->readFace ("1/1/1 2/2/2 4/4/3 3/3/4");
+  this->readFace ("3/3/5 4/4/6 6/6/7 5/5/8");
+  this->readFace ("5/5/9 6/6/10 8/8/11 7/7/12");
+  this->readFace ("7/7/13 8/8/14 2/10/15 1/9/16");
+  this->readFace ("2/2/17 8/11/18 6/12/19 4/4/20");
+  this->readFace ("7/13/21 1/1/22 3/3/23 5/14/24");
+
+}
Index: /orxonox/branches/parenting/src/importer/model.h
===================================================================
--- /orxonox/branches/parenting/src/importer/model.h	(revision 3360)
+++ /orxonox/branches/parenting/src/importer/model.h	(revision 3360)
@@ -0,0 +1,122 @@
+/*!
+  \file model.h
+  \brief Contains the Model Class that handles 3D-Models
+*/
+
+#ifndef _MODEL_H
+#define _MODEL_H
+
+#include "../stdincl.h"
+
+#include "array.h"
+#include "material.h"
+#include "vector.h"
+#include <fstream>
+
+using namespace std;
+
+
+
+//! Class that handles 3D-Models. it can also read them in and display them.
+class Model
+{
+ public:
+  Model ();
+  Model (char* fileName);
+  Model(char* fileName, float scaling);
+  ~Model ();
+  
+  void draw (void) const;
+  void draw (int groupNumber) const;
+  void draw (char* groupName) const;
+  int getGroupCount() const;
+
+ private:
+  //! 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.
+  /**
+     \todo take Material to a call for itself.
+
+     This can also be a Material-Change switch. 
+     That means if you want to change a Material inside of a group,
+     you can create an empty face and apply a material to it, and the Importer will cahnge Colors
+  */
+  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.
+
+    GLuint 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
+
+  char* objPath;        //!< The Path wher 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)
+
+  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);
+
+  ///// readin ///
+  bool importFile (char* fileName);
+  bool readFromObjFile (void);
+  
+  bool readGroup (char* groupString);
+  bool readVertex (char* vertexString);
+  bool readFace (char* faceString);
+  bool readVertexNormal (char* normalString);
+  bool readVertexTexture (char* vTextureString);
+  bool readMtlLib (char* matFile);
+  bool readUseMtl (char* mtlString);
+
+  bool importToGL (void);
+  bool addGLElement (FaceElement* elem);
+
+  bool buildVertexNormals ();
+
+  void BoxModel (void);
+};
+
+#endif
Index: xonox/branches/parenting/src/importer/object.cc
===================================================================
--- /orxonox/branches/parenting/src/importer/object.cc	(revision 3359)
+++ 	(revision )
@@ -1,976 +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: ...
-*/
-
-#include "object.h"
-int verbose = 1; //! \todo should be GLOBAL
-using namespace std;
-
-/**
-   \brief Creates a 3D-Object, but does not load any 3D-models.
-
-   This Constructor is pretty useless, because why load no object in an object-loader??
-*/
-Object::Object ()
-{
-
-  this->initialize();
-
-  this->BoxObject();
-
-  this->importToGL ();
-
-  this->cleanup();
-}
-
-/**
-   \brief Crates a 3D-Object and loads in a File.
-   \param fileName file to parse and load (must be a .obj file)
-*/
-Object::Object(char* fileName)
-{
-  this->initialize();
-
-  this->importFile (fileName);
-
-  this->importToGL ();
-
-  this->cleanup();
-}
-
-/**
-   \brief Crates a 3D-Object, 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 object will be scaled with.
-*/
-Object::Object(char* fileName, float scaling)
-{
-  this->initialize();
-  this->scaleFactor = scaling;
-
-  this->importFile (fileName);
-
-  this->importToGL ();
-
-  this->cleanup();
-}
-
-/**
-   \brief deletes an Object.
-
-   Looks if any from object allocated space is still in use, and if so deleted it.
-*/
-Object::~Object()
-{
-  PRINTF(2)("Deleting display Lists.\n");
-  Group* walker = this->firstGroup;
-  while (walker != NULL)
-    {
-      glDeleteLists (walker->listNumber, 1);
-      Group* delWalker = walker;
-      walker = walker->next;
-      delete delWalker;
-    }
-
-  if (this->objPath)
-    delete []this->objPath;
-  if (this->objFileName)
-    delete []this->objFileName;
-  if (this->mtlFileName)
-    delete []this->mtlFileName;
-  PRINTF(2)("Deleting Materials.\n");
-  if (this->material)
-    delete this->material;
-}
-
-
-/**
-   \brief Draws the Objects of all Groups.
-   It does this by just calling the Lists that must have been created earlier.
-*/
-void Object::draw (void) const
-{
-  PRINTF(2)("drawing the 3D-Objects\n"); 
-  Group* walker = this->firstGroup;
-  while (walker != NULL)
-    {
-      PRINTF(3)("Drawing object %s\n", walker->name);
-      glCallList (walker->listNumber);
-      walker = walker->next;
-    }
-}
-
-/**
-   \brief Draws the Object 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 Object::draw (int groupNumber) const 
-{
-  if (groupNumber >= this->groupCount)
-    {
-      PRINTF(1)("You requested object number %i, but this File only contains of %i Objects.\n", groupNumber-1, this->groupCount);
-      return;
-    }
-  PRINTF(2)("drawing the requested 3D-Objects if found.\n"); 
-  Group* walker = this->firstGroup;
-  int counter = 0;
-  while (walker != NULL)
-    {
-      if (counter == groupNumber)
-	{
-	  PRINTF(2)("Drawing object number %i named %s\n", counter, walker->name);
-	  glCallList (walker->listNumber);
-	  return;
-	}
-      ++counter;
-      walker = walker->next;
-    }
-  PRINTF(1)("Object number %i in %s not Found.\n", groupNumber, this->objFileName);
-  return;
-
-}
-
-/**
-   \brief Draws the Object 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 Object::draw (char* groupName) const
-{
-  PRINTF(2)("drawing the requested 3D-Objects if found.\n"); 
-  Group* walker = this->firstGroup;
-  while (walker != NULL)
-    {
-      if (!strcmp(walker->name, groupName))
-	{
-	  PRINTF(2)("Drawing object %s\n", walker->name);
-	  glCallList (walker->listNumber);
-	  return;
-	}
-      walker = walker->next;
-    }
-  PRINTF(1)("Object Named %s in %s not Found.\n", groupName, this->objFileName);
-  return;
-}
-
-/**
-   \returns Count of the Objects in this File
-*/
-int Object::getGroupCount (void) const
-{
-  return this->groupCount;
-}
-
-/**
-    \brief initializes the Object.
-
-    This Function initializes all the needed arrays, Lists and clientStates.
-    It also defines default values.
-*/
-bool Object::initialize (void)
-{
-  PRINTF(2)("new 3D-Object is being created\n"); 
-
-  // setting the start group;
-  this->firstGroup = new Group;
-  this->currentGroup = this->firstGroup;
-  this->groupCount = 0;
-  
-  this->initGroup (this->currentGroup);
-  this->objPath = NULL;
-  this->objFileName = NULL;
-  this->mtlFileName = NULL;
-  this->scaleFactor = 1;
-  this->material = new Material();
-
-  this->vertices = new Array();
-  this->vTexture = new Array();
-  this->normals = new Array();
-
-  return true;
-}
-
-/**
-   \brief initializes a new Group object
-   \param group the group that should be initialized.
-   \todo Maybe Group should be a Class, because it does a lot of stuff
-   
-*/
-bool Object::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 Object::initFace (Face* face)
-{
-  face->vertexCount = 0;
-
-  face->firstElem = NULL;
-  
-  face->materialString = NULL;
-  
-  face->next = NULL;
-
-  return true;
-}
-
-/**
-   \brief finalizes an Object.
-   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 Object::cleanup(void)
-{
-  PRINTF(3)("cleaning up the 3D-Object 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 Object::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 Object::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 Object::cleanupFaceElement(FaceElement* faceElem)
-{
-  if (faceElem->next != NULL)
-    {
-      this->cleanupFaceElement (faceElem->next);
-      delete faceElem->next;
-    }
-}
-
-/**
-   \brief Imports a obj file and handles the the relative location
-   \param fileName The file to import
-*/
-bool Object::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];
-  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);
-  
-  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 Object::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 Box Object instead.\n", fileName);
-      BoxObject();
-      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->readVertex(Buffer+2);
-	}
-
-      // case face
-      else if (!strncmp(Buffer, "f ", 2))
-	{
-	  this->readFace (Buffer+2);
-	}
-      
-      else if (!strncmp(Buffer, "mtllib ", 7))
-	{
-	  this->readMtlLib (Buffer+7);
-	}
-
-      else if (!strncmp(Buffer, "usemtl ", 7))
-	{
-	  this->readUseMtl (Buffer+7);
-	}
-
-      // case VertexNormal
-      else if (!strncmp(Buffer, "vn ", 3))
-	{
-	  this->readVertexNormal(Buffer+3);
-	}
-      
-      // case VertexTextureCoordinate
-      else if (!strncmp(Buffer, "vt ", 3))
-	{
-	  this->readVertexTexture(Buffer+3);
-	}
-      // case group
-      else if (!strncmp(Buffer, "g ", 2))
-	{
-	  this->readGroup (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 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 Objects inside. 
-*/
-bool Object::readGroup (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 Object::readVertex (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 face-string
-   \param faceString The String that will be parsed.
-
-   If a face line is found this function will add it to the glList.
-   The function makes a difference between QUADS and TRIANGLES, and will if changed re-open, set and re-close the gl-processe.
-*/
-bool Object::readFace (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 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 Object::readVertexNormal (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 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 Object::readVertexTexture (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 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 Object::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;
-}
-
-/**
-   \brief Function that selects a material, if changed in the obj file.
-   \param matString the Material that will be set.
-*/
-bool Object::readUseMtl (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 Object::importToGL (void)
-{
-
-  // finalize the Arrays
-  this->vertices->finalizeArray();
-  this->vTexture->finalizeArray();
-  if (normals->getCount() == 0) // vertices-Array must be uilt 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 Object\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;
-	      PRINTF(2)("using material %s for coming Faces.\n", tmpFace->materialString);
-	      Material* tmpMat;
-	      if ((tmpMat = material->search(tmpFace->materialString)) != NULL)
-		tmpMat->select();
-
-	    }
-
-	  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 Object::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 Object::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 object
-
-   This will inject a Cube, because this is the most basic object.
-*/
-void Object::BoxObject(void)
-{
-  this->readVertex ("-0.5 -0.5 0.5");
-  this->readVertex ("0.5 -0.5 0.5");
-  this->readVertex ("-0.5 0.5 0.5");
-  this->readVertex ("0.5 0.5 0.5");
-  this->readVertex ("-0.5 0.5 -0.5");
-  this->readVertex ("0.5 0.5 -0.5");
-  this->readVertex ("-0.5 -0.5 -0.5");
-  this->readVertex ("0.5 -0.5 -0.5");
-
-  this->readVertexTexture ("0.0 0.0");
-  this->readVertexTexture ("1.0 0.0");
-  this->readVertexTexture ("0.0 1.0");
-  this->readVertexTexture ("1.0 1.0");
-  this->readVertexTexture ("0.0 2.0");
-  this->readVertexTexture ("1.0 2.0");
-  this->readVertexTexture ("0.0 3.0");
-  this->readVertexTexture ("1.0 3.0");
-  this->readVertexTexture ("0.0 4.0");
-  this->readVertexTexture ("1.0 4.0");
-  this->readVertexTexture ("2.0 0.0");
-  this->readVertexTexture ("2.0 1.0");
-  this->readVertexTexture ("-1.0 0.0");
-  this->readVertexTexture ("-1.0 1.0");
-
-  this->readVertexNormal ("0.0 0.0 1.0");
-  this->readVertexNormal ("0.0 0.0 1.0");
-  this->readVertexNormal ("0.0 0.0 1.0");
-  this->readVertexNormal ("0.0 0.0 1.0");
-  this->readVertexNormal ("0.0 1.0 0.0");
-  this->readVertexNormal ("0.0 1.0 0.0");
-  this->readVertexNormal ("0.0 1.0 0.0");
-  this->readVertexNormal ("0.0 1.0 0.0");
-  this->readVertexNormal ("0.0 0.0 -1.0");
-  this->readVertexNormal ("0.0 0.0 -1.0");
-  this->readVertexNormal ("0.0 0.0 -1.0");
-  this->readVertexNormal ("0.0 0.0 -1.0");
-  this->readVertexNormal ("0.0 -1.0 0.0");
-  this->readVertexNormal ("0.0 -1.0 0.0");
-  this->readVertexNormal ("0.0 -1.0 0.0");
-  this->readVertexNormal ("0.0 -1.0 0.0");
-  this->readVertexNormal ("1.0 0.0 0.0");
-  this->readVertexNormal ("1.0 0.0 0.0");
-  this->readVertexNormal ("1.0 0.0 0.0");
-  this->readVertexNormal ("1.0 0.0 0.0");
-  this->readVertexNormal ("-1.0 0.0 0.0");
-  this->readVertexNormal ("-1.0 0.0 0.0");
-  this->readVertexNormal ("-1.0 0.0 0.0");
-  this->readVertexNormal ("-1.0 0.0 0.0");
-
-  /* normaleLess-testingMode
-  this->readFace ("1 2 4 3");
-  this->readFace ("3 4 6 5");
-  this->readFace ("5 6 8 7");
-  this->readFace ("7 8 2 1");
-  this->readFace ("2 8 6 4");
-  this->readFace ("7 1 3 5");
-  */
-
-  this->readFace ("1/1/1 2/2/2 4/4/3 3/3/4");
-  this->readFace ("3/3/5 4/4/6 6/6/7 5/5/8");
-  this->readFace ("5/5/9 6/6/10 8/8/11 7/7/12");
-  this->readFace ("7/7/13 8/8/14 2/10/15 1/9/16");
-  this->readFace ("2/2/17 8/11/18 6/12/19 4/4/20");
-  this->readFace ("7/13/21 1/1/22 3/3/23 5/14/24");
-
-}
Index: xonox/branches/parenting/src/importer/object.h
===================================================================
--- /orxonox/branches/parenting/src/importer/object.h	(revision 3359)
+++ 	(revision )
@@ -1,122 +1,0 @@
-/*!
-  \file object.h
-  \brief Contains the Object Class that handles 3D-Objects
-*/
-
-#ifndef _OBJECT_H
-#define _OBJECT_H
-
-#include "../stdincl.h"
-
-#include "array.h"
-#include "material.h"
-#include "vector.h"
-#include <fstream>
-
-using namespace std;
-
-
-
-//! Class that handles 3D-Objects. it can also read them in and display them.
-class Object
-{
- public:
-  Object ();
-  Object (char* fileName);
-  Object(char* fileName, float scaling);
-  ~Object ();
-  
-  void draw (void) const;
-  void draw (int groupNumber) const;
-  void draw (char* groupName) const;
-  int getGroupCount() const;
-
- private:
-  //! 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.
-  /**
-     \todo take Material to a call for itself.
-
-     This can also be a Material-Change switch. 
-     That means if you want to change a Material inside of a group,
-     you can create an empty face and apply a material to it, and the Importer will cahnge Colors
-  */
-  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 Objects 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.
-
-    GLuint 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 Object hould be scaled. \todo maybe one wants to scale the Object after Initialisation
-
-  char* objPath;        //!< The Path wher 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)
-
-  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);
-
-  ///// readin ///
-  bool importFile (char* fileName);
-  bool readFromObjFile (void);
-  
-  bool readGroup (char* groupString);
-  bool readVertex (char* vertexString);
-  bool readFace (char* faceString);
-  bool readVertexNormal (char* normalString);
-  bool readVertexTexture (char* vTextureString);
-  bool readMtlLib (char* matFile);
-  bool readUseMtl (char* mtlString);
-
-  bool importToGL (void);
-  bool addGLElement (FaceElement* elem);
-
-  bool buildVertexNormals ();
-
-  void BoxObject (void);
-};
-
-#endif
Index: /orxonox/branches/parenting/src/player.cc
===================================================================
--- /orxonox/branches/parenting/src/player.cc	(revision 3359)
+++ /orxonox/branches/parenting/src/player.cc	(revision 3360)
@@ -19,5 +19,5 @@
 #include "stdincl.h"
 #include "collision.h"
-#include "importer/object.h"
+#include "importer/model.h"
 
 using namespace std;
@@ -27,5 +27,5 @@
 {
 
-  this->model = new Object("reaplow.obj");
+  this->model = new Model("reaplow.obj");
   /*
   objectList = glGenLists(1);
Index: /orxonox/branches/parenting/src/player.h
===================================================================
--- /orxonox/branches/parenting/src/player.h	(revision 3359)
+++ /orxonox/branches/parenting/src/player.h	(revision 3360)
@@ -9,5 +9,5 @@
 #include "world_entity.h"
 
-class Object;
+class Model;
 
 //! Basic controllable WorldEntity
Index: /orxonox/branches/parenting/src/world.cc
===================================================================
--- /orxonox/branches/parenting/src/world.cc	(revision 3359)
+++ /orxonox/branches/parenting/src/world.cc	(revision 3360)
@@ -190,6 +190,6 @@
       trackManager->addPoint(Vector(150,0,-10));
       trackManager->setDuration(.5);
-      int fork11, fork12, fork13;
-      trackManager->fork(3, &fork11, &fork12, &fork13);
+      int fork11, fork12, fork13, fork14;
+      trackManager->fork(4, &fork11, &fork12, &fork13, &fork14);
       trackManager->workOn(fork11);
       trackManager->addPoint(Vector(170, 0, -15));
@@ -217,5 +217,13 @@
       trackManager->addPoint(Vector(200,-10,5));
       trackManager->addPoint(Vector(250,-10,5));
-      trackManager->join(3, fork21, fork22, fork13);
+      printf("fork14: %d\n", fork14);
+      trackManager->workOn(fork14);
+      trackManager->addPoint(Vector(200,15,0));
+      trackManager->addPoint(Vector(210,0,10));
+
+
+
+      trackManager->join(4, fork21, fork22, fork13, fork14);
+
       /*
       tmpCurve->addNode(Vector(10,0,-10));
Index: /orxonox/branches/parenting/src/world_entity.h
===================================================================
--- /orxonox/branches/parenting/src/world_entity.h	(revision 3359)
+++ /orxonox/branches/parenting/src/world_entity.h	(revision 3360)
@@ -11,5 +11,5 @@
 
 class CollisionCluster;
-class Object;
+class Model;
 
 //! Basic class from which all interactive stuff in the world is derived from
@@ -22,5 +22,5 @@
   virtual ~WorldEntity ();
 
-  Object* model;
+  Model* model;
   
   void setCollision (CollisionCluster* newhull);
