예제 #1
0
        public static HittableGeometryComponent ReadObj(FileInfo file)
        {
            var reader  = new OBJReader();
            var builder = new SimpleMeshBuilder();

            using (var text = new StreamReader(File.OpenRead(file.FullName))) {
                var result = reader.Read(text, ReadOptions.Defaults, builder);
            }



            //var reader = new StandardMeshReader();
            //var res = reader.Read(file.FullName, ReadOptions.Defaults);

            //StandardMeshReader.ReadMesh()

            var mesh = builder.Meshes[0];



            return(new HittableGeometryComponent {
                Indices = mesh.GetTriangleArray().ToImmutableArray(),
                Normals = mesh.NormalsItr().Select(n => new Vector3(n.x, n.y, n.z)).ToImmutableArray(),
                Positions = mesh.VerticesItr().Select(n => new Vector3((float)n.x, (float)n.y, (float)n.z)).ToImmutableArray(),
            });
        }
예제 #2
0
    protected override void Awake()
    {
        base.Awake();

        _Loader      = new SampleChunkLoader();
        _Unloader    = new SimpleUnloader();
        _MeshBuilder = new SimpleMeshBuilder();

        _Navigators = new List <WorldNavigator>();
        _Pool       = GetComponent <ObjectPool>();


        // Ensure the prefab has required components
        if (_Pool == null)
        {
            _Pool.Prefab.AddComponent <ObjectPool>();
        }

        _LogSizeX = SetLogSize(ChunkSizeX);
        _LogSizeY = SetLogSize(ChunkSizeY);
        _LogSizeZ = SetLogSize(ChunkSizeZ);
        _MaskX    = ChunkSizeX - 1;
        _MaskY    = ChunkSizeY - 1;
        _MaskZ    = ChunkSizeZ - 1;
    }
예제 #3
0
        public static IEnumerable <IFileGeometry3D> ReadStl(FileInfo file)
        {
            var          builder = new SimpleMeshBuilder();
            var          stl     = new STLReader();
            IOReadResult res;
            var          reader = new ASCIIBinarySTLParser();

            using (var fs = file.OpenRead()) {
                reader.Read(fs);
                //using (var br = new BinaryReader(fs)) {
                //    res = stl.Read(br, new ReadOptions { }, builder);
                //}
            }
            return(reader.Geometry);

            //    if (res.code == IOCode.Ok && builder.Meshes.Any()) {
            //        var mesh = builder.Meshes.Single();
            //        return new[] {
            //            new MeshData("STL",
            //            mesh.GetVertexArrayFloat().ToVector3List().AsReadOnly(),
            //            mesh.HasVertexNormals ?
            //                mesh.GetVertexNormalArray().ToVector3List().AsReadOnly()
            //                : new ReadOnlyCollection<Vector3>(new List<Vector3>()),
            //            mesh.GetTriangleArray().AsReadOnly(),
            //            mesh.HasVertexUVs ?
            //                mesh.GetVertexUVArray().ToVector2List().AsReadOnly()
            //                : new ReadOnlyCollection<Vector2>(new List<Vector2>()),
            //            mesh.HasVertexColors ?
            //                mesh.GetVertexColorArray().ToVector3List().AsReadOnly()
            //                :  new ReadOnlyCollection<Vector3>(new List<Vector3>())
            //            )
            //        };
            //    }
            //    throw new Exception("Can't read STL.");
        }
예제 #4
0
        protected override async Task _init(GeographyCollection layer)
        {
            SimpleMeshBuilder meshes = await loadObj(layer.Source);

            features  = meshes.Meshes;
            symbology = layer.Properties.Units;

            Color col = symbology.ContainsKey("point") ? (Color)symbology["point"].Color : Color.white;
            Color sel = symbology.ContainsKey("point") ? new Color(1 - col.r, 1 - col.g, 1 - col.b, col.a) : Color.red;

            mainMat = Instantiate(HandleMaterial);
            mainMat.SetColor("_BaseColor", col);
            selectedMat = Instantiate(HandleMaterial);
            selectedMat.SetColor("_BaseColor", sel);
        }
예제 #5
0
 private async Task <SimpleMeshBuilder> loadObj(string filename)
 {
     using (StreamReader reader = File.OpenText(filename))
     {
         OBJReader         objReader   = new OBJReader();
         SimpleMeshBuilder meshBuilder = new SimpleMeshBuilder();
         try
         {
             IOReadResult result = objReader.Read(reader, new ReadOptions(), meshBuilder);
         }
         catch (Exception e) when(
             e is UnauthorizedAccessException ||
             e is DirectoryNotFoundException ||
             e is FileNotFoundException ||
             e is NotSupportedException
             )
         {
             Debug.LogError("Failed to Load" + filename + " : " + e.ToString());
             meshBuilder = new SimpleMeshBuilder();
         }
         return(meshBuilder);
     }
 }
