Пример #1
0
        //Draws a polygon given a list of Vector3 that is a closed shape
        public GameObject dropPolygon(List <Vector3> shape, float height, Material material)
        {
            GameObject polygon = new GameObject("Polygon");

            MeshFilter   filter   = polygon.AddComponent <MeshFilter>();
            MeshRenderer renderer = polygon.AddComponent <MeshRenderer>();

            Poly2Mesh.Polygon poly = new Poly2Mesh.Polygon();
            poly.outside = shape;

            Mesh mesh = Poly2Mesh.CreateMesh(poly);

            Vector2[] uvs = new Vector2[mesh.vertices.Length];
            for (int i = 0; i < uvs.Length; i++)
            {
                uvs[i] = new Vector2(mesh.vertices[i].x, mesh.vertices[i].z) * 100;
            }
            mesh.uv = uvs;

            if (height > 0)
            {
                mesh = SimpleExtruder.SliceExtrude(mesh, polygon, height, 4f, 4f, 10f);
            }

            filter.sharedMesh = mesh;
            renderer.material = material;

            polygon.AddComponent <MeshCollider> ();

            return(polygon);
        }
Пример #2
0
        //Draws a polygon given a list of Vector3 that is a closed shape
        public GameObject dropPolygon(List <Vector3> shape, float height, Material material, GOUVMappingStyle uvMappingStyle)
        {
            GameObject polygon = new GameObject("Polygon");

            MeshFilter   filter   = polygon.AddComponent <MeshFilter>();
            MeshRenderer renderer = polygon.AddComponent <MeshRenderer>();

            Poly2Mesh.Polygon poly = new Poly2Mesh.Polygon();
            poly.outside = shape;

            GOMesh goMesh = Poly2Mesh.CreateMeshInBackground(poly);

            goMesh.uvMappingStyle = uvMappingStyle;
            goMesh.ApplyUV(shape);

            if (height > 0)
            {
                goMesh = SimpleExtruder.SliceExtrudePremesh(goMesh, height, 4f, 4f, 10f);
            }

            Mesh mesh = goMesh.ToSubmeshes();

            filter.sharedMesh = mesh;
            renderer.material = material;

            polygon.AddComponent <MeshCollider> ();

            return(polygon);
        }
Пример #3
0
        private static GameObject GenerateFloor(
            List <Vector2> roomContour,
            Vector3 centroid,
            Material floorMat)
        {
            GameObject   go = new GameObject("floor");
            MeshFilter   mf = go.AddComponent <MeshFilter>();
            MeshRenderer mr = go.AddComponent <MeshRenderer>();

            go.transform.position = centroid / MeasurmentK;
            var polygon   = new Poly2Mesh.Polygon();
            var converter = new Converter <Vector2, Vector3>(Vector2ToVector3);

            polygon.outside = roomContour.ConvertAll(converter);
            var mesh  = Poly2Mesh.CreateMesh(polygon);
            var verts = mesh.vertices;

            for (int i = 0; i < verts.Length; i++)
            {
                verts[i] = (centroid - new Vector3(verts[i].x, verts[i].z, verts[i].y)) / MeasurmentK;
            }
            mesh.vertices = verts;

            mesh.uv = MathUtils.CreatePlaneUVs(mesh);
            mesh.RecalculateNormals();
            mesh.RecalculateBounds();
            mesh.name             = go.name;
            mf.sharedMesh         = mesh;
            mr.sharedMaterial     = floorMat;
            go.transform.rotation = Quaternion.Euler(0, 180, 0);
            return(go);
        }
Пример #4
0
        public GameObject ToGameObject()
        {
            Poly2Mesh.Polygon polygon = this.Geometry.ToPolygonMesh();
            GameObject        go      = Poly2Mesh.CreateGameObject(polygon, this.FID);

            return(go);
        }
Пример #5
0
    void GenMesh(List <Vector3> myVerts, float gravityScale, int pushDir, Vector3 pos, Vector3 scale, float weight)
    {
        Poly2Mesh.Polygon poly = new Poly2Mesh.Polygon();
        poly.outside = myVerts;

        GameObject myObj = Poly2Mesh.CreateGameObject(poly);

        myObj.transform.position   = pos;
        myObj.transform.localScale = scale;
        myObj.gameObject.tag       = "Target";

        myObj.AddComponent <PolygonCollider2D>().points = myHelpers.L3ToV2(myVerts);

        myObj.GetComponent <Renderer>().material.shader      = Shader.Find("Sprites/Default");
        myObj.GetComponent <Renderer>().material.mainTexture = tex;

        Mesh myMesh = myObj.GetComponent <MeshFilter>().mesh;

        myMesh.uv = GetUV(myMesh.vertices);

        MeshScript meshScript = myObj.AddComponent <MeshScript>();

        meshScript.CurrentRotation = 0f;
        meshScript.OriginWeight    = weight;
        meshScript.OriginArea      = meshScript.MyArea = myHelpers.getArea(myObj);
        meshScript.MyCenter        = myHelpers.GetCentroid(myVerts);

        myObj.AddComponent <Rigidbody2D>().gravityScale = gravityScale;
    }
Пример #6
0
        private void CreateTileBackground(GOTile tile)
        {
            MeshFilter   filter   = tile.gameObject.AddComponent <MeshFilter> ();
            MeshRenderer renderer = tile.gameObject.AddComponent <MeshRenderer> ();

            tile.vertices = new List <Vector3> ();
            IList verts = tile.tileCenter.tileVertices(zoomLevel);

            foreach (Vector3 v in verts)
            {
                tile.vertices.Add(tile.transform.InverseTransformPoint(v));
            }

            Poly2Mesh.Polygon poly = new Poly2Mesh.Polygon();
            poly.outside = tile.vertices;
            Mesh mesh = Poly2Mesh.CreateMesh(poly);

            Vector3[] meshverts = mesh.vertices;
            Vector2[] uvs       = new Vector2[meshverts.Length];
            for (int i = 0; i < uvs.Length; i++)
            {
                uvs [i] = new Vector2(meshverts [i].x, meshverts [i].z);
            }
            mesh.uv = uvs;

            filter.sharedMesh = mesh;
            tile.gameObject.AddComponent <MeshCollider> ();

            renderer.material = tileBackground;
        }
Пример #7
0
        private void CreateTemporaryMapBackground()
        {
            tempTileBackgorund = new GameObject("Temporary tile background");

            MeshFilter   filter   = tempTileBackgorund.AddComponent <MeshFilter>();
            MeshRenderer renderer = tempTileBackgorund.AddComponent <MeshRenderer>();

            float size = 1000;

            Poly2Mesh.Polygon poly = new Poly2Mesh.Polygon();
            poly.outside = new List <Vector3> {
                new Vector3(size, -0.1f, size),
                new Vector3(size, -0.1f, -size),
                new Vector3(-size, -0.1f, -size),
                new Vector3(-size, -0.1f, size)
            };
            Mesh mesh = Poly2Mesh.CreateMesh(poly);

            Vector2[] uvs = new Vector2[mesh.vertices.Length];
            for (int i = 0; i < uvs.Length; i++)
            {
                uvs[i] = new Vector2(mesh.vertices[i].x, mesh.vertices[i].z);
            }
            mesh.uv = uvs;

            filter.mesh       = mesh;
            renderer.material = tileBackground;
        }
