public static FileExplorer ImportModel(FileExplorer script) { script.mode = FileExplorerMode.Open; script.SetExtensionsArray(new string[] { ".obj" }); script.UpdateDirectory(); script.OnAccepted += (text) => { if (System.String.IsNullOrWhiteSpace(text)) { return; } try { MeshToSdfGpu.TemporaryMesh mesh = TranslateObjToModel(text); MeshToSdfGpu.TranslateTrianglesToSdf(mesh, mesh.triangles.Length / 9, true); } catch { UIController.Instance.ShowMessageBox("Model could not be loaded - incorrect file format"); } script.Close(); }; return(script); }
private static MeshToSdfGpu.TemporaryMesh TranslateObjToModel(string path) { StreamReader streamReader = new StreamReader(path); List <int[]> trianglesIndices = new List <int[]>(); List <Vector3> vertices = new List <Vector3>(); while (!streamReader.EndOfStream) { string current = streamReader.ReadLine(); if (current.Length > 2) { if (current[0] == 'f') { var temp = ParseToFace(current); for (int i = 0; i < temp.Count / 3; i++) { int[] triIndices = new int[3]; for (int j = 0; j < 3; j++) { if (temp[3 * i + j].x > 0) { triIndices[j] = temp[3 * i + j].x - 1; } else { triIndices[j] = vertices.Count + temp[3 * i + j].x; } } trianglesIndices.Add(triIndices); } } else if (current[0] == 'v') { if (current[1] == ' ') { Vector3 t = ParseToVector3(current); t.x = -t.x; vertices.Add(t); } } } } streamReader.Close(); LayerManager.Instance.AddNewLayer(); Vector3 min = Vector3.positiveInfinity, max = Vector3.negativeInfinity; for (int i = 0; i < vertices.Count; i++) { min = Vector3.Min(min, vertices[i]); max = Vector3.Max(max, vertices[i]); } Vector3 sceneStart = LayerManager.Instance.ActiveLayer.chunks[0, 0, 0].RealCoordinates(Vector3Int.zero); Vector3 sceneEnd = LayerManager.Instance.ActiveLayer.chunks[LayerManager.Instance.Resolution - 1, LayerManager.Instance.Resolution - 1, LayerManager.Instance.Resolution - 1].RealCoordinates(Vector3Int.one * (LayerManager.Instance.ChunkResolution - 2)); float meshDiameter = Mathf.Max(max.x - min.x, max.y - min.y, max.z - min.z); float tempSceneSize = sceneEnd.x - sceneStart.x; float scale = (LayerManager.Instance.RelativeModelSize * tempSceneSize) / meshDiameter; for (int i = 0; i < vertices.Count; i++) { vertices[i] = (vertices[i] - min + sceneStart) * scale; } max = (max - min + sceneStart) * scale; min = sceneStart * scale; Vector3 sceneCenter = (sceneStart + sceneEnd) * 0.5f; Vector3 modelCenter = (max + min) * 0.5f; Vector3 centeringVector = (sceneCenter - modelCenter); for (int i = 0; i < vertices.Count; i++) { vertices[i] += centeringVector; } max += centeringVector; min += centeringVector; MeshToSdfGpu.bounds = new Bounds((max + min) * 0.5f, (max - min) + Vector3.one * LayerManager.Instance.VoxelSpacing * 2); MeshToSdfGpu.TemporaryMesh result = new MeshToSdfGpu.TemporaryMesh(); result.triangles = new float[trianglesIndices.Count * 9]; for (int i = 0; i < trianglesIndices.Count; i++) { var tab = trianglesIndices[i]; result.triangles[9 * i] = vertices[tab[2]].x; result.triangles[9 * i + 1] = vertices[tab[2]].y; result.triangles[9 * i + 2] = vertices[tab[2]].z; result.triangles[9 * i + 3] = vertices[tab[0]].x; result.triangles[9 * i + 4] = vertices[tab[0]].y; result.triangles[9 * i + 5] = vertices[tab[0]].z; result.triangles[9 * i + 6] = vertices[tab[1]].x; result.triangles[9 * i + 7] = vertices[tab[1]].y; result.triangles[9 * i + 8] = vertices[tab[1]].z; } return(result); }