private bool DoesParticleShareConstraints(IObiConstraints constraints, int index, List <int> particles, bool[] selected)
        {
            bool shared = false;

            for (int i = 0; i < constraints.GetBatchCount(); ++i)
            {
                var batch = constraints.GetBatch(i);
                for (int j = 0; j < batch.activeConstraintCount; ++j)
                {
                    particles.Clear();
                    batch.GetParticlesInvolved(j, particles);

                    if (shared |= IsParticleSharedInConstraint(index, particles, selected))
                    {
                        break;
                    }
                }

                if (shared)
                {
                    break;
                }
            }
            return(shared);
        }
        // merges constraints from a given actor with this one.
        public void Merge(ObiActor actor, IObiConstraints other)
        {
            var others = other as ObiConstraints <T>;

            if (others == null || !other.GetConstraintType().HasValue)
            {
                return;
            }

            int constraintType = (int)other.GetConstraintType().Value;

            // clear batch offsets for this constraint type:
            actor.solverBatchOffsets[constraintType].Clear();

            // create new empty batches if needed:
            int newBatches = Mathf.Max(0, others.GetBatchCount() - GetBatchCount());

            for (int i = 0; i < newBatches; ++i)
            {
                AddBatch(CreateBatch());
            }

            for (int i = 0; i < other.GetBatchCount(); ++i)
            {
                // store this batch's offset:
                actor.solverBatchOffsets[constraintType].Add(batches[i].activeConstraintCount);

                // merge both batches:
                batches[i].Merge(actor, others.batches[i]);
            }
        }
        public void AddToSolver(IObiConstraints constraints)
        {
            // create a constraint batch:
            batch = Oni.CreateBatch((int)constraintType);
            Oni.AddBatch(constraints.GetActor().solver.OniSolver, batch);

            OnAddToSolver(constraints);
        }
        protected override void OnAddToSolver(IObiConstraints constraints)
        {
            for (int i = 0; i < particleIndices.count; i++)
            {
                particleIndices[i] = constraints.GetActor().solverIndices[source.particleIndices[i]];
            }

            // pass constraint data arrays to the solver:
            Oni.SetChainConstraints(batch, particleIndices.GetIntPtr(), lengths.GetIntPtr(), firstParticle.GetIntPtr(), numParticles.GetIntPtr(), m_ConstraintCount);
            Oni.SetActiveConstraints(batch, m_ActiveConstraintCount);
        }
        public void RemoveFromSolver(IObiConstraints constraints)
        {
            OnRemoveFromSolver(constraints);

            // remove the constraint batch from the solver
            // (no need to destroy it as its destruction is managed by the solver)
            Oni.RemoveBatch(constraints.GetActor().solver.OniSolver, batch);

            // important: set the batch pointer to null, as it could be destroyed by the solver.
            batch = IntPtr.Zero;
        }
Пример #6
0
        protected override void OnAddToSolver(IObiConstraints constraints)
        {
            for (int i = 0; i < skinCompliance.count; i++)
            {
                particleIndices[i] = constraints.GetActor().solverIndices[source.particleIndices[i]];
            }

            // pass constraint data arrays to the solver:
            Oni.SetSkinConstraints(batch, particleIndices.GetIntPtr(), skinPoints.GetIntPtr(), skinNormals.GetIntPtr(), skinRadiiBackstop.GetIntPtr(), skinCompliance.GetIntPtr(), m_ConstraintCount);
            Oni.SetActiveConstraints(batch, m_ActiveConstraintCount);
        }
        protected override void OnAddToSolver(IObiConstraints constraints)
        {
            for (int i = 0; i < particleIndices.count; i++)
            {
                particleIndices[i] = constraints.GetActor().solverIndices[source.particleIndices[i]];
            }

            // pass constraint data arrays to the solver:
            Oni.SetAerodynamicConstraints(batch, particleIndices.GetIntPtr(), aerodynamicCoeffs.GetIntPtr(), m_ConstraintCount);
            Oni.SetActiveConstraints(batch, m_ActiveConstraintCount);
        }
        protected override void OnAddToSolver(IObiConstraints constraints)
        {
            for (int i = 0; i < stiffnesses.count; i++)
            {
                particleIndices[i * 2]     = constraints.GetActor().solverIndices[source.particleIndices[i * 2]];
                particleIndices[i * 2 + 1] = constraints.GetActor().solverIndices[source.particleIndices[i * 2 + 1]];
            }

            // pass constraint data arrays to the solver:
            Oni.SetTetherConstraints(batch, particleIndices.GetIntPtr(), maxLengthsScales.GetIntPtr(), stiffnesses.GetIntPtr(), m_ConstraintCount);
            Oni.SetActiveConstraints(batch, m_ActiveConstraintCount);
        }