Пример #8
0
    void GenMeshForUV(Vector2[] parentUV, List <Vector3> myVerts, out Vector3[] allVertsMesh, out Vector2[] allUV, float angle)
    {
        Poly2Mesh.Polygon poly = new Poly2Mesh.Polygon();
        poly.outside = myVerts;
        Mesh mesh = Poly2Mesh.CreateMesh(poly);

        mesh.uv      = GetUVSplit(parentUV, mesh.vertices, angle);
        allVertsMesh = mesh.vertices;
        allUV        = mesh.uv;
    }
Пример #9
0
        private static GameObject GenerateWall(
            Vector3 begin,
            Vector3 end,
            Vector3 center,
            List <List <Vector2> > holes,
            float apartmentHeight,
            Material wallMat,
            int index)
        {
            GameObject   wallGO = new GameObject("wall" + index);
            MeshFilter   wallMf = wallGO.AddComponent <MeshFilter>();
            MeshRenderer wallMr = wallGO.AddComponent <MeshRenderer>();

            float          wallLength  = (Vector2.Distance(begin, end) / 2) / MeasurmentK;
            float          wallHeight  = apartmentHeight / MeasurmentK;
            List <Vector2> wallContour = new List <Vector2>
            {
                new Vector2(-wallLength, 0),
                new Vector2(-wallLength, wallHeight),
                new Vector2(wallLength, wallHeight),
                new Vector2(wallLength, 0)
            };

            var polygon   = new Poly2Mesh.Polygon();
            var converter = new Converter <Vector2, Vector3>(Vector2ToVector3);

            polygon.outside = wallContour.ConvertAll(converter);
            var v3Holes = new List <List <Vector3> >();

            holes.ForEach(x => v3Holes.Add(x.ConvertAll(converter)));
            for (int i = 0; i < v3Holes.Count; i++)
            {
                var hole = v3Holes[i];
                for (int j = 0; j < hole.Count; j++)
                {
                    hole[j] = hole[j] / MeasurmentK;
                }
            }

            polygon.holes = v3Holes;
            var mesh = Poly2Mesh.CreateMesh(polygon);

            mesh.RecalculateNormals();
            mesh.RecalculateBounds();
            mesh.uv               = MathUtils.CreatePlaneUVs(mesh);
            mesh.name             = wallGO.name;
            wallMf.sharedMesh     = mesh;
            wallMr.sharedMaterial = wallMat;

            var transform = wallGO.transform;

            transform.rotation = Quaternion.Euler(0, -Vector2.SignedAngle(Vector2.right, end - begin), 0);
            transform.position = center / MeasurmentK;
            return(wallGO);
        }
Пример #10
0
    private static void RegisterFloor(string localType, float lowestHeight, string lowestFaceName, Poly2Mesh.Polygon floorPolygon)
    {
        GameObject floorObj = Poly2Mesh.CreateGameObject(floorPolygon);

        floorObj.name = lowestHeight + "_" + lowestFaceName;

        // 하나의 솔리드에서 공간타입이 2개 이상 존재할 수는 없다
        ApplyCellSpaceMaterial(localType, floorObj);

        floorObj.transform.parent = CommonObjs.gmlRootFloor.transform;
    }
Пример #11
0
        public GameObject CreateModel(Layer layer, float height)
        {
            GameObject polygon = new GameObject();

            try {
                Poly2Mesh.Polygon poly = new Poly2Mesh.Polygon();
                poly.outside = convertedSubject;
                if (clips != null)
                {
                    foreach (IList clipVerts in clips)
                    {
                        poly.holes.Add(CoordsToVerts(clipVerts));
                    }
                }

                MeshFilter filter = polygon.AddComponent <MeshFilter>();
                polygon.AddComponent(typeof(MeshRenderer));
                Mesh mesh = Poly2Mesh.CreateMesh(poly);


                if (mesh)
                {
                    Vector2[] uvs = new Vector2[mesh.vertices.Length];
                    for (int i = 0; i < uvs.Length; i++)
                    {
                        uvs[i] = new Vector2(mesh.vertices[i].x, mesh.vertices[i].z);
                    }
                    mesh.uv = uvs;

                    mesh2D = Mesh.Instantiate(mesh);

                    if (height > 0)
                    {
                        mesh = SimpleExtruder.Extrude(mesh, polygon, height);
                    }
                }
                filter.sharedMesh = mesh;

                if (layer.useColliders)
                {
                    polygon.AddComponent <MeshCollider>().sharedMesh = mesh;
                }
            }
            catch (Exception ex) {
                Debug.Log("[PolygonHandler] Catched exeption: " + ex);
            }



            return(polygon);
        }
Пример #12
0
        GameObject AddPolygonMesh(GameObject parent, Vector3[] ps, Material material)
        {
            GameObject s = new GameObject("SurfacePolygon");

            s.transform.parent = parent.transform;
            s.AddComponent <MeshRenderer>();
            MeshFilter filter = s.AddComponent <MeshFilter>();

            Poly2Mesh.Polygon polygon = new Poly2Mesh.Polygon();
            polygon.outside = new List <Vector3>(ps);
            filter.mesh     = Poly2Mesh.CreateMesh(polygon);
            ApplyMaterial(s, material);
            return(s);
        }
Пример #13
0
    void GenMeshSplit(Vector3[] parentVerts, Vector2[] parentUV, List <Vector3> myVerts, Vector3 centerInterPoint, Texture tex, float rotAngle, Vector2 parentVelocity, float parentGravity, float originArea, float originWeight)
    {
        Poly2Mesh.Polygon poly = new Poly2Mesh.Polygon();
        poly.outside = myVerts;
        GameObject myObj = Poly2Mesh.CreateGameObject(poly);

        myObj.gameObject.tag = "Target";

        Material myMat = myObj.GetComponent <Renderer>().material;

        myMat.shader      = Shader.Find("Sprites/Default");
        myMat.mainTexture = tex;

        Mesh myMesh = myObj.GetComponent <MeshFilter>().mesh;

        myMesh.uv = deductUV(parentVerts, parentUV, myMesh.vertices);


        MeshScript meshScript = myObj.AddComponent <MeshScript>();

        meshScript.ShowPerc        = ShowPercentage;
        meshScript.CurrentRotation = rotAngle;
        meshScript.OriginWeight    = originWeight;
        meshScript.OriginArea      = originArea;

        float myArea = myHelpers.getArea(myObj);

        meshScript.MyArea = myArea;

        meshScript.MyCenter = myHelpers.GetCentroid(myVerts);

        myObj.AddComponent <PolygonCollider2D>().points = myHelpers.L3ToV2(myVerts);

        Rigidbody2D myRB = myObj.AddComponent <Rigidbody2D>();

        myRB.gravityScale = parentGravity;

        myRB.velocity = parentVelocity;

        myRB.mass = (myArea * originWeight) / originArea;
        applyForceObj.MyRBS.Add(myRB);

        Vector3 myDir = myHelpers.GetCentroid(myVerts) - centerInterPoint;

        applyForceObj.MyDirs.Add(myDir.normalized);
    }
Пример #14
0
        private void CreateTileBackground(GOTile tile)
        {
            MeshFilter   filter   = tile.gameObject.AddComponent <MeshFilter>();
            MeshRenderer renderer = tile.gameObject.AddComponent <MeshRenderer>();

            tile.vertices = tile.tileCenter.tileVertices(zoomLevel);
            Poly2Mesh.Polygon poly = new Poly2Mesh.Polygon();
            poly.outside = tile.vertices;
            Mesh mesh = Poly2Mesh.CreateMesh(poly);

            Vector2[] uvs = new Vector2[mesh.vertices.Length];
            for (int i = 0; i < uvs.Length; i++)
            {
                uvs[i] = new Vector2(mesh.vertices[i].x, mesh.vertices[i].z);
            }
            mesh.uv = uvs;

            filter.mesh       = mesh;
            renderer.material = tileBackground;
        }
