lost in updates

0.9.1.0-post-fixes
UbitUmarov 2018-12-31 13:33:00 +00:00
parent d841c593b9
commit ae00623b65
7 changed files with 139 additions and 70 deletions

View File

@ -356,7 +356,7 @@ namespace OpenSim.Region.ClientStack.Linden
rootGroup.LinkToGroup(allparts[j]); rootGroup.LinkToGroup(allparts[j]);
} }
rootGroup.ScheduleGroupForFullUpdate(); rootGroup.ScheduleGroupForFullAnimUpdate();
pos pos
= m_scene.GetNewRezLocation( = m_scene.GetNewRezLocation(
Vector3.Zero, rootpos, UUID.Zero, rot, (byte)1, 1, true, allparts[0].GroupScale, false); Vector3.Zero, rootpos, UUID.Zero, rot, (byte)1, 1, true, allparts[0].GroupScale, false);

View File

@ -1096,7 +1096,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
// will succeed, as that will not update if an attachment is selected. // will succeed, as that will not update if an attachment is selected.
so.IsSelected = false; // fudge.... so.IsSelected = false; // fudge....
so.ScheduleGroupForFullUpdate(); so.ScheduleGroupForFullAnimUpdate();
} }
// In case it is later dropped again, don't let // In case it is later dropped again, don't let

View File

@ -2537,7 +2537,7 @@ namespace OpenSim.Region.Framework.Scenes
sceneObject.RootPart.CreatorIdentification = UserManagementModule.GetUserUUI(ownerID); sceneObject.RootPart.CreatorIdentification = UserManagementModule.GetUserUUI(ownerID);
sceneObject.InvalidateDeepEffectivePerms();; sceneObject.InvalidateDeepEffectivePerms();;
sceneObject.ScheduleGroupForFullUpdate(); sceneObject.ScheduleGroupForFullAnimUpdate();
return sceneObject; return sceneObject;
} }

View File

@ -485,7 +485,7 @@ namespace OpenSim.Region.Framework.Scenes
} }
if (sendClientUpdates) if (sendClientUpdates)
sceneObject.ScheduleGroupForFullUpdate(); sceneObject.ScheduleGroupForFullAnimUpdate();
if (attachToBackup) if (attachToBackup)
sceneObject.AttachToBackup(); sceneObject.AttachToBackup();
@ -1825,7 +1825,6 @@ namespace OpenSim.Region.Framework.Scenes
try try
{ {
List<SceneObjectGroup> childGroups = new List<SceneObjectGroup>(); List<SceneObjectGroup> childGroups = new List<SceneObjectGroup>();
// We do this in reverse to get the link order of the prims correct // We do this in reverse to get the link order of the prims correct
@ -1870,8 +1869,6 @@ namespace OpenSim.Region.Framework.Scenes
{ {
parentGroup.RootPart.CreateSelected = true; parentGroup.RootPart.CreateSelected = true;
parentGroup.TriggerScriptChangedEvent(Changed.LINK); parentGroup.TriggerScriptChangedEvent(Changed.LINK);
parentGroup.HasGroupChanged = true;
parentGroup.ScheduleGroupForFullUpdate();
} }
} }
finally finally
@ -1886,7 +1883,7 @@ namespace OpenSim.Region.Framework.Scenes
parentGroup.AdjustChildPrimPermissions(false); parentGroup.AdjustChildPrimPermissions(false);
parentGroup.HasGroupChanged = true; parentGroup.HasGroupChanged = true;
parentGroup.ProcessBackup(m_parentScene.SimulationDataService, true); parentGroup.ProcessBackup(m_parentScene.SimulationDataService, true);
parentGroup.ScheduleGroupForFullUpdate(); parentGroup.ScheduleGroupForFullAnimUpdate();
Monitor.Exit(m_updateLock); Monitor.Exit(m_updateLock);
} }
} }
@ -1949,7 +1946,7 @@ namespace OpenSim.Region.Framework.Scenes
child.ParentGroup.DelinkFromGroup(child, true); child.ParentGroup.DelinkFromGroup(child, true);
//child.ParentGroup is now other //child.ParentGroup is now other
child.ParentGroup.HasGroupChanged = true; child.ParentGroup.HasGroupChanged = true;
child.ParentGroup.ScheduleGroupForFullUpdate(); child.ParentGroup.ScheduleGroupForFullAnimUpdate();
} }
} }
@ -1991,7 +1988,7 @@ namespace OpenSim.Region.Framework.Scenes
newRoot.TriggerScriptChangedEvent(Changed.LINK); newRoot.TriggerScriptChangedEvent(Changed.LINK);
newRoot.ParentGroup.HasGroupChanged = true; newRoot.ParentGroup.HasGroupChanged = true;
newRoot.ParentGroup.InvalidatePartsLinkMaps(); newRoot.ParentGroup.InvalidatePartsLinkMaps();
newRoot.ParentGroup.ScheduleGroupForFullUpdate(); newRoot.ParentGroup.ScheduleGroupForFullAnimUpdate();
} }
} }
@ -2131,7 +2128,7 @@ namespace OpenSim.Region.Framework.Scenes
copy.ResumeScripts(); copy.ResumeScripts();
copy.HasGroupChanged = true; copy.HasGroupChanged = true;
copy.ScheduleGroupForFullUpdate(); copy.ScheduleGroupForFullAnimUpdate();
return copy; return copy;
} }
} }

