Пример #1
0
 public void RegisterEffect(string name, EmitterData data)
 {
     Emitters[name] = new ParticleEmitter(Components, name, Components.RootComponent, Matrix.Identity, data);
     Emitters[name].DepthSort = false;
     Emitters[name].Tint = Color.White;
     Emitters[name].FrustrumCull = false;
 }
                public override void initBurstParticle(Emitter emitter, Particle particle)
                {
                    ParticleImpl particleImpl = (ParticleImpl)particle;
                    float        dt           = 0;
                    EmitterData  emitterData  = (EmitterData)emitter.data();

                    GeneratorPeriodic generator     = (GeneratorPeriodic)emitter.generator();
                    GeneratorImpl     generatorImpl = (GeneratorImpl)generator.impl();

                    particleImpl._lifetime = 0F;
                    _math.vec3 value_ = _math.vec3_(0F, 0F, 0F);
                    particleImpl._Position = _math.applyv3quat_(value_, emitter.rotation());
                    particleImpl._Position = _math.addv3_(particleImpl._Position, emitter.position());
                    float rnd_     = 0F + emitter.random()() * (1F - 0F);
                    float _path_in = _math.clamp_(rnd_, 0, 1);

                    _math.PathRes _path_srch = _math.pathRes(0, (_path_in - 0F) * 1F);
                    _math.vec2    _path_pos;
                    _math.pathLerp1(out _path_pos, this._path[_path_srch.s], _path_srch.i);
                    _math.vec3 conv3d_ = _math.vec3_(_path_pos.x, _path_pos.y, 0F);
                    particleImpl._Velocity = _math.applyv3quat_(conv3d_, emitter.rotation());
                    particleImpl._Velocity = _math.addv3_(particleImpl._Velocity, emitter.velocity());
                    float rnd_a = 0F + emitter.random()() * (360F - 0F);

                    particleImpl._Angle = rnd_a;
                    float rnd_b = 0F + emitter.random()() * (4F - 0F);

                    particleImpl._Tex__index = rnd_b;
                    float rnd_c = -180F + emitter.random()() * (180F - -180F);

                    particleImpl._Rot__speed = rnd_c;
                    particle.position_       = particleImpl._Position;
                }
                public override void initBurstParticle(Emitter emitter, Particle particle)
                {
                    ParticleImpl particleImpl = (ParticleImpl)particle;
                    float        dt           = 0;
                    EmitterData  emitterData  = (EmitterData)emitter.data();

                    GeneratorPeriodic generator     = (GeneratorPeriodic)emitter.generator();
                    GeneratorImpl     generatorImpl = (GeneratorImpl)generator.impl();

                    particleImpl._lifetime = 0F;
                    _math.vec3 value_ = _math.vec3_(0F, 0F, 0F);
                    particleImpl._Position = _math.addv3_(value_, emitter.position());
                    float rnd_ = 100F + emitter.random()() * (500F - 100F);

                    _math.vec3 randvec_ = _math.randv3gen_(rnd_, emitter.random());
                    particleImpl._Velocity = randvec_;
                    particleImpl._Angle    = 0F;
                    float rnd_a = 10F + emitter.random()() * (20F - 10F);

                    particleImpl._Size = rnd_a;
                    float rnd_b = 0F + emitter.random()() * (1F - 0F);

                    particleImpl._Color = rnd_b;
                    particle.position_  = particleImpl._Position;
                }
Пример #4
0
            public override void updateParticle(Emitter emitter, Particle particle, float dt)
            {
                ParticleImpl particleImpl = (ParticleImpl)particle;
                EmitterData  emitterData  = (EmitterData)emitter.data();

                GeneratorPeriodic generator     = (GeneratorPeriodic)emitter.generator();
                GeneratorImpl     generatorImpl = (GeneratorImpl)generator.impl();
                bool toTerminate = false;

                particleImpl._lifetime += dt;
                _math.vec3 move_ = _math.addv3_(particleImpl._Position, _math.mulv3scalar_(particleImpl._Velocity, dt));
                particleImpl._Position = move_;
                particle.position_     = particleImpl._Position;
                float value_ = 2F;

                toTerminate |= (particleImpl._lifetime > value_);
                toTerminate |= TermPath.intersectTree(particleImpl.prevPosition_,
                                                      _math.vec2_(particle.position_.x, particle.position_.y), _term_path);
                float value_a = 10F;

                particleImpl.size1_ = value_a;
                if (toTerminate)
                {
                    particle.dead_ = true;
                }
            }
Пример #5
0
            public override void updateParticle(Emitter emitter, Particle particle, float dt)
            {
                ParticleImpl particleImpl = (ParticleImpl)particle;
                EmitterData  emitterData  = (EmitterData)emitter.data();

                GeneratorPeriodic generator     = (GeneratorPeriodic)emitter.generator();
                GeneratorImpl     generatorImpl = (GeneratorImpl)generator.impl();

                particleImpl._lifetime += dt;
                _math.vec3 noise_a = _math.mulv3scalar_(_math.vec3_(100F, 50F, 30F), emitter.effect().time());
                _math.addv3(out noise_a, noise_a, particleImpl._Position);
                _math.vec3 noise_i = _math.mulv3scalar_(noise_a, 1.0F / 1000F);
                _math.vec3 noise   = _math.noisePixelLinear3_(noise_i);
                _math.mulv3(out noise, noise, _math.vec3_(0.0078125F, 0.0078125F, 0.0078125F));
                _math.addv3(out noise, noise, _math.vec3_(-1F, -1F, -1F));
                _math.mulv3scalar(out noise, noise, 200F);
                _math.vec3 fmove_fs = noise;
                _math.vec3 fmove_vs = _math.vec3_(0F, 0F, 0F);
                _math.vec3 fmove_v  = _math.addv3_(particleImpl._Velocity, _math.mulv3scalar_(fmove_fs, dt));
                _math.vec3 fmove_p  = _math.mulv3scalar_(fmove_v, dt);
                _math.addv3(out fmove_p, fmove_p, particleImpl._Position);
                particleImpl._Position = fmove_p;
                particleImpl._Velocity = fmove_v;
                particle.position_     = particleImpl._Position;
                float value_ = 2F;

                if (particleImpl._lifetime > value_)
                {
                    particle.dead_ = true;
                }
                float value_a = 10F;

                particleImpl.size1_ = value_a;
            }
                public override void updateParticle(Emitter emitter, Particle particle, float dt)
                {
                    ParticleImpl particleImpl = (ParticleImpl)particle;
                    EmitterData  emitterData  = (EmitterData)emitter.data();

                    GeneratorPeriodic generator     = (GeneratorPeriodic)emitter.generator();
                    GeneratorImpl     generatorImpl = (GeneratorImpl)generator.impl();

                    particleImpl._lifetime += dt;
                    particle.position_      = particleImpl._Position;
                    ((Emitter_Sparks.EmitterData)particleImpl.attachedEmitters_[0].emitter_.data())._Color1 = emitterData._SparksColor1;
                    ((Emitter_Sparks.EmitterData)particleImpl.attachedEmitters_[0].emitter_.data())._Color2 = emitterData._SparksColor2;
                    particleImpl.attachedEmitters_[0].emitter_.update(dt, particle.position_, null);
                    float value_ = 0.3F;

                    if (particleImpl._lifetime > value_)
                    {
                        particle.dead_ = true;
                        particleImpl.attachedEmitters_[0].emitter_.stop();
                    }
                    float value_a = 100F;
                    float expr_   = (particleImpl._lifetime / value_);
                    float _plot_out;
                    float _plot_in0 = (expr_ < 0F?0F:(expr_ > 1F?1F:expr_));

                    _math.PathRes _plot_srch0 = _plot_in0 < 0.0292826?_math.pathRes(0, (_plot_in0 - 0F) * 34.15F):_math.pathRes(1, (_plot_in0 - 0.0292826F) * 15.4525F);
                    _math.funcLerp(out _plot_out, this._plot[0][_plot_srch0.s], _plot_srch0.i);
                    float expr_a = (value_a * _plot_out);

                    particleImpl.size1_ = expr_a;
                    particleImpl.color_ = emitterData._Color;
                }
                public override void updateParticle(Emitter emitter, Particle particle, float dt)
                {
                    ParticleImpl particleImpl = (ParticleImpl)particle;
                    EmitterData  emitterData  = (EmitterData)emitter.data();

                    GeneratorPeriodic generator     = (GeneratorPeriodic)emitter.generator();
                    GeneratorImpl     generatorImpl = (GeneratorImpl)generator.impl();

                    particleImpl._lifetime += dt;
                    _math.vec3 value_    = _math.vec3_(0F, -100F, 0F);
                    _math.vec3 fmove_fs  = value_;
                    _math.vec3 fmove_vs  = _math.vec3_(0F, 0F, 0F);
                    float      fmove_dtl = dt;

                    _math.vec3 fmove_v = particleImpl._Velocity;
                    _math.vec3 fmove_p = particleImpl._Position;
                    while (fmove_dtl > 0.0001F)
                    {
                        float      fmove_dtp = fmove_dtl;
                        _math.vec3 fmove_fsd = fmove_fs;
                        _math.vec3 fmove_rw  = _math.subv3_(fmove_vs, fmove_v);
                        float      fmove_rwl = _math.lengthv3sq_(fmove_rw);
                        if (fmove_rwl > 0.0001F)
                        {
                            fmove_rwl = (float)Math.Sqrt(fmove_rwl);
                            _math.vec3 fmove_rwn = _math.divv3scalar_(fmove_rw, fmove_rwl);
                            float      fmove_df  = 0.01F * 0.3F * fmove_rwl;
                            if (fmove_df * fmove_dtp > 0.2F)
                            {
                                fmove_dtp = 0.2F / fmove_df;
                            }
                            _math.addv3(out fmove_fsd, fmove_fsd, _math.mulv3scalar_(fmove_rwn, fmove_rwl * fmove_df));
                        }
                        _math.addv3(out fmove_v, fmove_v, _math.mulv3scalar_(fmove_fsd, fmove_dtp));
                        _math.addv3(out fmove_p, fmove_p, _math.mulv3scalar_(fmove_v, fmove_dtp));
                        fmove_dtl -= fmove_dtp;
                    }
                    particleImpl._Position = fmove_p;
                    particleImpl._Velocity = fmove_v;
                    particle.position_     = particleImpl._Position;
                    if (particleImpl._lifetime > particleImpl._Max_Life)
                    {
                        particle.dead_ = true;
                    }
                    float value_a = 30F;

                    _math.vec3 expr_  = _math.addv3_(particleImpl._Color, _math.mulv3scalar_(_math.subv3_(emitterData._Color2, particleImpl._Color), particleImpl._Colora));
                    float      expr_a = (particleImpl._lifetime / particleImpl._Max_Life);
                    float      _plota_out;
                    float      _plota_in0 = (expr_a < 0F?0F:(expr_a > 1F?1F:expr_a));

                    _math.PathRes _plota_srch0 = _plota_in0 < 0.79269?_math.pathRes(0, (_plota_in0 - 0F) * 1.26153F):_math.pathRes(1, (_plota_in0 - 0.79269F) * 4.82369F);
                    _math.funcLerp(out _plota_out, this._plota[0][_plota_srch0.s], _plota_srch0.i);
                    particleImpl.size1_ = value_a;
                    particleImpl.color_ = expr_;
                    particleImpl.alpha_ = _plota_out;
                }
