private static void LoadTrack(int version, Track track, BinaryReader stream) { var e = (KeyframesPropertyTrack)track; e.ValueSize = stream.ReadInt32(); int propertyNameLength = stream.ReadInt32(); int propertyTypeNameLength = stream.ReadInt32(); int keyframesCount = stream.ReadInt32(); var propertyName = stream.ReadBytes(propertyNameLength); e.MemberName = Encoding.UTF8.GetString(propertyName, 0, propertyNameLength); if (stream.ReadChar() != 0) { throw new Exception("Invalid track data."); } var propertyTypeName = stream.ReadBytes(propertyTypeNameLength); e.MemberTypeName = Encoding.UTF8.GetString(propertyTypeName, 0, propertyTypeNameLength); if (stream.ReadChar() != 0) { throw new Exception("Invalid track data."); } var keyframes = new KeyframesEditor.Keyframe[keyframesCount]; var dataBuffer = new byte[e.ValueSize]; var propertyType = Scripting.TypeUtils.GetManagedType(e.MemberTypeName); if (propertyType == null) { e.Keyframes.ResetKeyframes(); stream.ReadBytes(keyframesCount * (sizeof(float) + e.ValueSize)); if (!string.IsNullOrEmpty(e.MemberTypeName)) { Editor.LogError("Cannot load track " + e.MemberName + " of type " + e.MemberTypeName + ". Failed to find the value type information."); } return; } GCHandle handle = GCHandle.Alloc(dataBuffer, GCHandleType.Pinned); for (int i = 0; i < keyframesCount; i++) { var time = stream.ReadSingle(); stream.Read(dataBuffer, 0, e.ValueSize); var value = Marshal.PtrToStructure(handle.AddrOfPinnedObject(), propertyType); keyframes[i] = new KeyframesEditor.Keyframe { Time = time, Value = value, }; } handle.Free(); e.Keyframes.DefaultValue = e.GetDefaultValue(propertyType); e.Keyframes.SetKeyframes(keyframes); }
private static void LoadTrack(int version, Track track, BinaryReader stream) { var e = (StringPropertyTrack)track; e.ValueSize = stream.ReadInt32(); int propertyNameLength = stream.ReadInt32(); int propertyTypeNameLength = stream.ReadInt32(); int keyframesCount = stream.ReadInt32(); var propertyName = stream.ReadBytes(propertyNameLength); e.MemberName = Encoding.UTF8.GetString(propertyName, 0, propertyNameLength); if (stream.ReadChar() != 0) { throw new Exception("Invalid track data."); } var propertyTypeName = stream.ReadBytes(propertyTypeNameLength); e.MemberTypeName = Encoding.UTF8.GetString(propertyTypeName, 0, propertyTypeNameLength); if (stream.ReadChar() != 0) { throw new Exception("Invalid track data."); } var keyframes = new KeyframesEditor.Keyframe[keyframesCount]; var dataBuffer = new byte[e.ValueSize]; var propertyType = Utilities.Utils.GetType(e.MemberTypeName); if (propertyType == null) { e.Keyframes.ResetKeyframes(); stream.ReadBytes(keyframesCount * (sizeof(float) + e.ValueSize)); if (!string.IsNullOrEmpty(e.MemberTypeName)) { Editor.LogError("Cannot load track " + e.MemberName + " of type " + e.MemberTypeName + ". Failed to find the value type information."); } return; } for (int i = 0; i < keyframesCount; i++) { var time = stream.ReadSingle(); var length = stream.ReadInt32(); var data = stream.ReadBytes(length * 2); var value = Encoding.Unicode.GetString(data, 0, data.Length); keyframes[i] = new KeyframesEditor.Keyframe { Time = time, Value = value, }; } e.Keyframes.DefaultValue = string.Empty; e.Keyframes.SetKeyframes(keyframes); }
private static void LoadTrack(int version, Track track, BinaryReader stream) { var e = (EventTrack)track; var paramsCount = stream.ReadInt32(); e.EventParamsSizes = new int[paramsCount]; e.EventParamsTypes = new Type[paramsCount]; int eventsCount = stream.ReadInt32(); e.MemberName = LoadName(stream); bool isInvalid = false; for (int i = 0; i < paramsCount; i++) { e.EventParamsSizes[i] = stream.ReadInt32(); var paramTypeName = LoadName(stream); e.EventParamsTypes[i] = Scripting.TypeUtils.GetManagedType(paramTypeName); if (e.EventParamsTypes[i] == null) { isInvalid = true; } } if (isInvalid) { e.Events.ResetKeyframes(); stream.ReadBytes(eventsCount * (sizeof(float) + e.EventParamsSizes.Sum())); Editor.LogError("Cannot load track " + e.MemberName + " of type " + e.MemberTypeName + ". Failed to find the value type information."); return; } e.OnEventParamsChanged(); var events = new KeyframesEditor.Keyframe[eventsCount]; var dataBuffer = paramsCount != 0 ? new byte[e.EventParamsSizes.Max()] : null; GCHandle handle = paramsCount != 0 ? GCHandle.Alloc(dataBuffer, GCHandleType.Pinned) : new GCHandle(); for (int i = 0; i < eventsCount; i++) { var time = stream.ReadSingle(); var key = new EventKey { Parameters = new object[paramsCount] }; for (int j = 0; j < paramsCount; j++) { stream.Read(dataBuffer, 0, e.EventParamsSizes[j]); key.Parameters[j] = Marshal.PtrToStructure(handle.AddrOfPinnedObject(), e.EventParamsTypes[j]); } events[i] = new KeyframesEditor.Keyframe { Time = time, Value = key, }; } if (handle.IsAllocated) { handle.Free(); } e.Events.SetKeyframes(events); }