diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs index 5ee27bff5f..5fb8fdc49b 100644 --- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs +++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs @@ -296,21 +296,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule { if (primUpdates.ContainsKey(bucketName) && primUpdates[bucketName].Count > 0) { - /* - foreach (SceneObjectGroup sog in primUpdates[bucketName]) - { - - //If this is a relay node, or at least one part of the object has the last update caused by this actor, then send the update - sog.UpdateTaintedBucketSyncInfo(timeStamp); - if (m_isSyncRelay || (!sog.IsDeleted && CheckObjectForSendingUpdate(sog))) - { - //send - string sogxml = SceneObjectSerializer.ToXml2Format(sog); - SymmetricSyncMessage syncMsg = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.UpdatedObject, sogxml); - SendObjectUpdateToRelevantSyncConnectors(sog, syncMsg); - } - } - * */ //m_log.Debug(LogHeader + " calling update sender for bucket " + bucketName); m_primUpdatesPerBucketSender[bucketName](bucketName, primUpdates[bucketName]); } @@ -399,9 +384,23 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule } //m_log.DebugFormat(LogHeader + "SendNewObject called for object {0}, {1}", sog.Name, sog.UUID); + //This is a new object (newly rezzed). Send out updates for all properties. + //For now, a complete list of object properties include properties + //in its xml serialization, plus the set of Physics properties as in Physics bucket + OSDMap data = new OSDMap(); string sogxml = SceneObjectSerializer.ToXml2Format(sog); - SymmetricSyncMessage rsm = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.NewObject, sogxml); - SendObjectUpdateToRelevantSyncConnectors(sog, rsm); + data["sogxml"] = OSD.FromString(sogxml); + OSDArray partArray = new OSDArray(); + foreach (SceneObjectPart part in sog.Parts){ + OSDMap partData = PhysicsBucketPropertiesEncoder(m_physicsBucketName, part); + partArray.Add(partData); + } + data["partPhysicsProperties"] = partArray; + //string sogxml = SceneObjectSerializer.ToXml2Format(sog); + SymmetricSyncMessage rsm = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.NewObject, OSDParser.SerializeJsonString(data)); + + //SendObjectUpdateToRelevantSyncConnectors(sog, rsm); + SendSceneEventToRelevantSyncConnectors(m_actorID, rsm, sog); } /// @@ -433,7 +432,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule data["softDelete"] = OSD.FromBoolean(softDelete); SymmetricSyncMessage rsm = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.RemovedObject, OSDParser.SerializeJsonString(data)); - SendObjectUpdateToRelevantSyncConnectors(sog, rsm); + //SendObjectUpdateToRelevantSyncConnectors(sog, rsm); + SendSceneEventToRelevantSyncConnectors(m_actorID, rsm, sog); } @@ -461,13 +461,16 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule string partTempID = "part"+partNum; data[partTempID] = OSD.FromUUID(part.UUID); partNum++; + + m_log.Debug("SendLinkObject to link " + part.ParentGroup.Name + "," + part.UUID + " with " + root.Name+","+root.UUID); } - m_log.Debug(LogHeader + " to SendLinkObject to link " + children.Count + " parts to " + root.Name); - m_log.Debug("LinkedObject: "+sogxml); + m_log.Debug(LogHeader + " to SendLinkObject to link " + children.Count + " parts to " + root.Name + "," + root.UUID); + //m_log.Debug("LinkedObject: "+sogxml); SymmetricSyncMessage rsm = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.LinkObject, OSDParser.SerializeJsonString(data)); - SendObjectUpdateToRelevantSyncConnectors(linkedGroup, rsm); + //SendObjectUpdateToRelevantSyncConnectors(linkedGroup, rsm); + SendSceneEventToRelevantSyncConnectors(m_actorID, rsm, linkedGroup); } public void SendDeLinkObject(List prims, List beforeDelinkGroups, List afterDelinkGroups) @@ -718,8 +721,20 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule private delegate void PrimUpdatePerBucketSender(string bucketName, List primUpdates); private Dictionary m_primUpdatesPerBucketSender = new Dictionary(); - //Timestamps that record the last time each any updates have been sent out for a given bucket - private Dictionary m_lastUpdateSentTime = new Dictionary(); + + /* + //The functions that encode properties in each bucket. For now, + //general bucket works on SOG, physics bucket works on SOP, so we define + //the arg to be of type Object to be general in the interface. + //TO DO: redesign the interface once the bucket encoders working on more + //consistent/specific arguments. + private delegate string UpdatePerBucketEncoder(string bucketName, Object arg); + private Dictionary m_updatePerBucketEncoder = new Dictionary(); + + //Decoders of properties in each bucket + private delegate void UpdatePerBucketDecoder(string bucketName, string encoding, out Object outData); + private Dictionary m_updatePerBucketDecoder = new Dictionary(); + * */ private object m_updateScenePresenceLock = new object(); private Dictionary m_presenceUpdates = new Dictionary(); @@ -756,8 +771,19 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule foreach (SceneObjectGroup sog in updatedObjects.Values) { sog.UpdateTaintedBucketSyncInfo(bucketName, timeStamp); //this update the timestamp and clear the taint info of the bucket - string sogxml = SceneObjectSerializer.ToXml2Format(sog); - SymmetricSyncMessage syncMsg = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.UpdatedObject, sogxml); + string sogGeneralBucketEncoding = SceneObjectSerializer.ToXml2Format(sog); + //string sogGeneralBucketEncoding = GeneralBucketPropertiesEncoder(bucketName, sog, null); + SymmetricSyncMessage syncMsg = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.UpdatedObject, sogGeneralBucketEncoding); + + //TEMP DEBUG + foreach (SceneObjectPart part in sog.Parts) + { + if (part.IsAttachment) + { + m_log.Debug(LogHeader + "PrimUpdatesGeneralBucketSender: part " + part.Name + "," + part.UUID + ", IsAttachment = true"); + } + } + lock (m_stats) m_statSOGBucketOut++; SendObjectUpdateToRelevantSyncConnectors(sog, syncMsg); @@ -771,53 +797,42 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule //UpdateBucektLastSentTime(bucketName, timeStamp); } + private string GeneralBucketPropertiesEncoder(string bucketName, Object sog) + { + if (sog is SceneObjectGroup) + { + SceneObjectGroup group = (SceneObjectGroup)sog; + return SceneObjectSerializer.ToXml2Format(group); + } + else + return String.Empty; + } + + private void GeneralBucketPropertiesDecoder(string bucketName, string encoding, out Object sog) + { + SceneObjectGroup group = SceneObjectSerializer.FromXml2Format(encoding); + sog = (Object)group; + + } + private void PrimUpdatesPhysicsBucketSender(string bucketName, List primUpdates) { foreach (SceneObjectPart updatedPart in primUpdates) { updatedPart.UpdateTaintedBucketSyncInfo(bucketName, DateTime.Now.Ticks); - OSDMap data = new OSDMap(); - - data["UUID"] = OSD.FromUUID(updatedPart.UUID); - //data["UUID"] = OSD.FromUUID(pa.UUID); - data["Bucket"] = OSD.FromString(bucketName); - - data["GroupPosition"] = OSD.FromVector3(updatedPart.GroupPosition); - data["OffsetPosition"] = OSD.FromVector3(updatedPart.OffsetPosition); - data["Scale"] = OSD.FromVector3(updatedPart.Scale); - data["AngularVelocity"] = OSD.FromVector3(updatedPart.AngularVelocity); - data["RotationOffset"] = OSD.FromQuaternion(updatedPart.RotationOffset); - - Physics.Manager.PhysicsActor pa = updatedPart.PhysActor; - if (pa != null) - { - - data["Size"] = OSD.FromVector3(pa.Size); - data["Position"] = OSD.FromVector3(pa.Position); - data["Force"] = OSD.FromVector3(pa.Force); - data["Velocity"] = OSD.FromVector3(pa.Velocity); - data["RotationalVelocity"] = OSD.FromVector3(pa.RotationalVelocity); - data["PA_Acceleration"] = OSD.FromVector3(pa.Acceleration); - data["Torque"] = OSD.FromVector3(pa.Torque); - data["Orientation"] = OSD.FromQuaternion(pa.Orientation); - data["IsPhysical"] = OSD.FromBoolean(pa.IsPhysical); - data["Flying"] = OSD.FromBoolean(pa.Flying); - data["Kinematic"] = OSD.FromBoolean(pa.Kinematic); - data["Buoyancy"] = OSD.FromReal(pa.Buoyancy); - data["CollidingGround"] = OSD.FromBoolean(pa.CollidingGround); - data["IsColliding"] = OSD.FromBoolean(pa.IsColliding); - - m_log.DebugFormat("{0}: PhysBucketSender for {1}, pos={2}", LogHeader, updatedPart.UUID.ToString(), pa.Position.ToString()); - } - - data["LastUpdateTimeStamp"] = OSD.FromLong(updatedPart.BucketSyncInfoList[bucketName].LastUpdateTimeStamp); - data["LastUpdateActorID"] = OSD.FromString(updatedPart.BucketSyncInfoList[bucketName].LastUpdateActorID); - - //m_log.Debug(LogHeader + " Send out Physics Bucket updates for " + updatedPart.Name + ","+updatedPart.UUID+ ". GroupPosition: " + updatedPart.GroupPosition.ToString()); - - SymmetricSyncMessage syncMsg = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.UpdatedBucketProperties, OSDParser.SerializeJsonString(data)); + //string partPhysicsBucketEncoding = PhysicsBucketPropertiesEncoder(bucketName, updatedPart); + OSDMap partData = PhysicsBucketPropertiesEncoder(bucketName, updatedPart); + SymmetricSyncMessage syncMsg = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.UpdatedBucketProperties, OSDParser.SerializeJsonString(partData)); //m_log.DebugFormat("{0}: PhysBucketSender for {1}, pos={2}", LogHeader, updatedPart.UUID.ToString(), pa.Position.ToString()); + + //TEMP DEBUG + if (updatedPart.IsAttachment) + { + m_log.Debug(LogHeader + "PrimUpdatesPhysicsBucketSender: part " + updatedPart.Name + "," + updatedPart.UUID + ", IsAttachment = true"); + } + + lock (m_stats) m_statPhysBucketOut++; SendObjectUpdateToRelevantSyncConnectors(updatedPart, syncMsg); @@ -828,13 +843,55 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule //UpdateBucektLastSentTime(bucketName); } - /* - private void UpdateBucektLastSentTime(string bucketName) + private OSDMap PhysicsBucketPropertiesEncoder(string bucketName, SceneObjectPart updatedPart) { - long timeStamp = DateTime.Now.Ticks; - m_lastUpdateSentTime[bucketName] = timeStamp; + OSDMap data = new OSDMap(); + + data["UUID"] = OSD.FromUUID(updatedPart.UUID); + //data["UUID"] = OSD.FromUUID(pa.UUID); + data["Bucket"] = OSD.FromString(bucketName); + + data["GroupPosition"] = OSD.FromVector3(updatedPart.GroupPosition); + data["OffsetPosition"] = OSD.FromVector3(updatedPart.OffsetPosition); + data["Scale"] = OSD.FromVector3(updatedPart.Scale); + data["AngularVelocity"] = OSD.FromVector3(updatedPart.AngularVelocity); + data["RotationOffset"] = OSD.FromQuaternion(updatedPart.RotationOffset); + + Physics.Manager.PhysicsActor pa = updatedPart.PhysActor; + if (pa != null) + { + + data["Size"] = OSD.FromVector3(pa.Size); + data["Position"] = OSD.FromVector3(pa.Position); + data["Force"] = OSD.FromVector3(pa.Force); + data["Velocity"] = OSD.FromVector3(pa.Velocity); + data["RotationalVelocity"] = OSD.FromVector3(pa.RotationalVelocity); + data["PA_Acceleration"] = OSD.FromVector3(pa.Acceleration); + data["Torque"] = OSD.FromVector3(pa.Torque); + data["Orientation"] = OSD.FromQuaternion(pa.Orientation); + data["IsPhysical"] = OSD.FromBoolean(pa.IsPhysical); + data["Flying"] = OSD.FromBoolean(pa.Flying); + data["Kinematic"] = OSD.FromBoolean(pa.Kinematic); + data["Buoyancy"] = OSD.FromReal(pa.Buoyancy); + data["CollidingGround"] = OSD.FromBoolean(pa.CollidingGround); + data["IsColliding"] = OSD.FromBoolean(pa.IsColliding); + + //m_log.DebugFormat("{0}: PhysBucketSender for {1}, pos={2}", LogHeader, updatedPart.UUID.ToString(), pa.Position.ToString()); + } + + data["LastUpdateTimeStamp"] = OSD.FromLong(updatedPart.BucketSyncInfoList[bucketName].LastUpdateTimeStamp); + data["LastUpdateActorID"] = OSD.FromString(updatedPart.BucketSyncInfoList[bucketName].LastUpdateActorID); + + //m_log.Debug(LogHeader + " Send out Physics Bucket updates for " + updatedPart.Name + ","+updatedPart.UUID+ ". GroupPosition: " + updatedPart.GroupPosition.ToString()); + + return data; + } + + private void PhysicsBucketPropertiesDecoder(string bucketName, SymmetricSyncMessage msg, out Object sog) + { + OSDMap data = DeserializeMessage(msg); + sog = (Object)data; } - */ private bool HaveUpdatesToSendoutForSync(SceneObjectPart part, string bucketName) { @@ -863,22 +920,31 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule * */ } + //by default, there are two property buckets: the "General" bucket and the "Physics" bucket. + private string m_generalBucketName = "General"; + private string m_physicsBucketName = "Physics"; //If nothing configured in the config file, this is the default settings for grouping properties into different bucket private void PopulatePropertyBuketMapByDefault() { - //by default, there are two property buckets: the "General" bucket and the "Physics" bucket. - string generalBucketName = "General"; - string physicsBucketName = "Physics"; - m_propertyBucketNames.Add(generalBucketName); - m_propertyBucketNames.Add(physicsBucketName); + + m_propertyBucketNames.Add(m_generalBucketName); + m_propertyBucketNames.Add(m_physicsBucketName); m_maxNumOfPropertyBuckets = m_propertyBucketNames.Count; //Linking each bucket with the sender function that serializes the properties in the bucket and send out sync message - m_primUpdatesPerBucketSender.Add("General", PrimUpdatesGeneralBucketSender); - m_primUpdatesPerBucketSender.Add("Physics", PrimUpdatesPhysicsBucketSender); + m_primUpdatesPerBucketSender.Add(m_generalBucketName, PrimUpdatesGeneralBucketSender); + m_primUpdatesPerBucketSender.Add(m_physicsBucketName, PrimUpdatesPhysicsBucketSender); - m_lastUpdateSentTime.Add("General", 0); - m_lastUpdateSentTime.Add("Physics", 0); + /* + m_updatePerBucketEncoder.Add(generalBucketName, GeneralBucketPropertiesEncoder); + m_updatePerBucketEncoder.Add(physicsBucketName, PhysicsBucketPropertiesEncoder); + + m_updatePerBucketDecoder.Add(generalBucketName, GeneralBucketPropertiesDecoder); + m_updatePerBucketDecoder.Add(physicsBucketName, PhysicsBucketPropertiesDecoder); + * */ + + //m_lastUpdateSentTime.Add("General", 0); + //m_lastUpdateSentTime.Add("Physics", 0); //Mapping properties to buckets. foreach (SceneObjectPartProperties property in Enum.GetValues(typeof(SceneObjectPartProperties))) @@ -904,11 +970,11 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule case SceneObjectPartProperties.Buoyancy: case SceneObjectPartProperties.IsCollidingGround: case SceneObjectPartProperties.IsColliding: - m_primPropertyBucketMap.Add(property, physicsBucketName); + m_primPropertyBucketMap.Add(property, m_physicsBucketName); break; default: //all other properties belong to the "General" bucket. - m_primPropertyBucketMap.Add(property, generalBucketName); + m_primPropertyBucketMap.Add(property, m_generalBucketName); break; } } @@ -980,9 +1046,10 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule //Events are send out right away, without being put into the connector's outQueue first. //May need a better method for managing the outgoing messages (i.e. prioritizing object updates and events) - private void SendSceneEventToRelevantSyncConnectors(string init_actorID, SymmetricSyncMessage rsm) + private void SendSceneEventToRelevantSyncConnectors(string init_actorID, SymmetricSyncMessage rsm, SceneObjectGroup sog) { - List syncConnectors = GetSyncConnectorsForSceneEvents(init_actorID, rsm); + //TODO: need to pick connectors based on sog position (quark it resides in) + List syncConnectors = GetSyncConnectorsForSceneEvents(init_actorID, rsm, sog); foreach (SyncConnector connector in syncConnectors) { @@ -1036,6 +1103,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule //in other parts as well, so we are sending to all connectors. ForEachSyncConnector(delegate(SyncConnector connector) { + //if(!connector.OtherSideActorID.Equals(sog.BucketSyncInfoUpdate[ syncConnectors.Add(connector); }); } @@ -1062,7 +1130,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule /// /// /// - private List GetSyncConnectorsForSceneEvents(string init_actorID, SymmetricSyncMessage rsm) + private List GetSyncConnectorsForSceneEvents(string init_actorID, SymmetricSyncMessage rsm, SceneObjectGroup sog) { List syncConnectors = new List(); if (m_isSyncRelay) @@ -1559,8 +1627,10 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule { if (e is SceneObjectGroup) { - string sogxml = SceneObjectSerializer.ToXml2Format((SceneObjectGroup)e); - SendSyncMessage(SymmetricSyncMessage.MsgType.NewObject, sogxml); + //string sogxml = SceneObjectSerializer.ToXml2Format((SceneObjectGroup)e); + //SendSyncMessage(SymmetricSyncMessage.MsgType.NewObject, sogxml); + SceneObjectGroup sog = (SceneObjectGroup)e; + SendNewObject(sog); //m_log.Debug(LogHeader + ": " + sogxml); } @@ -1644,19 +1714,45 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule private void HandleAddNewObject(SymmetricSyncMessage msg, string senderActorID) { - string sogxml = Encoding.ASCII.GetString(msg.Data, 0, msg.Length); + + //string sogxml = Encoding.ASCII.GetString(msg.Data, 0, msg.Length); + //SceneObjectGroup sog = SceneObjectSerializer.FromXml2Format(sogxml); + OSDMap data = DeserializeMessage(msg); + + //First, create the object group and add it to Scene + string sogxml = data["sogxml"]; SceneObjectGroup sog = SceneObjectSerializer.FromXml2Format(sogxml); - - //m_log.DebugFormat("{0}: received NewObject sync message from {1}, for object {1}, {2}", LogHeader, senderActorID, sog.Name, sog.UUID); - Scene.ObjectUpdateResult updateResult = m_scene.AddOrUpdateObjectBySynchronization(sog); - //if this is a relay node, forwards the event + //if this is a relay node, forward the event if (m_isSyncRelay) { - //SendSceneEventToRelevantSyncConnectors(init_actorID, msg); - SendSceneEventToRelevantSyncConnectors(senderActorID, msg); + SendSceneEventToRelevantSyncConnectors(senderActorID, msg, sog); } + + //Second, update the physics properties of each prim in the object + OSDArray partArray = (OSDArray)data["partPhysicsProperties"]; + for (int i = 0; i < partArray.Count; i++) + { + OSDMap partData = (OSDMap)partArray[i]; + UUID partUUID = partData["UUID"].AsUUID(); + + string bucketName = partData["Bucket"].AsString(); + + //m_log.DebugFormat("{0}: HandleUpdatedBucketProperties from {1}: for {2}/{3}", LogHeader, senderActorID, partUUID.ToString(), bucketName); + + BucketSyncInfo rBucketSyncInfo = new BucketSyncInfo(bucketName); + rBucketSyncInfo.LastUpdateTimeStamp = partData["LastUpdateTimeStamp"].AsLong(); + rBucketSyncInfo.LastUpdateActorID = partData["LastUpdateActorID"].AsString(); + // updatedPart.BucketSyncInfoList.Add(bucketName, rBucketSyncInfo); + + m_scene.UpdateObjectPartBucketProperties(bucketName, partUUID, data, rBucketSyncInfo); + } + //m_log.DebugFormat("{0}: received NewObject sync message from {1}, for object {1}, {2}", LogHeader, senderActorID, sog.Name, sog.UUID); + + + + } private void HandleAddOrUpdateObjectBySynchronization(SymmetricSyncMessage msg, string senderActorID) @@ -1683,6 +1779,14 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule } else { + foreach (SceneObjectPart part in sog.Parts) + { + if (part.IsAttachment) + { + m_log.Debug(LogHeader + "HandleAddOrUpdateObjectBySynchronization: part " + part.Name + "," + part.UUID + ", IsAttachment = true"); + } + } + Scene.ObjectUpdateResult updateResult = m_scene.AddOrUpdateObjectBySynchronization(sog); //if (added) @@ -1721,40 +1825,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule string bucketName = data["Bucket"].AsString(); //m_log.DebugFormat("{0}: HandleUpdatedBucketProperties from {1}: for {2}/{3}", LogHeader, senderActorID, partUUID.ToString(), bucketName); - - /* Commented out since OSDMap is now passed all the way through to the unpacker. - * Previous implementation is to create a SOP and copy the values into same and copy them out later. - SceneObjectPart updatedPart = new SceneObjectPart(); - updatedPart.GroupPosition = data["GroupPosition"].AsVector3(); - updatedPart.OffsetPosition = data["OffsetPosition"].AsVector3(); - updatedPart.RotationOffset = data["RotationOffset"].AsQuaternion(); - updatedPart.Velocity = data["Velocity"].AsVector3(); - updatedPart.AngularVelocity = data["AngularVelocity"].AsVector3(); - //Scale is a bit complex, we need to have Shape first -- not a good solution, but leave it as is so that we can move on, - updatedPart.Shape = new PrimitiveBaseShape(); - updatedPart.Scale = data["Scale"].AsVector3(); - - Dictionary updatedProperties = new Dictionary(); - updatedProperties.Add("GroupPosition", (Object)data["GroupPosition"].AsVector3()); - updatedProperties.Add("OffsetPosition", (Object)data["OffsetPosition"].AsVector3()); - updatedProperties.Add("RotationOffset", (Object)data["RotationOffset"].AsQuaternion()); - updatedProperties.Add("Velocity", (Object)data["Velocity"].AsVector3()); - updatedProperties.Add("AngularVelocity", (Object)data["AngularVelocity"].AsVector3()); - updatedProperties.Add("Scale", (Object)data["Scale"].AsVector3()); - */ - //Other properties to be included - /* - "Position": - "Size": - "Force": - "RotationalVelocity": - "PA_Acceleration": - "Torque": - "Orientation": - "IsPhysical": - "Flying": - "Buoyancy": - * */ BucketSyncInfo rBucketSyncInfo = new BucketSyncInfo(bucketName); rBucketSyncInfo.LastUpdateTimeStamp = data["LastUpdateTimeStamp"].AsLong(); @@ -1832,6 +1902,13 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule SceneObjectGroup sog = m_scene.SceneGraph.GetGroupByPrim(sogUUID); + //if this is a relay node, forwards the event + if (m_isSyncRelay) + { + SendSceneEventToRelevantSyncConnectors(senderActorID, msg, sog); + } + + if (sog != null) { if (!softDelete) @@ -1846,12 +1923,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule } } - //if this is a relay node, forwards the event - if (m_isSyncRelay) - { - //SendSceneEventToRelevantSyncConnectors(init_actorID, msg); - SendSceneEventToRelevantSyncConnectors(senderActorID, msg); - } + } private void HandleLinkObject(SymmetricSyncMessage msg, string senderActorID) @@ -1872,6 +1944,13 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule int partCount = data["partCount"].AsInteger(); List childrenIDs = new List(); + + //if this is a relay node, forwards the event + if (m_isSyncRelay) + { + SendSceneEventToRelevantSyncConnectors(senderActorID, msg, linkedGroup); + } + for (int i = 0; i < partCount; i++) { string partTempID = "part" + i; @@ -1881,18 +1960,28 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule m_log.Debug(LogHeader + " received LinkObject from " + senderActorID); //m_log.Debug("LinkedObject: " + sogxml); + //TEMP DEBUG + foreach (SceneObjectPart part in linkedGroup.Parts) + { + if (part.IsAttachment) + { + m_log.Debug(LogHeader + "HandleLinkObject: part " + part.Name + "," + part.UUID + " IsAttachment = true in incoming sync message"); + } + } + m_scene.LinkObjectBySync(linkedGroup, rootID, childrenIDs); - //if this is a relay node, forwards the event - if (m_isSyncRelay) - { - //SendSceneEventToRelevantSyncConnectors(init_actorID, msg); - SendSceneEventToRelevantSyncConnectors(senderActorID, msg); - } + } private void HandleDelinkObject(SymmetricSyncMessage msg, string senderActorID) { + //if this is a relay node, forwards the event + if (m_isSyncRelay) + { + SendSceneEventToRelevantSyncConnectors(senderActorID, msg, null); + } + OSDMap data = DeserializeMessage(msg); if (data == null) { @@ -1934,12 +2023,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule m_scene.DelinkObjectsBySync(delinkPrimIDs, beforeDelinkGroupIDs, incomingAfterDelinkGroups); - //if this is a relay node, forwards the event - if (m_isSyncRelay) - { - //SendSceneEventToRelevantSyncConnectors(init_actorID, msg); - SendSceneEventToRelevantSyncConnectors(senderActorID, msg); - } } /// @@ -1948,6 +2031,13 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule /// private void HandleRemoteEvent(SymmetricSyncMessage msg, string senderActorID) { + + //if this is a relay node, forwards the event + if (m_isSyncRelay) + { + SendSceneEventToRelevantSyncConnectors(senderActorID, msg, null); + } + OSDMap data = DeserializeMessage(msg); if (data == null) { @@ -1994,12 +2084,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule break; } - //if this is a relay node, forwards the event - if (m_isSyncRelay) - { - //SendSceneEventToRelevantSyncConnectors(init_actorID, msg); - SendSceneEventToRelevantSyncConnectors(senderActorID, msg); - } } /// @@ -2352,14 +2436,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule data["running"] = OSD.FromBoolean(isScriptRunning); data["assetID"] = OSD.FromUUID(newAssetID); - /* - data["actorID"] = OSD.FromString(m_actorID); - data["seqNum"] = OSD.FromULong(GetNextEventSeq()); - - SymmetricSyncMessage rsm = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.UpdateScript, OSDParser.SerializeJsonString(data)); - //send to actors who are interested in the event - SendSceneEventToRelevantSyncConnectors(m_actorID, rsm); - * */ SendSceneEvent(SymmetricSyncMessage.MsgType.UpdateScript, data); } @@ -2584,20 +2660,9 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule //send to actors who are interested in the event lock (m_stats) m_statEventOut++; - SendSceneEventToRelevantSyncConnectors(m_actorID, rsm); + SendSceneEventToRelevantSyncConnectors(m_actorID, rsm, null); } - /* - private void PublishSceneEvent(OSDMap data) - { - data["actorID"] = OSD.FromString(m_actorID); - data["seqNum"] = OSD.FromULong(GetNextEventSeq()); - - SymmetricSyncMessage rsm = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.OnUpdateScript, OSDParser.SerializeJsonString(data)); - SendSceneEventToRelevantSyncConnectors(m_actorID, rsm); - } - * */ - private ulong GetNextEventSeq() { return m_eventSeq++; diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 6d086d6844..c1ea8a3340 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -2203,6 +2203,13 @@ namespace OpenSim.Region.Framework.Scenes partnames += "(" + part.Name + ", " + part.UUID + ")"; } m_log.DebugFormat("[SCENE] RezObject {0} with InvItem name {1} at pos {2} with parts {3}", group.UUID.ToString(), item.Name, group.RootPart.GroupPosition.ToString(), partnames); + foreach (SceneObjectPart part in group.Parts) + { + if (part.IsAttachment) + { + m_log.Debug("[SCENE]: part " + part.Name + "," + part.UUID + ", IsAttachment = true"); + } + } // We can only call this after adding the scene object, since the scene object references the scene // to find out if scripts should be activated at all. diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 941988f750..8f1d9f6198 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -795,7 +795,7 @@ namespace OpenSim.Region.Framework.Scenes } //m_log.Debug("to link part " + part.DebugObjectPartProperties()); - m_log.Debug("to link part " + part.Name + "," + part.UUID + "; its SOG has " + part.ParentGroup.Parts + " parts"); + m_log.Debug("LinkObjectBySync: " + part.Name + "," + part.UUID + " with root "+root.Name+","+root.UUID+"; its SOG has " + part.ParentGroup.Parts + " parts"); children.Add(part); } @@ -805,7 +805,13 @@ namespace OpenSim.Region.Framework.Scenes //Leverage the LinkObject implementation to get the book keeping of Group and Parts relations right m_sceneGraph.LinkObjectsBySync(root, children); - + foreach (SceneObjectPart part in linkedGroup.Parts) + { + if (part.IsAttachment) + { + m_log.Debug("LinkObjectBySync: part " + part.Name + "," + part.UUID + " IsAttachment = true after linking"); + } + } //The properties of the newly linked object should be updated later with another UpdatedObject message. diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index a3ec2ecedf..f077318467 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -2113,9 +2113,9 @@ namespace OpenSim.Region.Framework.Scenes // objectGroup.RootPart.SendScheduledUpdates(); //} - // m_log.DebugFormat( - // "[SCENE OBJECT GROUP]: Linking group with root part {0}, {1} to group with root part {2}, {3}", - // objectGroup.RootPart.Name, objectGroup.RootPart.UUID, RootPart.Name, RootPart.UUID); + m_log.DebugFormat( + "[SCENE OBJECT GROUP]: Linking group with root part {0}, {1} to group with root part {2}, {3}", + objectGroup.RootPart.Name, objectGroup.RootPart.UUID, RootPart.Name, RootPart.UUID); SceneObjectPart linkPart = objectGroup.m_rootPart; diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 6d618588ad..06dd420676 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -5479,6 +5479,8 @@ namespace OpenSim.Region.Framework.Scenes localPart.TextureAnimation = updatedPart.TextureAnimation; localPart.ParticleSystem = updatedPart.ParticleSystem; + bool preIsAttachment = localPart.IsAttachment; + if (!localPart.AttachedAvatar.Equals(updatedPart.AttachedAvatar)) { localPart.AttachedAvatar = updatedPart.AttachedAvatar; @@ -5494,6 +5496,11 @@ namespace OpenSim.Region.Framework.Scenes // localPart.IsAttachment = updatedPart.IsAttachment; //} + if (localPart.IsAttachment) + { + m_log.Debug("GeneralBucketUpdateProcessor: part " + localPart.Name + "," + localPart.UUID + ", IsAttachment = true; previously, IsAttachment = " + preIsAttachment.ToString()); + } + localPart.AggregateScriptEvents = updatedPart.AggregateScriptEvents; m_bucketSyncInfoList[bucketName].LastUpdateTimeStamp = updatedPart.BucketSyncInfoList[bucketName].LastUpdateTimeStamp; @@ -5856,7 +5863,7 @@ namespace OpenSim.Region.Framework.Scenes { if (!m_bucketSyncInfoList[bucketName].LastUpdateActorID.Equals(rBucketSyncInfo.LastUpdateActorID)) { - m_log.Warn("Different actors modified SceneObjetPart " + Name + "," + UUID + ", bucket " + bucketName + ", with the same TimeStamp (" + m_log.Warn("UpdateBucketProperties: Different actors modified SceneObjetPart " + Name + "," + UUID + ", bucket " + bucketName + ", with the same TimeStamp (" + m_bucketSyncInfoList[bucketName].LastUpdateActorID + "," + rBucketSyncInfo.LastUpdateActorID + ", CONFLICT RESOLUTION TO BE IMPLEMENTED, PICK A WINNER!!!!");