public override void PushDataToSolver(ObiSolverData data) { if (actor == null || !actor.InSolver) return; if ((data.tetherConstraintsData & ObiSolverData.TetherConstraintsData.TETHER_MAX_LENGHTS_SCALES) != 0){ for (int i = 0; i < maxLengthsScales.Count; i++){ maxLengthsScales[i] = new Vector2(maxLengthsScales[i].x, tetherScale); } if (actor != null && actor.solver != null && maxLengthsScales != null){ Array.Copy(maxLengthsScales.ToArray(),0,actor.solver.tetherConstraints.maxLengthsScales,indicesOffset,maxLengthsScales.Count); } } if ((data.tetherConstraintsData & ObiSolverData.TetherConstraintsData.TETHER_STIFFNESSES) != 0){ for (int i = 0; i < stiffnesses.Count; i++){ stiffnesses[i] = stiffness; } if (actor != null && actor.solver != null && stiffnesses != null){ Array.Copy(stiffnesses.ToArray(),0,actor.solver.tetherConstraints.stiffnesses,indicesOffset,stiffnesses.Count); } } if ((data.tetherConstraintsData & ObiSolverData.TetherConstraintsData.ACTIVE_STATUS) != 0){ UpdateConstraintActiveStatus(); } }
public override void PullDataFromSolver(ObiSolverData data) { if (actor != null && actor.solver != null && stretching != null){ if ((data.distanceConstraintsData & ObiSolverData.DistanceConstraintsData.DISTANCE_STRETCH) != 0){ float[] stretchArray = new float[stretching.Count]; Array.Copy(actor.solver.distanceConstraints.stretching,indicesOffset,stretchArray,0,stretching.Count); stretching = new List<float>(stretchArray); } } }
public override void PushDataToSolver(ObiSolverData data) { if (actor == null || !actor.InSolver) return; if ((data.volumeConstraintsData & ObiSolverData.VolumeConstraintsData.VOLUME_REST_VOLUMES) != 0){ if (actor != null && actor.solver != null && restVolumes != null){ Array.Copy(restVolumes.ToArray(),0,actor.solver.volumeConstraints.volumeRestVolumes,indicesOffset,restVolumes.Count); } } if ((data.volumeConstraintsData & ObiSolverData.VolumeConstraintsData.VOLUME_PRESSURE_STIFFNESSES) != 0){ for (int i = 0; i < pressureStiffness.Count; i++){ pressureStiffness[i] = new Vector2(overpressure,stiffness); } if (actor != null && actor.solver != null && pressureStiffness != null){ Array.Copy(pressureStiffness.ToArray(),0,actor.solver.volumeConstraints.volumePressureStiffnesses,indicesOffset,pressureStiffness.Count); } } if ((data.volumeConstraintsData & ObiSolverData.VolumeConstraintsData.ACTIVE_STATUS) != 0){ UpdateConstraintActiveStatus(); } }
public override void PushDataToSolver(ObiSolverData data) { if (actor == null || !actor.InSolver) return; if ((data.distanceConstraintsData & ObiSolverData.DistanceConstraintsData.DISTANCE_REST_LENGHTS) != 0){ if (actor != null && actor.solver != null){ for (int i = 0; i < restLengths.Count; i++){ actor.solver.distanceConstraints.restLengths[indicesOffset+i] = restLengths[i]*stretchingScale; } } } if ((data.distanceConstraintsData & ObiSolverData.DistanceConstraintsData.DISTANCE_STIFFNESSES) != 0){ for (int i = 0; i < stiffnesses.Count; i++){ stiffnesses[i] = new Vector2(stretchingStiffness,compressionStiffness); } if (actor != null && actor.solver != null && stretching != null){ Array.Copy(stiffnesses.ToArray(),0,actor.solver.distanceConstraints.stiffnesses,indicesOffset,stiffnesses.Count); } } if ((data.distanceConstraintsData & ObiSolverData.DistanceConstraintsData.ACTIVE_STATUS) != 0){ UpdateConstraintActiveStatus(); } }
/** * Sends local particle data to the solver. */ public virtual void PushDataToSolver(ObiSolverData data) { if (!InSolver) return; for (int i = 0; i < particleIndices.Count; i++){ int k = particleIndices[i]; if ((data.particleData & ObiSolverData.ParticleData.ACTIVE_STATUS) != 0){ if (!active[i]) solver.activeParticles.Remove(k); else solver.activeParticles.Add(k); } if ((data.particleData & ObiSolverData.ParticleData.POSITIONS) != 0) solver.positions[k] = transform.TransformPoint(positions[i]); if ((data.particleData & ObiSolverData.ParticleData.PREDICTED_POSITIONS) != 0) solver.predictedPositions[k] = transform.TransformPoint(positions[i]); if ((data.particleData & ObiSolverData.ParticleData.PREVIOUS_POSITIONS) != 0) solver.previousPositions[k] = transform.TransformPoint(positions[i]); if ((data.particleData & ObiSolverData.ParticleData.VELOCITIES) != 0) solver.velocities[k] = transform.TransformVector(velocities[i]); if ((data.particleData & ObiSolverData.ParticleData.INV_MASSES) != 0) solver.inverseMasses[k] = invMasses[i]; if ((data.particleData & ObiSolverData.ParticleData.SOLID_RADII) != 0) solver.solidRadii[k] = solidRadii[i]; if ((data.particleData & ObiSolverData.ParticleData.PHASES) != 0) solver.phases[k] = phases[i]; } if ((data.particleData & ObiSolverData.ParticleData.ACTIVE_STATUS) != 0) solver.UpdateActiveParticles(); }
/** * Retrieves particle simulation data from the solver. Common uses are * retrieving positions and velocities to set the initial status of the simulation, * or retrieving solver-generated data such as tensions, densities, etc. */ public virtual void PullDataFromSolver(ObiSolverData data) { if (!InSolver) return; for (int i = 0; i < particleIndices.Count; i++){ int k = particleIndices[i]; if ((data.particleData & ObiSolverData.ParticleData.POSITIONS) != 0) positions[i] = transform.InverseTransformPoint(solver.positions[k]); if ((data.particleData & ObiSolverData.ParticleData.VELOCITIES) != 0) velocities[i] = solver.velocities[k]; } }