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