Пример #1
0
        void InitializeComputeBuffers()
        {
            Particle[] particles = new Particle[maxParticles];
            for (int i = 0; i < maxParticles; i++)
            {
                float x = EmitPosition.x + ParticleInitGap + ParticleInitGap * (i % 128);
                float y = EmitPosition.y + ParticleInitGap + ParticleInitGap * (i / 128);
                particles[i].Position = new Vector2(x, y);
            }

            ParticleForce[]   particlesForce   = new ParticleForce[maxParticles];
            ParticleDensity[] particlesDensity = new ParticleDensity[maxParticles];

            SPHParticlesRead    = new ComputeBuffer(maxParticles, Marshal.SizeOf(typeof(Particle)));
            SPHParticlesWrite   = new ComputeBuffer(maxParticles, Marshal.SizeOf(typeof(Particle)));
            SPHParticlesForce   = new ComputeBuffer(maxParticles, Marshal.SizeOf(typeof(ParticleForce)));
            SPHParticlesDensity = new ComputeBuffer(maxParticles, Marshal.SizeOf(typeof(ParticleDensity)));

            SPHParticlesRead.SetData(particles);
            SPHParticlesWrite.SetData(particles);
            SPHParticlesForce.SetData(particlesForce);
            SPHParticlesDensity.SetData(particlesDensity);
        }
Пример #2
0
 public ParticleForcePart(Actor self, ParticleForcePartInfo info) : base(self)
 {
     this.info = info;
     force     = new ParticleForce(info.ForceType, info.Strength, info.UseHeight);
     sectors   = self.World.ParticleLayer.GetSectors(self.Position, info.MaxRange);
 }
Пример #3
0
 private static extern void Internal_create0(ParticleForce managedInstance);
Пример #4
0
        public void Evaluate(int SpreadMax)
        {
            bool hasreset = false;

            try
            {
                double dblreset;
                this.FPinInReset.GetValue(0, out dblreset);
                if (dblreset >= 0.5 || this.FPinInMaxP.PinIsChanged)
                {
                    double m;
                    this.FPinInMaxP.GetValue(0, out m);
                    this.FParticleSystem = new ParticleForceSystem(Convert.ToInt32(m));
                    hasreset             = true;
                }

                if (this.FPinInGridSize.PinIsChanged || hasreset)
                {
                    double x, y;
                    this.FPinInGridSize.GetValue2D(0, out x, out y);
                    this.FSizeX = Convert.ToInt32(x);
                    this.FSizeY = Convert.ToInt32(y);
                }

                if (this.FPinInDtAge.PinIsChanged ||
                    this.FPinInDtVelocity.PinIsChanged || hasreset)
                {
                    double dtage, dtvel;
                    this.FPinInDtAge.GetValue(0, out dtage);
                    this.FPinInDtVelocity.GetValue(0, out dtvel);
                    this.FParticleSystem.DtAge      = dtage;
                    this.FParticleSystem.DtVelocity = dtvel;
                }

                if (this.FPInInFlip.PinIsChanged ||
                    hasreset)
                {
                    double fx, fy;
                    this.FPInInFlip.GetValue2D(0, out fx, out fy);
                    this.FParticleSystem.FlipX = fx >= 0.5;
                    this.FParticleSystem.FlipY = fy >= 0.5;
                }

                double dblemit;
                this.FPinInEmit.GetValue(0, out dblemit);

                if (dblemit >= 0.5)
                {
                    int slicemax = Math.Max(this.FPinInPosition.SliceCount, this.FPinInAge.SliceCount);
                    for (int i = 0; i < slicemax; i++)
                    {
                        double x, y, age, devage, devx, devy, damp;
                        this.FPinInPosition.GetValue2D(i, out x, out y);
                        this.FPinInAge.GetValue(i, out age);
                        this.FPinInAgeDeviation.GetValue(i, out devage);
                        this.FPinInVelocity.GetValue2D(i, out devx, out devy);
                        this.FpinInDamping.GetValue(i, out damp);
                        this.FParticleSystem.AddParticle(x, y, age, devage, devx, devy, damp);
                    }
                }

                List <ParticleForce> result = this.FParticleSystem.Update(this.FPinInField, this.FSizeX, this.FSizeY);

                this.FPinOutPosition.SliceCount = result.Count;
                this.FPinOutPrevious.SliceCount = result.Count;
                this.FPinOutAge.SliceCount      = result.Count;

                double *dblage, dblpos, dblprev;
                this.FPinOutAge.GetValuePointer(out dblage);
                this.FPinOutPosition.GetValuePointer(out dblpos);
                this.FPinOutPrevious.GetValuePointer(out dblprev);

                for (int i = 0; i < result.Count; i++)
                {
                    ParticleForce p = result[i];
                    dblage[i]          = p.Age;
                    dblpos[i * 2]      = p.PositionX;
                    dblpos[i * 2 + 1]  = p.PositionY;
                    dblprev[i * 2]     = p.PreviousX;
                    dblprev[i * 2 + 1] = p.PreviousY;
                }
            }
            catch (Exception ex)
            {
                this.FHost.Log(TLogType.Error, ex.Message + ":" + ex.StackTrace);
            }
        }
Пример #5
0
 private static extern void Internal_create(ParticleForce managedInstance, ref ParticleForceOptions desc);