Index: orxonox/trunk/src/lib/coord/null_parent.cc
===================================================================
--- orxonox/trunk/src/lib/coord/null_parent.cc	(revision 3564)
+++ orxonox/trunk/src/lib/coord/null_parent.cc	(revision 3565)
@@ -40,5 +40,5 @@
   printf("NullParent::NullParent() - making new NullParent, there can only be one..\n");
   this->parent = this;
-  this->mode = ALL;
+  this->mode = PNODE_ALL;
   this->setName("NullParent");
 }
@@ -49,5 +49,5 @@
   singletonRef = this;
   this->parent = this;
-  this->mode = ALL;
+  this->mode = PNODE_ALL;
   this->absCoordinate = *absCoordinate;
   this->setName("NullParent");
Index: orxonox/trunk/src/lib/coord/p_node.cc
===================================================================
--- orxonox/trunk/src/lib/coord/p_node.cc	(revision 3564)
+++ orxonox/trunk/src/lib/coord/p_node.cc	(revision 3565)
@@ -301,5 +301,5 @@
    use this to add a child to this node.
 */
-void PNode::addChild (PNode* pNode, parentingMode mode)
+void PNode::addChild (PNode* pNode, int parentingMode)
 {
   if( pNode->parent != NULL )
@@ -308,5 +308,5 @@
       pNode->parent->children->remove(pNode);
     }
-  pNode->mode = mode;
+  pNode->mode = parentingMode;
   pNode->parent = this;
   this->children->add(pNode);
@@ -360,7 +360,7 @@
    \param mode the mode of the bind-type.
 */
