/// <summary> /// Reads the unmanaged data from the native value. /// </summary> /// <param name="nativeValue">Input native value</param> void IMarshalable <Metadata, AiMetadata> .FromNative(ref AiMetadata nativeValue) { Clear(); if (nativeValue.NumProperties == 0 || nativeValue.keys == IntPtr.Zero || nativeValue.Values == IntPtr.Zero) { return; } AiString[] keys = MemoryHelper.FromNativeArray <AiString>(nativeValue.keys, (int)nativeValue.NumProperties); AiMetadataEntry[] entries = MemoryHelper.FromNativeArray <AiMetadataEntry>(nativeValue.Values, (int)nativeValue.NumProperties); for (int i = 0; i < nativeValue.NumProperties; i++) { String key = keys[i].GetString(); AiMetadataEntry entry = entries[i]; if (String.IsNullOrEmpty(key) || entry.Data == IntPtr.Zero) { continue; } Object data = null; switch (entry.DataType) { case MetaDataType.Bool: data = MemoryHelper.Read <bool>(entry.Data); break; case MetaDataType.Float: data = MemoryHelper.Read <float>(entry.Data); break; case MetaDataType.Int: data = MemoryHelper.Read <int>(entry.Data); break; case MetaDataType.String: AiString aiString = MemoryHelper.Read <AiString>(entry.Data); data = aiString.GetString(); break; case MetaDataType.UInt64: data = MemoryHelper.Read <UInt64>(entry.Data); break; case MetaDataType.Vector3D: data = MemoryHelper.Read <Vector3D>(entry.Data); break; } if (data != null) { Add(key, new Entry(entry.DataType, data)); } } }
/// <summary> /// Writes the managed data to the native value. /// </summary> /// <param name="thisPtr">Optional pointer to the memory that will hold the native value.</param> /// <param name="nativeValue">Output native value</param> void IMarshalable <Metadata, AiMetadata> .ToNative(IntPtr thisPtr, out AiMetadata nativeValue) { nativeValue = new AiMetadata(); nativeValue.NumProperties = (uint)Count; AiString[] keys = new AiString[Count]; AiMetadataEntry[] entries = new AiMetadataEntry[Count]; int index = 0; foreach (KeyValuePair <String, Entry> kv in this) { AiMetadataEntry entry = new AiMetadataEntry(); entry.DataType = kv.Value.DataType; switch (kv.Value.DataType) { case MetaDataType.Bool: entry.Data = MemoryHelper.AllocateMemory(sizeof(bool)); bool boolValue = (bool)kv.Value.Data; MemoryHelper.Write <bool>(entry.Data, ref boolValue); break; case MetaDataType.Float: entry.Data = MemoryHelper.AllocateMemory(sizeof(float)); float floatValue = (float)kv.Value.Data; MemoryHelper.Write <float>(entry.Data, ref floatValue); break; case MetaDataType.Int: entry.Data = MemoryHelper.AllocateMemory(sizeof(int)); int intValue = (int)kv.Value.Data; MemoryHelper.Write <int>(entry.Data, ref intValue); break; case MetaDataType.String: entry.Data = MemoryHelper.AllocateMemory(MemoryHelper.SizeOf <AiString>()); AiString aiStringValue = new AiString(kv.Value.Data as String); MemoryHelper.Write <AiString>(entry.Data, ref aiStringValue); break; case MetaDataType.UInt64: entry.Data = MemoryHelper.AllocateMemory(sizeof(UInt64)); UInt64 uint64Value = (UInt64)kv.Value.Data; MemoryHelper.Write <UInt64>(entry.Data, ref uint64Value); break; case MetaDataType.Vector3D: entry.Data = MemoryHelper.AllocateMemory(MemoryHelper.SizeOf <Vector3D>()); Vector3D vectorValue = (Vector3D)kv.Value.Data; MemoryHelper.Write <Vector3D>(entry.Data, ref vectorValue); break; } keys[index] = new AiString(kv.Key); entries[index] = entry; index++; } nativeValue.keys = MemoryHelper.ToNativeArray <AiString>(keys); nativeValue.Values = MemoryHelper.ToNativeArray <AiMetadataEntry>(entries); }