Merge branch 'dev' of ssh://island.sciencesim.com/home/sceneapi/sceneapi into dev

Conflicts:
	OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs
	OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/GridDialogModule.cs
dsg
Dan Lake 2011-06-15 15:26:17 -07:00
commit b6d93d0c40
17 changed files with 833 additions and 178 deletions

View File

@ -535,7 +535,8 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
} }
if (upd != null) if (upd != null)
{ <<<<<<< HEAD
{
GridRegion reginfo = m_Scenes[0].GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, upd.RegionID); GridRegion reginfo = m_Scenes[0].GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, upd.RegionID);
// If we found the reginfo, send the IM to the region // If we found the reginfo, send the IM to the region

View File

@ -1641,7 +1641,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
{ {
grp.OffsetForNewRegion(oldGroupPosition); grp.OffsetForNewRegion(oldGroupPosition);
//grp.ScheduleGroupForFullUpdate(); //grp.ScheduleGroupForFullUpdate();
grp.ScheduleGroupForFullUpdate(new List<SceneObjectPartSyncProperties>(){SceneObjectPartSyncProperties.Position}); grp.ScheduleGroupForFullUpdate(new List<SceneObjectPartSyncProperties>(){SceneObjectPartSyncProperties.GroupPosition});
} }
} }

View File

@ -201,6 +201,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
if (!imresult) if (!imresult)
{ {
SendGridDialogViaXMLRPCAsync(avatarID, objectName, objectID, ownerID, ownerFirstName, ownerLastName, message, textureID, ch, buttonlabels, prevRegionID); SendGridDialogViaXMLRPCAsync(avatarID, objectName, objectID, ownerID, ownerFirstName, ownerLastName, message, textureID, ch, buttonlabels, prevRegionID);
m_log.WarnFormat("Couldn't deliver dialog to {0}" + avatarID);
return;
} }
} }
} }

View File

