private void LoadScene() { XElement sceneElement = _document.XPathSelectElement("//c:library_visual_scenes/c:visual_scene", _nsMgr); _scene = new Scene { Id = sceneElement.Attribute("id").Value, Name = sceneElement.Attribute("name").Value }; foreach (var nodeElement in sceneElement.Elements(Ns + "node")) { XElement instanceElement = nodeElement.XPathSelectElement("*[contains(local-name(),'instance_')]", _nsMgr); string instanceType = instanceElement.Name.LocalName; string instanceUrl = instanceElement.Attribute("url").Value.Substring(1); switch (instanceType) { case "instance_camera": { Camera camera = new Camera(); ReadNodeInfo(camera, nodeElement); ReadNodeTransform(camera, nodeElement); ReadCameraInfo(camera, instanceUrl); _scene.Nodes.Add(camera); break; } case "instance_light": { Light light = ReadLight(instanceUrl); ReadNodeInfo(light, nodeElement); ReadNodeTransform(light, nodeElement); _scene.Nodes.Add(light); break; } case "instance_geometry": { MeshGeometry mesh = new MeshGeometry(); ReadNodeInfo(mesh, nodeElement); ReadNodeTransform(mesh, nodeElement); ReadMesh(mesh, instanceUrl); _scene.Nodes.Add(mesh); break; } } } }
private void ReadMesh(MeshGeometry mesh, string url) { XElement instanceElement = _document.XPathSelectElement(string.Format("//c:library_geometries/c:geometry[@id='{0}']", url), _nsMgr); XElement meshElement = instanceElement.XPathSelectElement("c:mesh", _nsMgr); XElement polylistElement = meshElement.Element(Ns + "polylist"); string verticesSourceId = meshElement.XPathSelectElement("c:vertices/c:input", _nsMgr).Attribute("source").Value.Substring(1); string normalsSourceId = polylistElement.XPathSelectElement("c:input[@semantic='NORMAL']", _nsMgr).Attribute("source").Value.Substring(1); float[] vertices = ReadMeshData(meshElement, verticesSourceId); float[] normals = ReadMeshData(meshElement, normalsSourceId); float[] texcoord = null; XElement texCoordElement = polylistElement.XPathSelectElement("c:input[@semantic='TEXCOORD']", _nsMgr); if (texCoordElement != null) { string texcoordSourceId = texCoordElement.Attribute("source").Value.Substring(1); texcoord = ReadMeshData(meshElement, texcoordSourceId); } int[] vertexCounts = polylistElement.Element(Ns + "vcount").Value.ToIntArray(); int[] poligonIndexes = polylistElement.Element(Ns + "p").Value.ToIntArray(); string materialId = polylistElement.GetAttributeValue("material", false); Material material = ReadMaterial(materialId); mesh.BuildMesh(vertexCounts, poligonIndexes, vertices, normals, texcoord, material); }