2
0

ParticleReader.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. #region File Description
  2. //-----------------------------------------------------------------------------
  3. // ParticleReader.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 System.Text;
  13. using Microsoft.Xna.Framework;
  14. using Microsoft.Xna.Framework.Graphics;
  15. using Microsoft.Xna.Framework.Content;
  16. #endregion
  17. namespace RobotGameData.ParticleSystem
  18. {
  19. /// <summary>
  20. /// Content Pipeline class for loading ParticleSequenceInfo data from XNB format.
  21. /// </summary>
  22. public class ParticleReader : ContentTypeReader<ParticleSequenceInfo>
  23. {
  24. ContentReader input = null;
  25. protected override ParticleSequenceInfo Read(ContentReader input,
  26. ParticleSequenceInfo existingInstance)
  27. {
  28. this.input = input;
  29. return ReadParticeSequenceInfo();
  30. }
  31. private ParticleSequenceInfo ReadParticeSequenceInfo()
  32. {
  33. ParticleSequenceInfo newParticleInfo = new ParticleSequenceInfo();
  34. newParticleInfo.Name = input.ReadString();
  35. int count = input.ReadInt32();
  36. // read TimeSequenceInfo structures.
  37. for (int i = 0; i < count; i++)
  38. {
  39. newParticleInfo.TimeSequencesInfo.Add(ReadTimeSequenceInfo());
  40. }
  41. return newParticleInfo;
  42. }
  43. private TimeSequenceInfo ReadTimeSequenceInfo()
  44. {
  45. TimeSequenceInfo timeSequenceInfo = new TimeSequenceInfo();
  46. timeSequenceInfo.StartTime = input.ReadSingle();
  47. timeSequenceInfo.Duration = input.ReadSingle();
  48. timeSequenceInfo.Style = (SequenceStyle)input.ReadInt32();
  49. // read a ParticleInfo structure.
  50. if( input.ReadBoolean() )
  51. timeSequenceInfo.ParticleInfo = ReadParticleInfo();
  52. // read a TextureSequence structure.
  53. if (input.ReadBoolean() )
  54. timeSequenceInfo.TextureSequence = ReadTextureSequence();
  55. return timeSequenceInfo;
  56. }
  57. private ParticleInfo ReadParticleInfo()
  58. {
  59. ParticleInfo particleInfo = new ParticleInfo();
  60. particleInfo.Name = input.ReadString();
  61. particleInfo.ParticleType =
  62. (ParticleInfo.ParticleObjectType)input.ReadInt32();
  63. // read a MeshData structure.
  64. if (input.ReadBoolean() )
  65. {
  66. particleInfo.MeshData = ReadMeshData();
  67. }
  68. particleInfo.TextureFileName = input.ReadString();
  69. particleInfo.AlphaBlendEnable = input.ReadBoolean();
  70. particleInfo.DepthBufferEnable = input.ReadBoolean();
  71. particleInfo.SourceBlend = (Blend)input.ReadInt32();
  72. particleInfo.DestinationBlend = (Blend)input.ReadInt32();
  73. particleInfo.BlendFunction = (BlendFunction)input.ReadInt32();
  74. particleInfo.LifeTime = input.ReadSingle();
  75. particleInfo.ObjectLifeTime = input.ReadSingle();
  76. particleInfo.MassMin = input.ReadSingle();
  77. particleInfo.MassMax = input.ReadSingle();
  78. particleInfo.InitialObjectCount = input.ReadInt32();
  79. particleInfo.MaxObjectCount = input.ReadInt32();
  80. particleInfo.EmitCount = input.ReadInt32();
  81. particleInfo.Volatile = input.ReadBoolean();
  82. particleInfo.EmitType = (ParticleInfo.EmitObjectType)input.ReadInt32();
  83. particleInfo.EmitPosition = input.ReadVector3();
  84. particleInfo.EmitDirection = input.ReadVector3();
  85. particleInfo.EmitAngle = input.ReadSingle();
  86. particleInfo.EmitInterval = input.ReadSingle();
  87. particleInfo.UpVector = input.ReadVector3();
  88. /////////////////////////////////////////// Position
  89. particleInfo.PositionStyle = input.ReadUInt32();
  90. particleInfo.PositionUpdateInterval = input.ReadSingle();
  91. // read PositionFunc structures.
  92. int positionFuncCount = input.ReadInt32();
  93. if (positionFuncCount > 0)
  94. {
  95. particleInfo.PositionFunc = new List<ParticleInfo.FuncType>();
  96. for (int i = 0; i < positionFuncCount; i++)
  97. {
  98. particleInfo.PositionFunc.Add(
  99. (ParticleInfo.FuncType)input.ReadInt32());
  100. }
  101. }
  102. // read PositionInit structures.
  103. int positionInitCount = input.ReadInt32();
  104. if (positionInitCount > 0)
  105. {
  106. particleInfo.PositionInit = new List<float>();
  107. for (int i = 0; i < positionInitCount; i++)
  108. particleInfo.PositionInit.Add(input.ReadSingle());
  109. }
  110. // read PositionFactor structures.
  111. int positionFactorCount = input.ReadInt32();
  112. if (positionFactorCount > 0)
  113. {
  114. particleInfo.PositionFactor = new List<float>();
  115. for (int i = 0; i < positionFactorCount; i++)
  116. particleInfo.PositionFactor.Add(input.ReadSingle());
  117. }
  118. // read PositionTable structures.
  119. int positionTableCount = input.ReadInt32();
  120. if (positionTableCount > 0)
  121. {
  122. particleInfo.PositionTable = new List<KeyFrameTable>();
  123. for (int i = 0; i < positionTableCount; i++)
  124. particleInfo.PositionTable.Add(ReadKeyFrameTable());
  125. }
  126. particleInfo.PositionMin = input.ReadSingle();
  127. particleInfo.PositionMax = input.ReadSingle();
  128. particleInfo.PositionInitialRandomFactor = input.ReadSingle();
  129. particleInfo.PositionRandomFactor = input.ReadVector3();
  130. particleInfo.PositionRandomInterval = input.ReadSingle();
  131. /////////////////////////////////////////// Scale
  132. particleInfo.ScaleStyle = input.ReadUInt32();
  133. particleInfo.ScaleUpdateInterval = input.ReadSingle();
  134. // read ScaleFunc structures.
  135. int scaleFuncCount = input.ReadInt32();
  136. if (scaleFuncCount > 0)
  137. {
  138. particleInfo.ScaleFunc = new List<ParticleInfo.FuncType>();
  139. for (int i = 0; i < scaleFuncCount; i++)
  140. particleInfo.ScaleFunc.Add((ParticleInfo.FuncType)input.ReadInt32());
  141. }
  142. // read ScaleInit structures.
  143. int scaleInitCount = input.ReadInt32();
  144. if (scaleInitCount > 0)
  145. {
  146. particleInfo.ScaleInit = new List<float>();
  147. for (int i = 0; i < scaleInitCount; i++)
  148. particleInfo.ScaleInit.Add(input.ReadSingle());
  149. }
  150. // read ScaleFactor structures.
  151. int scaleFactorCount = input.ReadInt32();
  152. if (scaleFactorCount > 0)
  153. {
  154. particleInfo.ScaleFactor = new List<float>();
  155. for (int i = 0; i < scaleFactorCount; i++)
  156. particleInfo.ScaleFactor.Add(input.ReadSingle());
  157. }
  158. // read ScaleTable structures.
  159. int scaleTableCount = input.ReadInt32();
  160. if (scaleTableCount > 0)
  161. {
  162. particleInfo.ScaleTable = new List<KeyFrameTable>();
  163. for (int i = 0; i < scaleTableCount; i++)
  164. particleInfo.ScaleTable.Add(ReadKeyFrameTable());
  165. }
  166. particleInfo.ScaleInitialRandomFactor = input.ReadSingle();
  167. particleInfo.ScaleMin = input.ReadSingle();
  168. particleInfo.ScaleMax = input.ReadSingle();
  169. particleInfo.ScaleMask = input.ReadVector3();
  170. particleInfo.ScaleBillboardFactor = input.ReadSingle();
  171. /////////////////////////////////////////// Rotate
  172. particleInfo.RotateStyle = input.ReadUInt32();
  173. particleInfo.RotateUpdateInterval = input.ReadSingle();
  174. particleInfo.RotateRandomFactor = input.ReadSingle();
  175. particleInfo.RotateFunc = (ParticleInfo.FuncType)input.ReadInt32();
  176. particleInfo.RotateInit = input.ReadSingle();
  177. particleInfo.RotateFactor = input.ReadSingle();
  178. // read RotateTable structures.
  179. if (input.ReadInt32() > 0)
  180. {
  181. particleInfo.RotateTable = ReadKeyFrameTable();
  182. }
  183. /////////////////////////////////////////// Color
  184. particleInfo.ColorStyle = input.ReadUInt32();
  185. particleInfo.ColorUpdateInterval = input.ReadSingle();
  186. particleInfo.RgbFunc = (ParticleInfo.FuncType)input.ReadInt32();
  187. particleInfo.RgbInit = input.ReadString();
  188. // read Rtable structures.
  189. if (input.ReadInt32() > 0)
  190. {
  191. particleInfo.Rtable = ReadKeyFrameTable();
  192. }
  193. // read Gtable structures.
  194. if (input.ReadInt32() > 0)
  195. {
  196. particleInfo.Gtable = ReadKeyFrameTable();
  197. }
  198. // read Btable structures.
  199. if (input.ReadInt32() > 0)
  200. {
  201. particleInfo.Btable = ReadKeyFrameTable();
  202. }
  203. // read Atable structures.
  204. if (input.ReadInt32() > 0)
  205. {
  206. particleInfo.Atable = ReadKeyFrameTable();
  207. }
  208. particleInfo.AlphaFunc = (ParticleInfo.FuncType)input.ReadInt32();
  209. particleInfo.AlphaInit = input.ReadUInt32();
  210. return particleInfo;
  211. }
  212. private TextureSequence ReadTextureSequence()
  213. {
  214. TextureSequence textureSequence = new TextureSequence();
  215. textureSequence.TextureFileName = input.ReadString();
  216. textureSequence.IsUseStaticTime = input.ReadBoolean();
  217. textureSequence.IsRepeat = input.ReadBoolean();
  218. textureSequence.IsRandomMode = input.ReadBoolean();
  219. textureSequence.IsFixedFrameMode = input.ReadBoolean();
  220. textureSequence.FrameWidth = input.ReadSingle();
  221. textureSequence.FrameHeight = input.ReadSingle();
  222. textureSequence.StaticInterval = input.ReadSingle();
  223. textureSequence.Count = input.ReadUInt32();
  224. textureSequence.StartIndex = input.ReadUInt32();
  225. // read TimeTable structures.
  226. int timeTableCount = input.ReadInt32();
  227. if (timeTableCount > 0)
  228. {
  229. textureSequence.TimeTable = new List<float>();
  230. for (int i = 0; i < timeTableCount; i++)
  231. textureSequence.TimeTable.Add(input.ReadSingle());
  232. }
  233. return textureSequence;
  234. }
  235. private KeyFrameTable ReadKeyFrameTable()
  236. {
  237. KeyFrameTable table = new KeyFrameTable();
  238. table.Count = input.ReadInt32();
  239. table.IsFixedInterval = input.ReadBoolean();
  240. int tableCount = input.ReadInt32();
  241. if (tableCount > 0)
  242. {
  243. table.Table = new List<float>();
  244. for (int i = 0; i < tableCount; i++)
  245. table.Table.Add(input.ReadSingle());
  246. }
  247. int timeCount = input.ReadInt32();
  248. if (timeCount > 0)
  249. {
  250. table.Time = new List<float>();
  251. for (int i = 0; i < timeCount; i++)
  252. table.Time.Add(input.ReadSingle());
  253. }
  254. return table;
  255. }
  256. private VertexData ReadMeshData()
  257. {
  258. VertexData data = new VertexData();
  259. data.HasPosition = input.ReadBoolean();
  260. data.HasNormal = input.ReadBoolean();
  261. data.HasColor = input.ReadBoolean();
  262. data.HasTextureCoord = input.ReadBoolean();
  263. data.HasIndex = input.ReadBoolean();
  264. int positionCount = input.ReadInt32();
  265. if (positionCount > 0)
  266. {
  267. data.Position = new List<Vector3>();
  268. // read positions.
  269. for (int i = 0; i < positionCount; i++)
  270. {
  271. data.Position.Add(input.ReadVector3());
  272. }
  273. }
  274. int normalCount = input.ReadInt32();
  275. if (normalCount > 0)
  276. {
  277. data.Normal = new List<Vector3>();
  278. // read normals.
  279. for (int i = 0; i < normalCount; i++)
  280. {
  281. data.Normal.Add(input.ReadVector3());
  282. }
  283. }
  284. int colorCount = input.ReadInt32();
  285. if (colorCount > 0)
  286. {
  287. data.Color = new List<Color>();
  288. // read colors.
  289. for (int i = 0; i < colorCount; i++)
  290. {
  291. Color color = new Color();
  292. color.PackedValue = input.ReadUInt32();
  293. data.Color.Add(color);
  294. }
  295. }
  296. int textureCoordCount = input.ReadInt32();
  297. if (textureCoordCount > 0)
  298. {
  299. data.TextureCoord = new List<Vector2>();
  300. // read texture coordinates.
  301. for (int i = 0; i < textureCoordCount; i++)
  302. {
  303. data.TextureCoord.Add(input.ReadVector2());
  304. }
  305. }
  306. int indexCount = input.ReadInt32();
  307. if (indexCount > 0)
  308. {
  309. data.Index = new List<short>();
  310. // read indices.
  311. for (int i = 0; i < indexCount; i++)
  312. {
  313. data.Index.Add(input.ReadInt16());
  314. }
  315. }
  316. return data;
  317. }
  318. }
  319. }