示例#1
0
 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);
 }
示例#2
0
    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);
    }