Пример #8
0
            public override void updateParticle(Emitter emitter, Particle particle, float dt)
            {
                ParticleImpl particleImpl = (ParticleImpl)particle;
                EmitterData  emitterData  = (EmitterData)emitter.data();

                GeneratorPeriodic generator     = (GeneratorPeriodic)emitter.generator();
                GeneratorImpl     generatorImpl = (GeneratorImpl)generator.impl();

                particleImpl._lifetime += dt;
                _math.vec3 value_    = _math.vec3_(0F, 100F, 0F);
                _math.vec3 fmove_fs  = value_;
                _math.vec3 fmove_vs  = _math.vec3_(0F, 0F, 0F);
                float      fmove_dtl = dt;

                _math.vec3 fmove_v = particleImpl._Velocity;
                _math.vec3 fmove_p = particleImpl._Position;
                while (fmove_dtl > 0.0001F)
                {
                    float      fmove_dtp = fmove_dtl;
                    _math.vec3 fmove_fsd = fmove_fs;
                    _math.vec3 fmove_rw  = _math.subv3_(fmove_vs, fmove_v);
                    float      fmove_rwl = _math.lengthv3sq_(fmove_rw);
                    if (fmove_rwl > 0.0001F)
                    {
                        fmove_rwl = (float)Math.Sqrt(fmove_rwl);
                        _math.vec3 fmove_rwn = _math.divv3scalar_(fmove_rw, fmove_rwl);
                        float      fmove_df  = 0.01F * 1F * fmove_rwl;
                        if (fmove_df * fmove_dtp > 0.2F)
                        {
                            fmove_dtp = 0.2F / fmove_df;
                        }
                        _math.addv3(out fmove_fsd, fmove_fsd, _math.mulv3scalar_(fmove_rwn, fmove_rwl * fmove_df));
                    }
                    _math.addv3(out fmove_v, fmove_v, _math.mulv3scalar_(fmove_fsd, fmove_dtp));
                    _math.addv3(out fmove_p, fmove_p, _math.mulv3scalar_(fmove_v, fmove_dtp));
                    fmove_dtl -= fmove_dtp;
                }
                particleImpl._Position = fmove_p;
                particleImpl._Velocity = fmove_v;
                particle.position_     = particleImpl._Position;
                float value_a = 2F;

                if (particleImpl._lifetime > value_a)
                {
                    particle.dead_ = true;
                }
                float value_b = 30F;

                particleImpl.size1_ = value_b;
            }
        public override void Activate(object source, CogData data)
        {
            if (data != null && data.ObjectData != null)
            {
                // VectorData will always be available even if it's a (0, 0) value
                EmitterData ed         = data.ObjectData as EmitterData;
                GameObject  projectile = CreateInstance(ed.TemplateObject);
                Rigidbody2D phys       = projectile.GetComponent <Rigidbody2D>();

                projectile.transform.position = ed.Position;
                phys.AddForce(ed.Magnitude, ForceMode2D.Impulse);
                // TODO: Need to attach the context to the projectile somehow
            }

            base.Activate(source, data);
        }
Пример #10
0
            public override void initParticle(Emitter emitter, Particle particle)
            {
                ParticleImpl particleImpl = (ParticleImpl)particle;
                float        dt           = 0;
                EmitterData  emitterData  = (EmitterData)emitter.data();

                GeneratorPeriodic generator     = (GeneratorPeriodic)emitter.generator();
                GeneratorImpl     generatorImpl = (GeneratorImpl)generator.impl();

                particleImpl._lifetime = 0F;
                _math.vec3 value_ = _math.vec3_(0F, 0F, 0F);
                particleImpl._Position = _math.addv3_(value_, emitter.position());
                _math.vec3 randvec_ = _math.randv3gen_(0F, emitter.random());
                particleImpl._Velocity = randvec_;
                particleImpl._Angle    = 0F;
                particle.position_     = particleImpl._Position;
            }
                public override void initBurstParticle(Emitter emitter, Particle particle)
                {
                    ParticleImpl particleImpl = (ParticleImpl)particle;
                    float        dt           = 0;
                    EmitterData  emitterData  = (EmitterData)emitter.data();

                    GeneratorPeriodic generator     = (GeneratorPeriodic)emitter.generator();
                    GeneratorImpl     generatorImpl = (GeneratorImpl)generator.impl();

                    particleImpl._lifetime = 0F;
                    _math.vec3 value_ = _math.vec3_(0F, 0F, 0F);
                    particleImpl._Position = _math.addv3_(value_, emitter.position());
                    particleImpl._Angle    = 0F;
                    particle.position_     = particleImpl._Position;
                    particleImpl.attachedEmitters_[0].emitter_.reset(particle.position_, null);
                    particleImpl.attachedEmitters_[0].emitter_.start();
                    ((Emitter_Sparks.EmitterData)particleImpl.attachedEmitters_[0].emitter_.data())._Color1 = emitterData._SparksColor1;
                    ((Emitter_Sparks.EmitterData)particleImpl.attachedEmitters_[0].emitter_.data())._Color2 = emitterData._SparksColor2;
                }