Пример #9
0
        protected override void OnAddToSolver(IObiConstraints constraints)
        {
            for (int i = 0; i < particleIndices.count; i++)
            {
                particleIndices[i] = constraints.GetActor().solverIndices[source.particleIndices[i]];
            }

            // pass constraint data arrays to the solver:
            Oni.SetVolumeConstraints(batch, particleIndices.GetIntPtr(), firstTriangle.GetIntPtr(),
                                     restVolumes.GetIntPtr(), pressureStiffness.GetIntPtr(), m_ConstraintCount);
            Oni.SetActiveConstraints(batch, m_ActiveConstraintCount);
        }
Пример #10
0
        public override IObiConstraintsBatch Clone(IObiConstraints constraints)
        {
            var clone = new ObiAerodynamicConstraintsBatch(constraints as ObiAerodynamicConstraintsData, this);

            clone.particleIndices.ResizeUninitialized(particleIndices.count);
            clone.aerodynamicCoeffs.ResizeUninitialized(aerodynamicCoeffs.count);

            clone.particleIndices.CopyFrom(particleIndices);
            clone.aerodynamicCoeffs.CopyFrom(aerodynamicCoeffs);

            return(clone);
        }
        protected override void OnAddToSolver(IObiConstraints constraints)
        {
            for (int i = 0; i < restBends.count; i++)
            {
                particleIndices[i * 3]     = constraints.GetActor().solverIndices[source.particleIndices[i * 3]];
                particleIndices[i * 3 + 1] = constraints.GetActor().solverIndices[source.particleIndices[i * 3 + 1]];
                particleIndices[i * 3 + 2] = constraints.GetActor().solverIndices[source.particleIndices[i * 3 + 2]];
            }

            // pass constraint data arrays to the solver:
            Oni.SetBendingConstraints(batch, particleIndices.GetIntPtr(), restBends.GetIntPtr(), bendingStiffnesses.GetIntPtr(), m_ConstraintCount);
            Oni.SetActiveConstraints(batch, m_ActiveConstraintCount);
        }
Пример #12
0
        protected override void OnAddToSolver(IObiConstraints constraints)
        {
            for (int i = 0; i < restLengths.count; i++)
            {
                particleIndices[i * 2]     = constraints.GetActor().solverIndices[source.particleIndices[i * 2]];
                particleIndices[i * 2 + 1] = constraints.GetActor().solverIndices[source.particleIndices[i * 2 + 1]];
                stiffnesses[i]             = new Vector2(0, restLengths[i]);
            }

            // pass constraint data arrays to the solver:
            Oni.SetDistanceConstraints(batch, particleIndices.GetIntPtr(), restLengths.GetIntPtr(), stiffnesses.GetIntPtr(), m_ConstraintCount);
            Oni.SetActiveConstraints(batch, m_ActiveConstraintCount);
        }
        protected override void OnAddToSolver(IObiConstraints constraints)
        {
            for (int i = 0; i < restLengths.count; i++)
            {
                particleIndices[i * 2]     = constraints.GetActor().solverIndices[source.particleIndices[i * 2]];
                particleIndices[i * 2 + 1] = constraints.GetActor().solverIndices[source.particleIndices[i * 2 + 1]];
                orientationIndices[i]      = constraints.GetActor().solverIndices[((ObiStretchShearConstraintsBatch)source).orientationIndices[i]];
            }

            // pass constraint data arrays to the solver:
            Oni.SetStretchShearConstraints(batch, particleIndices.GetIntPtr(), orientationIndices.GetIntPtr(), restLengths.GetIntPtr(), restOrientations.GetIntPtr(), stiffnesses.GetIntPtr(), m_ConstraintCount);
            Oni.SetActiveConstraints(batch, m_ActiveConstraintCount);
        }
