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); } } } }