Пример #12
0
        private void UpdateParticleEmitter(KSPParticleEmitter pe)
        {
            var factor = _ts.scalingFactor;

            if (!_scales.ContainsKey(pe))
            {
                _scales[pe] = new EmitterData(pe);
            }
            var ed = _scales[pe];

            pe.minSize = ed.minSize * factor.absolute.linear;
            pe.maxSize = ed.maxSize * factor.absolute.linear;
            pe.shape1D = ed.shape1D * factor.absolute.linear;
            pe.shape2D = ed.shape2D * factor.absolute.linear;
            pe.shape3D = ed.shape3D * factor.absolute.linear;

            pe.force = ed.force * factor.absolute.linear;

            pe.localVelocity = ed.localVelocity * factor.absolute.linear;
        }
Пример #13
0
        void UpdateParticleEmitter(KSPParticleEmitter pe)
        {
            if (pe == null)
            {
                return;
            }
            if (!orig_scales.ContainsKey(pe))
            {
                orig_scales[pe] = new EmitterData(pe);
            }
            var ed = orig_scales[pe];

            pe.minSize       = ed.MinSize * scale;
            pe.maxSize       = ed.MaxSize * scale;
            pe.shape1D       = ed.Shape1D * scale;
            pe.shape2D       = ed.Shape2D * scale;
            pe.shape3D       = ed.Shape3D * scale;
            pe.force         = ed.Force * scale;
            pe.localVelocity = ed.LocalVelocity * scale;
        }
Пример #14
0
            public override void initBurstParticle(Emitter emitter, Particle particle)
            {
                ParticleImpl particleImpl = (ParticleImpl)particle;
                float        dt           = 0;
                EmitterData  emitterData  = (EmitterData)emitter.data();

                GeneratorPeriodic generator     = (GeneratorPeriodic)emitter.generator();
                GeneratorImpl     generatorImpl = (GeneratorImpl)generator.impl();

                particleImpl._lifetime = 0F;
                _math.vec3 value_ = _math.vec3_(0F, 0F, 0F);
                particleImpl._Position = _math.applyv3quat_(value_, emitter.rotation());
                particleImpl._Position = _math.addv3_(particleImpl._Position, emitter.position());
                particleImpl._Angle    = 0F;
                float rnd_ = 5F + emitter.random()() * (30F - 5F);

                particleImpl._Size = rnd_;
                float rnd_a = 0F + emitter.random()() * (1F - 0F);

                _math.vec3 _plot_out;
                float      _plot_in0 = (rnd_a < 0F?0F:(rnd_a > 0.9F?0.9F:rnd_a));

                _math.PathRes _plot_srch0 = _plot_in0 < 0.6?_plot_in0 < 0.3?_math.pathRes(0, (_plot_in0 - 0F) * 3.33333F):_math.pathRes(1, (_plot_in0 - 0.3F) * 3.33333F):_math.pathRes(2, (_plot_in0 - 0.6F) * 3.33333F);
                _math.funcLerp(out _plot_out.x, this._plot[0][_plot_srch0.s], _plot_srch0.i);
                float _plot_in1 = (rnd_a < 0F?0F:(rnd_a > 0.6F?0.6F:rnd_a));

                _math.PathRes _plot_srch1 = _plot_in1 < 0.3?_math.pathRes(0, (_plot_in1 - 0F) * 3.33333F):_math.pathRes(1, (_plot_in1 - 0.3F) * 3.33333F);
                _math.funcLerp(out _plot_out.y, this._plot[1][_plot_srch1.s], _plot_srch1.i);
                float _plot_in2 = (rnd_a < 0F?0F:(rnd_a > 0.9F?0.9F:rnd_a));

                _math.PathRes _plot_srch2 = _plot_in2 < 0.6?_plot_in2 < 0.3?_math.pathRes(0, (_plot_in2 - 0F) * 3.33333F):_math.pathRes(1, (_plot_in2 - 0.3F) * 3.33333F):_math.pathRes(2, (_plot_in2 - 0.6F) * 3.33333F);
                _math.funcLerp(out _plot_out.z, this._plot[2][_plot_srch2.s], _plot_srch2.i);
                particleImpl._Color = _plot_out;
                float rnd_b = 0F + emitter.random()() * (800F - 0F);

                _math.vec3 randvec_ = _math.randv3gen_(rnd_b, emitter.random());
                particleImpl._Velocity = _math.applyv3quat_(randvec_, emitter.rotation());
                particleImpl._Velocity = _math.addv3_(particleImpl._Velocity, emitter.velocity());
                particle.position_     = particleImpl._Position;
            }
