/// <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(); } }