private void ApplyTearing() { ObiDistanceConstraintBatch distanceBatch = DistanceConstraints.GetFirstBatch(); float[] forces = new float[distanceBatch.ConstraintCount]; Oni.GetBatchConstraintForces(distanceBatch.OniBatch, forces, distanceBatch.ConstraintCount, 0); List <TornEdge> tornEdges = new List <TornEdge>(); for (int i = 0; i < forces.Length; i++) { float p1Resistance = tearResistance[distanceBatch.springIndices[i * 2]]; float p2Resistance = tearResistance[distanceBatch.springIndices[i * 2 + 1]]; // average particle resistances: float resistance = (p1Resistance + p2Resistance) * 0.5f * tearResistanceMultiplier; if (-forces[i] * 1000 > resistance) // units are kilonewtons. { tornEdges.Add(new TornEdge(i, forces[i])); } } if (tornEdges.Count > 0) { // sort edges by tear force: tornEdges.Sort(delegate(TornEdge x, TornEdge y) { return(x.force.CompareTo(y.force)); }); DistanceConstraints.RemoveFromSolver(null); for (int i = 0; i < Mathf.Min(tearRate, tornEdges.Count); i++) { Tear(tornEdges[i].index); } DistanceConstraints.AddToSolver(this); // update active bending constraints: BendingConstraints.SetActiveConstraints(); // update solver deformable triangle indices: UpdateDeformableTriangles(); // upload active particle list to solver: solver.UpdateActiveParticles(); } }
protected void ApplyTearing() { if (!tearable) { return; } ObiDistanceConstraintBatch distanceBatch = DistanceConstraints.GetFirstBatch(); float[] forces = new float[distanceBatch.ConstraintCount]; Oni.GetBatchConstraintForces(distanceBatch.OniBatch, forces, distanceBatch.ConstraintCount, 0); List <int> tearedEdges = new List <int>(); for (int i = 0; i < forces.Length; i++) { float p1Resistance = tearResistance[distanceBatch.springIndices[i * 2]]; float p2Resistance = tearResistance[distanceBatch.springIndices[i * 2 + 1]]; // average particle resistances: float resistance = (p1Resistance + p2Resistance) * 0.5f * tearResistanceMultiplier; if (-forces[i] * 1000 > resistance) // units are kilonewtons. { tearedEdges.Add(i); } } if (tearedEdges.Count > 0) { DistanceConstraints.RemoveFromSolver(null); BendingConstraints.RemoveFromSolver(null); for (int i = 0; i < tearedEdges.Count; i++) { Tear(tearedEdges[i]); } BendingConstraints.AddToSolver(this); DistanceConstraints.AddToSolver(this); // update active bending constraints: BendingConstraints.SetActiveConstraints(); // upload active particle list to solver: solver.UpdateActiveParticles(); } }