diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index 786ed34ff9..38ef23ff36 100755 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs @@ -607,7 +607,7 @@ namespace OpenSim.Framework { None = 0, AttachmentPoint = 1 << 0, - Material = 1 << 1, + MaterialOvr = 1 << 1, ClickAction = 1 << 2, Scale = 1 << 3, ParentID = 1 << 4, @@ -630,11 +630,12 @@ namespace OpenSim.Framework Sound = 1 << 21, TerseUpdate = Position | Rotation | Velocity | Acceleration | AngularVelocity, - FullUpdate = 0x00ffffff, + FullUpdate = 0x00ffffff & ~MaterialOvr, Animations = 1 << 24, FullUpdatewithAnim = FullUpdate | Animations, + FullUpdatewithMatOvr = FullUpdate | MaterialOvr, UpdateProbe = 0x10000000, // 1 << 28 SendInTransit = 0x20000000, // 1 << 29 diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 7f449f96ea..b425132c15 100755 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -4969,11 +4969,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP useCompressUpdate = grp.IsViewerCachable; istree = (part.Shape.PCode == (byte)PCode.Grass || part.Shape.PCode == (byte)PCode.NewTree || part.Shape.PCode == (byte)PCode.Tree); - if(!istree && part.Shape.RenderMaterials is not null && - part.Shape.ReflectionProbe is null && - part.Shape.RenderMaterials.overrides is not null && - part.Shape.RenderMaterials.overrides.Length > 0) - hasMaterialOverride = true; + if((updateFlags & PrimUpdateFlags.MaterialOvr) != 0) + hasMaterialOverride = !istree; } else if (update.Entity is ScenePresence presence) { @@ -5498,16 +5495,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP { foreach (SceneObjectPart sop in needMaterials) { - Primitive.RenderMaterials.RenderMaterialOverrideEntry[] overrides = sop.Shape.RenderMaterials.overrides; - - OSDMap data = new OSDMap(3); + OSDMap data = new(3); data["id"] = (int)sop.LocalId; - OSDArray sides = new OSDArray(); - OSDArray sidesdata = new OSDArray(); - foreach (Primitive.RenderMaterials.RenderMaterialOverrideEntry ovr in overrides) + OSDArray sides = new(); + OSDArray sidesdata = new(); + if(sop.Shape.RenderMaterials is not null && + sop.Shape.RenderMaterials.overrides is not null && + sop.Shape.RenderMaterials.overrides.Length > 0) { - sides.Add(ovr.te_index); - sidesdata.Add(new OSDllsdxml(ovr.data)); + foreach (Primitive.RenderMaterials.RenderMaterialOverrideEntry ovr in sop.Shape.RenderMaterials.overrides) + { + sides.Add(ovr.te_index); + sidesdata.Add(string.IsNullOrEmpty(ovr.data) ? new OSD() : new OSDllsdxml(ovr.data)); + } } data["te"] = sides; data["od"] = sidesdata; diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs index b957cc5e8f..f29c51ce7e 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs @@ -176,9 +176,9 @@ namespace OpenSim.Region.Framework.Scenes SceneObjectGroup sog = part.ParentGroup; if(!sog.IsDeleted) { - PrimUpdateFlags update = PrimUpdateFlags.FullUpdate; - if (sog.RootPart.Shape.MeshFlagEntry) - update = PrimUpdateFlags.FullUpdatewithAnim; + PrimUpdateFlags update = sog.RootPart.Shape.MeshFlagEntry ? + PrimUpdateFlags.FullUpdatewithAnim | PrimUpdateFlags.MaterialOvr : + PrimUpdateFlags.FullUpdatewithMatOvr; part.SendUpdate(remoteClient, update); } } diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 3cb25d3362..7a438da8ec 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -2460,18 +2460,32 @@ namespace OpenSim.Region.Framework.Scenes /// public void SendFullAnimUpdateToClient(IClientAPI remoteClient) { - PrimUpdateFlags update = PrimUpdateFlags.FullUpdate; - if (RootPart.Shape.MeshFlagEntry) - update = PrimUpdateFlags.FullUpdatewithAnim; + PrimUpdateFlags update = RootPart.Shape.MeshFlagEntry ? + PrimUpdateFlags.FullUpdatewithAnim : + PrimUpdateFlags.FullUpdate; - RootPart.SendUpdate(remoteClient, update); + if (RootPart.Shape.RenderMaterials is not null && + RootPart.Shape.ReflectionProbe is null && + RootPart.Shape.RenderMaterials.overrides is not null && + RootPart.Shape.RenderMaterials.overrides.Length > 0) + RootPart.SendUpdate(remoteClient, update | PrimUpdateFlags.MaterialOvr); + else + RootPart.SendUpdate(remoteClient, update); SceneObjectPart[] parts = m_parts.GetArray(); for (int i = 0; i < parts.Length; i++) { SceneObjectPart part = parts[i]; - if (part != RootPart) - part.SendUpdate(remoteClient, update); + if (part.LocalId != RootPart.LocalId) + { + if (part.Shape.RenderMaterials is not null && + part.Shape.ReflectionProbe is null && + part.Shape.RenderMaterials.overrides is not null && + part.Shape.RenderMaterials.overrides.Length > 0) + part.SendUpdate(remoteClient, update | PrimUpdateFlags.MaterialOvr); + else + part.SendUpdate(remoteClient, update); + } } } @@ -2485,7 +2499,7 @@ namespace OpenSim.Region.Framework.Scenes for (int i = 0; i < parts.Length; i++) { SceneObjectPart part = parts[i]; - if (part != RootPart) + if (part.LocalId != RootPart.LocalId) part.SendUpdate(remoteClient, update); } } diff --git a/OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs b/OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs index 5fcac02234..da3fef7b43 100644 --- a/OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs +++ b/OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs @@ -1008,7 +1008,7 @@ namespace OpenSim.Region.OptionalModules.Materials foreach (SceneObjectPart sop in changedSOPs) { sop.ParentGroup.HasGroupChanged = true; - sop.ScheduleFullUpdate(); + sop.ScheduleUpdate(PrimUpdateFlags.MaterialOvr | PrimUpdateFlags.FullUpdate); } httpResponse.RawBuffer = XMLkeyMaterialSucess; @@ -1382,7 +1382,7 @@ namespace OpenSim.Region.OptionalModules.Materials return false; } - catch (Exception e) + catch { return false; }