public static BoneMap LoadFromStream(Stream stream)
        {
            if (stream == null)
            {
                return(null);
            }

            BinaryReader binaryReader = new BinaryReader(stream);

            BoneMap boneMap = new BoneMap();

            boneMap.Unknown0    = binaryReader.ReadUInt32();
            boneMap.BoneStart   = binaryReader.ReadUInt32();
            boneMap.BoneCount   = binaryReader.ReadUInt32();
            boneMap.Delta       = binaryReader.ReadUInt32();
            boneMap.Unknown1    = binaryReader.ReadUInt32();
            boneMap.BoneEnd     = binaryReader.ReadUInt32();
            boneMap.VertexCount = binaryReader.ReadUInt32();
            boneMap.Unknown2    = binaryReader.ReadUInt32();
            boneMap.IndexCount  = binaryReader.ReadUInt32();

            return(boneMap);
        }
        public bool InitializeFromStream(string name, string displayName, Stream stream)
        {
            using (BinaryReader binaryReader = new BinaryReader(stream))
            {
                //Header
                byte[] magic = binaryReader.ReadBytes(4);

                if (magic[0] != 'D' ||
                    magic[1] != 'M' ||
                    magic[2] != 'O' ||
                    magic[3] != 'D')
                {
                    return(false);
                }

                Version = binaryReader.ReadUInt32();

                if (!Enum.IsDefined(typeof(ModelType), (int)Version))
                {
                    Debug.LogWarning("Could not decode model " + name + ". Unknown DME version " + Version);
                    return(false);
                }

                ModelType = (ModelType)Version;

                Name        = name;
                DisplayName = displayName;

                ModelHeaderOffset = binaryReader.ReadUInt32();

                //DMA
                Dma.LoadFromStream(binaryReader.BaseStream, TextureStrings, Materials);

                //Bounding Box
                Min = new Vector3(binaryReader.ReadSingle(), binaryReader.ReadSingle(), binaryReader.ReadSingle());
                Max = new Vector3(binaryReader.ReadSingle(), binaryReader.ReadSingle(), binaryReader.ReadSingle());

                //Meshes
                uint meshCount = binaryReader.ReadUInt32();

                for (int i = 0; i < meshCount; ++i)
                {
                    Mesh mesh = Mesh.LoadFromStream(binaryReader.BaseStream, Materials);

                    if (mesh == null)
                    {
                        continue;
                    }

                    Material material = Materials[(int)mesh.MaterialIndex];
                    foreach (Material.Parameter parameter in material.Parameters)
                    {
                        LookupTextures(mesh, parameter, TextureStrings);

                        if (mesh.BaseDiffuse != null && mesh.BumpMap != null && mesh.SpecMap != null)
                        {
                            break;
                        }
                    }

                    Meshes.Add(mesh);
                }

                //Bone Maps
                uint boneMapCount = binaryReader.ReadUInt32();

                for (int i = 0; i < boneMapCount; ++i)
                {
                    BoneMap boneMap = BoneMap.LoadFromStream(binaryReader.BaseStream);

                    if (boneMap != null)
                    {
                        BoneMaps.Add(boneMap);
                    }
                }

                //Bone Map Entries
                uint boneMapEntryCount = binaryReader.ReadUInt32();

                for (int i = 0; i < boneMapEntryCount; ++i)
                {
                    BoneMapEntry boneMapEntry = BoneMapEntry.LoadFromStream(binaryReader.BaseStream);

                    if (boneMapEntry != null)
                    {
                        BoneMapEntries.Add(boneMapEntry);
                    }
                }

                return(true);
            }
        }