Exemplo n.º 1
0
        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();
            }
        }
Exemplo n.º 2
0
        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();
            }
        }
Exemplo n.º 4
0
        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();
            }
        }
Exemplo n.º 5
0
        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();
            }
        }
Exemplo n.º 6
0
        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();
            }
        }
Exemplo n.º 7
0
        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();
            }
        }
Exemplo n.º 8
0
        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();
            }
        }
Exemplo n.º 10
0
        /**
         * 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();
            }
        }
Exemplo n.º 11
0
 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);
         }
     }
 }
Exemplo n.º 12
0
 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();
            }
        }
Exemplo n.º 14
0
        /**
         * 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];
                }
            }
        }
Exemplo n.º 15
0
        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();
            }
        }
Exemplo n.º 16
0
        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();
            }
        }
Exemplo n.º 17
0
        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();
            }
        }
Exemplo n.º 18
0
        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();
            }
        }
Exemplo n.º 20
0
        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();
            }
        }
Exemplo n.º 21
0
        /**
         * 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)
 {
 }