Exemple #1
0
        private void PushParticlesToGPU(IntPtr solverPtr, FlexContainer cnt, Flex.Memory memory)
        {
            Flex.SetActive(solverPtr, cnt.m_activeSetHndl.AddrOfPinnedObject(), cnt.m_activeParticlesCount, memory);

            Flex.SetParticles(solverPtr, cnt.m_particlesHndl.AddrOfPinnedObject(), cnt.m_particlesCount, memory);
            Flex.SetRestParticles(solverPtr, cnt.m_restParticlesHndl.AddrOfPinnedObject(), cnt.m_particlesCount, memory);
            Flex.SetVelocities(solverPtr, cnt.m_velocitiesHndl.AddrOfPinnedObject(), cnt.m_particlesCount, memory);
            Flex.SetNormals(solverPtr, cnt.m_normalsHndl.AddrOfPinnedObject(), cnt.m_particlesCount, memory);
            Flex.SetPhases(solverPtr, cnt.m_phases, cnt.m_particlesCount, memory);
        }
Exemple #2
0
        private void PullParticlesFromGPU(IntPtr solverPtr, FlexContainer cnt, Flex.Memory memory)
        {
            Flex.GetParticles(m_solverPtr, m_cntr.m_particlesHndl.AddrOfPinnedObject(), m_cntr.m_particlesCount, memory);
            Flex.GetVelocities(m_solverPtr, m_cntr.m_velocitiesHndl.AddrOfPinnedObject(), m_cntr.m_particlesCount, memory);
            Flex.GetPhases(m_solverPtr, m_cntr.m_phasesHndl.AddrOfPinnedObject(), m_cntr.m_particlesCount, memory);

            Flex.GetSmoothParticles(m_solverPtr, m_cntr.m_smoothedParticlesHndl.AddrOfPinnedObject(), m_cntr.m_particlesCount, memory);
            Flex.GetNormals(m_solverPtr, m_cntr.m_normalsHndl.AddrOfPinnedObject(), m_cntr.m_particlesCount, memory);
            Flex.GetDensities(m_solverPtr, m_cntr.m_densitiesHndl.AddrOfPinnedObject(), memory);
            Flex.GetBounds(m_solverPtr, ref m_minBounds, ref m_maxBounds, memory);

            if (m_cntr.m_shapeCoefficients.Length > 0)
            {
                Flex.GetRigidTransforms(m_solverPtr, m_cntr.m_shapeRotationHndl.AddrOfPinnedObject(), m_cntr.m_shapeTranslationsHndl.AddrOfPinnedObject(), memory);
            }
        }
Exemple #3
0
        public void UpdateColliders(IntPtr solverPtr, Flex.Memory memory)
        {
            for (int i = 0; i < m_collidersCount; i++)
            {
                //  Mesh mesh = m_meshColliders[i].GetComponent<MeshFilter>().mesh;
                MeshCollider meshCollider = m_meshColliders[i];
                Transform    tr           = m_meshColliders[i].transform;

                m_collidersPrevPositions[i] = m_collidersPositions[i];
                m_collidersPositions[i]     = tr.position;

                m_collidersPrevRotations[i] = m_collidersRotations[i];
                m_collidersRotations[i]     = tr.rotation;

                m_collidersAabbMin[i] = meshCollider.bounds.min;
                m_collidersAabbMax[i] = meshCollider.bounds.max;
            }

            Flex.SetShapes(solverPtr, m_collidersGeometry, m_collidersGeometry.Length, m_collidersAabbMin, m_collidersAabbMax, m_collidersStarts, m_collidersPositions, m_collidersRotations,
                           m_collidersPrevPositions, m_collidersPrevRotations, m_collidersFlags, m_collidersStarts.Length, memory);
        }
