public void AddField(string name, BlenderInternalType internalType, string typeName, ulong address, int size, bool isPointer, dynamic val)
 {
     AddField(name, new BlenderFileObjectField {
         Type      = internalType,
         TypeName  = typeName,
         Address   = address,
         Size      = size,
         Value     = val,
         IsPointer = isPointer
     });
 }
        protected dynamic ReadFieldValue(BinaryReader r, BlenderFile file, BlenderInternalType loadType, string typeName, ulong address, int stringLength, int pointerDimensions, out int readSize)
        {
            if (pointerDimensions > 0)
            {
                readSize = (file.Header.PointerSize == BlenderPointerSize.Ptr64) ? 8 : 4;
                return(new BlenderPointer((file.Header.PointerSize == BlenderPointerSize.Ptr64) ? r.ReadUInt64() : (ulong)r.ReadUInt32(), pointerDimensions));
            }
            switch (loadType)
            {
            // case InternalType.Char: readSize = 1; return Encoding.ASCII.GetChars(r.ReadBytes(1))[0];
            case BlenderInternalType.Char: readSize = 1; return(r.ReadSByte());

            case BlenderInternalType.Byte: readSize = 1; return(r.ReadByte());

            case BlenderInternalType.Int16: readSize = 2; return(r.ReadInt16(file.Header.Endianness));

            case BlenderInternalType.UInt16: readSize = 2; return(r.ReadUInt16(file.Header.Endianness));

            case BlenderInternalType.Int32: readSize = 4; return(r.ReadInt32(file.Header.Endianness));

            case BlenderInternalType.UInt32: readSize = 4; return(r.ReadUInt32(file.Header.Endianness));

            case BlenderInternalType.Int64: readSize = 8; return(r.ReadInt64(file.Header.Endianness));

            case BlenderInternalType.UInt64: readSize = 8; return(r.ReadUInt64(file.Header.Endianness));

            case BlenderInternalType.Single: readSize = 4; return(r.ReadSingle(file.Header.Endianness));

            case BlenderInternalType.Double: readSize = 8; return(r.ReadDouble(file.Header.Endianness));

            case BlenderInternalType.String: readSize = stringLength; return(r.ReadFixedSizeString(stringLength, Encoding.ASCII));

            case BlenderInternalType.Method:
                readSize = (file.Header.PointerSize == BlenderPointerSize.Ptr64) ? 8 : 4;
                return((file.Header.PointerSize == BlenderPointerSize.Ptr64) ? r.ReadUInt64() : (ulong)r.ReadUInt32());

            case BlenderInternalType.Object:
                readSize = file.SDNA.StructureIndex[typeName].Size;
                return(new BlenderFileObject(r, file, address, typeName));
            }
            throw new Exception("Unexpected value type");
        }