add some missing matovr full updates

This commit is contained in:
UbitUmarov 2023-12-12 21:15:58 +00:00
parent 4a3cfd1004
commit 23daf5340b
9 changed files with 56 additions and 31 deletions

View File

@ -636,6 +636,7 @@ namespace OpenSim.Framework
FullUpdatewithAnim = FullUpdate | Animations,
FullUpdatewithMatOvr = FullUpdate | MaterialOvr,
FullUpdatewithAnimMatOvr = FullUpdate | Animations | MaterialOvr,
UpdateProbe = 0x10000000, // 1 << 28
SendInTransit = 0x20000000, // 1 << 29

View File

@ -27,6 +27,7 @@
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
namespace OpenSim.Framework
@ -170,7 +171,7 @@ namespace OpenSim.Framework
{
lock (m_syncRoot)
{
if (m_array == null)
if (m_array is null)
{
if(m_dict.Count == 0)
return Array.Empty<TValue>();
@ -180,5 +181,11 @@ namespace OpenSim.Framework
return m_array;
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Span<TValue> GetSpan()
{
return new Span<TValue>(GetArray());
}
}
}

View File

@ -293,7 +293,7 @@ namespace OpenSim.Region.ClientStack.Linden
rootGroup.LinkToGroup(allparts[j]);
}
rootGroup.ScheduleGroupForFullAnimUpdate();
rootGroup.ScheduleGroupForUpdate(PrimUpdateFlags.FullUpdatewithAnimMatOvr);
httpResponse.StatusCode = (int)HttpStatusCode.OK;
httpResponse.RawBuffer = Util.UTF8NBGetbytes(String.Format("<llsd><map><key>local_id</key>{0}</map></llsd>", ConvertUintToBytes(allparts[0].LocalId)));

View File

@ -1109,7 +1109,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
group.CreateScriptInstances(0, true, m_Scene.DefaultScriptEngine, 1);
rootPart.ParentGroup.ResumeScripts();
group.ScheduleGroupForFullAnimUpdate();
group.ScheduleGroupForUpdate(PrimUpdateFlags.FullUpdatewithAnimMatOvr);
}
else
m_Scene.AddNewSceneObject(group, true, false);

View File

@ -2807,7 +2807,7 @@ namespace OpenSim.Region.Framework.Scenes
if(humanRez)
group.ResumeScripts();
group.ScheduleGroupForFullAnimUpdate();
group.ScheduleGroupForUpdate(PrimUpdateFlags.FullUpdatewithAnimMatOvr);
}
return objlist;

View File

@ -2587,8 +2587,7 @@ namespace OpenSim.Region.Framework.Scenes
sceneObject.InvalidateDeepEffectivePerms();
sceneObject.ScheduleGroupForFullAnimUpdate();
sceneObject.ScheduleGroupForUpdate(PrimUpdateFlags.FullUpdatewithAnimMatOvr);
return sceneObject;
}

View File

@ -497,7 +497,7 @@ namespace OpenSim.Region.Framework.Scenes
}
if (sendClientUpdates)
sceneObject.ScheduleGroupForFullAnimUpdate();
sceneObject.ScheduleGroupForUpdate(PrimUpdateFlags.FullUpdatewithAnimMatOvr);
if (attachToBackup)
sceneObject.AttachToBackup();
@ -2189,7 +2189,7 @@ namespace OpenSim.Region.Framework.Scenes
copy.ResumeScripts();
copy.HasGroupChanged = true;
copy.ScheduleGroupForFullAnimUpdate();
copy.ScheduleGroupForUpdate(PrimUpdateFlags.FullUpdatewithAnimMatOvr);
return copy;
}
}

View File