Пример #15
0
        private TexturedMesh CreateSurface(Surface surf)
        {
            Poly2Mesh.Polygon poly = new Poly2Mesh.Polygon();
            poly.outside = CreateVectorlist(surf.outerRing);
            if (surf.outerringUVs.Count > 0)
            {
                surf.outerringUVs.Reverse();
                poly.outsideUVs = surf.outerringUVs;
            }
            ;
            if (surf.innerRings.Count > 0)
            {
                foreach (var innerring in surf.innerRings)
                {
                    poly.holes.Add(CreateVectorlist(innerring));
                }
            }
            if (surf.innerringUVs.Count > 0)
            {
                surf.innerringUVs.Reverse();
                poly.holesUVs = surf.innerringUVs;
            }

            Mesh submesh = Poly2Mesh.CreateMesh(poly);

            TexturedMesh texturedmesh = new TexturedMesh();

            texturedmesh.mesh = submesh;
            if (surf.surfacetexture != null)
            {
                texturedmesh.TextureName = surf.surfacetexture.path;
                //texturedmesh.texture = LoadTexture(surf.surfacetexture);
            }
            submesh = null;
            return(texturedmesh);
        }
Пример #16
0
        public GameObject BuildPolygon(GOLayer layer, float height)
        {
            if (feature.convertedGeometry.Count == 2 && feature.convertedGeometry[0].Equals(feature.convertedGeometry[1]))
            {
                return(null);
            }
            List <Vector3> clean = feature.convertedGeometry.Distinct().ToList();

            if (clean == null || clean.Count <= 2)
            {
                return(null);
            }

            GameObject polygon = new GameObject();

            Profiler.BeginSample("[GoMap] Start poly2mesh");
            Poly2Mesh.Polygon poly = new Poly2Mesh.Polygon();
            poly.outside = feature.convertedGeometry;
            if (feature.clips != null)
            {
                foreach (IList clipVerts in feature.clips)
                {
                    poly.holes.Add(GOFeature.CoordsToVerts(clipVerts, true));
                }
            }
            Profiler.EndSample();

            MeshFilter filter = polygon.AddComponent <MeshFilter>();

            meshRenderer = polygon.AddComponent <MeshRenderer>();

            Profiler.BeginSample("[GoMap] Create polygon mesh");
            try {
                mesh = Poly2Mesh.CreateMesh(poly);
            } catch {
            }
            Profiler.EndSample();


            if (mesh)
            {
                Profiler.BeginSample("[GoMap] Set polygon UV");
                Vector2[] uvs      = new Vector2[mesh.vertices.Length];
                Vector3[] vertices = mesh.vertices;
                for (int i = 0; i < uvs.Length; i++)
                {
                    uvs[i] = new Vector2(vertices[i].x, vertices[i].z);
                }
                mesh.uv = uvs;
                Profiler.EndSample();

                Profiler.BeginSample("[GoMap] instantiate mesh 2D");
                mesh2D = Mesh.Instantiate(mesh);
                Profiler.EndSample();

                Profiler.BeginSample("[GoMap] polygon extrusion");
                if (height > 0)
                {
                    mesh = SimpleExtruder.SliceExtrude(mesh, polygon, height, 4f, 4f, 10f);
//					mesh = SimpleExtruder.Extrude (mesh, polygon, height);
                }
                Profiler.EndSample();
            }


            filter.sharedMesh = mesh;

            if (layer.useColliders && mesh != null && feature.convertedGeometry.Count() > 2)
            {
                polygon.AddComponent <MeshCollider>().sharedMesh = mesh;
            }


            return(polygon);
        }
Пример #17
0
    private void OnCellSpaceBoundaryMember(XmlReader reader)
    {
        List <Vector2> localUVs = new List <Vector2>();

        Poly2Mesh.Polygon localPolygon  = new Poly2Mesh.Polygon();
        string            localFileName = string.Empty;
        string            localName     = string.Empty;

        while (isEndElement(reader, "cellSpaceBoundaryMember") == false)
        {
            reader.Read();

            if (string.IsNullOrWhiteSpace(localName))
            {
                reader.Read();
                localName = reader.GetAttribute("gml:id");
            }

            if (isStartElement(reader, "Polygon") || isStartElement(reader, "PolygonPatch"))
            {
                localPolygon = OnPolygon(reader);
            }

            if (isStartElement(reader, "TextureImage"))
            {
                reader.Read();
                localFileName = reader.Value;
            }

            if (isStartElement(reader, "TextureCoordinate"))
            {
                localUVs = new List <Vector2>();
                while (isEndElement(reader, "TextureCoordinate") == false)
                {
                    reader.Read();

                    if (isStartElement(reader, "pos"))
                    {
                        reader.Read();

                        localUVs.Add(GetPos2D(reader));
                    }
                }
            }

            if (isStartElement(reader, "OrientableSurface"))
            {
                // Now, Viewer shows always both of sides.
                // So nothing to do for viewing for other side.
                return;
            }
        }

        //tagStack.Pop();

        if (localUVs.Count() > 2)
        {
            localPolygon.outsideUVs = localUVs;
            localPolygon.holesUVs   = new List <List <Vector2> >();
            localPolygon.outsideUVs.Reverse();
        }

        localPolygon.outside.Reverse();

        for (int i = 0; i < localPolygon.holes.Count(); i++)
        {
            localPolygon.holes[i].Reverse();
            localPolygon.holesUVs.Add(new List <Vector2>());
        }

        // Texture 구멍 무시.
        if (string.IsNullOrWhiteSpace(localFileName) == false)
        {
            localPolygon.holes    = new List <List <Vector3> >();
            localPolygon.holesUVs = new List <List <Vector2> >();
        }

        GameObject cellSpaceBoundary = Poly2Mesh.CreateGameObject(localPolygon);

        cellSpaceBoundary.name = localName;

        if (string.IsNullOrWhiteSpace(localFileName))
        {
            // 일반 벽과 지오메트리 정보가 겹칠경우를 대비하여 앞쪽으로 조금 이동
            cellSpaceBoundary.transform.Translate(localPolygon.planeNormal * 0.01f);
        }
        else
        {
            //덱스쳐가 면별로 긴밀하게 붙어있는 경우 기둥사이가 보이는 현상이 발생하므로 적절히 수치를 조절하여 사용.
            //cellSpaceBoundary.transform.Translate(localPolygon.planeNormal * 0.005f);
        }

        if (string.IsNullOrWhiteSpace(localFileName) == false)
        {
            //Debug.Log(GetDirectoryName() + "\\" + localFileName);
            IEnumerator tmpRunner = ApplyTexture(cellSpaceBoundary, GetDirectoryName() + "\\" + localFileName);
            StartCoroutine(tmpRunner);
        }
        else
        {
            cellSpaceBoundary.GetComponent <Renderer>().material = CommonObjs.materialCellSpaceBoundary;
        }

        cellSpaceBoundary.tag = CommonObjs.TAG_CELLSPACEBOUNDARY;
        cellSpaceBoundary.transform.parent = CommonObjs.gmlRootCellSpaceBoundary.transform;
    }
