public override void PushDataToSolver(ObiSolverData data) { if (actor == null || !actor.InSolver) { return; } if ((data.bendingConstraintsData & ObiSolverData.BendingConstraintsData.BENDING_STIFFNESSES) != 0) { for (int i = 0; i < bendingStiffnesses.Count; i++) { bendingStiffnesses[i] = new Vector2(maxBending, stiffness); } if (actor != null && actor.solver != null && bendingStiffnesses != null) { Array.Copy(bendingStiffnesses.ToArray(), 0, actor.solver.bendingConstraints.bendingStiffnesses, indicesOffset, bendingStiffnesses.Count); } } if ((data.bendingConstraintsData & ObiSolverData.BendingConstraintsData.ACTIVE_STATUS) != 0) { UpdateConstraintActiveStatus(); } }
public override void PushDataToSolver(ObiSolverData data) { if (actor == null || !actor.InSolver) { return; } if ((data.volumeConstraintsData & ObiSolverData.VolumeConstraintsData.VOLUME_PRESSURE_STIFFNESSES) != 0) { for (int i = 0; i < pressureStiffness.Count; i++) { pressureStiffness[i] = new Vector2(overpressure, stiffness); } } Oni.SetVolumeConstraints(actor.Solver.OniSolver, solverIndices, solverFirstTriangle, numTriangles.ToArray(), restVolumes.ToArray(), pressureStiffness.ToArray(), ConstraintCount, constraintOffset); if ((data.volumeConstraintsData & ObiSolverData.VolumeConstraintsData.ACTIVE_STATUS) != 0) { UpdateConstraintActiveStatus(); } }
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.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 ((data.tetherConstraintsData & ObiSolverData.TetherConstraintsData.TETHER_STIFFNESSES) != 0) { for (int i = 0; i < stiffnesses.Count; i++) { stiffnesses[i] = stiffness; } } Oni.SetTetherConstraints(actor.Solver.OniSolver, solverIndices, maxLengthsScales.ToArray(), stiffnesses.ToArray(), ConstraintCount, constraintOffset); if ((data.tetherConstraintsData & ObiSolverData.TetherConstraintsData.ACTIVE_STATUS) != 0) { UpdateConstraintActiveStatus(); } }
public override void PushDataToSolver(ObiSolverData data) { if (actor == null || !actor.InSolver) { return; } float[] scaledRestLengths = new float[restLengths.Count]; if ((data.distanceConstraintsData & ObiSolverData.DistanceConstraintsData.DISTANCE_REST_LENGHTS) != 0) { for (int i = 0; i < restLengths.Count; i++) { scaledRestLengths[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); } } Oni.SetDistanceConstraints(actor.Solver.OniSolver, solverIndices, scaledRestLengths, stiffnesses.ToArray(), ConstraintCount, constraintOffset); if ((data.distanceConstraintsData & ObiSolverData.DistanceConstraintsData.ACTIVE_STATUS) != 0) { UpdateConstraintActiveStatus(); } }
public override void PushDataToSolver(ObiSolverData data) { if (actor == null || !actor.InSolver) { return; } if ((data.chainConstraintsData & ObiSolverData.ChainConstraintsData.CHAIN_LENGTHS) != 0) { for (int i = 0; i < lengths.Count; i++) { lengths[i] = new Vector2(lengths[i].y * tightness, lengths[i].y); } } Oni.SetChainConstraints(actor.Solver.OniSolver, solverIndices, solverFirstIndex, numParticles.ToArray(), lengths.ToArray(), ConstraintCount, constraintOffset); if ((data.chainConstraintsData & ObiSolverData.ChainConstraintsData.ACTIVE_STATUS) != 0) { UpdateConstraintActiveStatus(); } }
public override void PushDataToSolver(ObiSolverData data) { if (actor == null || !actor.InSolver) { return; } if ((data.pinConstraintsData & ObiSolverData.PinConstraintsData.PIN_STIFFNESSES) != 0) { for (int i = 0; i < stiffnesses.Count; i++) { stiffnesses[i] = stiffness; } if (actor != null && actor.solver != null) { Array.Copy(stiffnesses.ToArray(), 0, actor.solver.pinConstraints.stiffnesses, indicesOffset, stiffnesses.Count); } } if ((data.pinConstraintsData & ObiSolverData.PinConstraintsData.ACTIVE_STATUS) != 0) { UpdateConstraintActiveStatus(); } }
public override void PushDataToSolver(ObiSolverData data) { if (actor == null || !actor.InSolver) { return; } if ((data.skinConstraintsData & ObiSolverData.SkinConstraintsData.SKIN_STIFFNESSES) != 0) { for (int i = 0; i < skinStiffnesses.Count; i++) { skinStiffnesses[i] = stiffness; } } Oni.SetSkinConstraints(actor.Solver.OniSolver, solverIndices, skinPoints.ToArray(), skinNormals.ToArray(), skinRadiiBackstop.ToArray(), skinStiffnesses.ToArray(), ConstraintCount, constraintOffset); if ((data.skinConstraintsData & ObiSolverData.SkinConstraintsData.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(); } }
/** * 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 && i < positions.Length) { Oni.SetParticlePositions(solver.OniSolver, new Vector4[] { transform.TransformPoint(positions[i]) }, 1, k); } if ((data.particleData & ObiSolverData.ParticleData.VELOCITIES) != 0 && i < velocities.Length) { Oni.SetParticleVelocities(solver.OniSolver, new Vector4[] { transform.TransformVector(velocities[i]) }, 1, k); } if ((data.particleData & ObiSolverData.ParticleData.VORTICITIES) != 0 && i < vorticities.Length) { Oni.SetParticleVorticities(solver.OniSolver, new Vector4[] { transform.TransformVector(vorticities[i]) }, 1, k); } if ((data.particleData & ObiSolverData.ParticleData.INV_MASSES) != 0 && i < invMasses.Length) { Oni.SetParticleInverseMasses(solver.OniSolver, new float[] { invMasses[i] }, 1, k); } if ((data.particleData & ObiSolverData.ParticleData.SOLID_RADII) != 0 && i < solidRadii.Length) { Oni.SetParticleSolidRadii(solver.OniSolver, new float[] { solidRadii[i] }, 1, k); } if ((data.particleData & ObiSolverData.ParticleData.PHASES) != 0 && i < phases.Length) { Oni.SetParticlePhases(solver.OniSolver, new int[] { phases[i] }, 1, k); } } if ((data.particleData & ObiSolverData.ParticleData.ACTIVE_STATUS) != 0) { solver.UpdateActiveParticles(); } }
public override void PullDataFromSolver(ObiSolverData data) { if (actor != null && actor.Solver != null && stretching != null) { stretching = new float[ConstraintCount]; if ((data.distanceConstraintsData & ObiSolverData.DistanceConstraintsData.DISTANCE_STRETCH) != 0) { Oni.GetDistanceConstraintsStretching(actor.Solver.OniSolver, stretching, ConstraintCount, ConstraintOffset); } } }
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.aerodynamicConstraintsData & ObiSolverData.AerodynamicConstraintsData.AERODYNAMIC_NORMALS) != 0) { if (actor != null && actor.solver != null && aerodynamicNormals != null) { Array.Copy(aerodynamicNormals.ToArray(), 0, actor.solver.aerodynamicConstraints.aerodynamicNormals, indicesOffset, aerodynamicNormals.Count); } } if ((data.aerodynamicConstraintsData & ObiSolverData.AerodynamicConstraintsData.WIND) != 0) { for (int i = 0; i < wind.Count; i++) { wind[i] = windVector; } if (actor != null && actor.solver != null && wind != null) { Array.Copy(wind.ToArray(), 0, actor.solver.aerodynamicConstraints.wind, indicesOffset, wind.Count); } } if ((data.aerodynamicConstraintsData & ObiSolverData.AerodynamicConstraintsData.AERODYNAMIC_COEFFS) != 0) { for (int i = 0; i < aerodynamicCoeffs.Count; i += 3) { aerodynamicCoeffs[i + 1] = dragCoefficient * airDensity; aerodynamicCoeffs[i + 2] = liftCoefficient * airDensity; } if (actor != null && actor.solver != null && aerodynamicCoeffs != null) { Array.Copy(aerodynamicCoeffs.ToArray(), 0, actor.solver.aerodynamicConstraints.aerodynamicCoeffs, indicesOffset * 3, aerodynamicCoeffs.Count); } } if ((data.aerodynamicConstraintsData & ObiSolverData.AerodynamicConstraintsData.ACTIVE_STATUS) != 0) { UpdateConstraintActiveStatus(); } }
/** * 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]; } } }
public override void PushDataToSolver(ObiSolverData data) { if (actor == null || !actor.InSolver) { return; } if ((data.skinConstraintsData & ObiSolverData.SkinConstraintsData.SKIN_STIFFNESSES) != 0) { for (int i = 0; i < skinStiffnesses.Count; i++) { skinStiffnesses[i] = stiffness; } if (actor != null && actor.solver != null && skinStiffnesses != null) { Array.Copy(skinStiffnesses.ToArray(), 0, actor.solver.skinConstraints.skinStiffnesses, indicesOffset, skinStiffnesses.Count); } } if ((data.skinConstraintsData & ObiSolverData.SkinConstraintsData.SKIN_POINTS) != 0) { if (actor != null && actor.solver != null && skinPoints != null) { Array.Copy(skinPoints.ToArray(), 0, actor.solver.skinConstraints.skinPoints, indicesOffset, skinPoints.Count); } } if ((data.skinConstraintsData & ObiSolverData.SkinConstraintsData.SKIN_NORMALS) != 0) { if (actor != null && actor.solver != null && skinNormals != null) { Array.Copy(skinNormals.ToArray(), 0, actor.solver.skinConstraints.skinNormals, indicesOffset, skinNormals.Count); } } if ((data.skinConstraintsData & ObiSolverData.SkinConstraintsData.ACTIVE_STATUS) != 0) { UpdateConstraintActiveStatus(); } }
public override void PushDataToSolver(ObiSolverData data) { if (actor == null || !actor.InSolver) { return; } if ((data.bendingConstraintsData & ObiSolverData.BendingConstraintsData.BENDING_STIFFNESSES) != 0) { for (int i = 0; i < bendingStiffnesses.Count; i++) { bendingStiffnesses[i] = new Vector2(maxBending, stiffness); } } Oni.SetBendingConstraints(actor.Solver.OniSolver, solverIndices, restBends.ToArray(), bendingStiffnesses.ToArray(), ConstraintCount, constraintOffset); if ((data.bendingConstraintsData & ObiSolverData.BendingConstraintsData.ACTIVE_STATUS) != 0) { UpdateConstraintActiveStatus(); } }
public override void PushDataToSolver(ObiSolverData data) { if (actor == null || !actor.InSolver) { return; } if ((data.pinConstraintsData & ObiSolverData.PinConstraintsData.PIN_STIFFNESSES) != 0) { for (int i = 0; i < stiffnesses.Count; i++) { stiffnesses[i] = stiffness; } } Oni.SetPinConstraints(actor.Solver.OniSolver, solverIndices, pinOffsets.ToArray(), stiffnesses.ToArray(), ConstraintCount, constraintOffset); if ((data.pinConstraintsData & ObiSolverData.PinConstraintsData.ACTIVE_STATUS) != 0) { UpdateConstraintActiveStatus(); } }
public override void PushDataToSolver(ObiSolverData data) { if (actor == null || !actor.InSolver) { return; } if ((data.aerodynamicConstraintsData & ObiSolverData.AerodynamicConstraintsData.WIND) != 0) { for (int i = 0; i < wind.Count; i++) { wind[i] = windVector; } } if ((data.aerodynamicConstraintsData & ObiSolverData.AerodynamicConstraintsData.AERODYNAMIC_COEFFS) != 0) { for (int i = 0; i < aerodynamicCoeffs.Count; i += 3) { aerodynamicCoeffs[i + 1] = dragCoefficient * airDensity; aerodynamicCoeffs[i + 2] = liftCoefficient * airDensity; } } if (data.aerodynamicConstraintsData == ObiSolverData.AerodynamicConstraintsData.ACTIVE_STATUS) { // special case for normals only, which is pretty common. Oni.UpdateAerodynamicNormals(actor.Solver.OniSolver, aerodynamicNormals.ToArray(), ConstraintCount, constraintOffset); } else { Oni.SetAerodynamicConstraints(actor.Solver.OniSolver, solverIndices, aerodynamicNormals.ToArray(), wind.ToArray(), aerodynamicCoeffs.ToArray(), ConstraintCount, constraintOffset); } if ((data.aerodynamicConstraintsData & ObiSolverData.AerodynamicConstraintsData.ACTIVE_STATUS) != 0) { UpdateConstraintActiveStatus(); } }
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 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(); } }
/** * 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) { Vector4[] wsPosition = { positions[i] }; Oni.GetParticlePositions(solver.OniSolver, wsPosition, 1, k); positions[i] = transform.InverseTransformPoint(wsPosition[0]); } if ((data.particleData & ObiSolverData.ParticleData.VELOCITIES) != 0) { Vector4[] wsVelocity = { velocities[i] }; Oni.GetParticleVelocities(solver.OniSolver, wsVelocity, 1, k); velocities[i] = transform.InverseTransformVector(wsVelocity[0]); } } }
public virtual void PullDataFromSolver(ObiSolverData data) { }
public virtual void PushDataToSolver(ObiSolverData data) { }