Пример #15
0
                public override void initBurstParticle(Emitter emitter, Particle particle)
                {
                    ParticleImpl particleImpl = (ParticleImpl)particle;
                    float        dt           = 0;
                    EmitterData  emitterData  = (EmitterData)emitter.data();

                    GeneratorPeriodic generator     = (GeneratorPeriodic)emitter.generator();
                    GeneratorImpl     generatorImpl = (GeneratorImpl)generator.impl();

                    particleImpl._lifetime = 0F;
                    _math.vec3 value_ = _math.vec3_(0F, 0F, 0F);
                    particleImpl._Position = _math.applyv3quat_(value_, emitter.rotation());
                    particleImpl._Position = _math.addv3_(particleImpl._Position, emitter.position());
                    particleImpl._Angle    = 0F;
                    float rnd_ = 0F + emitter.random()() * (5F - 0F);

                    particleImpl._Tex__index = rnd_;
                    _math.vec3 randvec_ = _math.randv3gen_(100F, emitter.random());
                    particleImpl._Velocity = _math.applyv3quat_(randvec_, emitter.rotation());
                    particleImpl._Velocity = _math.addv3_(particleImpl._Velocity, emitter.velocity());
                    particle.position_     = particleImpl._Position;
                }
                public override void updateParticle(Emitter emitter, Particle particle, float dt)
                {
                    ParticleImpl particleImpl = (ParticleImpl)particle;
                    EmitterData  emitterData  = (EmitterData)emitter.data();

                    GeneratorPeriodic generator     = (GeneratorPeriodic)emitter.generator();
                    GeneratorImpl     generatorImpl = (GeneratorImpl)generator.impl();

                    particleImpl._lifetime += dt;
                    float move_ = particleImpl._Angle + particleImpl._Rot__speed * dt;

                    particleImpl._Angle = move_;
                    particle.position_  = particleImpl._Position;
                    float value_ = 4F;

                    if (particleImpl._lifetime > value_)
                    {
                        particle.dead_ = true;
                    }
                    float value_a = 120F;
                    float expr_   = (particleImpl._lifetime / value_);
                    float _plot_out;
                    float _plot_in0 = (expr_ < 0F?0F:(expr_ > 1F?1F:expr_));

                    _math.PathRes _plot_srch0 = _math.pathRes(0, (_plot_in0 - 0F) * 15F);
                    _math.funcLerp(out _plot_out, this._plot[0][_plot_srch0.s], _plot_srch0.i);
                    float expr_a = (value_a * _plot_out);

                    _math.vec3 expr_b = _math.addv3_(emitterData._Color1, _math.mulv3scalar_(_math.subv3_(emitterData._Color2, emitterData._Color1), particleImpl._Color));
                    float      _plota_out;
                    float      _plota_in0 = (expr_ < 0F?0F:(expr_ > 1F?1F:expr_));

                    _math.PathRes _plota_srch0 = _plota_in0 < 0.4?_math.pathRes(0, (_plota_in0 - 0F) * 2.5F):_math.pathRes(1, (_plota_in0 - 0.4F) * 1.66667F);
                    _math.funcLerp(out _plota_out, this._plota[0][_plota_srch0.s], _plota_srch0.i);
                    particleImpl.size1_ = expr_a;
                    particleImpl.color_ = expr_b;
                    particleImpl.alpha_ = _plota_out;
                }
                public override void initBurstParticle(Emitter emitter, Particle particle)
                {
                    ParticleImpl particleImpl = (ParticleImpl)particle;
                    float        dt           = 0;
                    EmitterData  emitterData  = (EmitterData)emitter.data();

                    GeneratorPeriodic generator     = (GeneratorPeriodic)emitter.generator();
                    GeneratorImpl     generatorImpl = (GeneratorImpl)generator.impl();

                    particleImpl._lifetime = 0F;
                    _math.vec3 value_ = _math.vec3_(0F, 0F, 0F);
                    particleImpl._Position = _math.addv3_(value_, emitter.position());
                    float rnd_ = 0F + emitter.random()() * (360F - 0F);

                    particleImpl._Angle = rnd_;
                    float rnd_a = 0F + emitter.random()() * (1F - 0F);

                    particleImpl._Color = rnd_a;
                    float rnd_b = 0F + emitter.random()() * (-90F - 0F);

                    particleImpl._Rot__speed = rnd_b;
                    particle.position_       = particleImpl._Position;
                }
            public override void updateParticle(Emitter emitter, Particle particle, float dt)
            {
                ParticleImpl particleImpl = (ParticleImpl)particle;
                EmitterData  emitterData  = (EmitterData)emitter.data();

                GeneratorPeriodic generator     = (GeneratorPeriodic)emitter.generator();
                GeneratorImpl     generatorImpl = (GeneratorImpl)generator.impl();

                particleImpl._lifetime += dt;
                _math.vec3 move_ = _math.addv3_(particleImpl._Position, _math.mulv3scalar_(particleImpl._Velocity, dt));
                particleImpl._Position = move_;
                particle.position_     = particleImpl._Position;
                float value_ = 2F;

                if (particleImpl._lifetime > value_)
                {
                    particle.dead_ = true;
                }
                float value_a = 30F;

                particleImpl.size1_ = value_a;
                particleImpl.color_ = emitterData._Color;
            }
                public override void initBurstParticle(Emitter emitter, Particle particle)
                {
                    ParticleImpl particleImpl = (ParticleImpl)particle;
                    float        dt           = 0;
                    EmitterData  emitterData  = (EmitterData)emitter.data();

                    GeneratorPeriodic generator     = (GeneratorPeriodic)emitter.generator();
                    GeneratorImpl     generatorImpl = (GeneratorImpl)generator.impl();

                    particleImpl._lifetime = 0F;
                    float rnd_ = 1F + emitter.random()() * (3F - 1F);

                    particleImpl._Max_Life = rnd_;
                    _math.vec3 value_ = _math.vec3_(0F, 0F, 0F);
                    particleImpl._Position = _math.addv3_(value_, emitter.position());
                    float rnd_a = 0F + emitter.random()() * (1F - 0F);
                    float _plot_out;
                    float _plot_in0 = (rnd_a < 0F?0F:(rnd_a > 1F?1F:rnd_a));

                    _math.PathRes _plot_srch0 = _math.pathRes(0, (_plot_in0 - 0F) * 15F);
                    _math.funcLerp(out _plot_out, this._plot[0][_plot_srch0.s], _plot_srch0.i);
                    float _path_in = _math.clamp_(_plot_out, 0, 1);

                    _math.PathRes _path_srch = _math.pathRes(0, (_path_in - 0F) * 1F);
                    _math.vec2    _path_pos;
                    _math.pathLerp1(out _path_pos, this._path[_path_srch.s], _path_srch.i);
                    _math.vec3 conv3d_ = _math.vec3_(_path_pos.x, _path_pos.y, 0F);
                    particleImpl._Velocity = _math.applyv3quat_(conv3d_, emitter.rotation());
                    particleImpl._Velocity = _math.addv3_(particleImpl._Velocity, emitter.velocity());
                    particleImpl._Angle    = 0F;
                    particleImpl._Color    = emitterData._Color1;
                    float rnd_b = 0F + emitter.random()() * (1F - 0F);

                    particleImpl._Colora = rnd_b;
                    particle.position_   = particleImpl._Position;
                }
Пример #20
0
            public override void initBurstParticle(Emitter emitter, Particle particle)
            {
                ParticleImpl particleImpl = (ParticleImpl)particle;
                float        dt           = 0;
                EmitterData  emitterData  = (EmitterData)emitter.data();

                GeneratorPeriodic generator     = (GeneratorPeriodic)emitter.generator();
                GeneratorImpl     generatorImpl = (GeneratorImpl)generator.impl();

                particleImpl._lifetime = 0F;
                float rnd_     = 0F + emitter.random()() * (1F - 0F);
                float _path_in = _math.clamp_(rnd_, 0, 1);

                _math.PathRes _path_srch = _path_in < 0.495668?_math.pathRes(0, (_path_in - 0F) * 2.01748F):_math.pathRes(1, (_path_in - 0.495668F) * 1.98282F);
                _math.vec2    _path_pos;
                _math.pathLerp1(out _path_pos, this._path[_path_srch.s], _path_srch.i);
                _math.vec3 conv3d_ = _math.vec3_(_path_pos.x, _path_pos.y, 0F);
                particleImpl._Position = _math.addv3_(conv3d_, emitter.position());
                _math.vec3 randvec_ = _math.randv3gen_(100F, emitter.random());
                particleImpl._Velocity = randvec_;
                particleImpl._Angle    = 0F;
                particle.position_     = particleImpl._Position;
                _math.setv2(out particleImpl.prevPosition_, particle.position_.x, particle.position_.y);
            }
Пример #21
0
        private void UpdateParticleEmitter(KSPParticleEmitter pe)
        {
            if (pe == null)
            {
                return;
            }
            ScalingFactor factor = _ts.ScalingFactor;

            if (!_scales.ContainsKey(pe))
            {
                _scales[pe] = new EmitterData(pe);
            }
            EmitterData ed = _scales[pe];

            pe.minSize = ed.MinSize * factor.absolute.linear;
            pe.maxSize = ed.MaxSize * factor.absolute.linear;
            pe.shape1D = ed.Shape1D * factor.absolute.linear;
            pe.shape2D = ed.Shape2D * factor.absolute.linear;
            pe.shape3D = ed.Shape3D * factor.absolute.linear;

            pe.force = ed.Force * factor.absolute.linear;

            pe.localVelocity = ed.LocalVelocity * factor.absolute.linear;
        }
