Пример #1
0
        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;
                        }
                }
            }
        }
Пример #2
0
        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);
        }