示例#1
0
        public static void HandleMaterial(XmlReader reader, CityGml2GO cityGml2Go)
        {
            var id = "";

            while (reader.MoveToNextAttribute())
            {
                if (reader.LocalName == "id")
                {
                    id = reader.Value;
                }
            }
            var targets = new List <string>();

            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Element && reader.LocalName == "target")
                {
                    targets.Add(reader.ReadInnerXml());
                }
                if (reader.NodeType == XmlNodeType.EndElement && reader.LocalName == "X3DMaterial")
                {
                    break;
                }
            }
            if (!cityGml2Go.Materials.ContainsKey(id))
            {
                cityGml2Go.Materials.Add(id, targets);
            }
        }
示例#2
0
        public static void HandleSemantics(GameObject go, SemanticType semanticType, CityGml2GO cityGml2Go)
        {
            var stAdded = go.AddComponent <SemanticType>();

            stAdded.Id   = semanticType.Id;
            stAdded.Name = semanticType.Name;

            cityGml2Go.SemanticSurfMat.PaintSurfaces(go, semanticType);
        }
示例#3
0
        public static void HandleTexture(XmlReader reader, CityGml2GO cityGml2Go)
        {
            //return;
            var texture = new CityGml2GO.TextureInformation();

            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Element && reader.LocalName == "target")
                {
                    var textureTarget = new CityGml2GO.TextureTarget();
                    while (reader.MoveToNextAttribute())
                    {
                        if (reader.LocalName == "uri")
                        {
                            textureTarget.Id = reader.Value.Replace("#", "");
                            //textureTarget.Id = reader.Value.Replace("#", "");
                        }
                    }

                    while (reader.Read())
                    {
                        if (reader.NodeType == XmlNodeType.Element && reader.LocalName == "textureCoordinates")
                        {
                            var coords = reader.ReadInnerXml();
                            var parts  = coords.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries);

                            for (int i = 0; i < parts.Length; i += 2)
                            {
                                textureTarget.Coords.Add(new Vector2((float)double.Parse(parts[i]), (float)double.Parse(parts[i + 1])));
                            }
                        }
                        if (reader.NodeType == XmlNodeType.EndElement && reader.LocalName == "target")
                        {
                            break;
                        }
                    }
                    texture.Targets.Add(textureTarget);
                }
                if (reader.NodeType == XmlNodeType.Element && reader.LocalName == "imageURI")
                {
                    texture.Url = reader.ReadInnerXml();
                }


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

            cityGml2Go.Textures.Add(texture);
        }
示例#4
0
        public static void ApplyMaterials(CityGml2GO cityGml2Go)
        {
            //var path = Path.GetFullPath(cityGml2Go.Filename);
            var path = Application.dataPath + "/StreamingAssets/test/";

            foreach (var texture in cityGml2Go.Textures)
            {
                var fn    = Path.Combine(path, texture.Url);
                var b     = File.ReadAllBytes(fn);
                var tex2D = new Texture2D(1, 1);
                tex2D.LoadImage(b);
                var mat = new Material(Shader.Find("Standard"))
                {
                    mainTexture = tex2D
                };

                foreach (var textureTarget in texture.Targets)
                {
                    if (!cityGml2Go.Polygons.Any(x => x != null && x.name == textureTarget.Id && x.activeSelf))
                    {
                        continue;
                    }
                    GameObject   go = cityGml2Go.Polygons.First(x => x != null && x.name == textureTarget.Id && x.activeSelf);
                    MeshRenderer mr = go.GetComponent <MeshRenderer>();

                    mr.material = mat;

                    MeshFilter mf = go.GetComponent <MeshFilter>();

                    Vector3[] vertices = mf.sharedMesh.vertices;
                    var       uv       = new Vector2[vertices.Length];
                    foreach (var x in cityGml2Go.oriPoly)
                    {
                        if (x.name == textureTarget.Id)
                        {
                            x.outsideUVs = textureTarget.Coords;
                            for (int i = 0; i < vertices.Length; i++)
                            {
                                uv[i] = x.ClosestUV(vertices[i]);
                            }
                        }
                    }
                    uv.Reverse();
                    mf.sharedMesh.uv = uv.ToArray();
                    mf.sharedMesh.RecalculateTangents();
                }
            }
        }