Пример #22
0
        /// <summary>
        /// Creates all the static particle emitters used in the game.
        /// </summary>
        public void CreateParticles()
        {
            ParticleManager = new ParticleManager(ComponentManager);

            // Smoke
            EmitterData puff = ParticleManager.CreatePuffLike("puff", new SpriteSheet(ContentPaths.Particles.puff), Point.Zero, BlendState.AlphaBlend);
            ParticleManager.RegisterEffect("puff", puff);

            // Bubbles
            EmitterData bubble = ParticleManager.CreatePuffLike("splash2", new SpriteSheet(ContentPaths.Particles.splash2), Point.Zero, BlendState.AlphaBlend);
            bubble.ConstantAccel = new Vector3(0, 5, 0);
            bubble.EmissionSpeed = 3;
            bubble.LinearDamping = 0.9f;
            bubble.GrowthSpeed = -2.5f;
            bubble.MinScale = 1.5f;
            bubble.MaxScale = 2.5f;
            bubble.ParticleDecay = 1.5f;
            bubble.HasLighting = false;
            ParticleManager.RegisterEffect("splash2", bubble);

            EmitterData splat = ParticleManager.CreatePuffLike("splat", new SpriteSheet(ContentPaths.Particles.splat), Point.Zero, BlendState.AlphaBlend);
            splat.ConstantAccel = Vector3.Zero;
            splat.EmissionRadius = 0.01f;
            splat.EmissionSpeed = 0.0f;
            splat.GrowthSpeed = -1.75f;
            splat.MinAngle = -0.0f;
            splat.MaxAngle = 0.0f;
            splat.MinAngular = -0.01f;
            splat.MaxAngular = 0.01f;
            splat.MaxParticles = 500;
            splat.MinScale = 0.05f;
            splat.ParticleDecay = 1.5f;
            splat.HasLighting = false;
            splat.MaxScale = 1.1f;
            splat.EmitsLight = false;
            ParticleManager.RegisterEffect("splat", splat);

            EmitterData heart = ParticleManager.CreatePuffLike("heart", new SpriteSheet(ContentPaths.Particles.heart),
                Point.Zero, BlendState.AlphaBlend);
            heart.MinAngle = 0.01f;
            heart.MaxAngle = 0.01f;
            heart.MinAngular = 0.0f;
            heart.MinAngular = 0.0f;
            heart.ConstantAccel = Vector3.Up * 20;
            ParticleManager.RegisterEffect("heart", heart);

            // Fire
            SpriteSheet fireSheet = new SpriteSheet(ContentPaths.Particles.more_flames, 32, 32);
            EmitterData flame = ParticleManager.CreatePuffLike("flame", fireSheet, Point.Zero, BlendState.AlphaBlend);
            flame.ConstantAccel = Vector3.Up*20;
            flame.EmissionSpeed = 2;
            flame.GrowthSpeed = -1.9f;
            flame.MinAngle = -0.2f;
            flame.MaxAngle = 0.2f;
            flame.MinAngular = -0.01f;
            flame.MaxAngular = 0.01f;
            flame.MaxParticles = 500;
            flame.MinScale = 0.2f;
            flame.HasLighting = false;
            flame.MaxScale = 2.0f;
            flame.EmitsLight = true;
            flame.Blend = new BlendState()
            {
                AlphaSourceBlend = Blend.One,
                AlphaDestinationBlend = Blend.InverseSourceAlpha,
                ColorDestinationBlend = Blend.InverseSourceAlpha,
                ColorSourceBlend = Blend.One
            };
            ParticleManager.RegisterEffect("flame", flame, flame.Clone(fireSheet, new Point(1, 0)), flame.Clone(fireSheet, new Point(2, 0)), flame.Clone(fireSheet, new Point(3, 0)));

            EmitterData greenFlame = ParticleManager.CreatePuffLike("green_flame", new SpriteSheet(ContentPaths.Particles.green_flame), new Point(0, 0), BlendState.Additive);
            greenFlame.ConstantAccel = Vector3.Up * 20;
            greenFlame.EmissionSpeed = 2;
            greenFlame.GrowthSpeed = -1.9f;
            greenFlame.MinAngle = -0.2f;
            greenFlame.MaxAngle = 0.2f;
            greenFlame.MinAngular = -0.01f;
            greenFlame.MaxAngular = 0.01f;
            greenFlame.HasLighting = false;

            ParticleManager.RegisterEffect("green_flame", greenFlame);

            List<Point> frm2 = new List<Point>
            {
                new Point(0, 0)
            };

            // Leaves
            EmitterData testData2 = new EmitterData
            {
                Animation = new Animation(GraphicsDevice, new SpriteSheet(ContentPaths.Particles.leaf), "leaf", 32, 32, frm2, true, Color.White, 1.0f, 1.0f, 1.0f, false),
                ConstantAccel = new Vector3(0, -10, 0),
                LinearDamping = 0.95f,
                AngularDamping = 0.99f,
                EmissionFrequency = 1.0f,
                EmissionRadius = 2.0f,
                EmissionSpeed = 5.0f,
                GrowthSpeed = -0.5f,
                MaxAngle = 3.14159f,
                MinAngle = 0.0f,
                MaxParticles = 1000,
                MaxScale = 0.5f,
                MinScale = 0.1f,
                MinAngular = -5.0f,
                MaxAngular = 5.0f,
                ParticleDecay = 0.5f,
                ParticlesPerFrame = 0,
                Sleeps = true,
                ReleaseOnce = true,
                CollidesWorld = true,
                Texture = TextureManager.GetTexture(ContentPaths.Particles.leaf)
            };

            ParticleManager.RegisterEffect("Leaves", testData2);

            // Various resource explosions
            ParticleManager.CreateGenericExplosion(ContentPaths.Particles.dirt_particle, "dirt_particle");
            EmitterData stars = ParticleManager.CreatePuffLike( "star_particle", new SpriteSheet(ContentPaths.Particles.star_particle), new Point(0, 0),  BlendState.Additive);
            stars.MinAngle = -0.1f;
            stars.MaxAngle = 0.1f;
            stars.MinScale = 0.2f;
            stars.MaxScale = 0.5f;
            stars.AngularDamping = 0.99f;
            stars.LinearDamping = 0.999f;
            stars.GrowthSpeed = -0.8f;
            stars.EmissionFrequency = 5;
            stars.CollidesWorld = false;
            stars.HasLighting = false;

            ParticleManager.RegisterEffect("star_particle", stars);

            ParticleManager.CreateGenericExplosion(ContentPaths.Particles.stone_particle, "stone_particle");
            ParticleManager.CreateGenericExplosion(ContentPaths.Particles.sand_particle, "sand_particle");
            ParticleManager.CreateGenericExplosion(ContentPaths.Particles.dirt_particle, "dirt_particle");

            SpriteSheet bloodSheet = new SpriteSheet(ContentPaths.Particles.gibs, 32, 32);
            // Blood explosion
               // ParticleEmitter b = ParticleManager.CreateGenericExplosion(ContentPaths.Particles.blood_particle, "blood_particle").Emitters[0];
            EmitterData b = ParticleManager.CreateExplosionLike("blood_particle", bloodSheet, Point.Zero, BlendState.AlphaBlend);
            b.MinScale = 0.75f;
            b.MaxScale = 1.0f;
            b.Damping = 0.1f;
            b.GrowthSpeed = -0.8f;
            b.RotatesWithVelocity = true;

            ParticleManager.RegisterEffect("blood_particle", b);
            ParticleManager.RegisterEffect("gibs",  b.Clone(bloodSheet, new Point(1, 0)), b.Clone(bloodSheet, new Point(2, 0)), b.Clone(bloodSheet, new Point(3, 0)));
        }
Пример #23
0
        private void UpdateParticleEmitter(KSPParticleEmitter pe)
        {
            var factor = _ts.scalingFactor;

            if (!_scales.ContainsKey(pe))
            {
                _scales[pe] = new EmitterData(pe);
            }
            var ed = _scales[pe];

            pe.minSize = ed.minSize * factor.absolute.linear;
            pe.maxSize = ed.maxSize * factor.absolute.linear;
            pe.shape1D = ed.shape1D * factor.absolute.linear;
            pe.shape2D = ed.shape2D * factor.absolute.linear;
            pe.shape3D = ed.shape3D * factor.absolute.linear;

            pe.force = ed.force * factor.absolute.linear;

            pe.localVelocity = ed.localVelocity * factor.absolute.linear;
        }