Exemple #4
0
        private void PushConstraintsToGPU(IntPtr solverPtr, FlexContainer cnt, Flex.Memory memory)
        {
            if (cnt.m_springsCount > 0)
            {
                Flex.SetSprings(solverPtr, cnt.m_springIndices, cnt.m_springRestLengths, cnt.m_springCoefficients, cnt.m_springsCount, memory);
            }
            else
            {
                Flex.SetSprings(solverPtr, null, null, null, 0, memory);
            }

            if (cnt.m_shapesCount > 0)
            {
                Flex.SetRigids(solverPtr, cnt.m_shapeOffsets, cnt.m_shapeIndices, cnt.m_shapeRestPositions, null, cnt.m_shapeCoefficients, cnt.m_shapeRotations, cnt.m_shapeTranslations, cnt.m_shapeOffsets.Length - 1, memory);
            }
            else
            {
                Flex.SetRigids(solverPtr, null, null, null, null, null, null, null, 0, memory);
            }

            if (cnt.m_trianglesCount > 0)
            {
                Flex.SetDynamicTriangles(solverPtr, cnt.m_triangleIndices, cnt.m_triangleNormals, cnt.m_trianglesCount, memory);
            }
            else
            {
                Flex.SetDynamicTriangles(solverPtr, null, null, 0, memory);
            }

            if (cnt.m_inflatablesCount > 0)
            {
                Flex.SetInflatables(solverPtr, cnt.m_inflatableStarts, cnt.m_inflatableCounts, cnt.m_inflatableVolumes, cnt.m_inflatablePressures, cnt.m_inflatableStiffness, cnt.m_inflatablesCount, memory);
            }
            else
            {
                Flex.SetInflatables(solverPtr, null, null, null, null, null, 0, memory);
            }
        }
Exemple #5
0
        public void ProcessColliders(IntPtr solverPtr, Flex.Memory memory)
        {
            m_meshColliders  = FindObjectsOfType <MeshCollider>();
            m_collidersCount = m_meshColliders.Length;

            m_collidersGeometry = new Flex.CollisionTriangleMesh[m_collidersCount];

            m_collidersPositions     = new Vector4[m_collidersCount];
            m_collidersPrevPositions = new Vector4[m_collidersCount];

            m_collidersRotations     = new Quaternion[m_collidersCount];
            m_collidersPrevRotations = new Quaternion[m_collidersCount];

            m_collidersAabbMin = new Vector4[m_collidersCount];
            m_collidersAabbMax = new Vector4[m_collidersCount];

            m_collidersStarts = new int[m_collidersCount];
            m_collidersFlags  = new int[m_collidersCount];

            for (int i = 0; i < m_collidersCount; i++)
            {
                Mesh         mesh         = m_meshColliders[i].GetComponent <MeshFilter>().mesh;
                MeshCollider meshCollider = m_meshColliders[i];
                Transform    tr           = m_meshColliders[i].transform;

                Vector3[] vertices  = mesh.vertices;
                int[]     triangles = mesh.triangles;

                Vector3 localLowerBound = mesh.bounds.min;
                Vector3 localUpperBound = mesh.bounds.max;
                // FlexUtils.GetBounds(vertices, out localLowerBound, out localUpperBound);

                IntPtr meshPtr = Flex.CreateTriangleMesh();
                Flex.UpdateTriangleMesh(meshPtr, vertices, triangles, mesh.vertexCount, mesh.triangles.Length / 3, ref localLowerBound, ref localUpperBound, memory);

                //TODO
                //FlexAPI.FlexCollisionGeometry geo = new FlexAPI.FlexCollisionGeometry();
                //geo.mTriMesh.mMesh = meshPtr;
                //geo.mTriMesh.mScale = tr.lossyScale.x;

                //FlexAPI.FlexCollisionGeometry[] shapeGeometry = new FlexAPI.FlexCollisionGeometry[] { geo };

                Flex.CollisionTriangleMesh triCol = new Flex.CollisionTriangleMesh();
                triCol.mMesh  = meshPtr;
                triCol.mScale = tr.lossyScale.x;

                m_collidersGeometry[i] = triCol;

                m_collidersPositions[i]     = tr.position;
                m_collidersPrevPositions[i] = tr.position;

                m_collidersRotations[i]     = tr.rotation;
                m_collidersPrevRotations[i] = tr.rotation;

                m_collidersAabbMin[i] = meshCollider.bounds.min;
                m_collidersAabbMax[i] = meshCollider.bounds.max;

                m_collidersStarts[i] = i;
                m_collidersFlags[i]  = Flex.MakeShapeFlags(Flex.CollisionShapeType.eFlexShapeTriangleMesh, !m_meshColliders[i].gameObject.isStatic);
            }

            UpdateColliders(solverPtr, memory);
        }