#region File Description
//-----------------------------------------------------------------------------
// ParticleInfo.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;
#endregion
namespace RobotGameData.ParticleSystem
{
#region VertexData
///
/// contains the vertex information of the particle object of mesh type.
///
[Serializable]
public class VertexData
{
public bool HasPosition = false;
public bool HasNormal = false;
public bool HasColor = false;
public bool HasTextureCoord = false;
public bool HasIndex = false;
public List Position = null;
public List Normal = null;
public List Color = null;
public List TextureCoord = null;
public List Index = null;
}
#endregion
///
/// contains every information of particle.
/// Based on the information, particle gets updated.
///
#region Particle Information
[Serializable]
public class ParticleInfo
{
#region Enum types
[Flags]
public enum ParamStyles
{
None = 0x00000000,
Random = 0x00000001,
Interpolate = 0x00000002,
Clamp = 0x00000004,
Gravity = 0x00000010,
RandomInterpolate = 0x00000020,
}
public enum ParticleObjectType
{
PointSprite = 0,
Sprite = 1,
Billboard = 2,
Scene = 3,
AnchorBillboard = 4,
}
public enum EmitObjectType
{
Cone = 0,
Sphere = 1,
Disk = 2,
RectPlane = 3,
CirclePlane = 4,
}
public enum FuncType
{
None = 0,
Constant = 1,
Sin = 2,
Cos = 3,
Rnd = 4,
Table = 5,
}
#endregion
#region Persistent Member Fields
// Persistent Members
public string Name = String.Empty;
public ParticleObjectType ParticleType = ParticleObjectType.PointSprite;
public VertexData MeshData = null;
public string TextureFileName = String.Empty;
public bool AlphaBlendEnable = true;
public bool DepthBufferEnable = false;
public Blend SourceBlend = Blend.One;
public Blend DestinationBlend = Blend.One;
public BlendFunction BlendFunction = BlendFunction.Add;
public float LifeTime = 0.0f;
public float ObjectLifeTime = 0.0f;
public float MassMin = 0.0f;
public float MassMax = 0.0f;
public int InitialObjectCount = 0;
public int MaxObjectCount = 0;
public int EmitCount = 0;
public bool Volatile = false;
public EmitObjectType EmitType = EmitObjectType.Cone;
public Vector3 EmitPosition = Vector3.Zero;
public Vector3 EmitDirection = Vector3.Forward;
public float EmitAngle = 0.0f;
public float EmitInterval = 0.0f;
public Vector3 UpVector = Vector3.Up;
public uint PositionStyle = 0;
public float PositionUpdateInterval = 0.0f;
public List PositionFunc = null;
public List PositionInit = null;
public List PositionFactor = null;
public List PositionTable = null;
public float PositionMin = 0.0f;
public float PositionMax = 0.0f;
public float PositionInitialRandomFactor = 1.0f;
public Vector3 PositionRandomFactor = Vector3.One;
public float PositionRandomInterval = 0.0f;
public uint ScaleStyle = 0;
public float ScaleUpdateInterval = 0.0f;
public List ScaleFunc = null;
public List ScaleInit = null;
public List ScaleFactor = null;
public List ScaleTable = null;
public float ScaleInitialRandomFactor = 1.0f;
public float ScaleMin = 0.0f;
public float ScaleMax = 0.0f;
public Vector3 ScaleMask = Vector3.One;
public float ScaleBillboardFactor = 1.0f;
public uint RotateStyle = 0;
public float RotateUpdateInterval = 0.0f;
public float RotateRandomFactor = 1.0f;
public FuncType RotateFunc = FuncType.None;
public float RotateInit = 0.0f;
public float RotateFactor = 1.0f;
public KeyFrameTable RotateTable = null;
public uint ColorStyle = 0;
public float ColorUpdateInterval = 0.0f;
public FuncType RgbFunc = FuncType.None;
public string RgbInit = String.Empty;
public KeyFrameTable Rtable = null;
public KeyFrameTable Gtable = null;
public KeyFrameTable Btable = null;
public KeyFrameTable Atable = null;
public FuncType AlphaFunc = FuncType.None;
public uint AlphaInit = 255;
#endregion
#region Volatile Member Fields
// Volatile Members
Color eRgbInit = Color.Black;
public const int FuncCount = 2;
#endregion
#region Properties
public Color RgbInitValue
{
get { return eRgbInit; }
}
public bool IsPositionStyle(uint param)
{
return ((PositionStyle & param) > 0);
}
public bool IsPositionStyle(ParamStyles param)
{
return ((PositionStyle & (uint)param) > 0);
}
public bool IsScaleStyle(uint param)
{
return ((ScaleStyle & param) > 0);
}
public bool IsScaleStyle(ParamStyles param)
{
return ((ScaleStyle & (uint)param) > 0);
}
public bool IsRotateStyle(uint param)
{
return ((RotateStyle & param) > 0);
}
public bool IsRotateStyle(ParamStyles param)
{
return ((RotateStyle & (uint)param) > 0);
}
public bool IsColorStyle(uint param)
{
return ((ColorStyle & param) > 0);
}
public bool IsColorStyle(ParamStyles param)
{
return ((ColorStyle & (uint)param) > 0);
}
#endregion
///
/// Initialize members
///
public void Initialize()
{
// Initialize KeyFrameTable
if (PositionTable != null)
{
for (int i = 0; i < PositionTable.Count; i++)
PositionTable[i].Initialize();
}
if (ScaleTable != null)
{
for (int i = 0; i < ScaleTable.Count; i++)
ScaleTable[i].Initialize();
}
if( RotateTable != null)
RotateTable.Initialize();
if (Rtable != null)
Rtable.Initialize();
if (Gtable != null)
Gtable.Initialize();
if (Btable != null)
Btable.Initialize();
if (Atable != null)
Atable.Initialize();
// Initialize eRgbInit's Color
string[] color = RgbInit.Split(',');
eRgbInit = new Color(byte.Parse(color[0]), // R
byte.Parse(color[1]), // G
byte.Parse(color[2]), // B
byte.Parse(color[3])); // A
}
}
#endregion
}