public GrnMeshWeightsNode(GrnNode parentNode)
     : base(parentNode, GrnNodeType.MeshWeights)
 {
     this.HighestBoneIndex = 0;
     this.HighestVertexWeightCount = 0;
     this.VertexWeights = new List<VertexWeight>();
 }
Example #2
0
        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);
                }
            }
        }
Example #3
0
 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;
 }
Example #4
0
 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;
 }
Example #5
0
 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);
 }
Example #6
0
        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);
        }
Example #7
0
        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>();
 }
Example #9
0
 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);
     }
 }
Example #10
0
 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);
 }
Example #11
0
        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);
        }
Example #12
0
        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);
        }
Example #13
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);
     }
 }
Example #14
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;
        }
Example #15
0
        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;
        }
Example #16
0
        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);
        }
Example #17
0
        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);
        }
Example #18
0
        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);
            }
        }
Example #19
0
        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);
            }
        }
Example #20
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();
            }
        }
Example #21
0
        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;
 }
Example #23
0
        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)
 {
 }
Example #27
0
        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 GrnMaterialSimpleDiffuseTextureNode(GrnNode parentNode)
     : base(parentNode, GrnNodeType.MaterialSimpleDiffuseTexture)
 {
     this.Unknown2 = 1;
 }
 public GrnDataExtensionReferenceNode(GrnNode parentNode)
     : base(parentNode, GrnNodeType.DataExtensionReference)
 {
 }
Example #30
0
 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 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>();
 }
Example #37
0
 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>();
 }