Пример #18
0
        public static GameObject PolyToMesh(XmlReader reader, string id, CityGml2GO cityGml2Go, SemanticType semanticType = null)
        {
            var extPositions = new List <Vector3>();
            var intPositions = new List <List <Vector3> >();
            var polyName     = "";

            while (reader.MoveToNextAttribute())
            {
                if (reader.LocalName == "id")
                {
                    polyName = reader.Value;
                }
            }

            while (reader.Read())
            {
                if (((IXmlLineInfo)reader).LineNumber >= 14459)
                {
                    int idfg = 0;
                }
                if (string.IsNullOrEmpty(polyName))
                {
                    while (reader.MoveToNextAttribute())
                    {
                        if (reader.LocalName == "id")
                        {
                            polyName = reader.Value;
                        }
                    }
                }

                if (reader.NodeType == XmlNodeType.Element && reader.LocalName == "exterior")
                {
                    while (reader.Read())
                    {
                        if (reader.NodeType == XmlNodeType.Element && reader.LocalName == "posList")
                        {
                            var range = PositionHandler.GetPosList(reader, cityGml2Go.ActualTranslate);
                            if (range != null)
                            {
                                extPositions.AddRange(range);
                            }
                        }

                        if (reader.NodeType == XmlNodeType.Element && reader.LocalName == "pos")
                        {
                            extPositions.Add(PositionHandler.GetPos(reader, cityGml2Go.ActualTranslate));
                        }

                        if (reader.NodeType == XmlNodeType.EndElement && reader.LocalName == "exterior")
                        {
                            break;
                        }
                    }
                }

                if (reader.NodeType == XmlNodeType.Element && reader.LocalName == "interior")
                {
                    var curInt = new List <Vector3>();
                    while (reader.Read())
                    {
                        if (reader.NodeType == XmlNodeType.Element && reader.LocalName == "posList")
                        {
                            var range = PositionHandler.GetPosList(reader, cityGml2Go.ActualTranslate);
                            if (range != null)
                            {
                                curInt.AddRange(range);
                            }
                        }

                        if (reader.NodeType == XmlNodeType.Element && reader.LocalName == "pos")
                        {
                            curInt.Add(PositionHandler.GetPos(reader, cityGml2Go.ActualTranslate));
                        }
                        if (reader.NodeType == XmlNodeType.EndElement && reader.LocalName == "interior")
                        {
                            break;
                        }
                    }
                    intPositions.Add(curInt);
                }
                if (reader.NodeType == XmlNodeType.EndElement && reader.LocalName == "Polygon")
                {
                    break;
                }
            }

            var lastPoint = extPositions.Last();

            //extPositions = extPositions.Distinct().ToList();
            extPositions.Add(lastPoint);

            for (var index = 0; index < intPositions.Count; index++)
            {
                lastPoint = intPositions[index].Last();
                //intPositions[index] = intPositions[index].Distinct().ToList();
                intPositions[index].Add(lastPoint);
            }


            if (!PolygonHandler.IsPolyValid(extPositions))
            {
                IXmlLineInfo xmlInfo    = (IXmlLineInfo)reader;
                int          lineNumber = xmlInfo.LineNumber;
                Debug.Log(lineNumber);
                return(null);
            }

            foreach (var intRing in intPositions)
            {
                if (!IsPolyValid(intRing))
                {
                    IXmlLineInfo xmlInfo    = (IXmlLineInfo)reader;
                    int          lineNumber = xmlInfo.LineNumber;
                    Debug.Log(lineNumber);
                    return(null);
                }
            }

            var polygon = new Poly2Mesh.Polygon();

            extPositions.Reverse();
            intPositions.Reverse();

            polygon.outside = extPositions;
            polygon.holes   = intPositions;

            GameObject go = null;

            try
            {
                go = Poly2Mesh.CreateGameObject(polygon, string.IsNullOrEmpty(polyName) ? id : polyName);
            }
            catch (Exception ex)
            {
                Debug.Log(ex);
            }

            if (cityGml2Go.GenerateColliders)
            {
                //go.AddComponent<MeshCollider>();
            }

            if (go != null)
            {
                if (cityGml2Go.Semantics && semanticType != null)
                {
                    SemanticsHandler.HandleSemantics(go, semanticType, cityGml2Go);
                }
                else if (cityGml2Go.DefaultMaterial != null)
                {
                    var mr = go.GetComponent <MeshRenderer>();
                    if (mr != null)
                    {
                        mr.sharedMaterial = cityGml2Go.DefaultMaterial;
                    }
                }
            }

            cityGml2Go.Polygons.Add(go);

            return(go);
        }
Пример #19
0
    private void OnCellSpace(XmlReader reader)
    {
        GameObject solid = new GameObject();

        string localName = string.Empty;
        string localType = string.Empty;

        while (isEndElement(reader, "cellSpaceMember") == false)
        {
            reader.Read();

            if (string.IsNullOrWhiteSpace(localName))
            {
                reader.Read();
                localName = reader.GetAttribute("gml:id");
                localType = reader.LocalName;

                if (localType.Equals("TransitionSpace"))
                {
                    solid.tag = CommonObjs.TAG_TRANSITIONSPACE;
                    solid.transform.parent = CommonObjs.gmlRootTransitionSpace.transform;
                }
                else if (localType.Equals("GeneralSpace"))
                {
                    solid.tag = CommonObjs.TAG_GENERALSPACE;
                    solid.transform.parent = CommonObjs.gmlRootGeneralSpace.transform;
                }
                else
                {
                    solid.tag = CommonObjs.TAG_CELLSPACE;
                    solid.transform.parent = CommonObjs.gmlRootCellSpace.transform;
                }
            }

            if (isStartElement(reader, "Solid"))
            {
                int faceCnt = 1;
                solid.name = localName;
                reader.Read();

                float             lowestHeight   = float.MaxValue;
                string            lowestFaceName = "";
                Poly2Mesh.Polygon floorPolygon   = new Poly2Mesh.Polygon();

                while (isEndElement(reader, "Solid") == false)
                {
                    reader.Read();
                    if (isStartElement(reader, "Polygon") || isStartElement(reader, "PolygonPatch"))
                    {
                        Poly2Mesh.Polygon polygon    = OnPolygon(reader);
                        GameObject        genPolygon = Poly2Mesh.CreateGameObject(polygon);

                        genPolygon.name             = string.Format("{0}_Face:{1}", localName, faceCnt++);
                        genPolygon.transform.parent = solid.transform;

                        // 각 솔리드에서 가장 낮은 면을 바닥으로 잡음.
                        // 조금은 기울어진 바닥이라 할지라도 잡아낼 수 있게끔한게 의도.
                        // 현재까지의 모든 데이터는 바닥이 모두 평면으로 되어 있음.
                        float thisMinY = polygon.outside.Average(v => v.y);
                        if (thisMinY < lowestHeight)
                        {
                            lowestHeight   = thisMinY;
                            floorPolygon   = polygon;
                            lowestFaceName = localName;
                        }
                        ApplyCellSpaceMaterial(localType, genPolygon);
                    }
                }

                //RegisterFloor(localType, lowestHeight, lowestFaceName, floorPolygon);
            }
        }
    }
