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); }
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); } }
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); }
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); } }
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); }