예제 #6
0
        // parse file and create a set of MeshSO objects
        public bool ReadFile(string sPath)
        {
            sSourcePath = sPath;
            SomeMeshesTooLargeForUnityWarning = false;

            // read the input file

            SimpleMeshBuilder build = new SimpleMeshBuilder();

            StandardMeshReader reader = new StandardMeshReader()
            {
                MeshBuilder = build
            };

            reader.warningEvent += on_warning;

            ReadOptions options = new ReadOptions();

            options.ReadMaterials = true;
            LastReadResult        = reader.Read(sPath, options);
            if (LastReadResult.code != IOCode.Ok)
            {
                return(false);
            }

            // create the material set

            List <SOMaterial> vSOMaterials = new List <SOMaterial>();

            for (int k = 0; k < build.Materials.Count; ++k)
            {
                SOMaterial m = build_material(sPath, build.Materials[k]);
                vSOMaterials.Add(m);
            }

            // convert the read meshes into unity meshes

            SceneObjects = new List <ImportedObject>();
            for (int k = 0; k < build.Meshes.Count; ++k)
            {
                if (build.Meshes[k].VertexCount > 64000 || build.Meshes[k].TriangleCount > 64000)
                {
                    SomeMeshesTooLargeForUnityWarning = true;
                    continue;
                }

                int        matID      = build.MaterialAssignment[k];
                SOMaterial soMaterial =
                    (matID < 0 || matID >= vSOMaterials.Count) ? null : vSOMaterials[matID];

                try {
                    Mesh unityMesh = UnityUtil.SimpleMeshToUnityMesh(build.Meshes[k], SwapLeftRight);
                    if (unityMesh != null)
                    {
                        SceneObjects.Add(new ImportedObject()
                        {
                            mesh = unityMesh, material = soMaterial
                        });
                    }
                } catch (Exception e) {
                    Debug.Log("[UnitySceneImporter] error converting to unity mesh : " + e.Message);
                }
            }

            return(SceneObjects.Count > 0);
        }