-void PNode::setMode (parentingMode mode)
-{
-  this->mode = mode;
+void PNode::setMode (int parentingMode)
+{
+  this->mode = parentingMode;
 }
 
@@ -370,5 +370,5 @@
    \return the mode of the bind-type.
 */
-parentingMode PNode::getMode()
+int PNode::getMode()
 {
   return this->mode;
@@ -411,56 +411,59 @@
   PRINTF(2)("PNode::update - %s - (%f, %f, %f)\n", this->objectName, this->absCoordinate.x, this->absCoordinate.y, this->absCoordinate.z);
   // printf("%s", this->objectName);
-
-      if( this->mode == MOVEMENT )
+  printf("%d:", this->mode);
+  if(this->mode & PNODE_MOVEMENT )
+    {
+      printf("4\n");
+      if( this->bAbsCoorChanged /*&& this->timeStamp != DataTank::timeStamp*/)
 	{
-	  if( this->bAbsCoorChanged /*&& this->timeStamp != DataTank::timeStamp*/)
+	  /* if you have set the absolute coordinates this overrides all other changes */
+	  this->relCoordinate = this->absCoordinate - parent->getAbsCoor ();
+	}
+      else if( this->bRelCoorChanged /*&& this->timeStamp != DataTank::timeStamp*/)
+	{
+	  /*this is bad style... must be deleted later - just for testing*/
+	  if( this->parent == NULL)
 	    {
-	      /* if you have set the absolute coordinates this overrides all other changes */
-	      this->relCoordinate = this->absCoordinate - parent->getAbsCoor ();
+	      this->absCoordinate = this->relCoordinate;
 	    }
-	  else if( this->bRelCoorChanged /*&& this->timeStamp != DataTank::timeStamp*/)
-	    {
-	      /*this is bad style... must be deleted later - just for testing*/
-	      if( this->parent == NULL)
-		{
-		this->absCoordinate = this->relCoordinate;
-		}
-	      else
-		this->absCoordinate = parent->getAbsCoor() + this->relCoordinate;	      /* update the current absCoordinate */
-	    }
+	  else
+	    this->absCoordinate = parent->getAbsCoor() + this->relCoordinate;	      /* update the current absCoordinate */
 	}
-      
-      if( this->mode == ROTATION || this->mode == ALL)
+    }
+  
+  if( this->mode & PNODE_LOCAL_ROTATE)
+    {
+      printf("1\n");
+      if( this->bAbsDirChanged /*&& this->timeStamp != DataTank::timeStamp*/)
 	{
-	  if( this->bAbsDirChanged /*&& this->timeStamp != DataTank::timeStamp*/)
-	    {
-	      /* if you have set the absolute coordinates this overrides all other changes */
-	      this->relDirection = this->absDirection - parent->getAbsDir();
-	    }
-	  else if( this->bRelDirChanged /*&& this->timeStamp != DataTank::timeStamp*/)
-	    {
-	      /* update the current absDirection - remember * means rotation around sth.*/
-	      this->absDirection = parent->getAbsDir() * this->relDirection;
-	    }
+	  /* if you have set the absolute coordinates this overrides all other changes */
+	  this->relDirection = this->absDirection - parent->getAbsDir();
 	}
-      
-      if( this->mode == ALL)
+      else if( this->bRelDirChanged /*&& this->timeStamp != DataTank::timeStamp*/)
 	{
-	  if( this->bAbsCoorChanged /*&& this->timeStamp != DataTank::timeStamp*/)
-	    {
-	      /* if you have set the absolute coordinates this overrides all other changes */
-	      this->relCoordinate = this->absCoordinate - parent->getAbsCoor ();
-	    }
-	  else if( this->bRelCoorChanged /*&& this->timeStamp != DataTank::timeStamp*/)
-	    {
-	      /*this is bad style... must be deleted later - just for testing*/
-	      if( this->parent == NULL)
-		this->absCoordinate = this->relCoordinate;
-	      else
-		this->absCoordinate = parent->getAbsCoor() + parent->getAbsDir().apply(this->relCoordinate);	      /* update the current absCoordinate */
-	    }
+	  /* update the current absDirection - remember * means rotation around sth.*/
+	  this->absDirection = parent->getAbsDir() * this->relDirection;
 	}
-
-
+    }
+  
+  if( this->mode & PNODE_ROTATE_MOVEMENT)
+    {
+      printf("2\n");
+      if( this->bAbsCoorChanged /*&& this->timeStamp != DataTank::timeStamp*/)
+	{
+	  /* if you have set the absolute coordinates this overrides all other changes */
+	  this->relCoordinate = this->absCoordinate - parent->getAbsCoor ();
+	}
+      else if( this->bRelCoorChanged /*&& this->timeStamp != DataTank::timeStamp*/)
+	{
+	  /*this is bad style... must be deleted later - just for testing*/
+	  if( this->parent == NULL)
+	    this->absCoordinate = this->relCoordinate;
+	  else
+	    this->absCoordinate = parent->getAbsCoor() + parent->getAbsDir().apply(this->relCoordinate);	      /* update the current absCoordinate */
+	}
+    }
+  
+  
   PNode* pn = this->children->enumerate();
   while( pn != NULL) 
Index: orxonox/trunk/src/lib/coord/p_node.h
===================================================================
--- orxonox/trunk/src/lib/coord/p_node.h	(revision 3564)
+++ orxonox/trunk/src/lib/coord/p_node.h	(revision 3565)
@@ -30,7 +30,15 @@
 
 //! enumeration for the different translation-binding-types
-typedef enum parentingMode {MOVEMENT = 0, ROTATION, ALL};
+//typedef enum parentingMode {PNODE_LOCAL_ROTATE, PNODE_ROTATE_MOVEMENT, PNODE_ALL, PNODE_MOVEMENT, PNODE_ROTATE_AND_MOVE};
+// linkage modes
+#define PNODE_LOCAL_ROTATE       1    //!< Rotates all the children around their centers.
+#define PNODE_ROTATE_MOVEMENT    2    //!< Moves all the children around the center of their parent, without the rotation around their own centers.
+#define PNODE_MOVEMENT           4    //!< Moves all children along with the parent.
+// special linkage modes
+#define PNODE_ALL                3    //!< Moves all children around the center of their parent, and also rotates their centers
+#define PNODE_ROTATE_AND_MOVE    5    //!< Rotates all children around their axis, and moves them as the Parent Moves, but does not rotate around the center of their parent.
+
 //! The default mode of the translation-binding.
-#define DEFAULT_MODE ALL
+#define DEFAULT_MODE PNODE_ALL
 
 //! Patent Node is a Engine to calculate the position of an Object in respect to the position of its parent.
@@ -63,5 +71,5 @@
 
   void addChild (PNode* pNode);
-  void addChild (PNode* pNode, parentingMode mode);
+  void addChild (PNode* pNode, int parentingMode);
   void removeChild (PNode* pNode);
   void remove();
@@ -71,6 +79,6 @@
   void parentCoorChanged ();
   void parentDirChanged ();
-  void setMode (parentingMode mode);
-  parentingMode getMode();
+  void setMode (int parentingMode);
+  int getMode();
 
   virtual void update ();
@@ -99,5 +107,5 @@
   Quaternion absDirection; //!< absolute direvtion in the world ( from (0,0,1) )
 
-  parentingMode mode;       //!< the mode of the binding
+  int mode;                //!< the mode of the binding
 
 };
Index: orxonox/trunk/src/story_entities/world.cc
===================================================================
--- orxonox/trunk/src/story_entities/world.cc	(revision 3564)
+++ orxonox/trunk/src/story_entities/world.cc	(revision 3565)
@@ -226,5 +226,5 @@
 	    this->skySphere->setName("SkySphere");
 	    this->localCamera->addChild(this->skySphere);
-	    this->skySphere->setMode(MOVEMENT);
+	    this->skySphere->setMode(PNODE_MOVEMENT);
 
 	    /*monitor progress*/
@@ -254,4 +254,5 @@
 	    //localCamera->setParent(TrackNode::getInstance());
 	    tn->addChild (this->localCamera);
+	    myPlayer->setMode(PNODE_ROTATE_AND_MOVE);
 	    //Vector* cameraOffset = new Vector (0, 5, -10);
 	    Vector* cameraOffset = new Vector (-10, 5, 0);
@@ -305,5 +306,5 @@
   glEndList();
 
-  terrain = new Terrain(TERRAIN_BENSCH);
+  terrain = new Terrain(TERRAIN_DAVE);
   this->spawn(terrain);
   // LIGHT initialisation
@@ -584,5 +585,5 @@
       this->display ();
 
-      for( int i = 0; i < 5000000; i++) {}
+      //      for( int i = 0; i < 5000000; i++) {}
       /* \todo this is to slow down the program for openGl Software emulator computers, reimplement*/
     }
