Exemple #1
0
        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);
            }
        }
Exemple #2
0
        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);
            }
        }
Exemple #3
0
        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);
            }
        }