Esempio n. 1
0
        /// <summary>
        /// Creates a new MT5Node instance from the given model node.
        /// </summary>
        public MT5Node(ModelNode node, MT5Node parent = null, MT5 mt5 = null)
        {
            MT5 = mt5;

            ID       = node.ID;
            Rotation = node.Rotation;
            Position = node.Position;
            Scale    = node.Scale;

            Center = node.Center;
            Radius = node.Radius;

            VertexPositions = node.VertexPositions;
            VertexNormals   = node.VertexNormals;
            VertexUVs       = node.VertexUVs;
            VertexColors    = node.VertexColors;

            Faces = node.Faces;

            MeshData = new MT5Mesh(node, this);
            if (node.Child != null)
            {
                Child = new MT5Node(node.Child, this, mt5);
            }
            if (node.Sibling != null)
            {
                Sibling = new MT5Node(node.Sibling, this, mt5);
            }
            Parent = parent;
        }
Esempio n. 2
0
        protected override void _Read(BinaryReader reader)
        {
            Buffer = reader.ReadBytes((int)reader.BaseStream.Length);
            reader.BaseStream.Seek(0, SeekOrigin.Begin);

            Identifier = reader.ReadUInt32();
            if (!IsValid(Identifier))
            {
                return;
            }

            TextureOffset   = reader.ReadUInt32();
            FirstNodeOffset = reader.ReadUInt32();

            if (TextureOffset != 0)
            {
                reader.BaseStream.Seek(TextureOffset, SeekOrigin.Begin);
                TEXD textureDatabase = new TEXD(reader);

                //Populate base class textures
                foreach (Texture tex in textureDatabase.Textures)
                {
                    Textures.Add(tex);
                }
            }

            reader.BaseStream.Seek(FirstNodeOffset, SeekOrigin.Begin);
            RootNode = new MT5Node(reader, null, this);

            //Resolve the textures in the faces
            RootNode.ResolveFaceTextures(Textures);
        }
Esempio n. 3
0
        public void Read(BinaryReader reader, MT5Node parent)
        {
            Offset = (uint)reader.BaseStream.Position;
            Parent = parent;

            ID         = reader.ReadUInt32();
            MeshOffset = reader.ReadUInt32();

            Rotation.X = 360.0f * reader.ReadInt32() / 0xffff;
            Rotation.Y = 360.0f * reader.ReadInt32() / 0xffff;
            Rotation.Z = 360.0f * reader.ReadInt32() / 0xffff;

            Scale.X = reader.ReadSingle();
            Scale.Y = reader.ReadSingle();
            Scale.Z = reader.ReadSingle();

            Position.X = reader.ReadSingle();
            Position.Y = reader.ReadSingle();
            Position.Z = reader.ReadSingle();

            ChildOffset   = reader.ReadUInt32();
            SiblingOffset = reader.ReadUInt32();
            ParentOffset  = reader.ReadUInt32();

            ObjectName = reader.ReadUInt32();
            Unknown    = reader.ReadUInt32();

            //Console.WriteLine("Node Unknown: {0:X}", Unknown);

            //Read MT5 mesh data
            long offset = reader.BaseStream.Position;

            if (MeshOffset != 0)
            {
                HasMesh = true;
                reader.BaseStream.Seek(MeshOffset, SeekOrigin.Begin);
                MeshData = new MT5Mesh(reader, this);
            }

            //Construct node tree recursively
            if (ChildOffset != 0)
            {
                reader.BaseStream.Seek(ChildOffset, SeekOrigin.Begin);
                Child = new MT5Node(reader, this, MT5);
            }
            if (SiblingOffset != 0)
            {
                reader.BaseStream.Seek(SiblingOffset, SeekOrigin.Begin);
                Sibling = new MT5Node(reader, (MT5Node)Parent, MT5);
            }
            reader.BaseStream.Seek(offset, SeekOrigin.Begin);
        }
Esempio n. 4
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);
        }
Esempio n. 5
0
 /// <summary>
 /// Creates a new MT5 instance from the given model.
 /// </summary>
 public MT5(BaseModel model)
 {
     Textures = model.Textures;
     RootNode = new MT5Node(model.RootNode);
     RootNode.ResolveFaceTextures(Textures);
 }
Esempio n. 6
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);
        }
Esempio n. 7
0
 public MT5Node(BinaryReader reader, MT5Node parent, MT5 mt5 = null)
 {
     MT5 = mt5;
     Read(reader, parent);
 }