| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488 |
- #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;
- }
- }
- /// <summary>
- /// Content Pipeline class for saving ParticleSequenceInfo data into XNB format.
- /// </summary>
- [ContentTypeWriter]
- public class ParticleWriter : ContentTypeWriter<WriteContentData>
- {
- 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);
- }
- }
- }
- }
|