#region File Description //----------------------------------------------------------------------------- // SceneDataWriter.cs // // Microsoft XNA Community Game Platform // Copyright (C) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- #endregion #region Using Statements using System; using System.Collections.Generic; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Content.Pipeline; using Microsoft.Xna.Framework.Content.Pipeline.Graphics; using Microsoft.Xna.Framework.Content.Pipeline.Processors; using Microsoft.Xna.Framework.Content.Pipeline.Serialization.Compiler; using SceneDataLibrary; using TInput = System.String; using TOutput = System.String; #endregion namespace SceneDataLibraryPipeline { /// /// This class writes scene data. /// [ContentTypeWriter] public class SceneDataWriter : ContentTypeWriter { /// /// Writes all the information in the scene. /// protected override void Write(ContentWriter output, SceneData value) { Dictionary listPatBody = value.PatternGroupDictionary; output.Write(listPatBody.Count);//The number of pattern groups Dictionary.Enumerator enumPatBody = listPatBody.GetEnumerator(); //Writes a pattern. while (enumPatBody.MoveNext()) { output.Write(enumPatBody.Current.Key); WritePatternGroupData(output, enumPatBody.Current.Value); } Dictionary listSeqData = value.SequenceBankDictionary; output.Write(listSeqData.Count);//The number of sequence banks Dictionary.Enumerator enumSeqData = listSeqData.GetEnumerator(); //Writes a sequence. while (enumSeqData.MoveNext()) { output.Write(enumSeqData.Current.Key); WriteSequenceBankData(output, enumSeqData.Current.Value); } } /// /// Performs override from the parent class. /// public override string GetRuntimeReader(TargetPlatform targetPlatform) { return typeof(SceneDataReader).AssemblyQualifiedName; } #region Helper Methods /// /// Writes the pattern object. /// private static void WritePatternObjectData(ContentWriter output, PatternObjectData partsPat) { output.Write(partsPat.TextureName);//Texture name output.Write(partsPat.Rect.X);//Cutting position X output.Write(partsPat.Rect.Y);//Cutting position Y output.Write(partsPat.Rect.Width);//Width output.Write(partsPat.Rect.Height);//Height output.Write(partsPat.FlipH);//Horizontal flip output.Write(partsPat.FlipV);//Vertical flip output.Write(partsPat.Position.X);//Display position X output.Write(partsPat.Position.Y);//Display position Y output.Write((Byte)(partsPat.Color.R * 0xFF / 0x80));//Color: Red output.Write((Byte)(partsPat.Color.G * 0xFF / 0x80));//Color: Green output.Write((Byte)(partsPat.Color.B * 0xFF / 0x80));//Color: Blue output.Write((Byte)(partsPat.Color.A * 0xFF / 0x80));//Color: Clarity output.Write(partsPat.Scale);//Scale output.Write(partsPat.Center.X);//Center point X output.Write(partsPat.Center.Y);//Center point Y output.Write(partsPat.RotateZ);//Rotation value } /// /// Writes a pattern group. /// private static void WritePatternGroupData(ContentWriter output, PatternGroupData bodyPat) { List listPatParts = bodyPat.PatternObjectList; //The number of pattern objects output.Write(listPatParts.Count); foreach (PatternObjectData partsPat in listPatParts) WritePatternObjectData(output, partsPat); } /// /// Writes a sequence object. /// private static void WriteSequenceObjectData(ContentWriter output, SequenceObjectData partsSeq) { //The number of frames to be displayed output.Write(partsSeq.Frame); output.Write(partsSeq.PatternGroupName); } /// /// Writes a sequence group. /// private static void WriteSequenceGroupData(ContentWriter output, SequenceGroupData bodySeq) { output.Write(bodySeq.StartFrame);//Start frame output.Write(bodySeq.LoopNumber);//Loop count output.Write((byte)bodySeq.InterpolationType);//Interpolation type output.Write(bodySeq.SplineParamT);//Interpolation parameter T output.Write(bodySeq.SplineParamC);//Interpolation parameter C output.Write(bodySeq.SplineParamB);//Interpolation parameter B List listSeqParts = bodySeq.SequenceObjectList; output.Write(listSeqParts.Count);//The number of sequence objects foreach (SequenceObjectData partsSeq in listSeqParts) WriteSequenceObjectData(output, partsSeq); } /// /// Writes a sequence bank. /// private static void WriteSequenceBankData(ContentWriter output, SequenceBankData dataSeq) { List listSeqBody = dataSeq.SequenceGroupList; output.Write(dataSeq.ZPos);//Display priority output.Write(listSeqBody.Count);//The number of sequence groups foreach (SequenceGroupData bodySeq in listSeqBody) WriteSequenceGroupData(output, bodySeq); } #endregion } }