public GrnMeshWeightsNode(GrnNode parentNode) : base(parentNode, GrnNodeType.MeshWeights) { this.HighestBoneIndex = 0; this.HighestVertexWeightCount = 0; this.VertexWeights = new List<VertexWeight>(); }
private void WriteDataExtensions(GrnNode dataExtSecNode, OrderedDictionary stringMap) { foreach (Dictionary <string, string> dataExt in this.DataExtensions) { GrnNode dataExtNode = new GrnNode(dataExtSecNode, GrnNodeType.DataExtension); dataExtNode.Data = new byte[] { 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 }; dataExtSecNode.AppendChild(dataExtNode); GrnNode datExtPropSecNode = new GrnNode(dataExtNode, GrnNodeType.DataExtensionPropertySection); dataExtNode.AppendChild(datExtPropSecNode); foreach (KeyValuePair <string, string> deProp in dataExt) { GrnDataExtensionPropertyNode dePropNode = new GrnDataExtensionPropertyNode(datExtPropSecNode); dePropNode.StringTableIndex = (int)stringMap[deProp.Key]; datExtPropSecNode.AppendChild(dePropNode); GrnNode deValSection = new GrnNode(dePropNode, GrnNodeType.DataExtensionValueSection); dePropNode.AppendChild(deValSection); GrnDataExtensionPropertyValueNode dePValNode = new GrnDataExtensionPropertyValueNode(deValSection); dePValNode.StringTableIndex = (int)stringMap[deProp.Value]; deValSection.AppendChild(dePValNode); } } }
public void Read(GrnNode meshNode) { this.Vertices = meshNode.FindNode<GrnMeshVerticesNode>(GrnNodeType.MeshVertices).Vertices; this.Normals = meshNode.FindNode<GrnMeshNormalsNode>(GrnNodeType.MeshNormals).Normals; this.TextureCoordinates = meshNode.FindNode<GrnMeshFieldNode>(GrnNodeType.MeshField).TextureCoordinates; this.VertexWeights = meshNode.FindNode<GrnMeshWeightsNode>(GrnNodeType.MeshWeights).VertexWeights; this.Faces = meshNode.FindNode<GrnMeshTrianglesNode>(GrnNodeType.MeshTriangles).Faces; this.DataExtensionIndex = meshNode.FindNode<GrnDataExtensionReferenceNode>(GrnNodeType.DataExtensionReference).DataExtensionIndex - 1; }
public void Read(GrnNode meshNode) { this.Vertices = meshNode.FindNode <GrnMeshVerticesNode>(GrnNodeType.MeshVertices).Vertices; this.Normals = meshNode.FindNode <GrnMeshNormalsNode>(GrnNodeType.MeshNormals).Normals; this.TextureCoordinates = meshNode.FindNode <GrnMeshFieldNode>(GrnNodeType.MeshField).TextureCoordinates; this.VertexWeights = meshNode.FindNode <GrnMeshWeightsNode>(GrnNodeType.MeshWeights).VertexWeights; this.Faces = meshNode.FindNode <GrnMeshTrianglesNode>(GrnNodeType.MeshTriangles).Faces; this.DataExtensionIndex = meshNode.FindNode <GrnDataExtensionReferenceNode>(GrnNodeType.DataExtensionReference).DataExtensionIndex - 1; }
public void Write(GrnNode boneSecNode) { GrnBoneNode boneNode = new GrnBoneNode(boneSecNode); boneNode.ParentIndex = this.ParentIndex; boneNode.Position = this.Position; boneNode.Rotation = this.Rotation; boneNode.Scale = this.Scale; boneSecNode.AppendChild(boneNode); }
private void CreateVerFrameDir(GrnNode mainNode) { GrnSectionNode verFrameDir = new GrnSectionNode(null, GrnNodeType.VersionFrameDirectory); verFrameDir.Offset = 156; verFrameDir.NumTotalChildNodes = 6; mainNode.AppendChild(verFrameDir); GrnStringTableNode strNode = new GrnStringTableNode(verFrameDir); strNode.Offset = 88; strNode.Strings.Add(string.Empty); strNode.Strings.Add("RAD 3D Studio MAX 4.x"); strNode.Strings.Add("1.2b"); strNode.Strings.Add("10-4-2000"); strNode.Strings.Add("win32"); strNode.Strings.Add("(C) Copyright 1999-2000 RAD Game Tools, Inc. All Rights Reserved."); verFrameDir.AppendChild(strNode); GrnNode verSect = new GrnNode(verFrameDir, GrnNodeType.VersionSection); verSect.Offset = 208; verSect.NumTotalChildNodes = 3; verFrameDir.AppendChild(verSect); GrnNode expVer = new GrnNode(verSect, GrnNodeType.ExporterVersion); expVer.Offset = 208; expVer.NumTotalChildNodes = 1; expVer.Data = new byte[] { 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00 }; verSect.AppendChild(expVer); GrnNode maxSys = new GrnNode(expVer, GrnNodeType.ModelerAxisSystem); maxSys.Offset = 220; maxSys.Data = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x00 }; expVer.AppendChild(maxSys); GrnNode runVer = new GrnNode(verSect, GrnNodeType.RuntimeVersion); runVer.Offset = 268; runVer.Data = new byte[] { 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00 }; verSect.AppendChild(runVer); GrnNode nullTer = new GrnNode(verFrameDir, GrnNodeType.NullTerminator); nullTer.Offset = 284; verFrameDir.AppendChild(nullTer); }
public GrnAnimationTransformTrackKeysNode(GrnNode parentNode) : base(parentNode, GrnNodeType.AnimationTransformTrackKeys) { this.Unknown = new Int32[5] { 0, 1, 2, 2, 1 }; this.PositionKeys = new List<float>(); this.RotationKeys = new List<float>(); this.ScaleKeys = new List<float>(); this.Unknown2 = new Int32[4] { 0, 1, 2, 0 }; this.Positions = new List<Vector3D>(); this.Rotations = new List<Quaternion>(); this.Scales = new List<Matrix3x3>(); }
public void WriteFormMeshBones(GrnNode fMeshBoneSecNode) { for (int i = 0; i < this.BoneBindings.Count; ++i) { GrnFormMeshBoneNode fMeshBoneNode = new GrnFormMeshBoneNode(fMeshBoneSecNode); fMeshBoneNode.BoneIndex = this.BoneBindings[i].BoneIndex; fMeshBoneNode.Unknown = this.BoneBindings[i].Unknown; fMeshBoneNode.OBBMin = this.BoneBindings[i].OBBMin; fMeshBoneNode.OBBMax = this.BoneBindings[i].OBBMax; fMeshBoneSecNode.AppendChild(fMeshBoneNode); } }
public void Write(GrnNode animTraTraSecNode, int boneTrackIndex) { GrnAnimationTransformTrackKeysNode attKeysNode = new GrnAnimationTransformTrackKeysNode(animTraTraSecNode); attKeysNode.TransformChannelIndex = boneTrackIndex + 1; attKeysNode.PositionKeys = this.PositionKeys; attKeysNode.RotationKeys = this.RotationKeys; attKeysNode.ScaleKeys = this.ScaleKeys; attKeysNode.Positions = this.Positions; attKeysNode.Rotations = this.Rotations; attKeysNode.Scales = this.Scales; animTraTraSecNode.AppendChild(attKeysNode); }
public void Write(GrnNode matSecNode) { GrnNode matNode = new GrnNode(matSecNode, GrnNodeType.Material); matSecNode.AppendChild(matNode); GrnMaterialSimpleDiffuseTextureNode matDiffNode = new GrnMaterialSimpleDiffuseTextureNode(matNode); matDiffNode.TextureMapIndex = this.DiffuseTextureIndex + 1; matNode.AppendChild(matDiffNode); GrnDataExtensionReferenceNode refNode = new GrnDataExtensionReferenceNode(matNode); refNode.DataExtensionIndex = this.DataExtensionIndex + 1; matNode.AppendChild(refNode); }
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); } }
internal void Read(GrnNode material) { // -- Each material has diffuseTex (0, textureIndex(+1), 1), and dataExtRef GrnMaterialSimpleDiffuseTextureNode matDiffuse = material.FindNode <GrnMaterialSimpleDiffuseTextureNode>( GrnNodeType.MaterialSimpleDiffuseTexture); if (matDiffuse != null) { this.DiffuseTextureIndex = matDiffuse.TextureMapIndex - 1; } this.DataExtensionIndex = material.FindNode <GrnDataExtensionReferenceNode>( GrnNodeType.DataExtensionReference).DataExtensionIndex - 1; }
internal void Read(GrnNode textureMap) { // -- Each TextureMap has width height, depth?, and dataExtRef GrnTextureMapImageNode mapImage = textureMap.FindNode <GrnTextureMapImageNode>( GrnNodeType.TextureMapImage); if (mapImage != null) { this.Width = mapImage.Width; this.Height = mapImage.Height; } this.DataExtensionIndex = textureMap.FindNode <GrnDataExtensionReferenceNode>( GrnNodeType.DataExtensionReference).DataExtensionIndex - 1; }
public void Write(GrnNode texSecNode) { GrnNode texMapNode = new GrnNode(texSecNode, GrnNodeType.TextureMap); texSecNode.AppendChild(texMapNode); GrnNode texImSecNode = new GrnNode(texMapNode, GrnNodeType.TextureImageSection); texMapNode.AppendChild(texImSecNode); GrnTextureMapImageNode texMapImNode = new GrnTextureMapImageNode(texImSecNode); texMapImNode.Width = this.Width; texMapImNode.Height = this.Height; texImSecNode.AppendChild(texMapImNode); GrnDataExtensionReferenceNode refNode = new GrnDataExtensionReferenceNode(texMapNode); refNode.DataExtensionIndex = this.DataExtensionIndex + 1; texMapNode.AppendChild(refNode); }
public void Write(GrnNode meshSecNode) { GrnNode meshNode = new GrnNode(meshSecNode, GrnNodeType.Mesh); meshSecNode.AppendChild(meshNode); GrnNode meshVertSetSecNode = new GrnNode(meshNode, GrnNodeType.MeshVertexSetSection); meshNode.AppendChild(meshVertSetSecNode); GrnNode meshVertSetNode = new GrnNode(meshVertSetSecNode, GrnNodeType.MeshVertexSet); meshVertSetSecNode.AppendChild(meshVertSetNode); GrnMeshVerticesNode mVertNode = new GrnMeshVerticesNode(meshVertSetNode); mVertNode.Vertices = this.Vertices; meshVertSetNode.AppendChild(mVertNode); GrnMeshNormalsNode mNormNode = new GrnMeshNormalsNode(meshVertSetNode); mNormNode.Normals = this.Normals; meshVertSetNode.AppendChild(mNormNode); GrnNode meshFieldSecNode = new GrnNode(meshVertSetNode, GrnNodeType.MeshFieldSection); meshVertSetNode.AppendChild(meshFieldSecNode); GrnMeshFieldNode mFieldNode = new GrnMeshFieldNode(meshFieldSecNode); mFieldNode.TextureCoordinates = this.TextureCoordinates; meshFieldSecNode.AppendChild(mFieldNode); GrnMeshWeightsNode mWeightNode = new GrnMeshWeightsNode(meshNode); mWeightNode.VertexWeights = this.VertexWeights; meshNode.AppendChild(mWeightNode); GrnMeshTrianglesNode mTriNode = new GrnMeshTrianglesNode(meshNode); mTriNode.Faces = this.Faces; meshNode.AppendChild(mTriNode); GrnDataExtensionReferenceNode mDERefNode = new GrnDataExtensionReferenceNode(meshNode); mDERefNode.DataExtensionIndex = this.DataExtensionIndex + 1; meshNode.AppendChild(mDERefNode); }
public void WriteRenderPass(GrnNode rendPassSecNode, int meshIndex) { Dictionary <int, List <int> > matFaceMap = new Dictionary <int, List <int> >(); for (int i = 0; i < this.Faces.Count; ++i) { if (!matFaceMap.ContainsKey(this.Faces[i].MaterialIndex)) { matFaceMap.Add(this.Faces[i].MaterialIndex, new List <int>()); } matFaceMap[this.Faces[i].MaterialIndex].Add(i); } foreach (KeyValuePair <int, List <int> > matFace in matFaceMap) { GrnRenderPassNode rendPassNode = new GrnRenderPassNode(rendPassSecNode); rendPassNode.FormMeshIndex = meshIndex; rendPassNode.MaterialIndex = matFace.Key + 1; rendPassSecNode.AppendChild(rendPassNode); GrnNode rpFieldSecNode = new GrnNode(rendPassNode, GrnNodeType.RenderPassFieldSection); rendPassNode.AppendChild(rpFieldSecNode); GrnNode rpFieldConstNode = new GrnNode(rpFieldSecNode, GrnNodeType.RenderPassFieldConstant); rpFieldConstNode.Data = new byte[] { 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x80, 0x3F }; rpFieldSecNode.AppendChild(rpFieldConstNode); GrnNode rpFieldAssNode = new GrnNode(rpFieldSecNode, GrnNodeType.RenderPassFieldAssignment); rpFieldAssNode.Data = new byte[] { 0x00, 0x00, 0x00, 0x00 }; rpFieldSecNode.AppendChild(rpFieldAssNode); GrnRenderPassTrianglesNode rpTriNode = new GrnRenderPassTrianglesNode(rendPassNode); foreach (int faceIndex in matFace.Value) { rpTriNode.TextureIndices.Add(faceIndex, this.Faces[faceIndex].TextureIndices); } rendPassNode.AppendChild(rpTriNode); } }
private void WriteForm(GrnNode formSecNode) { GrnNode formNode = new GrnNode(formSecNode, GrnNodeType.Form); formSecNode.AppendChild(formNode); GrnNode formSkelSecNode = new GrnNode(formNode, GrnNodeType.FormSkeletonSection); formNode.AppendChild(formSkelSecNode); GrnNode formSkelNode = new GrnNode(formSkelSecNode, GrnNodeType.FormSkeleton); formSkelNode.Data = new byte[] { 0x01, 0x00, 0x00, 0x00 }; formSkelSecNode.AppendChild(formSkelNode); GrnFormBoneChannelsNode fBoneChaNode = new GrnFormBoneChannelsNode(formSkelNode); fBoneChaNode.TransformChannelIndices = this.CreateFormBoneChannels(); formSkelNode.AppendChild(fBoneChaNode); GrnNode fPoseWeightsNode = new GrnNode(formSkelNode, GrnNodeType.FormPoseWeights); formSkelNode.AppendChild(fPoseWeightsNode); GrnNode formMeshSecNode = new GrnNode(formNode, GrnNodeType.FormMeshSection); formNode.AppendChild(formMeshSecNode); for (int i = 0; i < this.Meshes.Count; ++i) { GrnFormMeshNode fMeshNode = new GrnFormMeshNode(formMeshSecNode); fMeshNode.MeshIndex = i + 1; formMeshSecNode.AppendChild(fMeshNode); GrnNode fVertSetWeiNode = new GrnNode(fMeshNode, GrnNodeType.FormVertexSetWeights); fMeshNode.AppendChild(fVertSetWeiNode); GrnNode fMeshBoneSecNode = new GrnNode(fMeshNode, GrnNodeType.FormMeshBoneSection); fMeshNode.AppendChild(fMeshBoneSecNode); this.Meshes[i].WriteFormMeshBones(fMeshBoneSecNode); } }
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(); } }
public void WriteRenderPass(GrnNode rendPassSecNode, int meshIndex) { Dictionary<int, List<int>> matFaceMap = new Dictionary<int, List<int>>(); for (int i = 0; i < this.Faces.Count; ++i) { if (!matFaceMap.ContainsKey(this.Faces[i].MaterialIndex)) { matFaceMap.Add(this.Faces[i].MaterialIndex, new List<int>()); } matFaceMap[this.Faces[i].MaterialIndex].Add(i); } foreach (KeyValuePair<int, List<int>> matFace in matFaceMap) { GrnRenderPassNode rendPassNode = new GrnRenderPassNode(rendPassSecNode); rendPassNode.FormMeshIndex = meshIndex; rendPassNode.MaterialIndex = matFace.Key + 1; rendPassSecNode.AppendChild(rendPassNode); GrnNode rpFieldSecNode = new GrnNode(rendPassNode, GrnNodeType.RenderPassFieldSection); rendPassNode.AppendChild(rpFieldSecNode); GrnNode rpFieldConstNode = new GrnNode(rpFieldSecNode, GrnNodeType.RenderPassFieldConstant); rpFieldConstNode.Data = new byte[] { 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x80, 0x3F }; rpFieldSecNode.AppendChild(rpFieldConstNode); GrnNode rpFieldAssNode = new GrnNode(rpFieldSecNode, GrnNodeType.RenderPassFieldAssignment); rpFieldAssNode.Data = new byte[] { 0x00, 0x00, 0x00, 0x00 }; rpFieldSecNode.AppendChild(rpFieldAssNode); GrnRenderPassTrianglesNode rpTriNode = new GrnRenderPassTrianglesNode(rendPassNode); foreach (int faceIndex in matFace.Value) { rpTriNode.TextureIndices.Add(faceIndex, this.Faces[faceIndex].TextureIndices); } rendPassNode.AppendChild(rpTriNode); } }
public GrnTextureMapImageNode(GrnNode parentNode) : base(parentNode, GrnNodeType.TextureMapImage) { this.Unknown = 7; }
public void Write(Stream stream) { using (GrnBinaryWriter writer = new GrnBinaryWriter(stream)) { this.WriteHeader(writer); GrnMainNode mainNode = new GrnMainNode(); mainNode.NumTotalChildNodes = 3; this.CreateVerFrameDir(mainNode); GrnSectionNode staFrameDir = new GrnSectionNode(mainNode, GrnNodeType.StandardFrameDirectory); staFrameDir.Offset = 440; mainNode.AppendChild(staFrameDir); // 0StringTable OrderedDictionary stringMap = this.CreateStringMap(); GrnStringTableNode strTableNode = new GrnStringTableNode(staFrameDir); strTableNode.Strings = stringMap.Keys.Cast <string>().ToList(); staFrameDir.AppendChild(strTableNode); // 1DataExtension GrnNode dataExtSecNode = new GrnNode(staFrameDir, GrnNodeType.DataExtensionSection); staFrameDir.AppendChild(dataExtSecNode); this.WriteDataExtensions(dataExtSecNode, stringMap); // 2VectorChannel GrnNode vecChanSecNode = new GrnNode(staFrameDir, GrnNodeType.VectorChannelSection); staFrameDir.AppendChild(vecChanSecNode); // 3TransformChannel GrnNode traChanSecNode = new GrnNode(staFrameDir, GrnNodeType.TransformChannelSection); staFrameDir.AppendChild(traChanSecNode); foreach (GrnBone bone in this.Bones) { GrnNode traChanNode = new GrnNode(traChanSecNode, GrnNodeType.TransformChannel); traChanSecNode.AppendChild(traChanNode); GrnDataExtensionReferenceNode refNode = new GrnDataExtensionReferenceNode(traChanNode); refNode.DataExtensionIndex = bone.DataExtensionIndex + 1; traChanNode.AppendChild(refNode); } // 4Mesh GrnNode meshSecNode = new GrnNode(staFrameDir, GrnNodeType.MeshSection); staFrameDir.AppendChild(meshSecNode); foreach (GrnMesh mesh in this.Meshes) { mesh.Write(meshSecNode); } // 5Skeleton GrnNode skelSecNode = new GrnNode(staFrameDir, GrnNodeType.SkeletonSection); staFrameDir.AppendChild(skelSecNode); GrnNode skelNode = new GrnNode(skelSecNode, GrnNodeType.Skeleton); skelSecNode.AppendChild(skelNode); GrnNode boneSecNode = new GrnNode(skelNode, GrnNodeType.BoneSection); skelNode.AppendChild(boneSecNode); foreach (GrnBone bone in this.Bones) { bone.Write(boneSecNode); } // 6Texture GrnNode texSecNode = new GrnNode(staFrameDir, GrnNodeType.TextureSection); staFrameDir.AppendChild(texSecNode); foreach (GrnTexture tex in this.Textures) { tex.Write(texSecNode); } // 7Material GrnNode matSecNode = new GrnNode(staFrameDir, GrnNodeType.MaterialSection); staFrameDir.AppendChild(matSecNode); foreach (GrnMaterial mat in this.Materials) { mat.Write(matSecNode); } // 8Form GrnNode formSecNode = new GrnNode(staFrameDir, GrnNodeType.FormSection); staFrameDir.AppendChild(formSecNode); this.WriteForm(formSecNode); // 9Model GrnNode modelSecNode = new GrnNode(staFrameDir, GrnNodeType.ModelSection); staFrameDir.AppendChild(modelSecNode); GrnNode modelNode = new GrnNode(modelSecNode, GrnNodeType.Model); modelNode.Data = new byte[] { 0x01, 0x00, 0x00, 0x00 }; modelSecNode.AppendChild(modelNode); GrnNode rendPassSecNode = new GrnNode(modelNode, GrnNodeType.RenderPassSection); modelNode.AppendChild(rendPassSecNode); for (int i = 0; i < this.Meshes.Count; ++i) { this.Meshes[i].WriteRenderPass(rendPassSecNode, i); } // 10Animation GrnNode animSecNode = new GrnNode(staFrameDir, GrnNodeType.AnimationSection); staFrameDir.AppendChild(animSecNode); GrnNode animNode = new GrnNode(animSecNode, GrnNodeType.Animation); animSecNode.AppendChild(animNode); GrnNode animVecTraSecNode = new GrnNode(animNode, GrnNodeType.AnimationVectorTrackSection); animNode.AppendChild(animVecTraSecNode); GrnNode animTraTraSecNode = new GrnNode(animNode, GrnNodeType.AnimationTransformTrackSection); animNode.AppendChild(animTraTraSecNode); for (int i = 0; i < this.Animation.BoneTracks.Count; ++i) { this.Animation.BoneTracks[i].Write(animTraTraSecNode, i); } // 11NullTerminator GrnNode nullTermNode = new GrnNode(staFrameDir, GrnNodeType.NullTerminator); staFrameDir.AppendChild(nullTermNode); GrnSectionNode nullFrameDir = new GrnSectionNode(mainNode, GrnNodeType.NullFrameDirectory); mainNode.AppendChild(nullFrameDir); nullTermNode = new GrnNode(nullFrameDir, GrnNodeType.NullTerminator); nullFrameDir.AppendChild(nullTermNode); mainNode.Write(writer); } }
public GrnMeshVerticesNode(GrnNode parentNode) : base(parentNode, GrnNodeType.MeshVertices) { this.Vertices = new List<Vector3D>(); }
public GrnRenderPassTrianglesNode(GrnNode parentNode) : base(parentNode, GrnNodeType.RenderPassTriangles) { this.TextureIndices = new Dictionary<int, List<int>>(); }
public GrnSectionNode(GrnNode parentNode, GrnNodeType nodeType) : base(parentNode, nodeType) { }
public GrnMaterialSimpleDiffuseTextureNode(GrnNode parentNode) : base(parentNode, GrnNodeType.MaterialSimpleDiffuseTexture) { this.Unknown2 = 1; }
public GrnDataExtensionReferenceNode(GrnNode parentNode) : base(parentNode, GrnNodeType.DataExtensionReference) { }
public GrnMeshTrianglesNode(GrnNode parentNode) : base(parentNode, GrnNodeType.MeshTriangles) { this.Faces = new List<Face>(); }
public GrnRenderPassNode(GrnNode parentNode) : base(parentNode, GrnNodeType.RenderPass) { }
public GrnDataExtensionPropertyNode(GrnNode parentNode) : base(parentNode, GrnNodeType.DataExtensionProperty) { }
public GrnMeshNormalsNode(GrnNode parentNode) : base(parentNode, GrnNodeType.MeshNormals) { this.Normals = new List<Vector3D>(); }
public GrnFormMeshBoneNode(GrnNode parentNode) : base(parentNode, GrnNodeType.FormMeshBone) { }
public GrnFormBoneChannelsNode(GrnNode parentNode) : base(parentNode, GrnNodeType.FormBoneChannels) { this.TransformChannelIndices = new List<int>(); }
public GrnBoneNode(GrnNode parentNode) : base(parentNode, GrnNodeType.Bone) { }
public GrnMeshFieldNode(GrnNode parentNode) : base(parentNode, GrnNodeType.MeshField) { this.Unknown = 3; this.TextureCoordinates = new List<Vector3D>(); }
public GrnStringTableNode(GrnNode parentNode) : base(parentNode, GrnNodeType.StringTable) { this.Strings = new List<string>(); }