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); }
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); }
private static extern void Internal_create0(ParticleForce managedInstance);
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); } }
private static extern void Internal_create(ParticleForce managedInstance, ref ParticleForceOptions desc);