예제 #7
0
    public void UpdateBushes(MapData Data)
    {
        float t = height; //высота забора
        float m = width;  // толщина забора
        float c = factor; // скос
        var   s = new SimpleMeshBuilder();
        float h = Data.MapHeight + 0.2f;
        float w = Data.MapWidth + 0.2f;

        // внутрення стенка
        s.AddRectSurface(new Vector3(-w / 2f, -h / 2f, 0), new Vector3(-w / 2f, -h / 2f, -t), new Vector3(-w / 2f, 0, -t * c), new Vector3(-w / 2f, 0, 0));

        s.AddConnectedEdge(new Vector3(-w / 2f, 0, -t * c), new Vector3(-w / 2f, 0, 0));
        s.AddConnectedEdge(new Vector3(-w / 2f, h / 2f, -t), new Vector3(-w / 2f, h / 2f, 0));
        s.AddConnectedEdge(new Vector3(0, h / 2f, -t * c), new Vector3(0, h / 2f, 0));

        s.AddConnectedEdge(new Vector3(w / 2f, h / 2f, -t), new Vector3(w / 2f, h / 2f, 0));
        s.AddConnectedEdge(new Vector3(w / 2f, 0, -t * c), new Vector3(w / 2f, 0, 0));
        s.AddConnectedEdge(new Vector3(w / 2f, -h / 2f, -t), new Vector3(w / 2f, -h / 2f, 0));
        s.AddConnectedEdge(new Vector3(0, -h / 2f, -t * c), new Vector3(0, -h / 2f, 0));
        s.AddConnectedEdge(new Vector3(-w / 2f, -h / 2f, -t), new Vector3(-w / 2f, -h / 2f, 0));

        //внешняя стенка
        w++; h++;

        s.AddRectSurface(new Vector3(-w / 2f, -h / 2f, -t), new Vector3(-w / 2f, -h / 2f, 0), new Vector3(-w / 2f, -h / 2f + m, 0), new Vector3(-w / 2f, -h / 2f + m, -t));


        s.AddConnectedEdge(new Vector3(-w / 2f, 0, 0), new Vector3(-w / 2f, 0, -t * c));
        s.AddConnectedEdge(new Vector3(-w / 2f, h / 2f - m, 0), new Vector3(-w / 2f, h / 2f - m, -t));

        s.AddConnectedEdge(new Vector3(-w / 2f, h / 2f, 0), new Vector3(-w / 2f, h / 2f, -t));

        s.AddConnectedEdge(new Vector3(-w / 2f + m, h / 2f, 0), new Vector3(-w / 2f + m, h / 2f, -t));
        s.AddConnectedEdge(new Vector3(0, h / 2f, 0), new Vector3(0, h / 2f, -t * c));
        s.AddConnectedEdge(new Vector3(w / 2f - m, h / 2f, 0), new Vector3(w / 2f - m, h / 2f, -t));

        s.AddConnectedEdge(new Vector3(w / 2f, h / 2f, 0), new Vector3(w / 2f, h / 2f, -t));

        s.AddConnectedEdge(new Vector3(w / 2f, h / 2f - m, 0), new Vector3(w / 2f, h / 2f - m, -t));
        s.AddConnectedEdge(new Vector3(w / 2f, 0, 0), new Vector3(w / 2f, 0, -t * c));
        s.AddConnectedEdge(new Vector3(w / 2f, -h / 2f + m, 0), new Vector3(w / 2f, -h / 2f + m, -t));

        s.AddConnectedEdge(new Vector3(w / 2f, -h / 2f, 0), new Vector3(w / 2f, -h / 2f, -t));

        s.AddConnectedEdge(new Vector3(w / 2f - m, -h / 2f, 0), new Vector3(w / 2f - m, -h / 2f, -t));
        s.AddConnectedEdge(new Vector3(0, -h / 2f, 0), new Vector3(0, -h / 2f, -t * c));
        s.AddConnectedEdge(new Vector3(-w / 2f + m, -h / 2f, 0), new Vector3(-w / 2f + m, -h / 2f, -t));

        s.AddConnectedEdge(new Vector3(-w / 2f, -h / 2f, 0), new Vector3(-w / 2f, -h / 2f, -t));

        //верхняя часть
        //низ
        s.AddRectSurface(new Vector3(-w / 2f, -h / 2f, -t), new Vector3(-w / 2f, -h / 2f + m, -t), new Vector3(-w / 2f + m, -h / 2f + m, -t), new Vector3(-w / 2f + m, -h / 2f, -t));

        s.AddConnectedEdge(new Vector3(0, -h / 2f + m, -t * c), new Vector3(0, -h / 2f, -t * c));
        s.AddConnectedEdge(new Vector3(w / 2f - m, -h / 2f + m, -t), new Vector3(w / 2f - m, -h / 2f, -t));
        s.AddConnectedEdge(new Vector3(w / 2f, -h / 2f + m, -t), new Vector3(w / 2f, -h / 2f, -t));
        //     //верх
        s.AddRectSurface(new Vector3(w / 2f, h / 2f, -t), new Vector3(w / 2f, h / 2f - m, -t), new Vector3(w / 2f - m, h / 2f - m, -t), new Vector3(w / 2f - m, h / 2f, -t));
        s.AddConnectedEdge(new Vector3(0, h / 2f - m, -t * c), new Vector3(0, h / 2f, -t * c));
        s.AddConnectedEdge(new Vector3(-w / 2f + m, h / 2f - m, -t), new Vector3(-w / 2f + m, h / 2f, -t));
        s.AddConnectedEdge(new Vector3(-w / 2f, h / 2f - m, -t), new Vector3(-w / 2f, h / 2f, -t));
        //     //лево
        s.AddRectSurface(new Vector3(-w / 2f + m, -h / 2f + m, -t), new Vector3(-w / 2f, -h / 2f + m, -t), new Vector3(-w / 2f, 0, -t * c), new Vector3(-w / 2f + m, 0, -t * c));
        s.AddConnectedEdge(new Vector3(-w / 2f, h / 2f - m, -t), new Vector3(-w / 2f + m, h / 2f - m, -t));
        //     //право
        s.AddRectSurface(new Vector3(w / 2f, -h / 2f + m, -t), new Vector3(w / 2f - m, -h / 2f + m, -t), new Vector3(w / 2f - m, 0, -t * c), new Vector3(w / 2f, 0, -t * c));
        s.AddConnectedEdge(new Vector3(w / 2f - m, h / 2f - m, -t), new Vector3(w / 2f, h / 2f - m, -t));

        GetComponent <MeshFilter>().mesh = s.ToMesh();
    }