private void Explosion(float[] org) { cparticle_t p; for (int i = 0; i < 256; i++) { p = new cparticle_t(); p.time = Time() * 1F; p.color = 223 - (Lib.Rand() & 7); for (int j = 0; j < 3; j++) { p.org[j] = org[j] + (float)(Lib.Rand() % 32) - 16; p.vel[j] = (float)(Lib.Rand() % 384) - 192; } p.accel[0] = p.accel[1] = 0; p.accel[2] = -PARTICLE_GRAVITY; p.alpha = 1F; p.alphavel = -0.8F / (0.5F + ( float )Globals.rnd.NextDouble() * 0.3F); active_particles.AddLast(p); } }
private void RailTrail(float[] start, float[] end) { float[] move = new float[] { 0, 0, 0 }; float[] vec = new float[] { 0, 0, 0 }; float len; int j; cparticle_t p; float dec; float[] right = new float[] { 0, 0, 0 }; float[] up = new float[] { 0, 0, 0 }; int i; float d, c, s; float[] dir = new float[] { 0, 0, 0 }; Math3D.VectorCopy(start, move); Math3D.VectorSubtract(end, start, vec); len = Math3D.VectorNormalize(vec); Math3D.MakeNormalVectors(vec, right, up); for (i = 0; i < len; i++) { p = new cparticle_t(); p.time = Time(); Math3D.VectorClear(p.accel); d = i * 0.1F; c = (float)Math.Cos(d); s = (float)Math.Sin(d); Math3D.VectorScale(right, c, dir); Math3D.VectorMA(dir, s, up, dir); p.alpha = 1F; p.alphavel = -1F / (1 + ( float )Globals.rnd.NextDouble() * 0.2F); p.color = 0x74 + (Lib.Rand() & 7); for (j = 0; j < 3; j++) { p.org[j] = move[j] + dir[j] * 3; p.vel[j] = dir[j] * 6; } Math3D.VectorAdd(move, vec, move); active_particles.Add(p); } dec = 0.75F; Math3D.VectorScale(vec, dec, vec); Math3D.VectorCopy(start, move); while (len > 0) { len -= dec; p = new cparticle_t(); p.time = Time(); Math3D.VectorClear(p.accel); p.alpha = 1F; p.alphavel = -1F / (0.6F + ( float )Globals.rnd.NextDouble() * 0.2F); p.color = 0x0 + Lib.Rand() & 15; for (j = 0; j < 3; j++) { p.org[j] = move[j] + Lib.Crand() * 3; p.vel[j] = Lib.Crand() * 3; p.accel[j] = 0; } Math3D.VectorAdd(move, vec, move); active_particles.Add(p); } }
private void Heatbeam(float[] start, float[] forward) { float[] v_up = new float[] { 0, 0, 10 }; float[] v_right = new float[] { 0, 10, 0 }; float[] move = new float[] { 0, 0, 0 }; float[] vec = new float[] { 0, 0, 0 }; float len; int j; cparticle_t p; float[] right = new float[] { 0, 0, 0 }; float[] up = new float[] { 0, 0, 0 }; int i; float c, s; float[] dir = new float[] { 0, 0, 0 }; float ltime; float step = 32F, rstep; float start_pt; float rot; float variance; float[] end = new float[] { 0, 0, 0 }; Math3D.VectorMA(start, 4096, forward, end); Math3D.VectorCopy(start, move); Math3D.VectorSubtract(end, start, vec); len = Math3D.VectorNormalize(vec); Math3D.VectorCopy(v_right, right); Math3D.VectorCopy(v_up, up); Math3D.VectorMA(move, -0.5F, right, move); Math3D.VectorMA(move, -0.5F, up, move); ltime = (float)Time() / 1000F; start_pt = (ltime * 96F) % step; Math3D.VectorMA(move, start_pt, vec, move); Math3D.VectorScale(vec, step, vec); rstep = (float)Math.PI / 10F; for (i = (int)start_pt; i < len; i += step) { if (i > step * 5) { break; } for (rot = 0; rot < Math.PI * 2; rot += rstep) { p = new cparticle_t(); p.time = Time(); Math3D.VectorClear(p.accel); variance = 0.5F; c = (float)Math.Cos(rot) * variance; s = (float)Math.Sin(rot) * variance; if (i < 10) { Math3D.VectorScale(right, c * (i / 10F), dir); Math3D.VectorMA(dir, s * (i / 10F), up, dir); } else { Math3D.VectorScale(right, c, dir); Math3D.VectorMA(dir, s, up, dir); } p.alpha = 0.8F; p.alphavel = -1000F; p.color = 0x74 - (Lib.Rand() & 7); for (j = 0; j < 3; j++) { p.org[j] = move[j] + dir[j] * 3; p.vel[j] = 0; } active_particles.Add(p); } Math3D.VectorAdd(move, vec, move); } }