Пример #24
0
 public override void updateEmitter(Emitter emitter)
 {
     EmitterData       emitterData   = (EmitterData)emitter.data();
     GeneratorPeriodic generator     = (GeneratorPeriodic)emitter.generator();
     GeneratorImpl     generatorImpl = (GeneratorImpl)generator.impl();
 }
                public override void updateParticle(Emitter emitter, Particle particle, float dt)
                {
                    ParticleImpl particleImpl = (ParticleImpl)particle;
                    EmitterData  emitterData  = (EmitterData)emitter.data();

                    GeneratorPeriodic generator     = (GeneratorPeriodic)emitter.generator();
                    GeneratorImpl     generatorImpl = (GeneratorImpl)generator.impl();

                    particleImpl._lifetime += dt;
                    _math.vec3 value_    = _math.vec3_(0F, -300F, 0F);
                    _math.vec3 fmove_fs  = value_;
                    _math.vec3 fmove_vs  = _math.vec3_(0F, 0F, 0F);
                    float      fmove_dtl = dt;

                    _math.vec3 fmove_v = particleImpl._Velocity;
                    _math.vec3 fmove_p = particleImpl._Position;
                    while (fmove_dtl > 0.0001F)
                    {
                        float      fmove_dtp = fmove_dtl;
                        _math.vec3 fmove_fsd = fmove_fs;
                        _math.vec3 fmove_rw  = _math.subv3_(fmove_vs, fmove_v);
                        float      fmove_rwl = _math.lengthv3sq_(fmove_rw);
                        if (fmove_rwl > 0.0001F)
                        {
                            fmove_rwl = (float)Math.Sqrt(fmove_rwl);
                            _math.vec3 fmove_rwn = _math.divv3scalar_(fmove_rw, fmove_rwl);
                            float      fmove_df  = 0.01F * 1F * fmove_rwl;
                            if (fmove_df * fmove_dtp > 0.2F)
                            {
                                fmove_dtp = 0.2F / fmove_df;
                            }
                            _math.addv3(out fmove_fsd, fmove_fsd, _math.mulv3scalar_(fmove_rwn, fmove_rwl * fmove_df));
                        }
                        _math.addv3(out fmove_v, fmove_v, _math.mulv3scalar_(fmove_fsd, fmove_dtp));
                        _math.addv3(out fmove_p, fmove_p, _math.mulv3scalar_(fmove_v, fmove_dtp));
                        fmove_dtl -= fmove_dtp;
                    }
                    particleImpl._Position = fmove_p;
                    particleImpl._Velocity = fmove_v;
                    float move_ = particleImpl._Angle + particleImpl._Rot__speed * dt;

                    particleImpl._Angle = move_;
                    particle.position_  = particleImpl._Position;
                    float value_a = 2F;

                    if (particleImpl._lifetime > value_a)
                    {
                        particle.dead_ = true;
                    }
                    float value_b = 30F;
                    float _plot_out;
                    float _plot_in0 = (particleImpl._lifetime < 0F?0F:(particleImpl._lifetime > 1F?1F:particleImpl._lifetime));

                    _math.PathRes _plot_srch0 = _math.pathRes(0, (_plot_in0 - 0F) * 1F);
                    _math.funcLerp(out _plot_out, this._plot[0][_plot_srch0.s], _plot_srch0.i);
                    float expr_  = (value_b * _plot_out);
                    float expr_a = (particleImpl._lifetime / value_a);
                    float _plota_out;
                    float _plota_in0 = (expr_a < 0F?0F:(expr_a > 1F?1F:expr_a));

                    _math.PathRes _plota_srch0 = _math.pathRes(0, (_plota_in0 - 0F) * 1F);
                    _math.funcLerp(out _plota_out, this._plota[0][_plota_srch0.s], _plota_srch0.i);
                    particleImpl.size1_ = expr_;
                    particleImpl.alpha_ = _plota_out;
                }
Пример #26
0
                public override void updateParticle(Emitter emitter, Particle particle, float dt)
                {
                    ParticleImpl particleImpl = (ParticleImpl)particle;
                    EmitterData  emitterData  = (EmitterData)emitter.data();

                    GeneratorPeriodic generator     = (GeneratorPeriodic)emitter.generator();
                    GeneratorImpl     generatorImpl = (GeneratorImpl)generator.impl();

                    particleImpl._lifetime += dt;
                    _math.vec3 value_  = _math.vec3_(0F, 400F, 0F);
                    _math.vec3 noise_a = _math.mulv3scalar_(_math.vec3_(100F, 50F, 30F), emitter.effect().time());
                    _math.addv3(out noise_a, noise_a, particleImpl._Position);
                    _math.vec3 noise_i = _math.mulv3scalar_(noise_a, 1.0F / 1000F);
                    _math.vec3 noise   = _math.noisePixelLinear3_(noise_i);
                    _math.mulv3(out noise, noise, _math.vec3_(0.0078125F, 0.0078125F, 0.0078125F));
                    _math.addv3(out noise, noise, _math.vec3_(-1F, -1F, -1F));
                    _math.mulv3scalar(out noise, noise, 200F);
                    _math.vec3 fmove_fs = value_;
                    _math.addv3(out fmove_fs, fmove_fs, noise);
                    _math.vec3 fmove_vs  = _math.vec3_(0F, 0F, 0F);
                    float      fmove_dtl = dt;

                    _math.vec3 fmove_v = particleImpl._Velocity;
                    _math.vec3 fmove_p = particleImpl._Position;
                    while (fmove_dtl > 0.0001F)
                    {
                        float      fmove_dtp = fmove_dtl;
                        _math.vec3 fmove_fsd = fmove_fs;
                        _math.vec3 fmove_rw  = _math.subv3_(fmove_vs, fmove_v);
                        float      fmove_rwl = _math.lengthv3sq_(fmove_rw);
                        if (fmove_rwl > 0.0001F)
                        {
                            fmove_rwl = (float)Math.Sqrt(fmove_rwl);
                            _math.vec3 fmove_rwn = _math.divv3scalar_(fmove_rw, fmove_rwl);
                            float      fmove_df  = 0.01F * 1F * fmove_rwl;
                            if (fmove_df * fmove_dtp > 0.2F)
                            {
                                fmove_dtp = 0.2F / fmove_df;
                            }
                            _math.addv3(out fmove_fsd, fmove_fsd, _math.mulv3scalar_(fmove_rwn, fmove_rwl * fmove_df));
                        }
                        _math.addv3(out fmove_v, fmove_v, _math.mulv3scalar_(fmove_fsd, fmove_dtp));
                        _math.addv3(out fmove_p, fmove_p, _math.mulv3scalar_(fmove_v, fmove_dtp));
                        fmove_dtl -= fmove_dtp;
                    }
                    particleImpl._Position = fmove_p;
                    float value_a = 1.5F;
                    float expr_   = (particleImpl._lifetime / value_a);
                    float _plot_out;
                    float _plot_in0 = (expr_ < 0F?0F:(expr_ > 1F?1F:expr_));

                    _math.PathRes _plot_srch0 = _math.pathRes(0, (_plot_in0 - 0F) * 15F);
                    _math.funcLerp(out _plot_out, this._plot[0][_plot_srch0.s], _plot_srch0.i);
                    float move_ = particleImpl._Angle + _plot_out * dt;

                    particleImpl._Angle    = move_;
                    particleImpl._Velocity = fmove_v;
                    particle.position_     = particleImpl._Position;
                    if (particleImpl._lifetime > value_a)
                    {
                        particle.dead_ = true;
                    }
                    float value_b = 40F;
                    float _plota_out;
                    float _plota_in0 = (expr_ < 0F?0F:(expr_ > 1F?1F:expr_));

                    _math.PathRes _plota_srch0 = _plota_in0 < 0.2?_math.pathRes(0, (_plota_in0 - 0F) * 75F):_math.pathRes(1, (_plota_in0 - 0.2F) * 18.75F);
                    _math.funcLerp(out _plota_out, this._plota[0][_plota_srch0.s], _plota_srch0.i);
                    float expr_a = (value_b * _plota_out);
                    float _plotb_out;
                    float _plotb_in0 = (expr_ < 0F?0F:(expr_ > 1F?1F:expr_));

                    _math.PathRes _plotb_srch0 = _plotb_in0 < 0.1?_math.pathRes(0, (_plotb_in0 - 0F) * 10F):_math.pathRes(1, (_plotb_in0 - 0.1F) * 16.6667F);
                    _math.funcLerp(out _plotb_out, this._plotb[0][_plotb_srch0.s], _plotb_srch0.i);
                    particleImpl.size1_ = expr_a;
                    particleImpl.alpha_ = _plotb_out;
                }