View File

@ -950,7 +950,7 @@ namespace OpenSim.Region.Framework.Scenes
sog.inTransit = false; sog.inTransit = false;
AttachToBackup(); AttachToBackup();
sog.ScheduleGroupForFullUpdate(); sog.ScheduleGroupForFullAnimUpdate();
} }
} }
@ -2668,7 +2668,7 @@ namespace OpenSim.Region.Framework.Scenes
dupe.HasGroupChanged = true; dupe.HasGroupChanged = true;
dupe.AttachToBackup(); dupe.AttachToBackup();
dupe.ScheduleGroupForFullUpdate(); dupe.ScheduleGroupForFullAnimUpdate();
} }
dupe.InvalidatePartsLinkMaps(); dupe.InvalidatePartsLinkMaps();
@ -3028,10 +3028,12 @@ namespace OpenSim.Region.Framework.Scenes
/// </remarks> /// </remarks>
public void ScheduleGroupForFullUpdate() public void ScheduleGroupForFullUpdate()
{ {
// if (IsAttachment) // if (IsAttachment)
// m_log.DebugFormat("[SOG]: Scheduling full update for {0} {1}", Name, LocalId); // m_log.DebugFormat("[SOG]: Scheduling full update for {0} {1}", Name, LocalId);
checkAtTargets(); checkAtTargets();
if (Scene.GetNumberOfClients() == 0)
return;
RootPart.ScheduleFullUpdate(); RootPart.ScheduleFullUpdate();
SceneObjectPart[] parts = m_parts.GetArray(); SceneObjectPart[] parts = m_parts.GetArray();
@ -3043,6 +3045,40 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
public void ScheduleGroupForFullAnimUpdate()
{
// if (IsAttachment)
// m_log.DebugFormat("[SOG]: Scheduling full update for {0} {1}", Name, LocalId);
checkAtTargets();
if (Scene.GetNumberOfClients() == 0)
return;
SceneObjectPart[] parts = m_parts.GetArray();
if (!RootPart.Shape.MeshFlagEntry)
{
RootPart.ScheduleFullUpdate();
for (int i = 0; i < parts.Length; i++)
{
SceneObjectPart part = parts[i];
if (part != RootPart)
part.ScheduleFullUpdate();
}
return;
}
RootPart.ScheduleFullAnimUpdate();
for (int i = 0; i < parts.Length; i++)
{
SceneObjectPart part = parts[i];
if (part != RootPart)
part.ScheduleFullAnimUpdate();
}
}
/// <summary> /// <summary>
/// Schedule a terse update for this scene object to all interested viewers. /// Schedule a terse update for this scene object to all interested viewers.
/// </summary> /// </summary>
@ -3060,36 +3096,6 @@ namespace OpenSim.Region.Framework.Scenes
parts[i].ScheduleTerseUpdate(); parts[i].ScheduleTerseUpdate();
} }
/// <summary>
/// Immediately send a full update for this scene object.
/// </summary>
public void SendGroupFullUpdate()
{
if (IsDeleted)
return;
// m_log.DebugFormat("[SOG]: Sending immediate full group update for {0} {1}", Name, UUID);
if (IsAttachment)
{
ScenePresence sp = m_scene.GetScenePresence(AttachedAvatar);
if (sp != null)
{
sp.SendAttachmentUpdate(this, PrimUpdateFlags.FullUpdate);
return;
}
}
RootPart.SendFullUpdateToAllClientsNoAttachment();
SceneObjectPart[] parts = m_parts.GetArray();
for (int i = 0; i < parts.Length; i++)
{
SceneObjectPart part = parts[i];
if (part != RootPart)
part.SendFullUpdateToAllClientsNoAttachment();
}
}
/// <summary> /// <summary>
/// Immediately send an update for this scene object's root prim only. /// Immediately send an update for this scene object's root prim only.
/// This is for updates regarding the object as a whole, and none of its parts in particular. /// This is for updates regarding the object as a whole, and none of its parts in particular.

View File