Пример #14
0
        public override IObiConstraintsBatch Clone(IObiConstraints constraints)
        {
            var clone = new ObiDistanceConstraintsBatch(constraints as ObiDistanceConstraintsData, this);

            clone.particleIndices.ResizeUninitialized(particleIndices.count);
            clone.restLengths.ResizeUninitialized(restLengths.count);
            clone.stiffnesses.ResizeUninitialized(stiffnesses.count);

            clone.particleIndices.CopyFrom(particleIndices);
            clone.restLengths.CopyFrom(restLengths);
            clone.stiffnesses.CopyFrom(stiffnesses);

            return(clone);
        }
Пример #15
0
        public override IObiConstraintsBatch Clone(IObiConstraints constraints)
        {
            var clone = new ObiTetherConstraintsBatch(constraints as ObiTetherConstraintsData, this);

            clone.particleIndices.ResizeUninitialized(particleIndices.count);
            clone.maxLengthsScales.ResizeUninitialized(maxLengthsScales.count);
            clone.stiffnesses.ResizeUninitialized(stiffnesses.count);

            clone.particleIndices.CopyFrom(particleIndices);
            clone.maxLengthsScales.CopyFrom(maxLengthsScales);
            clone.stiffnesses.CopyFrom(stiffnesses);

            return(clone);
        }
Пример #16
0
        public override IObiConstraintsBatch Clone(IObiConstraints constraints)
        {
            var clone = new ObiBendTwistConstraintsBatch(constraints as ObiBendTwistConstraintsData, this);

            clone.particleIndices.ResizeUninitialized(particleIndices.count);
            clone.restDarbouxVectors.ResizeUninitialized(restDarbouxVectors.count);
            clone.stiffnesses.ResizeUninitialized(stiffnesses.count);

            clone.particleIndices.CopyFrom(particleIndices);
            clone.restDarbouxVectors.CopyFrom(restDarbouxVectors);
            clone.stiffnesses.CopyFrom(stiffnesses);

            return(clone);
        }
Пример #17
0
        public override IObiConstraintsBatch Clone(IObiConstraints constraints)
        {
            var clone = new ObiBendConstraintsBatch(constraints as ObiBendConstraintsData, this);

            clone.particleIndices.ResizeUninitialized(particleIndices.count);
            clone.restBends.ResizeUninitialized(restBends.count);
            clone.bendingStiffnesses.ResizeUninitialized(bendingStiffnesses.count);

            clone.particleIndices.CopyFrom(particleIndices);
            clone.restBends.CopyFrom(restBends);
            clone.bendingStiffnesses.CopyFrom(bendingStiffnesses);

            return(clone);
        }
