protected override void Read(GrnBinaryReader reader)
        {
            reader.ReadBytes(4);
            this.Offset = reader.ReadUInt32();
            reader.ReadBytes(8);

            int currentPosition = (Int32)reader.BaseStream.Position;

            reader.Seek((int)this.Offset, System.IO.SeekOrigin.Begin);
            this.NumTotalChildNodes = reader.ReadInt32();
            reader.ReadBytes(12);

            int numChildren = this.NumTotalChildNodes;

            for (int i = 0; i < numChildren; i++)
            {
                GrnNodeType nodeType  = (GrnNodeType)reader.ReadInt32();
                GrnNode     childNode = GrnNode.ReadByNodeType(reader, this, nodeType);
                this.ChildNodes.Add(childNode);
                numChildren -= childNode.NumTotalChildNodes;
                if (i > 0)
                {
                    childNode.PreviousSibling             = this.ChildNodes[i - 1];
                    childNode.PreviousSibling.NextSibling = childNode;
                }
            }

            reader.Seek(currentPosition, System.IO.SeekOrigin.Begin);
        }
示例#2
0
 public GrnNode(GrnNode parentNode, GrnNodeType nodeType)
 {
     this.ParentNode      = parentNode;
     this.PreviousSibling = null;
     this.NextSibling     = null;
     this.NodeType        = nodeType;
     this.Offset          = 0;
     this.ChildNodes      = new List <GrnNode>();
     this.Data            = new byte[0];
 }
示例#3
0
 public void DumpData(System.IO.Stream stream, string folderPath)
 {
     using (GrnBinaryReader reader = new GrnBinaryReader(stream))
     {
         Int64 magic = reader.ReadInt64();
         if (magic != 7380350958317416490)
         {
             throw new Exception("This is not a GRN file!");
         }
         reader.ReadBytes(56);
         GrnNodeType nodeType = (GrnNodeType)reader.ReadInt32(); // should be FileDirectory
         GrnNode     mainNode = GrnNode.ReadByNodeType(reader, null, nodeType);
         mainNode.CreateFolder(folderPath, 0);
     }
 }
示例#4
0
        public virtual List <T> FindNodes <T>(GrnNodeType nodeType)
            where T : GrnNode
        {
            List <T> results = new List <T>();

            if (this.NodeType == nodeType)
            {
                results.Add((T)this);
            }

            for (int i = 0; i < this.ChildNodes.Count; ++i)
            {
                results.AddRange(this.ChildNodes[i].FindNodes <T>(nodeType));
            }

            return(results);
        }
示例#5
0
        public virtual T FindNode <T>(GrnNodeType nodeType)
            where T : GrnNode
        {
            if (this.NodeType == nodeType)
            {
                return((T)this);
            }

            for (int i = 0; i < this.ChildNodes.Count; ++i)
            {
                T result = this.ChildNodes[i].FindNode <T>(nodeType);
                if (result != null)
                {
                    return(result);
                }
            }

            return(null);
        }
示例#6
0
        protected virtual void Read(GrnBinaryReader reader)
        {
            this.Offset             = reader.ReadUInt32();
            this.NumTotalChildNodes = reader.ReadInt32();

            int numChildren = this.NumTotalChildNodes;

            for (int i = 0; i < numChildren; i++)
            {
                GrnNodeType nodeType  = (GrnNodeType)reader.ReadInt32();
                GrnNode     childNode = GrnNode.ReadByNodeType(reader, this, nodeType);
                this.ChildNodes.Add(childNode);
                numChildren -= childNode.NumTotalChildNodes;
                if (i > 0)
                {
                    childNode.PreviousSibling             = this.ChildNodes[i - 1];
                    childNode.PreviousSibling.NextSibling = childNode;
                }
            }
        }
示例#7
0
        protected override void Read(GrnBinaryReader reader)
        {
            this.NumTotalChildNodes = reader.ReadInt32();

            reader.ReadBytes(8);
            this.FileLength = reader.ReadUInt32();
            reader.ReadBytes(12);

            for (int i = 0; i < NumTotalChildNodes; i++)
            {
                GrnNodeType nodeType  = (GrnNodeType)reader.ReadInt32();
                GrnNode     childNode = GrnNode.ReadByNodeType(reader, this, nodeType);
                this.ChildNodes.Add(childNode);
                if (i > 0)
                {
                    childNode.PreviousSibling             = this.ChildNodes[i - 1];
                    childNode.PreviousSibling.NextSibling = childNode;
                }
            }

            this.ReadData(reader, 0);
        }