@ -3297,6 +3297,26 @@ namespace OpenSim.Region.Framework.Scenes
ParentGroup.Scene.EventManager.TriggerSceneObjectPartUpdated(this, true); ParentGroup.Scene.EventManager.TriggerSceneObjectPartUpdated(this, true);
} }
public void ScheduleFullAnimUpdate()
{
if (ParentGroup == null || ParentGroup.IsDeleted || ParentGroup.Scene == null)
return;
if (ParentGroup.Scene.GetNumberOfClients() == 0)
return;
PrimUpdateFlags update = PrimUpdateFlags.FullUpdatewithAnim;
if (Animations == null || !ParentGroup.RootPart.Shape.MeshFlagEntry)
update = PrimUpdateFlags.FullUpdate;
ParentGroup.QueueForUpdateCheck(); // just in case
lock (UpdateFlagLock)
UpdateFlag |= update;
ParentGroup.Scene.EventManager.TriggerSceneObjectPartUpdated(this, true);
}
/// <summary> /// <summary>
/// Schedule a terse update for this prim. Terse updates only send position, /// Schedule a terse update for this prim. Terse updates only send position,
/// rotation, velocity and rotational velocity information. /// rotation, velocity and rotational velocity information.
@ -3334,6 +3354,11 @@ namespace OpenSim.Region.Framework.Scenes
if (ParentGroup == null || ParentGroup.IsDeleted || ParentGroup.Scene == null) if (ParentGroup == null || ParentGroup.IsDeleted || ParentGroup.Scene == null)
return; return;
if (Animations == null)
update &= ~PrimUpdateFlags.Animations;
if (update == PrimUpdateFlags.None)
return;
ParentGroup.HasGroupChanged = true; ParentGroup.HasGroupChanged = true;
if (ParentGroup.Scene.GetNumberOfClients() == 0) if (ParentGroup.Scene.GetNumberOfClients() == 0)
@ -4571,7 +4596,7 @@ namespace OpenSim.Region.Framework.Scenes
if (ParentGroup != null) if (ParentGroup != null)
{ {
ParentGroup.HasGroupChanged = true; ParentGroup.HasGroupChanged = true;
ScheduleFullUpdate(); ScheduleFullAnimUpdate();
} }
} }
@ -5367,16 +5392,23 @@ namespace OpenSim.Region.Framework.Scenes
#endregion Public Methods #endregion Public Methods
public void SendUpdateToClient(IClientAPI remoteClient, PrimUpdateFlags PrimUpdateFlags) public void SendUpdateToClient(IClientAPI remoteClient, PrimUpdateFlags update)
{ {
if (ParentGroup.IsDeleted) if (ParentGroup.IsDeleted)
return; return;
if (Animations == null)
{
update &= ~PrimUpdateFlags.Animations;
if (update == PrimUpdateFlags.None)
return;
}
if (ParentGroup.IsAttachment && if (ParentGroup.IsAttachment &&
(ParentGroup.RootPart != this || ParentGroup.AttachedAvatar != remoteClient.AgentId && ParentGroup.HasPrivateAttachmentPoint)) (ParentGroup.RootPart != this || ParentGroup.AttachedAvatar != remoteClient.AgentId && ParentGroup.HasPrivateAttachmentPoint))
return; return;
remoteClient.SendEntityUpdate(this, PrimUpdateFlags); remoteClient.SendEntityUpdate(this, update);
ParentGroup.Scene.StatsReporter.AddObjectUpdates(1); ParentGroup.Scene.StatsReporter.AddObjectUpdates(1);
} }

View File