@ -199,6 +199,13 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
get { return m_isSyncRelay; } get { return m_isSyncRelay; }
} }
public class SyncMessageRecord
{
public SymmetricSyncMessage SyncMessage;
public long ReceivedTime;
}
private List<SyncMessageRecord> m_savedSyncMessage = new List<SyncMessageRecord>();
//The following Sendxxx calls,send out a message immediately, w/o putting it in the SyncConnector's outgoing queue. //The following Sendxxx calls,send out a message immediately, w/o putting it in the SyncConnector's outgoing queue.
//May need some optimization there on the priorities. //May need some optimization there on the priorities.
@ -256,7 +263,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
case EventManager.EventNames.ChatBroadcast: case EventManager.EventNames.ChatBroadcast:
if (evArgs.Length < 2) if (evArgs.Length < 2)
{ {
m_log.Error(LogHeader + " not enough event args for ChatFromWorld"); m_log.Error(LogHeader + " not enough event args for ChatEvents");
return; return;
} }
//OnLocalChatBroadcast(evArgs[0], (OSChatMessage)evArgs[1]); //OnLocalChatBroadcast(evArgs[0], (OSChatMessage)evArgs[1]);
@ -278,7 +285,17 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
OnLocalPhysicsCollision((UUID)evArgs[0], (OSDArray)evArgs[1]); OnLocalPhysicsCollision((UUID)evArgs[0], (OSDArray)evArgs[1]);
return; return;
case EventManager.EventNames.ScriptCollidingStart: case EventManager.EventNames.ScriptCollidingStart:
OnLocalScriptCollidingStart((uint)evArgs[0], (ColliderArgs)evArgs[1]); case EventManager.EventNames.ScriptColliding:
case EventManager.EventNames.ScriptCollidingEnd:
case EventManager.EventNames.ScriptLandCollidingStart:
case EventManager.EventNames.ScriptLandColliding:
case EventManager.EventNames.ScriptLandCollidingEnd:
if (evArgs.Length < 2)
{
m_log.Error(LogHeader + " not enough event args for ScriptCollidingEvents");
return;
}
OnLocalScriptCollidingEvents(ev, (uint)evArgs[0], (ColliderArgs)evArgs[1]);
return; return;
default: default:
return; return;
@ -472,7 +489,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
Command cmdSyncDebug = new Command("debug", CommandIntentions.COMMAND_HAZARDOUS, SyncDebug, "Trigger some debugging functions"); Command cmdSyncDebug = new Command("debug", CommandIntentions.COMMAND_HAZARDOUS, SyncDebug, "Trigger some debugging functions");
//for sync state comparison, //for sync state comparison,
Command cmdSyncStateDetailReport = new Command("state detail", CommandIntentions.COMMAND_HAZARDOUS, SyncStateDetailReport, "Trigger synchronization state comparision functions"); Command cmdSyncStateDetailReport = new Command("state_detail", CommandIntentions.COMMAND_HAZARDOUS, SyncStateDetailReport, "Trigger synchronization state comparision functions");
//for sync state comparison, //for sync state comparison,
Command cmdSyncStateReport = new Command("state", CommandIntentions.COMMAND_HAZARDOUS, SyncStateReport, "Trigger synchronization state comparision functions"); Command cmdSyncStateReport = new Command("state", CommandIntentions.COMMAND_HAZARDOUS, SyncStateReport, "Trigger synchronization state comparision functions");
@ -480,7 +497,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
m_commander.RegisterCommand("stop", cmdSyncStop); m_commander.RegisterCommand("stop", cmdSyncStop);
m_commander.RegisterCommand("status", cmdSyncStatus); m_commander.RegisterCommand("status", cmdSyncStatus);
m_commander.RegisterCommand("debug", cmdSyncDebug); m_commander.RegisterCommand("debug", cmdSyncDebug);
m_commander.RegisterCommand("state detail", cmdSyncStateDetailReport); m_commander.RegisterCommand("state_detail", cmdSyncStateDetailReport);
m_commander.RegisterCommand("state", cmdSyncStateReport); m_commander.RegisterCommand("state", cmdSyncStateReport);
lock (m_scene) lock (m_scene)
@ -733,9 +750,11 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
foreach (SyncConnector connector in syncConnectors) foreach (SyncConnector connector in syncConnectors)
{ {
//special fix for demo, need better optimization later //special fix for R@I demo, need better optimization later
if ((rsm.Type == SymmetricSyncMessage.MsgType.PhysicsCollision || rsm.Type == SymmetricSyncMessage.MsgType.ScriptCollidingStart if ((rsm.Type == SymmetricSyncMessage.MsgType.PhysicsCollision || rsm.Type == SymmetricSyncMessage.MsgType.ScriptCollidingStart
|| rsm.Type == SymmetricSyncMessage.MsgType.ScriptCollidingEnd) || rsm.Type == SymmetricSyncMessage.MsgType.ScriptColliding || rsm.Type == SymmetricSyncMessage.MsgType.ScriptCollidingEnd
|| rsm.Type == SymmetricSyncMessage.MsgType.ScriptLandCollidingStart
|| rsm.Type == SymmetricSyncMessage.MsgType.ScriptLandColliding || rsm.Type == SymmetricSyncMessage.MsgType.ScriptLandCollidingEnd)
&& m_isSyncRelay) && m_isSyncRelay)
{ {
//for persistence actor, only forward collision events to script engines //for persistence actor, only forward collision events to script engines
@ -1368,6 +1387,9 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
/////////////////////// ///////////////////////
//SOG properties //SOG properties
/////////////////////// ///////////////////////
case SceneObjectPartSyncProperties.AbsolutePosition:
estimateBytes += ((Vector3)propertySyncInfo.LastUpdateValue).GetBytes().Length;
break;
case SceneObjectPartSyncProperties.IsSelected: case SceneObjectPartSyncProperties.IsSelected:
//propertyData["Value"] = OSD.FromBoolean((bool)LastUpdateValue); //propertyData["Value"] = OSD.FromBoolean((bool)LastUpdateValue);
estimateBytes += 1; estimateBytes += 1;
@ -1387,6 +1409,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
private void SyncDebug(Object[] args) private void SyncDebug(Object[] args)
{ {
/*
if (m_scene != null) if (m_scene != null)
{ {
EntityBase[] entities = m_scene.GetEntities(); EntityBase[] entities = m_scene.GetEntities();
@ -1403,6 +1426,49 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
} }
} }
} }
* */
//Test HandleRemoteEvent_ScriptCollidingStart
if (m_scene != null)
{
EntityBase[] entities = m_scene.GetEntities();
SceneObjectGroup sog = null;
foreach (EntityBase entity in entities)
{
if (entity is SceneObjectGroup)
{
sog = (SceneObjectGroup)entity;
break;
}
}
if (sog != null)
{
SceneObjectPart part = sog.RootPart;
OSDArray collisionUUIDs = new OSDArray();
UUID collider = UUID.Random();
collisionUUIDs.Add(OSD.FromUUID(collider));
OSDMap data = new OSDMap();
data["primUUID"] = OSD.FromUUID(part.UUID);
data["collisionUUIDs"] = collisionUUIDs;
//SendSceneEvent(SymmetricSyncMessage.MsgType.ScriptCollidingStart, data);
ulong evSeq = GetNextEventSeq();
data["actorID"] = OSD.FromString(m_actorID);
data["seqNum"] = OSD.FromULong(evSeq);
SymmetricSyncMessage rsm = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.ScriptCollidingStart, OSDParser.SerializeJsonString(data));
//HandleRemoteEvent_ScriptCollidingStart(m_actorID, evSeq, data, DateTime.Now.Ticks);
HandleRemoteEvent_ScriptCollidingEvents(SymmetricSyncMessage.MsgType.ScriptCollidingStart, m_actorID, evSeq, data, DateTime.Now.Ticks);
}
}
} }
private void PrimSyncSerializationDebug() private void PrimSyncSerializationDebug()
@ -1698,6 +1764,11 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
case SymmetricSyncMessage.MsgType.Attach: case SymmetricSyncMessage.MsgType.Attach:
case SymmetricSyncMessage.MsgType.PhysicsCollision: case SymmetricSyncMessage.MsgType.PhysicsCollision:
case SymmetricSyncMessage.MsgType.ScriptCollidingStart: case SymmetricSyncMessage.MsgType.ScriptCollidingStart:
case SymmetricSyncMessage.MsgType.ScriptColliding:
case SymmetricSyncMessage.MsgType.ScriptCollidingEnd:
case SymmetricSyncMessage.MsgType.ScriptLandCollidingStart:
case SymmetricSyncMessage.MsgType.ScriptLandColliding:
case SymmetricSyncMessage.MsgType.ScriptLandCollidingEnd:
{ {
HandleRemoteEvent(msg, senderActorID); HandleRemoteEvent(msg, senderActorID);
return; return;
@ -1795,12 +1866,11 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
PrimitiveBaseShape shape = PropertySerializer.DeSerializeShape((String)p.LastUpdateValue); 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("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<SceneObjectPartSyncProperties> propertiesUpdated = m_primSyncInfoManager.UpdatePrimSyncInfoBySync(sop, propertiesSyncInfo); List<SceneObjectPartSyncProperties> propertiesUpdated = m_primSyncInfoManager.UpdatePrimSyncInfoBySync(sop, propertiesSyncInfo);
@ -1834,13 +1904,26 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
break; 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 else
{ {
sop.ScheduleFullUpdate(null); if (allTerseUpdates)
sop.ParentGroup.ScheduleGroupForTerseUpdate(null);
else
sop.ParentGroup.ScheduleGroupForFullUpdate(null);
} }
} }
} }
@ -2154,7 +2237,13 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
HandleRemoteEvent_PhysicsCollision(init_actorID, evSeqNum, data); HandleRemoteEvent_PhysicsCollision(init_actorID, evSeqNum, data);
break; break;
case SymmetricSyncMessage.MsgType.ScriptCollidingStart: case SymmetricSyncMessage.MsgType.ScriptCollidingStart:
HandleRemoteEvent_ScriptCollidingStart(init_actorID, evSeqNum, data); case SymmetricSyncMessage.MsgType.ScriptColliding:
case SymmetricSyncMessage.MsgType.ScriptCollidingEnd:
case SymmetricSyncMessage.MsgType.ScriptLandCollidingStart:
case SymmetricSyncMessage.MsgType.ScriptLandColliding:
case SymmetricSyncMessage.MsgType.ScriptLandCollidingEnd:
//HandleRemoteEvent_ScriptCollidingStart(init_actorID, evSeqNum, data, DateTime.Now.Ticks);
HandleRemoteEvent_ScriptCollidingEvents(msg.Type, init_actorID, evSeqNum, data, DateTime.Now.Ticks);
break; break;
} }
@ -2403,24 +2492,28 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
m_scene.EventManager.TriggerOnAttachLocally(localID, itemID, avatarID); m_scene.EventManager.TriggerOnAttachLocally(localID, itemID, avatarID);
} }
private void HandleRemoteEvent_ScriptCollidingStart(string actorID, ulong evSeqNum, OSDMap data) //private void HandleRemoteEvent_ScriptCollidingStart(string actorID, ulong evSeqNum, OSDMap data, long recvTime)
private void HandleRemoteEvent_ScriptCollidingEvents(SymmetricSyncMessage.MsgType msgType, string actorID, ulong evSeqNum, OSDMap data, long recvTime)
{ {
if (!data.ContainsKey("primUUID") || !data.ContainsKey("collisionUUIDs")) if (!data.ContainsKey("primUUID") || !data.ContainsKey("collisionUUIDs"))
{ {
m_log.ErrorFormat("RemoteEvent_ScriptCollidingStart: either primUUID or collisionUUIDs is missing in incoming OSDMap"); m_log.ErrorFormat("RemoteEvent_ScriptCollidingStart: either primUUID or collisionUUIDs is missing in incoming OSDMap");
return;
} }
ColliderArgs StartCollidingMessage = new ColliderArgs(); ColliderArgs StartCollidingMessage = new ColliderArgs();
List<DetectedObject> colliding = new List<DetectedObject>(); List<DetectedObject> colliding = new List<DetectedObject>();
SceneObjectPart part=null; SceneObjectPart collisionPart = null;
OSDArray collidersNotFound = new OSDArray();
try try
{ {
UUID primUUID = data["primUUID"].AsUUID(); UUID primUUID = data["primUUID"].AsUUID();
//OSDArray collisionLocalIDs = (OSDArray)data["collisionLocalIDs"]; //OSDArray collisionLocalIDs = (OSDArray)data["collisionLocalIDs"];
OSDArray collisionUUIDs = (OSDArray)data["collisionUUIDs"]; OSDArray collisionUUIDs = (OSDArray)data["collisionUUIDs"];
part = m_scene.GetSceneObjectPart(primUUID); collisionPart = m_scene.GetSceneObjectPart(primUUID);
if (part == null) if (collisionPart == null)
{ {
m_log.WarnFormat("{0}: HandleRemoteEvent_PhysicsCollision: no part with UUID {1} found, event initiator {2}", LogHeader, primUUID, actorID); m_log.WarnFormat("{0}: HandleRemoteEvent_PhysicsCollision: no part with UUID {1} found, event initiator {2}", LogHeader, primUUID, actorID);
return; return;
@ -2430,54 +2523,125 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
m_log.WarnFormat("{0}: HandleRemoteEvent_PhysicsCollision: no collisionLocalIDs", LogHeader); m_log.WarnFormat("{0}: HandleRemoteEvent_PhysicsCollision: no collisionLocalIDs", LogHeader);
return; return;
} }
if(part.ParentGroup.IsDeleted == true) if (collisionPart.ParentGroup.IsDeleted == true)
return; return;
m_log.DebugFormat("HandleRemoteEvent_ScriptCollidingStart received for {0}", part.Name); switch (msgType)
for (int i = 0; i < collisionUUIDs.Count; i++)
{ {
OSD arg = collisionUUIDs[i]; case SymmetricSyncMessage.MsgType.ScriptCollidingStart:
UUID collidingUUID = arg.AsUUID(); case SymmetricSyncMessage.MsgType.ScriptColliding:
case SymmetricSyncMessage.MsgType.ScriptCollidingEnd:
SceneObjectPart obj = m_scene.GetSceneObjectPart(collidingUUID);
if (obj != null)
{
DetectedObject detobj = new DetectedObject();
detobj.keyUUID = obj.UUID;
detobj.nameStr = obj.Name;
detobj.ownerUUID = obj.OwnerID;
detobj.posVector = obj.AbsolutePosition;
detobj.rotQuat = obj.GetWorldRotation();
detobj.velVector = obj.Velocity;
detobj.colliderType = 0;
detobj.groupUUID = obj.GroupID;
colliding.Add(detobj);
}
else
{
//collision object is not a prim, check if it's an avatar
ScenePresence av = m_scene.GetScenePresence(collidingUUID);
if (av != null)
{ {
DetectedObject detobj = new DetectedObject(); for (int i = 0; i < collisionUUIDs.Count; i++)
detobj.keyUUID = av.UUID; {
detobj.nameStr = av.ControllingClient.Name; OSD arg = collisionUUIDs[i];
detobj.ownerUUID = av.UUID; UUID collidingUUID = arg.AsUUID();
detobj.posVector = av.AbsolutePosition;
detobj.rotQuat = av.Rotation;
detobj.velVector = av.Velocity;
detobj.colliderType = 0;
detobj.groupUUID = av.ControllingClient.ActiveGroupId;
colliding.Add(detobj);
}
else
{
m_log.WarnFormat("HandleRemoteEvent_ScriptCollidingStart for SOP {0},{1} with another SOP/SP {2}, but the latter is not found in local Scene",
part.Name, part.UUID, collidingUUID);
}
} SceneObjectPart obj = m_scene.GetSceneObjectPart(collidingUUID);
if (obj != null)
{
DetectedObject detobj = new DetectedObject();
detobj.keyUUID = obj.UUID;
detobj.nameStr = obj.Name;
detobj.ownerUUID = obj.OwnerID;
detobj.posVector = obj.AbsolutePosition;
detobj.rotQuat = obj.GetWorldRotation();
detobj.velVector = obj.Velocity;
detobj.colliderType = 0;
detobj.groupUUID = obj.GroupID;
colliding.Add(detobj);
}
else
{
//collision object is not a prim, check if it's an avatar
ScenePresence av = m_scene.GetScenePresence(collidingUUID);
if (av != null)
{
DetectedObject detobj = new DetectedObject();
detobj.keyUUID = av.UUID;
detobj.nameStr = av.ControllingClient.Name;
detobj.ownerUUID = av.UUID;
detobj.posVector = av.AbsolutePosition;
detobj.rotQuat = av.Rotation;
detobj.velVector = av.Velocity;
detobj.colliderType = 0;
detobj.groupUUID = av.ControllingClient.ActiveGroupId;
colliding.Add(detobj);
}
else
{
m_log.WarnFormat("HandleRemoteEvent_ScriptCollidingStart for SOP {0},{1} with SOP/SP {2}, but the latter is not found in local Scene. Saved for later processing",
collisionPart.Name, collisionPart.UUID, collidingUUID);
collidersNotFound.Add(OSD.FromUUID(collidingUUID));
}
}
}
if (collidersNotFound.Count > 0)
{
//hard-coded expiration time to be one minute
TimeSpan msgExpireTime = new TimeSpan(0, 1, 0);
TimeSpan msgSavedTime = new TimeSpan(DateTime.Now.Ticks - recvTime);
if (msgSavedTime < msgExpireTime)
{
OSDMap newdata = new OSDMap();
newdata["primUUID"] = OSD.FromUUID(collisionPart.UUID);
newdata["collisionUUIDs"] = collidersNotFound;
newdata["actorID"] = OSD.FromString(actorID);
newdata["seqNum"] = OSD.FromULong(evSeqNum);
SymmetricSyncMessage rsm = null;
switch (msgType)
{
case SymmetricSyncMessage.MsgType.ScriptCollidingStart:
rsm = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.ScriptCollidingStart, OSDParser.SerializeJsonString(newdata));
break;
case SymmetricSyncMessage.MsgType.ScriptColliding:
rsm = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.ScriptColliding, OSDParser.SerializeJsonString(newdata));
break;
case SymmetricSyncMessage.MsgType.ScriptCollidingEnd:
rsm = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.ScriptCollidingEnd, OSDParser.SerializeJsonString(newdata));
break;
}
SyncMessageRecord syncMsgToSave = new SyncMessageRecord();
syncMsgToSave.ReceivedTime = recvTime;
syncMsgToSave.SyncMessage = rsm;
lock (m_savedSyncMessage)
{
m_savedSyncMessage.Add(syncMsgToSave);
}
}
}
}
break;
case SymmetricSyncMessage.MsgType.ScriptLandCollidingStart:
case SymmetricSyncMessage.MsgType.ScriptLandColliding:
case SymmetricSyncMessage.MsgType.ScriptLandCollidingEnd:
{
for (int i = 0; i < collisionUUIDs.Count; i++)
{
OSD arg = collisionUUIDs[i];
UUID collidingUUID = arg.AsUUID();
if (collidingUUID.Equals(UUID.Zero))
{
//Hope that all is left is ground!
DetectedObject detobj = new DetectedObject();
detobj.keyUUID = UUID.Zero;
detobj.nameStr = "";
detobj.ownerUUID = UUID.Zero;
detobj.posVector = collisionPart.ParentGroup.RootPart.AbsolutePosition;
detobj.rotQuat = Quaternion.Identity;
detobj.velVector = Vector3.Zero;
detobj.colliderType = 0;
detobj.groupUUID = UUID.Zero;
colliding.Add(detobj);
}
}
}
break;
} }
} }
catch (Exception e) catch (Exception e)
@ -2485,11 +2649,39 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
m_log.ErrorFormat("HandleRemoteEvent_ScriptCollidingStart Error: {0}", e.Message); m_log.ErrorFormat("HandleRemoteEvent_ScriptCollidingStart Error: {0}", e.Message);
} }
if (colliding.Count > 0) if (colliding.Count > 0)
{ {
StartCollidingMessage.Colliders = colliding; StartCollidingMessage.Colliders = colliding;
// always running this check because if the user deletes the object it would return a null reference. // always running this check because if the user deletes the object it would return a null reference.
LocalScene.EventManager.TriggerScriptCollidingStartLocally(part.LocalId, StartCollidingMessage); //LocalScene.EventManager.TriggerScriptCollidingStartLocally(part.LocalId, StartCollidingMessage);
switch (msgType)
{
case SymmetricSyncMessage.MsgType.ScriptCollidingStart:
m_log.DebugFormat("ScriptCollidingStart received for {0}", collisionPart.Name);
LocalScene.EventManager.TriggerScriptCollidingStartLocally(collisionPart.LocalId, StartCollidingMessage);
break;
case SymmetricSyncMessage.MsgType.ScriptColliding:
m_log.DebugFormat("ScriptColliding received for {0}", collisionPart.Name);
LocalScene.EventManager.TriggerScriptCollidingLocally(collisionPart.LocalId, StartCollidingMessage);
break;
case SymmetricSyncMessage.MsgType.ScriptCollidingEnd:
m_log.DebugFormat("ScriptCollidingEnd received for {0}", collisionPart.Name);
LocalScene.EventManager.TriggerScriptCollidingEndLocally(collisionPart.LocalId, StartCollidingMessage);
break;
case SymmetricSyncMessage.MsgType.ScriptLandCollidingStart:
m_log.DebugFormat("ScriptLandCollidingStart received for {0}", collisionPart.Name);
LocalScene.EventManager.TriggerScriptLandCollidingStartLocally(collisionPart.LocalId, StartCollidingMessage);
break;
case SymmetricSyncMessage.MsgType.ScriptLandColliding:
m_log.DebugFormat("ScriptLandColliding received for {0}", collisionPart.Name);
LocalScene.EventManager.TriggerScriptLandCollidingLocally(collisionPart.LocalId, StartCollidingMessage);
break;
case SymmetricSyncMessage.MsgType.ScriptLandCollidingEnd:
m_log.DebugFormat("ScriptLandCollidingEnd received for {0}", collisionPart.Name);
LocalScene.EventManager.TriggerScriptLandCollidingEndLocally(collisionPart.LocalId, StartCollidingMessage);
break;
}
} }
} }
@ -2502,6 +2694,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
if (!data.ContainsKey("primUUID") || !data.ContainsKey("collisionUUIDs")) if (!data.ContainsKey("primUUID") || !data.ContainsKey("collisionUUIDs"))
{ {
m_log.ErrorFormat("RemoteEvent_PhysicsCollision: either primUUID or collisionUUIDs is missing in incoming OSDMap"); m_log.ErrorFormat("RemoteEvent_PhysicsCollision: either primUUID or collisionUUIDs is missing in incoming OSDMap");
return;
} }
try try
@ -2524,13 +2717,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
// Build up the collision list. The contact point is ignored so we generate some default. // Build up the collision list. The contact point is ignored so we generate some default.
CollisionEventUpdate e = new CollisionEventUpdate(); CollisionEventUpdate e = new CollisionEventUpdate();
/*
foreach (uint collisionID in collisionLocalIDs)
{
// e.addCollider(collisionID, new ContactPoint());
e.addCollider(collisionID, new ContactPoint(Vector3.Zero, Vector3.UnitX, 0.03f));
}
* */
for (int i = 0; i < collisionUUIDs.Count; i++) for (int i = 0; i < collisionUUIDs.Count; i++)
{ {
OSD arg = collisionUUIDs[i]; OSD arg = collisionUUIDs[i];
@ -2809,11 +2996,47 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
} }
private void OnLocalScriptCollidingEvents(EventManager.EventNames evType, uint localID, ColliderArgs colliders)
{
SceneObjectPart part = LocalScene.GetSceneObjectPart(localID);
if (part == null)
return;
OSDMap data = PrepareCollisionArgs(localID, colliders);
if (data.Count == 0)
return;
switch (evType)
{
case EventManager.EventNames.ScriptCollidingStart:
SendSceneEvent(SymmetricSyncMessage.MsgType.ScriptCollidingStart, data);
break;
case EventManager.EventNames.ScriptColliding:
SendSceneEvent(SymmetricSyncMessage.MsgType.ScriptColliding, data);
break;
case EventManager.EventNames.ScriptCollidingEnd:
SendSceneEvent(SymmetricSyncMessage.MsgType.ScriptCollidingEnd, data);
break;
case EventManager.EventNames.ScriptLandCollidingStart:
SendSceneEvent(SymmetricSyncMessage.MsgType.ScriptLandCollidingStart, data);
break;
case EventManager.EventNames.ScriptLandColliding:
SendSceneEvent(SymmetricSyncMessage.MsgType.ScriptLandColliding, data);
break;
case EventManager.EventNames.ScriptLandCollidingEnd:
SendSceneEvent(SymmetricSyncMessage.MsgType.ScriptLandCollidingEnd, data);
break;
}
}
private void OnLocalScriptCollidingStart(uint localID, ColliderArgs colliders) private void OnLocalScriptCollidingStart(uint localID, ColliderArgs colliders)
{ {
SceneObjectPart part = LocalScene.GetSceneObjectPart(localID); SceneObjectPart part = LocalScene.GetSceneObjectPart(localID);
if (part == null) if (part == null)
return; return;
/*
OSDArray collisionUUIDs = new OSDArray(); OSDArray collisionUUIDs = new OSDArray();
foreach (DetectedObject detObj in colliders.Colliders) foreach (DetectedObject detObj in colliders.Colliders)
{ {
@ -2823,9 +3046,45 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
OSDMap data = new OSDMap(); OSDMap data = new OSDMap();
data["primUUID"] = OSD.FromUUID(part.UUID); data["primUUID"] = OSD.FromUUID(part.UUID);
data["collisionUUIDs"] = collisionUUIDs; data["collisionUUIDs"] = collisionUUIDs;
* */
OSDMap data = PrepareCollisionArgs(localID, colliders);
SendSceneEvent(SymmetricSyncMessage.MsgType.ScriptCollidingStart, data); SendSceneEvent(SymmetricSyncMessage.MsgType.ScriptCollidingStart, data);
} }
private void OnLocalScriptColliding(uint localID, ColliderArgs colliders)
{
SceneObjectPart part = LocalScene.GetSceneObjectPart(localID);
if (part == null)
return;
OSDMap data = PrepareCollisionArgs(localID, colliders);
SendSceneEvent(SymmetricSyncMessage.MsgType.ScriptColliding, data);
}
private void OnLocalScriptCollidingEnd(uint localID, ColliderArgs colliders)
{
SceneObjectPart part = LocalScene.GetSceneObjectPart(localID);
if (part == null)
return;
OSDMap data = PrepareCollisionArgs(localID, colliders);
SendSceneEvent(SymmetricSyncMessage.MsgType.ScriptCollidingEnd, data);
}
private OSDMap PrepareCollisionArgs(uint localID, ColliderArgs colliders)
{
OSDMap data = new OSDMap();
SceneObjectPart part = LocalScene.GetSceneObjectPart(localID);
if (part == null)
return data;
OSDArray collisionUUIDs = new OSDArray();
foreach (DetectedObject detObj in colliders.Colliders)
{
collisionUUIDs.Add(OSD.FromUUID(detObj.keyUUID));
}
data["primUUID"] = OSD.FromUUID(part.UUID);
data["collisionUUIDs"] = collisionUUIDs;
return data;
}
//private void OnLocalScriptCollidingStart(uint localID, ColliderArgs OSDArray collisionUUIDs); //private void OnLocalScriptCollidingStart(uint localID, ColliderArgs OSDArray collisionUUIDs);
@ -2886,6 +3145,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
//Enqueue the prim with the set of updated properties, excluding the group properties //Enqueue the prim with the set of updated properties, excluding the group properties
if (propertiesWithSyncInfoUpdated.Count > 0) if (propertiesWithSyncInfoUpdated.Count > 0)
{ {
/*
lock (m_primPropertyUpdateLock) lock (m_primPropertyUpdateLock)
{ {
if (m_primPropertyUpdates.ContainsKey(part.UUID)) if (m_primPropertyUpdates.ContainsKey(part.UUID))
@ -2895,7 +3155,16 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
//Include the "property" into the list of updated properties. //Include the "property" into the list of updated properties.
//HashSet's Add function should handle it correctly whether the property //HashSet's Add function should handle it correctly whether the property
//is or is not in the set. //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 else
@ -2903,6 +3172,45 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
m_primPropertyUpdates.Add(part.UUID, propertiesWithSyncInfoUpdated); m_primPropertyUpdates.Add(part.UUID, propertiesWithSyncInfoUpdated);
} }
} }
* */
EnqueueUpdatedProperty(part, propertiesWithSyncInfoUpdated);
}
}
private void EnqueueUpdatedProperty(SceneObjectPart part, HashSet<SceneObjectPartSyncProperties> 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);
}
} }
} }
@ -2928,6 +3236,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
//Enqueue the prim with the set of updated properties //Enqueue the prim with the set of updated properties
if (propertiesToSync.Count > 0) if (propertiesToSync.Count > 0)
{ {
/*
lock (m_primPropertyUpdateLock) lock (m_primPropertyUpdateLock)
{ {
if (m_primPropertyUpdates.ContainsKey(part.UUID)) if (m_primPropertyUpdates.ContainsKey(part.UUID))
@ -2937,7 +3246,12 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
//Include the "property" into the list of updated properties. //Include the "property" into the list of updated properties.
//HashSet's Add function should handle it correctly whether the property //HashSet's Add function should handle it correctly whether the property
//is or is not in the set. //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 else
@ -2945,6 +3259,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
m_primPropertyUpdates.Add(part.UUID, propertiesToSync); m_primPropertyUpdates.Add(part.UUID, propertiesToSync);
} }
} }
* */
EnqueueUpdatedProperty(part, propertiesToSync);
} }
} }
@ -2955,6 +3271,40 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
/// </summary> /// </summary>
public void SyncOutPrimUpdates() public void SyncOutPrimUpdates()
{ {
//we are riding on this periodic events to check if there are un-handled sync event messages
if (m_savedSyncMessage.Count > 0)
{
System.Threading.ThreadPool.QueueUserWorkItem(delegate
{
List<SyncMessageRecord> savedSyncMessage;
lock (m_savedSyncMessage)
{
savedSyncMessage = new List<SyncMessageRecord>(m_savedSyncMessage);
m_savedSyncMessage.Clear();
}
foreach (SyncMessageRecord syncMsgSaved in savedSyncMessage)
{
SymmetricSyncMessage msg = syncMsgSaved.SyncMessage;
switch (msg.Type)
{
case SymmetricSyncMessage.MsgType.ScriptCollidingStart:
case SymmetricSyncMessage.MsgType.ScriptColliding:
case SymmetricSyncMessage.MsgType.ScriptCollidingEnd:
{
OSDMap data = DeserializeMessage(msg);
string init_actorID = data["actorID"].AsString();
ulong evSeqNum = data["seqNum"].AsULong();
HandleRemoteEvent_ScriptCollidingEvents(msg.Type, init_actorID, evSeqNum, data, syncMsgSaved.ReceivedTime);
break;
}
default:
break;
}
}
});
}
if (!IsSyncingWithOtherSyncNodes()) if (!IsSyncingWithOtherSyncNodes())
{ {
//no SyncConnector connected. clear update queues and return. //no SyncConnector connected. clear update queues and return.
@ -3774,6 +4124,9 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
/////////////////////// ///////////////////////
//SOG properties //SOG properties
/////////////////////// ///////////////////////
case SceneObjectPartSyncProperties.AbsolutePosition:
propertyData["Value"] = OSD.FromVector3((Vector3)LastUpdateValue);
break;
case SceneObjectPartSyncProperties.IsSelected: case SceneObjectPartSyncProperties.IsSelected:
propertyData["Value"] = OSD.FromBoolean((bool)LastUpdateValue); propertyData["Value"] = OSD.FromBoolean((bool)LastUpdateValue);
break; break;
@ -4021,6 +4374,9 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
/////////////////////// ///////////////////////
//SOG properties //SOG properties
/////////////////////// ///////////////////////
case SceneObjectPartSyncProperties.AbsolutePosition:
m_lastUpdateValue = (Object)(propertyData["Value"].AsVector3());
break;
case SceneObjectPartSyncProperties.IsSelected: case SceneObjectPartSyncProperties.IsSelected:
//propertyData["Value"] = OSD.FromBoolean((bool)LastUpdateValue); //propertyData["Value"] = OSD.FromBoolean((bool)LastUpdateValue);
m_lastUpdateValue = (Object)(propertyData["Value"].AsBoolean()); m_lastUpdateValue = (Object)(propertyData["Value"].AsBoolean());
@ -4372,6 +4728,14 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
//UpdateSOPProperty(part, m_propertiesSyncInfo[property]); //UpdateSOPProperty(part, m_propertiesSyncInfo[property]);
SetSOPPropertyValue(part, property); SetSOPPropertyValue(part, property);
propertiesUpdated.Add(property); propertiesUpdated.Add(property);
if (property == SceneObjectPartSyncProperties.TaskInventory)
{
//Mark the inventory as has changed, for proper backup
part.Inventory.ForceInventoryPersistence();
}
part.ParentGroup.HasGroupChanged = true;
} }
} }
catch (Exception e) catch (Exception e)
@ -4507,6 +4871,10 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
foreach (SceneObjectPartSyncProperties property in GroupProperties) foreach (SceneObjectPartSyncProperties property in GroupProperties)
{ {
SetSOPPropertyValue(sop, property); SetSOPPropertyValue(sop, property);
if (property == SceneObjectPartSyncProperties.AbsolutePosition)
{
}
} }
} }
@ -5001,7 +5369,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
} }
break; break;
case SceneObjectPartSyncProperties.GroupPosition: case SceneObjectPartSyncProperties.GroupPosition:
propertyUpdatedByLocal = CompareAndUpdateSOPGroupPosition(part, lastUpdateByLocalTS, syncID); propertyUpdatedByLocal = CompareAndUpdateSOPGroupPositionByLocal(part, lastUpdateByLocalTS, syncID);
break; break;
case SceneObjectPartSyncProperties.InventorySerial: case SceneObjectPartSyncProperties.InventorySerial:
if (!part.InventorySerial.Equals(m_propertiesSyncInfo[property].LastUpdateValue)) if (!part.InventorySerial.Equals(m_propertiesSyncInfo[property].LastUpdateValue))
@ -5647,7 +6015,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
} }
break; break;
case SceneObjectPartSyncProperties.Position: case SceneObjectPartSyncProperties.Position:
propertyUpdatedByLocal = CompareAndUpdateSOPPosition(part, lastUpdateByLocalTS, syncID); propertyUpdatedByLocal = CompareAndUpdateSOPPositionByLocal(part, lastUpdateByLocalTS, syncID);
break; break;
case SceneObjectPartSyncProperties.RotationalVelocity: case SceneObjectPartSyncProperties.RotationalVelocity:
if (!part.PhysActor.RotationalVelocity.Equals(m_propertiesSyncInfo[property].LastUpdateValue)) if (!part.PhysActor.RotationalVelocity.Equals(m_propertiesSyncInfo[property].LastUpdateValue))
@ -5698,6 +6066,24 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
/////////////////////// ///////////////////////
//SOG properties //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: case SceneObjectPartSyncProperties.IsSelected:
if (!part.ParentGroup.IsSelected.Equals(m_propertiesSyncInfo[property].LastUpdateValue)) if (!part.ParentGroup.IsSelected.Equals(m_propertiesSyncInfo[property].LastUpdateValue))
{ {
@ -5708,7 +6094,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
} }
else if (lastUpdateByLocalTS < m_propertiesSyncInfo[property].LastUpdateTimeStamp) else if (lastUpdateByLocalTS < m_propertiesSyncInfo[property].LastUpdateTimeStamp)
{ {
//overwrite PhysActor's data //overwrite SOG's data
part.ParentGroup.IsSelected = (bool)m_propertiesSyncInfo[property].LastUpdateValue; part.ParentGroup.IsSelected = (bool)m_propertiesSyncInfo[property].LastUpdateValue;
} }
} }
@ -5921,6 +6307,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
/////////////////////// ///////////////////////
//SOG properties //SOG properties
/////////////////////// ///////////////////////
case SceneObjectPartSyncProperties.AbsolutePosition:
return (Object)part.ParentGroup.AbsolutePosition;
case SceneObjectPartSyncProperties.IsSelected: case SceneObjectPartSyncProperties.IsSelected:
return (Object)part.ParentGroup.IsSelected; return (Object)part.ParentGroup.IsSelected;
} }
@ -5930,21 +6318,24 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
/// <summary> /// <summary>
/// Set the property's value based on the value maintained in PrimSyncInfoManager. /// 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).
/// </summary> /// </summary>
/// <param name="part"></param> /// <param name="part"></param>
/// <param name="property"></param> /// <param name="property"></param>
private void SetSOPPropertyValue(SceneObjectPart part, SceneObjectPartSyncProperties property) private void SetSOPPropertyValue(SceneObjectPart part, SceneObjectPartSyncProperties property)
{ {
if (part == null) return; 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()); //DebugLog.WarnFormat("SetSOPPropertyValue: property {0} not in record.", property.ToString());
//For phantom prims, they don't have physActor properties, //For phantom prims, they don't have physActor properties,
//so for those properties, simply return //so for those properties, simply return
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); DebugLog.WarnFormat("PrimSyncInfo.SetSOPPropertyValue: property {0} not in sync cache. ", property);
return; return;
@ -6265,6 +6656,9 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
/////////////////////// ///////////////////////
//SOG properties //SOG properties
/////////////////////// ///////////////////////
case SceneObjectPartSyncProperties.AbsolutePosition:
SetSOPAbsolutePosition(part, pSyncInfo);
break;
case SceneObjectPartSyncProperties.IsSelected: case SceneObjectPartSyncProperties.IsSelected:
if (part.ParentGroup != null) if (part.ParentGroup != null)
part.ParentGroup.IsSelected = (bool)pSyncInfo.LastUpdateValue; part.ParentGroup.IsSelected = (bool)pSyncInfo.LastUpdateValue;
@ -6275,6 +6669,45 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
//part.ScheduleFullUpdate(new List<SceneObjectPartSyncProperties>() { property }); //part.ScheduleFullUpdate(new List<SceneObjectPartSyncProperties>() { 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. //Do not call "part.CollisionSound =" to go through its set function.
//We don't want the side effect of calling aggregateScriptEvents. //We don't want the side effect of calling aggregateScriptEvents.
private void SetSOPCollisionSound(SceneObjectPart part, UUID cSound) private void SetSOPCollisionSound(SceneObjectPart part, UUID cSound)
@ -6305,9 +6738,36 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
part.ScheduleFullUpdate(null); 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 //In SOP's implementation, GroupPosition and SOP.PhysActor.Position are
//correlated. We need to make sure that they are both properly synced. //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)) if (!part.GroupPosition.Equals(m_propertiesSyncInfo[SceneObjectPartSyncProperties.GroupPosition].LastUpdateValue))
{ {
@ -6371,7 +6831,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
return false; return false;
} }
private bool CompareAndUpdateSOPPosition(SceneObjectPart part, long lastUpdateByLocalTS, string syncID) private bool CompareAndUpdateSOPPositionByLocal(SceneObjectPart part, long lastUpdateByLocalTS, string syncID)
{ {
if (part.PhysActor == null) if (part.PhysActor == null)
return false; return false;

View File

@ -72,6 +72,9 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
ScriptCollidingStart, ScriptCollidingStart,
ScriptColliding, ScriptColliding,
ScriptCollidingEnd, ScriptCollidingEnd,
ScriptLandCollidingStart,
ScriptLandColliding,
ScriptLandCollidingEnd,
//contorl command //contorl command
SyncStateReport, SyncStateReport,
} }