Пример #18
0
        public override IObiConstraintsBatch Clone(IObiConstraints constraints)
        {
            var clone = new ObiVolumeConstraintsBatch(constraints as ObiVolumeConstraintsData, this);

            clone.particleIndices.ResizeUninitialized(particleIndices.count);
            clone.firstTriangle.ResizeUninitialized(firstTriangle.count);
            clone.restVolumes.ResizeUninitialized(restVolumes.count);
            clone.pressureStiffness.ResizeUninitialized(pressureStiffness.count);

            clone.particleIndices.CopyFrom(particleIndices);
            clone.firstTriangle.CopyFrom(firstTriangle);
            clone.restVolumes.CopyFrom(restVolumes);
            clone.pressureStiffness.CopyFrom(pressureStiffness);

            return(clone);
        }
        protected override void OnAddToSolver(IObiConstraints constraints)
        {
            if (source != null)
            {
                for (int i = 0; i < particleIndices.count; i++)
                {
                    particleIndices[i]     = constraints.GetActor().solverIndices[source.particleIndices[i]];
                    stiffnesses[i * 2]     = 0;
                    stiffnesses[i * 2 + 1] = 0;
                }
            }

            // pass constraint data arrays to the solver:
            Oni.SetPinConstraints(batch, particleIndices.GetIntPtr(), offsets.GetIntPtr(), restDarbouxVectors.GetIntPtr(), pinBodies.GetIntPtr(), stiffnesses.GetIntPtr(), m_ConstraintCount);
            Oni.SetActiveConstraints(batch, m_ActiveConstraintCount);
        }
Пример #20
0
        public override IObiConstraintsBatch Clone(IObiConstraints constraints)
        {
            var clone = new ObiChainConstraintsBatch(constraints as ObiChainConstraintsData, this);

            clone.particleIndices.ResizeUninitialized(particleIndices.count);
            clone.firstParticle.ResizeUninitialized(firstParticle.count);
            clone.numParticles.ResizeUninitialized(numParticles.count);
            clone.lengths.ResizeUninitialized(lengths.count);

            clone.particleIndices.CopyFrom(particleIndices);
            clone.firstParticle.CopyFrom(firstParticle);
            clone.numParticles.CopyFrom(numParticles);
            clone.lengths.CopyFrom(lengths);

            return(clone);
        }
Пример #21
0
        public override IObiConstraintsBatch Clone(IObiConstraints constraints)
        {
            var clone = new ObiSkinConstraintsBatch(constraints as ObiSkinConstraintsData, this);

            clone.particleIndices.ResizeUninitialized(particleIndices.count);
            clone.skinPoints.ResizeUninitialized(skinPoints.count);
            clone.skinNormals.ResizeUninitialized(skinNormals.count);
            clone.skinRadiiBackstop.ResizeUninitialized(skinRadiiBackstop.count);
            clone.skinCompliance.ResizeUninitialized(skinCompliance.count);

            clone.particleIndices.CopyFrom(particleIndices);
            clone.skinPoints.CopyFrom(skinPoints);
            clone.skinNormals.CopyFrom(skinNormals);
            clone.skinRadiiBackstop.CopyFrom(skinRadiiBackstop);
            clone.skinCompliance.CopyFrom(skinCompliance);

            return(clone);
        }
Пример #22
0
 private void DeactivateConstraintsWithInactiveParticles(IObiConstraints constraints, List <int> particles)
 {
     foreach (var batch in constraints.GetBatchInterfaces())
     {
         for (int i = batch.activeConstraintCount - 1; i >= 0; --i)
         {
             particles.Clear();
             batch.GetParticlesInvolved(i, particles);
             for (int k = 0; k < particles.Count; ++k)
             {
                 if (!IsParticleActive(particles[k]))
                 {
                     batch.DeactivateConstraint(i);
                     break;
                 }
             }
         }
     }
 }
        protected override void OnAddToSolver(IObiConstraints constraints)
        {
            for (int i = 0; i < particleIndices.count; i++)
            {
                particleIndices[i] = constraints.GetActor().solverIndices[source.particleIndices[i]];
            }

            for (int i = 0; i < orientations.count; i++)
            {
                orientations[i] = constraints.GetActor().actorLocalToSolverMatrix.rotation;
            }

            // pass constraint data arrays to the solver:
            Oni.SetShapeMatchingConstraints(batch, particleIndices.GetIntPtr(), firstIndex.GetIntPtr(), numIndices.GetIntPtr(), explicitGroup.GetIntPtr(),
                                            materialParameters.GetIntPtr(), restComs.GetIntPtr(), coms.GetIntPtr(), orientations.GetIntPtr(), m_ConstraintCount);
            Oni.SetActiveConstraints(batch, m_ActiveConstraintCount);

            Oni.CalculateRestShapeMatching(constraints.GetActor().solver.OniSolver, batch);
        }