Пример #20
0
        public static GOMesh PreloadPolygon(GOFeature feature)
        {
            if (feature.convertedGeometry == null)
            {
                return(null);
            }

            if (feature.convertedGeometry.Count == 2 && feature.convertedGeometry[0].Equals(feature.convertedGeometry[1]))
            {
                return(null);
            }

            List <Vector3> clean = feature.convertedGeometry.Distinct().ToList();

            if (clean == null || clean.Count <= 2)
            {
                return(null);
            }


            Poly2Mesh.Polygon poly = new Poly2Mesh.Polygon();
            poly.outside = feature.convertedGeometry;
            if (feature.clips != null)
            {
                foreach (List <Vector3> clipVerts in feature.clips)
                {
                    poly.holes.Add(clipVerts);
                }
            }

            GOMesh goMesh = null;

            goMesh = Poly2Mesh.CreateMeshInBackground(poly);

            if (goMesh != null)
            {
                goMesh.uvMappingStyle = feature.layer.uvMappingStyle;
                goMesh.ApplyUV(feature.convertedGeometry);
                goMesh.Y = feature.y;

                if (feature.goTile.useElevation)
                {
                    feature.ComputeHighestAltitude();
                }

                if (feature.height > 0)
                {
                    feature.height      *= feature.goTile.worldScale;
                    goMesh.secondaryMesh = new GOMesh(goMesh);

                    float h = feature.height;

                    if (feature.goTile.useElevation)
                    {
                        h += GOFeature.BuildingElevationOffset;
                    }

                    h += Noise();
                    goMesh.separateTop = feature.renderingOptions.hasRoof;

                    if (feature.layer.slicedExtrusion)
                    {
                        goMesh = SimpleExtruder.SliceExtrudePremesh(goMesh, h, 4f, 4f, 10f * feature.goTile.worldScale);
                    }
                    else
                    {
                        goMesh = SimpleExtruder.ExtrudePremesh(goMesh, h);
                    }
                }

                if (feature.height < feature.layer.colliderHeight)
                {
                    float h = feature.layer.colliderHeight;
                    h *= feature.goTile.worldScale;
                    if (feature.goTile.useElevation)
                    {
                        h += GOFeature.BuildingElevationOffset;
                    }

                    goMesh.secondaryMesh = new GOMesh(goMesh);
                    goMesh.secondaryMesh = SimpleExtruder.SliceExtrudePremesh(goMesh.secondaryMesh, h, 4f, 4f, 10f * feature.goTile.worldScale);
                }
            }

            return(goMesh);
        }
Пример #21
0
    public void CreateFace()
    {
        Action action = new Action(Nothing);

        if (selected.Count < 3)
        {
            Debug.Log("-----ERROR MUST BELONG SAME OBJECT-----");
            MobileNativePopups.OpenAlertDialog("Error", "Please select at least 3 vertices", "Cancel", action);
            return;
        }

        CADObject cadObject = selected [0].transform.parent.GetComponent <CADObject> ();

        string            objName = selected [0].transform.parent.name;
        List <GameObject> pool    = new List <GameObject> ();

        foreach (GameObject g in selected)
        {
            pool.Add(g);
            if (!g.transform.parent.name.Equals(objName))
            {
                Debug.Log("-----ERROR MUST BELONG SAME OBJECT-----");
                MobileNativePopups.OpenAlertDialog("Error", "Please select vertices that belong to the same object", "Cancel", action);
                return;
            }
        }

        GameObject startingPoint = pool [0];
        GameObject recent        = startingPoint;

        pool.Remove(startingPoint);

        List <GameObject> orderedList        = new List <GameObject> ();
        List <Vector3>    orderListPositions = new List <Vector3> ();

        orderedList.Add(recent);
        orderListPositions.Add(recent.transform.position);

        //action += Nothing;
        int toFind = pool.Count;

        while (true)
        {
            if (pool.Count == 0)
            {
                break;
            }

            GameObject found = null;
            foreach (GameObject checkNeighbor in pool)
            {
                HashSet <GameObject> key = new HashSet <GameObject> ();
                key.Add(checkNeighbor);
                key.Add(recent);
                if (cadObject.edges.ContainsKey(key))
                {
                    found = checkNeighbor;
                    toFind--;
                    break;
                }
            }

            if (found == null)
            {
                Debug.Log("-error form loop");
                MobileNativePopups.OpenAlertDialog("Error", "Please select vertices that form a single, complete loop", "Cancel", action);
                return;
            }
            else
            {
                recent = found;
                pool.Remove(found);
                orderedList.Add(found);
                orderListPositions.Add(found.transform.position);
            }
        }

        HashSet <GameObject> keyEnd = new HashSet <GameObject> ();

        keyEnd.Add(orderedList[0]);
        keyEnd.Add(orderedList[orderedList.Count - 1]);
        if (!cadObject.edges.ContainsKey(keyEnd))
        {
            Debug.Log("-error form loop");
            MobileNativePopups.OpenAlertDialog("Error", "Please select vertices that form a single, complete loop", "Cancel", action);
            return;
        }



        if (orderedList.Count != selected.Count)
        {
            Debug.Log("-error form loop");
            MobileNativePopups.OpenAlertDialog("Error", "You need to select vertices that form a single loop", "Cancel", action);
            return;
        }



        Poly2Mesh.Polygon poly = new Poly2Mesh.Polygon();
        poly.outside = orderListPositions;
        GameObject a = Poly2Mesh.CreateGameObject(poly);

        a.transform.parent = cadObject.gameObject.transform;
        a.GetComponent <Renderer> ().material = meshTexture;
        orderListPositions.Reverse();
        Poly2Mesh.Polygon poly2 = new Poly2Mesh.Polygon();
        poly2.outside = orderListPositions;
        GameObject a2 = Poly2Mesh.CreateGameObject(poly2);

        a2.transform.parent = cadObject.gameObject.transform;
        a2.GetComponent <Renderer> ().material = meshTexture;


        Debug.Log("CREATE FACE NOW");
        Debug.Log(orderedList.Count);
    }