Пример #27
0
                public override void updateParticle(Emitter emitter, Particle particle, float dt)
                {
                    ParticleImpl particleImpl = (ParticleImpl)particle;
                    EmitterData  emitterData  = (EmitterData)emitter.data();

                    GeneratorPeriodic generator     = (GeneratorPeriodic)emitter.generator();
                    GeneratorImpl     generatorImpl = (GeneratorImpl)generator.impl();

                    particleImpl._lifetime += dt;
                    _math.vec3 value_  = _math.vec3_(0F, 800F, 0F);
                    _math.vec3 noise_a = _math.mulv3scalar_(_math.vec3_(100F, 50F, 30F), emitter.effect().time());
                    _math.addv3(out noise_a, noise_a, particleImpl._Position);
                    _math.vec3 noise_i = _math.mulv3scalar_(noise_a, 1.0F / 1000F);
                    _math.vec3 noise   = _math.noisePixelLinear3_(noise_i);
                    _math.mulv3(out noise, noise, _math.vec3_(0.0078125F, 0.0078125F, 0.0078125F));
                    _math.addv3(out noise, noise, _math.vec3_(-1F, -1F, -1F));
                    _math.mulv3scalar(out noise, noise, 1200F);
                    _math.vec3 fmove_fs = value_;
                    _math.addv3(out fmove_fs, fmove_fs, noise);
                    _math.vec3 fmove_vs  = _math.vec3_(0F, 0F, 0F);
                    float      fmove_dtl = dt;

                    _math.vec3 fmove_v = particleImpl._Velocity;
                    _math.vec3 fmove_p = particleImpl._Position;
                    while (fmove_dtl > 0.0001F)
                    {
                        float      fmove_dtp = fmove_dtl;
                        _math.vec3 fmove_fsd = fmove_fs;
                        _math.vec3 fmove_rw  = _math.subv3_(fmove_vs, fmove_v);
                        float      fmove_rwl = _math.lengthv3sq_(fmove_rw);
                        if (fmove_rwl > 0.0001F)
                        {
                            fmove_rwl = (float)Math.Sqrt(fmove_rwl);
                            _math.vec3 fmove_rwn = _math.divv3scalar_(fmove_rw, fmove_rwl);
                            float      fmove_df  = 0.01F * 1F * fmove_rwl;
                            if (fmove_df * fmove_dtp > 0.2F)
                            {
                                fmove_dtp = 0.2F / fmove_df;
                            }
                            _math.addv3(out fmove_fsd, fmove_fsd, _math.mulv3scalar_(fmove_rwn, fmove_rwl * fmove_df));
                        }
                        _math.addv3(out fmove_v, fmove_v, _math.mulv3scalar_(fmove_fsd, fmove_dtp));
                        _math.addv3(out fmove_p, fmove_p, _math.mulv3scalar_(fmove_v, fmove_dtp));
                        fmove_dtl -= fmove_dtp;
                    }
                    particleImpl._Position = fmove_p;
                    particleImpl._Velocity = fmove_v;
                    particle.position_     = particleImpl._Position;
                    if (particleImpl._lifetime > particleImpl._Max_Life)
                    {
                        particle.dead_ = true;
                    }
                    _math.vec2 value_a = _math.vec2_(6F, 6F);
                    float      _plot_out;
                    float      _plot_in0 = (particleImpl._lifetime < 0F?0F:(particleImpl._lifetime > 1.35236F?(0F + ((particleImpl._lifetime - 0F) % 1.35236F)):particleImpl._lifetime));

                    _math.PathRes _plot_srch0 = _plot_in0 < 0.739748?_plot_in0 < 0.4?_plot_in0 < 0.1?_math.pathRes(0, (_plot_in0 - 0F) * 10F):_math.pathRes(1, (_plot_in0 - 0.1F) * 3.33333F):_plot_in0 < 0.558348?_math.pathRes(2, (_plot_in0 - 0.4F) * 6.3152F):_math.pathRes(3, (_plot_in0 - 0.558348F) * 5.51269F):_plot_in0 < 1.03367?_plot_in0 < 0.833292?_math.pathRes(4, (_plot_in0 - 0.739748F) * 10.6901F):_math.pathRes(5, (_plot_in0 - 0.833292F) * 4.99066F):_plot_in0 < 1.2?_math.pathRes(6, (_plot_in0 - 1.03367F) * 6.01203F):_math.pathRes(7, (_plot_in0 - 1.2F) * 6.56334F);
                    _math.funcLerp(out _plot_out, this._plot[0][_plot_srch0.s], _plot_srch0.i);
                    particleImpl.size2_ = value_a;
                    particleImpl.alpha_ = _plot_out;
                }