Пример #24
0
        private void LoadBlueprintConstraints(ObiActorBlueprint bp)
        {
            m_Constraints = new IObiConstraints[Oni.ConstraintTypeCount];

            // Iterate trough all non-null constraint types in the blueprint that have at least 1 batch:
            foreach (IObiConstraints constraintData in bp.GetConstraints())
            {
                // Create runtime counterpart
                IObiConstraints runtimeConstraints = constraintData.Clone(this);

                if (runtimeConstraints.GetConstraintType().HasValue)
                {
                    // Store a reference to it in the constraint map, so that they can be accessed by type enum:
                    m_Constraints[(int)runtimeConstraints.GetConstraintType().Value] = runtimeConstraints;

                    // Add it to solver:
                    runtimeConstraints.AddToSolver();
                }
            }
        }
Пример #25
0
        public override IObiConstraintsBatch Clone(IObiConstraints constraints)
        {
            var clone = new ObiShapeMatchingConstraintsBatch(constraints as ObiShapeMatchingConstraintsData, this);

            clone.particleIndices.ResizeUninitialized(particleIndices.count);
            clone.firstIndex.ResizeUninitialized(firstIndex.count);
            clone.numIndices.ResizeUninitialized(numIndices.count);
            clone.explicitGroup.ResizeUninitialized(explicitGroup.count);
            clone.materialParameters.ResizeUninitialized(materialParameters.count);

            clone.particleIndices.CopyFrom(particleIndices);
            clone.firstIndex.CopyFrom(firstIndex);
            clone.numIndices.CopyFrom(numIndices);
            clone.explicitGroup.CopyFrom(explicitGroup);
            clone.materialParameters.CopyFrom(materialParameters);

            clone.restComs.ResizeUninitialized(constraintCount);
            clone.coms.ResizeUninitialized(constraintCount);
            clone.orientations.ResizeUninitialized(constraintCount);

            return(clone);
        }
Пример #26
0
        public override IObiConstraintsBatch Clone(IObiConstraints constraints)
        {
            var clone = new ObiPinConstraintsBatch(constraints as ObiPinConstraintsData, this);

            // careful here: since IntPtr is not serializable and the pinBodies array can be null, use offsets count instead.
            clone.pinBodies.Capacity = offsets.count;
            clone.pinBodies.Clear();

            if (pinBodies != null)
            {
                for (int i = 0; i < offsets.count; ++i)
                {
                    clone.pinBodies.Add(pinBodies[i]);
                }
            }
            else
            {
                for (int i = 0; i < offsets.count; ++i)
                {
                    clone.pinBodies.Add(new ObiColliderHandle());
                }
            }


            clone.particleIndices.ResizeUninitialized(particleIndices.count);
            clone.offsets.ResizeUninitialized(offsets.count);
            clone.restDarbouxVectors.ResizeUninitialized(restDarbouxVectors.count);
            clone.stiffnesses.ResizeUninitialized(stiffnesses.count);
            clone.breakThresholds.ResizeUninitialized(breakThresholds.count);

            clone.particleIndices.CopyFrom(particleIndices);
            clone.offsets.CopyFrom(offsets);
            clone.restDarbouxVectors.CopyFrom(restDarbouxVectors);
            clone.stiffnesses.CopyFrom(stiffnesses);
            clone.breakThresholds.CopyFrom(breakThresholds);

            return(clone);
        }
Пример #27
0
 public abstract IObiConstraintsBatch Clone(IObiConstraints constraints);
 protected virtual void OnAddToSolver(IObiConstraints constraints)
 {
 }
 protected virtual void OnRemoveFromSolver(IObiConstraints constraints)
 {
 }