Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
        }