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); } }
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); }
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); }
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(); } } }
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); }
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; } } }
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); }