Пример #28
0
        public override void OnEnter()
        {
            dorfs = new List<Person>();
               players = new List<Player>();
               aiPlayers = new List<Player>();
               hospitals = new List<Hospital>() ;
            Bloom = new BloomPostprocess.BloomComponent(Game);

            Bloom.Initialize();
            Bloom.Settings = BloomPostprocess.BloomSettings.PresetSettings[5];
            IsInitialized = true;

            MapHeight = 40;
            MapWidth = 40;
            Player.defib = new Player.defibCallbackType(defib);
            online = false; // DO NOT CHANGE, offline mode is now detected when server connection is refused
            SoundManager.Content = Game.Content;
            Camera = new OrbitCamera(Game.GraphicsDevice, 0, 0, 0.001f, new Vector3(0, 15, 0), new Vector3(-10, 10, 0), (float)Math.PI * 0.25f, Game.GraphicsDevice.Viewport.AspectRatio, 0.1f, 1000.0f);
            ComponentManager = new ComponentManager();
            ComponentManager.RootComponent = new LocatableComponent(ComponentManager, "root", null, Matrix.Identity, Vector3.Zero, Vector3.Zero);

            notification = null;
            particles = new ParticleManager(ComponentManager);

            EmitterData testData = new EmitterData();
            testData.AngularDamping = 1.0f;
            List<Point> frm = new List<Point>();
            frm.Add(new Point(0, 0));
            frm.Add(new Point(1, 0));
            frm.Add(new Point(0, 1));
            frm.Add(new Point(1, 1));
            testData.Animation = new Animation(Game.GraphicsDevice, Game.Content.Load<Texture2D>("electricity"),
                "electricity", 32, 32, frm, true, Color.White, 20f, 1.0f, 1.0f, false);
            testData.ConstantAccel = new Vector3(0, -1, 0);
            testData.LinearDamping = 0.9f;
            testData.AngularDamping = 0.9f;
            testData.EmissionFrequency = 1.0f;
            testData.EmissionRadius = 1.0f;
            testData.EmissionSpeed = 20.0f;
            testData.GrowthSpeed = -0.9f;
            testData.MaxAngle = 3.14159f;
            testData.MinAngle = 0.0f;
            testData.MaxParticles = 1000;
            testData.MaxScale = 1.0f;
            testData.MinScale = 0.1f;
            testData.MinAngular = -5.0f;
            testData.MaxAngular = 5.0f;
            testData.ParticleDecay = 0.1f;
            testData.ParticlesPerFrame = 0;
            testData.ReleaseOnce = true;
            testData.Texture = Game.Content.Load<Texture2D>("electricity");
            particles.RegisterEffect("shock", testData);

            ChargeCooldown = 1.0f;
            CurrentChargeCooldown = 1.0f;

            InputManager inputManager = new InputManager();
            InputManager.KeyPressedCallback += pressKey;
            InputManager.KeyReleasedCallback += releaseKey;

            sounds = new SoundManager();

            wordsDict = new Dictionary<string, string>();
            wordsDict.Add("MONSTER SAVE", "monstersave");
            wordsDict.Add("DOUBLE SAVE", "doublesave");
            wordsDict.Add("TRIPLE SAVE", "triplesave");

            drawer2D = new Drawer2D(Game.Content, Game.GraphicsDevice);

            client = new Client(online);
            string name = client.Connect();
            if (name == "error")
            {
                Console.Out.WriteLine("connection refused");
                name = "0";
                online = false;
            }

            Hospital hospital1 = new Hospital(new Vector3(-10, 0, -10), new Vector3(4, 2, 3), ComponentManager, Game.Content, Game.GraphicsDevice, "hospital", Color.Red, new Point(2, 0));
            Hospital hospital2 = new Hospital(new Vector3(12, 0, 12), new Vector3(4, 2, 3), ComponentManager, Game.Content, Game.GraphicsDevice, "hospital", Color.Blue, new Point(1, 0));
            hospitals.Add(hospital1);
            hospitals.Add(hospital2);

            Random r = new Random(1);
            for (int i = 0; i < 20; i++) // fnord
            {
                NPC npc;
                switch ((int)(detRand(r) * 3))
                {
                    case (0):
                        npc = new Smoker(new Vector3(detRand(r) * 9, 5, detRand(r) * 10), ComponentManager,
                                        Game.Content, Game.GraphicsDevice);
                        break;
                    case (1):
                        npc = new Fatter(new Vector3(detRand(r) * 9, 5, detRand(r) * 10), ComponentManager,
                                        Game.Content, Game.GraphicsDevice);
                        break;
                    case (2):
                        npc = new Older(new Vector3(detRand(r) * 9, 5, detRand(r) * 10), ComponentManager,
                                        Game.Content, Game.GraphicsDevice);
                        break;
                    default:
                        /* graphics don't exist yet, never reached */
                        npc = new Worker(new Vector3(detRand(r) * 9, 5, detRand(r) * 10 - 0), ComponentManager,
                                        Game.Content, Game.GraphicsDevice);
                        break;
                }
                npc.velocityController.MaxSpeed = 1;
                npc.SetTag((i + 1000).ToString());
                int al = (int)(detRand(r) * 2);
                npc.Team = hospitals[al];
                npc.Velocity = new Vector3(0f, -0.5f, 0f);
                npc.HasMoved = true;
                dorfs.Add(npc);
            }

            player = new Player(name, new Vector3(hospital1.Component.LocalTransform.Translation.X + 5,
                hospital1.Component.LocalTransform.Translation.Y,
                hospital1.Component.LocalTransform.Translation.Z),
                                ComponentManager, Game.Content, Game.GraphicsDevice, "surgeonwalk");
            player.Velocity = new Vector3(0f, -0.5f, 0f);
            player.HasMoved = true;
            dorfs.Add(player);
            players.Add(player);

            if (!online)
            {
                aiPlayers.Add(new Player("1", new Vector3(hospital2.Component.LocalTransform.Translation.X - 5,
                    hospital2.Component.LocalTransform.Translation.Y,
                    hospital2.Component.LocalTransform.Translation.Z), ComponentManager, Game.Content, Game.GraphicsDevice, "surgeonwalk"));

                players.Add(aiPlayers.ElementAt(0));
                dorfs.Add(aiPlayers.ElementAt(0));

                aiPlayers.ElementAt(0).team = hospital2;

                VelocityController velocityController4 = new VelocityController(aiPlayers.ElementAt(0));
                velocityController4.IsTracking = true;
            }

            VelocityController velocityController3 = new VelocityController(player);
            velocityController3.IsTracking = true;

            Vector3 boundingBoxPos = new Vector3(0, -2, 0);
            Vector3 boundingBoxExtents = new Vector3(MapWidth, 4, MapHeight);
            Vector3 boundingBoxMin = boundingBoxPos - boundingBoxExtents * 0.5f;
            Vector3 boundingBoxMax = boundingBoxPos + boundingBoxExtents * 0.5f;

            ground = (LocatableComponent)EntityFactory.GenerateBlankBox(new BoundingBox(boundingBoxMin, boundingBoxMax), ComponentManager, Game.Content, Game.GraphicsDevice, "newground", Point.Zero, Point.Zero, 128, 128);

            if (Convert.ToInt32(name) % 2 == 0)
                player.team = hospital1;
            else
                player.team = hospital2;

            SpriteBatch = new SpriteBatch(Game.GraphicsDevice);
            Shader = Game.Content.Load<Effect>("Hargraves");

            SunMap = Game.Content.Load<Texture2D>("sungradient");
            AmbientMap = Game.Content.Load<Texture2D>("ambientgradient");
            TorchMap = Game.Content.Load<Texture2D>("torchgradient");

            if (online)
            {
                AddNotification("Mash Space to Begin");
            }
            base.OnEnter();
        }
                public override void updateParticle(Emitter emitter, Particle particle, float dt)
                {
                    ParticleImpl particleImpl = (ParticleImpl)particle;
                    EmitterData  emitterData  = (EmitterData)emitter.data();

                    GeneratorPeriodic generator     = (GeneratorPeriodic)emitter.generator();
                    GeneratorImpl     generatorImpl = (GeneratorImpl)generator.impl();

                    particleImpl._lifetime += dt;
                    _math.vec3 noise_a = _math.mulv3scalar_(_math.vec3_(100F, 50F, 30F), emitter.effect().time());
                    _math.addv3(out noise_a, noise_a, particleImpl._Position);
                    _math.vec3 noise_i = _math.mulv3scalar_(noise_a, 1.0F / 500F);
                    _math.vec3 noise   = _math.noisePixelLinear3_(noise_i);
                    _math.mulv3(out noise, noise, _math.vec3_(0.0078125F, 0.0078125F, 0.0078125F));
                    _math.addv3(out noise, noise, _math.vec3_(-1F, -1F, -1F));
                    _math.mulv3scalar(out noise, noise, 600F);
                    _math.vec3 fmove_fs  = noise;
                    _math.vec3 fmove_vs  = _math.vec3_(0F, 0F, 0F);
                    float      fmove_dtl = dt;

                    _math.vec3 fmove_v = particleImpl._Velocity;
                    _math.vec3 fmove_p = particleImpl._Position;
                    while (fmove_dtl > 0.0001F)
                    {
                        float      fmove_dtp = fmove_dtl;
                        _math.vec3 fmove_fsd = fmove_fs;
                        _math.vec3 fmove_rw  = _math.subv3_(fmove_vs, fmove_v);
                        float      fmove_rwl = _math.lengthv3sq_(fmove_rw);
                        if (fmove_rwl > 0.0001F)
                        {
                            fmove_rwl = (float)Math.Sqrt(fmove_rwl);
                            _math.vec3 fmove_rwn = _math.divv3scalar_(fmove_rw, fmove_rwl);
                            float      fmove_df  = 0.01F * 1F * fmove_rwl;
                            if (fmove_df * fmove_dtp > 0.2F)
                            {
                                fmove_dtp = 0.2F / fmove_df;
                            }
                            _math.addv3(out fmove_fsd, fmove_fsd, _math.mulv3scalar_(fmove_rwn, fmove_rwl * fmove_df));
                        }
                        _math.addv3(out fmove_v, fmove_v, _math.mulv3scalar_(fmove_fsd, fmove_dtp));
                        _math.addv3(out fmove_p, fmove_p, _math.mulv3scalar_(fmove_v, fmove_dtp));
                        fmove_dtl -= fmove_dtp;
                    }
                    particleImpl._Position = fmove_p;
                    particleImpl._Velocity = fmove_v;
                    particle.position_     = particleImpl._Position;
                    float value_ = 2F;

                    if (particleImpl._lifetime > value_)
                    {
                        particle.dead_ = true;
                    }
                    float expr_ = (particleImpl._lifetime / value_);
                    float _plot_out;
                    float _plot_in0 = (expr_ < 0F?0F:(expr_ > 1F?1F:expr_));

                    _math.PathRes _plot_srch0 = _math.pathRes(0, (_plot_in0 - 0F) * 1F);
                    _math.funcLerp(out _plot_out, this._plot[0][_plot_srch0.s], _plot_srch0.i);
                    float expr_a = (particleImpl._Size * _plot_out);

                    _math.vec3 expr_b = _math.addv3_(emitterData._Color1, _math.mulv3scalar_(_math.subv3_(emitterData._Color2, emitterData._Color1), particleImpl._Color));
                    particleImpl.size1_ = expr_a;
                    particleImpl.color_ = expr_b;
                }