Index: orxonox/trunk/src/lib/particles/particle_emitter.cc
===================================================================
--- orxonox/trunk/src/lib/particles/particle_emitter.cc	(revision 4689)
+++ orxonox/trunk/src/lib/particles/particle_emitter.cc	(revision 4690)
@@ -113,5 +113,4 @@
 
 
-/* these are Animation interfaces: so you can change spec values as you want */
 
 /**
@@ -212,5 +211,5 @@
 
 /**
-   \brief sets the velocity of all particles emitted
+   \brief sets the initial velocity of all particles emitted
    \param velocity The starting velocity of the emitted particles
    \param randomVelocity A random starting velocity, the +- randomness of this option
@@ -223,4 +222,15 @@
   this->velocity = velocity;
   this->randomVelocity = randomVelocity;
+}
+
+/**
+   \brief sets the initial Momentum of all particles emitted
+   \param momentum the new Momentum (just a float for being not too complicated).
+   \param randomMomentum variation from the given value.
+ */
+void ParticleEmitter::setEmissionMomentum(float momentum, float randomMomentum)
+{
+  this->momentum = momentum;
+  this->momentumRandom = randomMomentum;
 }
 
@@ -233,5 +243,4 @@
    you may want to use the animation class
 */
-
 void ParticleEmitter::tick(float dt, ParticleSystem* system)
 {
@@ -244,32 +253,39 @@
 
     if (likely(count > 0))
+    {
+      Vector inheritVelocity = this->getVelocity() * this->inheritSpeed;
+      for (int i = 0; i < count; i++)
+          // emmits from EMITTER_DOT,
       {
-        Vector inheritVelocity = this->getVelocity() * this->inheritSpeed;
-        for (int i = 0; i < count; i++)
-          // emmits from EMITTER_DOT,
-          {
-            Vector randDir = Vector(rand()-RAND_MAX/2, rand()-RAND_MAX/2, rand()-RAND_MAX/2);
-            randDir.normalize();
-            randDir = (this->getAbsDir()*Quaternion(angle + randomAngle *((float)rand()/RAND_MAX -.5), randDir)).apply(this->direction);
-            Vector velocityV = randDir.getNormalized()*this->velocity + inheritVelocity;
+        Vector randDir = Vector(rand()-RAND_MAX/2, rand()-RAND_MAX/2, rand()-RAND_MAX/2);
+        randDir.normalize();
+        randDir = (this->getAbsDir()*Quaternion(angle + randomAngle *((float)rand()/RAND_MAX -.5), randDir)).apply(this->direction);
+        Vector velocityV = randDir.getNormalized()*this->velocity + inheritVelocity;
 
             // this should spread the Particles evenly. if the Emitter is moved around quickly
-            Vector equalSpread = this->getVelocity() * rand()/RAND_MAX * dt;
-            Vector extension; // the Vector for different fields.
-
-            if (this->type & 2)
-              {
-                extension = Vector(this->emitterSize * ((float)rand()/RAND_MAX -.5), 0, this->emitterSize * ((float)rand()/RAND_MAX - .5));
-                extension = this->getAbsDir().apply(extension);
-              }
-            else if (this->type & 8)
-              {
-                extension = Vector((float)rand()/RAND_MAX -.5, (float)rand()/RAND_MAX -.5, (float)rand()/RAND_MAX -.5) * this->emitterSize;
-              }
-
-            system->addParticle(this->getAbsCoor() + extension - equalSpread, velocityV);
-
-          }
+        Vector equalSpread = this->getVelocity() * rand()/RAND_MAX * dt;
+        Vector extension; // the Vector for different fields.
+
+        if (this->type & 2)
+        {
+          extension = Vector(this->emitterSize * ((float)rand()/RAND_MAX -.5), 0, this->emitterSize * ((float)rand()/RAND_MAX - .5));
+          extension = this->getAbsDir().apply(extension);
+        }
+        else if (this->type & 8)
+        {
+          extension = Vector((float)rand()/RAND_MAX -.5, (float)rand()/RAND_MAX -.5, (float)rand()/RAND_MAX -.5) * this->emitterSize;
+        }
+
+
+        // ROTATIONAL CALCULATION (this must not be done for all types of particles.)
+        randDir = Vector(rand()-RAND_MAX/2, rand()-RAND_MAX/2, rand()-RAND_MAX/2);
+        randDir.normalize();
+        Quaternion orient = Quaternion(M_PI, randDir);
+        Quaternion moment = Quaternion(this->momentum + this->momentumRandom, randDir);
+
+        system->addParticle(this->getAbsCoor() + extension - equalSpread, velocityV, orient, moment);
+
       }
+    }
   }
 }
