using System; using System.Collections.Generic; 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")] public uint PartStartRGBA; /// [XmlAttribute("endrgba")] public uint PartEndRGBA; /// [XmlAttribute("maxage")] public float PartMaxAge; /// [XmlAttribute("srcmaxage")] public float SrcMaxAge; /// [XmlAttribute("srcanglebegin")] public float SrcAngleBegin; /// [XmlAttribute("srcangleend")] public float SrcAngleEnd; /// [XmlAttribute("srcburstpartcount")] public int SrcBurstPartCount; /// [XmlAttribute("srcburstradius")] public float SrcBurstRadius; /// [XmlAttribute("srcburstrate")] public float SrcBurstRate; /// [XmlAttribute("srcburstspeedmin")] public float SrcBurstSpeedMin; /// [XmlAttribute("srcburstspeedmax")] public float SrcBurstSpeedMax; /// Unknown [XmlAttribute("version")] public uint Version; /// Unknown [XmlAttribute("starttick")] public uint StartTick; /// [XmlAttribute("srcpattern")] public SourcePattern SrcPattern; /// Various options that describe the behavior of this system [XmlAttribute("particleflags")] public ParticleFlags PartFlags; /// [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; Version = (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; } } }