View File

@ -233,5 +233,8 @@ namespace OpenSim.Region.Framework.Interfaces
/// A <see cref="Dictionary`2"/> /// A <see cref="Dictionary`2"/>
/// </returns> /// </returns>
Dictionary<UUID, string> GetScriptStates(); Dictionary<UUID, string> GetScriptStates();
//DSG
bool UpdateInventoryItemBySync(TaskInventoryItem item);
} }
} }

View File

@ -63,7 +63,10 @@ namespace OpenSim.Region.Framework.Scenes
PhysicsCollision, PhysicsCollision,
ScriptCollidingStart, ScriptCollidingStart,
ScriptColliding, ScriptColliding,
ScriptCollidingEnd ScriptCollidingEnd,
ScriptLandCollidingStart,
ScriptLandColliding,
ScriptLandCollidingEnd
} }
public EventManager(Scene scene) public EventManager(Scene scene)
@ -158,7 +161,7 @@ namespace OpenSim.Region.Framework.Scenes
} }
#endregion //ChatFromClient #endregion //ChatFromClient
#region ChatBroadcast #region ChatBroadcast
public override void TriggerOnChatBroadcast(Object sender, OSChatMessage chat) public override void TriggerOnChatBroadcast(Object sender, OSChatMessage chat)
{ {
@ -176,7 +179,7 @@ namespace OpenSim.Region.Framework.Scenes
{ {
base.TriggerOnChatBroadcast(sender, chat); base.TriggerOnChatBroadcast(sender, chat);
} }
#endregion #endregion
#region ChatFromWorld #region ChatFromWorld
@ -280,7 +283,7 @@ namespace OpenSim.Region.Framework.Scenes
#endregion //GrabObject #endregion //GrabObject
#region collisions #region collisions
public override void TriggerScriptCollidingStart(uint localId, ColliderArgs colliders) public override void TriggerScriptCollidingStart(uint localId, ColliderArgs colliders)
{ {
if (m_scene.RegionSyncModule != null) if (m_scene.RegionSyncModule != null)
@ -297,7 +300,93 @@ namespace OpenSim.Region.Framework.Scenes
{ {
base.TriggerScriptCollidingStart(localId, colliders); base.TriggerScriptCollidingStart(localId, colliders);
} }
#endregion
public override void TriggerScriptColliding(uint localId, ColliderArgs colliders)
{
if (m_scene.RegionSyncModule != null)
{
Object[] eventArgs = new Object[4];
eventArgs[0] = (Object)localId;
eventArgs[1] = (Object)colliders;
m_scene.RegionSyncModule.PublishSceneEvent(EventNames.ScriptColliding, eventArgs);
}
TriggerScriptCollidingLocally(localId, colliders);
}
public void TriggerScriptCollidingLocally(uint localId, ColliderArgs colliders)
{
base.TriggerScriptColliding(localId, colliders);
}
public override void TriggerScriptCollidingEnd(uint localId, ColliderArgs colliders)
{
if (m_scene.RegionSyncModule != null)
{
Object[] eventArgs = new Object[4];
eventArgs[0] = (Object)localId;
eventArgs[1] = (Object)colliders;
m_scene.RegionSyncModule.PublishSceneEvent(EventNames.ScriptCollidingEnd, eventArgs);
}
TriggerScriptCollidingEndLocally(localId, colliders);
}
public void TriggerScriptCollidingEndLocally(uint localId, ColliderArgs colliders)
{
base.TriggerScriptCollidingEnd(localId, colliders);
}
public override void TriggerScriptLandCollidingStart(uint localId, ColliderArgs colliders)
{
if (m_scene.RegionSyncModule != null)
{
Object[] eventArgs = new Object[4];
eventArgs[0] = (Object)localId;
eventArgs[1] = (Object)colliders;
m_scene.RegionSyncModule.PublishSceneEvent(EventNames.ScriptLandCollidingStart, eventArgs);
}
TriggerScriptLandCollidingStartLocally(localId, colliders);
}
public void TriggerScriptLandCollidingStartLocally(uint localId, ColliderArgs colliders)
{
base.TriggerScriptLandCollidingStart(localId, colliders);
}
public override void TriggerScriptLandColliding(uint localId, ColliderArgs colliders)
{
if (m_scene.RegionSyncModule != null)
{
Object[] eventArgs = new Object[4];
eventArgs[0] = (Object)localId;
eventArgs[1] = (Object)colliders;
m_scene.RegionSyncModule.PublishSceneEvent(EventNames.ScriptLandColliding, eventArgs);
}
TriggerScriptLandCollidingLocally(localId, colliders);
}
public void TriggerScriptLandCollidingLocally(uint localId, ColliderArgs colliders)
{
base.TriggerScriptLandColliding(localId, colliders);
}
public override void TriggerScriptLandCollidingEnd(uint localId, ColliderArgs colliders)
{
if (m_scene.RegionSyncModule != null)
{
Object[] eventArgs = new Object[4];
eventArgs[0] = (Object)localId;
eventArgs[1] = (Object)colliders;
m_scene.RegionSyncModule.PublishSceneEvent(EventNames.ScriptLandCollidingEnd, eventArgs);
}
TriggerScriptLandCollidingEndLocally(localId, colliders);
}
public void TriggerScriptLandCollidingEndLocally(uint localId, ColliderArgs colliders)
{
base.TriggerScriptLandCollidingEnd(localId, colliders);
}
#endregion
} }
/// <summary> /// <summary>
@ -2248,7 +2337,8 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
public void TriggerScriptColliding(uint localId, ColliderArgs colliders) //public void TriggerScriptColliding(uint localId, ColliderArgs colliders)
public virtual void TriggerScriptColliding(uint localId, ColliderArgs colliders)
{ {
ScriptColliding handlerColliding = OnScriptColliding; ScriptColliding handlerColliding = OnScriptColliding;
if (handlerColliding != null) if (handlerColliding != null)
@ -2269,7 +2359,8 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
public void TriggerScriptCollidingEnd(uint localId, ColliderArgs colliders) //public void TriggerScriptCollidingEnd(uint localId, ColliderArgs colliders)
public virtual void TriggerScriptCollidingEnd(uint localId, ColliderArgs colliders)
{ {
ScriptColliding handlerCollidingEnd = OnScriptCollidingEnd; ScriptColliding handlerCollidingEnd = OnScriptCollidingEnd;
if (handlerCollidingEnd != null) if (handlerCollidingEnd != null)
@ -2290,7 +2381,8 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
public void TriggerScriptLandCollidingStart(uint localId, ColliderArgs colliders) //public void TriggerScriptLandCollidingStart(uint localId, ColliderArgs colliders)
public virtual void TriggerScriptLandCollidingStart(uint localId, ColliderArgs colliders)
{ {
ScriptColliding handlerLandCollidingStart = OnScriptLandColliderStart; ScriptColliding handlerLandCollidingStart = OnScriptLandColliderStart;
if (handlerLandCollidingStart != null) if (handlerLandCollidingStart != null)
@ -2311,7 +2403,8 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
public void TriggerScriptLandColliding(uint localId, ColliderArgs colliders) //public void TriggerScriptLandColliding(uint localId, ColliderArgs colliders)
public virtual void TriggerScriptLandColliding(uint localId, ColliderArgs colliders)
{ {
ScriptColliding handlerLandColliding = OnScriptLandColliding; ScriptColliding handlerLandColliding = OnScriptLandColliding;
if (handlerLandColliding != null) if (handlerLandColliding != null)
@ -2332,7 +2425,8 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
public void TriggerScriptLandCollidingEnd(uint localId, ColliderArgs colliders) //public void TriggerScriptLandCollidingEnd(uint localId, ColliderArgs colliders)
public virtual void TriggerScriptLandCollidingEnd(uint localId, ColliderArgs colliders)
{ {
ScriptColliding handlerLandCollidingEnd = OnScriptLandColliderEnd; ScriptColliding handlerLandCollidingEnd = OnScriptLandColliderEnd;
if (handlerLandCollidingEnd != null) if (handlerLandCollidingEnd != null)

View File

@ -327,7 +327,7 @@ namespace OpenSim.Region.Framework.Scenes
//Scene does permission checking, asset creation and storing, then informs Script Engine to //Scene does permission checking, asset creation and storing, then informs Script Engine to
//update the script. //update the script.
//////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////
//Only should be called when this is the cached Scene of script engine //Only should be called when this is the local Scene of script engine
public ArrayList OnUpdateScript(UUID avatarID, UUID itemID, UUID primID, bool isScriptRunning, UUID newAssetID) public ArrayList OnUpdateScript(UUID avatarID, UUID itemID, UUID primID, bool isScriptRunning, UUID newAssetID)
{ {
ArrayList errors = new ArrayList(); ArrayList errors = new ArrayList();
@ -353,7 +353,7 @@ namespace OpenSim.Region.Framework.Scenes
// Update item with new asset // Update item with new asset
item.AssetID = newAssetID; item.AssetID = newAssetID;
group.UpdateInventoryItem(item); group.UpdateInventoryItemBySync(item);
m_log.Debug("UpdateInventoryItem on object "+group.UUID); m_log.Debug("UpdateInventoryItem on object "+group.UUID);
if (isScriptRunning) if (isScriptRunning)
@ -419,9 +419,14 @@ namespace OpenSim.Region.Framework.Scenes
return new ArrayList(); return new ArrayList();
} }
// Update item with new asset // Update item with new asset.
// The actor that initiate the UpdateScript event should also send out
// a sync message for the updated task inventory. In case that sync message is
// not here year, we retrieve and update the task item -- w/o marking that
// the taskinventory is modified here, so that when the sync message is here,
// the actor and timestamp info will be copied.
item.AssetID = newAssetID; item.AssetID = newAssetID;
group.UpdateInventoryItem(item); group.UpdateInventoryItemBySync(item);
m_log.Debug("UpdateInventoryItem on object "+group.UUID); m_log.Debug("UpdateInventoryItem on object "+group.UUID);
if (isScriptRunning) if (isScriptRunning)

View File

@ -398,5 +398,33 @@ namespace OpenSim.Region.Framework.Scenes
parts[i].Inventory.SuspendScripts(); parts[i].Inventory.SuspendScripts();
} }
#endregion REGION SYNC #endregion REGION SYNC
#region DSG SYNC
/// <summary>
/// Update an existing inventory item.
/// </summary>
/// <param name="item">The updated item. An item with the same id must already exist
/// in this prim's inventory</param>
/// <returns>false if the item did not exist, true if the update occurred succesfully</returns>
public bool UpdateInventoryItemBySync(TaskInventoryItem item)
{
SceneObjectPart part = GetChildPart(item.ParentPartID);
if (part != null)
{
part.Inventory.UpdateInventoryItemBySync(item);
return true;
}
else
{
m_log.ErrorFormat(
"[PRIM INVENTORY]: " +
"Couldn't find prim ID {0} to update item {1}, {2}",
item.ParentPartID, item.Name, item.ItemID);
}
return false;
}
#endregion
} }
} }

View File

@ -988,7 +988,8 @@ namespace OpenSim.Region.Framework.Scenes
AttachToBackup(); AttachToBackup();
m_scene.EventManager.TriggerParcelPrimCountTainted(); m_scene.EventManager.TriggerParcelPrimCountTainted();
//m_rootPart.ScheduleFullUpdate(); //m_rootPart.ScheduleFullUpdate();
m_rootPart.ScheduleFullUpdate(new List<SceneObjectPartSyncProperties>() { SceneObjectPartSyncProperties.GroupPosition, SceneObjectPartSyncProperties.AttachmentPoint, //m_rootPart.ScheduleFullUpdate(new List<SceneObjectPartSyncProperties>() { SceneObjectPartSyncProperties.GroupPosition, SceneObjectPartSyncProperties.AttachmentPoint,
m_rootPart.ScheduleFullUpdate(new List<SceneObjectPartSyncProperties>() { SceneObjectPartSyncProperties.AbsolutePosition, SceneObjectPartSyncProperties.AttachmentPoint,
SceneObjectPartSyncProperties.AttachedAvatar, SceneObjectPartSyncProperties.Flags}); //Physics properties, such as Position, OffsetPosition, etc, should be tainted in ApplyPhysics() SceneObjectPartSyncProperties.AttachedAvatar, SceneObjectPartSyncProperties.Flags}); //Physics properties, such as Position, OffsetPosition, etc, should be tainted in ApplyPhysics()
m_rootPart.ClearUndoState(); m_rootPart.ClearUndoState();
} }
@ -1016,6 +1017,10 @@ namespace OpenSim.Region.Framework.Scenes
//m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_scene.m_physicalPrim); //m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_scene.m_physicalPrim);
//AttachToBackup(); //AttachToBackup();
//m_rootPart.ScheduleFullUpdate(); //m_rootPart.ScheduleFullUpdate();
//m_rootPart.ScheduleSyncUpdate(new List<SceneObjectPartSyncProperties>() { SceneObjectPartSyncProperties.GroupPosition, SceneObjectPartSyncProperties.AttachmentPoint,
m_rootPart.ScheduleSyncUpdate(new List<SceneObjectPartSyncProperties>() { SceneObjectPartSyncProperties.AbsolutePosition, SceneObjectPartSyncProperties.AttachmentPoint,
SceneObjectPartSyncProperties.AttachedAvatar, SceneObjectPartSyncProperties.Flags});
} }
/// <summary> /// <summary>
@ -2913,7 +2918,8 @@ namespace OpenSim.Region.Framework.Scenes
//we need to do a terse update even if the move wasn't allowed //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) // so that the position is reset in the client (the object snaps back)
//ScheduleGroupForTerseUpdate(); //ScheduleGroupForTerseUpdate();
List<SceneObjectPartSyncProperties> updatedProperties = new List<SceneObjectPartSyncProperties>() { SceneObjectPartSyncProperties.GroupPosition }; //List<SceneObjectPartSyncProperties> updatedProperties = new List<SceneObjectPartSyncProperties>() { SceneObjectPartSyncProperties.GroupPosition };
List<SceneObjectPartSyncProperties> updatedProperties = new List<SceneObjectPartSyncProperties>() { SceneObjectPartSyncProperties.AbsolutePosition };
if (IsAttachment) if (IsAttachment)
{ {
updatedProperties.Add(SceneObjectPartSyncProperties.AttachedPos); updatedProperties.Add(SceneObjectPartSyncProperties.AttachedPos);
@ -2982,7 +2988,8 @@ namespace OpenSim.Region.Framework.Scenes
HasGroupChanged = true; HasGroupChanged = true;
//ScheduleGroupForTerseUpdate(); //ScheduleGroupForTerseUpdate();
ScheduleGroupForTerseUpdate(new List<SceneObjectPartSyncProperties>(){SceneObjectPartSyncProperties.Position, SceneObjectPartSyncProperties.OffsetPosition}); //ScheduleGroupForTerseUpdate(new List<SceneObjectPartSyncProperties>(){SceneObjectPartSyncProperties.Position, SceneObjectPartSyncProperties.OffsetPosition});
ScheduleGroupForTerseUpdate(new List<SceneObjectPartSyncProperties>() { SceneObjectPartSyncProperties.AbsolutePosition, SceneObjectPartSyncProperties.OffsetPosition });
} }
public void OffsetForNewRegion(Vector3 offset) public void OffsetForNewRegion(Vector3 offset)
@ -3056,11 +3063,13 @@ namespace OpenSim.Region.Framework.Scenes
if (actor != null) if (actor != null)
{ {
//RotationOffset is only updated for m_rootPart, and m_rootPart.UpdateRotation should already taint RotationOffset as updated //RotationOffset is only updated for m_rootPart, and m_rootPart.UpdateRotation should already taint RotationOffset as updated
ScheduleGroupForTerseUpdate(new List<SceneObjectPartSyncProperties>() { SceneObjectPartSyncProperties.Position, SceneObjectPartSyncProperties.Orientation }); //ScheduleGroupForTerseUpdate(new List<SceneObjectPartSyncProperties>() { SceneObjectPartSyncProperties.Position, SceneObjectPartSyncProperties.Orientation });
ScheduleGroupForTerseUpdate(new List<SceneObjectPartSyncProperties>() { SceneObjectPartSyncProperties.AbsolutePosition, SceneObjectPartSyncProperties.Orientation });
} }
else else
{ {
ScheduleGroupForTerseUpdate(new List<SceneObjectPartSyncProperties>() { SceneObjectPartSyncProperties.Position }); //ScheduleGroupForTerseUpdate(new List<SceneObjectPartSyncProperties>() { SceneObjectPartSyncProperties.Position });
ScheduleGroupForTerseUpdate(new List<SceneObjectPartSyncProperties>() { SceneObjectPartSyncProperties.AbsolutePosition});
} }
} }

View File

@ -2804,7 +2804,8 @@ namespace OpenSim.Region.Framework.Scenes
SceneObjectPartSyncProperties.Position, SceneObjectPartSyncProperties.Position,
SceneObjectPartSyncProperties.Orientation, SceneObjectPartSyncProperties.Orientation,
SceneObjectPartSyncProperties.Velocity, SceneObjectPartSyncProperties.Velocity,
SceneObjectPartSyncProperties.RotationalVelocity SceneObjectPartSyncProperties.RotationalVelocity,
SceneObjectPartSyncProperties.PA_Acceleration
}); });
//SendTerseUpdateToAllClients(); //SendTerseUpdateToAllClients();
@ -5041,6 +5042,7 @@ namespace OpenSim.Region.Framework.Scenes
VolumeDetectActive, VolumeDetectActive,
//Group properties //Group properties
AbsolutePosition,
IsSelected, IsSelected,
//Client Manager may want to add some property here that viewers care about and should be synchronized across actors //Client Manager may want to add some property here that viewers care about and should be synchronized across actors
@ -5169,8 +5171,10 @@ namespace OpenSim.Region.Framework.Scenes
public static HashSet<SceneObjectPartSyncProperties> GetGroupProperties() public static HashSet<SceneObjectPartSyncProperties> GetGroupProperties()
{ {
HashSet<SceneObjectPartSyncProperties> allProperties = new HashSet<SceneObjectPartSyncProperties>(){SceneObjectPartSyncProperties.IsSelected}; HashSet<SceneObjectPartSyncProperties> groupProperties = new HashSet<SceneObjectPartSyncProperties>();
return allProperties; groupProperties.Add(SceneObjectPartSyncProperties.IsSelected);
groupProperties.Add(SceneObjectPartSyncProperties.AbsolutePosition);
return groupProperties;
} }
public static HashSet<SceneObjectPartSyncProperties> GetTerseUpdateProperties() public static HashSet<SceneObjectPartSyncProperties> GetTerseUpdateProperties()
@ -5185,41 +5189,13 @@ namespace OpenSim.Region.Framework.Scenes
allProperties.Add(SceneObjectPartSyncProperties.Orientation); allProperties.Add(SceneObjectPartSyncProperties.Orientation);
allProperties.Add(SceneObjectPartSyncProperties.RotationalVelocity); allProperties.Add(SceneObjectPartSyncProperties.RotationalVelocity);
allProperties.Add(SceneObjectPartSyncProperties.Position); allProperties.Add(SceneObjectPartSyncProperties.Position);
allProperties.Add(SceneObjectPartSyncProperties.AbsolutePosition);
return allProperties; return allProperties;
} }
#endregion SceneObjectPartSyncProperties categorization #endregion SceneObjectPartSyncProperties categorization
/*
#region overridden SOPBase members
public new IEntityInventory Inventory
{
get { return m_inventory; }
}
protected new SceneObjectPartInventory m_inventory;
/// <value>
/// Access should be via Inventory directly - this property temporarily remains for xml serialization purposes
/// </value>
public new uint InventorySerial
{
get { return m_inventory.Serial; }
set { m_inventory.Serial = value; }
}
/// <value>
/// Access should be via Inventory directly - this property temporarily remains for xml serialization purposes
/// </value>
public new TaskInventoryDictionary TaskInventory
{
get { return m_inventory.Items; }
set { m_inventory.Items = value; }
}
#endregion //overridden SOPBase members
*/
#region overridden SOPBase functions #region overridden SOPBase functions
//Implementation of ScheduleFullUpdate and ScheduleTerseUpdate for Bucket //Implementation of ScheduleFullUpdate and ScheduleTerseUpdate for Bucket
//based synchronization //based synchronization

