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