#region File Description //----------------------------------------------------------------------------- // ParticleWriter.cs // // Microsoft XNA Community Game Platform // Copyright (C) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- #endregion #region Using Statements using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Content.Pipeline.Serialization.Compiler; using RobotGameData.ParticleSystem; #endregion namespace ParticlePipeline { public class WriteContentData { ParticleSequenceInfo data = null; public ParticleSequenceInfo Data { get { return data; } } public WriteContentData() { this.data = new ParticleSequenceInfo(); } public WriteContentData(ParticleSequenceInfo data) { this.data = data; } } /// /// Content Pipeline class for saving ParticleSequenceInfo data into XNB format. /// [ContentTypeWriter] public class ParticleWriter : ContentTypeWriter { ContentWriter output = null; protected override void Write(ContentWriter output, WriteContentData value) { this.output = output; WriteParticleSequenceInfo(value); } public override string GetRuntimeType(TargetPlatform targetPlatform) { return typeof(ParticleSequenceInfo).AssemblyQualifiedName; } public override string GetRuntimeReader(TargetPlatform targetPlatform) { return "RobotGameData.ParticleSystem.ParticleReader, " + "RobotGameData, Version=1.0.0.0, Culture=neutral"; } private void WriteParticleSequenceInfo(WriteContentData value) { output.Write(value.Data.Name); output.Write(value.Data.TimeSequencesInfo.Count); // write TimeSequenceInfo structure. foreach (TimeSequenceInfo timeSequenceInfo in value.Data.TimeSequencesInfo) { WriteTimeSequenceInfo(timeSequenceInfo); } } private void WriteTimeSequenceInfo(TimeSequenceInfo timeSequenceInfo) { output.Write(timeSequenceInfo.StartTime); output.Write(timeSequenceInfo.Duration); output.Write((int)timeSequenceInfo.Style); // writes a ParticleInfo structure. if (timeSequenceInfo.ParticleInfo != null) { output.Write(true); WriteParticleInfo(timeSequenceInfo.ParticleInfo); } else { output.Write(false); } // writes a TextureSequence structure. if (timeSequenceInfo.TextureSequence != null) { output.Write(true); WriteTextureSequence(timeSequenceInfo.TextureSequence); } else { output.Write(false); } } private void WriteParticleInfo(ParticleInfo info) { output.Write(info.Name); output.Write((int)info.ParticleType); if (info.MeshData != null) { output.Write(true); // writes a MeshData structure. WriteMeshData(info.MeshData); } else { output.Write(false); } output.Write(info.TextureFileName); output.Write(info.AlphaBlendEnable); output.Write(info.DepthBufferEnable); output.Write((int)info.SourceBlend); output.Write((int)info.DestinationBlend); output.Write((int)info.BlendFunction); output.Write(info.LifeTime); output.Write(info.ObjectLifeTime); output.Write(info.MassMin); output.Write(info.MassMax); output.Write(info.InitialObjectCount); output.Write(info.MaxObjectCount); output.Write(info.EmitCount); output.Write(info.Volatile); output.Write((int)info.EmitType); output.Write(info.EmitPosition); output.Write(info.EmitDirection); output.Write(info.EmitAngle); output.Write(info.EmitInterval); output.Write(info.UpVector); /////////////////////////////////////////// Position output.Write(info.PositionStyle); output.Write(info.PositionUpdateInterval); // write PositionFunc structures. if (info.PositionFunc != null) { output.Write(info.PositionFunc.Count); for (int i = 0; i < info.PositionFunc.Count; i++) output.Write((int)info.PositionFunc[i]); } else { output.Write((int)0); } // write PositionInit structures. if (info.PositionInit != null) { output.Write(info.PositionInit.Count); for (int i = 0; i < info.PositionInit.Count; i++) output.Write(info.PositionInit[i]); } else { output.Write((int)0); } // write PositionFactor structures. if (info.PositionFactor != null) { output.Write(info.PositionFactor.Count); for (int i = 0; i < info.PositionFactor.Count; i++) output.Write(info.PositionFactor[i]); } else { output.Write((int)0); } // write PositionTable structures. if (info.PositionTable != null) { output.Write(info.PositionTable.Count); for (int i = 0; i < info.PositionTable.Count; i++) WriteKeyFrameTable(info.PositionTable[i]); } else { output.Write((int)0); } output.Write(info.PositionMin); output.Write(info.PositionMax); output.Write(info.PositionInitialRandomFactor); output.Write(info.PositionRandomFactor); output.Write(info.PositionRandomInterval); /////////////////////////////////////////// Scale output.Write(info.ScaleStyle); output.Write(info.ScaleUpdateInterval); // write ScaleFunc structures. if (info.ScaleFunc != null) { output.Write(info.ScaleFunc.Count); for (int i = 0; i < info.ScaleFunc.Count; i++) output.Write((int)info.ScaleFunc[i]); } else { output.Write((int)0); } // write ScaleInit structures. if (info.ScaleInit != null) { output.Write(info.ScaleInit.Count); for (int i = 0; i < info.ScaleInit.Count; i++) output.Write(info.ScaleInit[i]); } else { output.Write((int)0); } // write ScaleFactor structures. if (info.ScaleFactor != null) { output.Write(info.ScaleFactor.Count); for (int i = 0; i < info.ScaleFactor.Count; i++) output.Write(info.ScaleFactor[i]); } else { output.Write((int)0); } // write ScaleTable structures. if (info.ScaleTable != null) { output.Write(info.ScaleTable.Count); for (int i = 0; i < info.ScaleTable.Count; i++) WriteKeyFrameTable(info.ScaleTable[i]); } else { output.Write((int)0); } output.Write(info.ScaleInitialRandomFactor); output.Write(info.ScaleMin); output.Write(info.ScaleMax); output.Write(info.ScaleMask); output.Write(info.ScaleBillboardFactor); /////////////////////////////////////////// Rotate output.Write(info.RotateStyle); output.Write(info.RotateUpdateInterval); output.Write(info.RotateRandomFactor); output.Write((int)info.RotateFunc); output.Write(info.RotateInit); output.Write(info.RotateFactor); // write RotateTable structures. if (info.RotateTable != null) { output.Write(info.RotateTable.Count); WriteKeyFrameTable(info.RotateTable); } else { output.Write((int)0); } /////////////////////////////////////////// Color output.Write(info.ColorStyle); output.Write(info.ColorUpdateInterval); output.Write((int)info.RgbFunc); output.Write(info.RgbInit); // write Rtable structures. if (info.Rtable != null) { output.Write(info.Rtable.Count); WriteKeyFrameTable(info.Rtable); } else { output.Write((int)0); } // write Gtable structures. if (info.Gtable != null) { output.Write(info.Gtable.Count); WriteKeyFrameTable(info.Gtable); } else { output.Write((int)0); } // write Btable structures. if (info.Btable != null) { output.Write(info.Btable.Count); WriteKeyFrameTable(info.Btable); } else { output.Write((int)0); } // write Atable structures. if (info.Atable != null) { output.Write(info.Atable.Count); WriteKeyFrameTable(info.Atable); } else { output.Write((int)0); } output.Write((int)info.AlphaFunc); output.Write(info.AlphaInit); } private void WriteTextureSequence(TextureSequence textureSequence) { output.Write(textureSequence.TextureFileName); output.Write(textureSequence.IsUseStaticTime); output.Write(textureSequence.IsRepeat); output.Write(textureSequence.IsRandomMode); output.Write(textureSequence.IsFixedFrameMode); output.Write(textureSequence.FrameWidth); output.Write(textureSequence.FrameHeight); output.Write(textureSequence.StaticInterval); output.Write(textureSequence.Count); output.Write(textureSequence.StartIndex); if (textureSequence.TimeTable != null) { output.Write(textureSequence.TimeTable.Count); for (int i = 0; i < textureSequence.TimeTable.Count; i++) output.Write(textureSequence.TimeTable[i]); } else { output.Write((int)0); } } private void WriteKeyFrameTable(KeyFrameTable table) { output.Write(table.Count); output.Write(table.IsFixedInterval); if (table.Table != null) { output.Write(table.Table.Count); for (int i = 0; i < table.Table.Count; i++) output.Write(table.Table[i]); } else { output.Write((int)0); } if (table.Time != null) { output.Write(table.Time.Count); for (int i = 0; i < table.Time.Count; i++) output.Write(table.Time[i]); } else { output.Write((int)0); } } private void WriteMeshData(VertexData data) { output.Write(data.HasPosition); output.Write(data.HasNormal); output.Write(data.HasColor); output.Write(data.HasTextureCoord); output.Write(data.HasIndex); if (data.HasPosition) { output.Write(data.Position.Count); // write positions. for (int i = 0; i < data.Position.Count; i++) { output.Write(data.Position[i]); } } else { output.Write((int)0); } if (data.HasNormal) { output.Write(data.Normal.Count); // write normals. for (int i = 0; i < data.Normal.Count; i++) { output.Write(data.Normal[i]); } } else { output.Write((int)0); } if (data.HasColor) { output.Write(data.Color.Count); // write colors. for (int i = 0; i < data.Color.Count; i++) { output.Write(data.Color[i].PackedValue); } } else { output.Write((int)0); } if (data.HasTextureCoord) { output.Write(data.TextureCoord.Count); // write texture coordinates. for (int i = 0; i < data.TextureCoord.Count; i++) { output.Write(data.TextureCoord[i]); } } else { output.Write((int)0); } if (data.HasIndex) { output.Write(data.Index.Count); // write indices. for (int i = 0; i < data.Index.Count; i++) { output.Write(data.Index[i]); } } else { output.Write((int)0); } } } }