View File

@ -727,6 +727,9 @@ namespace OpenSim.Region.Framework.Scenes
{ {
HasInventoryChanged = true; HasInventoryChanged = true;
m_part.ParentGroup.HasGroupChanged = true; m_part.ParentGroup.HasGroupChanged = true;
//DSG
m_part.ScheduleSyncUpdate(new List<SceneObjectPartSyncProperties>(){SceneObjectPartSyncProperties.TaskInventory});
} }
return true; return true;
@ -1182,6 +1185,68 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
#endregion REGION SYNC #endregion REGION SYNC
#region DSG SYNC
/// <summary>
/// Update an existing inventory item.
/// </summary>
/// <param name="item">The updated item. An item with the same id must already exist
/// in this prim's inventory.</param>
/// <returns>false if the item did not exist, true if the update occurred successfully</returns>
public bool UpdateInventoryItemBySync(TaskInventoryItem item)
{
return UpdateInventoryItemBySync(item, true, true);
}
//Similar to UpdateInventoryItem except that ScheduleSyncUpdate is not triggered
private bool UpdateInventoryItemBySync(TaskInventoryItem item, bool fireScriptEvents, bool considerChanged)
{
TaskInventoryItem it = GetInventoryItem(item.ItemID);
if (it != null)
{
// m_log.DebugFormat("[PRIM INVENTORY]: Updating item {0} in {1}", item.Name, m_part.Name);
item.ParentID = m_part.UUID;
item.ParentPartID = m_part.UUID;
// If group permissions have been set on, check that the groupID is up to date in case it has
// changed since permissions were last set.
if (item.GroupPermissions != (uint)PermissionMask.None)
item.GroupID = m_part.GroupID;
if (item.AssetID == UUID.Zero)
item.AssetID = it.AssetID;
lock (m_items)
{
m_items[item.ItemID] = item;
m_inventorySerial++;
}
if (fireScriptEvents)
m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
if (considerChanged)
{
HasInventoryChanged = true;
m_part.ParentGroup.HasGroupChanged = true;
}
return true;
}
else
{
m_log.ErrorFormat(
"[PRIM INVENTORY]: " +
"Tried to retrieve item ID {0} from prim {1}, {2} at {3} in {4} but the item does not exist in this inventory",
item.ItemID, m_part.Name, m_part.UUID,
m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName);
}
return false;
}
#endregion DSG SYNC
} }
/* /*

View File

@ -93,6 +93,7 @@ public class BSCharacter : PhysicsActor
_size = size; _size = size;
_orientation = Quaternion.Identity; _orientation = Quaternion.Identity;
_velocity = Vector3.Zero; _velocity = Vector3.Zero;
_buoyancy = 0f; // characters return a buoyancy of zero
_scale = new Vector3(1f, 1f, 1f); _scale = new Vector3(1f, 1f, 1f);
float AVvolume = (float) (Math.PI*Math.Pow(CAPSULE_RADIUS, 2)*CAPSULE_LENGTH); float AVvolume = (float) (Math.PI*Math.Pow(CAPSULE_RADIUS, 2)*CAPSULE_LENGTH);
_mass = _density*AVvolume; _mass = _density*AVvolume;
@ -105,8 +106,8 @@ public class BSCharacter : PhysicsActor
shapeData.Velocity = _velocity; shapeData.Velocity = _velocity;
shapeData.Scale = _scale; shapeData.Scale = _scale;
shapeData.Mass = _mass; shapeData.Mass = _mass;
shapeData.Flying = isFlying ? ShapeData.numericTrue : ShapeData.numericFalse; shapeData.Buoyancy = isFlying ? 0f : 1f;
shapeData.Dynamic = ShapeData.numericFalse; shapeData.Static = ShapeData.numericFalse;
BulletSimAPI.CreateObject(parent_scene.WorldID, shapeData); BulletSimAPI.CreateObject(parent_scene.WorldID, shapeData);
@ -131,6 +132,7 @@ public class BSCharacter : PhysicsActor
if (ChangingActorID == RegionSyncServerModule.ActorID) if (ChangingActorID == RegionSyncServerModule.ActorID)
{ {
// m_log.DebugFormat("{0}: Sending terse update for {1}", LogHeader, LocalID); // m_log.DebugFormat("{0}: Sending terse update for {1}", LogHeader, LocalID);
ChangingActorID = "XX"; // undo our mark on the changes so this won't get sent over and over
PhysEngineToSceneConnectorModule.RouteUpdate(this); PhysEngineToSceneConnectorModule.RouteUpdate(this);
} }
} }
@ -268,7 +270,8 @@ public class BSCharacter : PhysicsActor
_flying = value; _flying = value;
_scene.TaintedObject(delegate() _scene.TaintedObject(delegate()
{ {
BulletSimAPI.SetObjectFlying(_scene.WorldID, LocalID, _flying); // simulate flying by changing the effect of gravity
BulletSimAPI.SetObjectBuoyancy(_scene.WorldID, LocalID, _flying ? 0f : 1f);
}); });
} }
} }
@ -415,7 +418,7 @@ public class BSCharacter : PhysicsActor
{ {
// m_log.DebugFormat("{0}: Collide: ms={1}, id={2}, with={3}", LogHeader, _subscribedEventsMs, LocalID, collidingWith); // m_log.DebugFormat("{0}: Collide: ms={1}, id={2}, with={3}", LogHeader, _subscribedEventsMs, LocalID, collidingWith);
// The following says we're colliding this simulation step // The following makes IsColliding() and IsCollidingGround() work
_collidingStep = _scene.SimulationStep; _collidingStep = _scene.SimulationStep;
if (collidingWith == BSScene.TERRAIN_ID || collidingWith == BSScene.GROUNDPLANE_ID) if (collidingWith == BSScene.TERRAIN_ID || collidingWith == BSScene.GROUNDPLANE_ID)
{ {

View File

@ -106,6 +106,7 @@ public sealed class BSPrim : PhysicsActor
_size = size; _size = size;
_scale = new OMV.Vector3(1f, 1f, 1f); // the scale will be set by CreateGeom depending on object type _scale = new OMV.Vector3(1f, 1f, 1f); // the scale will be set by CreateGeom depending on object type
_orientation = rotation; _orientation = rotation;
_buoyancy = 1f;
_mesh = mesh; _mesh = mesh;
_hullKey = 0; _hullKey = 0;
_pbs = pbs; _pbs = pbs;
@ -181,7 +182,6 @@ public sealed class BSPrim : PhysicsActor
_isSelected = value; _isSelected = value;
_scene.TaintedObject(delegate() _scene.TaintedObject(delegate()
{ {
m_log.DebugFormat("{0}: Selected={1}, localID={2}", LogHeader, _isSelected, _localID);
SetObjectDynamic(); SetObjectDynamic();
// SyncUpdated = true; // SyncUpdated = true;
}); });
@ -287,6 +287,7 @@ public sealed class BSPrim : PhysicsActor
public override OMV.Vector3 Position { public override OMV.Vector3 Position {
get { get {
// don't do the following GetObjectPosition because this function is called a zillion times
// _position = BulletSimAPI.GetObjectPosition(_scene.WorldID, _localID); // _position = BulletSimAPI.GetObjectPosition(_scene.WorldID, _localID);
return _position; return _position;
} }
@ -332,10 +333,7 @@ public sealed class BSPrim : PhysicsActor
_isVolumeDetect = newValue; _isVolumeDetect = newValue;
_scene.TaintedObject(delegate() _scene.TaintedObject(delegate()
{ {
// make the object ghostly or not (walk throughable) SetObjectDynamic();
BulletSimAPI.SetObjectGhost(_scene.WorldID, LocalID, _isVolumeDetect);
// set whether we hear about collisions
BulletSimAPI.SetObjectCollidable(_scene.WorldID, LocalID, !IsPhantom);
}); });
} }
return; return;
@ -390,40 +388,39 @@ public sealed class BSPrim : PhysicsActor
_scene.TaintedObject(delegate() _scene.TaintedObject(delegate()
{ {
SetObjectDynamic(); SetObjectDynamic();
m_log.DebugFormat("{0}: ID={1}, IsPhysical={2}, IsSelected={3}, mass={4}", LogHeader, _localID, _isPhysical, _isSelected, _mass);
// SyncUpdated = true; // SyncUpdated = true;
}); });
} }
} }
// An object is static (does not move) if selected or not physical
private bool IsStatic
{
get { return _isSelected || !IsPhysical; }
}
// An object is solid if it's not phantom and if it's not doing VolumeDetect
private bool IsSolid
{
get { return !IsPhantom && !_isVolumeDetect; }
}
// make gravity work if the object is physical and not selected // make gravity work if the object is physical and not selected
// no locking here because only called when it is safe // no locking here because only called when it is safe
private void SetObjectDynamic() private void SetObjectDynamic()
{ {
// a selected object is not physical // non-physical things work best with a mass of zero
if (_isSelected || !_isPhysical) _mass = IsStatic ? 0f : CalculateMass();
{ BulletSimAPI.SetObjectProperties(_scene.WorldID, LocalID, IsStatic, IsSolid, SubscribedEvents(), _mass);
_mass = 0f; // non-physical things work best with a mass of zero // m_log.DebugFormat("{0}: ID={1}, SetObjectDynamic: IsStatic={2}, IsSolid={3}, mass={4}", LogHeader, _localID, IsStatic, IsSolid, _mass);
BulletSimAPI.SetObjectDynamic(_scene.WorldID, _localID, false, _mass);
}
else
{
_mass = CalculateMass();
BulletSimAPI.SetObjectDynamic(_scene.WorldID, _localID, true, _mass);
}
} }
// prims don't fly
public override bool Flying { public override bool Flying {
get { return _flying; } get { return _flying; }
set { set { _flying = value; }
_flying = value;
_scene.TaintedObject(delegate()
{
BulletSimAPI.SetObjectFlying(_scene.WorldID, LocalID, _flying);
// SyncUpdated = true;
});
}
} }
public override bool public override bool SetAlwaysRun {
SetAlwaysRun {
get { return _setAlwaysRun; } get { return _setAlwaysRun; }
set { _setAlwaysRun = value; } set { _setAlwaysRun = value; }
} }
@ -431,12 +428,12 @@ public sealed class BSPrim : PhysicsActor
get { return _throttleUpdates; } get { return _throttleUpdates; }
set { _throttleUpdates = value; } set { _throttleUpdates = value; }
} }
public override bool IsColliding { public override bool IsColliding {
get { return _isColliding; } get { return (_collidingStep == _scene.SimulationStep); }
set { _isColliding = value; } set { _isColliding = value; }
} }
public override bool CollidingGround { public override bool CollidingGround {
get { return _collidingGround; } get { return (_collidingGroundStep == _scene.SimulationStep); }
set { _collidingGround = value; } set { _collidingGround = value; }
} }
public override bool CollidingObj { public override bool CollidingObj {
@ -468,7 +465,12 @@ public sealed class BSPrim : PhysicsActor
} }
public override float Buoyancy { public override float Buoyancy {
get { return _buoyancy; } get { return _buoyancy; }
set { _buoyancy = value; } set { _buoyancy = value;
_scene.TaintedObject(delegate()
{
BulletSimAPI.SetObjectBuoyancy(_scene.WorldID, _localID, _buoyancy);
});
}
} }
// Used for MoveTo // Used for MoveTo
@ -1003,11 +1005,11 @@ public sealed class BSPrim : PhysicsActor
shape.Velocity = _velocity; shape.Velocity = _velocity;
shape.Scale = _scale; shape.Scale = _scale;
shape.Mass = _isPhysical ? _mass : 0f; shape.Mass = _isPhysical ? _mass : 0f;
shape.Buoyancy = _buoyancy;
shape.MeshKey = _hullKey; shape.MeshKey = _hullKey;
shape.Collidable = (!IsPhantom) ? ShapeData.numericTrue : ShapeData.numericFalse; shape.Collidable = (!IsPhantom) ? ShapeData.numericTrue : ShapeData.numericFalse;
shape.Flying = _flying ? ShapeData.numericTrue : ShapeData.numericFalse;
shape.Friction = _friction; shape.Friction = _friction;
shape.Dynamic = _isPhysical ? ShapeData.numericTrue : ShapeData.numericFalse; shape.Static = _isPhysical ? ShapeData.numericFalse : ShapeData.numericTrue;
} }
// Rebuild the geometry and object. // Rebuild the geometry and object.
@ -1044,7 +1046,7 @@ public sealed class BSPrim : PhysicsActor
public void UpdateProperties(EntityProperties entprop) public void UpdateProperties(EntityProperties entprop)
{ {
bool changed = false; bool changed = false;
// we assign to the local variables so the normal set action does not happen // assign to the local variables so the normal set action does not happen
if (_position != entprop.Position) if (_position != entprop.Position)
{ {
_position = entprop.Position; _position = entprop.Position;

View File

@ -35,23 +35,24 @@ using OpenSim.Region.Physics.Manager;
using OpenMetaverse; using OpenMetaverse;
using OpenSim.Region.Framework; using OpenSim.Region.Framework;
// TODOs for BulletSim (both BSScene and BSPrim) // TODOs for BulletSim (for BSScene, BSPrim, BSCharacter and BulletSim)
// Does NeedsMeshing() really need to exclude all the different shapes? // Does NeedsMeshing() really need to exclude all the different shapes?
// Based on material, set density and friction // Based on material, set density and friction
// More efficient memory usage in passing hull information from BSPrim to BulletSim // More efficient memory usage in passing hull information from BSPrim to BulletSim
// Four states of prim: Physical, regular, phantom and selected. Are we modeling these correctly? // Four states of prim: Physical, regular, phantom and selected. Are we modeling these correctly?
// In SL one can set both physical and phantom (gravity, does not effect others, makes collisions with ground) // In SL one can set both physical and phantom (gravity, does not effect others, makes collisions with ground)
// At the moment, physical and phantom causes object to drop through the terrain
// LinkSets // LinkSets
// Freeing of memory of linksets in BulletSim::DestroyObject // Freeing of memory of linksets in BulletSim::DestroyObject
// Set child prims phantom since the physicality is handled by the parent prim // Set child prims phantom since the physicality is handled by the parent prim
// Linked children need rotation relative to parent (passed as world rotation) // Linked children need rotation relative to parent (passed as world rotation)
// Should prim.link() and prim.delink() membership checking happen at taint time? // Should prim.link() and prim.delink() membership checking happen at taint time?
// Pass collision enable flags to BulletSim code so collisions are not reported up unless they are really needed
// Set bouyancy(). Maybe generalize SetFlying() to SetBouyancy() and use the factor to change the gravity effect
// Test sculpties // Test sculpties
// Mesh sharing. Use meshHash to tell if we already have a hull of that shape and only create once // Mesh sharing. Use meshHash to tell if we already have a hull of that shape and only create once
// Do attachments need to be handled separately? Need collision events. Do not collide with VolumeDetect // Do attachments need to be handled separately? Need collision events. Do not collide with VolumeDetect
// Parameterize BulletSim. Pass a structure of parameters to the C++ code. Capsule size, friction, ... // Parameterize BulletSim. Pass a structure of parameters to the C++ code. Capsule size, friction, ...
// Use event subscription times to reduce the number of events passed up (_subscribedEventMS)
// Implement the genCollisions feature in BulletSim::SetObjectProperties (don't pass up unneeded collisions)
// //
namespace OpenSim.Region.Physics.BulletSPlugin namespace OpenSim.Region.Physics.BulletSPlugin
{ {

View File

@ -59,11 +59,11 @@ public struct ShapeData
public Vector3 Velocity; public Vector3 Velocity;
public Vector3 Scale; public Vector3 Scale;
public float Mass; public float Mass;
public float Buoyancy;
public System.UInt64 MeshKey; public System.UInt64 MeshKey;
public int Collidable; public int Collidable;
public int Flying;
public float Friction; public float Friction;
public int Dynamic; public int Static; // true if a static object. Otherwise gravity, etc.
// note that bools are passed as ints since bool size changes by language // note that bools are passed as ints since bool size changes by language
} }
public struct SweepHit public struct SweepHit
@ -148,7 +148,10 @@ public static extern bool SetObjectDynamic(uint worldID, uint id, bool isDynamic
public static extern bool SetObjectGhost(uint worldID, uint id, bool ghostly); public static extern bool SetObjectGhost(uint worldID, uint id, bool ghostly);
[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
public static extern bool SetObjectFlying(uint worldID, uint id, bool flying); public static extern bool SetObjectProperties(uint worldID, uint id, bool isStatic, bool isSolid, bool genCollisions, float mass);
[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
public static extern bool SetObjectBuoyancy(uint worldID, uint id, float buoyancy);
[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
public static extern bool HasObject(uint worldID, uint id); public static extern bool HasObject(uint worldID, uint id);

Binary file not shown.