@ -5364,7 +5364,7 @@ namespace OpenSim.Region.Framework.Scenes
return validated; return validated;
} }
/*
public void SendAttachmentsToAllAgents() public void SendAttachmentsToAllAgents()
{ {
lock (m_attachments) lock (m_attachments)
@ -5385,7 +5385,7 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
} }
*/
// send attachments to a client without filters except for huds // send attachments to a client without filters except for huds
// for now they are checked in several places down the line... // for now they are checked in several places down the line...
public void SendAttachmentsToAgentNF(ScenePresence p) public void SendAttachmentsToAgentNF(ScenePresence p)
@ -5429,14 +5429,18 @@ namespace OpenSim.Region.Framework.Scenes
if (IsChildAgent || IsInTransit) if (IsChildAgent || IsInTransit)
return; return;
SceneObjectPart[] origparts = sog.Parts; SceneObjectPart[] origparts = sog.Parts;
SceneObjectPart[] parts = new SceneObjectPart[origparts.Length]; SceneObjectPart[] parts = new SceneObjectPart[origparts.Length];
PrimUpdateFlags[] flags = new PrimUpdateFlags[origparts.Length]; PrimUpdateFlags[] flags = new PrimUpdateFlags[origparts.Length];
SceneObjectPart rootpart = sog.RootPart; SceneObjectPart rootpart = sog.RootPart;
PrimUpdateFlags cur = sog.RootPart.GetAndClearUpdateFlag(); PrimUpdateFlags cur = sog.RootPart.GetAndClearUpdateFlag();
bool noanim = !rootpart.Shape.MeshFlagEntry;
int nparts = 0; int nparts = 0;
if (noanim || rootpart.Animations == null)
cur &= ~PrimUpdateFlags.Animations;
if (cur != PrimUpdateFlags.None) if (cur != PrimUpdateFlags.None)
{ {
flags[nparts] = cur; flags[nparts] = cur;
@ -5450,7 +5454,9 @@ namespace OpenSim.Region.Framework.Scenes
continue; continue;
cur = origparts[i].GetAndClearUpdateFlag(); cur = origparts[i].GetAndClearUpdateFlag();
if(cur == PrimUpdateFlags.None) if (noanim || origparts[i].Animations == null)
cur &= ~PrimUpdateFlags.Animations;
if (cur == PrimUpdateFlags.None)
continue; continue;
flags[nparts] = cur; flags[nparts] = cur;
parts[nparts] = origparts[i]; parts[nparts] = origparts[i];
@ -5485,19 +5491,45 @@ namespace OpenSim.Region.Framework.Scenes
if (IsChildAgent || IsInTransit) if (IsChildAgent || IsInTransit)
return; return;
SceneObjectPart[] parts = sog.Parts; SceneObjectPart[] origparts = sog.Parts;
SceneObjectPart[] parts = new SceneObjectPart[origparts.Length];
PrimUpdateFlags[] flags = new PrimUpdateFlags[origparts.Length];
SceneObjectPart rootpart = sog.RootPart; SceneObjectPart rootpart = sog.RootPart;
bool noanim = !rootpart.Shape.MeshFlagEntry;
ControllingClient.SendEntityUpdate(rootpart, update); int nparts = 0;
PrimUpdateFlags cur = update;
for (int i = 0; i < parts.Length; i++) if (noanim || rootpart.Animations == null)
cur &= ~PrimUpdateFlags.Animations;
if (cur != PrimUpdateFlags.None)
{ {
SceneObjectPart part = parts[i]; flags[nparts] = cur;
if (part == rootpart) parts[nparts] = rootpart;
continue; ++nparts;
ControllingClient.SendEntityUpdate(part, update);
} }
for (int i = 0; i < origparts.Length; i++)
{
if (origparts[i] == rootpart)
continue;
cur = update;
if (noanim || origparts[i].Animations == null)
cur &= ~PrimUpdateFlags.Animations;
if (cur == PrimUpdateFlags.None)
continue;
flags[nparts] = cur;
parts[nparts] = origparts[i];
++nparts;
}
if (nparts == 0)
return;
for(int i = 0; i < nparts; i++)
ControllingClient.SendEntityUpdate(parts[i], flags[i]);
if (sog.HasPrivateAttachmentPoint) if (sog.HasPrivateAttachmentPoint)
return; return;
@ -5512,22 +5544,24 @@ namespace OpenSim.Region.Framework.Scenes
p.ControllingClient.SendEntityUpdate(rootpart, update); p.ControllingClient.SendEntityUpdate(rootpart, update);
for (int i = 0; i < parts.Length; i++) for (int i = 0; i < nparts; i++)
{ p.ControllingClient.SendEntityUpdate(parts[i], flags[i]);
SceneObjectPart part = parts[i];
if (part == rootpart)
continue;
p.ControllingClient.SendEntityUpdate(part, update);
}
} }
} }
public void SendAttachmentUpdate(SceneObjectPart part, PrimUpdateFlags flag) public void SendAttachmentUpdate(SceneObjectPart part, PrimUpdateFlags update)
{ {
if (IsChildAgent || IsInTransit) if (IsChildAgent || IsInTransit)
return; return;
ControllingClient.SendEntityUpdate(part, flag); if ((update & PrimUpdateFlags.Animations) != 0 && part.Animations == null)
{
update &= ~PrimUpdateFlags.Animations;
if (update == PrimUpdateFlags.None)
return;
}
ControllingClient.SendEntityUpdate(part, update);
if (part.ParentGroup.HasPrivateAttachmentPoint) if (part.ParentGroup.HasPrivateAttachmentPoint)
return; return;
@ -5540,7 +5574,7 @@ namespace OpenSim.Region.Framework.Scenes
if (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && !p.IsViewerUIGod) if (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && !p.IsViewerUIGod)
continue; continue;
p.ControllingClient.SendEntityUpdate(part, flag); p.ControllingClient.SendEntityUpdate(part, update);
} }
} }