Index: orxonox/trunk/src/lib/graphics/graphics_engine.cc
===================================================================
--- orxonox/trunk/src/lib/graphics/graphics_engine.cc	(revision 4176)
+++ orxonox/trunk/src/lib/graphics/graphics_engine.cc	(revision 4245)
@@ -20,4 +20,5 @@
 
 #include "debug.h"
+#include "text_engine.h"
 
 using namespace std;
@@ -30,4 +31,7 @@
 GraphicsEngine::GraphicsEngine () 
 {
+  this->bDisplayFPS = false;
+  this->minFPS = 9999;
+  this->maxFPS = 0;
   this->setClassName ("GraphicsEngine");
 
@@ -278,4 +282,43 @@
       PRINT(4)(" |  %d x %d\n", this->videoModes[i]->w, this->videoModes[i]->h);
   }
-  
-}
+}
+
+
+void GraphicsEngine::tick(float dt)
+{
+	if( unlikely(this->bDisplayFPS))
+	{
+	  this->currentFPS = 1.0/dt;
+      if( unlikely(this->currentFPS > this->maxFPS)) this->maxFPS = this->currentFPS;
+	  if( unlikely(this->currentFPS < this->minFPS)) this->minFPS = this->currentFPS;
+	  
+	  char tmpChar1[20];
+	  sprintf(tmpChar1, "Current:  %4.0f", this->currentFPS);
+	  this->geTextCFPS->setText(tmpChar1);
+	  char tmpChar2[20];
+	  sprintf(tmpChar2, "Max:    %4.0f", this->maxFPS);
+	  this->geTextMaxFPS->setText(tmpChar2);
+	  char tmpChar3[20];
+	  sprintf(tmpChar3, "Min:    %4.0f", this->minFPS);
+	  this->geTextMinFPS->setText(tmpChar3);
+	}
+}
+  
+void GraphicsEngine::displayFPS(bool display)
+{
+	if( display)
+	{
+		this->geTextCFPS = TextEngine::getInstance()->createText("fonts/druid.ttf", 35, TEXT_DYNAMIC, 0, 255, 0);
+		this->geTextCFPS->setAlignment(TEXT_ALIGN_LEFT);
+		this->geTextCFPS->setPosition(5, 500);
+		this->geTextMaxFPS = TextEngine::getInstance()->createText("fonts/druid.ttf", 35, TEXT_DYNAMIC, 0, 255, 0);
+		this->geTextMaxFPS->setAlignment(TEXT_ALIGN_LEFT);
+		this->geTextMaxFPS->setPosition(5, 530);
+		this->geTextMinFPS = TextEngine::getInstance()->createText("fonts/druid.ttf", 35, TEXT_DYNAMIC, 0, 255, 0);
+		this->geTextMinFPS->setAlignment(TEXT_ALIGN_LEFT);
+		this->geTextMinFPS->setPosition(5, 560);	
+	}
+	this->bDisplayFPS = display;
+}
+
+  
Index: orxonox/trunk/src/lib/graphics/graphics_engine.h
===================================================================
--- orxonox/trunk/src/lib/graphics/graphics_engine.h	(revision 4176)
+++ orxonox/trunk/src/lib/graphics/graphics_engine.h	(revision 4245)
@@ -11,8 +11,8 @@
 
 #include "glincl.h"
-
 #include "base_object.h"
 
-// FORWARD DEFINITION \\
+
+class Text;
 
 
@@ -45,5 +45,7 @@
   static GLdouble projMat[16];
   static GLint viewPort[4];
-
+  
+  void tick(float dt);
+  void displayFPS(bool display);
 
 
@@ -59,4 +61,13 @@
   bool fullscreen;
   Uint32 videoFlags;
+  
+  bool bDisplayFPS;  //!< is true if the fps should be displayed
+  float currentFPS;  //!< the current frame rate: frames per seconds
+  float maxFPS;      //!< maximal frame rate we ever got since start of the game
+  float minFPS;      //!< minimal frame rate we ever got since start
+
+  Text* geTextCFPS;
+  Text* geTextMaxFPS;
+  Text* geTextMinFPS;
 
   SDL_Rect **videoModes;
