コード例 #1
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 (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();
            }
        }
コード例 #2
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);
            }
            }
        }
コード例 #3
0
        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();
            }
        }
コード例 #4
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();
            }
        }
コード例 #5
0
ファイル: ObiActor.cs プロジェクト: cupsster/ExtremeBusiness
        /**
         * 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();
        }
コード例 #6
0
ファイル: ObiActor.cs プロジェクト: cupsster/ExtremeBusiness
        /**
         * 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];
            }
        }