public override void Merge(ObiActor actor, IObiConstraintsBatch other) { var batch = other as ObiBendTwistConstraintsBatch; var user = actor as IBendTwistConstraintsUser; if (batch != null && user != null) { if (!user.bendTwistConstraintsEnabled) { return; } particleIndices.ResizeUninitialized((m_ActiveConstraintCount + batch.activeConstraintCount) * 2); restDarbouxVectors.ResizeUninitialized(m_ActiveConstraintCount + batch.activeConstraintCount); stiffnesses.ResizeUninitialized(m_ActiveConstraintCount + batch.activeConstraintCount); lambdas.ResizeInitialized((m_ActiveConstraintCount + batch.activeConstraintCount) * 3); restDarbouxVectors.CopyFrom(batch.restDarbouxVectors, 0, m_ActiveConstraintCount, batch.activeConstraintCount); stiffnesses.CopyReplicate(new Vector3(user.torsionCompliance, user.bend1Compliance, user.bend2Compliance), m_ActiveConstraintCount, batch.activeConstraintCount); for (int i = 0; i < batch.activeConstraintCount * 2; ++i) { particleIndices[m_ActiveConstraintCount * 2 + i] = actor.solverIndices[batch.particleIndices[i]]; } base.Merge(actor, other); } }
public override void Merge(ObiActor actor, IObiConstraintsBatch other) { var batch = other as ObiPinConstraintsBatch; if (batch != null) { particleIndices.ResizeUninitialized(m_ActiveConstraintCount + batch.activeConstraintCount); colliderIndices.ResizeUninitialized(m_ActiveConstraintCount + batch.activeConstraintCount); offsets.ResizeUninitialized(m_ActiveConstraintCount + batch.activeConstraintCount); restDarbouxVectors.ResizeUninitialized(m_ActiveConstraintCount + batch.activeConstraintCount); stiffnesses.ResizeUninitialized((m_ActiveConstraintCount + batch.activeConstraintCount) * 2); breakThresholds.ResizeUninitialized(m_ActiveConstraintCount + batch.activeConstraintCount); lambdas.ResizeInitialized((m_ActiveConstraintCount + batch.activeConstraintCount) * 4); offsets.CopyFrom(batch.offsets, 0, m_ActiveConstraintCount, batch.activeConstraintCount); restDarbouxVectors.CopyFrom(batch.restDarbouxVectors, 0, m_ActiveConstraintCount, batch.activeConstraintCount); stiffnesses.CopyFrom(batch.stiffnesses, 0, m_ActiveConstraintCount * 2, batch.activeConstraintCount * 2); breakThresholds.CopyFrom(batch.breakThresholds, 0, m_ActiveConstraintCount, batch.activeConstraintCount); for (int i = 0; i < batch.activeConstraintCount; ++i) { particleIndices[m_ActiveConstraintCount + i] = batch.particleIndices[i]; colliderIndices[m_ActiveConstraintCount + i] = batch.pinBodies[i] != null ? batch.pinBodies[i].index : -1; } base.Merge(actor, other); } }
public override void Merge(ObiActor actor, IObiConstraintsBatch other) { var batch = other as ObiStretchShearConstraintsBatch; var user = actor as IStretchShearConstraintsUser; if (batch != null && user != null) { if (!user.stretchShearConstraintsEnabled) { return; } particleIndices.ResizeUninitialized((m_ActiveConstraintCount + batch.activeConstraintCount) * 2); orientationIndices.ResizeUninitialized(m_ActiveConstraintCount + batch.activeConstraintCount); restLengths.ResizeUninitialized(m_ActiveConstraintCount + batch.activeConstraintCount); restOrientations.ResizeUninitialized(lambdas.count + batch.activeConstraintCount); stiffnesses.ResizeUninitialized(m_ActiveConstraintCount + batch.activeConstraintCount); lambdas.ResizeInitialized((m_ActiveConstraintCount + batch.activeConstraintCount) * 3); restLengths.CopyFrom(batch.restLengths, 0, m_ActiveConstraintCount, batch.activeConstraintCount); restOrientations.CopyFrom(batch.restOrientations, 0, m_ActiveConstraintCount, batch.activeConstraintCount); stiffnesses.CopyReplicate(new Vector3(user.stretchCompliance, user.shear1Compliance, user.shear2Compliance), m_ActiveConstraintCount, batch.activeConstraintCount); for (int i = 0; i < batch.activeConstraintCount * 2; ++i) { particleIndices[m_ActiveConstraintCount * 2 + i] = actor.solverIndices[batch.particleIndices[i]]; } for (int i = 0; i < batch.activeConstraintCount; ++i) { orientationIndices[m_ActiveConstraintCount + i] = actor.solverIndices[batch.orientationIndices[i]]; } base.Merge(actor, other); } }