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 static MeshCurvatureDetailSE CreateDetail(Vector3[] principalDirection1, Vector3[] principalDirection2, float[] principalValue1, float[] principalValue2) { MeshCurvatureDetailSE detail = ScriptableObject.CreateInstance <MeshCurvatureDetailSE>(); detail.PrincipalDirection1 = principalDirection1; detail.PrincipalDirection2 = principalDirection2; detail.PrincipalValue1 = principalValue1; detail.PrincipalValue2 = principalValue2; return(detail); }