示例#1
0
    public static MobModel Read(Stream fs)
    {
        var zip      = new ZipFile(fs);
        var zonefile = zip.GetInputStream(zip.GetEntry("ORC_ACTORDEF.oec"));
        var reader   = new BinaryReader(zonefile);

        var obj       = new ArrayMesh();
        var nummeshes = reader.ReadInt32();

        for (var i = 0; i < nummeshes; ++i)
        {
            var flags    = reader.ReadUInt32();
            var numtex   = reader.ReadUInt32();
            var textures = new Texture[numtex];
            for (var j = 0; j < numtex; ++j)
            {
                var fn    = reader.ReadString();
                var entry = zip.GetEntry(fn);
                textures[j] = TextureLoader.Load(zip.GetInputStream(entry), (int)entry.Size, flags != 1);
            }
            var mat = new SpatialMaterial();
            if (numtex > 0)
            {
                mat.AlbedoTexture = textures[0];
            }
            if (flags == 1)
            {
                mat.ParamsUseAlphaScissor = true;
            }
            //else if(flags != 0)
            //	mat.FlagsTransparent = true;

            var numvert = reader.ReadInt32();
            var arrays  = new object[ArrayMesh.ARRAY_MAX];
            arrays[ArrayMesh.ARRAY_VERTEX]  = Enumerable.Range(0, numvert).Select(_ => reader.ReadVector3()).ToArray();
            arrays[ArrayMesh.ARRAY_NORMAL]  = Enumerable.Range(0, numvert).Select(_ => reader.ReadVector3()).ToArray();
            arrays[ArrayMesh.ARRAY_TEX_UV]  = Enumerable.Range(0, numvert).Select(_ => reader.ReadVector2()).ToArray();
            arrays[ArrayMesh.ARRAY_BONES]   = Enumerable.Range(0, numvert * 4).Select(o => (o & 3) == 0 ? reader.ReadUInt32() : 0f).ToArray();
            arrays[ArrayMesh.ARRAY_WEIGHTS] = Enumerable.Range(0, numvert * 4).Select(o => (o & 3) == 0 ? 1f : 0f).ToArray();
            var numpoly = reader.ReadInt32();
            var ind     = Enumerable.Range(0, numpoly * 3).Select(_ => (int)reader.ReadUInt32()).ToArray();
            arrays[ArrayMesh.ARRAY_INDEX] = ind;
            obj.AddSurfaceFromArrays(VisualServer.PRIMITIVE_TRIANGLES, arrays);
            obj.SurfaceSetMaterial(i, mat);
        }

        var sp = new Spatial();

        var numbones = reader.ReadUInt32();
        var skel     = new Skeleton();

        skel.RotateX(-Mathf.PI / 2);
        sp.AddChild(skel);
        skel.SetName("skel");
        for (var i = 0; i < numbones; ++i)
        {
            skel.AddBone($"bone_{i}");
            skel.SetBoneParent(i, reader.ReadInt32());
        }

        var numanim   = reader.ReadUInt32();
        var aniplayer = new AnimationPlayer();

        aniplayer.SetName("aniplayer");
        for (var i = 0; i < numanim; ++i)
        {
            var name       = reader.ReadString();
            var ani        = new Animation();
            var boneframes = new List <Tuple <Vector3, Quat> > [numbones];
            for (var j = 0; j < numbones; ++j)
            {
                ani.AddTrack(Animation.TYPE_TRANSFORM);
                ani.TrackSetPath(j, $"skel:bone_{j}");
                var numframes = reader.ReadUInt32();
                for (var k = 0; k < numframes; ++k)
                {
                    ani.TransformTrackInsertKey(j, 0.1f * k, reader.ReadVector3(), reader.ReadQuat(), new Vector3(1, 1, 1));
                }
            }
            aniplayer.AddAnimation(name, ani);
        }

        sp.AddChild(aniplayer);
        aniplayer.SetActive(true);
        aniplayer.Play("C09");

        var mi = new MeshInstance {
            Mesh = obj
        };

        skel.AddChild(mi);

        return(new MobModel(sp));
    }
        public override object Load(LoadedAsset asset)
        {
            XmlReader xmlReader = XmlReader.Create(asset.Data);

            while (xmlReader.Read())
            {
                if (xmlReader.NodeType == XmlNodeType.Element)
                {
                    if (xmlReader.Name == "bone")
                    {
                        string name = xmlReader.GetAttribute("name");
                        boneIdx = int.Parse(xmlReader.GetAttribute("id"));
                        skeleton.AddBone(new Bone(name));
                    }
                    else if (xmlReader.Name == "position")
                    {
                        float    x   = float.Parse(xmlReader.GetAttribute("x"));
                        float    y   = float.Parse(xmlReader.GetAttribute("y"));
                        float    z   = float.Parse(xmlReader.GetAttribute("z"));
                        Vector3f vec = new Vector3f(x, y, z);
                        skeleton.GetBone(boneIdx).SetBindTranslation(vec);
                    }
                    else if (xmlReader.Name == "rotation")
                    {
                        float angle = float.Parse(xmlReader.GetAttribute("angle"));
                        bindAngle = angle;
                    }
                    else if (xmlReader.Name == "boneparent")
                    {
                        string parent     = xmlReader.GetAttribute("parent");
                        string child      = xmlReader.GetAttribute("bone");
                        Bone   parentBone = null;
                        for (int i = 0; i < skeleton.GetNumBones(); i++)
                        {
                            if (skeleton.GetBone(i).Name == parent)
                            {
                                parentBone = skeleton.GetBone(i);
                            }
                        }
                        for (int i = 0; i < skeleton.GetNumBones(); i++)
                        {
                            if (skeleton.GetBone(i).Name == child)
                            {
                                Bone b = skeleton.GetBone(i);
                                parentBone.AddChild(b);
                            }
                        }
                    }
                    else if (xmlReader.Name == "track")
                    {
                        string bone = xmlReader.GetAttribute("bone");
                        keyframeBoneName = bone;
                        Bone b = skeleton.GetBone(keyframeBoneName);
                        if (b != null)
                        {
                            skeleton.GetAnimations()[skeleton.GetAnimations().Count - 1].AddTrack(new AnimationTrack(b));
                        }
                    }
                    else if (xmlReader.Name == "translate")
                    {
                        float    x   = float.Parse(xmlReader.GetAttribute("x"));
                        float    y   = float.Parse(xmlReader.GetAttribute("y"));
                        float    z   = float.Parse(xmlReader.GetAttribute("z"));
                        Vector3f vec = new Vector3f(x, y, z);
                        keyframeBoneTrans = vec;
                    }
                    else if (xmlReader.Name == "rotate")
                    {
                        float angle = float.Parse(xmlReader.GetAttribute("angle"));
                        keyframeBoneAngle = angle;
                    }
                    else if (xmlReader.Name == "axis")
                    {
                        float    x    = float.Parse(xmlReader.GetAttribute("x"));
                        float    y    = float.Parse(xmlReader.GetAttribute("y"));
                        float    z    = float.Parse(xmlReader.GetAttribute("z"));
                        Vector3f vec  = new Vector3f(x, y, z);
                        string   peek = lastElement;
                        if (peek == "rotate") // it is a keyframe
                        {
                            keyframeBoneAxis = vec;
                        }
                        else if (peek == "rotation") // it is a bone bind pose
                        {
                            bindAxis = vec;
                            skeleton.GetBone(boneIdx).SetBindAxisAngle(bindAxis.Normalize(), bindAngle);
                        }
                    }
                    else if (xmlReader.Name == "keyframe")
                    {
                        keyframeBoneTime = float.Parse(xmlReader.GetAttribute("time"));
                    }
                    else if (xmlReader.Name == "animation")
                    {
                        skeleton.GetAnimations().Add(new Animation(xmlReader.GetAttribute("name")));
                    }
                    lastElement = xmlReader.Name;
                }
                else if (xmlReader.NodeType == XmlNodeType.EndElement)
                {
                    if (xmlReader.Name == "keyframe")
                    {
                        Bone b = skeleton.GetBone(keyframeBoneName);
                        if (b != null)
                        {
                            Keyframe keyf = null;
                            skeleton.GetAnimations()[skeleton.GetAnimations().Count - 1]
                            .GetTrack(skeleton.GetAnimations()[skeleton.GetAnimations().Count - 1]
                                      .GetTracks().Count - 1)
                            .AddKeyframe(keyf = new Keyframe(keyframeBoneTime, keyframeBoneTrans, keyframeBoneAxis, keyframeBoneAngle));
                        }
                        keyframeBoneAngle = 0f;
                        keyframeBoneAxis  = new Vector3f(Vector3f.Zero);
                        keyframeBoneTime  = 0f;
                        keyframeBoneTrans = new Vector3f(Vector3f.Zero);
                    }
                    else if (xmlReader.Name == "track")
                    {
                        keyframeBoneName = "";
                    }
                }
            }
            xmlReader.Close();

            return(skeleton);
        }