示例#5
0
        public static void HandleBuilding(XmlReader reader, CityGml2GO cityGml2Go)
        {
            var buildingName = "";

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

            var buildingGo         = new GameObject(string.IsNullOrEmpty(buildingName) ? "Building" : buildingName);
            var buildingProperties = buildingGo.AddComponent <Scripts.BuildingProperties>();
            var semanticType       = buildingGo.AddComponent <SemanticType>();

            buildingGo.transform.SetParent(cityGml2Go.Parent.transform);

            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Element && reader.LocalName == "Polygon")
                {
                    var polyGo = PolygonHandler.PolyToMesh(reader, buildingName, cityGml2Go, semanticType);
                    if (polyGo != null)
                    {
                        polyGo.transform.SetParent(buildingGo.transform);
                    }
                }

                if (cityGml2Go.ShowCurves)
                {
                    if (reader.NodeType == XmlNodeType.Element && reader.LocalName == "MultiCurve")
                    {
                        MultiCurveHandler.HandleMultiCurve(reader, buildingGo, semanticType, cityGml2Go);
                    }
                }

                if (cityGml2Go.Semantics)
                {
                    if (reader.NodeType == XmlNodeType.Element && cityGml2Go.SemanticSurfaces.Any(x => x == reader.LocalName))
                    {
                        semanticType.Name = reader.LocalName;
                        reader.MoveToFirstAttribute();
                        if (reader.LocalName == "id")
                        {
                            semanticType.Id = reader.Value;
                        }
                        else
                        {
                            while (reader.MoveToNextAttribute())
                            {
                                semanticType.Id = reader.Value;
                            }
                        }
                    }
                }

                BuildingPropertiesHandler.HandleBuildingProperties(reader, buildingProperties);

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

            Object.Destroy(semanticType);
        }
示例#6
0
        public static void HandleMultiCurve(XmlReader reader, GameObject buildingGo, SemanticType semanticType, CityGml2GO cityGml2Go)
        {
            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Element && reader.LocalName == "curveMember")
                {
                    GameObject   lrGo;
                    LineRenderer lr;

                    if (cityGml2Go.LineRendererPrefab == null)
                    {
                        lrGo = new GameObject();
                        lr   = lrGo.AddComponent <LineRenderer>();
                    }
                    else
                    {
                        lrGo = GameObject.Instantiate(cityGml2Go.LineRendererPrefab);
                        lr   = lrGo.GetComponent <LineRenderer>();
                        if (lr == null)
                        {
                            lr = lrGo.AddComponent <LineRenderer>();
                        }
                    }
                    var points = new List <Vector3>();
                    while (reader.Read())
                    {
                        if (reader.NodeType == XmlNodeType.Element && reader.LocalName == "pos")
                        {
                            points.Add(PositionHandler.GetPos(reader, cityGml2Go.ActualTranslate));
                        }
                        if (reader.NodeType == XmlNodeType.Element && reader.LocalName == "posList")
                        {
                            var range = PositionHandler.GetPosList(reader, cityGml2Go.ActualTranslate);
                            if (range != null)
                            {
                                points.AddRange(range);
                            }
                        }

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

                    lr.positionCount = points.Count;
                    lr.SetPositions(points.ToArray());

                    lrGo.transform.SetParent(buildingGo.transform);
                    lrGo.transform.localPosition = Vector3.zero;
                    if (cityGml2Go.Semantics && semanticType != null)
                    {
                        SemanticsHandler.HandleSemantics(lrGo, semanticType, cityGml2Go);
                    }
                }

                if (reader.NodeType == XmlNodeType.EndElement && reader.LocalName == "MultiCurve")
                {
                    return;
                }
            }
        }
示例#7
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);
        }