SceneDataWriter.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. #region File Description
  2. //-----------------------------------------------------------------------------
  3. // SceneDataWriter.cs
  4. //
  5. // Microsoft XNA Community Game Platform
  6. // Copyright (C) Microsoft Corporation. All rights reserved.
  7. //-----------------------------------------------------------------------------
  8. #endregion
  9. #region Using Statements
  10. using System;
  11. using System.Collections.Generic;
  12. using Microsoft.Xna.Framework;
  13. using Microsoft.Xna.Framework.Graphics;
  14. using Microsoft.Xna.Framework.Content.Pipeline;
  15. using Microsoft.Xna.Framework.Content.Pipeline.Graphics;
  16. using Microsoft.Xna.Framework.Content.Pipeline.Processors;
  17. using Microsoft.Xna.Framework.Content.Pipeline.Serialization.Compiler;
  18. using SceneDataLibrary;
  19. using TInput = System.String;
  20. using TOutput = System.String;
  21. #endregion
  22. namespace SceneDataLibraryPipeline
  23. {
  24. /// <summary>
  25. /// This class writes scene data.
  26. /// </summary>
  27. [ContentTypeWriter]
  28. public class SceneDataWriter : ContentTypeWriter<SceneData>
  29. {
  30. /// <summary>
  31. /// Writes all the information in the scene.
  32. /// </summary>
  33. protected override void Write(ContentWriter output, SceneData value)
  34. {
  35. Dictionary<String, PatternGroupData> listPatBody =
  36. value.PatternGroupDictionary;
  37. output.Write(listPatBody.Count);//The number of pattern groups
  38. Dictionary<String, PatternGroupData>.Enumerator enumPatBody =
  39. listPatBody.GetEnumerator();
  40. //Writes a pattern.
  41. while (enumPatBody.MoveNext())
  42. {
  43. output.Write(enumPatBody.Current.Key);
  44. WritePatternGroupData(output, enumPatBody.Current.Value);
  45. }
  46. Dictionary<String, SequenceBankData> listSeqData =
  47. value.SequenceBankDictionary;
  48. output.Write(listSeqData.Count);//The number of sequence banks
  49. Dictionary<String, SequenceBankData>.Enumerator enumSeqData =
  50. listSeqData.GetEnumerator();
  51. //Writes a sequence.
  52. while (enumSeqData.MoveNext())
  53. {
  54. output.Write(enumSeqData.Current.Key);
  55. WriteSequenceBankData(output, enumSeqData.Current.Value);
  56. }
  57. }
  58. /// <summary>
  59. /// Performs override from the parent class.
  60. /// </summary>
  61. public override string GetRuntimeReader(TargetPlatform targetPlatform)
  62. {
  63. return typeof(SceneDataReader).AssemblyQualifiedName;
  64. }
  65. #region Helper Methods
  66. /// <summary>
  67. /// Writes the pattern object.
  68. /// </summary>
  69. private static void WritePatternObjectData(ContentWriter output,
  70. PatternObjectData partsPat)
  71. {
  72. output.Write(partsPat.TextureName);//Texture name
  73. output.Write(partsPat.Rect.X);//Cutting position X
  74. output.Write(partsPat.Rect.Y);//Cutting position Y
  75. output.Write(partsPat.Rect.Width);//Width
  76. output.Write(partsPat.Rect.Height);//Height
  77. output.Write(partsPat.FlipH);//Horizontal flip
  78. output.Write(partsPat.FlipV);//Vertical flip
  79. output.Write(partsPat.Position.X);//Display position X
  80. output.Write(partsPat.Position.Y);//Display position Y
  81. output.Write((Byte)(partsPat.Color.R * 0xFF / 0x80));//Color: Red
  82. output.Write((Byte)(partsPat.Color.G * 0xFF / 0x80));//Color: Green
  83. output.Write((Byte)(partsPat.Color.B * 0xFF / 0x80));//Color: Blue
  84. output.Write((Byte)(partsPat.Color.A * 0xFF / 0x80));//Color: Clarity
  85. output.Write(partsPat.Scale);//Scale
  86. output.Write(partsPat.Center.X);//Center point X
  87. output.Write(partsPat.Center.Y);//Center point Y
  88. output.Write(partsPat.RotateZ);//Rotation value
  89. }
  90. /// <summary>
  91. /// Writes a pattern group.
  92. /// </summary>
  93. private static void WritePatternGroupData(ContentWriter output,
  94. PatternGroupData bodyPat)
  95. {
  96. List<PatternObjectData> listPatParts = bodyPat.PatternObjectList;
  97. //The number of pattern objects
  98. output.Write(listPatParts.Count);
  99. foreach (PatternObjectData partsPat in listPatParts)
  100. WritePatternObjectData(output, partsPat);
  101. }
  102. /// <summary>
  103. /// Writes a sequence object.
  104. /// </summary>
  105. private static void WriteSequenceObjectData(ContentWriter output,
  106. SequenceObjectData partsSeq)
  107. {
  108. //The number of frames to be displayed
  109. output.Write(partsSeq.Frame);
  110. output.Write(partsSeq.PatternGroupName);
  111. }
  112. /// <summary>
  113. /// Writes a sequence group.
  114. /// </summary>
  115. private static void WriteSequenceGroupData(ContentWriter output,
  116. SequenceGroupData bodySeq)
  117. {
  118. output.Write(bodySeq.StartFrame);//Start frame
  119. output.Write(bodySeq.LoopNumber);//Loop count
  120. output.Write((byte)bodySeq.InterpolationType);//Interpolation type
  121. output.Write(bodySeq.SplineParamT);//Interpolation parameter T
  122. output.Write(bodySeq.SplineParamC);//Interpolation parameter C
  123. output.Write(bodySeq.SplineParamB);//Interpolation parameter B
  124. List<SequenceObjectData> listSeqParts = bodySeq.SequenceObjectList;
  125. output.Write(listSeqParts.Count);//The number of sequence objects
  126. foreach (SequenceObjectData partsSeq in listSeqParts)
  127. WriteSequenceObjectData(output, partsSeq);
  128. }
  129. /// <summary>
  130. /// Writes a sequence bank.
  131. /// </summary>
  132. private static void WriteSequenceBankData(ContentWriter output,
  133. SequenceBankData dataSeq)
  134. {
  135. List<SequenceGroupData> listSeqBody = dataSeq.SequenceGroupList;
  136. output.Write(dataSeq.ZPos);//Display priority
  137. output.Write(listSeqBody.Count);//The number of sequence groups
  138. foreach (SequenceGroupData bodySeq in listSeqBody)
  139. WriteSequenceGroupData(output, bodySeq);
  140. }
  141. #endregion
  142. }
  143. }