Index: orxonox/trunk/src/lib/particles/particle_emitter.h
===================================================================
--- orxonox/trunk/src/lib/particles/particle_emitter.h	(revision 4689)
+++ orxonox/trunk/src/lib/particles/particle_emitter.h	(revision 4690)
@@ -46,4 +46,5 @@
   void setSpread(float angle, float randomAngle = 0.0);
   void setEmissionVelocity(float velocity, float randomVelocity = 0.0);
+  void setEmissionMomentum(float momentum, float randomMomentum = 0.0);
 
   /** \returns the type of the emitter */
@@ -61,13 +62,14 @@
   /** \returns the EmissionVelocity of the emitter */
   inline float getEmissionVelocity(void) const { return this->velocity; };
+  /** \returns the EmissionMomentum of this emitter */
+  inline float getEmissionMomentum(void) const { return this->momentum; };
 
   void debug(void) const;
 
-
  private:
-  EMITTER_TYPE    type;              //!< The type of emitter this is
-  float           emitterSize;       //!< The size of the emitter (not for EMITTER_DOT)
-  float           inheritSpeed;      //!< How much speed the particle inherits from the Emitters speed \todo move this to the emitter
-  Vector          direction;         //!< emition direction
+  EMITTER_TYPE    type;              //!< The type of emitter this is.
+  float           emitterSize;       //!< The size of the emitter (not for EMITTER_DOT).
+  float           inheritSpeed;      //!< How much speed the particle inherits from the Emitters speed.
+  Vector          direction;         //!< emition direction.
   float           angle;             //!< max angle from the direction of the emitter
   float           randomAngle;       //!< random emission angle (angle +- angleRandom is the emitted angle.
@@ -75,4 +77,6 @@
   float           velocity;          //!< the initial speed of a Particles.
   float           randomVelocity;    //!< the random variation from the initial Speed.
+  float           momentum;          //!< The Initial spped of the Rotation.
+  float           momentumRandom;    //!< The random variation of the Momentum.
 
   float           saveTime;          //!< The time that was missing by the last Tick (otherwise there would be no emission when framefate is too big).
Index: orxonox/trunk/src/lib/particles/particle_system.cc
===================================================================
--- orxonox/trunk/src/lib/particles/particle_system.cc	(revision 4689)
+++ orxonox/trunk/src/lib/particles/particle_system.cc	(revision 4690)
@@ -485,9 +485,11 @@
 /**
    \brief adds a new Particle to the System
-   \param position the position where the particle gets emitted.
-   \param velocity the Starting velocity of the particle.
+   \param position the initial position, where the particle gets emitted.
+   \param velocity the initial velocity of the particle.
+   \param orientation the initial orientation of the Paritcle.
+   \param momentum the initial momentum of the Particle (the speed of its rotation).
    \param data some more data given by the emitter
 */
-void ParticleSystem::addParticle(const Vector& position, const Vector& velocity, unsigned int data)
+void ParticleSystem::addParticle(const Vector& position, const Vector& velocity, const Quaternion& orientation, const Quaternion& momentum, unsigned int data)
 {
   if (this->count <= this->maxCount)
@@ -530,6 +532,6 @@
       particles->velocity = velocity;
 
-      particles->orientation = Quaternion(.4, velocity.getNormalized());
-      particles->momentum = Quaternion(.4, velocity.getNormalized());
+      particles->orientation = orientation;
+      particles->momentum = momentum;
 
       //  particle->rotation = ; //! \todo rotation is once again something to be done.
Index: orxonox/trunk/src/lib/particles/particle_system.h
===================================================================
--- orxonox/trunk/src/lib/particles/particle_system.h	(revision 4689)
+++ orxonox/trunk/src/lib/particles/particle_system.h	(revision 4690)
@@ -109,5 +109,5 @@
   virtual void tickPhys(float dt) {};
 
-  void addParticle(const Vector& position, const Vector& velocity, unsigned int data = 0);
+  void addParticle(const Vector& position, const Vector& velocity, const Quaternion& orientation, const Quaternion& momentum, unsigned int data = 0);
 
   virtual void tick(float dt);
