#region File Description
//-----------------------------------------------------------------------------
// ParticleReader.cs
//
// Microsoft XNA Community Game Platform
// Copyright (C) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
#endregion
#region Using Statements
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Content;
#endregion
namespace RobotGameData.ParticleSystem
{
///
/// Content Pipeline class for loading ParticleSequenceInfo data from XNB format.
///
public class ParticleReader : ContentTypeReader
{
ContentReader input = null;
protected override ParticleSequenceInfo Read(ContentReader input,
ParticleSequenceInfo existingInstance)
{
this.input = input;
return ReadParticeSequenceInfo();
}
private ParticleSequenceInfo ReadParticeSequenceInfo()
{
ParticleSequenceInfo newParticleInfo = new ParticleSequenceInfo();
newParticleInfo.Name = input.ReadString();
int count = input.ReadInt32();
// read TimeSequenceInfo structures.
for (int i = 0; i < count; i++)
{
newParticleInfo.TimeSequencesInfo.Add(ReadTimeSequenceInfo());
}
return newParticleInfo;
}
private TimeSequenceInfo ReadTimeSequenceInfo()
{
TimeSequenceInfo timeSequenceInfo = new TimeSequenceInfo();
timeSequenceInfo.StartTime = input.ReadSingle();
timeSequenceInfo.Duration = input.ReadSingle();
timeSequenceInfo.Style = (SequenceStyle)input.ReadInt32();
// read a ParticleInfo structure.
if( input.ReadBoolean() )
timeSequenceInfo.ParticleInfo = ReadParticleInfo();
// read a TextureSequence structure.
if (input.ReadBoolean() )
timeSequenceInfo.TextureSequence = ReadTextureSequence();
return timeSequenceInfo;
}
private ParticleInfo ReadParticleInfo()
{
ParticleInfo particleInfo = new ParticleInfo();
particleInfo.Name = input.ReadString();
particleInfo.ParticleType =
(ParticleInfo.ParticleObjectType)input.ReadInt32();
// read a MeshData structure.
if (input.ReadBoolean() )
{
particleInfo.MeshData = ReadMeshData();
}
particleInfo.TextureFileName = input.ReadString();
particleInfo.AlphaBlendEnable = input.ReadBoolean();
particleInfo.DepthBufferEnable = input.ReadBoolean();
particleInfo.SourceBlend = (Blend)input.ReadInt32();
particleInfo.DestinationBlend = (Blend)input.ReadInt32();
particleInfo.BlendFunction = (BlendFunction)input.ReadInt32();
particleInfo.LifeTime = input.ReadSingle();
particleInfo.ObjectLifeTime = input.ReadSingle();
particleInfo.MassMin = input.ReadSingle();
particleInfo.MassMax = input.ReadSingle();
particleInfo.InitialObjectCount = input.ReadInt32();
particleInfo.MaxObjectCount = input.ReadInt32();
particleInfo.EmitCount = input.ReadInt32();
particleInfo.Volatile = input.ReadBoolean();
particleInfo.EmitType = (ParticleInfo.EmitObjectType)input.ReadInt32();
particleInfo.EmitPosition = input.ReadVector3();
particleInfo.EmitDirection = input.ReadVector3();
particleInfo.EmitAngle = input.ReadSingle();
particleInfo.EmitInterval = input.ReadSingle();
particleInfo.UpVector = input.ReadVector3();
/////////////////////////////////////////// Position
particleInfo.PositionStyle = input.ReadUInt32();
particleInfo.PositionUpdateInterval = input.ReadSingle();
// read PositionFunc structures.
int positionFuncCount = input.ReadInt32();
if (positionFuncCount > 0)
{
particleInfo.PositionFunc = new List();
for (int i = 0; i < positionFuncCount; i++)
{
particleInfo.PositionFunc.Add(
(ParticleInfo.FuncType)input.ReadInt32());
}
}
// read PositionInit structures.
int positionInitCount = input.ReadInt32();
if (positionInitCount > 0)
{
particleInfo.PositionInit = new List();
for (int i = 0; i < positionInitCount; i++)
particleInfo.PositionInit.Add(input.ReadSingle());
}
// read PositionFactor structures.
int positionFactorCount = input.ReadInt32();
if (positionFactorCount > 0)
{
particleInfo.PositionFactor = new List();
for (int i = 0; i < positionFactorCount; i++)
particleInfo.PositionFactor.Add(input.ReadSingle());
}
// read PositionTable structures.
int positionTableCount = input.ReadInt32();
if (positionTableCount > 0)
{
particleInfo.PositionTable = new List();
for (int i = 0; i < positionTableCount; i++)
particleInfo.PositionTable.Add(ReadKeyFrameTable());
}
particleInfo.PositionMin = input.ReadSingle();
particleInfo.PositionMax = input.ReadSingle();
particleInfo.PositionInitialRandomFactor = input.ReadSingle();
particleInfo.PositionRandomFactor = input.ReadVector3();
particleInfo.PositionRandomInterval = input.ReadSingle();
/////////////////////////////////////////// Scale
particleInfo.ScaleStyle = input.ReadUInt32();
particleInfo.ScaleUpdateInterval = input.ReadSingle();
// read ScaleFunc structures.
int scaleFuncCount = input.ReadInt32();
if (scaleFuncCount > 0)
{
particleInfo.ScaleFunc = new List();
for (int i = 0; i < scaleFuncCount; i++)
particleInfo.ScaleFunc.Add((ParticleInfo.FuncType)input.ReadInt32());
}
// read ScaleInit structures.
int scaleInitCount = input.ReadInt32();
if (scaleInitCount > 0)
{
particleInfo.ScaleInit = new List();
for (int i = 0; i < scaleInitCount; i++)
particleInfo.ScaleInit.Add(input.ReadSingle());
}
// read ScaleFactor structures.
int scaleFactorCount = input.ReadInt32();
if (scaleFactorCount > 0)
{
particleInfo.ScaleFactor = new List();
for (int i = 0; i < scaleFactorCount; i++)
particleInfo.ScaleFactor.Add(input.ReadSingle());
}
// read ScaleTable structures.
int scaleTableCount = input.ReadInt32();
if (scaleTableCount > 0)
{
particleInfo.ScaleTable = new List();
for (int i = 0; i < scaleTableCount; i++)
particleInfo.ScaleTable.Add(ReadKeyFrameTable());
}
particleInfo.ScaleInitialRandomFactor = input.ReadSingle();
particleInfo.ScaleMin = input.ReadSingle();
particleInfo.ScaleMax = input.ReadSingle();
particleInfo.ScaleMask = input.ReadVector3();
particleInfo.ScaleBillboardFactor = input.ReadSingle();
/////////////////////////////////////////// Rotate
particleInfo.RotateStyle = input.ReadUInt32();
particleInfo.RotateUpdateInterval = input.ReadSingle();
particleInfo.RotateRandomFactor = input.ReadSingle();
particleInfo.RotateFunc = (ParticleInfo.FuncType)input.ReadInt32();
particleInfo.RotateInit = input.ReadSingle();
particleInfo.RotateFactor = input.ReadSingle();
// read RotateTable structures.
if (input.ReadInt32() > 0)
{
particleInfo.RotateTable = ReadKeyFrameTable();
}
/////////////////////////////////////////// Color
particleInfo.ColorStyle = input.ReadUInt32();
particleInfo.ColorUpdateInterval = input.ReadSingle();
particleInfo.RgbFunc = (ParticleInfo.FuncType)input.ReadInt32();
particleInfo.RgbInit = input.ReadString();
// read Rtable structures.
if (input.ReadInt32() > 0)
{
particleInfo.Rtable = ReadKeyFrameTable();
}
// read Gtable structures.
if (input.ReadInt32() > 0)
{
particleInfo.Gtable = ReadKeyFrameTable();
}
// read Btable structures.
if (input.ReadInt32() > 0)
{
particleInfo.Btable = ReadKeyFrameTable();
}
// read Atable structures.
if (input.ReadInt32() > 0)
{
particleInfo.Atable = ReadKeyFrameTable();
}
particleInfo.AlphaFunc = (ParticleInfo.FuncType)input.ReadInt32();
particleInfo.AlphaInit = input.ReadUInt32();
return particleInfo;
}
private TextureSequence ReadTextureSequence()
{
TextureSequence textureSequence = new TextureSequence();
textureSequence.TextureFileName = input.ReadString();
textureSequence.IsUseStaticTime = input.ReadBoolean();
textureSequence.IsRepeat = input.ReadBoolean();
textureSequence.IsRandomMode = input.ReadBoolean();
textureSequence.IsFixedFrameMode = input.ReadBoolean();
textureSequence.FrameWidth = input.ReadSingle();
textureSequence.FrameHeight = input.ReadSingle();
textureSequence.StaticInterval = input.ReadSingle();
textureSequence.Count = input.ReadUInt32();
textureSequence.StartIndex = input.ReadUInt32();
// read TimeTable structures.
int timeTableCount = input.ReadInt32();
if (timeTableCount > 0)
{
textureSequence.TimeTable = new List();
for (int i = 0; i < timeTableCount; i++)
textureSequence.TimeTable.Add(input.ReadSingle());
}
return textureSequence;
}
private KeyFrameTable ReadKeyFrameTable()
{
KeyFrameTable table = new KeyFrameTable();
table.Count = input.ReadInt32();
table.IsFixedInterval = input.ReadBoolean();
int tableCount = input.ReadInt32();
if (tableCount > 0)
{
table.Table = new List();
for (int i = 0; i < tableCount; i++)
table.Table.Add(input.ReadSingle());
}
int timeCount = input.ReadInt32();
if (timeCount > 0)
{
table.Time = new List();
for (int i = 0; i < timeCount; i++)
table.Time.Add(input.ReadSingle());
}
return table;
}
private VertexData ReadMeshData()
{
VertexData data = new VertexData();
data.HasPosition = input.ReadBoolean();
data.HasNormal = input.ReadBoolean();
data.HasColor = input.ReadBoolean();
data.HasTextureCoord = input.ReadBoolean();
data.HasIndex = input.ReadBoolean();
int positionCount = input.ReadInt32();
if (positionCount > 0)
{
data.Position = new List();
// read positions.
for (int i = 0; i < positionCount; i++)
{
data.Position.Add(input.ReadVector3());
}
}
int normalCount = input.ReadInt32();
if (normalCount > 0)
{
data.Normal = new List();
// read normals.
for (int i = 0; i < normalCount; i++)
{
data.Normal.Add(input.ReadVector3());
}
}
int colorCount = input.ReadInt32();
if (colorCount > 0)
{
data.Color = new List();
// read colors.
for (int i = 0; i < colorCount; i++)
{
Color color = new Color();
color.PackedValue = input.ReadUInt32();
data.Color.Add(color);
}
}
int textureCoordCount = input.ReadInt32();
if (textureCoordCount > 0)
{
data.TextureCoord = new List();
// read texture coordinates.
for (int i = 0; i < textureCoordCount; i++)
{
data.TextureCoord.Add(input.ReadVector2());
}
}
int indexCount = input.ReadInt32();
if (indexCount > 0)
{
data.Index = new List();
// read indices.
for (int i = 0; i < indexCount; i++)
{
data.Index.Add(input.ReadInt16());
}
}
return data;
}
}
}