public static BlenderObjectMaterial CreateFromByteStream(BinaryReader br)
        {
            string name             = br.ReadString();
            float  specularHardness = br.ReadSingle();
            Color  ambientColor     = CreateColorFromByteStream(br);
            float  alpha            = br.ReadSingle();
            Color  diffuseColor     = CreateColorFromByteStream(br);
            Color  emitColor        = CreateColorFromByteStream(br);
            byte   hasImage         = br.ReadByte();
            int    imageWidth       = -1;
            int    imageHeight      = -1;
            string imageName        = null;

            if (hasImage > 0)
            {
                imageWidth  = br.ReadInt32();
                imageHeight = br.ReadInt32();
                imageName   = br.ReadString();
            }

            BlenderObjectMaterial bom = new BlenderObjectMaterial
            {
                name             = name,
                specularHardness = specularHardness,
                ambientColor     = ambientColor,
                alpha            = alpha,
                diffuseColor     = diffuseColor,
                emitColor        = emitColor,
                imageWidth       = imageWidth,
                imageHeight      = imageHeight,
                imageName        = imageName
            };

            return(bom);
        }
    public static BlenderObject CreateFromByteStream(BinaryReader br)
    {
        var bo = new BlenderObject();

        // name
        bo.name = br.ReadString();
        // mode
        bo.mode = br.ReadString();
        // transform (
        bo.matrix = Matrix4x4.identity;
        foreach (var i in Enumerable.Range(0, 16))
        {
            bo.matrix[i] = br.ReadSingle();
        }

        bool meshDataAvailable = br.ReadByte() > 0;

        if (meshDataAvailable)
        {
            // verts
            int vertsCount = br.ReadInt32();
            bo.verts = new Vector3[vertsCount / 3];
            int vertsIndex = 0;
            for (var i = 0; i < vertsCount; i += 3)
            {
                bo.verts[vertsIndex] = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle());
                vertsIndex++;
            }
            // normals
            int normalsCount = br.ReadInt32();
            bo.normals = new Vector3[normalsCount / 3];
            int normalIndex = 0;
            for (var i = 0; i < normalsCount; i += 3)
            {
                bo.normals[normalIndex] = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle());
                normalIndex++;
            }
            // faces
            int facesCount = br.ReadInt32();
            bo.faces = new int[facesCount];
            int faceIndex = 0;
            for (var i = 0; i < facesCount; i += 1)
            {
                bo.faces[faceIndex] = br.ReadInt32();
                faceIndex++;
            }
            // uvs
            int uvsCount = br.ReadInt32();
            bo.uvs = null;
            if (uvsCount > 0)
            {
                bo.uvs = new Vector2[uvsCount / 2];
                int uvIdex = 0;
                for (var i = 0; i < uvsCount; i += 2)
                {
                    bo.uvs[uvIdex] = new Vector2(br.ReadSingle(), br.ReadSingle());
                    uvIdex++;
                }
            }
            // materials
            int materialsCount = br.ReadInt32();
            bo.materials = null;
            if (materialsCount > 0)
            {
                bo.materials = new BlenderObjectMaterial[materialsCount];
                for (int i = 0; i < materialsCount; i++)
                {
                    bo.materials[i] = BlenderObjectMaterial.CreateFromByteStream(br);
                }
            }
        }

        // chilren
        int childrenCount = br.ReadInt32();

        bo.children = null;
        if (childrenCount > 0)
        {
            bo.children = new BlenderObject[childrenCount];
            for (int i = 0; i < childrenCount; i++)
            {
                bo.children[i] = BlenderObject.CreateFromByteStream(br);
            }
        }

        return(bo);
    }