Beispiel #1
0
        protected override void _Write(BinaryWriter writer)
        {
            long baseOffset = writer.BaseStream.Position;

            //Write some header stuff
            writer.Write(Identifier);
            writer.Write(TextureOffset);   //Will be overwritten later
            writer.Write(FirstNodeOffset); //Will be overwritten later

            //Write MT5Nodes

            foreach (ModelNode node in RootNode.GetAllNodes())
            {
                MT5Node mt5Node = (MT5Node)node;
                if (mt5Node.MeshData == null)
                {
                    continue;
                }
                mt5Node.WriteMeshData(writer);
            }
            foreach (ModelNode node in RootNode.GetAllNodes())
            {
                MT5Node mt5Node = (MT5Node)node;
                if (mt5Node.MeshData == null)
                {
                    continue;
                }
                mt5Node.WriteMeshHeader(writer);
            }

            FirstNodeOffset = (uint)writer.BaseStream.Position;
            MT5Node rootNode = (MT5Node)RootNode;

            rootNode.WriteNode(writer, 0);

            //Write TEXD
            TextureOffset = (uint)writer.BaseStream.Position;
            TEXD texd = new TEXD(Textures);

            texd.Write(writer);

            writer.BaseStream.Seek(baseOffset + 4, SeekOrigin.Begin);
            writer.Write(TextureOffset);
            writer.Write(FirstNodeOffset);
        }
Beispiel #2
0
        public void WriteNode(BinaryWriter writer, uint parentOffset)
        {
            uint offset = (uint)writer.BaseStream.Position;

            writer.Write(ID);
            writer.Write(MeshOffset);

            int rotX = (int)(Rotation.X / 360.0f * 0xffff);
            int rotY = (int)(Rotation.Y / 360.0f * 0xffff);
            int rotZ = (int)(Rotation.Z / 360.0f * 0xffff);

            writer.Write(rotX);
            writer.Write(rotY);
            writer.Write(rotZ);
            writer.Write(Scale.X);
            writer.Write(Scale.Y);
            writer.Write(Scale.Z);
            writer.Write(Position.X);
            writer.Write(Position.Y);
            writer.Write(Position.Z);

            uint nodeOffsets = (uint)writer.BaseStream.Position;

            writer.Write(ChildOffset);
            writer.Write(SiblingOffset);
            writer.Write(parentOffset);

            writer.Write(ObjectName);
            writer.Write(Unknown);

            //Write child and childs children
            if (Child == null)
            {
                ChildOffset = 0;
            }
            else
            {
                ChildOffset = (uint)writer.BaseStream.Position;
                MT5Node child = (MT5Node)Child;
                child.WriteNode(writer, offset);
            }

            //Write sibling and siblings children
            if (Sibling == null)
            {
                SiblingOffset = 0;
            }
            else
            {
                SiblingOffset = (uint)writer.BaseStream.Position;
                MT5Node sibling = (MT5Node)Sibling;
                sibling.WriteNode(writer, offset);
            }

            uint endOffset = (uint)writer.BaseStream.Position;

            writer.BaseStream.Seek(nodeOffsets, SeekOrigin.Begin);
            writer.Write(ChildOffset);
            writer.Write(SiblingOffset);
            writer.BaseStream.Seek(endOffset, SeekOrigin.Begin);
        }