static FlexExt.Asset.Handle CreateTestClothAsset() { Vector4[] particles = { new Vector4(1, 1, 0), new Vector4(0, 1, 0), new Vector4(-1, 1, 0), new Vector4(1, 0, 0), new Vector4(0, 0, 0), new Vector4(-1, 0, 0), new Vector4(1, -1, 0), new Vector4(0, -1, 0), new Vector4(-1, -1, 0) }; int[] indices = { 0, 1, 4, 0, 4, 3, 1, 2, 5, 1, 5, 4, 3, 4, 7, 3, 7, 6, 4, 5, 8, 4, 8, 7 }; float stretchStiffness = 1.0f; float bendStiffness = 1.0f; float tetherStiffness = 1.0f; float tetherGive = 1.0f; float pressure = 0.0f; return(FlexExt.CreateClothFromMesh(ref particles[0], particles.Length, ref indices[0], indices.Length / 3, stretchStiffness, bendStiffness, tetherStiffness, tetherGive, pressure)); }
void BuildFromMesh() { if (m_referenceMesh) { Vector3[] vertices = m_referenceMesh.vertices; int[] triangles = m_referenceMesh.triangles; if (vertices != null && vertices.Length > 0 && triangles != null && triangles.Length > 0) { Tesselation(ref vertices, ref triangles, m_meshTesselation); int[] uniqueVerts = new int[vertices.Length]; int[] originalToUniqueMap = new int[vertices.Length]; int particleCount = FlexExt.CreateWeldedMeshIndices(ref vertices[0], vertices.Length, ref uniqueVerts[0], ref originalToUniqueMap[0], m_weldingThreshold); Vector4[] particles = new Vector4[particleCount]; for (int i = 0; i < particleCount; ++i) { Vector3 v = vertices[uniqueVerts[i]]; particles[i] = new Vector4(v.x * m_meshLocalScale.x, v.y * m_meshLocalScale.y, v.z * m_meshLocalScale.z, 1.0f); } foreach (var i in fixedParticles) { if (i < particleCount) { particles[i].w = 0.0f; } } int indexCount = triangles.Length; int[] indices = new int[indexCount]; for (int i = 0; i < indexCount; ++i) { indices[i] = originalToUniqueMap[triangles[i]]; } FlexExt.Asset.Handle assetHandle = FlexExt.CreateClothFromMesh(ref particles[0], particles.Length, ref indices[0], indices.Length / 3, m_stretchStiffness, m_bendStiffness, m_tetherStiffness, m_tetherGive, m_pressure); if (assetHandle) { StoreAsset(assetHandle.asset); FlexExt.DestroyAsset(assetHandle); } } } }
public void TestCreateClothFromMesh() { Vector4[] particles = { new Vector4(1, 1, 0, 1), new Vector4(0, 1, 0, 1), new Vector4(-1, 1, 0, 1), new Vector4(1, 0, 0, 1), new Vector4(0, 0, 0, 1), new Vector4(-1, 0, 0, 1), new Vector4(1, -1, 0, 1), new Vector4(0, -1, 0, 1), new Vector4(-1, -1, 0, 1) }; int[] indices = { 0, 1, 4, 0, 4, 3, 1, 2, 5, 1, 5, 4, 3, 4, 7, 3, 7, 6, 4, 5, 8, 4, 8, 7 }; float stretchStiffness = 1.0f; float bendStiffness = 1.0f; float tetherStiffness = 1.0f; float tetherGive = 1.0f; float pressure = 0.0f; FlexExt.Asset.Handle handle = FlexExt.CreateClothFromMesh(ref particles[0], particles.Length, ref indices[0], indices.Length / 3, stretchStiffness, bendStiffness, tetherStiffness, tetherGive, pressure); if (handle.valid) { FlexExt.Asset asset = handle.asset; Assert.AreEqual(particles.Length, asset.numParticles); Assert.AreEqual(indices.Length / 3, asset.numTriangles); FlexExt.DestroyAsset(handle); } }
void BuildFromMesh() { if (m_referenceMesh) { Vector3[] vertices = m_referenceMesh.vertices; int[] triangles = m_referenceMesh.triangles; if (vertices != null && vertices.Length > 0 && triangles != null && triangles.Length > 0) { for (int i = 0; i < m_meshTesselation; ++i) { Vector3[] newVertices = new Vector3[triangles.Length * 4]; int[] newTriangles = new int[triangles.Length * 4]; for (int j = 0; j < triangles.Length / 3; ++j) { Vector3 v0 = vertices[triangles[j * 3 + 0]], v1 = vertices[triangles[j * 3 + 1]], v2 = vertices[triangles[j * 3 + 2]]; Vector3 v3 = (v0 + v1) * 0.5f, v4 = (v1 + v2) * 0.5f, v5 = (v2 + v0) * 0.5f; int i0 = j * 12 + 0, i1 = j * 12 + 1, i2 = j * 12 + 2; int i3 = j * 12 + 3, i4 = j * 12 + 4, i5 = j * 12 + 5; int i6 = j * 12 + 6, i7 = j * 12 + 7, i8 = j * 12 + 8; int i9 = j * 12 + 9, iA = j * 12 + 10, iB = j * 12 + 11; newTriangles[i0] = i0; newTriangles[i1] = i1; newTriangles[i2] = i2; newTriangles[i3] = i3; newTriangles[i4] = i4; newTriangles[i5] = i5; newTriangles[i6] = i6; newTriangles[i7] = i7; newTriangles[i8] = i8; newTriangles[i9] = i9; newTriangles[iA] = iA; newTriangles[iB] = iB; newVertices[i0] = v0; newVertices[i1] = v3; newVertices[i2] = v5; newVertices[i3] = v3; newVertices[i4] = v1; newVertices[i5] = v4; newVertices[i6] = v5; newVertices[i7] = v4; newVertices[i8] = v2; newVertices[i9] = v3; newVertices[iA] = v4; newVertices[iB] = v5; } vertices = newVertices; triangles = newTriangles; } int[] uniqueVerts = new int[vertices.Length]; int[] originalToUniqueMap = new int[vertices.Length]; int particleCount = FlexExt.CreateWeldedMeshIndices(ref vertices[0], vertices.Length, ref uniqueVerts[0], ref originalToUniqueMap[0], m_weldingThreshold); Vector4[] particles = new Vector4[particleCount]; for (int i = 0; i < particleCount; ++i) { Vector3 v = vertices[uniqueVerts[i]]; particles[i] = new Vector4(v.x * m_meshLocalScale.x, v.y * m_meshLocalScale.y, v.z * m_meshLocalScale.z, 1.0f); } foreach (var i in fixedParticles) { if (i < particleCount) { particles[i].w = 0.0f; } } int indexCount = triangles.Length; int[] indices = new int[indexCount]; for (int i = 0; i < indexCount; ++i) { indices[i] = originalToUniqueMap[triangles[i]]; } FlexExt.Asset.Handle assetHandle = FlexExt.CreateClothFromMesh(ref particles[0], particles.Length, ref indices[0], indices.Length / 3, m_stretchStiffness, m_bendStiffness, m_tetherStiffness, m_tetherGive, m_pressure); if (assetHandle) { StoreAsset(assetHandle.asset); FlexExt.DestroyAsset(assetHandle); } } } }