示例#8
0
        public static GrnNode ReadByNodeType(GrnBinaryReader reader, GrnNode parentNode, GrnNodeType nodeType)
        {
            GrnNode node;

            if (nodeType == GrnNodeType.FileDirectory)
            {
                node = new GrnMainNode();
            }
            else if (nodeType == GrnNodeType.VersionFrameDirectory ||
                     nodeType == GrnNodeType.StandardFrameDirectory ||
                     nodeType == GrnNodeType.NullFrameDirectory)
            {
                node = new GrnSectionNode(parentNode, nodeType);
            }
            else if (nodeType == GrnNodeType.StringTable)
            {
                node = new GrnStringTableNode(parentNode);
            }
            else if (parentNode.NodeType == GrnNodeType.MeshVertexSet)
            {
                if (nodeType == GrnNodeType.MeshVertices)
                {
                    node = new GrnMeshVerticesNode(parentNode);
                }
                else if (nodeType == GrnNodeType.MeshNormals)
                {
                    node = new GrnMeshNormalsNode(parentNode);
                }
                else
                {
                    node = new GrnNode(parentNode, nodeType);
                }
            }
            else if (nodeType == GrnNodeType.MeshField)
            {
                node = new GrnMeshFieldNode(parentNode);
            }
            else if (nodeType == GrnNodeType.MeshWeights)
            {
                node = new GrnMeshWeightsNode(parentNode);
            }
            else if (nodeType == GrnNodeType.MeshTriangles)
            {
                node = new GrnMeshTrianglesNode(parentNode);
            }
            else if (nodeType == GrnNodeType.DataExtensionProperty)
            {
                node = new GrnDataExtensionPropertyNode(parentNode);
            }
            else if (nodeType == GrnNodeType.DataExtensionPropertyValue)
            {
                node = new GrnDataExtensionPropertyValueNode(parentNode);
            }
            else if (nodeType == GrnNodeType.DataExtensionReference)
            {
                node = new GrnDataExtensionReferenceNode(parentNode);
            }
            else if (nodeType == GrnNodeType.Bone)
            {
                node = new GrnBoneNode(parentNode);
            }
            else if (nodeType == GrnNodeType.MaterialSimpleDiffuseTexture)
            {
                node = new GrnMaterialSimpleDiffuseTextureNode(parentNode);
            }
            else if (nodeType == GrnNodeType.FormBoneChannels)
            {
                node = new GrnFormBoneChannelsNode(parentNode);
            }
            else if (nodeType == GrnNodeType.FormMesh)
            {
                node = new GrnFormMeshNode(parentNode);
            }
            else if (nodeType == GrnNodeType.FormMeshBone)
            {
                node = new GrnFormMeshBoneNode(parentNode);
            }
            else if (nodeType == GrnNodeType.RenderPass)
            {
                node = new GrnRenderPassNode(parentNode);
            }
            else if (nodeType == GrnNodeType.RenderPassTriangles)
            {
                node = new GrnRenderPassTrianglesNode(parentNode);
            }
            else if (nodeType == GrnNodeType.AnimationTransformTrackKeys)
            {
                node = new GrnAnimationTransformTrackKeysNode(parentNode);
            }
            else if (nodeType == GrnNodeType.TextureMapImage)
            {
                node = new GrnTextureMapImageNode(parentNode);
            }
            else
            {
                node = new GrnNode(parentNode, nodeType);
            }

            node.Read(reader);
            return(node);
        }
 public GrnSectionNode(GrnNode parentNode, GrnNodeType nodeType)
     : base(parentNode, nodeType)
 {
 }
示例#10
0
 public GrnSectionNode(GrnNode parentNode, GrnNodeType nodeType)
     : base(parentNode, nodeType)
 {
 }