@@ -736,5 +737,5 @@
 void World::spawn(WorldEntity* entity, PNode* parentNode, 
 		  Vector* relCoor, Quaternion* relDir, 
-		  parentingMode mode)
+		  int parentingMode)
 {
   this->nullParent = NullParent::getInstance();
Index: orxonox/trunk/src/story_entities/world.h
===================================================================
--- orxonox/trunk/src/story_entities/world.h	(revision 3564)
+++ orxonox/trunk/src/story_entities/world.h	(revision 3565)
@@ -54,5 +54,5 @@
   void spawn (WorldEntity* entity, Vector* absCoor, Quaternion* absDir);
   void spawn(WorldEntity* entity, PNode* parentNode, Vector* relCoor, Quaternion* relDir, 
-	     parentingMode mode);
+	     int parentingMode);
 
 
Index: orxonox/trunk/src/track_node.cc
===================================================================
--- orxonox/trunk/src/track_node.cc	(revision 3564)
+++ orxonox/trunk/src/track_node.cc	(revision 3565)
@@ -37,5 +37,5 @@
   NullParent::getInstance()->addChild(this);
   this->trackManager = TrackManager::getInstance();
-  this->setMode(ALL);
+  this->setMode(PNODE_ALL);
 }
 
@@ -45,5 +45,5 @@
   this->parent = NullParent::getInstance();
   this->trackManager = TrackManager::getInstance();
-  this->setMode(ALL);
+  this->setMode(PNODE_ALL);
   this->absCoordinate = *absCoordinate;
 }
Index: orxonox/trunk/src/world_entities/terrain.cc
===================================================================
--- orxonox/trunk/src/world_entities/terrain.cc	(revision 3564)
+++ orxonox/trunk/src/world_entities/terrain.cc	(revision 3565)
@@ -10,5 +10,5 @@
 
    ### File Specific:
-   main-programmer: ...
+   main-programmer: Benjamin Grauer
    co-programmer: ...
 */