示例#3
0
        public override object Load(LoadedAsset asset)
        {
            XmlReader xmlReader = XmlReader.Create(asset.Data);

            while (xmlReader.Read())
            {
                if (xmlReader.NodeType == XmlNodeType.Element)
                {
                    if (xmlReader.Name == ApxExporter.TOKEN_NODE)
                    {
                        node = true;
                        geom = false;
                        string name = xmlReader.GetAttribute(ApxExporter.TOKEN_NAME);
                        Node   n    = new Node(name);
                        if (lastNode != null)
                        {
                            lastNode.AddChild(n);
                        }
                        lastNode = n;
                        nodes.Add(n);
                    }
                    else if (xmlReader.Name == ApxExporter.TOKEN_GEOMETRY)
                    {
                        node = false;
                        geom = true;
                        string   name = xmlReader.GetAttribute(ApxExporter.TOKEN_NAME);
                        Geometry g    = new Geometry();
                        g.Name = name;
                        if (lastNode != null)
                        {
                            lastNode.AddChild(g);
                        }
                        geoms.Add(g);
                    }
                    else if (xmlReader.Name == ApxExporter.TOKEN_MATERIAL)
                    {
                        Material mat = new Material();
                        mats.Add(mat);
                        string bucketStr = xmlReader.GetAttribute(ApxExporter.TOKEN_MATERIAL_BUCKET);
                        RenderManager.Bucket bucket;
                        if (bucketStr != null)
                        {
                            Enum.TryParse <RenderManager.Bucket>(bucketStr, out bucket);
                        }
                        else
                        {
                            bucket = RenderManager.Bucket.Opaque;
                        }
                        Console.WriteLine("Bucket: " + bucket.ToString());
                        mat.Bucket = bucket;
                    }
                    else if (xmlReader.Name == ApxExporter.TOKEN_MATERIAL_PROPERTY)
                    {
                        Material lastMaterial = mats[mats.Count - 1];

                        string name = xmlReader.GetAttribute(ApxExporter.TOKEN_NAME);
                        string type = xmlReader.GetAttribute(ApxExporter.TOKEN_TYPE);
                        string val  = xmlReader.GetAttribute(ApxExporter.TOKEN_VALUE);

                        object value = null;
                        if (type == ApxExporter.TOKEN_TYPE_STRING)
                        {
                            value = val;
                        }
                        else if (type == ApxExporter.TOKEN_TYPE_INT)
                        {
                            value = int.Parse(val);
                        }
                        else if (type == ApxExporter.TOKEN_TYPE_BOOLEAN)
                        {
                            value = bool.Parse(val);
                        }
                        else if (type == ApxExporter.TOKEN_TYPE_FLOAT)
                        {
                            value = float.Parse(val);
                        }
                        else if (type == ApxExporter.TOKEN_TYPE_VECTOR2)
                        {
                            value = ParseVector2(val);
                        }
                        else if (type == ApxExporter.TOKEN_TYPE_VECTOR3)
                        {
                            value = ParseVector3(val);
                        }
                        else if (type == ApxExporter.TOKEN_TYPE_VECTOR4)
                        {
                            value = ParseVector4(val);
                        }
                        else if (type == ApxExporter.TOKEN_TYPE_TEXTURE)
                        {
                            string texPath      = val;
                            string parentPath   = System.IO.Directory.GetParent(asset.FilePath).ToString();
                            string finalTexPath = parentPath + "\\" + texPath;
                            if (System.IO.File.Exists(finalTexPath))
                            {
                                value = AssetManager.LoadTexture(finalTexPath);
                            }
                            else if (System.IO.File.Exists(texPath)) // absolute path
                            {
                                value = AssetManager.LoadTexture(texPath);
                            }
                            else
                            {
                                value = null;
                            }
                        }

                        lastMaterial.SetValue(name, value);
                    }
                    else if (xmlReader.Name == ApxExporter.TOKEN_TRANSLATION)
                    {
                        float x = float.Parse(xmlReader.GetAttribute("x"));
                        float y = float.Parse(xmlReader.GetAttribute("y"));
                        float z = float.Parse(xmlReader.GetAttribute("z"));

                        Vector3f   vec = new Vector3f(x, y, z);
                        GameObject go  = null;
                        if (node)
                        {
                            go = nodes[nodes.Count - 1];
                        }
                        else if (geom)
                        {
                            go = geoms[geoms.Count - 1];
                        }
                        go.SetLocalTranslation(vec);
                    }
                    else if (xmlReader.Name == ApxExporter.TOKEN_ROTATION)
                    {
                        float x = float.Parse(xmlReader.GetAttribute("x"));
                        float y = float.Parse(xmlReader.GetAttribute("y"));
                        float z = float.Parse(xmlReader.GetAttribute("z"));
                        float w = float.Parse(xmlReader.GetAttribute("w"));

                        Quaternion quat = new Quaternion(x, y, z, w);
                        GameObject go   = null;
                        if (node)
                        {
                            go = nodes[nodes.Count - 1];
                        }
                        else if (geom)
                        {
                            go = geoms[geoms.Count - 1];
                        }
                        go.SetLocalRotation(quat);
                    }
                    else if (xmlReader.Name == ApxExporter.TOKEN_SCALE)
                    {
                        float x = float.Parse(xmlReader.GetAttribute("x"));
                        float y = float.Parse(xmlReader.GetAttribute("y"));
                        float z = float.Parse(xmlReader.GetAttribute("z"));

                        Vector3f   vec = new Vector3f(x, y, z);
                        GameObject go  = null;
                        if (node)
                        {
                            go = nodes[nodes.Count - 1];
                        }
                        else if (geom)
                        {
                            go = geoms[geoms.Count - 1];
                        }
                        go.SetLocalScale(vec);
                    }
                    else if (xmlReader.Name == ApxExporter.TOKEN_MESH)
                    {
                        meshes.Add(new Mesh());
                    }
                    else if (xmlReader.Name == ApxExporter.TOKEN_VERTICES)
                    {
                        List <Vertex> newVList = new List <Vertex>();
                        vertices.Add(newVList);

                        List <Vector3f> newPList = new List <Vector3f>();
                        positions.Add(newPList);

                        List <Vector3f> newNList = new List <Vector3f>();
                        normals.Add(newNList);

                        List <Vector2f> newT0List = new List <Vector2f>();
                        texcoords0.Add(newT0List);

                        List <Vector2f> newT1List = new List <Vector2f>();
                        texcoords1.Add(newT1List);
                    }
                    else if (xmlReader.Name == ApxExporter.TOKEN_POSITION)
                    {
                        List <Vector3f> pos = positions[positions.Count - 1];

                        float x = float.Parse(xmlReader.GetAttribute("x"));
                        float y = float.Parse(xmlReader.GetAttribute("y"));
                        float z = float.Parse(xmlReader.GetAttribute("z"));

                        Vector3f position = new Vector3f(x, y, z);
                        pos.Add(position);
                    }
                    else if (xmlReader.Name == ApxExporter.TOKEN_NORMAL)
                    {
                        List <Vector3f> nor = normals[normals.Count - 1];

                        float x = float.Parse(xmlReader.GetAttribute("x"));
                        float y = float.Parse(xmlReader.GetAttribute("y"));
                        float z = float.Parse(xmlReader.GetAttribute("z"));

                        Vector3f normal = new Vector3f(x, y, z);
                        nor.Add(normal);
                    }
                    else if (xmlReader.Name == ApxExporter.TOKEN_TEXCOORD0)
                    {
                        List <Vector2f> tc0 = texcoords0[texcoords0.Count - 1];

                        float x = float.Parse(xmlReader.GetAttribute("x"));
                        float y = float.Parse(xmlReader.GetAttribute("y"));

                        Vector2f tc = new Vector2f(x, y);
                        tc0.Add(tc);
                    }
                    else if (xmlReader.Name == ApxExporter.TOKEN_TEXCOORD1)
                    {
                        List <Vector2f> tc1 = texcoords1[texcoords1.Count - 1];

                        float x = float.Parse(xmlReader.GetAttribute("x"));
                        float y = float.Parse(xmlReader.GetAttribute("y"));

                        Vector2f tc = new Vector2f(x, y);
                        tc1.Add(tc);
                    }
                    else if (xmlReader.Name == ApxExporter.TOKEN_FACES)
                    {
                        faces.Add(new List <int>());
                    }
                    else if (xmlReader.Name == ApxExporter.TOKEN_FACE)
                    {
                        List <int> fList = faces[faces.Count - 1];
                        for (int i = 0; i < 3; i++)
                        {
                            string val = xmlReader.GetAttribute("i" + i.ToString());
                            if (val != "")
                            {
                                string[] tokens = val.Split('/');
                                for (int j = 0; j < tokens.Length; j++)
                                {
                                    fList.Add(int.Parse(tokens[j]));
                                }
                            }
                        }
                    }
                    else if (xmlReader.Name == ApxExporter.TOKEN_SKELETON)
                    {
                        skeletons.Add(new Skeleton());
                        bones.Add(new List <Bone>());
                    }
                    else if (xmlReader.Name == ApxExporter.TOKEN_SKELETON_ASSIGN)
                    {
                        string assign = xmlReader.GetAttribute(ApxExporter.TOKEN_ID);
                        skeletonAssigns.Add(int.Parse(assign));
                    }
                    else if (xmlReader.Name == ApxExporter.TOKEN_BONE)
                    {
                        string      name   = xmlReader.GetAttribute(ApxExporter.TOKEN_NAME);
                        string      parent = xmlReader.GetAttribute(ApxExporter.TOKEN_PARENT);
                        Bone        bone   = new Bone(name);
                        List <Bone> lastBL = bones[bones.Count - 1];
                        if (!string.IsNullOrEmpty(parent))
                        {
                            foreach (Bone b in lastBL)
                            {
                                if (b.Name == parent)
                                {
                                    b.AddChild(bone);
                                }
                            }
                        }
                        List <Bone> skel = bones[bones.Count - 1];
                        skel.Add(bone);
                        Skeleton lastSkeleton = skeletons[skeletons.Count - 1];
                        lastSkeleton.AddBone(bone);
                    }
                    else if (xmlReader.Name == ApxExporter.TOKEN_BONE_BINDPOSITION)
                    {
                        float x = float.Parse(xmlReader.GetAttribute("x"));
                        float y = float.Parse(xmlReader.GetAttribute("y"));
                        float z = float.Parse(xmlReader.GetAttribute("z"));

                        Vector3f    vec  = new Vector3f(x, y, z);
                        List <Bone> skel = bones[bones.Count - 1];
                        if (skel.Count > 0)
                        {
                            Bone lastBone = skel[skel.Count - 1];
                            lastBone.SetBindTranslation(vec);
                        }
                    }
                    else if (xmlReader.Name == ApxExporter.TOKEN_BONE_BINDROTATION)
                    {
                        float x = float.Parse(xmlReader.GetAttribute("x"));
                        float y = float.Parse(xmlReader.GetAttribute("y"));
                        float z = float.Parse(xmlReader.GetAttribute("z"));
                        float w = float.Parse(xmlReader.GetAttribute("w"));

                        List <Bone> skel = bones[bones.Count - 1];
                        if (skel.Count > 0)
                        {
                            Bone lastBone = skel[skel.Count - 1];
                            //   lastBone.SetBindAxisAngle(new Vector3f(x, y, z), w);
                            lastBone.SetBindRotation(new Quaternion(x, y, z, w));
                        }
                    }
                    else if (xmlReader.Name == ApxExporter.TOKEN_BONE_ASSIGNS)
                    {
                        boneAssigns.Add(new List <BoneAssign>());
                    }
                    else if (xmlReader.Name == ApxExporter.TOKEN_BONE_ASSIGN)
                    {
                        int               vertIdx    = int.Parse(xmlReader.GetAttribute(ApxExporter.TOKEN_VERTEXINDEX));
                        int               boneIdx    = int.Parse(xmlReader.GetAttribute(ApxExporter.TOKEN_BONEINDEX));
                        float             boneWeight = float.Parse(xmlReader.GetAttribute(ApxExporter.TOKEN_BONEWEIGHT));
                        List <BoneAssign> ba         = boneAssigns[boneAssigns.Count - 1];
                        ba.Add(new BoneAssign(vertIdx, boneWeight, boneIdx));
                    }
                    else if (xmlReader.Name == ApxExporter.TOKEN_ANIMATIONS)
                    {
                        hasAnimations = true;
                    }
                    else if (xmlReader.Name == ApxExporter.TOKEN_ANIMATION)
                    {
                        string    name = xmlReader.GetAttribute(ApxExporter.TOKEN_NAME);
                        Animation anim = new Animation(name);
                        animations.Add(anim);
                    }
                    else if (xmlReader.Name == ApxExporter.TOKEN_ANIMATION_TRACK)
                    {
                        string bone = xmlReader.GetAttribute(ApxExporter.TOKEN_BONE);
                        Bone   b    = skeletons[skeletons.Count - 1].GetBone(bone);
                        if (b != null)
                        {
                            AnimationTrack track = new AnimationTrack(b);
                            animations[animations.Count - 1].AddTrack(track);
                        }
                    }
                    else if (xmlReader.Name == ApxExporter.TOKEN_KEYFRAME)
                    {
                        float time = float.Parse(xmlReader.GetAttribute(ApxExporter.TOKEN_TIME));

                        Keyframe       frame  = new Keyframe(time, null, null);
                        Animation      canim  = animations[animations.Count - 1];
                        AnimationTrack ctrack = canim.GetTrack(canim.GetTracks().Count - 1);
                        ctrack.AddKeyframe(frame);
                    }
                    else if (xmlReader.Name == ApxExporter.TOKEN_KEYFRAME_TRANSLATION)
                    {
                        Animation      canim     = animations[animations.Count - 1];
                        AnimationTrack ctrack    = canim.GetTrack(canim.GetTracks().Count - 1);
                        Keyframe       lastFrame = ctrack.frames[ctrack.frames.Count - 1];

                        float x = float.Parse(xmlReader.GetAttribute("x"));
                        float y = float.Parse(xmlReader.GetAttribute("y"));
                        float z = float.Parse(xmlReader.GetAttribute("z"));

                        Vector3f vec = new Vector3f(x, y, z);
                        lastFrame.SetTranslation(vec);
                    }
                    else if (xmlReader.Name == ApxExporter.TOKEN_KEYFRAME_ROTATION)
                    {
                        Animation      canim     = animations[animations.Count - 1];
                        AnimationTrack ctrack    = canim.GetTrack(canim.GetTracks().Count - 1);
                        Keyframe       lastFrame = ctrack.frames[ctrack.frames.Count - 1];

                        float x = float.Parse(xmlReader.GetAttribute("x"));
                        float y = float.Parse(xmlReader.GetAttribute("y"));
                        float z = float.Parse(xmlReader.GetAttribute("z"));
                        float w = float.Parse(xmlReader.GetAttribute("w"));

                        Quaternion rot = new Quaternion(x, y, z, w);
                        lastFrame.SetRotation(rot);
                    }
                } // start element
                else if (xmlReader.NodeType == XmlNodeType.EndElement)
                {
                    if (xmlReader.Name == ApxExporter.TOKEN_NODE)
                    {
                        if (lastNode != null)
                        {
                            if (lastNode.GetParent() != null)
                            {
                                lastNode = lastNode.GetParent();
                            }
                            else
                            {
                                lastNode = null;
                            }
                        }
                        node = false;
                    }
                    else if (xmlReader.Name == ApxExporter.TOKEN_GEOMETRY)
                    {
                        geom = false;
                    }
                    else if (xmlReader.Name == ApxExporter.TOKEN_MATERIAL)
                    {
                        if (geoms.Count > 0)
                        {
                            int      lastGeomIndex = geoms.Count - 1;
                            Geometry parent        = geoms[lastGeomIndex];
                            int      lastMatIndex  = mats.Count - 1;
                            Material m             = mats[lastMatIndex];
                            geomMats.Add(parent, m);
                        }
                    }
                    else if (xmlReader.Name == ApxExporter.TOKEN_SKELETON)
                    {
                    }
                    else if (xmlReader.Name == ApxExporter.TOKEN_MODEL)
                    {
                        // end of model, load in meshes
                        EndModel();
                    }
                } // end element
            }
            xmlReader.Close();
            Node finalNode = new Node();

            foreach (Node n in nodes)
            {
                if (n.GetParent() == null)
                {
                    finalNode.AddChild(n);
                }
            }
            this.ResetLoader();
            return(finalNode);
        }