From 57a42508ecea7c1df1c469b01f9c6a5528973973 Mon Sep 17 00:00:00 2001 From: "Huaiyu (Kitty) Liu" Date: Tue, 14 Jun 2011 14:53:12 -0700 Subject: [PATCH] Added AbsolutePosition as another SOP property to sync across, yet made it a group property, so that only RootPart will trigger a sync message for this property. An optimization to avoid sending many position updates for linkset objects. --- .../EntityTransfer/EntityTransferModule.cs | 2 +- .../SymmetricSync/RegionSyncModule.cs | 208 ++++++++++++++++-- .../Framework/Scenes/SceneObjectGroup.cs | 19 +- .../Framework/Scenes/SceneObjectPart.cs | 40 +--- 4 files changed, 214 insertions(+), 55 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index d07eb23633..fd7c5da4f5 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -1614,7 +1614,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer { grp.OffsetForNewRegion(oldGroupPosition); //grp.ScheduleGroupForFullUpdate(); - grp.ScheduleGroupForFullUpdate(new List(){SceneObjectPartSyncProperties.Position}); + grp.ScheduleGroupForFullUpdate(new List(){SceneObjectPartSyncProperties.GroupPosition}); } } diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs index a7b0e73ac6..2ca2d0f26d 100644 --- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs +++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs @@ -1392,6 +1392,9 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule /////////////////////// //SOG properties /////////////////////// + case SceneObjectPartSyncProperties.AbsolutePosition: + estimateBytes += ((Vector3)propertySyncInfo.LastUpdateValue).GetBytes().Length; + break; case SceneObjectPartSyncProperties.IsSelected: //propertyData["Value"] = OSD.FromBoolean((bool)LastUpdateValue); estimateBytes += 1; @@ -1865,12 +1868,11 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule PrimitiveBaseShape shape = PropertySerializer.DeSerializeShape((String)p.LastUpdateValue); m_log.DebugFormat("Shape to be changed on SOP {0}, {1} to ProfileShape {2}", sop.Name, sop.UUID, shape.ProfileShape); } - } - * */ + } - - //m_log.DebugFormat("ms {0}: HandleUpdatedPrimProperties, for prim {1},{2} with updated properties -- {3}", DateTime.Now.Millisecond, sop.Name, sop.UUID, pString); + m_log.DebugFormat("ms {0}: HandleUpdatedPrimProperties, for prim {1},{2} with updated properties -- {3}", DateTime.Now.Millisecond, sop.Name, sop.UUID, pString); + * */ List propertiesUpdated = m_primSyncInfoManager.UpdatePrimSyncInfoBySync(sop, propertiesSyncInfo); @@ -1904,13 +1906,26 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule break; } } - if (allTerseUpdates) + + bool hasGroupUpdates = false; + if (PrimSyncInfo.GroupProperties.Overlaps(propertiesUpdated)) { - sop.ScheduleTerseUpdate(null); + hasGroupUpdates = true; + } + + if (!hasGroupUpdates || sop.ParentGroup == null) + { + if (allTerseUpdates) + sop.ScheduleTerseUpdate(null); + else + sop.ScheduleFullUpdate(null); } else { - sop.ScheduleFullUpdate(null); + if (allTerseUpdates) + sop.ParentGroup.ScheduleGroupForTerseUpdate(null); + else + sop.ParentGroup.ScheduleGroupForFullUpdate(null); } } } @@ -3084,6 +3099,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule //Enqueue the prim with the set of updated properties, excluding the group properties if (propertiesWithSyncInfoUpdated.Count > 0) { + /* lock (m_primPropertyUpdateLock) { if (m_primPropertyUpdates.ContainsKey(part.UUID)) @@ -3093,7 +3109,16 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule //Include the "property" into the list of updated properties. //HashSet's Add function should handle it correctly whether the property //is or is not in the set. - m_primPropertyUpdates[part.UUID].Add(property); + + //If it's a group property, only add it to the RootPart's + //updated property queue, to avoid too many prim updates. + //For all non-group properties, simply add it to the prim's + //updated property queue. + if (!PrimSyncInfo.GroupProperties.Contains(property) || + (PrimSyncInfo.GroupProperties.Contains(property) && part.UUID.Equals(part.ParentGroup.RootPart.UUID))) + { + m_primPropertyUpdates[part.UUID].Add(property); + } } } else @@ -3101,6 +3126,45 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule m_primPropertyUpdates.Add(part.UUID, propertiesWithSyncInfoUpdated); } } + * */ + EnqueueUpdatedProperty(part, propertiesWithSyncInfoUpdated); + } + } + + private void EnqueueUpdatedProperty(SceneObjectPart part, HashSet propertiesWithSyncInfoUpdated) + { + lock (m_primPropertyUpdateLock) + { + if (m_primPropertyUpdates.ContainsKey(part.UUID)) + { + foreach (SceneObjectPartSyncProperties property in propertiesWithSyncInfoUpdated) + { + //Include the "property" into the list of updated properties. + //HashSet's Add function should handle it correctly whether the property + //is or is not in the set. + + //If it's a group property, only add it to the RootPart's + //updated property queue, to avoid too many prim updates. + //For all non-group properties, simply add it to the prim's + //updated property queue. + if (!PrimSyncInfo.GroupProperties.Contains(property) || + (PrimSyncInfo.GroupProperties.Contains(property) && part.UUID.Equals(part.ParentGroup.RootPart.UUID))) + { + m_primPropertyUpdates[part.UUID].Add(property); + } + } + } + else + { + //If it's a group property and the part is not the RootPart, + //do not enlist the property. + if (!part.UUID.Equals(part.ParentGroup.RootPart.UUID)) + { + propertiesWithSyncInfoUpdated.ExceptWith(PrimSyncInfo.GroupProperties); + } + + m_primPropertyUpdates.Add(part.UUID, propertiesWithSyncInfoUpdated); + } } } @@ -3126,6 +3190,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule //Enqueue the prim with the set of updated properties if (propertiesToSync.Count > 0) { + /* lock (m_primPropertyUpdateLock) { if (m_primPropertyUpdates.ContainsKey(part.UUID)) @@ -3135,7 +3200,12 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule //Include the "property" into the list of updated properties. //HashSet's Add function should handle it correctly whether the property //is or is not in the set. - m_primPropertyUpdates[part.UUID].Add(property); + + if (!PrimSyncInfo.GroupProperties.Contains(property) || + (PrimSyncInfo.GroupProperties.Contains(property) && part.UUID.Equals(part.ParentGroup.RootPart.UUID))) + { + m_primPropertyUpdates[part.UUID].Add(property); + } } } else @@ -3143,6 +3213,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule m_primPropertyUpdates.Add(part.UUID, propertiesToSync); } } + * */ + EnqueueUpdatedProperty(part, propertiesToSync); } } @@ -4006,6 +4078,9 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule /////////////////////// //SOG properties /////////////////////// + case SceneObjectPartSyncProperties.AbsolutePosition: + propertyData["Value"] = OSD.FromVector3((Vector3)LastUpdateValue); + break; case SceneObjectPartSyncProperties.IsSelected: propertyData["Value"] = OSD.FromBoolean((bool)LastUpdateValue); break; @@ -4253,6 +4328,9 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule /////////////////////// //SOG properties /////////////////////// + case SceneObjectPartSyncProperties.AbsolutePosition: + m_lastUpdateValue = (Object)(propertyData["Value"].AsVector3()); + break; case SceneObjectPartSyncProperties.IsSelected: //propertyData["Value"] = OSD.FromBoolean((bool)LastUpdateValue); m_lastUpdateValue = (Object)(propertyData["Value"].AsBoolean()); @@ -4746,6 +4824,10 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule foreach (SceneObjectPartSyncProperties property in GroupProperties) { SetSOPPropertyValue(sop, property); + if (property == SceneObjectPartSyncProperties.AbsolutePosition) + { + + } } } @@ -5240,7 +5322,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule } break; case SceneObjectPartSyncProperties.GroupPosition: - propertyUpdatedByLocal = CompareAndUpdateSOPGroupPosition(part, lastUpdateByLocalTS, syncID); + propertyUpdatedByLocal = CompareAndUpdateSOPGroupPositionByLocal(part, lastUpdateByLocalTS, syncID); break; case SceneObjectPartSyncProperties.InventorySerial: if (!part.InventorySerial.Equals(m_propertiesSyncInfo[property].LastUpdateValue)) @@ -5886,7 +5968,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule } break; case SceneObjectPartSyncProperties.Position: - propertyUpdatedByLocal = CompareAndUpdateSOPPosition(part, lastUpdateByLocalTS, syncID); + propertyUpdatedByLocal = CompareAndUpdateSOPPositionByLocal(part, lastUpdateByLocalTS, syncID); break; case SceneObjectPartSyncProperties.RotationalVelocity: if (!part.PhysActor.RotationalVelocity.Equals(m_propertiesSyncInfo[property].LastUpdateValue)) @@ -5937,6 +6019,24 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule /////////////////////// //SOG properties /////////////////////// + case SceneObjectPartSyncProperties.AbsolutePosition: + /* + if (!part.ParentGroup.AbsolutePosition.Equals(m_propertiesSyncInfo[property].LastUpdateValue)) + { + if (lastUpdateByLocalTS > m_propertiesSyncInfo[property].LastUpdateTimeStamp) + { + m_propertiesSyncInfo[property].UpdateSyncInfoByLocal(lastUpdateByLocalTS, syncID, (Object)part.ParentGroup.AbsolutePosition); + propertyUpdatedByLocal = true; + } + else if (lastUpdateByLocalTS < m_propertiesSyncInfo[property].LastUpdateTimeStamp) + { + //overwrite SOG's data + part.ParentGroup.AbsolutePosition = (Vector3)m_propertiesSyncInfo[property].LastUpdateValue; + } + } + * */ + propertyUpdatedByLocal = CompareAndUpdateSOPAbsolutePositionByLocal(part, lastUpdateByLocalTS, syncID); + break; case SceneObjectPartSyncProperties.IsSelected: if (!part.ParentGroup.IsSelected.Equals(m_propertiesSyncInfo[property].LastUpdateValue)) { @@ -5947,7 +6047,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule } else if (lastUpdateByLocalTS < m_propertiesSyncInfo[property].LastUpdateTimeStamp) { - //overwrite PhysActor's data + //overwrite SOG's data part.ParentGroup.IsSelected = (bool)m_propertiesSyncInfo[property].LastUpdateValue; } } @@ -6160,6 +6260,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule /////////////////////// //SOG properties /////////////////////// + case SceneObjectPartSyncProperties.AbsolutePosition: + return (Object)part.ParentGroup.AbsolutePosition; case SceneObjectPartSyncProperties.IsSelected: return (Object)part.ParentGroup.IsSelected; } @@ -6169,21 +6271,24 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule /// /// Set the property's value based on the value maintained in PrimSyncInfoManager. - /// Assumption: caller will call ScheduleFullUpdate to enqueue updates properly. + /// Assumption: caller will call ScheduleFullUpdate to enqueue updates properly to + /// update viewers. + /// This function should only be triggered when a prim update is received (i.e. + /// triggered by remote update instead of local update). /// /// /// private void SetSOPPropertyValue(SceneObjectPart part, SceneObjectPartSyncProperties property) { if (part == null) return; - if (!m_propertiesSyncInfo.ContainsKey(property) && part.PhysActor == null){ + if (PrimPhysActorProperties.Contains(property) && !m_propertiesSyncInfo.ContainsKey(property) && part.PhysActor == null){ //DebugLog.WarnFormat("SetSOPPropertyValue: property {0} not in record.", property.ToString()); //For phantom prims, they don't have physActor properties, //so for those properties, simply return return; } - if (!m_propertiesSyncInfo.ContainsKey(property) && part.PhysActor != null) + if (!m_propertiesSyncInfo.ContainsKey(property)) { DebugLog.WarnFormat("PrimSyncInfo.SetSOPPropertyValue: property {0} not in sync cache. ", property); return; @@ -6504,6 +6609,9 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule /////////////////////// //SOG properties /////////////////////// + case SceneObjectPartSyncProperties.AbsolutePosition: + SetSOPAbsolutePosition(part, pSyncInfo); + break; case SceneObjectPartSyncProperties.IsSelected: if (part.ParentGroup != null) part.ParentGroup.IsSelected = (bool)pSyncInfo.LastUpdateValue; @@ -6514,6 +6622,45 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule //part.ScheduleFullUpdate(new List() { property }); } + private void SetSOPAbsolutePosition(SceneObjectPart part, PropertySyncInfo pSyncInfo) + { + if (part.ParentGroup != null) + { + part.ParentGroup.AbsolutePosition = (Vector3)pSyncInfo.LastUpdateValue; + + PropertySyncInfo gPosSyncInfo; + if (m_propertiesSyncInfo.ContainsKey(SceneObjectPartSyncProperties.GroupPosition)) + { + gPosSyncInfo = m_propertiesSyncInfo[SceneObjectPartSyncProperties.GroupPosition]; + gPosSyncInfo.UpdateSyncInfoBySync(pSyncInfo.LastUpdateTimeStamp, pSyncInfo.LastUpdateSyncID, part.GroupPosition, pSyncInfo.LastSyncUpdateRecvTime); + } + else + { + gPosSyncInfo = new PropertySyncInfo(SceneObjectPartSyncProperties.GroupPosition, + part.GroupPosition, pSyncInfo.LastUpdateTimeStamp, pSyncInfo.LastUpdateSyncID); + m_propertiesSyncInfo.Add(SceneObjectPartSyncProperties.GroupPosition, gPosSyncInfo); + } + + if (part.PhysActor != null) + { + PropertySyncInfo posSyncInfo; + if (m_propertiesSyncInfo.ContainsKey(SceneObjectPartSyncProperties.Position)) + { + posSyncInfo = m_propertiesSyncInfo[SceneObjectPartSyncProperties.Position]; + posSyncInfo.UpdateSyncInfoBySync(pSyncInfo.LastUpdateTimeStamp, pSyncInfo.LastUpdateSyncID, part.PhysActor.Position, pSyncInfo.LastSyncUpdateRecvTime); + } + else + { + posSyncInfo = new PropertySyncInfo(SceneObjectPartSyncProperties.Position, + part.PhysActor.Position, pSyncInfo.LastUpdateTimeStamp, pSyncInfo.LastUpdateSyncID); + m_propertiesSyncInfo.Add(SceneObjectPartSyncProperties.Position, posSyncInfo); + } + } + //the above operation may change GroupPosition and PhysActor.Postiion + //as well. so update their values + } + } + //Do not call "part.CollisionSound =" to go through its set function. //We don't want the side effect of calling aggregateScriptEvents. private void SetSOPCollisionSound(SceneObjectPart part, UUID cSound) @@ -6544,9 +6691,36 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule part.ScheduleFullUpdate(null); } + private bool CompareAndUpdateSOPAbsolutePositionByLocal(SceneObjectPart part, long lastUpdateByLocalTS, string syncID) + { + SceneObjectPartSyncProperties property = SceneObjectPartSyncProperties.AbsolutePosition; + + bool propertyUpdatedByLocal = false; + if (!part.ParentGroup.AbsolutePosition.Equals(m_propertiesSyncInfo[property].LastUpdateValue)) + { + if (lastUpdateByLocalTS > m_propertiesSyncInfo[property].LastUpdateTimeStamp) + { + m_propertiesSyncInfo[property].UpdateSyncInfoByLocal(lastUpdateByLocalTS, syncID, (Object)part.ParentGroup.AbsolutePosition); + propertyUpdatedByLocal = true; + } + else if (lastUpdateByLocalTS < m_propertiesSyncInfo[property].LastUpdateTimeStamp) + { + //overwrite SOG's data + part.ParentGroup.AbsolutePosition = (Vector3)m_propertiesSyncInfo[property].LastUpdateValue; + } + } + + //Since writing to AbsolutePosition also changes values of GroupPosition + //and PhysActor.Postiion (these properties are different representations + //of the same prim property), we also need to update the latter two. + CompareAndUpdateSOPGroupPositionByLocal(part, lastUpdateByLocalTS, syncID); + + return propertyUpdatedByLocal; + } + //In SOP's implementation, GroupPosition and SOP.PhysActor.Position are //correlated. We need to make sure that they are both properly synced. - private bool CompareAndUpdateSOPGroupPosition(SceneObjectPart part, long lastUpdateByLocalTS, string syncID) + private bool CompareAndUpdateSOPGroupPositionByLocal(SceneObjectPart part, long lastUpdateByLocalTS, string syncID) { if (!part.GroupPosition.Equals(m_propertiesSyncInfo[SceneObjectPartSyncProperties.GroupPosition].LastUpdateValue)) { @@ -6610,7 +6784,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule return false; } - private bool CompareAndUpdateSOPPosition(SceneObjectPart part, long lastUpdateByLocalTS, string syncID) + private bool CompareAndUpdateSOPPositionByLocal(SceneObjectPart part, long lastUpdateByLocalTS, string syncID) { if (part.PhysActor == null) return false; diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 883481ae5e..8573cbe707 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -983,7 +983,8 @@ namespace OpenSim.Region.Framework.Scenes AttachToBackup(); m_scene.EventManager.TriggerParcelPrimCountTainted(); //m_rootPart.ScheduleFullUpdate(); - m_rootPart.ScheduleFullUpdate(new List() { SceneObjectPartSyncProperties.GroupPosition, SceneObjectPartSyncProperties.AttachmentPoint, + //m_rootPart.ScheduleFullUpdate(new List() { SceneObjectPartSyncProperties.GroupPosition, SceneObjectPartSyncProperties.AttachmentPoint, + m_rootPart.ScheduleFullUpdate(new List() { SceneObjectPartSyncProperties.AbsolutePosition, SceneObjectPartSyncProperties.AttachmentPoint, SceneObjectPartSyncProperties.AttachedAvatar, SceneObjectPartSyncProperties.Flags}); //Physics properties, such as Position, OffsetPosition, etc, should be tainted in ApplyPhysics() m_rootPart.ClearUndoState(); } @@ -1011,6 +1012,10 @@ namespace OpenSim.Region.Framework.Scenes //m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_scene.m_physicalPrim); //AttachToBackup(); //m_rootPart.ScheduleFullUpdate(); + + //m_rootPart.ScheduleSyncUpdate(new List() { SceneObjectPartSyncProperties.GroupPosition, SceneObjectPartSyncProperties.AttachmentPoint, + m_rootPart.ScheduleSyncUpdate(new List() { SceneObjectPartSyncProperties.AbsolutePosition, SceneObjectPartSyncProperties.AttachmentPoint, + SceneObjectPartSyncProperties.AttachedAvatar, SceneObjectPartSyncProperties.Flags}); } /// @@ -2903,7 +2908,8 @@ namespace OpenSim.Region.Framework.Scenes //we need to do a terse update even if the move wasn't allowed // so that the position is reset in the client (the object snaps back) //ScheduleGroupForTerseUpdate(); - List updatedProperties = new List() { SceneObjectPartSyncProperties.GroupPosition }; + //List updatedProperties = new List() { SceneObjectPartSyncProperties.GroupPosition }; + List updatedProperties = new List() { SceneObjectPartSyncProperties.AbsolutePosition }; if (IsAttachment) { updatedProperties.Add(SceneObjectPartSyncProperties.AttachedPos); @@ -2972,7 +2978,8 @@ namespace OpenSim.Region.Framework.Scenes HasGroupChanged = true; //ScheduleGroupForTerseUpdate(); - ScheduleGroupForTerseUpdate(new List(){SceneObjectPartSyncProperties.Position, SceneObjectPartSyncProperties.OffsetPosition}); + //ScheduleGroupForTerseUpdate(new List(){SceneObjectPartSyncProperties.Position, SceneObjectPartSyncProperties.OffsetPosition}); + ScheduleGroupForTerseUpdate(new List() { SceneObjectPartSyncProperties.AbsolutePosition, SceneObjectPartSyncProperties.OffsetPosition }); } public void OffsetForNewRegion(Vector3 offset) @@ -3046,11 +3053,13 @@ namespace OpenSim.Region.Framework.Scenes if (actor != null) { //RotationOffset is only updated for m_rootPart, and m_rootPart.UpdateRotation should already taint RotationOffset as updated - ScheduleGroupForTerseUpdate(new List() { SceneObjectPartSyncProperties.Position, SceneObjectPartSyncProperties.Orientation }); + //ScheduleGroupForTerseUpdate(new List() { SceneObjectPartSyncProperties.Position, SceneObjectPartSyncProperties.Orientation }); + ScheduleGroupForTerseUpdate(new List() { SceneObjectPartSyncProperties.AbsolutePosition, SceneObjectPartSyncProperties.Orientation }); } else { - ScheduleGroupForTerseUpdate(new List() { SceneObjectPartSyncProperties.Position }); + //ScheduleGroupForTerseUpdate(new List() { SceneObjectPartSyncProperties.Position }); + ScheduleGroupForTerseUpdate(new List() { SceneObjectPartSyncProperties.AbsolutePosition}); } } diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 31e8164580..0e5e62cbcb 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -2799,7 +2799,8 @@ namespace OpenSim.Region.Framework.Scenes SceneObjectPartSyncProperties.Position, SceneObjectPartSyncProperties.Orientation, SceneObjectPartSyncProperties.Velocity, - SceneObjectPartSyncProperties.RotationalVelocity + SceneObjectPartSyncProperties.RotationalVelocity, + SceneObjectPartSyncProperties.PA_Acceleration }); //SendTerseUpdateToAllClients(); @@ -5037,6 +5038,7 @@ namespace OpenSim.Region.Framework.Scenes VolumeDetectActive, //Group properties + AbsolutePosition, IsSelected, //Client Manager may want to add some property here that viewers care about and should be synchronized across actors @@ -5165,8 +5167,10 @@ namespace OpenSim.Region.Framework.Scenes public static HashSet GetGroupProperties() { - HashSet allProperties = new HashSet(){SceneObjectPartSyncProperties.IsSelected}; - return allProperties; + HashSet groupProperties = new HashSet(); + groupProperties.Add(SceneObjectPartSyncProperties.IsSelected); + groupProperties.Add(SceneObjectPartSyncProperties.AbsolutePosition); + return groupProperties; } public static HashSet GetTerseUpdateProperties() @@ -5181,41 +5185,13 @@ namespace OpenSim.Region.Framework.Scenes allProperties.Add(SceneObjectPartSyncProperties.Orientation); allProperties.Add(SceneObjectPartSyncProperties.RotationalVelocity); allProperties.Add(SceneObjectPartSyncProperties.Position); + allProperties.Add(SceneObjectPartSyncProperties.AbsolutePosition); return allProperties; } #endregion SceneObjectPartSyncProperties categorization - /* - #region overridden SOPBase members - public new IEntityInventory Inventory - { - get { return m_inventory; } - } - protected new SceneObjectPartInventory m_inventory; - - /// - /// Access should be via Inventory directly - this property temporarily remains for xml serialization purposes - /// - public new uint InventorySerial - { - get { return m_inventory.Serial; } - set { m_inventory.Serial = value; } - } - - /// - /// Access should be via Inventory directly - this property temporarily remains for xml serialization purposes - /// - public new TaskInventoryDictionary TaskInventory - { - get { return m_inventory.Items; } - set { m_inventory.Items = value; } - } - - #endregion //overridden SOPBase members - */ - #region overridden SOPBase functions //Implementation of ScheduleFullUpdate and ScheduleTerseUpdate for Bucket //based synchronization