Exemple #1
0
        public override void PushDataToSolver(ObiBatchedConstraints constraints)
        {
            if (constraints == null || constraints.Actor == null || !constraints.Actor.InSolver)
            {
                return;
            }

            ObiShapeMatchingConstraints sc = (ObiShapeMatchingConstraints)constraints;

            restComs     = new AlignedVector4Array(ConstraintCount);
            coms         = new AlignedVector4Array(ConstraintCount);
            orientations = new AlignedQuaternionArray(ConstraintCount, constraints.Actor.ActorLocalToSolverMatrix.rotation);

            for (int i = 0; i < shapeMaterialParameters.Count; i++)
            {
                shapeMaterialParameters[i] = new Oni.ElastoplasticMaterial(sc.stiffness, sc.plasticYield, sc.plasticCreep, sc.plasticRecovery, sc.maxDeform);
            }

            Oni.SetShapeMatchingConstraints(batch,
                                            solverIndices,
                                            firstIndex.ToArray(),
                                            numIndices.ToArray(),
                                            explicitGroup.ToArray(),
                                            shapeMaterialParameters.ToArray(),
                                            restComs.GetIntPtr(),
                                            coms.GetIntPtr(),
                                            orientations.GetIntPtr(),
                                            ConstraintCount);

            Oni.CalculateRestShapeMatching(constraints.Actor.Solver.OniSolver, batch);
        }
        public void Initialize()
        {
            // Tear everything down first:
            Teardown();

            try{
                // Create a default material:
                defaultFluidMaterial           = ScriptableObject.CreateInstance <ObiEmitterMaterialFluid>();
                defaultFluidMaterial.hideFlags = HideFlags.HideAndDontSave;

                // Create the Oni solver:
                oniSolver = Oni.CreateSolver(maxParticles);

                // Initialize moving transform:
                InitializeTransformFrame();

                actors               = new List <ObiActor>();
                activeParticles      = new int[maxParticles];
                particleToActor      = new ParticleInActor[maxParticles];
                materialIndices      = new int[maxParticles];
                fluidMaterialIndices = new int[maxParticles];

                positions = new AlignedVector4Array(maxParticles);
                Oni.SetParticlePositions(oniSolver, positions.GetIntPtr());

                startPositions = new AlignedVector4Array(maxParticles);
                Oni.SetParticleStartPositions(oniSolver, startPositions.GetIntPtr());

                prevPositions = new AlignedVector4Array(maxParticles);
                Oni.SetParticlePreviousPositions(oniSolver, prevPositions.GetIntPtr());

                restPositions = new AlignedVector4Array(maxParticles);
                Oni.SetRestPositions(oniSolver, restPositions.GetIntPtr());

                velocities = new AlignedVector4Array(maxParticles);
                Oni.SetParticleVelocities(oniSolver, velocities.GetIntPtr());

                orientations = new AlignedQuaternionArray(maxParticles, Quaternion.identity);
                Oni.SetParticleOrientations(oniSolver, orientations.GetIntPtr());

                startOrientations = new AlignedQuaternionArray(maxParticles, Quaternion.identity);
                Oni.SetParticleStartOrientations(oniSolver, startOrientations.GetIntPtr());

                prevOrientations = new AlignedQuaternionArray(maxParticles, Quaternion.identity);
                Oni.SetParticlePreviousOrientations(oniSolver, prevOrientations.GetIntPtr());

                restOrientations = new AlignedQuaternionArray(maxParticles, Quaternion.identity);
                Oni.SetRestOrientations(oniSolver, restOrientations.GetIntPtr());

                angularVelocities = new AlignedVector4Array(maxParticles);
                Oni.SetParticleAngularVelocities(oniSolver, angularVelocities.GetIntPtr());

                invMasses = new AlignedFloatArray(maxParticles);
                Oni.SetParticleInverseMasses(oniSolver, invMasses.GetIntPtr());

                invRotationalMasses = new AlignedFloatArray(maxParticles);
                Oni.SetParticleInverseRotationalMasses(oniSolver, invRotationalMasses.GetIntPtr());

                principalRadii = new AlignedVector4Array(maxParticles);
                Oni.SetParticlePrincipalRadii(oniSolver, principalRadii.GetIntPtr());

                phases = new AlignedIntArray(maxParticles);
                Oni.SetParticlePhases(oniSolver, phases.GetIntPtr());

                renderablePositions = new AlignedVector4Array(maxParticles);
                Oni.SetRenderableParticlePositions(oniSolver, renderablePositions.GetIntPtr());

                renderableOrientations = new AlignedQuaternionArray(maxParticles, Quaternion.identity);
                Oni.SetRenderableParticleOrientations(oniSolver, renderableOrientations.GetIntPtr());

                anisotropies = new AlignedVector4Array(maxParticles * 3);
                Oni.SetParticleAnisotropies(oniSolver, anisotropies.GetIntPtr());

                smoothingRadii = new AlignedFloatArray(maxParticles);
                Oni.SetParticleSmoothingRadii(oniSolver, smoothingRadii.GetIntPtr());

                buoyancies = new AlignedFloatArray(maxParticles);
                Oni.SetParticleBuoyancy(oniSolver, buoyancies.GetIntPtr());

                restDensities = new AlignedFloatArray(maxParticles);
                Oni.SetParticleRestDensities(oniSolver, restDensities.GetIntPtr());

                viscosities = new AlignedFloatArray(maxParticles);
                Oni.SetParticleViscosities(oniSolver, viscosities.GetIntPtr());

                surfaceTension = new AlignedFloatArray(maxParticles);
                Oni.SetParticleSurfaceTension(oniSolver, surfaceTension.GetIntPtr());

                vortConfinement = new AlignedFloatArray(maxParticles);
                Oni.SetParticleVorticityConfinement(oniSolver, vortConfinement.GetIntPtr());

                atmosphericDrag     = new AlignedFloatArray(maxParticles);
                atmosphericPressure = new AlignedFloatArray(maxParticles);
                Oni.SetParticleAtmosphericDragPressure(oniSolver, atmosphericDrag.GetIntPtr(), atmosphericPressure.GetIntPtr());

                diffusion = new AlignedFloatArray(maxParticles);
                Oni.SetParticleDiffusion(oniSolver, diffusion.GetIntPtr());

                vorticities = new AlignedVector4Array(maxParticles);
                Oni.SetParticleVorticities(oniSolver, vorticities.GetIntPtr());

                fluidData = new AlignedVector4Array(maxParticles);
                Oni.SetParticleFluidData(oniSolver, fluidData.GetIntPtr());

                userData = new AlignedVector4Array(maxParticles);
                Oni.SetParticleUserData(oniSolver, userData.GetIntPtr());

                externalForces = new AlignedVector4Array(maxParticles);
                Oni.SetParticleExternalForces(oniSolver, externalForces.GetIntPtr());

                externalTorques = new AlignedVector4Array(maxParticles);
                Oni.SetParticleExternalTorques(oniSolver, externalTorques.GetIntPtr());

                wind = new AlignedVector4Array(maxParticles);
                Oni.SetParticleWinds(oniSolver, wind.GetIntPtr());

                positionDeltas = new AlignedVector4Array(maxParticles);
                Oni.SetParticlePositionDeltas(oniSolver, positionDeltas.GetIntPtr());

                orientationDeltas = new AlignedQuaternionArray(maxParticles, new Quaternion(0, 0, 0, 0));
                Oni.SetParticleOrientationDeltas(oniSolver, orientationDeltas.GetIntPtr());

                positionConstraintCounts = new AlignedIntArray(maxParticles);
                Oni.SetParticlePositionConstraintCounts(oniSolver, positionConstraintCounts.GetIntPtr());

                orientationConstraintCounts = new AlignedIntArray(maxParticles);
                Oni.SetParticleOrientationConstraintCounts(oniSolver, orientationConstraintCounts.GetIntPtr());

                normals = new AlignedVector4Array(maxParticles);
                Oni.SetParticleNormals(oniSolver, normals.GetIntPtr());

                invInertiaTensors = new AlignedVector4Array(maxParticles);
                Oni.SetParticleInverseInertiaTensors(oniSolver, invInertiaTensors.GetIntPtr());

                // Initialize parameters:
                UpdateParameters();
            }catch (Exception exception) {
                Debug.LogException(exception);
            }finally{
                initialized = true;
            };
        }