示例#11
0
        public void Read(System.IO.Stream stream)
        {
            using (GrnBinaryReader reader = new GrnBinaryReader(stream))
            {
                Int64 magic = reader.ReadInt64();
                if (magic != 7380350958317416490)
                {
                    throw new Exception("This is not a GRN file!");
                }
                reader.ReadBytes(56);
                GrnNodeType nodeType = (GrnNodeType)reader.ReadInt32(); // should be FileDirectory
                GrnNode     mainNode = GrnNode.ReadByNodeType(reader, null, nodeType);
                //mainNode.CreateFolder(@"C:\Users\Petar\Desktop\Nieuwe map (3)\Output", 0);

                GrnSectionNode dirNode         = mainNode.FindNode <GrnSectionNode>(GrnNodeType.StandardFrameDirectory);
                uint           directoryOffset = dirNode.Offset;

                // 0StringTable
                List <string> strings = dirNode.FindNode <GrnStringTableNode>(GrnNodeType.StringTable).Strings;

                // 1DataExtension
                this.ReadDataExtension(strings, dirNode.FindNodes <GrnNode>(GrnNodeType.DataExtension));

                // 2VectorChannel

                // 3TransformChannel
                List <int> transformChannels = this.ReadTransformChannel(dirNode.ChildNodes[3].FindNodes <GrnNode>(GrnNodeType.TransformChannel));

                // 4Mesh
                List <GrnNode> meshes = dirNode.ChildNodes[4].FindNodes <GrnNode>(GrnNodeType.Mesh);
                for (int i = 0; i < meshes.Count; ++i)
                {
                    this.Meshes.Add(new GrnMesh(this));
                    this.Meshes[i].Read(meshes[i]);
                }

                // 5Skeleton
                List <GrnBoneNode> bones = dirNode.ChildNodes[5].FindNodes <GrnBoneNode>(GrnNodeType.Bone);
                for (int i = 0; i < bones.Count; ++i)
                {
                    this.Bones.Add(new GrnBone(this));
                    this.Bones[i].Read(bones[i]);
                }

                // 6Texture
                List <GrnNode> textureMaps = dirNode.ChildNodes[6].FindNodes <GrnNode>(GrnNodeType.TextureMap);
                for (int i = 0; i < textureMaps.Count; ++i)
                {
                    this.Textures.Add(new GrnTexture(this));
                    this.Textures[i].Read(textureMaps[i]);
                }

                // 7Material
                List <GrnNode> materials = dirNode.ChildNodes[7].FindNodes <GrnNode>(GrnNodeType.Material);
                for (int i = 0; i < materials.Count; ++i)
                {
                    this.Materials.Add(new GrnMaterial(this));
                    this.Materials[i].Read(materials[i]);
                }

                // 8Form
                this.ReadFormBoneChannel(transformChannels,
                                         dirNode.ChildNodes[8].FindNode <GrnFormBoneChannelsNode>(GrnNodeType.FormBoneChannels));
                List <GrnFormMeshNode> formMeshes = dirNode.ChildNodes[8].
                                                    FindNodes <GrnFormMeshNode>(GrnNodeType.FormMesh);
                List <int> meshLinks = new List <int>(formMeshes.Count);
                for (int i = 0; i < formMeshes.Count; ++i)
                {
                    meshLinks.Add(formMeshes[i].MeshIndex - 1);
                    this.Meshes[formMeshes[i].MeshIndex - 1].ReadFormMeshBones(formMeshes[i].
                                                                               FindNodes <GrnFormMeshBoneNode>(GrnNodeType.FormMeshBone));
                }

                // 9Model
                List <GrnRenderPassNode> renderPass =
                    dirNode.ChildNodes[9].FindNodes <GrnRenderPassNode>(GrnNodeType.RenderPass);
                for (int i = 0; i < renderPass.Count; ++i)
                {
                    int meshIndex = meshLinks[renderPass[i].FormMeshIndex];
                    int matIndex  = renderPass[i].MaterialIndex - 1;
                    this.Meshes[meshIndex].ReadRenderPassTriangles(matIndex,
                                                                   renderPass[i].FindNode <GrnRenderPassTrianglesNode>(GrnNodeType.RenderPassTriangles));
                }

                // 10Animation
                List <GrnAnimationTransformTrackKeysNode> animTransTrackKeys =
                    dirNode.ChildNodes[10].FindNodes <GrnAnimationTransformTrackKeysNode>(
                        GrnNodeType.AnimationTransformTrackKeys);
                this.Animation.BoneTracks = new List <GrnBoneTrack>(animTransTrackKeys.Count);
                for (int i = 0; i < animTransTrackKeys.Count; i++)
                {
                    if (animTransTrackKeys[i].PreviousSibling != null &&
                        ((GrnAnimationTransformTrackKeysNode)animTransTrackKeys[i].PreviousSibling).TransformChannelIndex == animTransTrackKeys[i].TransformChannelIndex)
                    {
                        animTransTrackKeys.RemoveAt(i);
                        --i;
                        continue;
                    }
                    this.Animation.BoneTracks.Add(new GrnBoneTrack());
                    this.Animation.BoneTracks[i].Read(transformChannels, animTransTrackKeys[i]);
                }
                this.CalculateAnimationDuration();
            }
        }