Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
ParticleUpdaters.cs
Go to the documentation of this file.
1 using System;
2 using SiliconStudio.Paradox.Games;
3 using SiliconStudio.Paradox.Games.Mathematics;
4 using SiliconStudio.Paradox.Particles;
5 
6 namespace ScriptTest
7 {
9  {
10  Random rand = new Random();
11 
12  public void Update(ParticleSystem particleSystem, float dt)
13  {
14  var velocityField = particleSystem.GetOrCreateField(ParticleFields.Velocity);
15 
16  // No more than 1000 particles
17  if (particleSystem.ParticleCount < 1000)
18  {
19  var particle = particleSystem.AddParticle();
20 
21  // Default random velocity, going upward
22  particle.Set(velocityField, new Vector3((float)rand.NextDouble() * 30.0f - 15.0f, (float)rand.NextDouble() * 30.0f - 15.0f, (float)rand.NextDouble() * 50.0f));
23  }
24  }
25  }
26 
28  {
29  /// <summary>Particle field storing the particle current lifetime (age).</summary>
31 
32  public float Lifetime { get; set; }
33 
34  public RemoveOldParticles(float lifetime)
35  {
36  Lifetime = lifetime;
37  }
38 
39  public unsafe void Update(ParticleSystem particleSystem, float dt)
40  {
41  var lifetimeField = particleSystem.GetOrCreateField(LifetimeField);
42 
43  // Iterate over particles
44  var particleEnumerator = particleSystem.GetEnumerator();
45  while (particleEnumerator.MoveNext())
46  {
47  var particle = particleEnumerator.Current;
48  var lifetime = (float*)particle[lifetimeField];
49 
50  // Remove particle through enumerator.
51  // Enumerator will be valid again in next loop.
52  if ((*lifetime += dt) > Lifetime)
53  particleEnumerator.RemoveParticle();
54  }
55  }
56  }
57 
59  {
60  public unsafe void Update(ParticleSystem particleSystem, float dt)
61  {
62  var accelerationField = particleSystem.GetOrCreateField(ParticleFields.Acceleration);
63 
64  foreach (var particle in particleSystem)
65  {
66  var acceleration = (Vector3*)particle[accelerationField];
67  *acceleration = new Vector3(0.0f);
68  }
69  }
70  }
71 
72  public class Gravity : IParticlePlugin
73  {
74  public Vector3 GravityForce { get; set; }
75 
76  public Gravity()
77  {
78  GravityForce = new Vector3(0.0f, 0.0f, -9.81f);
79  }
80 
81  public unsafe void Update(ParticleSystem particleSystem, float dt)
82  {
83  var accelerationField = particleSystem.GetOrCreateField(ParticleFields.Acceleration);
84 
85  foreach (var particle in particleSystem)
86  {
87  var acceleration = (Vector3*)particle[accelerationField];
88  *acceleration += GravityForce;
89  }
90  }
91  }
92 
94  {
95  public unsafe void Update(ParticleSystem particleSystem, float dt)
96  {
97  var accelerationField = particleSystem.GetOrCreateField(ParticleFields.Acceleration);
98  var velocityField = particleSystem.GetOrCreateField(ParticleFields.Velocity);
99 
100  foreach (var particle in particleSystem)
101  {
102  var position = (Vector3*)particle[particleSystem.Position];
103  var acceleration = (Vector3*)particle[accelerationField];
104  var velocity = (Vector3*)particle[velocityField];
105  *velocity += *acceleration * dt;
106  *position += *velocity * dt;
107  }
108  }
109  }
110 }
A particle plugin that can updates or process particles.
static readonly ParticleFieldDescription< float > LifetimeField
Particle field storing the particle current lifetime (age).
A particle system, containing particles and their updaters.
int ParticleCount
Gets the particle count.
unsafe void Update(ParticleSystem particleSystem, float dt)
unsafe void Update(ParticleSystem particleSystem, float dt)
unsafe void Update(ParticleSystem particleSystem, float dt)
void Update(ParticleSystem particleSystem, float dt)
unsafe void Update(ParticleSystem particleSystem, float dt)
SiliconStudio.Core.Mathematics.Vector3 Vector3
Describes a field for a particle, which can store specific data for every particle.