Пример #22
0
 protected override void ThreadFunction()
 {
     premesh = Poly2Mesh.CreateMeshInBackground(poly);
 }
        public GameObject BuildPolygon(string name, Vector3 pos)
        {
            Poly2Mesh.Polygon poly = new Poly2Mesh.Polygon();
            poly.outside = feature.convertedGeometry;
            if (feature.clips != null)
            {
                foreach (IList clipVerts in feature.clips)
                {
                    poly.holes.Add(GOFeature.CoordsToVerts(clipVerts));
                }
            }
            try
            {
                mesh = Poly2Mesh.CreateMesh(poly);
            }
            catch
            {
            }
            float   d     = 0f;
            Vector3 f_Pos = pos;

            for (int i = 0; i < mesh.vertices.Length; i++)
            {
                var l = Vector2.Distance(pos, mesh.vertices[i]);
                if (d < l)
                {
                    d     = l;
                    f_Pos = mesh.vertices[i];
                }
            }
            float ea_y = GetSC(f_Pos, pos);
            var   sc   = d / 1.414f;

            if (sc > 2f)
            {
                sc = sc / 4;
                GameObject polygon = new GameObject("polygon");
                polygon.transform.localPosition = pos;
                //for (int i = 0;i<2;i++)
                // {
                //    for (int j = 0;j<2;j++)
                //   {
                GameObject item = GameObject.Instantiate((GameObject)Resources.Load("Prefabs/CityBuildings/" + "B_10"));
                item.transform.localPosition    = pos;     //new Vector3((pos.x-sc/2)+sc*i,0, (pos.z - sc / 2) + sc * j) ;
                item.transform.localEulerAngles = new Vector3(0, ea_y, 0);
                item.transform.localScale       = Vector3.one * (sc * Global.tilesizeRank);
                item.transform.SetParent(polygon.transform);
                //  }
                //   }
                polygon.transform.Rotate(0, ea_y, 0);
                return(polygon);
            }
            else
            {
                if (sc < 0.8f)
                {
                    sc = 1f;
                }
                GameObject polygon = GameObject.Instantiate((GameObject)Resources.Load("Prefabs/CityBuildings/" + "B_" + UnityEngine.Random.Range(3, 10)));
                polygon.transform.localPosition    = pos;
                polygon.transform.localEulerAngles = new Vector3(0, ea_y, 0);
                polygon.transform.localScale       = Vector3.one * (sc * Global.tilesizeRank);
                return(polygon);
            }
        }
    private void OnCellSpaceBoundaryMember(XmlReader reader)
    {
        List <Vector2> localUVs = new List <Vector2>();

        Poly2Mesh.Polygon localPolygon  = new Poly2Mesh.Polygon();
        string            localFileName = string.Empty;
        string            localName     = string.Empty;

        while (IsEndElement(reader, "cellSpaceBoundaryMember") == false)
        {
            reader.Read();

            if (string.IsNullOrWhiteSpace(localName))
            {
                reader.Read();
                localName = reader.GetAttribute("gml:id");
            }

            if (IsStartElement(reader, "Polygon") || IsStartElement(reader, "PolygonPatch"))
            {
                localPolygon = OnPolygon(reader);
            }

            if (IsStartElement(reader, "TextureImage"))
            {
                reader.Read();
                localFileName = reader.Value;
            }

            if (IsStartElement(reader, "TextureCoordinate"))
            {
                localUVs = new List <Vector2>();
                while (IsEndElement(reader, "TextureCoordinate") == false)
                {
                    reader.Read();

                    if (IsStartElement(reader, "pos"))
                    {
                        reader.Read();

                        localUVs.Add(GetPos2D(reader));
                    }
                }
            }
        }


        if (localUVs.Count() > 2)
        {
            localPolygon.outsideUVs = localUVs;
            localPolygon.holesUVs   = new List <List <Vector2> >();
            localPolygon.outsideUVs.Reverse();
        }

        localPolygon.outside.Reverse();

        for (int i = 0; i < localPolygon.holes.Count(); i++)
        {
            localPolygon.holes[i].Reverse();
            localPolygon.holesUVs.Add(new List <Vector2>());
        }

        // Texture 구멍 무시.
        if (string.IsNullOrWhiteSpace(localFileName) == false)
        {
            localPolygon.holes    = new List <List <Vector3> >();
            localPolygon.holesUVs = new List <List <Vector2> >();
        }

        GameObject cellSpaceBoundary = Poly2Mesh.CreateGameObject(localPolygon, true);

        cellSpaceBoundary.name = localName;
        cellSpaceBoundary.GetComponent <MeshCollider>().enabled   = true;
        cellSpaceBoundary.GetComponent <MeshCollider>().convex    = true;
        cellSpaceBoundary.GetComponent <MeshCollider>().isTrigger = true;


        if (string.IsNullOrWhiteSpace(localFileName))
        {
            cellSpaceBoundary.transform.Translate(localPolygon.planeNormal * 0.01f);
        }
        else
        {
            //cellSpaceBoundary.transform.Translate(localPolygon.planeNormal * 0.005f);
        }

        if (string.IsNullOrWhiteSpace(localFileName) == false)
        {
            //Debug.Log(GetDirectoryName() + "\\" + localFileName);
            IEnumerator tmpRunner = ApplyTexture(cellSpaceBoundary, Path.GetDirectoryName(fileUrl) + "\\" + localFileName);
            StartCoroutine(tmpRunner);
        }
        else
        {
            cellSpaceBoundary.GetComponent <Renderer>().material = CommonObjs.materialCellSpaceBoundary;
        }

        cellSpaceBoundary.tag = CommonObjs.TAG_CELLSPACEBOUNDARY;
        cellSpaceBoundary.transform.parent = CommonObjs.gmlRootCellSpaceBoundary.transform;
    }
        public GameObject BuildPolygon(string name, GOLayer layer, float height)
        {
            //GameObject polygon = GameObject.Instantiate((GameObject)Resources.Load("Prefabs/CityBuildings/" + "Building_CornerHouse_A"));
            GameObject polygon = new GameObject();

            Poly2Mesh.Polygon poly = new Poly2Mesh.Polygon();
            poly.outside = feature.convertedGeometry;
            if (feature.clips != null)
            {
                foreach (IList clipVerts in feature.clips)
                {
                    poly.holes.Add(GOFeature.CoordsToVerts(clipVerts));
                }
            }

            MeshFilter filter = polygon.AddComponent <MeshFilter>();

            polygon.AddComponent(typeof(MeshRenderer));

            try {
                mesh = Poly2Mesh.CreateMesh(poly);
            } catch {
            }
            if (height > 1)
            {
                if (mesh)
                {
                    Vector2[] uv2d = new Vector2[mesh.vertices.Length];
                    for (int i = 0; i < uv2d.Length; i++)
                    {
                        uv2d[i] = new Vector2(mesh.vertices[i].x, mesh.vertices[i].z);
                    }
                    var meshlemp = Mesh.Instantiate(mesh);
                    meshlemp.uv = uv2d;
                    mesh2D      = Mesh.Instantiate(meshlemp);

                    mesh.uv = uv2d;
                    if (height > 0)
                    {
                        mesh = SimpleExtruder.Extrude(mesh, polygon, height);
                        Vector2[] uvs3D = new Vector2[mesh.vertices.Length];
                        for (int i = 0; i < uvs3D.Length - 1; i++)
                        {
                            uvs3D[i] = new Vector2(Vector2.Distance(new Vector2(mesh.vertices[i + 1].x, mesh.vertices[i + 1].z), new Vector2(mesh.vertices[i].x, mesh.vertices[i].z)), mesh.vertices[i].y);
                        }
                        // uvs2[uvs2.Length - 1] = new Vector2(Mathf.Sqrt((float)(Math.Pow(mesh.vertices[0].x - mesh.vertices[uvs2.Length - 1].x, 2) + Math.Pow(mesh.vertices[0].z - mesh.vertices[uvs2.Length - 1].z, 2))), mesh.vertices[uvs2.Length - 1].y);
                        uvs3D[uvs3D.Length - 1] = new Vector2(10, mesh.vertices[uvs3D.Length - 1].y);
                        mesh.uv = uvs3D;
                    }
                }
            }
            else
            {
                if (mesh)
                {
                    Vector2[] uvs = new Vector2[mesh.vertices.Length];
                    for (int i = 0; i < uvs.Length; i++)
                    {
                        uvs[i] = new Vector2(mesh.vertices[i].x, mesh.vertices[i].z);
                    }
                    mesh.uv = uvs;
                    if (height > 0)
                    {
                        mesh = SimpleExtruder.Extrude(mesh, polygon, height);
                    }
                }
            }
            filter.sharedMesh = mesh;

            if (layer.useColliders)
            {
                polygon.AddComponent <MeshCollider>().sharedMesh = mesh;
            }
            return(polygon);
        }
