using System; using System.Collections.Generic; using System.ComponentModel; using System.Xml.Serialization; namespace libsecondlife { /// /// /// [Serializable] public class ParticleSystem { /// /// /// public enum SourcePattern : byte { /// [XmlEnum("None")] None = 0, /// [XmlEnum("Drop")] Drop = 0x01, /// [XmlEnum("Explode")] Explode = 0x02, /// [XmlEnum("Angle")] Angle = 0x04, /// [XmlEnum("AngleCone")] AngleCone = 0x08, /// [XmlEnum("AngleConeEmpty")] AngleConeEmpty = 0x10 } /// /// Information on a particle system assocaited with a prim /// [Flags] public enum ParticleFlags : ushort { /// None = 0, /// InterpColor = 0x001, /// InterpScale = 0x002, /// Bounce = 0x004, /// Wind = 0x008, /// FollowSrc = 0x010, /// FollowVelocity = 0x20, /// TargetPos = 0x40, /// TargetLinear = 0x080, /// Emissive = 0x100 } /// [XmlAttribute("startrgba"), DefaultValue(0)] public uint PartStartRGBA; /// [XmlAttribute("endrgba"), DefaultValue(0)] public uint PartEndRGBA; /// [XmlAttribute("maxage"), DefaultValue(0)] public float PartMaxAge; /// [XmlAttribute("srcmaxage"), DefaultValue(0)] public float SrcMaxAge; /// [XmlAttribute("srcanglebegin"), DefaultValue(0)] public float SrcAngleBegin; /// [XmlAttribute("srcangleend"), DefaultValue(0)] public float SrcAngleEnd; /// [XmlAttribute("srcburstpartcount"), DefaultValue(0)] public int SrcBurstPartCount; /// [XmlAttribute("srcburstradius"), DefaultValue(0)] public float SrcBurstRadius; /// [XmlAttribute("srcburstrate"), DefaultValue(0)] public float SrcBurstRate; /// [XmlAttribute("srcburstspeedmin"), DefaultValue(0)] public float SrcBurstSpeedMin; /// [XmlAttribute("srcburstspeedmax"), DefaultValue(0)] public float SrcBurstSpeedMax; /// Unknown [XmlAttribute("serial"), DefaultValue(0)] public uint Serial; /// Unknown [XmlAttribute("starttick"), DefaultValue(0)] public uint StartTick; /// [XmlAttribute("srcpattern"), DefaultValue(SourcePattern.None)] public SourcePattern SrcPattern = SourcePattern.None; /// Various options that describe the behavior of this system [XmlAttribute("particleflags"), DefaultValue(ParticleFlags.None)] public ParticleFlags PartFlags = ParticleFlags.None; /// [XmlElement("srctarget")] public LLUUID SrcTargetKey = LLUUID.Zero; /// Texture that will be applied to the particles [XmlElement("srctexture")] public LLUUID SrcTexture = LLUUID.Zero; /// [XmlElement("partstartscale")] public LLVector3 PartStartScale = LLVector3.Zero; /// [XmlElement("partendscale")] public LLVector3 PartEndScale = LLVector3.Zero; /// [XmlElement("srcaccel")] public LLVector3 SrcAccel = LLVector3.Zero; /// [XmlElement("srcomega")] public LLVector3 SrcOmega = LLVector3.Zero; /// /// /// 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) { int i = pos; if (data.Length == 0) return; Serial = (uint)(data[i++] + (data[i++] << 8) + (data[i++] << 16) + (data[i++] << 24)); StartTick = (uint)(data[i++] + (data[i++] << 8) + (data[i++] << 16) + (data[i++] << 24)); SrcPattern = (SourcePattern)data[i++]; SrcMaxAge = (data[i++] + (data[i++] << 8)) / 256.0f; // TODO: Unknown i += 2; SrcAngleBegin = (data[i++] / 100.0f) * (float)Math.PI; SrcAngleEnd = (data[i++] / 100.0f) * (float)Math.PI; SrcBurstRate = (data[i++] + (data[i++] << 8)) / 256.0f; SrcBurstRadius = (data[i++] + (data[i++] << 8)) / 256.0f; SrcBurstSpeedMin = (data[i++] + (data[i++] << 8)) / 256.0f; SrcBurstSpeedMax = (data[i++] + (data[i++] << 8)) / 256.0f; SrcBurstPartCount = data[i++]; SrcOmega = new LLVector3(); SrcOmega.X = (data[i++] + (data[i++] << 8)) / 128.0f - 256.0f; SrcOmega.Y = (data[i++] + (data[i++] << 8)) / 128.0f - 256.0f; SrcOmega.Z = (data[i++] + (data[i++] << 8)) / 128.0f - 256.0f; SrcAccel = new LLVector3(); SrcAccel.X = (data[i++] + (data[i++] << 8)) / 128.0f - 256.0f; SrcAccel.Y = (data[i++] + (data[i++] << 8)) / 128.0f - 256.0f; SrcAccel.Z = (data[i++] + (data[i++] << 8)) / 128.0f - 256.0f; SrcTexture = new LLUUID(data, i); i += 16; SrcTargetKey = new LLUUID(data, i); i += 16; PartFlags = (ParticleFlags)(data[i++] + (data[i++] << 8)); PartMaxAge = (data[i++] + (data[i++] << 8)) / 256.0f; // TODO: Unknown i += 2; PartStartRGBA = (uint)(data[i++] + (data[i++] << 8) + (data[i++] << 16) + (data[i++] << 24)); PartEndRGBA = (uint)(data[i++] + (data[i++] << 8) + (data[i++] << 16) + (data[i++] << 24)); PartStartScale = new LLVector3(); PartStartScale.X = data[i++] / 32.0f; PartStartScale.Y = data[i++] / 32.0f; PartEndScale = new LLVector3(); PartEndScale.X = data[i++] / 32.0f; PartEndScale.Y = data[i++] / 32.0f; } } }