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