Пример #1
0
        /// <summary>
        /// Function to read a track containing texture data.
        /// </summary>
        /// <param name="reader">The JSON reader.</param>
        /// <param name="converter">The converter used to convert the data from JSON.</param>
        /// <returns>A list of texture key frames.</returns>
        private static List <GorgonKeyTexture2D> ReadTextures(JsonReader reader, JsonTextureKeyConverter converter)
        {
            List <GorgonKeyTexture2D> ReadKeys()
            {
                var  keys = new List <GorgonKeyTexture2D>();
                Type type = typeof(GorgonKeyTexture2D);

                while ((reader.Read()) && (reader.TokenType != JsonToken.EndArray))
                {
                    if (reader.TokenType != JsonToken.StartObject)
                    {
                        continue;
                    }

                    GorgonKeyTexture2D key = converter.ReadJson(reader, type, null, false, null);

                    if (key != null)
                    {
                        keys.Add(key);
                    }
                }

                return(keys);
            }

            List <GorgonKeyTexture2D> textures = null;

            while ((reader.Read()) && (reader.TokenType != JsonToken.EndObject))
            {
                if (reader.TokenType != JsonToken.PropertyName)
                {
                    continue;
                }

                string propName = reader.Value.ToString();

                if (string.Equals(propName, "KEYFRAMES", StringComparison.InvariantCultureIgnoreCase))
                {
                    textures = ReadKeys();
                }
            }

            return(textures);
        }
        /// <summary>
        /// Function to save the animation data to a stream.
        /// </summary>
        /// <param name="animation">The animation to serialize into the stream.</param>
        /// <param name="stream">The stream that will contain the animation.</param>
        protected override void OnSaveToStream(IGorgonAnimation animation, Stream stream)
        {
            var writer = new GorgonChunkFileWriter(stream, CurrentFileHeader);
            GorgonBinaryWriter binWriter = null;

            try
            {
                writer.Open();
                binWriter = writer.OpenChunk(VersionData);
                binWriter.Write((byte)Version.Major);
                binWriter.Write((byte)Version.Minor);
                writer.CloseChunk();

                binWriter = writer.OpenChunk(AnimationData);
                binWriter.Write(animation.Name);
                binWriter.Write(animation.Length);
                binWriter.Write(animation.IsLooped);
                binWriter.Write(animation.LoopCount);
                writer.CloseChunk();

                // Write out position track.
                if (animation.PositionTrack.KeyFrames.Count > 0)
                {
                    binWriter = writer.OpenChunk(PositionData);
                    binWriter.WriteValue(animation.PositionTrack.InterpolationMode);
                    binWriter.Write(animation.PositionTrack.KeyFrames.Count);

                    for (int i = 0; i < animation.PositionTrack.KeyFrames.Count; ++i)
                    {
                        GorgonKeyVector3 key = animation.PositionTrack.KeyFrames[i];
                        binWriter.Write(key.Time);
                        binWriter.WriteValue(ref key.Value);
                    }

                    writer.CloseChunk();
                }

                // Write out position track.
                if (animation.ScaleTrack.KeyFrames.Count > 0)
                {
                    binWriter = writer.OpenChunk(ScaleData);
                    binWriter.WriteValue(animation.ScaleTrack.InterpolationMode);
                    binWriter.Write(animation.ScaleTrack.KeyFrames.Count);

                    for (int i = 0; i < animation.ScaleTrack.KeyFrames.Count; ++i)
                    {
                        GorgonKeyVector3 key = animation.ScaleTrack.KeyFrames[i];
                        binWriter.Write(key.Time);
                        binWriter.WriteValue(ref key.Value);
                    }

                    writer.CloseChunk();
                }

                // Write out rotation track.
                if (animation.RotationTrack.KeyFrames.Count > 0)
                {
                    binWriter = writer.OpenChunk(RotationData);
                    binWriter.WriteValue(animation.RotationTrack.InterpolationMode);
                    binWriter.Write(animation.RotationTrack.KeyFrames.Count);

                    for (int i = 0; i < animation.RotationTrack.KeyFrames.Count; ++i)
                    {
                        GorgonKeyVector3 key = animation.RotationTrack.KeyFrames[i];
                        binWriter.Write(key.Time);
                        binWriter.WriteValue(ref key.Value);
                    }

                    writer.CloseChunk();
                }

                // Write out size track.
                if (animation.SizeTrack.KeyFrames.Count > 0)
                {
                    binWriter = writer.OpenChunk(SizeData);
                    binWriter.WriteValue(animation.SizeTrack.InterpolationMode);
                    binWriter.Write(animation.SizeTrack.KeyFrames.Count);

                    for (int i = 0; i < animation.SizeTrack.KeyFrames.Count; ++i)
                    {
                        GorgonKeyVector3 key = animation.SizeTrack.KeyFrames[i];
                        binWriter.Write(key.Time);
                        binWriter.WriteValue(ref key.Value);
                    }

                    writer.CloseChunk();
                }

                // Write out bounds track.
                if (animation.RectBoundsTrack.KeyFrames.Count > 0)
                {
                    binWriter = writer.OpenChunk(BoundsData);
                    binWriter.WriteValue(animation.RectBoundsTrack.InterpolationMode);
                    binWriter.Write(animation.RectBoundsTrack.KeyFrames.Count);

                    for (int i = 0; i < animation.RectBoundsTrack.KeyFrames.Count; ++i)
                    {
                        GorgonKeyRectangle key = animation.RectBoundsTrack.KeyFrames[i];
                        binWriter.Write(key.Time);
                        binWriter.WriteValue(ref key.Value);
                    }

                    writer.CloseChunk();
                }

                // Write out colors track.
                if (animation.ColorTrack.KeyFrames.Count > 0)
                {
                    binWriter = writer.OpenChunk(ColorData);
                    binWriter.WriteValue(animation.ColorTrack.InterpolationMode);
                    binWriter.Write(animation.ColorTrack.KeyFrames.Count);

                    for (int i = 0; i < animation.ColorTrack.KeyFrames.Count; ++i)
                    {
                        GorgonKeyGorgonColor key = animation.ColorTrack.KeyFrames[i];
                        binWriter.Write(key.Time);
                        binWriter.WriteValue(ref key.Value);
                    }

                    writer.CloseChunk();
                }

                if (animation.Texture2DTrack.KeyFrames.Count == 0)
                {
                    return;
                }

                binWriter = writer.OpenChunk(TextureData);
                binWriter.Write(animation.Texture2DTrack.KeyFrames.Count);

                for (int i = 0; i < animation.Texture2DTrack.KeyFrames.Count; ++i)
                {
                    GorgonKeyTexture2D key = animation.Texture2DTrack.KeyFrames[i];

                    binWriter.Write(key.Time);

                    if (key.Value == null)
                    {
                        binWriter.WriteValue <byte>(0);
                    }
                    else
                    {
                        binWriter.WriteValue <byte>(1);
                        binWriter.Write(key.Value.Texture.Name);
                        binWriter.Write(key.Value.Texture.Width);
                        binWriter.Write(key.Value.Texture.Height);
                        binWriter.WriteValue(key.Value.Texture.Format);
                        binWriter.Write(key.Value.Texture.ArrayCount);
                        binWriter.Write(key.Value.Texture.MipLevels);
                        binWriter.Write(key.Value.ArrayIndex);
                        binWriter.Write(key.Value.ArrayCount);
                        binWriter.Write(key.Value.MipSlice);
                        binWriter.Write(key.Value.MipCount);
                        binWriter.WriteValue(key.Value.Format);
                    }

                    binWriter.WriteValue(ref key.TextureCoordinates);
                    binWriter.Write(key.TextureArrayIndex);
                }

                writer.CloseChunk();
            }
            finally
            {
                binWriter?.Dispose();
                writer.Close();
            }
        }