Пример #26
0
    private void OnCellSpace(XmlReader reader)
    {
        GameObject solid = new GameObject();

        string localName = string.Empty;
        string localType = string.Empty;

        while (isEndElement(reader, "cellSpaceMember") == false)
        {
            reader.Read();

            if (string.IsNullOrWhiteSpace(localName))
            {
                reader.Read();
                localName = reader.GetAttribute("gml:id");
                localType = reader.LocalName;

                if (localType.Equals("TransitionSpace"))
                {
                    solid.tag = CommonObjs.TAG_TRANSITIONSPACE;
                    solid.transform.parent = CommonObjs.gmlRootTransitionSpace.transform;
                }
                else if (localType.Equals("GeneralSpace"))
                {
                    solid.tag = CommonObjs.TAG_GENERALSPACE;
                    solid.transform.parent = CommonObjs.gmlRootGeneralSpace.transform;
                }
                else
                {
                    solid.tag = CommonObjs.TAG_CELLSPACE;
                    solid.transform.parent = CommonObjs.gmlRootCellSpace.transform;
                }
            }

            if (isStartElement(reader, "Solid"))
            {
                int faceCnt = 1;
                solid.name = localName;
                reader.Read();
                while (isEndElement(reader, "Solid") == false)
                {
                    reader.Read();
                    if (isStartElement(reader, "Polygon") || isStartElement(reader, "PolygonPatch"))
                    {
                        var        polygon    = OnPolygon(reader);
                        GameObject genPolygon = Poly2Mesh.CreateGameObject(polygon);
                        genPolygon.name = string.Format("{0}_Face:{1}", localName, faceCnt++);

                        genPolygon.transform.parent = solid.transform;

                        if (localType.Equals("TransitionSpace"))
                        {
                            genPolygon.GetComponent <Renderer>().material = CommonObjs.materialTransitionSpace;
                        }
                        else if (localType.Equals("GeneralSpace"))
                        {
                            genPolygon.GetComponent <Renderer>().material = CommonObjs.materialGeneralSpace;
                        }
                        else
                        {
                            // CellSpace
                            genPolygon.GetComponent <Renderer>().material = CommonObjs.materialCellSpace;
                        }
                    }
                }
            }
        }
    }
Пример #27
0
        public static GOMesh PreloadPolygon(GOFeature feature)
        {
            if (feature.convertedGeometry == null)
            {
                return(null);
            }

            if (feature.convertedGeometry.Count == 2 && feature.convertedGeometry[0].Equals(feature.convertedGeometry[1]))
            {
                return(null);
            }

            List <Vector3> clean = feature.convertedGeometry.Distinct().ToList();

            if (clean == null || clean.Count <= 2)
            {
                return(null);
            }


            Poly2Mesh.Polygon poly = new Poly2Mesh.Polygon();
            poly.outside = feature.convertedGeometry;
            if (feature.clips != null)
            {
                foreach (List <Vector3> clipVerts in feature.clips)
                {
                    poly.holes.Add(clipVerts);
                }
            }

            GOMesh preMesh = null;

            preMesh = Poly2Mesh.CreateMeshInBackground(poly);

            if (preMesh != null)
            {
//				if (feature.layer.layerType != GOLayer.GOLayerType.Buildings) {
                Vector2[] uvs      = new Vector2[preMesh.vertices.Length];
                Vector3[] vertices = preMesh.vertices;
                for (int i = 0; i < uvs.Length; i++)
                {
                    uvs [i] = new Vector2(vertices [i].x, vertices [i].z) * 0.01f;
                }
                preMesh.uv = uvs;
//				}

                if (feature.goTile.useElevation)
                {
                    feature.ComputeHighestAltitude();
                }
//					feature.height += GOFeature.BuildingElevationOffset;


                if (feature.height > 0)
                {
                    feature.height *= feature.goTile.worldScale;

                    preMesh.secondaryMesh = new GOMesh(preMesh);

                    float h = feature.height;

                    if (feature.goTile.useElevation)
                    {
                        h += GOFeature.BuildingElevationOffset;
                    }

                    h += Noise();
                    preMesh.separateTop = feature.renderingOptions.hasRoof;
                    preMesh             = SimpleExtruder.SliceExtrudePremesh(preMesh, h, 4f, 4f, 10f * feature.goTile.worldScale);
                }
            }


            return(preMesh);
        }
