diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index ff262648e5..0c815d284d 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs @@ -591,7 +591,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments } so.AbsolutePosition = AttachOffset; - so.RootPart.AttachedPos = AttachOffset; + so.RootPart.AttachedPos = AttachOffset; so.RootPart.IsAttachment = true; so.RootPart.SetParentLocalId(avatar.LocalId); @@ -611,7 +611,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments } so.IsSelected = false; // fudge.... - so.ScheduleGroupForFullUpdate(); + //so.ScheduleGroupForFullUpdate(); + so.ScheduleGroupForFullUpdate(SceneObjectPartProperties.FullUpdate); //just force it to sychronize all properties } // In case it is later dropped again, don't let diff --git a/OpenSim/Region/CoreModules/Avatar/ObjectCaps/UploadObjectAssetModule.cs b/OpenSim/Region/CoreModules/Avatar/ObjectCaps/UploadObjectAssetModule.cs index 3114d7ff59..f366b421ee 100644 --- a/OpenSim/Region/CoreModules/Avatar/ObjectCaps/UploadObjectAssetModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/ObjectCaps/UploadObjectAssetModule.cs @@ -352,7 +352,8 @@ namespace OpenSim.Region.CoreModules.Avatar.ObjectCaps rootGroup.LinkToGroup(allparts[j]); } - rootGroup.ScheduleGroupForFullUpdate(); + //rootGroup.ScheduleGroupForFullUpdate(); + rootGroup.ScheduleGroupForFullUpdate(SceneObjectPartProperties.FullUpdate); //seems like new object pos = m_scene.GetNewRezLocation(Vector3.Zero, rootpos, UUID.Zero, rot, (byte)1, 1, true, allparts[0].GroupScale(), false); responsedata["int_response_code"] = 200; //501; //410; //404; diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index d87f91602f..b7e68d06d3 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -1581,7 +1581,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer if (destination != null && !CrossPrimGroupIntoNewRegion(destination, grp, silent)) { grp.OffsetForNewRegion(oldGroupPosition); - grp.ScheduleGroupForFullUpdate(); + //grp.ScheduleGroupForFullUpdate(); + grp.ScheduleGroupForFullUpdate(SceneObjectPartProperties.Position); } } diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs index 7bb8789f16..91d8edc24e 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs @@ -600,7 +600,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess // if not, we set it's position in world. if (!attachment) { - group.ScheduleGroupForFullUpdate(); + //group.ScheduleGroupForFullUpdate(); + group.ScheduleGroupForFullUpdate(SceneObjectPartProperties.FullUpdate); //new object float offsetHeight = 0; pos = m_Scene.GetNewRezLocation( @@ -698,7 +699,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess group.CreateScriptInstances(0, true, m_Scene.DefaultScriptEngine, 1); rootPart.ParentGroup.ResumeScripts(); - rootPart.ScheduleFullUpdate(); + //rootPart.ScheduleFullUpdate(); + rootPart.ScheduleFullUpdate(SceneObjectPartProperties.FullUpdate); } if (!m_Scene.Permissions.BypassPermissions()) diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/RegionSyncClient.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/RegionSyncClient.cs index 3040866e46..bc8e4bac76 100644 --- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/RegionSyncClient.cs +++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/RegionSyncClient.cs @@ -321,7 +321,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule //RegionSyncMessage.HandleSuccess(LogHeader(), msg, String.Format("Object \"{0}\" ({1}) ({1}) updated.", sog.Name, sog.UUID.ToString(), sog.LocalId.ToString())); //else //RegionSyncMessage.HandleSuccess(LogHeader(), msg, String.Format("Object \"{0}\" ({1}) ({1}) added.", sog.Name, sog.UUID.ToString(), sog.LocalId.ToString())); - sog.ScheduleGroupForFullUpdate(); + //sog.ScheduleGroupForFullUpdate(); } return; } diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SceneToScriptEngineConnector.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SceneToScriptEngineConnector.cs index 3167d901c4..8024edee2f 100644 --- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SceneToScriptEngineConnector.cs +++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SceneToScriptEngineConnector.cs @@ -550,7 +550,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule //the prim is not the root-part, set the offset position primToUpdate.OffsetPosition = pos; parent.HasGroupChanged = true; - parent.ScheduleGroupForTerseUpdate(); + //parent.ScheduleGroupForTerseUpdate(); + parent.ScheduleGroupForTerseUpdate(SceneObjectPartProperties.OffsetPosition); } } diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs index a593538ca6..6d9aa3891a 100644 --- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs +++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs @@ -181,8 +181,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule get { return m_isSyncRelay; } } - private Dictionary m_primPropertyBucketMap = new Dictionary(); - public Dictionary PrimPropertyBucketMap + private Dictionary m_primPropertyBucketMap = new Dictionary(); + public Dictionary PrimPropertyBucketMap { get { return m_primPropertyBucketMap; } } @@ -225,6 +225,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule m_propertyBucketDescription.Add(physicsBucketName); m_maxNumOfPropertyBuckets = 2; + /* foreach (string pName in SceneObjectPart.PropertyList) { switch (pName){ @@ -252,6 +253,36 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule break; } } + * */ + + foreach (SceneObjectPartProperties property in Enum.GetValues(typeof(SceneObjectPartProperties))) + { + switch (property) + { + case SceneObjectPartProperties.GroupPosition: + case SceneObjectPartProperties.OffsetPosition: + case SceneObjectPartProperties.Scale: + case SceneObjectPartProperties.Velocity: + case SceneObjectPartProperties.AngularVelocity: + case SceneObjectPartProperties.RotationOffset: + case SceneObjectPartProperties.Position: + case SceneObjectPartProperties.Size: + case SceneObjectPartProperties.Force: + case SceneObjectPartProperties.RotationalVelocity: + case SceneObjectPartProperties.PA_Acceleration: + case SceneObjectPartProperties.Torque: + case SceneObjectPartProperties.Orientation: + case SceneObjectPartProperties.IsPhysical: + case SceneObjectPartProperties.Flying: + case SceneObjectPartProperties.Buoyancy: + m_primPropertyBucketMap.Add(property, physicsBucketName); + break; + default: + //all other properties belong to the "General" bucket. + m_primPropertyBucketMap.Add(property, generalBucketName); + break; + } + } } private bool IsSyncingWithOtherActors() diff --git a/OpenSim/Region/CoreModules/World/Media/Moap/MoapModule.cs b/OpenSim/Region/CoreModules/World/Media/Moap/MoapModule.cs index 7c5d044347..c909c195de 100644 --- a/OpenSim/Region/CoreModules/World/Media/Moap/MoapModule.cs +++ b/OpenSim/Region/CoreModules/World/Media/Moap/MoapModule.cs @@ -236,7 +236,8 @@ namespace OpenSim.Region.CoreModules.Media.Moap part.Shape.Media[face] = me; UpdateMediaUrl(part, UUID.Zero); - part.ScheduleFullUpdate(); + //part.ScheduleFullUpdate(); + part.ScheduleFullUpdate(SceneObjectPartProperties.MediaUrl); part.TriggerScriptChangedEvent(Changed.MEDIA); } @@ -421,7 +422,9 @@ namespace OpenSim.Region.CoreModules.Media.Moap UpdateMediaUrl(part, agentId); // Arguably, we could avoid sending a full update to the avatar that just changed the texture. - part.ScheduleFullUpdate(); + //part.ScheduleFullUpdate(); + part.ScheduleFullUpdate(SceneObjectPartProperties.Shape); + part.ScheduleFullUpdate(SceneObjectPartProperties.MediaUrl); //not an efficient way to taint two properties, but should not have bad side effects part.TriggerScriptChangedEvent(Changed.MEDIA); @@ -499,7 +502,8 @@ namespace OpenSim.Region.CoreModules.Media.Moap UpdateMediaUrl(part, agentId); - part.ScheduleFullUpdate(); + //part.ScheduleFullUpdate(); + part.ScheduleFullUpdate(SceneObjectPartProperties.MediaUrl); part.TriggerScriptChangedEvent(Changed.MEDIA); diff --git a/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs b/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs index be399ff65b..efa58ef710 100644 --- a/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs +++ b/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs @@ -148,7 +148,8 @@ namespace OpenSim.Region.CoreModules.World.Objects.BuySell part.GetProperties(remoteClient); part.TriggerScriptChangedEvent(Changed.OWNER); group.ResumeScripts(); - part.ScheduleFullUpdate(); + //part.ScheduleFullUpdate(); + part.ScheduleFullUpdate(SceneObjectPartProperties.FullUpdate); //quite some properties changed, let's just force all to be synchronized break; diff --git a/OpenSim/Region/Framework/Interfaces/IRegionSyncModule.cs b/OpenSim/Region/Framework/Interfaces/IRegionSyncModule.cs index 812a98610d..db3fd98e7a 100755 --- a/OpenSim/Region/Framework/Interfaces/IRegionSyncModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IRegionSyncModule.cs @@ -59,7 +59,7 @@ namespace OpenSim.Region.Framework.Interfaces /// /// The mapping of a property (identified by its name) to the index of a bucket. /// - Dictionary PrimPropertyBucketMap { get; } + Dictionary PrimPropertyBucketMap { get; } /// /// The text description of the properties in each bucket, e.g. "General", "Physics" /// diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index fa81d8c290..510831d0b1 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -2197,7 +2197,8 @@ namespace OpenSim.Region.Framework.Scenes // to find out if scripts should be activated at all. group.CreateScriptInstances(param, true, DefaultScriptEngine, 3); - group.ScheduleGroupForFullUpdate(); + //group.ScheduleGroupForFullUpdate(); + group.ScheduleGroupForFullUpdate(SceneObjectPartProperties.FullUpdate); //new object, all properties have new value return group; } @@ -2262,7 +2263,8 @@ namespace OpenSim.Region.Framework.Scenes { sog.SetOwnerId(ownerID); sog.SetGroup(groupID, remoteClient); - sog.ScheduleGroupForFullUpdate(); + //sog.ScheduleGroupForFullUpdate(); + sog.ScheduleGroupForFullUpdate(SceneObjectPartProperties.OwnerID); SceneObjectPart[] partList = sog.Parts; diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs index ab567fbcb0..db8c75f1ca 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs @@ -208,11 +208,12 @@ namespace OpenSim.Region.Framework.Scenes // TODO: Make selection flagging per prim! // part.ParentGroup.IsSelected = false; - + if (part.ParentGroup.IsAttachment) isAttachment = true; else - part.ParentGroup.ScheduleGroupForFullUpdate(); + //part.ParentGroup.ScheduleGroupForFullUpdate(); + part.ParentGroup.ScheduleGroupForFullUpdate(SceneObjectPartProperties.IsSelected); // If it's not an attachment, and we are allowed to move it, // then we might have done so. If we moved across a parcel diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 282491b153..af08e7bd9c 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -2391,7 +2391,8 @@ namespace OpenSim.Region.Framework.Scenes sceneObject.SetGroup(groupID, null); } - sceneObject.ScheduleGroupForFullUpdate(); + //sceneObject.ScheduleGroupForFullUpdate(); + sceneObject.ScheduleGroupForFullUpdate(SceneObjectPartProperties.FullUpdate); //new object, all properties have new value return sceneObject; } @@ -4490,7 +4491,8 @@ namespace OpenSim.Region.Framework.Scenes { if (ent is SceneObjectGroup) { - ((SceneObjectGroup)ent).ScheduleGroupForFullUpdate(); + //((SceneObjectGroup)ent).ScheduleGroupForFullUpdate(); + ((SceneObjectGroup)ent).ScheduleGroupForFullUpdate(SceneObjectPartProperties.None); //This is not due to property being updated, hence passing "None" property. } } } diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index f43e12669f..191ca1aa55 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs @@ -383,7 +383,8 @@ namespace OpenSim.Region.Framework.Scenes sceneObject.AttachToScene(m_parentScene); if (sendClientUpdates) - sceneObject.ScheduleGroupForFullUpdate(); + //sceneObject.ScheduleGroupForFullUpdate(); + sceneObject.ScheduleGroupForFullUpdate(SceneObjectPartProperties.None); Entities.Add(sceneObject); @@ -1747,22 +1748,11 @@ namespace OpenSim.Region.Framework.Scenes } //SYMMETRIC SYNC - //set timestamp - /* - long timeStamp = DateTime.Now.Ticks; - string actorID = m_parentScene.GetSyncActorID(); - foreach (SceneObjectGroup sog in afterDelinkGroups) - { - if (m_parentScene.RegionSyncModule != null) - { - sog.SyncInfoUpdate(timeStamp, actorID); ; - } - } - * */ //Send out DelinkObject message to other actors to sychronize their object list - m_parentScene.RegionSyncModule.SendDeLinkObject(prims, beforeDelinkGroups, afterDelinkGroups); - - + if (m_parentScene.RegionSyncModule != null) + { + m_parentScene.RegionSyncModule.SendDeLinkObject(prims, beforeDelinkGroups, afterDelinkGroups); + } //Schedule updates as in legacy OpenSim code, to send updates to viewers connected to this actor (at least needed for client managers). //But timestamp won't be changed, so that when other actors get the update, they's simple ignore the updates since they already get them foreach (SceneObjectGroup sog in afterDelinkGroups) @@ -1905,7 +1895,8 @@ namespace OpenSim.Region.Framework.Scenes copy.CreateScriptInstances(0, false, m_parentScene.DefaultScriptEngine, 1); copy.HasGroupChanged = true; - copy.ScheduleGroupForFullUpdate(); + //copy.ScheduleGroupForFullUpdate(); + copy.ScheduleGroupForFullUpdate(SceneObjectPartProperties.FullUpdate); //new object, all property values are new copy.ResumeScripts(); // required for physics to update it's position @@ -1974,7 +1965,7 @@ namespace OpenSim.Region.Framework.Scenes { //if we need to debug the script engine with a viewer attaching to it, //we need to schedule updates to be sent to the viewer - oldSog.ScheduleGroupForFullUpdate(); + oldSog.ScheduleGroupForFullUpdate(SceneObjectPartProperties.None); } } else diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index fc6fa035ea..1cfb0d776c 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -1022,7 +1022,8 @@ namespace OpenSim.Region.Framework.Scenes RootPart.RemFlag(PrimFlags.TemporaryOnRez); AttachToBackup(); m_scene.EventManager.TriggerParcelPrimCountTainted(); - m_rootPart.ScheduleFullUpdate(); + //m_rootPart.ScheduleFullUpdate(); + m_rootPart.ScheduleFullUpdate(SceneObjectPartProperties.AttachmentPoint); //Physics properties, such as Position, OffsetPosition, etc, should be tainted in ApplyPhysics() m_rootPart.ClearUndoState(); } @@ -1295,7 +1296,8 @@ namespace OpenSim.Region.Framework.Scenes m_scene.RemoveGroupTarget(this); } - ScheduleGroupForFullUpdate(); + //ScheduleGroupForFullUpdate(); + ScheduleGroupForFullUpdate(SceneObjectPartProperties.Flags); } public void SetText(string text, Vector3 color, double alpha) @@ -1307,7 +1309,8 @@ namespace OpenSim.Region.Framework.Scenes Text = text; HasGroupChanged = true; - m_rootPart.ScheduleFullUpdate(); + //m_rootPart.ScheduleFullUpdate(); + m_rootPart.ScheduleFullUpdate(SceneObjectPartProperties.Text); } /// @@ -1541,7 +1544,8 @@ namespace OpenSim.Region.Framework.Scenes dupe.HasGroupChanged = true; dupe.AttachToBackup(); - ScheduleGroupForFullUpdate(); + //ScheduleGroupForFullUpdate(); + ScheduleGroupForFullUpdate(SceneObjectPartProperties.None); //This full-update is triggered by copying, no property changed } return dupe; @@ -1794,7 +1798,8 @@ namespace OpenSim.Region.Framework.Scenes ApplyNextOwnerPermissions(); } - part.ScheduleFullUpdate(); + //part.ScheduleFullUpdate(); + part.ScheduleFullUpdate(SceneObjectPartProperties.OwnerID); } /// @@ -1919,33 +1924,38 @@ namespace OpenSim.Region.Framework.Scenes /// /// Schedule a full update for this scene object /// - public void ScheduleGroupForFullUpdate() + //public void ScheduleGroupForFullUpdate() + public void ScheduleGroupForFullUpdate(SceneObjectPartProperties property) { // if (IsAttachment) // m_log.DebugFormat("[SOG]: Scheduling full update for {0} {1}", Name, LocalId); checkAtTargets(); - RootPart.ScheduleFullUpdate(); + //RootPart.ScheduleFullUpdate(); + RootPart.ScheduleFullUpdate(property); SceneObjectPart[] parts = m_parts.GetArray(); for (int i = 0; i < parts.Length; i++) { SceneObjectPart part = parts[i]; if (part != RootPart) - part.ScheduleFullUpdate(); + //part.ScheduleFullUpdate(); + part.ScheduleFullUpdate(property); } } /// /// Schedule a terse update for this scene object /// - public void ScheduleGroupForTerseUpdate() + //public void ScheduleGroupForTerseUpdate() + public void ScheduleGroupForTerseUpdate(SceneObjectPartProperties property) { // m_log.DebugFormat("[SOG]: Scheduling terse update for {0} {1}", Name, UUID); SceneObjectPart[] parts = m_parts.GetArray(); for (int i = 0; i < parts.Length; i++) - parts[i].ScheduleTerseUpdate(); + //parts[i].ScheduleTerseUpdate(); + parts[i].ScheduleTerseUpdate(property); } /// @@ -2703,7 +2713,8 @@ namespace OpenSim.Region.Framework.Scenes HasGroupChanged = true; part.TriggerScriptChangedEvent(Changed.SCALE); - ScheduleGroupForFullUpdate(); + //ScheduleGroupForFullUpdate(); + ScheduleGroupForFullUpdate(SceneObjectPartProperties.None); //above actions only update Scale for the given part, and part.Resize() will taint Scale as updated //if (part.UUID == m_rootPart.UUID) //{ @@ -2855,7 +2866,8 @@ namespace OpenSim.Region.Framework.Scenes part.StoreUndoState(); HasGroupChanged = true; m_rootPart.TriggerScriptChangedEvent(Changed.SCALE); - ScheduleGroupForTerseUpdate(); + //ScheduleGroupForTerseUpdate(); + ScheduleGroupForTerseUpdate(SceneObjectPartProperties.Scale); } } @@ -2896,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(); + //ScheduleGroupForTerseUpdate(); + ScheduleGroupForTerseUpdate(SceneObjectPartProperties.GroupPosition); } /// @@ -2959,7 +2972,8 @@ namespace OpenSim.Region.Framework.Scenes AbsolutePosition = newPos; HasGroupChanged = true; - ScheduleGroupForTerseUpdate(); + //ScheduleGroupForTerseUpdate(); + ScheduleGroupForTerseUpdate(SceneObjectPartProperties.Position); } public void OffsetForNewRegion(Vector3 offset) @@ -2991,7 +3005,8 @@ namespace OpenSim.Region.Framework.Scenes } HasGroupChanged = true; - ScheduleGroupForTerseUpdate(); + //ScheduleGroupForTerseUpdate(); + ScheduleGroupForTerseUpdate(SceneObjectPartProperties.None); //Above actions only update m_rootPart's RotationOffset, and m_rootPart.UpdateRotation will taint RotationOffset as updated } /// @@ -3017,7 +3032,8 @@ namespace OpenSim.Region.Framework.Scenes AbsolutePosition = pos; HasGroupChanged = true; - ScheduleGroupForTerseUpdate(); + //ScheduleGroupForTerseUpdate(); + ScheduleGroupForTerseUpdate(SceneObjectPartProperties.Position); //RotationOffset is only updated for m_rootPart, and m_rootPart.UpdateRotation should already taint RotationOffset as updated } /// @@ -3104,7 +3120,8 @@ namespace OpenSim.Region.Framework.Scenes Quaternion newRot = primsRot * oldParentRot; newRot *= Quaternion.Inverse(axRot); prim.RotationOffset = newRot; - prim.ScheduleTerseUpdate(); + //prim.ScheduleTerseUpdate(); + prim.ScheduleTerseUpdate(SceneObjectPartProperties.RotationOffset | SceneObjectPartProperties.OffsetPosition); } } @@ -3118,7 +3135,8 @@ namespace OpenSim.Region.Framework.Scenes } } - m_rootPart.ScheduleTerseUpdate(); + //m_rootPart.ScheduleTerseUpdate(); + m_rootPart.ScheduleTerseUpdate(SceneObjectPartProperties.RotationOffset); } #endregion diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index ffbb7d0100..3d0f9ce4c8 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -311,7 +311,8 @@ namespace OpenSim.Region.Framework.Scenes /// /// TODO - This should be an enumeration /// - private byte m_updateFlag; + //private byte m_updateFlag; + protected byte m_updateFlag; private PhysicsActor m_physActor; protected Vector3 m_acceleration; @@ -352,6 +353,7 @@ namespace OpenSim.Region.Framework.Scenes private bool m_forceMouselook; // TODO: Collision sound should have default. + //private UUID m_collisionSound; protected UUID m_collisionSound; private float m_collisionSoundVolume; @@ -2749,7 +2751,8 @@ namespace OpenSim.Region.Framework.Scenes } //m_parentGroup.RootPart.m_groupPosition = newpos; } - ScheduleTerseUpdate(); + //ScheduleTerseUpdate(); + ScheduleTerseUpdate(SceneObjectPartProperties.Position); //SendTerseUpdateToAllClients(); } @@ -2839,7 +2842,8 @@ namespace OpenSim.Region.Framework.Scenes m_shape.Scale = scale; ParentGroup.HasGroupChanged = true; - ScheduleFullUpdate(); + //ScheduleFullUpdate(); + ScheduleFullUpdate(SceneObjectPartProperties.Scale); } public void RotLookAt(Quaternion target, float strength, float damping) @@ -2881,7 +2885,8 @@ namespace OpenSim.Region.Framework.Scenes /// /// Schedules this prim for a full update /// - public void ScheduleFullUpdate() + //public void ScheduleFullUpdate() :: SYMMETRIC SYNC: changed the interface so that we can identify which property triggers calling this function + public virtual void ScheduleFullUpdate(SceneObjectPartProperties sopProperty) { // m_log.DebugFormat("[SCENE OBJECT PART]: Scheduling full update for {0} {1}", Name, LocalId); @@ -2909,20 +2914,14 @@ namespace OpenSim.Region.Framework.Scenes // m_log.DebugFormat( // "[SCENE OBJECT PART]: Scheduling full update for {0}, {1} at {2}", // UUID, Name, TimeStampFull); - - //SYMMETRIC SYNC - - //update information (timestamp, actorID, etc) needed for synchronization across copies of Scene - //SyncInfoUpdate(); - - //end of SYMMETRIC SYNC } /// /// Schedule a terse update for this prim. Terse updates only send position, /// rotation, velocity, rotational velocity and shape information. /// - public void ScheduleTerseUpdate() + //public void ScheduleTerseUpdate() + public virtual void ScheduleTerseUpdate(SceneObjectPartProperties sopProperty) { if (m_updateFlag < 1) { @@ -2937,13 +2936,6 @@ namespace OpenSim.Region.Framework.Scenes // m_log.DebugFormat( // "[SCENE OBJECT PART]: Scheduling terse update for {0}, {1} at {2}", // UUID, Name, TimeStampTerse); - - //SYMMETRIC SYNC - - //update information (timestamp, actorID, etc) needed for synchronization across copies of Scene - //SyncInfoUpdate(); - - //end of SYMMETRIC SYNC } } @@ -2981,8 +2973,7 @@ namespace OpenSim.Region.Framework.Scenes } - //public void SculptTextureCallback(UUID textureID, AssetBase texture) - public virtual void SculptTextureCallback(UUID textureID, AssetBase texture) + public void SculptTextureCallback(UUID textureID, AssetBase texture) { if (m_shape.SculptEntry) { @@ -3164,10 +3155,10 @@ namespace OpenSim.Region.Framework.Scenes ClearUpdateSchedule(); //SYMMETRIC SYNC - if (m_parentGroup.Scene.RegionSyncModule == null) - return; - m_parentGroup.Scene.RegionSyncModule.QueueSceneObjectPartForUpdate((SceneObjectPart)this); - + if (m_parentGroup.Scene.RegionSyncModule != null) + { + m_parentGroup.Scene.RegionSyncModule.QueueSceneObjectPartForUpdate((SceneObjectPart)this); + } //end of SYMMETRIC SYNC } @@ -3274,8 +3265,7 @@ namespace OpenSim.Region.Framework.Scenes }); } - //public void SetAttachmentPoint(uint AttachmentPoint) - public virtual void SetAttachmentPoint(uint AttachmentPoint) + public void SetAttachmentPoint(uint AttachmentPoint) { this.AttachmentPoint = AttachmentPoint; @@ -3291,8 +3281,7 @@ namespace OpenSim.Region.Framework.Scenes // save the attachment point. //if (AttachmentPoint != 0) //{ - m_shape.State = (byte)AttachmentPoint; - + m_shape.State = (byte)AttachmentPoint; //} } @@ -3633,14 +3622,16 @@ namespace OpenSim.Region.Framework.Scenes Text = text; ParentGroup.HasGroupChanged = true; - ScheduleFullUpdate(); + //ScheduleFullUpdate(); + ScheduleFullUpdate(SceneObjectPartProperties.Text); } public void StopLookAt() { m_parentGroup.stopLookAt(); - m_parentGroup.ScheduleGroupForTerseUpdate(); + //m_parentGroup.ScheduleGroupForTerseUpdate(); + m_parentGroup.ScheduleGroupForTerseUpdate(SceneObjectPartProperties.None);//in stopLookAt(), PhysicsActor shall already take care of tainting which properties have been updated } /// @@ -3662,7 +3653,8 @@ namespace OpenSim.Region.Framework.Scenes { m_parentGroup.stopMoveToTarget(); - m_parentGroup.ScheduleGroupForTerseUpdate(); + //m_parentGroup.ScheduleGroupForTerseUpdate(); + m_parentGroup.ScheduleGroupForTerseUpdate(SceneObjectPartProperties.None); //in stopMoveToTarget(), PhysicsActor shall already take care of tainting which properties have been updated //m_parentGroup.ScheduleGroupForFullUpdate(); } @@ -4210,8 +4202,8 @@ namespace OpenSim.Region.Framework.Scenes } ParentGroup.HasGroupChanged = true; - ScheduleFullUpdate(); - + //ScheduleFullUpdate(); + ScheduleFullUpdate(SceneObjectPartProperties.Shape); } public void UpdateGroupPosition(Vector3 pos) @@ -4222,7 +4214,8 @@ namespace OpenSim.Region.Framework.Scenes { Vector3 newPos = new Vector3(pos.X, pos.Y, pos.Z); GroupPosition = newPos; - ScheduleTerseUpdate(); + //ScheduleTerseUpdate(); + ScheduleFullUpdate(SceneObjectPartProperties.GroupPosition); } } @@ -4254,7 +4247,8 @@ namespace OpenSim.Region.Framework.Scenes } OffsetPosition = newPos; - ScheduleTerseUpdate(); + //ScheduleTerseUpdate(); + ScheduleFullUpdate(SceneObjectPartProperties.OffsetPosition); } } @@ -4543,7 +4537,8 @@ namespace OpenSim.Region.Framework.Scenes // m_log.Debug("Update: PHY:" + UsePhysics.ToString() + ", T:" + IsTemporary.ToString() + ", PHA:" + IsPhantom.ToString() + " S:" + CastsShadows.ToString()); ParentGroup.HasGroupChanged = true; - ScheduleFullUpdate(); + //ScheduleFullUpdate(); + ScheduleFullUpdate(SceneObjectPartProperties.Flags); } public void UpdateRotation(Quaternion rot) @@ -4555,7 +4550,8 @@ namespace OpenSim.Region.Framework.Scenes { RotationOffset = rot; ParentGroup.HasGroupChanged = true; - ScheduleTerseUpdate(); + //ScheduleTerseUpdate(); + ScheduleFullUpdate(SceneObjectPartProperties.RotationOffset); } } @@ -4563,8 +4559,7 @@ namespace OpenSim.Region.Framework.Scenes /// Update the shape of this part. /// /// - //public void UpdateShape(ObjectShapePacket.ObjectDataBlock shapeBlock) - public virtual void UpdateShape(ObjectShapePacket.ObjectDataBlock shapeBlock) + public void UpdateShape(ObjectShapePacket.ObjectDataBlock shapeBlock) { m_shape.PathBegin = shapeBlock.PathBegin; m_shape.PathEnd = shapeBlock.PathEnd; @@ -4601,7 +4596,8 @@ namespace OpenSim.Region.Framework.Scenes ParentGroup.HasGroupChanged = true; TriggerScriptChangedEvent(Changed.SHAPE); - ScheduleFullUpdate(); + //ScheduleFullUpdate(); + ScheduleFullUpdate(SceneObjectPartProperties.Shape); } /// @@ -4639,8 +4635,7 @@ namespace OpenSim.Region.Framework.Scenes /// Update the texture entry for this part. /// /// - //public void UpdateTextureEntry(byte[] textureEntry) - public virtual void UpdateTextureEntry(byte[] textureEntry) + public void UpdateTextureEntry(byte[] textureEntry) { m_shape.TextureEntry = textureEntry; TriggerScriptChangedEvent(Changed.TEXTURE); @@ -4649,7 +4644,8 @@ namespace OpenSim.Region.Framework.Scenes //This is madness.. //ParentGroup.ScheduleGroupForFullUpdate(); //This is sparta - ScheduleFullUpdate(); + //ScheduleFullUpdate(); + ScheduleFullUpdate(SceneObjectPartProperties.Shape); } public void aggregateScriptEvents() @@ -4717,7 +4713,8 @@ namespace OpenSim.Region.Framework.Scenes { // m_log.DebugFormat( // "[SCENE OBJECT PART]: Scheduling part {0} {1} for full update in aggregateScriptEvents() since m_parentGroup == null", Name, LocalId); - ScheduleFullUpdate(); + //ScheduleFullUpdate(); + ScheduleFullUpdate(SceneObjectPartProperties.Flags); return; } @@ -4740,7 +4737,8 @@ namespace OpenSim.Region.Framework.Scenes { // m_log.DebugFormat( // "[SCENE OBJECT PART]: Scheduling part {0} {1} for full update in aggregateScriptEvents()", Name, LocalId); - ScheduleFullUpdate(); + //ScheduleFullUpdate(); + ScheduleFullUpdate(SceneObjectPartProperties.Flags); } } @@ -4944,44 +4942,6 @@ namespace OpenSim.Region.Framework.Scenes set { m_lastUpdateTimeStamp = value; } } - - /// - /// Schedules this prim for a full update, without changing the timestamp or actorID (info on when and who modified any property). - /// NOTE: this is the same as the original SceneObjectPart.ScheduleFullUpdate(). - /// - public void ScheduleFullUpdate_SyncInfoUnchanged() - { - //m_log.DebugFormat("[SCENE OBJECT PART]: ScheduleFullUpdate_SyncInfoUnchanged for {0} {1}", Name, LocalId); - - if (m_parentGroup != null) - { - m_parentGroup.QueueForUpdateCheck(); - } - - int timeNow = Util.UnixTimeSinceEpoch(); - - // If multiple updates are scheduled on the same second, we still need to perform all of them - // So we'll force the issue by bumping up the timestamp so that later processing sees these need - // to be performed. - if (timeNow <= TimeStampFull) - { - TimeStampFull += 1; - } - else - { - TimeStampFull = (uint)timeNow; - } - - m_updateFlag = 2; - - // m_log.DebugFormat( - // "[SCENE OBJECT PART]: Scheduling full update for {0}, {1} at {2}", - // UUID, Name, TimeStampFull); - - } - - - #endregion } @@ -5037,6 +4997,164 @@ namespace OpenSim.Region.Framework.Scenes } + /* + public enum SceneObjectPartProperties:ulong + { + //Following properties copied from SceneObjectSerializer(), + AllowedDrop = (ulong) 1<<0, + CreatorID = (ulong) 1<<1, + CreatorData = (ulong) 1 <<2, + FolderID = (ulong) 1 << 3, + InventorySerial = (ulong) 1 << 4, + TaskInventory = (ulong) 1 << 5, + //UUID", + //LocalId", + Name = (ulong) 1 << 6, + Material = (ulong) 1 <<7, + PassTouches = (ulong) 1 << 8, + RegionHandle = (ulong) 1 << 9, + ScriptAccessPin = (ulong) 1 << 10, + GroupPosition = (ulong) 1 << 11, + OffsetPosition = (ulong) 1 << 12, + RotationOffset = (ulong) 1 << 13, + Velocity = (ulong) 1 << 14, + AngularVelocity = (ulong) 1 << 15, + //"Acceleration", + SOP_Acceleration = (ulong) 1 << 16, //SOP and PA read/write their own local copies of acceleration, so we distinguish the copies + Description = (ulong) 1 << 17, + Color = (ulong) 1 << 18, + Text = (ulong) 1 << 19, + SitName = (ulong) 1 << 20, + TouchName = (ulong) 1 << 21, + LinkNum = (ulong) 1 << 22, + ClickAction = (ulong) 1 << 23, + Shape = (ulong) 1 << 24, + Scale = (ulong) 1 << 25, + UpdateFlag = (ulong) 1 << 26, + SitTargetOrientation = (ulong) 1 << 27, + SitTargetPosition = (ulong) 1 << 28, + SitTargetPositionLL = (ulong) 1 << 29, + SitTargetOrientationLL = (ulong) 1 << 30, + ParentID = (ulong)1 << 31, + CreationDate = (ulong) 1 << 32, + Category = (ulong) 1 << 33, + SalePrice = (ulong) 1 << 34, + ObjectSaleType = (ulong) 1 << 35, + OwnershipCost = (ulong) 1 << 36, + GroupID = (ulong) 1 << 37, + OwnerID = (ulong) 1 << 38, + LastOwnerID = (ulong) 1 << 39, + BaseMask = (ulong) 1 << 40, + OwnerMask = (ulong) 1 << 41, + GroupMask = (ulong) 1 << 42, + EveryoneMask = (ulong) 1 << 43, + NextOwnerMask = (ulong) 1 << 44, + Flags = (ulong) 1 << 45, + CollisionSound = (ulong) 1 << 46, + CollisionSoundVolume = (ulong) 1 << 47, + MediaUrl = (ulong) 1 << 48, + TextureAnimation = (ulong) 1 << 49, + ParticleSystem = (ulong) 1 << 50, + //Property names below copied from PhysicsActor, they are necessary in synchronization, but not covered the above properties + //Physics properties "Velocity" is covered above + Position = (ulong) 1 << 51, + Size = (ulong) 1 << 52, + Force = (ulong) 1 << 53, + RotationalVelocity = (ulong) 1 << 54, + PA_Acceleration = (ulong) 1 << 55, + Torque = (ulong) 1 << 56, + Orientation = (ulong) 1 << 57, + IsPhysical = (ulong) 1 << 58, + Flying = (ulong) 1 << 59, + Buoyancy = (ulong) 1 << 60, + //To be handled + AttachmentPoint = (ulong)1 << 61, + FullUpdate = UInt64.MaxValue + } + */ + + public enum SceneObjectPartProperties + { + None, + //Following properties copied from SceneObjectSerializer(), + AllowedDrop , + CreatorID , + CreatorData , + FolderID , + InventorySerial, + TaskInventory, + //UUID", + //LocalId", + Name, + Material, + PassTouches, + RegionHandle, + ScriptAccessPin, + GroupPosition, + OffsetPosition, + RotationOffset, + Velocity, + AngularVelocity, + //"Acceleration", + SOP_Acceleration, //SOP and PA read/write their own local copies of acceleration, so we distinguish the copies + Description, + Color, + Text, + SitName, + TouchName, + LinkNum, + ClickAction, + Shape, + Scale, + UpdateFlag, + SitTargetOrientation, + SitTargetPosition, + SitTargetPositionLL, + SitTargetOrientationLL, + ParentID, + CreationDate, + Category, + SalePrice, + ObjectSaleType, + OwnershipCost, + GroupID, + OwnerID, + LastOwnerID, + BaseMask, + OwnerMask, + GroupMask, + EveryoneMask, + NextOwnerMask, + Flags, + CollisionSound, + CollisionSoundVolume, + MediaUrl, + TextureAnimation, + ParticleSystem, + //Property names below copied from PhysicsActor, they are necessary in synchronization, but not covered the above properties + //Physics properties "Velocity" is covered above + Position, + Size, + Force, + RotationalVelocity, + PA_Acceleration, + Torque, + Orientation, + IsPhysical, + Flying, + Buoyancy, + //To be handled in serialization/deserizaltion for synchronization + IsSelected, + AttachmentPoint, + AttachedPos, + Sound, //This indicates any Sound related property has changed: Sound, SoundGain, SoundFlags,SoundRadius, + //Addition properties to be added here + + //Client Manager may want to add some property here that viewers care about and should be synchronized across actors + + FullUpdate, + } + public class SceneObjectPart : SceneObjectPartBase { @@ -5064,10 +5182,8 @@ namespace OpenSim.Region.Framework.Scenes //TODO: serialization and deserialization processors to be added in SceneObjectSerializer //The following variables are initialized when RegionSyncModule reads the config file for mapping of properties and buckets - private static Dictionary m_primPropertyBucketMap = null; + private static Dictionary m_primPropertyBucketMap = null; private static List m_propertyBucketNames = null; - //private static List m_bucketUpdateLocks = null; - private static Dictionary m_bucketUpdateLocks = new Dictionary(); private static string m_localActorID = ""; //private static int m_bucketCount = 0; @@ -5076,6 +5192,8 @@ namespace OpenSim.Region.Framework.Scenes //private static Dictionary m_bucketUpdateProcessors = new Dictionary(); private Dictionary m_bucketUpdateProcessors = new Dictionary(); + private Dictionary m_bucketUpdateLocks = new Dictionary(); + private Dictionary m_bucketSyncTainted = new Dictionary(); //Define this as a guard to not to fill in any sync info when not desired, i.e. while de-serializing and building SOP and SOG, where //property set functions will be called and might trigger UpdateBucketSyncInfo() if not guarded carefully. @@ -5084,6 +5202,7 @@ namespace OpenSim.Region.Framework.Scenes //The list of each prim's properties. This is the list of properties that matter in synchronizing prim copies on different actors. //This list is created based on properties included in the serialization/deserialization process (see SceneObjectSerializer()) and the //properties Physics Engine needs to synchronize to other actors. + /* public static List PropertyList = new List() { //Following properties copied from SceneObjectSerializer() @@ -5154,9 +5273,10 @@ namespace OpenSim.Region.Framework.Scenes "Flying", "Buoyancy", }; - + * */ - public static void InitializePropertyBucketInfo(Dictionary propertyBucketMap, List bucketNames, string actorID) + + public static void InitializePropertyBucketInfo(Dictionary propertyBucketMap, List bucketNames, string actorID) { m_primPropertyBucketMap = propertyBucketMap; m_propertyBucketNames = bucketNames; @@ -5202,51 +5322,18 @@ namespace OpenSim.Region.Framework.Scenes } } - /// - /// Update the properties of this SOP with the values in updatedPart. - /// - /// - /// - private void GeneralBucketUpdateProcessor(SceneObjectPart updatedPart, string bucketName) { - //NOTE!!!!!!!! Need to cast the local copy to SceneObjectPartBase in order not to trigger UpdateBucketSyncInfo(), - //since the property updates inside this function are not due to local operations. - SceneObjectPartBase localPart = (SceneObjectPartBase)this; - lock (m_bucketUpdateLocks[bucketName]) { - localPart.AllowedDrop = updatedPart.AllowedDrop; - localPart.Shape = updatedPart.Shape; - - bool collisionSoundUpdated = UpdateCollisionSound(updatedPart.CollisionSound); - - - m_bucketSyncInfoList[bucketName].LastUpdateTimeStamp = updatedPart.BucketSyncInfoList[bucketName].LastUpdateTimeStamp; - m_bucketSyncInfoList[bucketName].LastUpdateActorID = updatedPart.BucketSyncInfoList[bucketName].LastUpdateActorID; - - if (collisionSoundUpdated) - { - //If the local actor is Script Engine, it will catch this evnet and trigger aggregateScriptEvents() - m_parentGroup.Scene.EventManager.TriggerAggregateScriptEvents(this); - } } } private void PhysicsBucketUpdateProcessor(SceneObjectPart updatedPart, string bucketName) { - //NOTE!!!!!!!! Need to cast the local copy to SceneObjectPartBase in order not to trigger UpdateBucketSyncInfo(), - //since the property updates inside this function are not due to local operations. - SceneObjectPartBase localPart = (SceneObjectPartBase)this; - lock (m_bucketUpdateLocks[bucketName]) { - localPart.GroupPosition = updatedPart.GroupPosition; - - m_bucketSyncInfoList[bucketName].LastUpdateTimeStamp = updatedPart.BucketSyncInfoList[bucketName].LastUpdateTimeStamp; - m_bucketSyncInfoList[bucketName].LastUpdateActorID = updatedPart.BucketSyncInfoList[bucketName].LastUpdateActorID; - } } @@ -5279,6 +5366,10 @@ namespace OpenSim.Region.Framework.Scenes { m_bucketUpdateLocks.Add(bucketName, new Object()); } + if (!m_bucketSyncTainted.ContainsKey(bucketName)) + { + m_bucketSyncTainted.Add(bucketName, false); + } } if (!m_BucketUpdateProcessorRegistered) @@ -5290,16 +5381,59 @@ namespace OpenSim.Region.Framework.Scenes m_syncEnabled = true; } + //For tainitng and clearing taints, do i need to lock on m_bucketSyncTaint? + public void TaintBucketSyncInfo(SceneObjectPartProperties property) + { + if (m_syncEnabled && m_bucketSyncTainted.Count > 0) + { + string bucketName = m_primPropertyBucketMap[property]; + m_bucketSyncTainted[bucketName] = true; + } + } + + /* + public void ClearBucketTaint() + { + if (m_syncEnabled && m_bucketSyncTainted.Count > 0) + { + foreach (KeyValuePair pair in m_bucketSyncTainted) + { + pair.Value = false; + } + } + } + * */ + + /// + /// Update the timestamp information of each property bucket, and clear out the taint on each bucket. + /// + public void UpdateTaintedBucketSyncInfo() + { + if (m_syncEnabled) + { + long timeStamp = DateTime.Now.Ticks; + foreach (KeyValuePair pair in m_bucketSyncInfoList) + { + string bucketName = pair.Key; + if (m_bucketSyncTainted[bucketName]) + { + m_bucketSyncInfoList[bucketName].UpdateSyncInfo(timeStamp, m_localActorID); + m_bucketSyncTainted[bucketName] = false; + } + } + } + } + /// /// Update the timestamp and actorID information of the bucket the given property belongs to. /// /// Name of the property. Make sure the spelling is consistent with what are defined in PropertyList - public void UpdateBucketSyncInfo(string propertyName) + public void UpdateBucketSyncInfo(SceneObjectPartProperties property) { if (m_syncEnabled && m_bucketSyncInfoList != null && m_bucketSyncInfoList.Count > 0) { //int bucketIndex = m_primPropertyBucketMap[propertyName]; - string bucketName = m_primPropertyBucketMap[propertyName]; + string bucketName = m_primPropertyBucketMap[property]; long timeStamp = DateTime.Now.Ticks; if (m_bucketSyncInfoList.ContainsKey(bucketName)) { @@ -5312,7 +5446,7 @@ namespace OpenSim.Region.Framework.Scenes } } - + public Scene.ObjectUpdateResult UpdateAllProperties(SceneObjectPart updatedPart) { @@ -5371,95 +5505,53 @@ namespace OpenSim.Region.Framework.Scenes } - #region new property access functions - //(only properties relevant for synchronization purpose are implemented here) - - new public bool AllowedDrop + public override void ScheduleFullUpdate(SceneObjectPartProperties property) { - get { return base.AllowedDrop; } - set - { - base.AllowedDrop = value; - UpdateBucketSyncInfo("AllowedDrop"); - } + base.ScheduleFullUpdate(property); + TaintBucketSyncInfo(property); + } + + public override void ScheduleTerseUpdate(SceneObjectPartProperties property) + { + base.ScheduleTerseUpdate(property); + TaintBucketSyncInfo(property); } /// - /// The position of the entire group that this prim belongs to. + /// Schedules this prim for a full update, without changing the timestamp or actorID (info on when and who modified any property). + /// NOTE: this is the same as the original SceneObjectPart.ScheduleFullUpdate(). /// - new public Vector3 GroupPosition + public void ScheduleFullUpdate_SyncInfoUnchanged() { - get { return base.GroupPosition; } - set + //m_log.DebugFormat("[SCENE OBJECT PART]: ScheduleFullUpdate_SyncInfoUnchanged for {0} {1}", Name, LocalId); + + if (m_parentGroup != null) { - base.GroupPosition = value; - UpdateBucketSyncInfo("GroupPosition"); + m_parentGroup.QueueForUpdateCheck(); } - } - new public Vector3 OffsetPosition - { - get { return base.OffsetPosition; } - set + int timeNow = Util.UnixTimeSinceEpoch(); + + // If multiple updates are scheduled on the same second, we still need to perform all of them + // So we'll force the issue by bumping up the timestamp so that later processing sees these need + // to be performed. + if (timeNow <= TimeStampFull) { - base.OffsetPosition = value; - UpdateBucketSyncInfo("OffsetPosition"); + TimeStampFull += 1; } - } - - - - new public PrimitiveBaseShape Shape - { - get { return base.Shape; } - set + else { - base.Shape = value; - UpdateBucketSyncInfo("Shape"); + TimeStampFull = (uint)timeNow; } + + m_updateFlag = 2; + + // m_log.DebugFormat( + // "[SCENE OBJECT PART]: Scheduling full update for {0}, {1} at {2}", + // UUID, Name, TimeStampFull); + } - //For functions that update SOP properties, override them so that when they are called from SOPBase (but the object itself is an instance of SOP) - //the following implementations will be called instead of the same name functions in SOPBase. - public override void SculptTextureCallback(UUID textureID, AssetBase texture) - { - base.SculptTextureCallback(textureID, texture); - UpdateBucketSyncInfo("Shape"); - } - - public override void SetAttachmentPoint(uint AttachmentPoint) - { - base.SetAttachmentPoint(AttachmentPoint); - UpdateBucketSyncInfo("Shape"); - } - - public void UpdateExtraParam(ushort type, bool inUse, byte[] data) - { - base.UpdateExtraParam(type, inUse, data); - UpdateBucketSyncInfo("Shape"); - } - - public override void UpdateShape(ObjectShapePacket.ObjectDataBlock shapeBlock) - { - base.UpdateShape(shapeBlock); - UpdateBucketSyncInfo("Shape"); - } - - public override void UpdateTextureEntry(byte[] textureEntry) - { - base.UpdateTextureEntry(textureEntry); - UpdateBucketSyncInfo("Shape"); - } - - public override void Resize(Vector3 scale) - { - base.Resize(scale); - UpdateBucketSyncInfo("Scale"); - } - - #endregion //new property access functions - - private bool UpdateCollisionSound(UUID updatedCollisionSound) { if (this.CollisionSound != updatedCollisionSound) @@ -5469,7 +5561,6 @@ namespace OpenSim.Region.Framework.Scenes } return false; } - } //end of SYMMETRIC SYNC diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 1d1e66c826..f8509dd017 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -294,7 +294,7 @@ namespace OpenSim.Region.Framework.Scenes m_part.ParentGroup.Scene.EventManager.TriggerRezScript( m_part.LocalId, item.ItemID, String.Empty, startParam, postOnRez, engine, stateSource); m_part.ParentGroup.AddActiveScriptCount(1); - m_part.ScheduleFullUpdate(); + m_part.ScheduleFullUpdate(SceneObjectPartProperties.Flags | SceneObjectPartProperties.TaskInventory); return; } @@ -322,7 +322,7 @@ namespace OpenSim.Region.Framework.Scenes m_part.ParentGroup.Scene.EventManager.TriggerRezScript( m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource); m_part.ParentGroup.AddActiveScriptCount(1); - m_part.ScheduleFullUpdate(); + m_part.ScheduleFullUpdate(SceneObjectPartProperties.Flags | SceneObjectPartProperties.TaskInventory); } } } @@ -546,7 +546,7 @@ namespace OpenSim.Region.Framework.Scenes m_part.ParentGroup.HasGroupChanged = true; //SYMMETRIC SYNC: add ScheduleFullUpdate to enable synchronization across actors - m_part.ScheduleFullUpdate(); + m_part.ScheduleFullUpdate(SceneObjectPartProperties.TaskInventory | SceneObjectPartProperties.InventorySerial); } /// @@ -766,7 +766,7 @@ namespace OpenSim.Region.Framework.Scenes if (!ContainsScripts()) m_part.RemFlag(PrimFlags.Scripted); - m_part.ScheduleFullUpdate(); + m_part.ScheduleFullUpdate(SceneObjectPartProperties.TaskInventory); return type; diff --git a/OpenSim/Region/Framework/Scenes/UndoState.cs b/OpenSim/Region/Framework/Scenes/UndoState.cs index 55e407ec5f..f325699d7c 100644 --- a/OpenSim/Region/Framework/Scenes/UndoState.cs +++ b/OpenSim/Region/Framework/Scenes/UndoState.cs @@ -91,7 +91,8 @@ namespace OpenSim.Region.Framework.Scenes part.RotationOffset = Rotation; if (Scale != Vector3.Zero) part.Resize(Scale); - part.ParentGroup.ScheduleGroupForTerseUpdate(); + //part.ParentGroup.ScheduleGroupForTerseUpdate(); + part.ParentGroup.ScheduleGroupForTerseUpdate(SceneObjectPartProperties.Scale); } else { @@ -99,7 +100,8 @@ namespace OpenSim.Region.Framework.Scenes part.OffsetPosition = Position; part.UpdateRotation(Rotation); if (Scale != Vector3.Zero) - part.Resize(Scale); part.ScheduleTerseUpdate(); + part.Resize(Scale); //part.ScheduleTerseUpdate(); + part.ScheduleTerseUpdate(SceneObjectPartProperties.Scale); } part.Undoing = false; @@ -119,7 +121,8 @@ namespace OpenSim.Region.Framework.Scenes part.UpdateRotation(Rotation); if (Scale != Vector3.Zero) part.Resize(Scale); - part.ParentGroup.ScheduleGroupForTerseUpdate(); + //part.ParentGroup.ScheduleGroupForTerseUpdate(); + part.ParentGroup.ScheduleGroupForTerseUpdate(SceneObjectPartProperties.Scale); } else { @@ -129,7 +132,9 @@ namespace OpenSim.Region.Framework.Scenes part.UpdateRotation(Rotation); if (Scale != Vector3.Zero) part.Resize(Scale); - part.ScheduleTerseUpdate(); + //part.ScheduleTerseUpdate(); + part.ScheduleTerseUpdate(SceneObjectPartProperties.Scale); + } part.Undoing = false; diff --git a/OpenSim/Region/OptionalModules/ContentManagementSystem/CMModel.cs b/OpenSim/Region/OptionalModules/ContentManagementSystem/CMModel.cs index 3a6996ef9b..f3847c2bd7 100644 --- a/OpenSim/Region/OptionalModules/ContentManagementSystem/CMModel.cs +++ b/OpenSim/Region/OptionalModules/ContentManagementSystem/CMModel.cs @@ -290,7 +290,8 @@ namespace OpenSim.Region.OptionalModules.ContentManagement ((SceneObjectGroup)ent).ApplyPhysics(true); ((SceneObjectGroup)ent).AttachToBackup(); ((SceneObjectGroup)ent).HasGroupChanged = true; // If not true, then attaching to backup does nothing because no change is detected. - ((SceneObjectGroup)ent).ScheduleGroupForFullUpdate(); + //((SceneObjectGroup)ent).ScheduleGroupForFullUpdate(); + ((SceneObjectGroup)ent).ScheduleGroupForFullUpdate(SceneObjectPartProperties.FullUpdate); //don't know what properties to taint, so just taint all } catch(Exception e) { diff --git a/OpenSim/Region/OptionalModules/World/TreePopulator/TreePopulatorModule.cs b/OpenSim/Region/OptionalModules/World/TreePopulator/TreePopulatorModule.cs index 421da3664a..5baf903d6e 100644 --- a/OpenSim/Region/OptionalModules/World/TreePopulator/TreePopulatorModule.cs +++ b/OpenSim/Region/OptionalModules/World/TreePopulator/TreePopulatorModule.cs @@ -640,7 +640,8 @@ namespace OpenSim.Region.OptionalModules.World.TreePopulator { s_tree.Scale += copse.m_rate; s_tree.ParentGroup.HasGroupChanged = true; - s_tree.ScheduleFullUpdate(); + //s_tree.ScheduleFullUpdate(); + s_tree.ScheduleFullUpdate(SceneObjectPartProperties.Scale); } } else diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index f713cfa5f4..9fe925a282 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -1411,7 +1411,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_host.AddScriptLPS(1); m_host.ClickAction = (byte)action; if (m_host.ParentGroup != null) m_host.ParentGroup.HasGroupChanged = true; - m_host.ScheduleFullUpdate(); + //m_host.ScheduleFullUpdate(); + m_host.ScheduleFullUpdate(SceneObjectPartProperties.ClickAction); return; } @@ -1679,7 +1680,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } part.ParentGroup.HasGroupChanged = true; - part.ScheduleFullUpdate(); + //part.ScheduleFullUpdate(); + part.ScheduleFullUpdate(SceneObjectPartProperties.Shape); } /// @@ -1714,7 +1716,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } part.ParentGroup.HasGroupChanged = true; - part.ScheduleFullUpdate(); + //part.ScheduleFullUpdate(); + part.ScheduleFullUpdate(SceneObjectPartProperties.Shape); } public LSL_Vector llGetColor(int face) @@ -1982,40 +1985,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api targetPos.z = ground; SceneObjectGroup parent = part.ParentGroup; LSL_Vector real_vec = SetPosAdjust(currentPos, targetPos); - //KittyL: edited below - if ((World.ScriptEngineToSceneConnectorModule == null)) - { - parent.UpdateGroupPosition(new Vector3((float)real_vec.x, (float)real_vec.y, (float)real_vec.z)); - } - else - { - object[] valParams = new object[1]; - Vector3 pos = new Vector3((float)real_vec.x, (float)real_vec.y, (float)real_vec.z); - valParams[0] = (Vector3)pos; - World.ScriptEngineToSceneConnectorModule.SendSetPrimProperties(m_host.ParentGroup.LocX, m_host.ParentGroup.LocY, m_host.UUID, "pos", (object)valParams); - } + parent.UpdateGroupPosition(new Vector3((float)real_vec.x, (float)real_vec.y, (float)real_vec.z)); } else { LSL_Vector rel_vec = SetPosAdjust(currentPos, targetPos); - - //KittyL: edited below - if ((World.ScriptEngineToSceneConnectorModule == null)) - { - part.OffsetPosition = new Vector3((float)rel_vec.x, (float)rel_vec.y, (float)rel_vec.z); - SceneObjectGroup parent = part.ParentGroup; - parent.HasGroupChanged = true; - parent.ScheduleGroupForTerseUpdate(); - } - else - { - object[] valParams = new object[3]; - valParams[0] = (object)rel_vec.x; - valParams[1] = (object)rel_vec.y; - valParams[2] = (object)rel_vec.z; - World.ScriptEngineToSceneConnectorModule.SendSetPrimProperties(m_host.ParentGroup.LocX, m_host.ParentGroup.LocY, m_host.UUID, "pos", (object)valParams); - } - + part.OffsetPosition = new Vector3((float)rel_vec.x, (float)rel_vec.y, (float)rel_vec.z); + SceneObjectGroup parent = part.ParentGroup; + parent.HasGroupChanged = true; + //parent.ScheduleGroupForTerseUpdate(); + parent.ScheduleGroupForTerseUpdate(SceneObjectPartProperties.OffsetPosition); } } @@ -2361,7 +2340,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_host.SoundFlags = 1; // looping m_host.SoundRadius = 20; // Magic number, 20 seems reasonable. Make configurable? - m_host.ScheduleFullUpdate(); + //m_host.ScheduleFullUpdate(); + m_host.ScheduleFullUpdate(SceneObjectPartProperties.Sound); m_host.SendFullUpdateToAllClients(); } @@ -2381,7 +2361,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api prim.SoundFlags = 1; // looping prim.SoundRadius = 20; // Magic number, 20 seems reasonable. Make configurable? - prim.ScheduleFullUpdate(); + //prim.ScheduleFullUpdate(); + m_host.ScheduleFullUpdate(SceneObjectPartProperties.Sound); prim.SendFullUpdateToAllClients(); } } @@ -2393,7 +2374,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_host.SoundFlags = 1; // looping m_host.SoundRadius = 20; // Magic number, 20 seems reasonable. Make configurable? - m_host.ScheduleFullUpdate(); + //m_host.ScheduleFullUpdate(); + m_host.ScheduleFullUpdate(SceneObjectPartProperties.Sound); m_host.SendFullUpdateToAllClients(); } @@ -2435,7 +2417,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api part.SoundGain = 0; part.SoundFlags = 0; part.SoundRadius = 0; - part.ScheduleFullUpdate(); + //part.ScheduleFullUpdate(); + m_host.ScheduleFullUpdate(SceneObjectPartProperties.Sound); part.SendFullUpdateToAllClients(); } m_host.ParentGroup.LoopSoundMasterPrim = null; @@ -2447,7 +2430,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_host.SoundGain = 0; m_host.SoundFlags = 0; m_host.SoundRadius = 0; - m_host.ScheduleFullUpdate(); + //m_host.ScheduleFullUpdate(); + m_host.ScheduleFullUpdate(SceneObjectPartProperties.Sound); m_host.SendFullUpdateToAllClients(); } } @@ -2457,7 +2441,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_host.SoundGain = 0; m_host.SoundFlags = 0; m_host.SoundRadius = 0; - m_host.ScheduleFullUpdate(); + //m_host.ScheduleFullUpdate(); + m_host.ScheduleFullUpdate(SceneObjectPartProperties.Sound); m_host.SendFullUpdateToAllClients(); } } @@ -3384,7 +3369,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); m_host.AngularVelocity = new Vector3((float)(axis.x * spinrate), (float)(axis.y * spinrate), (float)(axis.z * spinrate)); - m_host.ScheduleTerseUpdate(); + //m_host.ScheduleTerseUpdate(); + m_host.ScheduleFullUpdate(SceneObjectPartProperties.AngularVelocity); m_host.SendTerseUpdateToAllClients(); m_host.ParentGroup.HasGroupChanged = true; } @@ -3664,7 +3650,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api parentPrim.TriggerScriptChangedEvent(Changed.LINK); parentPrim.RootPart.CreateSelected = true; parentPrim.HasGroupChanged = true; - parentPrim.ScheduleGroupForFullUpdate(); + //parentPrim.ScheduleGroupForFullUpdate(); + //SYMMETRIC SYNC + //Schedule a LinkObject message for synchronization purpose. This will lead to enqueue a LinkObject message in SyncConnector's outgoingQueue, + //so should return quickly. + if (World.RegionSyncModule != null) + { + //Tell other actors to link the SceneObjectParts together as a new group. + //parentGroup.SyncInfoUpdate(); + World.RegionSyncModule.SendLinkObject(parentPrim, parentPrim.RootPart, new List(childPrim.Parts)); + } + m_host.ScheduleFullUpdate(SceneObjectPartProperties.None); //SendLinkObject above will synchronize the link operation, no need to taint updates here + //end of SYMMETRIC SYNC if (client != null) parentPrim.GetProperties(client); @@ -3722,15 +3719,31 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (linknum == ScriptBaseClass.LINK_ROOT) { + //SYMMETRIC SYNC + List beforeDelinkGroups = new List(); + beforeDelinkGroups.Add(parentPrim); + List afterDelinkGroups = new List(); + //end of SYMMETRIC SYNC + // Restructuring Multiple Prims. List parts = new List(parentPrim.Parts); parts.Remove(parentPrim.RootPart); foreach (SceneObjectPart part in parts) { parentPrim.DelinkFromGroup(part.LocalId, true); + //SYMMETRIC SYNC + afterDelinkGroups.Add(part.ParentGroup); } parentPrim.HasGroupChanged = true; - parentPrim.ScheduleGroupForFullUpdate(); + //parentPrim.ScheduleGroupForFullUpdate(); + //SYMMETRIC SYNC + //Send out DelinkObject message to other actors to sychronize their object list + if (World.RegionSyncModule != null) + { + World.RegionSyncModule.SendDeLinkObject(parts, beforeDelinkGroups, afterDelinkGroups); + } + parentPrim.ScheduleGroupForFullUpdate(SceneObjectPartProperties.None); + //end of SYMMETRIC SYNC parentPrim.TriggerScriptChangedEvent(Changed.LINK); if (parts.Count > 0) @@ -3743,7 +3756,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api newRoot.ParentGroup.LinkToGroup(part.ParentGroup); } newRoot.ParentGroup.HasGroupChanged = true; - newRoot.ParentGroup.ScheduleGroupForFullUpdate(); + //newRoot.ParentGroup.ScheduleGroupForFullUpdate(); + //SYMMETRIC SYNC + if (World.RegionSyncModule != null) + { + World.RegionSyncModule.SendLinkObject(newRoot.ParentGroup, newRoot, new List(newRoot.ParentGroup.Parts)); + } + newRoot.ParentGroup.ScheduleGroupForFullUpdate(SceneObjectPartProperties.None); + //end of SYMMETRIC SYNC + } } else @@ -3753,7 +3774,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api parentPrim.DelinkFromGroup(childPrim.LocalId, true); parentPrim.HasGroupChanged = true; - parentPrim.ScheduleGroupForFullUpdate(); + //parentPrim.ScheduleGroupForFullUpdate(); + //SYMMETRIC SYNC + //Send out DelinkObject message to other actors to sychronize their object list + if (World.RegionSyncModule != null) + { + List beforeDelinkGroups = new List(); + beforeDelinkGroups.Add(parentPrim); + List afterDelinkGroups = new List(); + afterDelinkGroups.Add(childPrim.ParentGroup); + World.RegionSyncModule.SendDeLinkObject(new List(parentPrim.Parts), beforeDelinkGroups, afterDelinkGroups); + } + //end of SYMMETRIC SYNC + parentPrim.TriggerScriptChangedEvent(Changed.LINK); } } @@ -3765,6 +3798,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (parentPrim.RootPart.AttachmentPoint != 0) return; // Fail silently if attached + //SYMMETRIC SYNC + List beforeDelinkGroups = new List(); + beforeDelinkGroups.Add(parentPrim); + List afterDelinkGroups = new List(); + SceneObjectPart rootPart = parentPrim.RootPart; + //end of SYMMETRIC SYNC + List parts = new List(parentPrim.Parts); parts.Remove(parentPrim.RootPart); @@ -3772,9 +3812,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { parentPrim.DelinkFromGroup(part.LocalId, true); parentPrim.TriggerScriptChangedEvent(Changed.LINK); + //SYMMETRIC SYNC + afterDelinkGroups.Add(part.ParentGroup); } parentPrim.HasGroupChanged = true; - parentPrim.ScheduleGroupForFullUpdate(); + //parentPrim.ScheduleGroupForFullUpdate(); + //SYMMETRIC SYNC + if (World.RegionSyncModule != null) + { + parts.Add(rootPart); + afterDelinkGroups.Add(rootPart.ParentGroup); + World.RegionSyncModule.SendDeLinkObject(parts, beforeDelinkGroups, afterDelinkGroups); + } + parentPrim.ScheduleGroupForFullUpdate(SceneObjectPartProperties.None); + //end of SYMMETRIC SYNC } public LSL_String llGetLinkKey(int linknum) @@ -4012,7 +4063,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api Util.Clip((float)color.z, 0.0f, 1.0f)); m_host.SetText(text, av3, Util.Clip((float)alpha, 0.0f, 1.0f)); m_host.ParentGroup.HasGroupChanged = true; - m_host.ParentGroup.ScheduleGroupForFullUpdate(); + //m_host.ParentGroup.ScheduleGroupForFullUpdate(); + m_host.ParentGroup.ScheduleGroupForFullUpdate(SceneObjectPartProperties.Text); } public LSL_Float llWater(LSL_Vector offset) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index c0c790dd28..6bf95bf1e5 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -2349,7 +2349,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api obj.ParentGroup.HasGroupChanged = true; - obj.ScheduleFullUpdate(); + //obj.ScheduleFullUpdate(); + obj.ScheduleFullUpdate(SceneObjectPartProperties.Shape); }