ParticleWriter.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  1. #region File Description
  2. //-----------------------------------------------------------------------------
  3. // ParticleWriter.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 Microsoft.Xna.Framework;
  11. using Microsoft.Xna.Framework.Content.Pipeline.Serialization.Compiler;
  12. using RobotGameData.ParticleSystem;
  13. #endregion
  14. namespace ParticlePipeline
  15. {
  16. public class WriteContentData
  17. {
  18. ParticleSequenceInfo data = null;
  19. public ParticleSequenceInfo Data
  20. {
  21. get { return data; }
  22. }
  23. public WriteContentData()
  24. {
  25. this.data = new ParticleSequenceInfo();
  26. }
  27. public WriteContentData(ParticleSequenceInfo data)
  28. {
  29. this.data = data;
  30. }
  31. }
  32. /// <summary>
  33. /// Content Pipeline class for saving ParticleSequenceInfo data into XNB format.
  34. /// </summary>
  35. [ContentTypeWriter]
  36. public class ParticleWriter : ContentTypeWriter<WriteContentData>
  37. {
  38. ContentWriter output = null;
  39. protected override void Write(ContentWriter output, WriteContentData value)
  40. {
  41. this.output = output;
  42. WriteParticleSequenceInfo(value);
  43. }
  44. public override string GetRuntimeType(TargetPlatform targetPlatform)
  45. {
  46. return typeof(ParticleSequenceInfo).AssemblyQualifiedName;
  47. }
  48. public override string GetRuntimeReader(TargetPlatform targetPlatform)
  49. {
  50. return "RobotGameData.ParticleSystem.ParticleReader, " +
  51. "RobotGameData, Version=1.0.0.0, Culture=neutral";
  52. }
  53. private void WriteParticleSequenceInfo(WriteContentData value)
  54. {
  55. output.Write(value.Data.Name);
  56. output.Write(value.Data.TimeSequencesInfo.Count);
  57. // write TimeSequenceInfo structure.
  58. foreach (TimeSequenceInfo timeSequenceInfo in value.Data.TimeSequencesInfo)
  59. {
  60. WriteTimeSequenceInfo(timeSequenceInfo);
  61. }
  62. }
  63. private void WriteTimeSequenceInfo(TimeSequenceInfo timeSequenceInfo)
  64. {
  65. output.Write(timeSequenceInfo.StartTime);
  66. output.Write(timeSequenceInfo.Duration);
  67. output.Write((int)timeSequenceInfo.Style);
  68. // writes a ParticleInfo structure.
  69. if (timeSequenceInfo.ParticleInfo != null)
  70. {
  71. output.Write(true);
  72. WriteParticleInfo(timeSequenceInfo.ParticleInfo);
  73. }
  74. else
  75. {
  76. output.Write(false);
  77. }
  78. // writes a TextureSequence structure.
  79. if (timeSequenceInfo.TextureSequence != null)
  80. {
  81. output.Write(true);
  82. WriteTextureSequence(timeSequenceInfo.TextureSequence);
  83. }
  84. else
  85. {
  86. output.Write(false);
  87. }
  88. }
  89. private void WriteParticleInfo(ParticleInfo info)
  90. {
  91. output.Write(info.Name);
  92. output.Write((int)info.ParticleType);
  93. if (info.MeshData != null)
  94. {
  95. output.Write(true);
  96. // writes a MeshData structure.
  97. WriteMeshData(info.MeshData);
  98. }
  99. else
  100. {
  101. output.Write(false);
  102. }
  103. output.Write(info.TextureFileName);
  104. output.Write(info.AlphaBlendEnable);
  105. output.Write(info.DepthBufferEnable);
  106. output.Write((int)info.SourceBlend);
  107. output.Write((int)info.DestinationBlend);
  108. output.Write((int)info.BlendFunction);
  109. output.Write(info.LifeTime);
  110. output.Write(info.ObjectLifeTime);
  111. output.Write(info.MassMin);
  112. output.Write(info.MassMax);
  113. output.Write(info.InitialObjectCount);
  114. output.Write(info.MaxObjectCount);
  115. output.Write(info.EmitCount);
  116. output.Write(info.Volatile);
  117. output.Write((int)info.EmitType);
  118. output.Write(info.EmitPosition);
  119. output.Write(info.EmitDirection);
  120. output.Write(info.EmitAngle);
  121. output.Write(info.EmitInterval);
  122. output.Write(info.UpVector);
  123. /////////////////////////////////////////// Position
  124. output.Write(info.PositionStyle);
  125. output.Write(info.PositionUpdateInterval);
  126. // write PositionFunc structures.
  127. if (info.PositionFunc != null)
  128. {
  129. output.Write(info.PositionFunc.Count);
  130. for (int i = 0; i < info.PositionFunc.Count; i++)
  131. output.Write((int)info.PositionFunc[i]);
  132. }
  133. else
  134. {
  135. output.Write((int)0);
  136. }
  137. // write PositionInit structures.
  138. if (info.PositionInit != null)
  139. {
  140. output.Write(info.PositionInit.Count);
  141. for (int i = 0; i < info.PositionInit.Count; i++)
  142. output.Write(info.PositionInit[i]);
  143. }
  144. else
  145. {
  146. output.Write((int)0);
  147. }
  148. // write PositionFactor structures.
  149. if (info.PositionFactor != null)
  150. {
  151. output.Write(info.PositionFactor.Count);
  152. for (int i = 0; i < info.PositionFactor.Count; i++)
  153. output.Write(info.PositionFactor[i]);
  154. }
  155. else
  156. {
  157. output.Write((int)0);
  158. }
  159. // write PositionTable structures.
  160. if (info.PositionTable != null)
  161. {
  162. output.Write(info.PositionTable.Count);
  163. for (int i = 0; i < info.PositionTable.Count; i++)
  164. WriteKeyFrameTable(info.PositionTable[i]);
  165. }
  166. else
  167. {
  168. output.Write((int)0);
  169. }
  170. output.Write(info.PositionMin);
  171. output.Write(info.PositionMax);
  172. output.Write(info.PositionInitialRandomFactor);
  173. output.Write(info.PositionRandomFactor);
  174. output.Write(info.PositionRandomInterval);
  175. /////////////////////////////////////////// Scale
  176. output.Write(info.ScaleStyle);
  177. output.Write(info.ScaleUpdateInterval);
  178. // write ScaleFunc structures.
  179. if (info.ScaleFunc != null)
  180. {
  181. output.Write(info.ScaleFunc.Count);
  182. for (int i = 0; i < info.ScaleFunc.Count; i++)
  183. output.Write((int)info.ScaleFunc[i]);
  184. }
  185. else
  186. {
  187. output.Write((int)0);
  188. }
  189. // write ScaleInit structures.
  190. if (info.ScaleInit != null)
  191. {
  192. output.Write(info.ScaleInit.Count);
  193. for (int i = 0; i < info.ScaleInit.Count; i++)
  194. output.Write(info.ScaleInit[i]);
  195. }
  196. else
  197. {
  198. output.Write((int)0);
  199. }
  200. // write ScaleFactor structures.
  201. if (info.ScaleFactor != null)
  202. {
  203. output.Write(info.ScaleFactor.Count);
  204. for (int i = 0; i < info.ScaleFactor.Count; i++)
  205. output.Write(info.ScaleFactor[i]);
  206. }
  207. else
  208. {
  209. output.Write((int)0);
  210. }
  211. // write ScaleTable structures.
  212. if (info.ScaleTable != null)
  213. {
  214. output.Write(info.ScaleTable.Count);
  215. for (int i = 0; i < info.ScaleTable.Count; i++)
  216. WriteKeyFrameTable(info.ScaleTable[i]);
  217. }
  218. else
  219. {
  220. output.Write((int)0);
  221. }
  222. output.Write(info.ScaleInitialRandomFactor);
  223. output.Write(info.ScaleMin);
  224. output.Write(info.ScaleMax);
  225. output.Write(info.ScaleMask);
  226. output.Write(info.ScaleBillboardFactor);
  227. /////////////////////////////////////////// Rotate
  228. output.Write(info.RotateStyle);
  229. output.Write(info.RotateUpdateInterval);
  230. output.Write(info.RotateRandomFactor);
  231. output.Write((int)info.RotateFunc);
  232. output.Write(info.RotateInit);
  233. output.Write(info.RotateFactor);
  234. // write RotateTable structures.
  235. if (info.RotateTable != null)
  236. {
  237. output.Write(info.RotateTable.Count);
  238. WriteKeyFrameTable(info.RotateTable);
  239. }
  240. else
  241. {
  242. output.Write((int)0);
  243. }
  244. /////////////////////////////////////////// Color
  245. output.Write(info.ColorStyle);
  246. output.Write(info.ColorUpdateInterval);
  247. output.Write((int)info.RgbFunc);
  248. output.Write(info.RgbInit);
  249. // write Rtable structures.
  250. if (info.Rtable != null)
  251. {
  252. output.Write(info.Rtable.Count);
  253. WriteKeyFrameTable(info.Rtable);
  254. }
  255. else
  256. {
  257. output.Write((int)0);
  258. }
  259. // write Gtable structures.
  260. if (info.Gtable != null)
  261. {
  262. output.Write(info.Gtable.Count);
  263. WriteKeyFrameTable(info.Gtable);
  264. }
  265. else
  266. {
  267. output.Write((int)0);
  268. }
  269. // write Btable structures.
  270. if (info.Btable != null)
  271. {
  272. output.Write(info.Btable.Count);
  273. WriteKeyFrameTable(info.Btable);
  274. }
  275. else
  276. {
  277. output.Write((int)0);
  278. }
  279. // write Atable structures.
  280. if (info.Atable != null)
  281. {
  282. output.Write(info.Atable.Count);
  283. WriteKeyFrameTable(info.Atable);
  284. }
  285. else
  286. {
  287. output.Write((int)0);
  288. }
  289. output.Write((int)info.AlphaFunc);
  290. output.Write(info.AlphaInit);
  291. }
  292. private void WriteTextureSequence(TextureSequence textureSequence)
  293. {
  294. output.Write(textureSequence.TextureFileName);
  295. output.Write(textureSequence.IsUseStaticTime);
  296. output.Write(textureSequence.IsRepeat);
  297. output.Write(textureSequence.IsRandomMode);
  298. output.Write(textureSequence.IsFixedFrameMode);
  299. output.Write(textureSequence.FrameWidth);
  300. output.Write(textureSequence.FrameHeight);
  301. output.Write(textureSequence.StaticInterval);
  302. output.Write(textureSequence.Count);
  303. output.Write(textureSequence.StartIndex);
  304. if (textureSequence.TimeTable != null)
  305. {
  306. output.Write(textureSequence.TimeTable.Count);
  307. for (int i = 0; i < textureSequence.TimeTable.Count; i++)
  308. output.Write(textureSequence.TimeTable[i]);
  309. }
  310. else
  311. {
  312. output.Write((int)0);
  313. }
  314. }
  315. private void WriteKeyFrameTable(KeyFrameTable table)
  316. {
  317. output.Write(table.Count);
  318. output.Write(table.IsFixedInterval);
  319. if (table.Table != null)
  320. {
  321. output.Write(table.Table.Count);
  322. for (int i = 0; i < table.Table.Count; i++)
  323. output.Write(table.Table[i]);
  324. }
  325. else
  326. {
  327. output.Write((int)0);
  328. }
  329. if (table.Time != null)
  330. {
  331. output.Write(table.Time.Count);
  332. for (int i = 0; i < table.Time.Count; i++)
  333. output.Write(table.Time[i]);
  334. }
  335. else
  336. {
  337. output.Write((int)0);
  338. }
  339. }
  340. private void WriteMeshData(VertexData data)
  341. {
  342. output.Write(data.HasPosition);
  343. output.Write(data.HasNormal);
  344. output.Write(data.HasColor);
  345. output.Write(data.HasTextureCoord);
  346. output.Write(data.HasIndex);
  347. if (data.HasPosition)
  348. {
  349. output.Write(data.Position.Count);
  350. // write positions.
  351. for (int i = 0; i < data.Position.Count; i++)
  352. {
  353. output.Write(data.Position[i]);
  354. }
  355. }
  356. else
  357. {
  358. output.Write((int)0);
  359. }
  360. if (data.HasNormal)
  361. {
  362. output.Write(data.Normal.Count);
  363. // write normals.
  364. for (int i = 0; i < data.Normal.Count; i++)
  365. {
  366. output.Write(data.Normal[i]);
  367. }
  368. }
  369. else
  370. {
  371. output.Write((int)0);
  372. }
  373. if (data.HasColor)
  374. {
  375. output.Write(data.Color.Count);
  376. // write colors.
  377. for (int i = 0; i < data.Color.Count; i++)
  378. {
  379. output.Write(data.Color[i].PackedValue);
  380. }
  381. }
  382. else
  383. {
  384. output.Write((int)0);
  385. }
  386. if (data.HasTextureCoord)
  387. {
  388. output.Write(data.TextureCoord.Count);
  389. // write texture coordinates.
  390. for (int i = 0; i < data.TextureCoord.Count; i++)
  391. {
  392. output.Write(data.TextureCoord[i]);
  393. }
  394. }
  395. else
  396. {
  397. output.Write((int)0);
  398. }
  399. if (data.HasIndex)
  400. {
  401. output.Write(data.Index.Count);
  402. // write indices.
  403. for (int i = 0; i < data.Index.Count; i++)
  404. {
  405. output.Write(data.Index[i]);
  406. }
  407. }
  408. else
  409. {
  410. output.Write((int)0);
  411. }
  412. }
  413. }
  414. }