bool ICustomSerialization.Serialize(BinarySerializer Serializer) { Count = (ushort)KeyFrames.Count; float MinFrame = KeyFrames.Count > 0 ? KeyFrames[0].Frame : 0; float MaxFrame = KeyFrames.Count > 0 ? KeyFrames[0].Frame : 0; float MinValue = KeyFrames.Count > 0 ? KeyFrames[0].Value : 0; float MaxValue = KeyFrames.Count > 0 ? KeyFrames[0].Value : 0; for (int Index = 1; Index < Count; Index++) { KeyFrame KF = KeyFrames[Index]; if (KF.Frame < MinFrame) { MinFrame = KF.Frame; } if (KF.Frame > MaxFrame) { MaxFrame = KF.Frame; } if (KF.Value < MinValue) { MinValue = KF.Value; } if (KF.Value > MaxValue) { MaxValue = KF.Value; } } ValueScale = KeyFrameQuantizationHelper.GetValueScale(Quantization, MaxValue - MinValue); FrameScale = KeyFrameQuantizationHelper.GetFrameScale(Quantization, MaxFrame - MinFrame); ValueOffset = MinValue; InvDuration = 1f / EndFrame; if (ValueScale == 1) { /* * Quantizations were the value scale is not needed (like the ones that already stores the value * as float) will ignore the offset aswell, so we need to set to to zero. */ ValueOffset = 0; } Serializer.Writer.Write(StartFrame); Serializer.Writer.Write(EndFrame); Serializer.Writer.Write((byte)PreRepeat); Serializer.Writer.Write((byte)PostRepeat); Serializer.Writer.Write(CurveIndex); if (Serializer.FileVersion < 0x20) { Serializer.WritePointer((uint)Serializer.BaseStream.Position + 4); Serializer.Writer.Write(StartFrame); Serializer.Writer.Write(EndFrame); Serializer.Writer.Write((byte)InterpolationType); Serializer.Writer.Write((byte)Quantization); Serializer.Writer.Write(Count); Serializer.Writer.Write(InvDuration); Serializer.Writer.Write(ValueScale); Serializer.Writer.Write(ValueOffset); Serializer.Writer.Write(FrameScale); } else { Serializer.Writer.Write((byte)InterpolationType); Serializer.Writer.Write((byte)Quantization); Serializer.Writer.Write(Count); Serializer.Writer.Write(ValueScale); Serializer.Writer.Write(ValueOffset); Serializer.Writer.Write(FrameScale); Serializer.Writer.Write(InvDuration); } Serializer.WritePointer((uint)Serializer.BaseStream.Position + 4); foreach (KeyFrame Key in KeyFrames) { KeyFrame KF = Key; KF.Frame = (KF.Frame / FrameScale); KF.Value = (KF.Value - ValueOffset) / ValueScale; switch (Quantization) { case KeyFrameQuantization.Hermite128: Serializer.Writer.WriteHermite128(KF); break; case KeyFrameQuantization.Hermite64: Serializer.Writer.WriteHermite64(KF); break; case KeyFrameQuantization.Hermite48: Serializer.Writer.WriteHermite48(KF); break; case KeyFrameQuantization.UnifiedHermite96: Serializer.Writer.WriteUnifiedHermite96(KF); break; case KeyFrameQuantization.UnifiedHermite48: Serializer.Writer.WriteUnifiedHermite48(KF); break; case KeyFrameQuantization.UnifiedHermite32: Serializer.Writer.WriteUnifiedHermite32(KF); break; case KeyFrameQuantization.StepLinear64: Serializer.Writer.WriteStepLinear64(KF); break; case KeyFrameQuantization.StepLinear32: Serializer.Writer.WriteStepLinear32(KF); break; } } while ((Serializer.BaseStream.Position & 3) != 0) { Serializer.BaseStream.WriteByte(0); } return(true); }
bool ICustomSerialization.Serialize(BinarySerializer Serializer) { float MinFrame = KeyFrames.Count > 0 ? KeyFrames[0].Frame : 0; float MaxFrame = KeyFrames.Count > 0 ? KeyFrames[0].Frame : 0; float MinValue = KeyFrames.Count > 0 ? KeyFrames[0].Value : 0; float MaxValue = KeyFrames.Count > 0 ? KeyFrames[0].Value : 0; for (int Index = 1; Index < KeyFrames.Count; Index++) { KeyFrame KF = KeyFrames[Index]; if (KF.Frame < MinFrame) { MinFrame = KF.Frame; } if (KF.Frame > MaxFrame) { MaxFrame = KF.Frame; } if (KF.Value < MinValue) { MinValue = KF.Value; } if (KF.Value > MaxValue) { MaxValue = KF.Value; } } float ValueScale = KeyFrameQuantizationHelper.GetValueScale(Quantization, MaxValue - MinValue); float FrameScale = KeyFrameQuantizationHelper.GetFrameScale(Quantization, MaxFrame - MinFrame); float ValueOffset = MinValue; float InvDuration = 1f / EndFrame; if (ValueScale == 1) { /* * Quantizations were the value scale is not needed (like the ones that already stores the value * as float) will ignore the offset aswell, so we need to set to to zero. */ ValueOffset = 0; } _StartFrame = StartFrame; _EndFrame = EndFrame; CurveFlags = KeyFrames.Count < 2 ? KeyFrameCurveFlags.IsConstantValue : KeyFrameCurveFlags.IsQuantizedCurve; uint FormatFlags = ((uint)Quantization << 5) | (KeyFrames.Count == 1 ? 1u : 0u); if (Quantization >= KeyFrameQuantization.StepLinear64) { FormatFlags |= IsLinear ? 4u : 0u; } else { FormatFlags |= 8; } Serializer.Writer.Write(_StartFrame); Serializer.Writer.Write(_EndFrame); Serializer.Writer.Write((byte)PreRepeat); Serializer.Writer.Write((byte)PostRepeat); Serializer.Writer.Write(Padding); Serializer.Writer.Write((uint)CurveFlags); if (KeyFrames.Count < 2) { if (KeyFrames.Count > 0) { Serializer.Writer.Write(KeyFrames[0].Value); } else { Serializer.Writer.Write(0f); } return(true); } Serializer.Writer.Write(1); //Curve Count Serializer.Writer.Write(4); //Curve Rel Ptr Serializer.Writer.Write(StartFrame); Serializer.Writer.Write(EndFrame); Serializer.Writer.Write(FormatFlags); Serializer.Writer.Write(KeyFrames.Count); Serializer.Writer.Write(InvDuration); if (Quantization != KeyFrameQuantization.Hermite128 && Quantization != KeyFrameQuantization.UnifiedHermite96 && Quantization != KeyFrameQuantization.StepLinear64) { Serializer.Writer.Write(ValueScale); Serializer.Writer.Write(ValueOffset); Serializer.Writer.Write(FrameScale); } foreach (KeyFrame Key in KeyFrames) { KeyFrame KF = Key; KF.Frame = (KF.Frame / FrameScale); KF.Value = (KF.Value - ValueOffset) / ValueScale; switch (Quantization) { case KeyFrameQuantization.Hermite128: Serializer.Writer.WriteHermite128(KF); break; case KeyFrameQuantization.Hermite64: Serializer.Writer.WriteHermite64(KF); break; case KeyFrameQuantization.Hermite48: Serializer.Writer.WriteHermite48(KF); break; case KeyFrameQuantization.UnifiedHermite96: Serializer.Writer.WriteUnifiedHermite96(KF); break; case KeyFrameQuantization.UnifiedHermite48: Serializer.Writer.WriteUnifiedHermite48(KF); break; case KeyFrameQuantization.UnifiedHermite32: Serializer.Writer.WriteUnifiedHermite32(KF); break; case KeyFrameQuantization.StepLinear64: Serializer.Writer.WriteStepLinear64(KF); break; case KeyFrameQuantization.StepLinear32: Serializer.Writer.WriteStepLinear32(KF); break; } } while ((Serializer.BaseStream.Position & 3) != 0) { Serializer.BaseStream.WriteByte(0); } return(true); }