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); }