Exemple #1
0
        public static void CreateAndSave(UnaliasedMesh mesh, string path, int radius = 5, bool useKring = true)
        {
            MeshCurvatureDetailGenerator detailGenerator = new MeshCurvatureDetailGenerator();
            var detail = detailGenerator.Generate(mesh, radius, useKring);

            MyAssetDatabase.CreateAndSaveAsset(detail, path);
        }
Exemple #2
0
        public MeshCurvatureDetailSE Generate(UnaliasedMesh mesh, int radius = 5, bool useKring = true)
        {
            //var originalVertices = mesh.vertices;
            //var originalTriangles = mesh.triangles;

            //var verticlesToOriginalVerticles = new Dictionary<Vector3, List<int>>();
            //for (int i = 0; i < originalVertices.Length; i++)
            //{
            //    var vert = originalVertices[i];
            //    if (!verticlesToOriginalVerticles.ContainsKey(vert))
            //    {
            //        verticlesToOriginalVerticles[vert] = new List<int>();
            //    }
            //    verticlesToOriginalVerticles[vert].Add(i);
            //}

            //var vertices = verticlesToOriginalVerticles.Keys.ToArray();

            //var originalIndexToIndexDict = new int[originalVertices.Length];
            //for (int i = 0; i < vertices.Length; i++)
            //{
            //    var v = vertices[i];
            //    foreach (var originalIndex in verticlesToOriginalVerticles[v])
            //    {
            //        originalIndexToIndexDict[originalIndex] = i;
            //    }
            //}

            //var triangles = originalTriangles
            //    .Select(c => originalIndexToIndexDict[c])
            //    .ToArray();

            var verticesFlatArray = mesh.Vertices.SelectMany(c => c.ToArray()).ToArray();
            var verticesCount     = mesh.Vertices.Length;
            var trianglesCount    = mesh.Triangles.Length / 3;

            var outDirection1 = new float[3 * verticesCount];
            var outDirection2 = new float[3 * verticesCount];
            var outValues1    = new float[verticesCount];
            var outValues2    = new float[verticesCount];

            PrincipalCurvatureDll.EnableLogging();
            int callStatus = PrincipalCurvatureDll.compute_principal_curvature(verticesFlatArray, verticesCount, mesh.Triangles, trianglesCount, outDirection1, outDirection2,
                                                                               outValues1, outValues2, radius, useKring);

            Preconditions.Assert(callStatus == 0, "Calling compute_principal_curvature failed, as returned status " + callStatus);

            var od1 = FlatArrayToVectorArray(outDirection1);
            var od2 = FlatArrayToVectorArray(outDirection2);

            return(MeshCurvatureDetailSE.CreateDetail(
                       mesh.OriginalIndexToIndex.Select(c => od1[c]).ToArray(),
                       mesh.OriginalIndexToIndex.Select(c => od2[c]).ToArray(),
                       mesh.OriginalIndexToIndex.Select(c => outValues1[c]).ToArray(),
                       mesh.OriginalIndexToIndex.Select(c => outValues2[c]).ToArray()
                       ));
        }
Exemple #3
0
        public List <Vector2> GenerateUv(UnaliasedMesh mesh)
        {
            var flatVerticlesArray = mesh.Vertices.SelectMany(c => c.ToArray()).ToArray();
            var verticlesCount     = mesh.Vertices.Length;
            var outUvsArray        = new float[verticlesCount * 2];

            var result = PrincipalCurvatureDll.compute_arapUv(flatVerticlesArray, verticlesCount, mesh.Triangles, mesh.Triangles.Length / 3, outUvsArray, 100);

            Preconditions.Assert(result == 0, "Calling compute_arapUv failed, as returned status " + result);

            var uvsAsVectors = new Vector2[verticlesCount];

            for (int i = 0; i < verticlesCount; i++)
            {
                uvsAsVectors[i] = new Vector2(outUvsArray[i * 2 + 0], outUvsArray[i * 2 + 1]);
            }

            return(mesh.OriginalIndexToIndex.Select(c => uvsAsVectors[c]).ToList());
        }
Exemple #4
0
        public static MeshCurvatureDetailSE Generate(UnaliasedMesh mesh, int radius = 5, bool useKring = true)
        {
            MeshCurvatureDetailGenerator detailGenerator = new MeshCurvatureDetailGenerator();

            return(detailGenerator.Generate(mesh, radius, useKring));
        }