void InitializeEmitter(ParticleEmitter emitter)
        {
            emitter.positionData = new Texture2D(GFX.Device, emitter.GetTextureSize(), emitter.GetTextureSize(), 1, TextureUsage.None, SurfaceFormat.Vector4);
            emitter.velocityData = new Texture2D(GFX.Device, emitter.GetTextureSize(), emitter.GetTextureSize(), 1, TextureUsage.None, SurfaceFormat.Vector4);

            ParticleEffect effect = emitter.GetParticleEffect();

            int sizeSquared = emitter.GetTextureSize() * emitter.GetTextureSize();

            Vector3 emitPos = emitter.Transformation.GetPosition();

            Vector4[] initPosition = new Vector4[sizeSquared];
            for (int i = 0; i < initPosition.Length; i++)
            {
                Vector3 offset = new Vector3(effect.offsetParameters.X, effect.offsetParameters.Y, effect.offsetParameters.Z) * new Vector3((float)(rand.NextDouble() * 2.0 - 1.0), (float)(rand.NextDouble() * 2.0 - 1.0), (float)(rand.NextDouble() * 2.0 - 1.0));
                offset *= effect.offsetParameters.W;
                offset = Vector3.TransformNormal(offset, emitter.Transformation.GetTransform());
                initPosition[i] = new Vector4(emitPos + offset, effect.lifetime * (float)rand.NextDouble());

            }

            Vector4[] initVelocity = new Vector4[sizeSquared];
            for (int i = 0; i < initVelocity.Length; i++)
            {
                Vector3 randVel = effect.initialDirection * effect.initialSpeed + Vector3.One * effect.initialSpeedVariance * (float)(rand.NextDouble() * 2.0 - 1.0);
                randVel = Vector3.TransformNormal(randVel, emitter.Transformation.GetTransform());
                float randMass = effect.mass + effect.massVariance * (float)(rand.NextDouble() * 2.0 - 1.0);
                initVelocity[i] = new Vector4(randVel, randMass);
            }

            emitter.positionData.SetData<Vector4>(initPosition);
            emitter.velocityData.SetData<Vector4>(initVelocity);
        }