Index: orxonox/trunk/src/lib/graphics/importer/abstract_model.h
===================================================================
--- orxonox/trunk/src/lib/graphics/importer/abstract_model.h	(revision 4245)
+++ orxonox/trunk/src/lib/graphics/importer/abstract_model.h	(revision 4245)
@@ -0,0 +1,255 @@
+/* 
+   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: 
+*/
+
+/*! 
+    \file abstract_model.h
+    \brief Definition of an abstract model. containing all needed for other model
+*/
+
+#ifndef _ABSTRACT_MODEL_H
+#define _ABSTRACT_MODEL_H
+
+#include "stdincl.h"
+#include "base_object.h"
+#include <vector>
+#include <math.h>
+#include <SDL_image.h>
+
+using namespace std;
+
+
+
+//! this is a small and performant 3D vector
+typedef float sVec3D[3];
+
+//! small and performant 2D vector
+typedef float sVec2D[2];
+
+//! compressed vertex data: char insetead of float, the value will be expanded by the scale value. only for loading
+typedef struct
+{
+  byte v[3];
+  unsigned char lightNormalIndex;
+} sVertex;
+
+//! compressed texture offset data: coords scaled by the texture size. Only for loading
+typedef struct
+{
+  short s,t;
+} sTexCoor;
+
+
+//! holds tha informations about a md2 frame
+typedef struct
+{
+  sVec3D scale;                        //!< scales values of the model
+  sVec3D translate;                    //!< translates the model
+  char name[16];                       //!< frame name: something like "run32"
+  sVertex pVertices[1];                //!< first vertex of thes frame
+} sFrame;
+
+
+//! holds the information about a triangle
+typedef struct
+{
+  short indexToVertices[3];             //!< index to the verteces of the triangle
+  short indexToTexCoor[3];              //!< index to the texture coordinates
+} sTriangle;
+
+
+typedef struct
+{
+   float s, t;
+   int vertexIndex;
+} glCommandVertex;
+
+
+//! a md2 animation definition
+typedef struct
+{
+  int firstFrame;                       //!< first frame of the animation
+  int lastFrame;                        //!< last frame of the animation
+  int fps;                              //!< speed: number of frames per second
+} sAnim;
+
+//! animation state definition
+typedef struct
+{
+  int startFrame;
+  int endFrame;
+  int fps;
+
+  float localTime;
+  float lastTime;
+  float interpolationState;            //!< the state of the animation [0..1]
+  
+  int type;                            //!< animation type
+
+  int currentFrame;
+  int nextFrame;
+} sAnimState;
+
+
+//! This is our 3D point class.  CONFLICTING with Vector.cc
+class CVector3 
+{
+ public:
+  float x, y, z;
+};
+
+//! This is our 2D point class.  CONFLICTING with Vector.cc
+class CVector2 
+{
+ public:
+  float x, y;
+};
+
+// CONFLICTING with model.h
+struct tFace
+{
+  int vertIndex[3];			// indicies for the verts that make up this triangle
+  int coordIndex[3];			// indicies for the tex coords to texture this face
+};
+
+// CONFLICTING with material.cc, there are some small differences, i will use this struct and switch over later
+struct tMaterialInfo
+{
+  char  strName[255];			// The texture name
+  char  strFile[255];			// The texture file name (If this is set it's a texture map)
+  byte  color[3];	// The color of the object (R, G, B)
+  int   texureId;				// the texture ID
+  float uTile;				// u tiling of texture  
+  float vTile;				// v tiling of texture	
+  float uOffset;			        // u offset of texture
+  float vOffset;				// v offset of texture
+} ;
+
+//! properties of a 3D object
+struct t3DObject 
+{
+  int  numOfVerts;			// The number of verts in the model
+  int  numOfFaces;			// The number of faces in the model
+  int  numTexVertex;			// The number of texture coordinates
+  int  materialID;			// The texture ID to use, which is the index into our texture array
+  bool bHasTexture;			// This is TRUE if there is a texture map for this object
+  char strName[255];			// The name of the object
+  CVector3  *pVerts;			// The object's vertices
+  CVector3  *pNormals;	         	// The object's normals
+  CVector2  *pTexVerts;	            	// The texture's UV coordinates
+  tFace *pFaces;				// The faces information of the object
+};
+
+// CONFLICTING with animation.cc
+struct tAnimationInfo
+{
+  char strName[255];			// This stores the name of the animation (Jump, Pain, etc..)
+  int startFrame;				// This stores the first frame number for this animation
+  int endFrame;				// This stores the last frame number for this animation
+};
+
+// CONFLICTING with animation.cc and vector.cc
+struct t3DModel 
+{
+  int numOfObjects;					// The number of objects in the model
+  int numOfMaterials;					// The number of materials for the model
+  int numOfAnimations;				// The number of animations in this model (NEW)
+  int currentAnim;					// The current index into pAnimations list (NEW)
+  int currentFrame;					// The current frame of the current animation (NEW)
+  vector<tAnimationInfo> animationList; // The list of animations (NEW)
+  vector<tMaterialInfo> materialList;	// The list of material information (Textures and colors)
+  vector<t3DObject> objectList;			// The object list for our model
+};
+
+
+
+//! This class defines the basic components of a model
+class AbstractModel : public BaseObject {
+
+ public:
+  AbstractModel() {}
+  virtual ~AbstractModel() {}
+};
+
+
+/* TESTING TESTING TESTING */
+/* some mathematical functions that are already implemented by vector.cc class */
+
+// magnitude of a normal
+#define Mag(Normal) (sqrt(Normal.x*Normal.x + Normal.y*Normal.y + Normal.z*Normal.z))
+
+class MathHelp {
+
+ public:
+  // vector between two points
+  static CVector3 VectorDiff(CVector3 vPoint1, CVector3 vPoint2)
+    {
+      CVector3 vVector;							
+
+      vVector.x = vPoint1.x - vPoint2.x;			
+      vVector.y = vPoint1.y - vPoint2.y;			
+      vVector.z = vPoint1.z - vPoint2.z;			
+
+      return vVector;								
+    }
+
+  // adding vectors, returning result
+  static CVector3 AddVector(CVector3 vVector1, CVector3 vVector2)
+    {
+      CVector3 vResult;							
+	
+      vResult.x = vVector2.x + vVector1.x;		
+      vResult.y = vVector2.y + vVector1.y;		
+      vResult.z = vVector2.z + vVector1.z;		
+
+      return vResult;
+    }
+
+  // This divides a vector by a single number (scalar) and returns the result
+  static CVector3 DivideVectorByScaler(CVector3 vVector1, float Scaler)
+    {
+      CVector3 vResult;							
+	
+      vResult.x = vVector1.x / Scaler;			
+      vResult.y = vVector1.y / Scaler;		
+      vResult.z = vVector1.z / Scaler;
+
+      return vResult;	
+    }
+
+  // cross product between 2 vectors
+  static CVector3 CrossProduct(CVector3 vVector1, CVector3 vVector2)
+    {
+      CVector3 vCross;	
+      vCross.x = ((vVector1.y * vVector2.z) - (vVector1.z * vVector2.y));
+      vCross.y = ((vVector1.z * vVector2.x) - (vVector1.x * vVector2.z));
+      vCross.z = ((vVector1.x * vVector2.y) - (vVector1.y * vVector2.x));
+      return vCross;	
+    }
+
+  // calculate the normal of a vector
+  static CVector3 NormalizeVector(CVector3 vNormal)
+    {
+      double Magnitude;
+      Magnitude = Mag(vNormal);	
+      vNormal.x /= (float)Magnitude;	
+      vNormal.y /= (float)Magnitude;	
+      vNormal.z /= (float)Magnitude;	
+
+      return vNormal;	
+    }
+};
+
+
+#endif /* _ABSTRACT_MODEL_H */
Index: orxonox/trunk/src/lib/graphics/importer/anorms.h
===================================================================
--- orxonox/trunk/src/lib/graphics/importer/anorms.h	(revision 4245)
+++ orxonox/trunk/src/lib/graphics/importer/anorms.h	(revision 4245)
@@ -0,0 +1,181 @@
+/*
+Copyright (C) 1996-1997 Id Softwaref, Inc.
+
+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 Licensef, 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 notf, write to the Free Software
+Foundationf, Inc.f, 59 Temple Place - Suite 330f, Bostonf, MA  02111-1307f, USA.
+
+*/
+{-0.525731f, 0.000000f, 0.850651f}, 
+{-0.442863f, 0.238856f, 0.864188f}, 
+{-0.295242f, 0.000000f, 0.955423f}, 
+{-0.309017f, 0.500000f, 0.809017f}, 
+{-0.162460f, 0.262866f, 0.951056f}, 
+{0.000000f, 0.000000f, 1.000000f}, 
+{0.000000f, 0.850651f, 0.525731f}, 
+{-0.147621f, 0.716567f, 0.681718f}, 
+{0.147621f, 0.716567f, 0.681718f}, 
+{0.000000f, 0.525731f, 0.850651f}, 
+{0.309017f, 0.500000f, 0.809017f}, 
+{0.525731f, 0.000000f, 0.850651f}, 
+{0.295242f, 0.000000f, 0.955423f}, 
+{0.442863f, 0.238856f, 0.864188f}, 
+{0.162460f, 0.262866f, 0.951056f}, 
+{-0.681718f, 0.147621f, 0.716567f}, 
+{-0.809017f, 0.309017f, 0.500000f}, 
+{-0.587785f, 0.425325f, 0.688191f}, 
+{-0.850651f, 0.525731f, 0.000000f}, 
+{-0.864188f, 0.442863f, 0.238856f}, 
+{-0.716567f, 0.681718f, 0.147621f}, 
+{-0.688191f, 0.587785f, 0.425325f}, 
+{-0.500000f, 0.809017f, 0.309017f}, 
+{-0.238856f, 0.864188f, 0.442863f}, 
+{-0.425325f, 0.688191f, 0.587785f}, 
+{-0.716567f, 0.681718f, -0.147621f}, 
+{-0.500000f, 0.809017f, -0.309017f}, 
+{-0.525731f, 0.850651f, 0.000000f}, 
+{0.000000f, 0.850651f, -0.525731f}, 
+{-0.238856f, 0.864188f, -0.442863f}, 
+{0.000000f, 0.955423f, -0.295242f}, 
+{-0.262866f, 0.951056f, -0.162460f}, 
+{0.000000f, 1.000000f, 0.000000f}, 
+{0.000000f, 0.955423f, 0.295242f}, 
+{-0.262866f, 0.951056f, 0.162460f}, 
+{0.238856f, 0.864188f, 0.442863f}, 
+{0.262866f, 0.951056f, 0.162460f}, 
+{0.500000f, 0.809017f, 0.309017f}, 
+{0.238856f, 0.864188f, -0.442863f}, 
+{0.262866f, 0.951056f, -0.162460f}, 
+{0.500000f, 0.809017f, -0.309017f}, 
+{0.850651f, 0.525731f, 0.000000f}, 
+{0.716567f, 0.681718f, 0.147621f}, 
+{0.716567f, 0.681718f, -0.147621f}, 
+{0.525731f, 0.850651f, 0.000000f}, 
+{0.425325f, 0.688191f, 0.587785f}, 
+{0.864188f, 0.442863f, 0.238856f}, 
+{0.688191f, 0.587785f, 0.425325f}, 
+{0.809017f, 0.309017f, 0.500000f}, 
+{0.681718f, 0.147621f, 0.716567f}, 
+{0.587785f, 0.425325f, 0.688191f}, 
+{0.955423f, 0.295242f, 0.000000f}, 
+{1.000000f, 0.000000f, 0.000000f}, 
+{0.951056f, 0.162460f, 0.262866f}, 
+{0.850651f, -0.525731f, 0.000000f}, 
+{0.955423f, -0.295242f, 0.000000f}, 
+{0.864188f, -0.442863f, 0.238856f}, 
+{0.951056f, -0.162460f, 0.262866f}, 
+{0.809017f, -0.309017f, 0.500000f}, 
+{0.681718f, -0.147621f, 0.716567f}, 
+{0.850651f, 0.000000f, 0.525731f}, 
+{0.864188f, 0.442863f, -0.238856f}, 
+{0.809017f, 0.309017f, -0.500000f}, 
+{0.951056f, 0.162460f, -0.262866f}, 
+{0.525731f, 0.000000f, -0.850651f}, 
+{0.681718f, 0.147621f, -0.716567f}, 
+{0.681718f, -0.147621f, -0.716567f}, 
+{0.850651f, 0.000000f, -0.525731f}, 
+{0.809017f, -0.309017f, -0.500000f}, 
+{0.864188f, -0.442863f, -0.238856f}, 
+{0.951056f, -0.162460f, -0.262866f}, 
+{0.147621f, 0.716567f, -0.681718f}, 
+{0.309017f, 0.500000f, -0.809017f}, 
+{0.425325f, 0.688191f, -0.587785f}, 
+{0.442863f, 0.238856f, -0.864188f}, 
+{0.587785f, 0.425325f, -0.688191f}, 
+{0.688191f, 0.587785f, -0.425325f}, 
+{-0.147621f, 0.716567f, -0.681718f}, 
+{-0.309017f, 0.500000f, -0.809017f}, 
+{0.000000f, 0.525731f, -0.850651f}, 
+{-0.525731f, 0.000000f, -0.850651f}, 
+{-0.442863f, 0.238856f, -0.864188f}, 
+{-0.295242f, 0.000000f, -0.955423f}, 
+{-0.162460f, 0.262866f, -0.951056f}, 
+{0.000000f, 0.000000f, -1.000000f}, 
+{0.295242f, 0.000000f, -0.955423f}, 
+{0.162460f, 0.262866f, -0.951056f}, 
+{-0.442863f, -0.238856f, -0.864188f}, 
+{-0.309017f, -0.500000f, -0.809017f}, 
+{-0.162460f, -0.262866f, -0.951056f}, 
+{0.000000f, -0.850651f, -0.525731f}, 
+{-0.147621f, -0.716567f, -0.681718f}, 
+{0.147621f, -0.716567f, -0.681718f}, 
+{0.000000f, -0.525731f, -0.850651f}, 
+{0.309017f, -0.500000f, -0.809017f}, 
+{0.442863f, -0.238856f, -0.864188f}, 
+{0.162460f, -0.262866f, -0.951056f}, 
+{0.238856f, -0.864188f, -0.442863f}, 
+{0.500000f, -0.809017f, -0.309017f}, 
+{0.425325f, -0.688191f, -0.587785f}, 
+{0.716567f, -0.681718f, -0.147621f}, 
+{0.688191f, -0.587785f, -0.425325f}, 
+{0.587785f, -0.425325f, -0.688191f}, 
+{0.000000f, -0.955423f, -0.295242f}, 
+{0.000000f, -1.000000f, 0.000000f}, 
+{0.262866f, -0.951056f, -0.162460f}, 
+{0.000000f, -0.850651f, 0.525731f}, 
+{0.000000f, -0.955423f, 0.295242f}, 
+{0.238856f, -0.864188f, 0.442863f}, 
+{0.262866f, -0.951056f, 0.162460f}, 
+{0.500000f, -0.809017f, 0.309017f}, 
+{0.716567f, -0.681718f, 0.147621f}, 
+{0.525731f, -0.850651f, 0.000000f}, 
+{-0.238856f, -0.864188f, -0.442863f}, 
+{-0.500000f, -0.809017f, -0.309017f}, 
+{-0.262866f, -0.951056f, -0.162460f}, 
+{-0.850651f, -0.525731f, 0.000000f}, 
+{-0.716567f, -0.681718f, -0.147621f}, 
+{-0.716567f, -0.681718f, 0.147621f}, 
+{-0.525731f, -0.850651f, 0.000000f}, 
+{-0.500000f, -0.809017f, 0.309017f}, 
+{-0.238856f, -0.864188f, 0.442863f}, 
+{-0.262866f, -0.951056f, 0.162460f}, 
+{-0.864188f, -0.442863f, 0.238856f}, 
+{-0.809017f, -0.309017f, 0.500000f}, 
+{-0.688191f, -0.587785f, 0.425325f}, 
+{-0.681718f, -0.147621f, 0.716567f}, 
+{-0.442863f, -0.238856f, 0.864188f}, 
+{-0.587785f, -0.425325f, 0.688191f}, 
+{-0.309017f, -0.500000f, 0.809017f}, 
+{-0.147621f, -0.716567f, 0.681718f}, 
+{-0.425325f, -0.688191f, 0.587785f}, 
+{-0.162460f, -0.262866f, 0.951056f}, 
+{0.442863f, -0.238856f, 0.864188f}, 
+{0.162460f, -0.262866f, 0.951056f}, 
+{0.309017f, -0.500000f, 0.809017f}, 
+{0.147621f, -0.716567f, 0.681718f}, 
+{0.000000f, -0.525731f, 0.850651f}, 
+{0.425325f, -0.688191f, 0.587785f}, 
+{0.587785f, -0.425325f, 0.688191f}, 
+{0.688191f, -0.587785f, 0.425325f}, 
+{-0.955423f, 0.295242f, 0.000000f}, 
+{-0.951056f, 0.162460f, 0.262866f}, 
+{-1.000000f, 0.000000f, 0.000000f}, 
+{-0.850651f, 0.000000f, 0.525731f}, 
+{-0.955423f, -0.295242f, 0.000000f}, 
+{-0.951056f, -0.162460f, 0.262866f}, 
+{-0.864188f, 0.442863f, -0.238856f}, 
+{-0.951056f, 0.162460f, -0.262866f}, 
+{-0.809017f, 0.309017f, -0.500000f}, 
+{-0.864188f, -0.442863f, -0.238856f}, 
+{-0.951056f, -0.162460f, -0.262866f}, 
+{-0.809017f, -0.309017f, -0.500000f}, 
+{-0.681718f, 0.147621f, -0.716567f}, 
+{-0.681718f, -0.147621f, -0.716567f}, 
+{-0.850651f, 0.000000f, -0.525731f}, 
+{-0.688191f, 0.587785f, -0.425325f}, 
+{-0.587785f, 0.425325f, -0.688191f}, 
+{-0.425325f, 0.688191f, -0.587785f}, 
+{-0.425325f, -0.688191f, -0.587785f}, 
+{-0.587785f, -0.425325f, -0.688191f}, 
+{-0.688191f, -0.587785f, -0.425325f},
Index: orxonox/trunk/src/lib/graphics/importer/anormtab.h
===================================================================
--- orxonox/trunk/src/lib/graphics/importer/anormtab.h	(revision 4245)
+++ orxonox/trunk/src/lib/graphics/importer/anormtab.h	(revision 4245)
@@ -0,0 +1,37 @@
+/*
+Copyright (C) 1997-2001 Id Software, Inc.
+
+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.
+
+*/
+
+{1.23,1.30,1.47,1.35,1.56,1.71,1.37,1.38,1.59,1.60,1.79,1.97,1.88,1.92,1.79,1.02,0.93,1.07,0.82,0.87,0.88,0.94,0.96,1.14,1.11,0.82,0.83,0.89,0.89,0.86,0.94,0.91,1.00,1.21,0.98,1.48,1.30,1.57,0.96,1.07,1.14,1.60,1.61,1.40,1.37,1.72,1.78,1.79,1.93,1.99,1.90,1.68,1.71,1.86,1.60,1.68,1.78,1.86,1.93,1.99,1.97,1.44,1.22,1.49,0.93,0.99,0.99,1.23,1.22,1.44,1.49,0.89,0.89,0.97,0.91,0.98,1.19,0.82,0.76,0.82,0.71,0.72,0.73,0.76,0.79,0.86,0.83,0.72,0.76,0.76,0.89,0.82,0.89,0.82,0.89,0.91,0.83,0.96,1.14,0.97,1.40,1.19,0.98,0.94,1.00,1.07,1.37,1.21,1.48,1.30,1.57,1.61,1.37,0.86,0.83,0.91,0.82,0.82,0.88,0.89,0.96,1.14,0.98,0.87,0.93,0.94,1.02,1.30,1.07,1.35,1.38,1.11,1.56,1.92,1.79,1.79,1.59,1.60,1.72,1.90,1.79,0.80,0.85,0.79,0.93,0.80,0.85,0.77,0.74,0.72,0.77,0.74,0.72,0.70,0.70,0.71,0.76,0.73,0.79,0.79,0.73,0.76,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00},
+{1.26,1.26,1.48,1.23,1.50,1.71,1.14,1.19,1.38,1.46,1.64,1.94,1.87,1.84,1.71,1.02,0.92,1.00,0.79,0.85,0.84,0.91,0.90,0.98,0.99,0.77,0.77,0.83,0.82,0.79,0.86,0.84,0.92,0.99,0.91,1.24,1.03,1.33,0.88,0.94,0.97,1.41,1.39,1.18,1.11,1.51,1.61,1.59,1.80,1.91,1.76,1.54,1.65,1.76,1.70,1.70,1.85,1.85,1.97,1.99,1.93,1.28,1.09,1.39,0.92,0.97,0.99,1.18,1.26,1.52,1.48,0.83,0.85,0.90,0.88,0.93,1.00,0.77,0.73,0.78,0.72,0.71,0.74,0.75,0.79,0.86,0.81,0.75,0.81,0.79,0.96,0.88,0.94,0.86,0.93,0.92,0.85,1.08,1.33,1.05,1.55,1.31,1.01,1.05,1.27,1.31,1.60,1.47,1.70,1.54,1.76,1.76,1.57,0.93,0.90,0.99,0.88,0.88,0.95,0.97,1.11,1.39,1.20,0.92,0.97,1.01,1.10,1.39,1.22,1.51,1.58,1.32,1.64,1.97,1.85,1.91,1.77,1.74,1.88,1.99,1.91,0.79,0.86,0.80,0.94,0.84,0.88,0.74,0.74,0.71,0.82,0.77,0.76,0.70,0.73,0.72,0.73,0.70,0.74,0.85,0.77,0.82,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00},
+{1.34,1.27,1.53,1.17,1.46,1.71,0.98,1.05,1.20,1.34,1.48,1.86,1.82,1.71,1.62,1.09,0.94,0.99,0.79,0.85,0.82,0.90,0.87,0.93,0.96,0.76,0.74,0.79,0.76,0.74,0.79,0.78,0.85,0.92,0.85,1.00,0.93,1.06,0.81,0.86,0.89,1.16,1.12,0.97,0.95,1.28,1.38,1.35,1.60,1.77,1.57,1.33,1.50,1.58,1.69,1.63,1.82,1.74,1.91,1.92,1.80,1.04,0.97,1.21,0.90,0.93,0.97,1.05,1.21,1.48,1.37,0.77,0.80,0.84,0.85,0.88,0.92,0.73,0.71,0.74,0.74,0.71,0.75,0.73,0.79,0.84,0.78,0.79,0.86,0.81,1.05,0.94,0.99,0.90,0.95,0.92,0.86,1.24,1.44,1.14,1.59,1.34,1.02,1.27,1.50,1.49,1.80,1.69,1.86,1.72,1.87,1.80,1.69,1.00,0.98,1.23,0.95,0.96,1.09,1.16,1.37,1.63,1.46,0.99,1.10,1.25,1.24,1.51,1.41,1.67,1.77,1.55,1.72,1.95,1.89,1.98,1.91,1.86,1.97,1.99,1.94,0.81,0.89,0.85,0.98,0.90,0.94,0.75,0.78,0.73,0.89,0.83,0.82,0.72,0.77,0.76,0.72,0.70,0.71,0.91,0.83,0.89,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00},
+{1.46,1.34,1.60,1.16,1.46,1.71,0.94,0.99,1.05,1.26,1.33,1.74,1.76,1.57,1.54,1.23,0.98,1.05,0.83,0.89,0.84,0.92,0.87,0.91,0.96,0.78,0.74,0.79,0.72,0.72,0.75,0.76,0.80,0.88,0.83,0.94,0.87,0.95,0.76,0.80,0.82,0.97,0.96,0.89,0.88,1.08,1.11,1.10,1.37,1.59,1.37,1.07,1.27,1.34,1.57,1.45,1.69,1.55,1.77,1.79,1.60,0.93,0.90,0.99,0.86,0.87,0.93,0.96,1.07,1.35,1.18,0.73,0.76,0.77,0.81,0.82,0.85,0.70,0.71,0.72,0.78,0.73,0.77,0.73,0.79,0.82,0.76,0.83,0.90,0.84,1.18,0.98,1.03,0.92,0.95,0.90,0.86,1.32,1.45,1.15,1.53,1.27,0.99,1.42,1.65,1.58,1.93,1.83,1.94,1.81,1.88,1.74,1.70,1.19,1.17,1.44,1.11,1.15,1.36,1.41,1.61,1.81,1.67,1.22,1.34,1.50,1.42,1.65,1.61,1.82,1.91,1.75,1.80,1.89,1.89,1.98,1.99,1.94,1.98,1.92,1.87,0.86,0.95,0.92,1.14,0.98,1.03,0.79,0.84,0.77,0.97,0.90,0.89,0.76,0.82,0.82,0.74,0.72,0.71,0.98,0.89,0.97,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00},
+{1.60,1.44,1.68,1.22,1.49,1.71,0.93,0.99,0.99,1.23,1.22,1.60,1.68,1.44,1.49,1.40,1.14,1.19,0.89,0.96,0.89,0.97,0.89,0.91,0.98,0.82,0.76,0.82,0.71,0.72,0.73,0.76,0.79,0.86,0.83,0.91,0.83,0.89,0.72,0.76,0.76,0.89,0.89,0.82,0.82,0.98,0.96,0.97,1.14,1.40,1.19,0.94,1.00,1.07,1.37,1.21,1.48,1.30,1.57,1.61,1.37,0.86,0.83,0.91,0.82,0.82,0.88,0.89,0.96,1.14,0.98,0.70,0.72,0.73,0.77,0.76,0.79,0.70,0.72,0.71,0.82,0.77,0.80,0.74,0.79,0.80,0.74,0.87,0.93,0.85,1.23,1.02,1.02,0.93,0.93,0.87,0.85,1.30,1.35,1.07,1.38,1.11,0.94,1.47,1.71,1.56,1.97,1.88,1.92,1.79,1.79,1.59,1.60,1.30,1.35,1.56,1.37,1.38,1.59,1.60,1.79,1.92,1.79,1.48,1.57,1.72,1.61,1.78,1.79,1.93,1.99,1.90,1.86,1.78,1.86,1.93,1.99,1.97,1.90,1.79,1.72,0.94,1.07,1.00,1.37,1.21,1.30,0.86,0.91,0.83,1.14,0.98,0.96,0.82,0.88,0.89,0.79,0.76,0.73,1.07,0.94,1.11,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00},
+{1.74,1.57,1.76,1.33,1.54,1.71,0.94,1.05,0.99,1.26,1.16,1.46,1.60,1.34,1.46,1.59,1.37,1.37,0.97,1.11,0.96,1.10,0.95,0.94,1.08,0.89,0.82,0.88,0.72,0.76,0.75,0.80,0.80,0.88,0.87,0.91,0.83,0.87,0.72,0.76,0.74,0.83,0.84,0.78,0.79,0.96,0.89,0.92,0.98,1.23,1.05,0.86,0.92,0.95,1.11,0.98,1.22,1.03,1.34,1.42,1.14,0.79,0.77,0.84,0.78,0.76,0.82,0.82,0.89,0.97,0.90,0.70,0.71,0.71,0.73,0.72,0.74,0.73,0.76,0.72,0.86,0.81,0.82,0.76,0.79,0.77,0.73,0.90,0.95,0.86,1.18,1.03,0.98,0.92,0.90,0.83,0.84,1.19,1.17,0.98,1.15,0.97,0.89,1.42,1.65,1.44,1.93,1.83,1.81,1.67,1.61,1.36,1.41,1.32,1.45,1.58,1.57,1.53,1.74,1.70,1.88,1.94,1.81,1.69,1.77,1.87,1.79,1.89,1.92,1.98,1.99,1.98,1.89,1.65,1.80,1.82,1.91,1.94,1.75,1.61,1.50,1.07,1.34,1.27,1.60,1.45,1.55,0.93,0.99,0.90,1.35,1.18,1.07,0.87,0.93,0.96,0.85,0.82,0.77,1.15,0.99,1.27,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00},
+{1.86,1.71,1.82,1.48,1.62,1.71,0.98,1.20,1.05,1.34,1.17,1.34,1.53,1.27,1.46,1.77,1.60,1.57,1.16,1.38,1.12,1.35,1.06,1.00,1.28,0.97,0.89,0.95,0.76,0.81,0.79,0.86,0.85,0.92,0.93,0.93,0.85,0.87,0.74,0.78,0.74,0.79,0.82,0.76,0.79,0.96,0.85,0.90,0.94,1.09,0.99,0.81,0.85,0.89,0.95,0.90,0.99,0.94,1.10,1.24,0.98,0.75,0.73,0.78,0.74,0.72,0.77,0.76,0.82,0.89,0.83,0.73,0.71,0.71,0.71,0.70,0.72,0.77,0.80,0.74,0.90,0.85,0.84,0.78,0.79,0.75,0.73,0.92,0.95,0.86,1.05,0.99,0.94,0.90,0.86,0.79,0.81,1.00,0.98,0.91,0.96,0.89,0.83,1.27,1.50,1.23,1.80,1.69,1.63,1.46,1.37,1.09,1.16,1.24,1.44,1.49,1.69,1.59,1.80,1.69,1.87,1.86,1.72,1.82,1.91,1.94,1.92,1.95,1.99,1.98,1.91,1.97,1.89,1.51,1.72,1.67,1.77,1.86,1.55,1.41,1.25,1.33,1.58,1.50,1.80,1.63,1.74,1.04,1.21,0.97,1.48,1.37,1.21,0.93,0.97,1.05,0.92,0.88,0.84,1.14,1.02,1.34,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00},
+{1.94,1.84,1.87,1.64,1.71,1.71,1.14,1.38,1.19,1.46,1.23,1.26,1.48,1.26,1.50,1.91,1.80,1.76,1.41,1.61,1.39,1.59,1.33,1.24,1.51,1.18,0.97,1.11,0.82,0.88,0.86,0.94,0.92,0.99,1.03,0.98,0.91,0.90,0.79,0.84,0.77,0.79,0.84,0.77,0.83,0.99,0.85,0.91,0.92,1.02,1.00,0.79,0.80,0.86,0.88,0.84,0.92,0.88,0.97,1.10,0.94,0.74,0.71,0.74,0.72,0.70,0.73,0.72,0.76,0.82,0.77,0.77,0.73,0.74,0.71,0.70,0.73,0.83,0.85,0.78,0.92,0.88,0.86,0.81,0.79,0.74,0.75,0.92,0.93,0.85,0.96,0.94,0.88,0.86,0.81,0.75,0.79,0.93,0.90,0.85,0.88,0.82,0.77,1.05,1.27,0.99,1.60,1.47,1.39,1.20,1.11,0.95,0.97,1.08,1.33,1.31,1.70,1.55,1.76,1.57,1.76,1.70,1.54,1.85,1.97,1.91,1.99,1.97,1.99,1.91,1.77,1.88,1.85,1.39,1.64,1.51,1.58,1.74,1.32,1.22,1.01,1.54,1.76,1.65,1.93,1.70,1.85,1.28,1.39,1.09,1.52,1.48,1.26,0.97,0.99,1.18,1.00,0.93,0.90,1.05,1.01,1.31,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00},
+{1.97,1.92,1.88,1.79,1.79,1.71,1.37,1.59,1.38,1.60,1.35,1.23,1.47,1.30,1.56,1.99,1.93,1.90,1.60,1.78,1.61,1.79,1.57,1.48,1.72,1.40,1.14,1.37,0.89,0.96,0.94,1.07,1.00,1.21,1.30,1.14,0.98,0.96,0.86,0.91,0.83,0.82,0.88,0.82,0.89,1.11,0.87,0.94,0.93,1.02,1.07,0.80,0.79,0.85,0.82,0.80,0.87,0.85,0.93,1.02,0.93,0.77,0.72,0.74,0.71,0.70,0.70,0.71,0.72,0.77,0.74,0.82,0.76,0.79,0.72,0.73,0.76,0.89,0.89,0.82,0.93,0.91,0.86,0.83,0.79,0.73,0.76,0.91,0.89,0.83,0.89,0.89,0.82,0.82,0.76,0.72,0.76,0.86,0.83,0.79,0.82,0.76,0.73,0.94,1.00,0.91,1.37,1.21,1.14,0.98,0.96,0.88,0.89,0.96,1.14,1.07,1.60,1.40,1.61,1.37,1.57,1.48,1.30,1.78,1.93,1.79,1.99,1.92,1.90,1.79,1.59,1.72,1.79,1.30,1.56,1.35,1.38,1.60,1.11,1.07,0.94,1.68,1.86,1.71,1.97,1.68,1.86,1.44,1.49,1.22,1.44,1.49,1.22,0.99,0.99,1.23,1.19,0.98,0.97,0.97,0.98,1.19,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00},
+{1.94,1.97,1.87,1.91,1.85,1.71,1.60,1.77,1.58,1.74,1.51,1.26,1.48,1.39,1.64,1.99,1.97,1.99,1.70,1.85,1.76,1.91,1.76,1.70,1.88,1.55,1.33,1.57,0.96,1.08,1.05,1.31,1.27,1.47,1.54,1.39,1.20,1.11,0.93,0.99,0.90,0.88,0.95,0.88,0.97,1.32,0.92,1.01,0.97,1.10,1.22,0.84,0.80,0.88,0.79,0.79,0.85,0.86,0.92,1.02,0.94,0.82,0.76,0.77,0.72,0.73,0.70,0.72,0.71,0.74,0.74,0.88,0.81,0.85,0.75,0.77,0.82,0.94,0.93,0.86,0.92,0.92,0.86,0.85,0.79,0.74,0.79,0.88,0.85,0.81,0.82,0.83,0.77,0.78,0.73,0.71,0.75,0.79,0.77,0.74,0.77,0.73,0.70,0.86,0.92,0.84,1.14,0.99,0.98,0.91,0.90,0.84,0.83,0.88,0.97,0.94,1.41,1.18,1.39,1.11,1.33,1.24,1.03,1.61,1.80,1.59,1.91,1.84,1.76,1.64,1.38,1.51,1.71,1.26,1.50,1.23,1.19,1.46,0.99,1.00,0.91,1.70,1.85,1.65,1.93,1.54,1.76,1.52,1.48,1.26,1.28,1.39,1.09,0.99,0.97,1.18,1.31,1.01,1.05,0.90,0.93,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00},
+{1.86,1.95,1.82,1.98,1.89,1.71,1.80,1.91,1.77,1.86,1.67,1.34,1.53,1.51,1.72,1.92,1.91,1.99,1.69,1.82,1.80,1.94,1.87,1.86,1.97,1.59,1.44,1.69,1.05,1.24,1.27,1.49,1.50,1.69,1.72,1.63,1.46,1.37,1.00,1.23,0.98,0.95,1.09,0.96,1.16,1.55,0.99,1.25,1.10,1.24,1.41,0.90,0.85,0.94,0.79,0.81,0.85,0.89,0.94,1.09,0.98,0.89,0.82,0.83,0.74,0.77,0.72,0.76,0.73,0.75,0.78,0.94,0.86,0.91,0.79,0.83,0.89,0.99,0.95,0.90,0.90,0.92,0.84,0.86,0.79,0.75,0.81,0.85,0.80,0.78,0.76,0.77,0.73,0.74,0.71,0.71,0.73,0.74,0.74,0.71,0.76,0.72,0.70,0.79,0.85,0.78,0.98,0.92,0.93,0.85,0.87,0.82,0.79,0.81,0.89,0.86,1.16,0.97,1.12,0.95,1.06,1.00,0.93,1.38,1.60,1.35,1.77,1.71,1.57,1.48,1.20,1.28,1.62,1.27,1.46,1.17,1.05,1.34,0.96,0.99,0.90,1.63,1.74,1.50,1.80,1.33,1.58,1.48,1.37,1.21,1.04,1.21,0.97,0.97,0.93,1.05,1.34,1.02,1.14,0.84,0.88,0.92,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00},
+{1.74,1.89,1.76,1.98,1.89,1.71,1.93,1.99,1.91,1.94,1.82,1.46,1.60,1.65,1.80,1.79,1.77,1.92,1.57,1.69,1.74,1.87,1.88,1.94,1.98,1.53,1.45,1.70,1.18,1.32,1.42,1.58,1.65,1.83,1.81,1.81,1.67,1.61,1.19,1.44,1.17,1.11,1.36,1.15,1.41,1.75,1.22,1.50,1.34,1.42,1.61,0.98,0.92,1.03,0.83,0.86,0.89,0.95,0.98,1.23,1.14,0.97,0.89,0.90,0.78,0.82,0.76,0.82,0.77,0.79,0.84,0.98,0.90,0.98,0.83,0.89,0.97,1.03,0.95,0.92,0.86,0.90,0.82,0.86,0.79,0.77,0.84,0.81,0.76,0.76,0.72,0.73,0.70,0.72,0.71,0.73,0.73,0.72,0.74,0.71,0.78,0.74,0.72,0.75,0.80,0.76,0.94,0.88,0.91,0.83,0.87,0.84,0.79,0.76,0.82,0.80,0.97,0.89,0.96,0.88,0.95,0.94,0.87,1.11,1.37,1.10,1.59,1.57,1.37,1.33,1.05,1.08,1.54,1.34,1.46,1.16,0.99,1.26,0.96,1.05,0.92,1.45,1.55,1.27,1.60,1.07,1.34,1.35,1.18,1.07,0.93,0.99,0.90,0.93,0.87,0.96,1.27,0.99,1.15,0.77,0.82,0.85,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00},
+{1.60,1.78,1.68,1.93,1.86,1.71,1.97,1.99,1.99,1.97,1.93,1.60,1.68,1.78,1.86,1.61,1.57,1.79,1.37,1.48,1.59,1.72,1.79,1.92,1.90,1.38,1.35,1.60,1.23,1.30,1.47,1.56,1.71,1.88,1.79,1.92,1.79,1.79,1.30,1.56,1.35,1.37,1.59,1.38,1.60,1.90,1.48,1.72,1.57,1.61,1.79,1.21,1.00,1.30,0.89,0.94,0.96,1.07,1.14,1.40,1.37,1.14,0.96,0.98,0.82,0.88,0.82,0.89,0.83,0.86,0.91,1.02,0.93,1.07,0.87,0.94,1.11,1.02,0.93,0.93,0.82,0.87,0.80,0.85,0.79,0.80,0.85,0.77,0.72,0.74,0.71,0.70,0.70,0.71,0.72,0.77,0.74,0.72,0.76,0.73,0.82,0.79,0.76,0.73,0.79,0.76,0.93,0.86,0.91,0.83,0.89,0.89,0.82,0.72,0.76,0.76,0.89,0.82,0.89,0.82,0.89,0.91,0.83,0.96,1.14,0.97,1.40,1.44,1.19,1.22,0.99,0.98,1.49,1.44,1.49,1.22,0.99,1.23,0.98,1.19,0.97,1.21,1.30,1.00,1.37,0.94,1.07,1.14,0.98,0.96,0.86,0.91,0.83,0.88,0.82,0.89,1.11,0.94,1.07,0.73,0.76,0.79,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00},
+{1.46,1.65,1.60,1.82,1.80,1.71,1.93,1.91,1.99,1.94,1.98,1.74,1.76,1.89,1.89,1.42,1.34,1.61,1.11,1.22,1.36,1.50,1.61,1.81,1.75,1.15,1.17,1.41,1.18,1.19,1.42,1.44,1.65,1.83,1.67,1.94,1.81,1.88,1.32,1.58,1.45,1.57,1.74,1.53,1.70,1.98,1.69,1.87,1.77,1.79,1.92,1.45,1.27,1.55,0.97,1.07,1.11,1.34,1.37,1.59,1.60,1.35,1.07,1.18,0.86,0.93,0.87,0.96,0.90,0.93,0.99,1.03,0.95,1.15,0.90,0.99,1.27,0.98,0.90,0.92,0.78,0.83,0.77,0.84,0.79,0.82,0.86,0.73,0.71,0.73,0.72,0.70,0.73,0.72,0.76,0.81,0.76,0.76,0.82,0.77,0.89,0.85,0.82,0.75,0.80,0.80,0.94,0.88,0.94,0.87,0.95,0.96,0.88,0.72,0.74,0.76,0.83,0.78,0.84,0.79,0.87,0.91,0.83,0.89,0.98,0.92,1.23,1.34,1.05,1.16,0.99,0.96,1.46,1.57,1.54,1.33,1.05,1.26,1.08,1.37,1.10,0.98,1.03,0.92,1.14,0.86,0.95,0.97,0.90,0.89,0.79,0.84,0.77,0.82,0.76,0.82,0.97,0.89,0.98,0.71,0.72,0.74,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00},
+{1.34,1.51,1.53,1.67,1.72,1.71,1.80,1.77,1.91,1.86,1.98,1.86,1.82,1.95,1.89,1.24,1.10,1.41,0.95,0.99,1.09,1.25,1.37,1.63,1.55,0.96,0.98,1.16,1.05,1.00,1.27,1.23,1.50,1.69,1.46,1.86,1.72,1.87,1.24,1.49,1.44,1.69,1.80,1.59,1.69,1.97,1.82,1.94,1.91,1.92,1.99,1.63,1.50,1.74,1.16,1.33,1.38,1.58,1.60,1.77,1.80,1.48,1.21,1.37,0.90,0.97,0.93,1.05,0.97,1.04,1.21,0.99,0.95,1.14,0.92,1.02,1.34,0.94,0.86,0.90,0.74,0.79,0.75,0.81,0.79,0.84,0.86,0.71,0.71,0.73,0.76,0.73,0.77,0.74,0.80,0.85,0.78,0.81,0.89,0.84,0.97,0.92,0.88,0.79,0.85,0.86,0.98,0.92,1.00,0.93,1.06,1.12,0.95,0.74,0.74,0.78,0.79,0.76,0.82,0.79,0.87,0.93,0.85,0.85,0.94,0.90,1.09,1.27,0.99,1.17,1.05,0.96,1.46,1.71,1.62,1.48,1.20,1.34,1.28,1.57,1.35,0.90,0.94,0.85,0.98,0.81,0.89,0.89,0.83,0.82,0.75,0.78,0.73,0.77,0.72,0.76,0.89,0.83,0.91,0.71,0.70,0.72,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00},
+{1.26,1.39,1.48,1.51,1.64,1.71,1.60,1.58,1.77,1.74,1.91,1.94,1.87,1.97,1.85,1.10,0.97,1.22,0.88,0.92,0.95,1.01,1.11,1.39,1.32,0.88,0.90,0.97,0.96,0.93,1.05,0.99,1.27,1.47,1.20,1.70,1.54,1.76,1.08,1.31,1.33,1.70,1.76,1.55,1.57,1.88,1.85,1.91,1.97,1.99,1.99,1.70,1.65,1.85,1.41,1.54,1.61,1.76,1.80,1.91,1.93,1.52,1.26,1.48,0.92,0.99,0.97,1.18,1.09,1.28,1.39,0.94,0.93,1.05,0.92,1.01,1.31,0.88,0.81,0.86,0.72,0.75,0.74,0.79,0.79,0.86,0.85,0.71,0.73,0.75,0.82,0.77,0.83,0.78,0.85,0.88,0.81,0.88,0.97,0.90,1.18,1.00,0.93,0.86,0.92,0.94,1.14,0.99,1.24,1.03,1.33,1.39,1.11,0.79,0.77,0.84,0.79,0.77,0.84,0.83,0.90,0.98,0.91,0.85,0.92,0.91,1.02,1.26,1.00,1.23,1.19,0.99,1.50,1.84,1.71,1.64,1.38,1.46,1.51,1.76,1.59,0.84,0.88,0.80,0.94,0.79,0.86,0.82,0.77,0.76,0.74,0.74,0.71,0.73,0.70,0.72,0.82,0.77,0.85,0.74,0.70,0.73,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00}
+
Index: orxonox/trunk/src/lib/graphics/importer/md2Model.cc
===================================================================
--- orxonox/trunk/src/lib/graphics/importer/md2Model.cc	(revision 4245)
+++ orxonox/trunk/src/lib/graphics/importer/md2Model.cc	(revision 4245)
@@ -0,0 +1,744 @@
+/* 
+   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
+*/
+
+#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_IMPORTER
+
+#include "md2Model.h"
+#include "material.h"
+
+#include <fstream>
+#include <string>
+#include <vector>
+
+
+using namespace std;
+
+
+sVec3D MD2Model2::anorms[NUM_VERTEX_NORMALS] = {
+ #include "anorms.h"
+};
+
+float MD2Model2::anormsDots[SHADEDOT_QUANT][256] = {
+  #include "anormtab.h"
+};
+
+static float *shadeDots = MD2Model2::anormsDots[0];
+
+float md2Angle = 0.0f;
+
+
+sAnim MD2Model2::animationList[21] =
+  {
+ // begin, end, fps 
+    {   0,  39,  9 },   // STAND
+    {  40,  45, 10 },   // RUN
+    {  46,  53, 10 },   // ATTACK
+    {  54,  57,  7 },   // PAIN_A
+    {  58,  61,  7 },   // PAIN_B
+    {  62,  65,  7 },   // PAIN_C
+    {  66,  71,  7 },   // JUMP
+    {  72,  83,  7 },   // FLIP
+    {  84,  94,  7 },   // SALUTE
+    {  95, 111, 10 },   // FALLBACK
+    { 112, 122,  7 },   // WAVE
+    { 123, 134,  6 },   // POINT
+    { 135, 153, 10 },   // CROUCH_STAND
+    { 154, 159,  7 },   // CROUCH_WALK
+    { 160, 168, 10 },   // CROUCH_ATTACK
+    { 196, 172,  7 },   // CROUCH_PAIN
+    { 173, 177,  5 },   // CROUCH_DEATH
+    { 178, 183,  7 },   // DEATH_FALLBACK
+    { 184, 189,  7 },   // DEATH_FALLFORWARD
+    { 190, 197,  7 },   // DEATH_FALLBACKSLOW
+    { 198, 198,  5 },   // BOOM
+  };
+
+
+/********************************************************************************
+ *   MD2MODEL                                                                   *
+ ********************************************************************************/
+
+/**
+   \brief standard constructor
+   
+   creates a new model
+*/
+MD2Model::MD2Model () 
+{
+  this->setClassName ("MD2Model");
+
+  MD2Loader* md2loader = new MD2Loader();
+  this->model = new t3DModel;
+  md2loader->importMD2(this->model, "../data/models/tris.md2");
+  delete md2loader;
+}
+
+
+/**
+   \brief standard deconstructor
+
+*/
+MD2Model::~MD2Model () 
+{
+  // delete what has to be deleted here
+}
+
+
+void MD2Model::animate()
+{
+  if( unlikely(this->model->objectList.size() <= 0)) return;
+  /* get current animation from the list */
+  tAnimationInfo *pAnim = &(this->model->animationList[this->model->currentAnim]);
+
+  int nextFrame = (this->model->currentFrame + 1) % pAnim->endFrame;
+  if( unlikely(nextFrame == 0)) 
+    nextFrame =  pAnim->startFrame;
+
+  t3DObject *pFrame = &this->model->objectList[this->model->currentFrame];
+  t3DObject *pNextFrame = &this->model->objectList[nextFrame];
+
+  /* we have stored the texture and face information only in the first frame */
+  t3DObject *pFirstFrame = &this->model->objectList[0];
+
+  /* get the current time as a value in the domain [0..1] :)) */
+  float t = this->getCurrentTime(this->model, nextFrame);
+
+  glBegin(GL_TRIANGLES);
+  for(int j = 0; j < pFrame->numOfFaces; j++)
+    {
+      for(int whichVertex = 0; whichVertex < 3; whichVertex++)
+	{
+	  int vertIndex = pFirstFrame->pFaces[j].vertIndex[whichVertex];
+	  int texIndex  = pFirstFrame->pFaces[j].coordIndex[whichVertex];
+						
+	  if( likely(pFirstFrame->pTexVerts != NULL)) 
+	    {
+	      glTexCoord2f(pFirstFrame->pTexVerts[texIndex].x, 
+			   pFirstFrame->pTexVerts[texIndex].y);
+	    }
+			
+	  /* here comes the interpolation part */
+	  CVector3 vPoint1 = pFrame->pVerts[vertIndex];
+	  CVector3 vPoint2 = pNextFrame->pVerts[vertIndex];
+	  glVertex3f(vPoint1.x + t * (vPoint2.x - vPoint1.x), 
+		     vPoint1.y + t * (vPoint2.y - vPoint1.y),
+		     vPoint1.z + t * (vPoint2.z - vPoint1.z));
+	}
+    }
+  glEnd();
+}
+
+
+float MD2Model::getCurrentTime(t3DModel *pModel, int nextFrame)
+{
+  /* stretch the time with animation speed (and make seconds out of it) */
+  //float t = this->dtS / kAnimationSpeed;
+	
+  if ( unlikely(this->localTime*1000.0 >=  1000.0/kAnimationSpeed) )
+    {
+      pModel->currentFrame = nextFrame;
+      this->localTime = 0.0f;
+    }
+  return (this->localTime / kAnimationSpeed);
+}
+
+
+void MD2Model::tick(float dtS)
+{
+  this->localTime += dtS;
+}
+
+/**
+   \brief draw function
+  
+   these function will take NO argument in the final version, just for testing
+*/
+void MD2Model::draw()
+{
+  if( this->model->objectList.size() <= 0) return;
+
+  t3DObject *pObject = &this->model->objectList[0];
+  glBegin(GL_TRIANGLES);
+  for(int j = 0; j < pObject->numOfFaces; j++)
+    {
+      for(int whichVertex = 0; whichVertex < 3; whichVertex++)
+	{
+	  int index = pObject->pFaces[j].vertIndex[whichVertex];
+	  int index2 = pObject->pFaces[j].coordIndex[whichVertex];
+	  /* we invert the normals since the md2 file format uses different style */
+	  /* FIX FIX FIX: ther are actualy no reasons to compute the normals every frame: change this later*/
+	  glNormal3f(-pObject->pNormals[index].x, -pObject->pNormals[index].y, -pObject->pNormals[index].z);
+
+	  if( likely(pObject->pTexVerts != NULL)) 
+	    {
+	      glTexCoord2f(pObject->pTexVerts[index2].x, pObject->pTexVerts[index2].y);
+	    }
+	  glVertex3f(pObject->pVerts[index].x, pObject->pVerts[index].y, pObject->pVerts[index].z);
+	}
+    }
+  glEnd();
+}
+
+/********************************************************************************
+ *   MD2LOADER                                                                  *
+ ********************************************************************************/
+
+/**
+   \brief standard deconstructor
+   creates a new model loader
+*/
+MD2Loader::MD2Loader()
+{
+  this->setClassName ("MD2Loader");
+  /* initialize all data to initial state */
+  memset(&this->header, 0, sizeof(tMd2Header));
+  this->pSkins = NULL;
+  this->pTexCoords = NULL;
+  this->pTriangles = NULL;
+  this->pFrames = NULL;
+}
+
+/**
+   \brief standard deconstructor
+*/
+MD2Loader::~MD2Loader()
+{}
+  
+
+/**
+   \brief this is called by the client to open the .Md2 file, read it, then clean up
+   \param model to load in
+   \param file name to load
+   \param texture name to load
+*/
+bool MD2Loader::importMD2(t3DModel *pModel, char *fileName, char *textureName)
+{
+  this->pFile = fopen(fileName, "rb");
+  if( unlikely(!pFile)) 
+    {
+      PRINTF(1)("Couldn't open the MD2 File for loading. Exiting.\n");
+      return false;
+    }
+  fread(&this->header, 1, sizeof(tMd2Header), pFile);
+  /* check for the header version: make sure its a md2 file :) */
+  if( likely(this->header.version != 8))
+    {
+      PRINTF(1)("Couldn't load file %s: invalid file format: stop loading\n", fileName);
+      return false;
+    }
+	
+  this->readMD2Data();
+  this->convertDataStructures(pModel);
+  this->computeNormals(pModel);
+
+  if( likely((int)textureName))
+    {
+      tMaterialInfo textureInfo;
+      strcpy(textureInfo.strFile, textureName);
+      /* since there is only one texture for a .Md2 file, the ID is always 0 */
+      textureInfo.texureId = 0;
+      textureInfo.uTile = 1;
+      /* we only have 1 material for a model */
+      pModel->numOfMaterials = 1;
+      pModel->materialList.push_back(textureInfo);
+    }
+	
+  this->cleanUp();
+  return true;
+}
+
+
+/**
+   \brief This function reads in all of the model's data, except the animation frames
+*/
+void MD2Loader::readMD2Data()
+{
+  unsigned char buffer[MD2_MAX_FRAMESIZE];
+  this->pSkins     = new tMd2Skin[this->header.numSkins];
+  this->pTexCoords = new tMd2TexCoord[this->header.numTexCoords];
+  this->pTriangles = new tMd2Face[this->header.numTriangles];
+  this->pFrames    = new tMd2Frame[this->header.numFrames];
+
+  /* we read the skins */
+  fseek(this->pFile, this->header.offsetSkins, SEEK_SET);
+  fread(this->pSkins, sizeof(tMd2Skin), this->header.numSkins, this->pFile);
+  /* read all vertex data */
+  fseek(this->pFile, this->header.offsetTexCoords, SEEK_SET);
+  fread(this->pTexCoords, sizeof(tMd2TexCoord), this->header.numTexCoords, this->pFile);
+  /* read face data for each triangle (normals) */
+  fseek(this->pFile, this->header.offsetTriangles, SEEK_SET);
+  fread(this->pTriangles, sizeof(tMd2Face), this->header.numTriangles, this->pFile);
+  /* reading all frame data */
+  fseek(this->pFile, this->header.offsetFrames, SEEK_SET);
+  for( int i = 0; i < this->header.numFrames; i++)
+    {
+      tMd2AliasFrame *pFrame = (tMd2AliasFrame *) buffer;
+      this->pFrames[i].pVertices = new tMd2Triangle [this->header.numVertices];
+
+      /* read the frame animation data */
+      fread(pFrame, 1, this->header.frameSize, this->pFile);
+      strcpy(this->pFrames[i].strName, pFrame->name);
+      tMd2Triangle *pVertices = this->pFrames[i].pVertices;
+      /* 
+	 scale translations, store vertices: since id used a non-opengl xyz notation, we have to swap y and z
+	 and negate z axis 
+      */
+      for( int j = 0; j < this->header.numVertices; j++)
+	{
+	  pVertices[j].vertex[0] = pFrame->aliasVertices[j].vertex[0] * pFrame->scale[0] + pFrame->translate[0];
+	  pVertices[j].vertex[2] = -1 * (pFrame->aliasVertices[j].vertex[1] * pFrame->scale[1] + pFrame->translate[1]);
+	  pVertices[j].vertex[1] = pFrame->aliasVertices[j].vertex[2] * pFrame->scale[2] + pFrame->translate[2];
+
+	  printf("vertices %i --- %f, %f, %f\n",j, pVertices[j].vertex[0], pVertices[j].vertex[1], pVertices[j].vertex[2]);
+	}
+    }
+}
+
+
+/**
+   \brief this function fills in the animation list for each animation by name and frame
+   \param model
+*/
+void MD2Loader::parseAnimations(t3DModel *pModel)
+{
+  tAnimationInfo animationInfo;
+  string strLastName = "";
+
+  /* the animation parse process looks a little bit wired: this is because there are no 
+     fix bounds for the animation lengths, so the frames are destingushed using their names
+     which is normaly composed of <animationname><number>
+  */
+
+  for(int i = 0; i < pModel->numOfObjects; i++)
+    {
+      string strName  = this->pFrames[i].strName;
+      int frameNum = 0;
+	
+      /* erease the frame number from the frame-name */
+      for(unsigned int j = 0; j < strName.length(); j++)
+	{
+	  if( isdigit(strName[j]) && j >= strName.length() - 2)
+	    {
+	      frameNum = atoi(&strName[j]);
+	      strName.erase(j, strName.length() - j);
+	      break;
+	    }
+	}
+
+      printf("current: %s, last: %s\n", strName.c_str(), strLastName.c_str());
+
+      /* animations are sorted through their names: this is how its been done: */
+      if( strName != strLastName || i == pModel->numOfObjects - 1)
+	{
+	  if( strLastName != "")
+	    {
+	      strcpy(animationInfo.strName, strLastName.c_str());
+	      animationInfo.endFrame = i;
+	      pModel->animationList.push_back(animationInfo);
+	      memset(&animationInfo, 0, sizeof(tAnimationInfo));
+	      pModel->numOfAnimations++;
+	    }
+	  animationInfo.startFrame = frameNum - 1 + i;
+	}
+      strLastName = strName;
+    }
+}
+
+
+/**
+   \brief this function converts the .md2 structures to our own model and object structures: decompress
+   \param model
+*/
+void MD2Loader::convertDataStructures(t3DModel *pModel)
+{
+  int j = 0, i = 0;
+	
+  memset(pModel, 0, sizeof(t3DModel));
+  pModel->numOfObjects = this->header.numFrames;
+
+  this->parseAnimations(pModel);
+
+  for (i = 0; i < pModel->numOfObjects; i++)
+    {
+      t3DObject currentFrame;
+
+      currentFrame.numOfVerts = this->header.numVertices;
+      currentFrame.numTexVertex = this->header.numTexCoords;
+      currentFrame.numOfFaces = this->header.numTriangles;
+
+      currentFrame.pVerts = new CVector3[currentFrame.numOfVerts];
+
+      for (j = 0; j < currentFrame.numOfVerts; j++)
+	{
+	  currentFrame.pVerts[j].x = this->pFrames[i].pVertices[j].vertex[0];
+	  currentFrame.pVerts[j].y = this->pFrames[i].pVertices[j].vertex[1];
+	  currentFrame.pVerts[j].z = this->pFrames[i].pVertices[j].vertex[2];
+	}
+
+      delete this->pFrames[i].pVertices;
+
+      if( likely(i > 0))
+	{
+	  pModel->objectList.push_back(currentFrame);
+	  continue;
+	}
+			
+      currentFrame.pTexVerts = new CVector2[currentFrame.numTexVertex];
+      currentFrame.pFaces = new tFace[currentFrame.numOfFaces];
+
+      for(j = 0; j < currentFrame.numTexVertex; j++)
+	{
+	  currentFrame.pTexVerts[j].x = this->pTexCoords[j].u / float(this->header.skinWidth);
+	  currentFrame.pTexVerts[j].y = 1 - this->pTexCoords[j].v / float(this->header.skinHeight);
+	}
+
+      for(j = 0; j < currentFrame.numOfFaces; j++)
+	{
+	  currentFrame.pFaces[j].vertIndex[0] = this->pTriangles[j].vertexIndices[0];
+	  currentFrame.pFaces[j].vertIndex[1] = this->pTriangles[j].vertexIndices[1];
+	  currentFrame.pFaces[j].vertIndex[2] = this->pTriangles[j].vertexIndices[2];
+
+	  currentFrame.pFaces[j].coordIndex[0] = this->pTriangles[j].textureIndices[0];
+	  currentFrame.pFaces[j].coordIndex[1] = this->pTriangles[j].textureIndices[1];
+	  currentFrame.pFaces[j].coordIndex[2] = this->pTriangles[j].textureIndices[2];
+	}
+      pModel->objectList.push_back(currentFrame);
+    }
+}
+
+
+/**
+   \brief this function conputes the normals of the model
+   \param model
+*/
+void MD2Loader::computeNormals(t3DModel *pModel)
+{
+  CVector3 vVector1, vVector2, vNormal, vPoly[3];
+
+  if( unlikely(pModel->numOfObjects <= 0))
+    return;
+  /* now computing face normals: this means just averaging the vertex normals of a face */
+  /* so for every object: */
+  for(int index = 0; index < pModel->numOfObjects; index++)
+    {
+      t3DObject *pObject = &(pModel->objectList[index]);
+
+      /* allocate all the memory we need to calculate the normals */
+      CVector3 *pNormals = new CVector3 [pObject->numOfFaces];
+      CVector3 *pTempNormals = new CVector3 [pObject->numOfFaces];
+      pObject->pNormals = new CVector3 [pObject->numOfVerts];
+
+      for(int i=0; i < pObject->numOfFaces; i++)
+	{
+	  /* cache the points to make coding easier :) */
+	  vPoly[0] = pObject->pVerts[pObject->pFaces[i].vertIndex[0]];
+	  vPoly[1] = pObject->pVerts[pObject->pFaces[i].vertIndex[1]];
+	  vPoly[2] = pObject->pVerts[pObject->pFaces[i].vertIndex[2]];
+
+	  vVector1 = MathHelp::VectorDiff(vPoly[0], vPoly[2]);		
+	  vVector2 = MathHelp::VectorDiff(vPoly[2], vPoly[1]);		
+			
+	  vNormal  = MathHelp::CrossProduct(vVector1, vVector2);		
+	  pTempNormals[i] = vNormal;					
+	  vNormal  = MathHelp::NormalizeVector(vNormal);				
+
+	  pNormals[i] = vNormal;
+	}
+
+      /* now calculating vertex normals */
+      CVector3 vSum = {0.0, 0.0, 0.0};
+      CVector3 vZero = vSum;
+      int shared=0;
+
+      for (int i = 0; i < pObject->numOfVerts; i++)			
+	{
+	  for (int j = 0; j < pObject->numOfFaces; j++)	
+	    {												
+	      if (pObject->pFaces[j].vertIndex[0] == i || 
+		  pObject->pFaces[j].vertIndex[1] == i || 
+		  pObject->pFaces[j].vertIndex[2] == i)
+		{
+		  vSum = MathHelp::AddVector(vSum, pTempNormals[j]);
+		  shared++;												}
+	    }      
+	  pObject->pNormals[i] = MathHelp::DivideVectorByScaler(vSum, float(-shared));
+	  pObject->pNormals[i] = MathHelp::NormalizeVector(pObject->pNormals[i]);	
+
+	  vSum = vZero;									
+	  shared = 0;										
+	}
+      delete [] pTempNormals;
+      delete [] pNormals;
+    }
+}
+
+
+/**
+   \brief This function cleans up our allocated memory and closes the file
+*/
+void MD2Loader::cleanUp()
+{
+  fclose(this->pFile);			
+	
+  if( this->pSkins) delete [] this->pSkins;		
+  if( this->pTexCoords) delete this->pTexCoords;
+  if( this->pTriangles) delete this->pTriangles;
+  if( this->pFrames) delete this->pFrames;
+}
+
+
+/********************************************************************************
+ *   MD2LOADER2                                                                 *
+ ********************************************************************************/
+
+MD2Model2::MD2Model2()
+{
+  this->pVertices = NULL;
+  this->pGLCommands = NULL;
+  this->pLightNormals = NULL; 
+
+  this->numFrames = 0;
+  this->numVertices = 0;
+  this->numGLCommands = 0;
+  
+  this->textureID = 0;
+  this->scaleFactor = 1.0f;
+
+  this->setAnim(BOOM);
+}
+
+
+MD2Model2::~MD2Model2()
+{
+  delete [] this->pVertices;
+  delete [] this->pGLCommands;
+  delete [] this->pLightNormals;
+}
+
+
+
+bool MD2Model2::loadModel(const char* fileName)
+{
+  FILE *pFile;                            //file stream
+  char* buffer;                           //buffer for frame data
+  sFrame* frame;                          //temp frame
+  sVec3D *pVertex;
+  int* pNormals;
+
+  pFile = fopen(fileName, "rb");
+  if( unlikely(!pFile)) 
+    {
+      PRINTF(1)("Couldn't open the MD2 File for loading. Exiting.\n");
+      return false;
+    }
+  this->header = new tMd2Header;
+  fread(this->header, 1, sizeof(tMd2Header), pFile);
+  /* check for the header version: make sure its a md2 file :) */
+  if( unlikely(this->header->version != MD2_VERSION) && unlikely(this->header->ident != MD2_IDENT))
+    {
+      PRINTF(1)("Couldn't load file %s: invalid file format: stop loading\n", fileName);
+      return false;
+    }
+
+  this->fileName = new char[strlen(fileName)+1];
+  strcpy(this->fileName, fileName);
+  /* got the data: map it to locals */
+  this->numFrames = this->header->numFrames;
+  this->numVertices = this->header->numVertices;
+  this->numTriangles = this->header->numTriangles;
+  this->numGLCommands = this->header->numGlCommands;
+  /* allocate memory for the data storage */
+  this->pVertices = new sVec3D[this->numVertices * this->numFrames];
+  this->pGLCommands = new int[this->numGLCommands];
+  this->pLightNormals = new int[this->numVertices * this->numFrames];
+  buffer = new char[this->numFrames * this->header->frameSize];
+
+  /* read frame data from the file to a temp buffer */
+  fseek(pFile, this->header->offsetFrames, SEEK_SET);
+  fread(buffer, this->header->frameSize, this->numFrames, pFile);
+  /* read opengl commands */
+  fseek(pFile, this->header->offsetGlCommands, SEEK_SET);
+  fread(this->pGLCommands, sizeof(int), this->numGLCommands, pFile);
+
+  for(int i = 0; i < this->numFrames; ++i)
+    {
+      frame = (sFrame*)(buffer + this->header->frameSize * i); 
+      pVertex = this->pVertices + this->numVertices  * i;
+      pNormals = this->pLightNormals + this->numVertices * i;
+
+      for(int j = 0; j < this->numVertices; ++j)
+	{
+	  /* SPEEDUP: *(pVerts + i + 0) = (*(frame->pVertices + i + 0)...  */
+	  pVertex[j][0] = (frame->pVertices[j].v[0] * frame->scale[0]) + frame->translate[0];
+	  pVertex[j][1] = (frame->pVertices[j].v[2] * frame->scale[2]) + frame->translate[2];
+	  pVertex[j][2] = -1.0 * (frame->pVertices[j].v[1] * frame->scale[1] + frame->translate[1]);
+	  
+	  pNormals[j] = frame->pVertices[j].lightNormalIndex;
+	}
+    }
+
+  delete [] buffer;
+  fclose(pFile);
+}
+
+
+bool MD2Model2::loadSkin(const char* fileName)
+{
+  this->material = new Material("md2ModelTest");
+  this->material->setDiffuseMap(fileName);
+  this->material->setIllum(3);
+  this->material->setAmbient(1.0, 1.0, 1.0);
+}
+
+
+/**
+   \brief initializes an array of vert with the current frame scaled vertices
+
+   we won't use the pVertices array directly, since its much easier and we need
+   saving of data anyway
+*/
+void MD2Model2::interpolate(sVec3D* verticesList)
+{
+  sVec3D* currVec;
+  sVec3D* nextVec;
+
+  currVec = &this->pVertices[this->numVertices * this->animationState.currentFrame];
+  nextVec = &this->pVertices[this->numVertices * this->animationState.nextFrame];
+
+  for(int i = 0; i < this->numFrames; ++i)
+    {
+      verticesList[i][0] = (currVec[i][0] + this->animationState.interpolationState * (nextVec[i][0] - currVec[i][0])) * this->scaleFactor;
+      verticesList[i][1] = (currVec[i][1] + this->animationState.interpolationState * (nextVec[i][1] - currVec[i][1])) * this->scaleFactor;
+      verticesList[i][2] = (currVec[i][2] + this->animationState.interpolationState * (nextVec[i][2] - currVec[i][2])) * this->scaleFactor;
+    }
+}
+
+
+void MD2Model2::setAnim(int type)
+{
+  if( (type < 0) || (type > MAX_ANIMATIONS) )
+    type = 0;
+
+  this->animationState.startFrame = animationList[type].firstFrame;
+  this->animationState.endFrame = animationList[type].lastFrame;
+  this->animationState.nextFrame = animationList[type].firstFrame + 1;
+  this->animationState.fps = animationList[type].fps;
+  this->animationState.type = type;
+  
+  this->animationState.interpolationState = 0.0;
+  this->animationState.localTime = 0.0;
+  this->animationState.lastTime = 0.0;
+  this->animationState.currentFrame = animationList[type].firstFrame;
+}
+
+
+void MD2Model2::animate()
+{
+  if( this->animationState.localTime - this->animationState.lastTime > (1.0f / this->animationState.fps))
+    {
+      this->animationState.currentFrame = this->animationState.nextFrame;
+      this->animationState.nextFrame++;
+      
+      if( this->animationState.nextFrame > this->animationState.endFrame)
+	this->animationState.nextFrame = this->animationState.startFrame;
+      this->animationState.lastTime = this->animationState.localTime;
+    }
+
+  if( this->animationState.currentFrame > (this->numFrames - 1) )
+    this->animationState.currentFrame = 0;
+  if( this->animationState.nextFrame > (this->numFrames - 1) )
+    this->animationState.nextFrame = 0;
+
+  this->animationState.interpolationState = this->animationState.fps * 
+    (this->animationState.localTime - this->animationState.lastTime);
+}
+
+
+/* hhmmm... id used a very different way to do lightning... */
+void MD2Model2::processLighting()
+{
+  shadeDots = anormsDots[((int)(md2Angle*(SHADEDOT_QUANT / 360.0)))&(SHADEDOT_QUANT - 1)];
+}
+
+
+void MD2Model2::tick(float time)
+{
+  this->animationState.localTime += time;
+}
+
+
+void MD2Model2::draw()
+{
+  if( likely(this->animationState.localTime > 0.0))
+    this->animate();
+
+  glPushMatrix();
+
+  this->renderFrame();
+
+  glPopMatrix();
+}
+
+
+void MD2Model2::renderFrame()
+{
+  static sVec3D verticesList[MD2_MAX_VERTICES]; /* performance: created only once in a lifetime */
+  int* pCommands = this->pGLCommands;
+
+  /* some face culling stuff */
+  glPushAttrib(GL_POLYGON_BIT);
+  glFrontFace(GL_CW);
+  glEnable(GL_CULL_FACE);
+  glCullFace(GL_BACK);
+     
+  this->processLighting();
+  this->interpolate(verticesList);
+  this->material->select();
+
+  /* draw the triangles */
+  while( int i = *(pCommands++)) /* strange looking while loop for maximum performance */
+    {
+      if( i < 0)
+	{
+	  glBegin(GL_TRIANGLE_FAN);
+	  i = -i;
+	}
+      else
+	{
+	  glBegin(GL_TRIANGLE_STRIP);
+	}
+
+      for(; i > 0; i--, pCommands += 3) /* down counting for loop, next 3 gl commands */
+	{
+	  glNormal3fv(anorms[this->pLightNormals[pCommands[2]]]);
+	  glTexCoord2f( ((float *)pCommands)[0], 1.0-((float *)pCommands)[1] );
+	  glVertex3fv(verticesList[pCommands[2]]);
+	}
+      glEnd();
+    }
+  glDisable(GL_CULL_FACE);
+  glPopAttrib();
+}
+
+
+void MD2Model2::debug()
+{
+  PRINT(0)("==========================| MD2Model2::debug() |===\n");
+  PRINT(0)("=  Model FileName:\t%s\n", this->fileName);
+  PRINT(0)("=  Size in Memory:\t%i Bytes\n", this->header->frameSize * this->header->numFrames + 64); // 64bytes is the header size
+  PRINT(0)("=  Number of Vertices:\t%i\n", this->header->numVertices);
+  PRINT(0)("=  Number of Frames: \t%i\n", this->header->numFrames);
+  PRINT(0)("=  Height, Width\t\t%i, %i\n", this->header->skinHeight, this->header->skinWidth);
+  PRINT(0)("===================================================\n\n");
+}
Index: orxonox/trunk/src/lib/graphics/importer/md2Model.h
===================================================================
--- orxonox/trunk/src/lib/graphics/importer/md2Model.h	(revision 4245)
+++ orxonox/trunk/src/lib/graphics/importer/md2Model.h	(revision 4245)
@@ -0,0 +1,257 @@
+/*! 
+    \file md2Model.h
+    \brief Definition of an MD2 Model, a model format invented by ID Software.
+    
+    We are deeply thankfull for all the wunderfull things id software made for us gamers!
+    
+    The md2 file format is structured in a very simple way: it contains animations which are made out of
+    frames (so called keyframes). Each frame is a complete draweable model in a specific position.
+    A frame is a collection of vertex and its compagnions (normals, texture coordinates).
+    
+    A typical model has about 200 frames, the maximum frame count is fixed by MD2_MAX_FRAMES to currently 
+    512 frames. The maximal vetices count is set to 2048 verteces, not enough?
+    You just have to change the MD2_MAX_* values if it doesn't fit your purposes...
+    
+    Surface Culling is fully implemented in md2 models: quake2 uses front face culling.
+*/
+
+#ifndef _MD2MODEL_H
+#define _MD2MODEL_H
+
+#include "abstract_model.h"
+#include "base_object.h"
+#include "stdincl.h"
+
+
+//! These are the needed defines for the max values when loading .MD2 files
+#define MD2_IDENT                       (('2'<<24) + ('P'<<16) + ('D'<<8) + 'I')
+#define MD2_VERSION                     8
+#define MD2_MAX_TRIANGLES		4096
+#define MD2_MAX_VERTICES		2048
+#define MD2_MAX_TEXCOORDS		2048
+#define MD2_MAX_FRAMES			512
+#define MD2_MAX_SKINS			32
+#define MD2_MAX_FRAMESIZE		(MD2_MAX_VERTICES * 4 + 128)
+
+#define NUM_VERTEX_NORMALS              162
+#define SHADEDOT_QUANT                  16
+
+//! This stores the speed of the animation between each key frame - currently conflicting with the animation framework
+#define kAnimationSpeed			12.0f
+
+//! This holds the header information that is read in at the beginning of the file: id software definition
+struct tMd2Header
+{ 
+   int ident;			        //!< This is used to identify the file
+   int version;			        //!< The version number of the file (Must be 8)
+    
+   int skinWidth;			//!< The skin width in pixels
+   int skinHeight;			//!< The skin height in pixels
+   int frameSize;			//!< The size in bytes the frames are
+   
+   int numSkins;		        //!< The number of skins associated with the model
+   int numVertices;			//!< The number of vertices (constant for each frame)
+   int numTexCoords;			//!< The number of texture coordinates
+   int numTriangles;			//!< The number of faces (polygons)
+   int numGlCommands;			//!< The number of gl commands
+   int numFrames;			//!< The number of animation frames
+   
+   int offsetSkins;			//!< The offset in the file for the skin data
+   int offsetTexCoords;			//!< The offset in the file for the texture data
+   int offsetTriangles;			//!< The offset in the file for the face data
+   int offsetFrames;			//!< The offset in the file for the frames data
+   int offsetGlCommands;		//!< The offset in the file for the gl commands data
+   int offsetEnd;			//!< The end of the file offset
+};
+
+
+//! This is used to store the vertices that are read in for the current frame directly from the file (compressed)
+struct tMd2AliasTriangle
+{
+   byte vertex[3];
+   byte lightNormalIndex;
+};
+
+//! This stores the normals and vertices for the frames (uncompressed)
+struct tMd2Triangle
+{
+   float vertex[3];
+   float normal[3];
+};
+
+//! This stores the indices into the vertex and texture coordinate arrays
+struct tMd2Face
+{
+   short vertexIndices[3];
+   short textureIndices[3];
+};
+
+//! This stores UV coordinates
+struct tMd2TexCoord
+{
+   short u, v;
+};
+
+//! This stores the animation scale, translation and name information for a frame, plus verts
+struct tMd2AliasFrame
+{
+   float scale[3];
+   float translate[3];
+   char name[16];
+   tMd2AliasTriangle aliasVertices[1];
+};
+
+//! This stores the frames vertices after they have been transformed
+struct tMd2Frame
+{
+   char strName[16];
+   tMd2Triangle *pVertices;
+};
+
+//! This stores a skin name
+typedef char tMd2Skin[64];
+
+typedef enum 
+  {
+    STAND,
+    RUN,
+    ATTACK,
+    PAIN_A,
+    PAIN_B,
+    PAIN_C,
+    JUMP,
+    FLIP,
+    SALUTE,
+    FALLBACK,
+    WAVE,
+    POINT,
+    CROUCH_STAND,
+    CROUCH_WALK,
+    CROUCH_ATTACK,
+    CROUCH_PAIN,
+    CROUCH_DEATH, 
+    DEATH_FALLBACK,
+    DEATH_FALLFORWARD,
+    DEATH_FALLBACKSLOW,
+    BOOM,
+  
+    MAX_ANIMATIONS
+  } animType;
+
+
+//! This is a MD2 Model class
+class MD2Model : public AbstractModel {
+
+public:
+  MD2Model();
+  virtual ~MD2Model();
+  
+  bool loadModel(const char* filename);
+  bool loadSkin(const char* filename);
+  
+  void drawModel(float time);
+  void drawFrame(int frame);
+  void draw();
+  
+  void setAnim(int type);
+  void scaleModel(float s);
+
+  void tick(float dtS);
+
+  void animate(/*float time*/);
+private:
+  void processLightning();
+  void interpolate(CVector3* vertlist);
+  void renderFrame();
+  float getCurrentTime(t3DModel *pModel, int nextFrame);
+
+  t3DModel* model;
+  float localTime;
+};
+
+/* forward definitions */
+class Material;
+
+
+//! A class that handles all of the loading code
+class MD2Loader : public BaseObject {
+
+public:
+  MD2Loader();
+  virtual ~MD2Loader();
+  
+  bool importMD2(t3DModel *pModel, char *fileName, char *texture = NULL);
+
+private:
+  void readMD2Data();
+  void parseAnimations(t3DModel *pModel);
+  void convertDataStructures(t3DModel *pModel);
+  void computeNormals(t3DModel *pModel);
+  void cleanUp();
+  
+  FILE *pFile;	
+  tMd2Header header;			      //!< The header data
+  tMd2Skin *pSkins;			      //!< The skin data
+  tMd2TexCoord *pTexCoords;		      //!< The texture coordinates
+  tMd2Face *pTriangles;			      //!< Face index information
+  tMd2Frame *pFrames;			      //!< The frames of animation (vertices)
+};
+
+
+//! This is a MD2 Model class
+class MD2Model2 : public AbstractModel {
+
+public:
+  MD2Model2();
+  virtual ~MD2Model2();
+  
+  bool loadModel(const char* filename);
+  bool loadSkin(const char* filename);
+  
+  void drawFrame(int frame);
+  void draw();
+  void draw2();
+  
+  void setAnim(int type);
+  void scaleModel(float scaleFactor) { this->scaleFactor = scaleFactor;}
+
+  void tick(float dtS);
+  void debug();
+
+
+private:
+  void animate();  
+  void processLighting();
+  void interpolate(sVec3D* verticesList);
+  void renderFrame();
+
+ public:
+  /* these variables are static, because they are all the same for every model */
+  static sVec3D anorms[NUM_VERTEX_NORMALS];
+  static float anormsDots[SHADEDOT_QUANT][256];
+  static sAnim animationList[21];
+
+ private:
+  int numFrames;
+  int numVertices;
+  int numTriangles;
+  int numGLCommands;
+  char* fileName;
+  tMd2Header* header;
+
+  sVec3D* pVertices;
+  int* pGLCommands;
+  int* pLightNormals;
+  glCommandVertex* pGLCommands2;
+
+  unsigned int textureID;
+  Material* material;
+  sAnimState animationState;
+  float scaleFactor;
+};
+
+
+
+
+
+#endif /* _MD2MODEL_H */
