コード例 #1
0
    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));
    }
コード例 #2
0
 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);
             }
         }
     }
 }
コード例 #3
0
    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);
        }
    }
コード例 #4
0
 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);
             }
         }
     }
 }