public static Element[] GetMolecularFormulaOrderingFor(ParticleFlags flags) { bool flag1 = (flags & ParticleFlags.MolecularFormula_1) > 0; bool flag2 = (flags & ParticleFlags.MolecularFormula_2) > 0; if (!flag1 & !flag2) { return(ordering_C_H_alphabetical); } if (!flag1 & flag2) { return(ordering_H_alphabetical_O); } if (!flag2) { return(ordering_electronegativity); } return(ordering_electronegativity_reversed); }
public static extern int MakePhase(int group, ParticleFlags flags);
/// <summary> /// /// </summary> /// <param name="data"></param> /// <param name="pos"></param> 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; }
/// <summary> /// Take all new data from other particle. Id, charge and hashes are not taken /// </summary> /// <param name="source">particle to take data from</param> /// <param name="reorderings">temporary buffer</param> /// <returns>false if topology mismatch</returns> public bool TakeAbsentDataFrom(ParticleInfo source, List <int> reorderings, bool allowAutofix = false) { Init(); // data copied only if not present in destination // id stays the same // hashes are not updated, should be recalculated by the caller if (string.IsNullOrEmpty(name)) { name = source.name; } if (CID == 0) { CID = source.CID; } for (int i = 0; i < source.CASes.Count; i++) { if (!CASes.Contains(source.CASes[i])) { CASes.Add(source.CASes[i]); } } if ((flags & ParticleFlags.HasChemicalFormula) == 0) { chemicalFormula = source.chemicalFormula; flags |= (source.flags & ParticleFlags.HasChemicalFormula); } flags |= (source.flags & ParticleFlags.HasSkeletalFormula); flags |= (source.flags & ParticleFlags.ShowInExplorer); flags |= (source.flags & ParticleFlags.ShowInConstructor); flags |= (source.flags & ParticleFlags.ForceIncludeInBuild); bool success = true; var structureFlags = ParticleFlags.Has3D | ParticleFlags.Has2D; if ((flags & structureFlags) != structureFlags && // there is something missing (source.flags & structureFlags) > 0) // there is something to copy { var sAtoms = source.data.atoms; if ((flags & structureFlags) == 0) // everything is missing { // just copy the whole data data.atoms = DeepCopy(sAtoms); data.bonds = DeepCopy(source.bonds); // copy some flags from source var flagsToCopy = ParticleFlags.HasParticleCharge | ParticleFlags.HasAtomCharges | ParticleFlags.Has2D | ParticleFlags.Has3D | ParticleFlags.HasTopology | ParticleFlags.HasRadicalAtoms; flags &= ~flagsToCopy; flags |= (source.flags & flagsToCopy); } else { var atoms = data.atoms; success = ParticleComparer.AreEqual(this, source, true, reorderings); if (!success & allowAutofix) { success = ParticleComparer.AreEqual(this, source, false, reorderings); } if (success) { if ((flags & ParticleFlags.Has2D) == 0 & (source.flags & ParticleFlags.Has2D) > 0) { // we should take 2d from source, but keep our 3d for (int i = atoms.Count - 1; i >= 0; i--) { atoms[i].flatPosition = sAtoms[reorderings[i]].flatPosition; } flags |= ParticleFlags.Has2D | ParticleFlags.HasTopology; } else if ((flags & ParticleFlags.Has3D) == 0 & (source.flags & ParticleFlags.Has3D) > 0) { // we should take 3d from source, but keep our 2d for (int i = atoms.Count - 1; i >= 0; i--) { atoms[i].position = sAtoms[reorderings[i]].position; } flags |= ParticleFlags.Has3D | ParticleFlags.HasTopology; } // take charges if ((source.flags & ParticleFlags.HasAtomCharges) > 0) { flags |= (source.flags & (ParticleFlags.HasParticleCharge | ParticleFlags.HasAtomCharges)); for (int i = atoms.Count - 1; i >= 0; i--) { if (atoms[i].atomCharge == 0) { atoms[i].atomCharge = sAtoms[reorderings[i]].atomCharge; } } } // take radicals if ((source.flags & ParticleFlags.HasRadicalAtoms) > 0) { flags |= (source.flags & ParticleFlags.HasRadicalAtoms); for (int i = atoms.Count - 1; i >= 0; i--) { if (atoms[i].radical == 0) { atoms[i].radical = sAtoms[reorderings[i]].radical; } } } } } } if (string.IsNullOrEmpty(primaryName)) { primaryName = source.primaryName; } var sSynonyms = source.iupacs; for (int i = 0; i < sSynonyms.Count; i++) { var syn = sSynonyms[i]; if (syn.Equals(primaryName, StringComparison.Ordinal)) { continue; } if (iupacs.Contains(syn)) { continue; } iupacs.Add(syn); } return(success); }
/// <summary> /// /// </summary> /// <param name="data"></param> /// <param name="pos"></param> 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; }