public IEnumerator Generate() { m_Empty = true; m_ActiveParticleCount = 0; distanceConstraintsData = null; bendConstraintsData = null; skinConstraintsData = null; tetherConstraintsData = null; bendTwistConstraintsData = null; stretchShearConstraintsData = null; shapeMatchingConstraintsData = null; aerodynamicConstraintsData = null; chainConstraintsData = null; volumeConstraintsData = null; points = null; edges = null; triangles = null; IEnumerator g = Initialize(); while (g.MoveNext()) { yield return(g.Current); } RecalculateBounds(); m_Empty = false; m_InitialActiveParticleCount = m_ActiveParticleCount; foreach (IObiConstraints constraints in GetConstraints()) { for (int i = 0; i < constraints.GetBatchCount(); ++i) { constraints.GetBatch(i).initialActiveConstraintCount = constraints.GetBatch(i).activeConstraintCount; } } #if UNITY_EDITOR EditorUtility.SetDirty(this); #endif if (OnBlueprintGenerate != null) { OnBlueprintGenerate(this); } }
protected virtual IEnumerator CreateShapeMatchingConstraints(List <Vector3> particles) { //Create shape matching clusters: shapeMatchingConstraintsData = new ObiShapeMatchingConstraintsData(); List <int> indices = new List <int>(); List <int> particleIndices = new List <int>(); List <int> constraintIndices = new List <int>(); for (int i = 0; i < particles.Count; ++i) { constraintIndices.Add(particleIndices.Count); particleIndices.Add(i); for (int j = 0; j < particles.Count; ++j) { if (i != j && Vector3.Distance(particles[j], particles[i]) < softClusterRadius) { particleIndices.Add(j); } } if (i % 500 == 0) { yield return(new CoroutineJob.ProgressInfo("ObiSoftbody: generating shape matching constraints...", i / (float)particles.Count)); } } constraintIndices.Add(particleIndices.Count); // pass a copy of the particleIndices array, as we need to preserve particle order (first particle in each constraint is the center particle) int[] constraintColors = GraphColoring.Colorize(particleIndices.ToArray(), constraintIndices.ToArray()); for (int i = 0; i < constraintColors.Length; ++i) { int color = constraintColors[i]; int cIndex = constraintIndices[i]; // Add a new batch if needed: if (color >= shapeMatchingConstraintsData.GetBatchCount()) { shapeMatchingConstraintsData.AddBatch(new ObiShapeMatchingConstraintsBatch()); } int amount = constraintIndices[i + 1] - cIndex; int[] clusterIndices = new int[amount]; for (int j = 0; j < amount; ++j) { clusterIndices[j] = particleIndices[cIndex + j]; } shapeMatchingConstraintsData.batches[color].AddConstraint(clusterIndices, false); } // Set initial amount of active constraints: for (int i = 0; i < shapeMatchingConstraintsData.batches.Count; ++i) { shapeMatchingConstraintsData.batches[i].activeConstraintCount = shapeMatchingConstraintsData.batches[i].constraintCount; } }
public ObiShapeMatchingConstraintsData(ObiActor actor = null, ObiShapeMatchingConstraintsData source = null) : base(actor, source) { }
public ObiShapeMatchingConstraintsBatch(ObiShapeMatchingConstraintsData constraints = null, ObiShapeMatchingConstraintsBatch source = null) : base(source) { m_Constraints = constraints; }
public ObiShapeMatchingConstraintsBatch(ObiShapeMatchingConstraintsData constraints = null) : base() { }