public void Initalize(ParticleArrayHolder holder, ParticleOptions options) { if (IsCudaAvailable()) { unsafe { fixed (Vector2* ppositions = holder.positions, pvel = holder.velocities) { fixed (float* pRotations = holder.Rotations, pLifeTimes = holder.lifetimes) { fixed (Rectangle* prect = holder.rects) { fixed (byte* palphas = holder.alphas) { //CudaInitialize(particlePTR, particles.Length, options); //TODO try { cudaObject = CudaInitialize(ppositions, pvel, pRotations, pLifeTimes, prect, palphas, holder.positions.Length); } catch (Exception) { //throw; } } } } } } } }
private void InitalizeCUDA() { particleCuda = new ParticleCUDA(); options = new ParticleOptions(); particleCuda.Initalize(CreateHolder(), CreateOptions()); }
private unsafe ParticleOptions CreateOptions(float elapsed) { ParticleOptions options = new ParticleOptions(); options.AirFriction = AirFriction; options.collisionRectSize = collisionrectangles.Count; options.collisionType = collisiontype; options.elapsedGameTime = elapsed; options.Friction = friction; options.gravity = gravity; options.gravType = gravtype; fixed (NewtonMass* fmasses = masses.ToArray()) { options.mass = new IntPtr((void*)fmasses); } options.newtonMassSize = masses.Count; options.size = size; options.totalLifeTime = totallifetime; return options; }
static unsafe extern void CudaMain(IntPtr holder, [Out]Vector2* positions, [Out]Vector2* velocities, float* Rotations, float* lifetimes, Rectangle* rects, byte* alphas, int Size, ParticleOptions options);
public unsafe void Run(ParticleArrayHolder holder, ParticleOptions options) { if (IsCudaAvailable()) { fixed (Vector2* ppositions = holder.positions, pvel = holder.velocities) { fixed (float* pRotations = holder.Rotations, pLifeTimes = holder.lifetimes) { fixed (Rectangle* prect = holder.rects) { fixed (byte* palphas = holder.alphas) { //CudaInitialize(particlePTR, particles.Length, options); CudaMain(cudaObject, ppositions, pvel, pRotations, pLifeTimes, prect, palphas, holder.positions.Length, options); } } } } } }