From 5740d99286750f034ccdaf2863e7da64d7ec5865 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Mon, 13 Mar 2023 12:39:13 +0000 Subject: [PATCH] add test feature bin (de)serializer --- OpenSim/Framework/PrimitiveBaseShape.cs | 60 +++++++++++++++++-- .../Framework/Scenes/SceneObjectPart.cs | 4 +- 2 files changed, 57 insertions(+), 7 deletions(-) diff --git a/OpenSim/Framework/PrimitiveBaseShape.cs b/OpenSim/Framework/PrimitiveBaseShape.cs index 66431de980..9f2d043b15 100644 --- a/OpenSim/Framework/PrimitiveBaseShape.cs +++ b/OpenSim/Framework/PrimitiveBaseShape.cs @@ -1366,10 +1366,8 @@ namespace OpenSim.Framework entries[i].id = new UUID(data, pos); pos += 16; } - RenderMaterials = new Primitive.RenderMaterials - { - entries = entries - }; + RenderMaterials ??= new Primitive.RenderMaterials(); + RenderMaterials.entries = entries; } } return size + 4; @@ -1482,6 +1480,60 @@ namespace OpenSim.Framework return prim; } + public byte[] RenderMaterialsOvrToRawBin() + { + // byte: number of entries + // repeat: + // byte; entry face index + // byte; low entry override utf8 length + // byte: high entry override utf8 length + // utf8 bytes: override + + if (RenderMaterials is null || RenderMaterials.overrides is null || RenderMaterials.overrides.Length == 0) + return null; + + osUTF8 sb = OSUTF8Cached.Acquire(); + + sb.Append((byte)RenderMaterials.overrides.Length); + for (int i = 0; i < RenderMaterials.overrides.Length; i++) + { + if (string.IsNullOrEmpty(RenderMaterials.overrides[i].data)) + continue; + sb.Append(RenderMaterials.overrides[i].te_index); + int len = RenderMaterials.overrides[i].data.Length; + sb.Append((byte)(len & 0xff)); + sb.Append((byte)((len >> 8) & 0xff)); + sb.Append(RenderMaterials.overrides[i].data); + } + return OSUTF8Cached.GetArrayAndRelease(sb); + } + + public void RenderMaterialsOvrFromRawBin(byte[] data) + { + if (RenderMaterials is not null && RenderMaterials.overrides is not null) + RenderMaterials.overrides = null; + if (data is null || data.Length < 16) + return; + int nentries = data[0]; + if(nentries > 128) + return; + int indx = 1; + Primitive.RenderMaterials.RenderMaterialOverrideEntry[] overrides = new Primitive.RenderMaterials.RenderMaterialOverrideEntry[nentries]; + try + { + for(int i = 0; i < overrides.Length; i++) + { + overrides[i].te_index = data[indx++]; + int ovrlen = data[indx++]; + ovrlen += data[indx++] << 8; + overrides[i].data = Utils.BytesToString(data,indx, ovrlen); + indx += ovrlen; + } + RenderMaterials.overrides = overrides; + } + catch { } + } + /// /// Encapsulates a list of media entries. /// diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 88fb708332..3ba8a5aa57 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -2205,9 +2205,7 @@ namespace OpenSim.Region.Framework.Scenes dupe.Shape.ExtraParams = extraP; if(Shape.RenderMaterials is not null && Shape.RenderMaterials.overrides is not null && Shape.RenderMaterials.overrides.Length > 0) - { - if(dupe.Shape.RenderMaterials == null) - dupe.Shape.RenderMaterials = new Primitive.RenderMaterials(); + { dupe.Shape.RenderMaterials.overrides = new Primitive.RenderMaterials.RenderMaterialOverrideEntry[Shape.RenderMaterials.overrides.Length]; Shape.RenderMaterials.overrides.CopyTo(dupe.Shape.RenderMaterials.overrides,0); }