Пример #28
0
    //End m2



    public void Generation()
    {
        if (points.Count >= 3)
        {
            points.Add(points[0]);

            lineRenderer.positionCount += 1;
            lineRenderer.SetPosition(transform.childCount - 1, lineRenderer.GetPosition(0));

            Poly2Mesh.Polygon poly = new Poly2Mesh.Polygon();
            poly.outside = points;

            // Set up game object with mesh;

            GameObject gob = new GameObject();
            gob.name = "Polygon";
            gob.tag  = "Polygon";
            gob.AddComponent(typeof(MeshRenderer));
            MeshFilter filter = gob.AddComponent(typeof(MeshFilter)) as MeshFilter;

            GameObject polyMesh = Poly2Mesh.CreateGameObject(poly);
            filter.mesh = polyMesh.GetComponent <MeshFilter>().mesh;

            if (filter != null)
            {
                Mesh mesh2 = filter.mesh;

                Vector3[] normals = mesh2.normals;
                for (int i = 0; i < normals.Length; i++)
                {
                    normals[i] = -normals[i];
                }
                mesh2.normals = normals;

                for (int m = 0; m < mesh2.subMeshCount; m++)
                {
                    int[] triangles = mesh2.GetTriangles(m);
                    for (int i = 0; i < triangles.Length; i += 3)
                    {
                        int temp = triangles[i + 0];
                        triangles[i + 0] = triangles[i + 1];
                        triangles[i + 1] = temp;
                    }
                    mesh2.SetTriangles(triangles, m);
                }
            }

            //gob.AddComponent<BoxCollider>().size = new Vector3(1f, 1f, 0.001f);

            //m2
            areaSum          = AreaOfMesh(polyMesh.GetComponent <MeshFilter>().sharedMesh);
            xyArea           = areaSum;
            txt_areaSum.text = "~ " + areaSum.ToString("#.##") + " m2";
            if (areaSum < 1)
            {
                txt_areaSum.text = "~ 0" + areaSum.ToString("#.##") + " m2";
            }
            _changeMaterial.work = true;
            start = true;

            lineRenderer.positionCount = 0;
            punkDot.positionCount      = 0;
            ClearAllDots();
            _changeMaterial.Material1();
            _swipeAnim.UpSwipe();


            first_Toturial = false;

            _TextBox_3.SetActive(false);
            _TextBox_1.SetActive(false);
            _TextBox_2.SetActive(false);
            _TextBox_4.SetActive(false);

            first_Box_1 = false;
            first_Box_2 = false;
            first_Box_3 = false;
            first_Box_4 = false;

            _ToturialUI.SetActive(false);
        }
    }
    private void OnCellSpace(XmlReader reader) //read room data
    {
        GameObject solid = new GameObject();

        string     cellname  = null;
        string     localType = null;
        GameObject genPolygon;
        bool       isWorkshop = false;


        while (IsEndElement(reader, "cellSpaceMember") == false)
        {
            reader.Read();

            if (string.IsNullOrWhiteSpace(localType))
            {
                reader.Read();
                localType = reader.GetAttribute("gml:id");

                if (localType.Equals("TransitionSpace"))
                {
                    solid.tag = CommonObjs.TAG_TRANSITIONSPACE;
                    solid.transform.parent = CommonObjs.gmlRootTransitionSpace.transform;
                }
                else if (localType.Equals("GeneralSpace"))
                {
                    solid.tag = CommonObjs.TAG_GENERALSPACE;
                    solid.transform.parent = CommonObjs.gmlRootGeneralSpace.transform;
                }
                else
                {
                    solid.tag = CommonObjs.TAG_CELLSPACE;
                    solid.transform.parent = CommonObjs.gmlRootCellSpace.transform;
                }
            }

            if (IsStartElement(reader, "name"))
            {
                cellname   = reader.ReadInnerXml();
                isWorkshop = cellname.Contains("Workshop");
            }

            if (IsStartElement(reader, "Solid"))
            {
                int faceCnt = 1;
                solid.name = cellname;

                reader.Read();
                while (IsEndElement(reader, "Solid") == false)
                {
                    reader.Read();
                    if (IsStartElement(reader, "Polygon") || IsStartElement(reader, "PolygonPatch"))
                    {
                        var polygon = OnPolygon(reader);
                        genPolygon = Poly2Mesh.CreateGameObject(polygon, isWorkshop);

                        genPolygon.name = string.Format("{0}_Face:{1}", localType, faceCnt++);

                        genPolygon.transform.parent = solid.transform;

                        if (localType.Equals("TransitionSpace"))
                        {
                            genPolygon.GetComponent <Renderer>().material = CommonObjs.machineFront;
                        }
                        else if (localType.Equals("GeneralSpace"))
                        {
                            genPolygon.GetComponent <Renderer>().material = CommonObjs.materialGeneralSpace;
                        }
                        if (isWorkshop)
                        {
                            genPolygon.GetComponent <Renderer>().material = CommonObjs.materialWorkshop;
                            workshopObjects.Add(genPolygon);
                        }
                        else
                        {
                            genPolygon.GetComponent <Renderer>().material = CommonObjs.materialCellSpace;
                        }
                    }

                    #region machines

                    if (IsStartElement(reader, "Objects"))
                    {
                        while (IsEndElement(reader, "Objects") == false)
                        {
                            reader.Read();


                            if (IsStartElement(reader, "Machine")) //read machine data
                            {
                                string   machineName  = reader.GetAttribute("name");
                                string[] machineState = new string[2];

                                if (reader.GetAttribute("extRef") == "true")
                                {
                                    reader.Read();
                                    Vector3 machinePosition = new Vector3();

                                    string machineFileURL = fileUrl;
                                    string machineFileName;

                                    machineFileURL = machineFileURL.Substring(8);
                                    string last            = machineFileURL[machineFileURL.Length - 1].ToString();
                                    float  machineRotation = 0;

                                    while (last != @"/") //delete IndoorGML Filename from URL
                                    {
                                        machineFileURL = machineFileURL.TrimEnd(machineFileURL[machineFileURL.Length - 1]);
                                        last           = machineFileURL[machineFileURL.Length - 1].ToString();
                                    }

                                    while (IsEndElement(reader, "Machine") == false)
                                    {
                                        reader.Read();

                                        if (IsStartElement(reader, "ref"))
                                        {
                                            while (IsEndElement(reader, "ref") == false)
                                            {
                                                reader.Read();

                                                if (IsStartElement(reader, "objectfile"))
                                                {
                                                    machineFileName = reader.GetAttribute("file");
                                                    refFileURL      = machineFileURL + machineFileName + "/";
                                                    machineFileURL += machineFileName + "/" + machineFileName + ".obj";
                                                }

                                                if (IsStartElement(reader, "picture"))
                                                {
                                                    machineRefs.Add(new string[4] {
                                                        machineName, "picture", null, refFileURL + reader.GetAttribute("file")
                                                    });
                                                }

                                                if (IsStartElement(reader, "documents"))
                                                {
                                                    while (IsEndElement(reader, "documents") == false)
                                                    {
                                                        reader.Read();

                                                        if (IsStartElement(reader, "document"))
                                                        {
                                                            machineRefs.Add(new string[4] {
                                                                machineName, "document", reader.GetAttribute("name"), refFileURL + reader.GetAttribute("file")
                                                            });
                                                        }
                                                    }
                                                }
                                            }
                                        }

                                        if (IsStartElement(reader, "pos"))
                                        {
                                            reader.Read();
                                            machinePosition = GetPos3D(reader);
                                        }

                                        if (IsStartElement(reader, "rot"))
                                        {
                                            float.TryParse(reader.ReadInnerXml(), out machineRotation);
                                        }

                                        if (IsStartElement(reader, "partialboundedBy"))
                                        {
                                            machineState[1] = reader.GetAttribute("xlink:href");
                                        }
                                    }

                                    GameObject machineObj = new GameObject {
                                        name = machineName
                                    };

                                    machineObj.AddComponent(typeof(MeshRenderer));
                                    MeshFilter  filter   = machineObj.AddComponent(typeof(MeshFilter)) as MeshFilter;
                                    ObjImporter importer = new ObjImporter();
                                    Mesh        mesh     = importer.ImportFile(machineFileURL);
                                    filter.mesh = mesh;
                                    mesh.RecalculateNormals();

                                    machineObj.AddComponent(typeof(MeshCollider));
                                    machineObj.GetComponent <MeshCollider>().sharedMesh = mesh;
                                    machineObj.GetComponent <MeshCollider>().convex     = true;
                                    machineObj.transform.position         = machinePosition;
                                    machineObj.transform.localScale       = new Vector3(0.001f, 0.001f, 0.001f);
                                    machineObj.transform.localEulerAngles = new Vector3(0, machineRotation, 0);

                                    machineObj.transform.parent = solid.transform;
                                    Assembly asm  = Assembly.Load("Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null");
                                    Type     type = asm.GetType("MachineStatus");
                                    machineObj.AddComponent(type);
                                    machines.Add(machineObj);

                                    if (inspection)
                                    {
                                        machineState[0] = machineName;
                                        machineStates.Add(machineState);
                                        machineObj.GetComponent <Renderer>().material = Resources.Load("Materials/Machine_INSPECTION", typeof(Material)) as Material;

                                        foreach (Dropdown dropdown in machineChoiceOption)
                                        {
                                            dropdown.options.Add(new Dropdown.OptionData()
                                            {
                                                text = machineName
                                            });
                                        }
                                    }
                                }
                            }
                        }
                    }
                    #endregion
                }
            }

            if (IsStartElement(reader, "partialboundedBy"))
            {
                string[] boundedBy = new string[2];
                boundedBy[0] = localType;
                boundedBy[1] = reader.GetAttribute("xlink:href");

                if (!inspection)
                {
                    player.GetComponent <PlayerController>().roomBoundaries.Add(boundedBy);
                }
            }
        }
    }
        public static GOMesh PreloadPolygon(GOFeature feature)
        {
            if (feature.convertedGeometry == null)
            {
                return(null);
            }

            if (feature.convertedGeometry.Count == 2 && feature.convertedGeometry[0].Equals(feature.convertedGeometry[1]))
            {
                return(null);
            }

            List <Vector3> clean = feature.convertedGeometry.Distinct().ToList();

            if (clean == null || clean.Count <= 2)
            {
                return(null);
            }


            Poly2Mesh.Polygon poly = new Poly2Mesh.Polygon();
            poly.outside = feature.convertedGeometry;
            if (feature.clips != null)
            {
                foreach (List <Vector3> clipVerts in feature.clips)
                {
                    poly.holes.Add(clipVerts);
                }
            }

            GOMesh preMesh = null;

//			try {
            preMesh = Poly2Mesh.CreateMeshInBackground(poly);
//			} catch {
//				Debug.LogWarning ("Catched polygon");
//			}

            if (preMesh != null)
            {
                Vector2[] uvs      = new Vector2[preMesh.vertices.Length];
                Vector3[] vertices = preMesh.vertices;
                for (int i = 0; i < uvs.Length; i++)
                {
                    uvs[i] = new Vector2(vertices[i].x, vertices[i].z);
                }
                preMesh.uv = uvs;

                if (feature.height > 0)
                {
                    preMesh.secondaryMesh = new GOMesh(preMesh);

                    float h = feature.height;

                    if (GOMap.GOLink)
                    {
                        h += GOFeature.BuildingElevationOffset;
                    }

                    h += Noise();

                    preMesh = SimpleExtruder.SliceExtrudePremesh(preMesh, h, 4f, 4f, 10f);
                }
            }


            return(preMesh);
        }