@ -1025,7 +1025,7 @@ namespace OpenSim.Region.Framework.Scenes
sog.inTransit = false;
AttachToBackup();
sog.ScheduleGroupForFullAnimUpdate();
sog.ScheduleGroupForUpdate(PrimUpdateFlags.FullUpdatewithAnimMatOvr);
}
private class TeleportObjectData
@ -1520,10 +1520,9 @@ namespace OpenSim.Region.Framework.Scenes
m_rootPart.LocalId = m_scene.AllocateLocalId();
SceneObjectPart[] parts = m_parts.GetArray();
SceneObjectPart part;
for (int i = 0; i < parts.Length; i++)
{
part = parts[i];
SceneObjectPart part = parts[i];
part.KeyframeMotion?.UpdateSceneObject(this);
if (Object.ReferenceEquals(part, m_rootPart))
@ -1602,10 +1601,9 @@ namespace OpenSim.Region.Framework.Scenes
maxZ = scale.Z;
SceneObjectPart[] parts = m_parts.GetArray();
SceneObjectPart part;
for (int i = 0; i < parts.Length; ++i)
{
part = parts[i];
SceneObjectPart part = parts[i];
if(part.LocalId == rootid)
continue;
@ -1673,10 +1671,9 @@ namespace OpenSim.Region.Framework.Scenes
Vector3 absPos = AbsolutePosition;
SceneObjectPart[] parts = m_parts.GetArray();
SceneObjectPart part;
for(int i = 0; i< parts.Length; ++i)
{
part = parts[i];
SceneObjectPart part = parts[i];
Vector3 offset = part.GetWorldPosition() - absPos;
Vector3 scale = part.Scale * 0.5f;
@ -1796,12 +1793,12 @@ namespace OpenSim.Region.Framework.Scenes
float areaF = 0;
float partR;
Vector3 offset = Vector3.Zero;
SceneObjectPart p;
SceneObjectPart[] parts = m_parts.GetArray();
for (int i = 0; i < parts.Length; i++)
{
p = parts[i];
SceneObjectPart p = parts[i];
partR = 0.5f * p.Scale.Length();
if(p != RootPart)
{
@ -1840,13 +1837,10 @@ namespace OpenSim.Region.Framework.Scenes
bool ComplexCost = false;
SceneObjectPart p;
SceneObjectPart[] parts = m_parts.GetArray();
for (int i = 0; i < parts.Length; i++)
{
p = parts[i];
if (p.UsesComplexCost)
if (parts[i].UsesComplexCost)
{
ComplexCost = true;
break;
@ -1862,7 +1856,7 @@ namespace OpenSim.Region.Framework.Scenes
for (int i = 0; i < parts.Length; i++)
{
p = parts[i];
SceneObjectPart p = parts[i];
cost = p.StreamingCost;
tmpcost = p.SimulationCost;
@ -2579,7 +2573,7 @@ namespace OpenSim.Region.Framework.Scenes
dupe.HasGroupChanged = true;
dupe.AttachToBackup();
dupe.ScheduleGroupForFullAnimUpdate();
dupe.ScheduleGroupForUpdate(PrimUpdateFlags.FullUpdatewithAnimMatOvr);
}
dupe.InvalidatePartsLinkMaps();
@ -2976,6 +2970,26 @@ namespace OpenSim.Region.Framework.Scenes
}
}
public void ScheduleGroupForUpdate(PrimUpdateFlags update)
{
//if (IsAttachment)
// m_log.DebugFormat("[SOG]: Scheduling full update for {0} {1}", Name, LocalId);
if (Scene.GetNumberOfClients() == 0)
return;
SceneObjectPart[] parts = m_parts.GetArray();
if (!RootPart.Shape.MeshFlagEntry)
update &= ~PrimUpdateFlags.Animations;
RootPart.ScheduleUpdate(update);
for (int i = 0; i < parts.Length; i++)
{
SceneObjectPart part = parts[i];
if (part != RootPart)
part.ScheduleUpdate(update);
}
}
/// <summary>
/// Schedule a terse update for this scene object to all interested viewers.
/// </summary>
@ -3062,10 +3076,9 @@ namespace OpenSim.Region.Framework.Scenes
return RootPart;
Span<SceneObjectPart> parts = m_parts.GetArray().AsSpan();
SceneObjectPart sop;
if (linknum <= parts.Length)
{
sop = parts[linknum - 1];
SceneObjectPart sop = parts[linknum - 1];
if (sop.LinkNum == linknum)
return sop;
}
@ -4079,7 +4092,7 @@ namespace OpenSim.Region.Framework.Scenes
SceneObjectPart[] parts = m_parts.GetArray();
// fix scaling factors so parts don't violate dimensions
for(int i = 0;i < parts.Length;i++)
for(int i = 0; i < parts.Length; i++)
{
SceneObjectPart obPart = parts[i];
if(obPart.UUID != m_rootPart.UUID)
@ -4443,7 +4456,7 @@ namespace OpenSim.Region.Framework.Scenes
for (int i = 0; i < parts.Length; i++)
{
SceneObjectPart obPart = parts[i];
if (obPart.UUID != m_rootPart.UUID)
if (obPart != m_rootPart)
obPart.OffsetPosition += diff;
}
@ -4594,7 +4607,7 @@ namespace OpenSim.Region.Framework.Scenes
for (int i = 0; i < parts.Length; i++)
{
SceneObjectPart prim = parts[i];
if (prim.UUID != m_rootPart.UUID)
if (prim != m_rootPart)
{
Quaternion NewRot = oldParentRot * prim.RotationOffset;
NewRot = Quaternion.Inverse(axRot) * NewRot;

View File

@ -3230,11 +3230,14 @@ namespace OpenSim.Region.Framework.Scenes
public void ScheduleUpdate(PrimUpdateFlags update)
{
if (ParentGroup == null || ParentGroup.IsDeleted || ParentGroup.Scene == null)
if (ParentGroup is null || ParentGroup.IsDeleted)
return;
if (Animations == null)
if (Animations is null)
update &= ~PrimUpdateFlags.Animations;
if (Shape is null || Shape.RenderMaterials is null)
update &= ~PrimUpdateFlags.MaterialOvr;
if (update == PrimUpdateFlags.None)
return;
@ -3244,12 +3247,14 @@ namespace OpenSim.Region.Framework.Scenes
if (ParentGroup.Scene.GetNumberOfClients() == 0)
return;
bool isfull = false;
bool isfull;
if (ParentGroup.IsAttachment)
{
update |= PrimUpdateFlags.FullUpdate;
isfull = true;
}
else
isfull = (update & PrimUpdateFlags.FullUpdate) == PrimUpdateFlags.FullUpdate;
lock (UpdateFlagLock)
UpdateFlag |= update;