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