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