using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Xml.Serialization;
namespace libsecondlife
{
public partial class Primitive
{
///
///
///
[Serializable]
public class ParticleSystem
{
///
///
///
public enum SourcePattern : byte
{
///
None = 0,
///
Drop = 0x01,
///
Explode = 0x02,
///
Angle = 0x04,
///
AngleCone = 0x08,
///
AngleConeEmpty = 0x10
}
///
/// Flags for the particle system behavior
///
[Flags]
public enum ParticleSystemFlags : uint
{
///
None = 0,
/// Acceleration and velocity for particles are
/// relative to the object rotation
ObjectRelative = 0x01,
/// Particles use new 'correct' angle parameters
UseNewAngle = 0x02
}
///
/// Flags for the particles in this particle system
///
[Flags]
public enum ParticleFlags : uint
{
///
None = 0,
///
InterpColor = 0x001,
///
InterpScale = 0x002,
///
Bounce = 0x004,
///
Wind = 0x008,
///
FollowSrc = 0x010,
///
FollowVelocity = 0x20,
///
TargetPos = 0x40,
///
TargetLinear = 0x080,
///
Emissive = 0x100,
///
Beam = 0x200
}
public uint CRC;
public SourcePattern Pattern = SourcePattern.None;
public ParticleSystemFlags Flags = ParticleSystemFlags.None;
public float MaxAge;
public float StartAge;
public float InnerAngle;
public float OuterAngle;
public float BurstRate;
public float BurstRadius;
public float BurstSpeedMin;
public float BurstSpeedMax;
public float BurstPartCount;
public LLVector3 AngularVelocity;
public LLVector3 PartAcceleration;
public LLUUID Texture;
public LLUUID Target;
public LLColor PartStartColor;
public LLColor PartEndColor;
public float PartStartScaleX;
public float PartStartScaleY;
public float PartEndScaleX;
public float PartEndScaleY;
public float PartMaxAge;
public ParticleFlags PartFlags = ParticleFlags.None;
///
///
///
public ParticleSystem()
{
}
///
///
///
///
///
public ParticleSystem(byte[] data, int pos)
{
FromBytes(data, pos);
}
///
///
///
///
public byte[] GetBytes()
{
byte[] bytes = new byte[0];
// FIXME: Finish ParticleSystem.GetBytes()
return bytes;
}
///
///
///
///
///
private void FromBytes(byte[] data, int pos)
{
if (data.Length == 0)
return;
BitPack pack = new BitPack(data, pos);
CRC = pack.UnpackUBits(32);
Flags = (ParticleSystemFlags)pack.UnpackUBits(32);
Pattern = (SourcePattern)pack.UnpackByte();
MaxAge = pack.UnpackFixed(false, 8, 8);
StartAge = pack.UnpackFixed(false, 8, 8);
InnerAngle = pack.UnpackFixed(false, 3, 5);
OuterAngle = pack.UnpackFixed(false, 3, 5);
BurstRate = pack.UnpackFixed(false, 8, 8);
BurstRadius = pack.UnpackFixed(false, 8, 8);
BurstSpeedMin = pack.UnpackFixed(false, 8, 8);
BurstSpeedMax = pack.UnpackFixed(false, 8, 8);
BurstPartCount = (uint)pack.UnpackByte();
float x = pack.UnpackFixed(true, 8, 7);
float y = pack.UnpackFixed(true, 8, 7);
float z = pack.UnpackFixed(true, 8, 7);
AngularVelocity = new LLVector3(x, y, z);
x = pack.UnpackFixed(true, 8, 7);
y = pack.UnpackFixed(true, 8, 7);
z = pack.UnpackFixed(true, 8, 7);
PartAcceleration = new LLVector3(x, y, z);
Texture = pack.UnpackUUID();
Target = pack.UnpackUUID();
PartFlags = (ParticleFlags)pack.UnpackUBits(32);
PartMaxAge = pack.UnpackFixed(false, 8, 8);
byte r = pack.UnpackByte();
byte g = pack.UnpackByte();
byte b = pack.UnpackByte();
byte a = pack.UnpackByte();
PartStartColor = new LLColor(r, g, b, a);
r = pack.UnpackByte();
g = pack.UnpackByte();
b = pack.UnpackByte();
a = pack.UnpackByte();
PartEndColor = new LLColor(r, g, b, a);
PartStartScaleX = pack.UnpackFixed(false, 3, 5);
PartStartScaleY = pack.UnpackFixed(false, 3, 5);
PartEndScaleX = pack.UnpackFixed(false, 3, 5);
PartEndScaleY = pack.UnpackFixed(false, 3, 5);
}
}
}
}