diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index 38ef23ff36..f806da496c 100755 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs @@ -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 diff --git a/OpenSim/Framework/MapAndArray.cs b/OpenSim/Framework/MapAndArray.cs index e633ea330c..412c2ae291 100644 --- a/OpenSim/Framework/MapAndArray.cs +++ b/OpenSim/Framework/MapAndArray.cs @@ -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(); @@ -180,5 +181,11 @@ namespace OpenSim.Framework return m_array; } } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public Span GetSpan() + { + return new Span(GetArray()); + } } } diff --git a/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/UploadObjectAssetModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/UploadObjectAssetModule.cs index db2d146330..a0ebeadfbf 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/UploadObjectAssetModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/UploadObjectAssetModule.cs @@ -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("local_id{0}", ConvertUintToBytes(allparts[0].LocalId))); diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs index a3968a2280..a389f548c1 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs @@ -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); diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index e77e8418a7..1abf0167d3 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -2807,7 +2807,7 @@ namespace OpenSim.Region.Framework.Scenes if(humanRez) group.ResumeScripts(); - group.ScheduleGroupForFullAnimUpdate(); + group.ScheduleGroupForUpdate(PrimUpdateFlags.FullUpdatewithAnimMatOvr); } return objlist; diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 30fb07fec3..b3d919a0d8 100755 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -2587,8 +2587,7 @@ namespace OpenSim.Region.Framework.Scenes sceneObject.InvalidateDeepEffectivePerms(); - sceneObject.ScheduleGroupForFullAnimUpdate(); - + sceneObject.ScheduleGroupForUpdate(PrimUpdateFlags.FullUpdatewithAnimMatOvr); return sceneObject; } diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index e265b53ebb..228488faf1 100755 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs @@ -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; } } diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 7a438da8ec..8c65ae61ef 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -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); + } + } /// /// Schedule a terse update for this scene object to all interested viewers. /// @@ -3062,10 +3076,9 @@ namespace OpenSim.Region.Framework.Scenes return RootPart; Span 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; diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 9bba4dd270..28c29cdc14 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -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;