Exemplo n.º 1
0
        public override void OnAdd(Scene scene)
        {
            Vector3 randPosition = Vector3.Zero;
            Vector3 randNormal = Vector3.Zero;
            randomHelper.NextDouble();
            scene.MainTerrain.GenerateRandomTransform(randomHelper, out randPosition, out randNormal);

            physicsState.position = randPosition;

            tracerEmitter = new ParticleEmitter(tracerEffect, 8);
            scene.Entities.Add(tracerEmitter);
            tracerEmitter.OnAdd(scene);

            boundingBox = new BoundingBox();
            float size = tracerEmitter.GetTextureSize();
            boundingBox.Min = randPosition - Vector3.One * Vector3.Up * size;
            boundingBox.Min.X -= (size);// / 2.0f);
            boundingBox.Min.Z -= (size); // 2.0f);
            boundingBox.Max = randPosition + Vector3.One * Vector3.Up * size;
            boundingBox.Max.X += (size); // 2.0f);
            boundingBox.Max.Z += (size); // 2.0f);

            base.OnAdd(scene);
        }
        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);
        }