// Old uuid and new sceneobjectgroup public AuraMetaEntity CreateAuraForNewlyCreatedEntity(SceneObjectPart part) { AuraMetaEntity ent = new AuraMetaEntity(part.ParentGroup.Scene, part.GetWorldPosition(), MetaEntity.TRANSLUCENT, new Vector3(0, 254, 0), part.Scale ); m_NewlyCreatedEntityAura.Add(part.UUID, ent); return(ent); }
/// <summary> /// Search for a corresponding group UUID in the scene. If not found, then the revisioned group this CMEntity represents has been deleted. Mark the metaentity appropriately. /// If a matching UUID is found in a scene object group, compare the two for differences. If differences exist, Mark the metaentity appropriately. /// </summary> public void FindDifferences() { List <EntityBase> sceneEntityList = new List <EntityBase>(m_Entity.Scene.GetEntities()); DiffersFromSceneGroup = false; // if group is not contained in scene's list if (!ContainsKey(sceneEntityList, m_UnchangedEntity.UUID)) { foreach (SceneObjectPart part in m_UnchangedEntity.Parts) { // if scene list no longer contains this part, display translucent part and mark with red aura if (!ContainsKey(sceneEntityList, part.UUID)) { // if already displaying a red aura over part, make sure its red if (m_AuraEntities.ContainsKey(part.UUID)) { m_AuraEntities[part.UUID].SetAura(new Vector3(254, 0, 0), part.Scale); } else { AuraMetaEntity auraGroup = new AuraMetaEntity(m_Entity.Scene, part.GetWorldPosition(), MetaEntity.TRANSLUCENT, new Vector3(254, 0, 0), part.Scale ); m_AuraEntities.Add(part.UUID, auraGroup); } SceneObjectPart metaPart = m_Entity.GetLinkNumPart(part.LinkNum); SetPartTransparency(metaPart, MetaEntity.TRANSLUCENT); } // otherwise, scene will not contain the part. note: a group can not remove a part without changing group id } // a deleted part has no where to point a beam particle system, // if a metapart had a particle system (maybe it represented a moved part) remove it if (m_BeamEntities.ContainsKey(m_UnchangedEntity.RootPart.UUID)) { m_BeamEntities[m_UnchangedEntity.RootPart.UUID].HideFromAll(); m_BeamEntities.Remove(m_UnchangedEntity.RootPart.UUID); } DiffersFromSceneGroup = true; } // if scene list does contain group, compare each part in group for differences and display beams and auras appropriately else { MarkWithDifferences((SceneObjectGroup)GetGroupByUUID(sceneEntityList, m_UnchangedEntity.UUID)); } }
// Old uuid and new sceneobjectgroup public AuraMetaEntity CreateAuraForNewlyCreatedEntity(SceneObjectPart part) { AuraMetaEntity ent = new AuraMetaEntity(part.ParentGroup.Scene, part.GetWorldPosition(), MetaEntity.TRANSLUCENT, new Vector3(0,254,0), part.Scale ); m_NewlyCreatedEntityAura.Add(part.UUID, ent); return ent; }
/// <summary> /// Returns true if there was a change between meta entity and the entity group, false otherwise. /// If true is returned, it is assumed the metaentity's appearance has changed to reflect the difference (though clients haven't been updated). /// </summary> public bool MarkWithDifferences(SceneObjectGroup sceneEntityGroup) { SceneObjectPart sceneEntityPart; SceneObjectPart metaEntityPart; Diff differences; bool changed = false; // Use "UnchangedEntity" to do comparisons because its text, transparency, and other attributes will be just as the user // had originally saved. // m_Entity will NOT necessarily be the same entity as the user had saved. foreach (SceneObjectPart UnchangedPart in m_UnchangedEntity.Children.Values) { //This is the part that we use to show changes. metaEntityPart = m_Entity.GetLinkNumPart(UnchangedPart.LinkNum); if (sceneEntityGroup.Children.ContainsKey(UnchangedPart.UUID)) { sceneEntityPart = sceneEntityGroup.Children[UnchangedPart.UUID]; differences = Difference.FindDifferences(UnchangedPart, sceneEntityPart); if (differences != Diff.NONE) { metaEntityPart.Text = "CHANGE: " + differences.ToString(); } if (differences != 0) { // Root Part that has been modified if ((differences & Diff.POSITION) > 0) { // If the position of any part has changed, make sure the RootPart of the // meta entity is pointing with a beam particle system if (m_BeamEntities.ContainsKey(m_UnchangedEntity.RootPart.UUID)) { m_BeamEntities[m_UnchangedEntity.RootPart.UUID].HideFromAll(); m_BeamEntities.Remove(m_UnchangedEntity.RootPart.UUID); } BeamMetaEntity beamGroup = new BeamMetaEntity(m_Entity.Scene, m_UnchangedEntity.RootPart.GetWorldPosition(), MetaEntity.TRANSLUCENT, sceneEntityPart, new Vector3(0, 0, 254) ); m_BeamEntities.Add(m_UnchangedEntity.RootPart.UUID, beamGroup); } if (m_AuraEntities.ContainsKey(UnchangedPart.UUID)) { m_AuraEntities[UnchangedPart.UUID].HideFromAll(); m_AuraEntities.Remove(UnchangedPart.UUID); } AuraMetaEntity auraGroup = new AuraMetaEntity(m_Entity.Scene, UnchangedPart.GetWorldPosition(), MetaEntity.TRANSLUCENT, new Vector3(0, 0, 254), UnchangedPart.Scale ); m_AuraEntities.Add(UnchangedPart.UUID, auraGroup); SetPartTransparency(metaEntityPart, MetaEntity.TRANSLUCENT); DiffersFromSceneGroup = true; } else // no differences between scene part and meta part { if (m_BeamEntities.ContainsKey(m_UnchangedEntity.RootPart.UUID)) { m_BeamEntities[m_UnchangedEntity.RootPart.UUID].HideFromAll(); m_BeamEntities.Remove(m_UnchangedEntity.RootPart.UUID); } if (m_AuraEntities.ContainsKey(UnchangedPart.UUID)) { m_AuraEntities[UnchangedPart.UUID].HideFromAll(); m_AuraEntities.Remove(UnchangedPart.UUID); } SetPartTransparency(metaEntityPart, MetaEntity.NONE); } } else //The entity currently in the scene is missing parts from the metaentity saved, so mark parts red as deleted. { if (m_AuraEntities.ContainsKey(UnchangedPart.UUID)) { m_AuraEntities[UnchangedPart.UUID].HideFromAll(); m_AuraEntities.Remove(UnchangedPart.UUID); } AuraMetaEntity auraGroup = new AuraMetaEntity(m_Entity.Scene, UnchangedPart.GetWorldPosition(), MetaEntity.TRANSLUCENT, new Vector3(254, 0, 0), UnchangedPart.Scale ); m_AuraEntities.Add(UnchangedPart.UUID, auraGroup); SetPartTransparency(metaEntityPart, MetaEntity.TRANSLUCENT); DiffersFromSceneGroup = true; } } return(changed); }
/// <summary> /// Returns true if there was a change between meta entity and the entity group, false otherwise. /// If true is returned, it is assumed the metaentity's appearance has changed to reflect the difference (though clients haven't been updated). /// </summary> public bool MarkWithDifferences(SceneObjectGroup sceneEntityGroup) { SceneObjectPart sceneEntityPart; SceneObjectPart metaEntityPart; Diff differences; bool changed = false; // Use "UnchangedEntity" to do comparisons because its text, transparency, and other attributes will be just as the user // had originally saved. // m_Entity will NOT necessarily be the same entity as the user had saved. foreach (SceneObjectPart UnchangedPart in m_UnchangedEntity.Parts) { //This is the part that we use to show changes. metaEntityPart = m_Entity.GetLinkNumPart(UnchangedPart.LinkNum); if (sceneEntityGroup.ContainsPart(UnchangedPart.UUID)) { sceneEntityPart = sceneEntityGroup.GetChildPart(UnchangedPart.UUID); differences = Difference.FindDifferences(UnchangedPart, sceneEntityPart); if (differences != Diff.NONE) metaEntityPart.Text = "CHANGE: " + differences.ToString(); if (differences != 0) { // Root Part that has been modified if ((differences & Diff.POSITION) > 0) { // If the position of any part has changed, make sure the RootPart of the // meta entity is pointing with a beam particle system if (m_BeamEntities.ContainsKey(m_UnchangedEntity.RootPart.UUID)) { m_BeamEntities[m_UnchangedEntity.RootPart.UUID].HideFromAll(); m_BeamEntities.Remove(m_UnchangedEntity.RootPart.UUID); } BeamMetaEntity beamGroup = new BeamMetaEntity(m_Entity.Scene, m_UnchangedEntity.RootPart.GetWorldPosition(), MetaEntity.TRANSLUCENT, sceneEntityPart, new Vector3(0, 0, 254) ); m_BeamEntities.Add(m_UnchangedEntity.RootPart.UUID, beamGroup); } if (m_AuraEntities.ContainsKey(UnchangedPart.UUID)) { m_AuraEntities[UnchangedPart.UUID].HideFromAll(); m_AuraEntities.Remove(UnchangedPart.UUID); } AuraMetaEntity auraGroup = new AuraMetaEntity(m_Entity.Scene, UnchangedPart.GetWorldPosition(), MetaEntity.TRANSLUCENT, new Vector3(0, 0, 254), UnchangedPart.Scale ); m_AuraEntities.Add(UnchangedPart.UUID, auraGroup); SetPartTransparency(metaEntityPart, MetaEntity.TRANSLUCENT); DiffersFromSceneGroup = true; } else // no differences between scene part and meta part { if (m_BeamEntities.ContainsKey(m_UnchangedEntity.RootPart.UUID)) { m_BeamEntities[m_UnchangedEntity.RootPart.UUID].HideFromAll(); m_BeamEntities.Remove(m_UnchangedEntity.RootPart.UUID); } if (m_AuraEntities.ContainsKey(UnchangedPart.UUID)) { m_AuraEntities[UnchangedPart.UUID].HideFromAll(); m_AuraEntities.Remove(UnchangedPart.UUID); } SetPartTransparency(metaEntityPart, MetaEntity.NONE); } } else //The entity currently in the scene is missing parts from the metaentity saved, so mark parts red as deleted. { if (m_AuraEntities.ContainsKey(UnchangedPart.UUID)) { m_AuraEntities[UnchangedPart.UUID].HideFromAll(); m_AuraEntities.Remove(UnchangedPart.UUID); } AuraMetaEntity auraGroup = new AuraMetaEntity(m_Entity.Scene, UnchangedPart.GetWorldPosition(), MetaEntity.TRANSLUCENT, new Vector3(254, 0, 0), UnchangedPart.Scale ); m_AuraEntities.Add(UnchangedPart.UUID, auraGroup); SetPartTransparency(metaEntityPart, MetaEntity.TRANSLUCENT); DiffersFromSceneGroup = true; } } return changed; }
/// <summary> /// Search for a corresponding group UUID in the scene. If not found, then the revisioned group this CMEntity represents has been deleted. Mark the metaentity appropriately. /// If a matching UUID is found in a scene object group, compare the two for differences. If differences exist, Mark the metaentity appropriately. /// </summary> public void FindDifferences() { List<EntityBase> sceneEntityList = new List<EntityBase>(m_Entity.Scene.GetEntities()); DiffersFromSceneGroup = false; // if group is not contained in scene's list if (!ContainsKey(sceneEntityList, m_UnchangedEntity.UUID)) { foreach (SceneObjectPart part in m_UnchangedEntity.Parts) { // if scene list no longer contains this part, display translucent part and mark with red aura if (!ContainsKey(sceneEntityList, part.UUID)) { // if already displaying a red aura over part, make sure its red if (m_AuraEntities.ContainsKey(part.UUID)) { m_AuraEntities[part.UUID].SetAura(new Vector3(254, 0, 0), part.Scale); } else { AuraMetaEntity auraGroup = new AuraMetaEntity(m_Entity.Scene, part.GetWorldPosition(), MetaEntity.TRANSLUCENT, new Vector3(254, 0, 0), part.Scale ); m_AuraEntities.Add(part.UUID, auraGroup); } SceneObjectPart metaPart = m_Entity.GetLinkNumPart(part.LinkNum); SetPartTransparency(metaPart, MetaEntity.TRANSLUCENT); } // otherwise, scene will not contain the part. note: a group can not remove a part without changing group id } // a deleted part has no where to point a beam particle system, // if a metapart had a particle system (maybe it represented a moved part) remove it if (m_BeamEntities.ContainsKey(m_UnchangedEntity.RootPart.UUID)) { m_BeamEntities[m_UnchangedEntity.RootPart.UUID].HideFromAll(); m_BeamEntities.Remove(m_UnchangedEntity.RootPart.UUID); } DiffersFromSceneGroup = true; } // if scene list does contain group, compare each part in group for differences and display beams and auras appropriately else { MarkWithDifferences((SceneObjectGroup)GetGroupByUUID(sceneEntityList, m_UnchangedEntity.UUID)); } }