From 0faf418f0c032b16473568065fb0010029a6ebd6 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Tue, 14 Mar 2023 17:30:01 +0000 Subject: [PATCH] a few more changes on test feature --- OpenSim/Data/SQLite/SQLiteSimulationData.cs | 2 +- OpenSim/Framework/PrimitiveBaseShape.cs | 19 ++++++-- .../ClientStack/Linden/UDP/LLClientView.cs | 9 ++-- .../Serialization/SceneObjectSerializer.cs | 46 +++++++++++++++---- .../Region/Framework/Scenes/UuidGatherer.cs | 19 ++++++-- 5 files changed, 71 insertions(+), 24 deletions(-) diff --git a/OpenSim/Data/SQLite/SQLiteSimulationData.cs b/OpenSim/Data/SQLite/SQLiteSimulationData.cs index c61a11e1f9..e8345d39cf 100644 --- a/OpenSim/Data/SQLite/SQLiteSimulationData.cs +++ b/OpenSim/Data/SQLite/SQLiteSimulationData.cs @@ -1301,7 +1301,7 @@ namespace OpenSim.Data.SQLite createCol(shapes, "Texture", typeof(Byte[])); createCol(shapes, "ExtraParams", typeof(Byte[])); createCol(shapes, "Media", typeof(String)); - createCol(shapes, "NatOvrd", typeof(byte[])); + createCol(shapes, "MatOvrd", typeof(byte[])); shapes.PrimaryKey = new DataColumn[] { shapes.Columns["UUID"] }; return shapes; diff --git a/OpenSim/Framework/PrimitiveBaseShape.cs b/OpenSim/Framework/PrimitiveBaseShape.cs index 9f2d043b15..03a419644e 100644 --- a/OpenSim/Framework/PrimitiveBaseShape.cs +++ b/OpenSim/Framework/PrimitiveBaseShape.cs @@ -1493,8 +1493,16 @@ namespace OpenSim.Framework return null; osUTF8 sb = OSUTF8Cached.Acquire(); - - sb.Append((byte)RenderMaterials.overrides.Length); + int nentries = 0; + for (int i = 0; i < RenderMaterials.overrides.Length; i++) + { + if (!string.IsNullOrEmpty(RenderMaterials.overrides[i].data)) + nentries++; + } + if(nentries == 0) + return null; + + sb.Append((byte)nentries); for (int i = 0; i < RenderMaterials.overrides.Length; i++) { if (string.IsNullOrEmpty(RenderMaterials.overrides[i].data)) @@ -1510,7 +1518,7 @@ namespace OpenSim.Framework public void RenderMaterialsOvrFromRawBin(byte[] data) { - if (RenderMaterials is not null && RenderMaterials.overrides is not null) + if (RenderMaterials is not null && RenderMaterials.overrides != null) RenderMaterials.overrides = null; if (data is null || data.Length < 16) return; @@ -1529,9 +1537,12 @@ namespace OpenSim.Framework overrides[i].data = Utils.BytesToString(data,indx, ovrlen); indx += ovrlen; } + RenderMaterials ??= new Primitive.RenderMaterials(); RenderMaterials.overrides = overrides; } - catch { } + catch + { + } } /// diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 6256d233c4..2ec70eb8b4 100755 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -5496,7 +5496,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP IEventQueue eq = Scene.RequestModuleInterface(); if (needMaterials is not null && eq is not null) { - Utils.LongToUInts(m_scene.RegionInfo.RegionHandle, out uint regionX, out uint regionY); foreach (SceneObjectPart sop in needMaterials) { Primitive.RenderMaterials.RenderMaterialOverrideEntry[] overrides = sop.Shape.RenderMaterials.overrides; @@ -5505,8 +5504,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP LLSDxmlEncode2.AddArray(sbinner); LLSDxmlEncode2.AddMap(sbinner); LLSDxmlEncode2.AddElem("object_id", sop.UUID, sbinner); - LLSDxmlEncode2.AddElem("region_handle_low", (int)regionX, sbinner); - LLSDxmlEncode2.AddElem("region_handle_high", (int)regionY, sbinner); + LLSDxmlEncode2.AddElem("region_handle_low", (int)m_scene.RegionInfo.WorldLocX, sbinner); + LLSDxmlEncode2.AddElem("region_handle_high", (int)m_scene.RegionInfo.WorldLocY, sbinner); LLSDxmlEncode2.AddArray("sides", sbinner); foreach (Primitive.RenderMaterials.RenderMaterialOverrideEntry ovr in overrides) LLSDxmlEncode2.AddElem(ovr.te_index, sbinner); @@ -5522,8 +5521,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP */ OSDMap data = new OSDMap(); data["object_id"] = sop.UUID; - //data["region_handle_low"]= (int)regionX; - //data["region_handle_high"]= (int)regionY; + data["region_handle_x"]= (int)m_scene.RegionInfo.WorldLocX; + data["region_handle_y"]= (int)m_scene.RegionInfo.WorldLocY; OSDArray sides = new OSDArray(); foreach (Primitive.RenderMaterials.RenderMaterialOverrideEntry ovr in overrides) sides.Add(ovr.te_index); diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs index 6d0ddb0f3b..0fd4000170 100644 --- a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs +++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs @@ -221,8 +221,8 @@ namespace OpenSim.Region.Framework.Scenes.Serialization public static void ToOriginalXmlFormat( SceneObjectGroup sceneObject, XmlTextWriter writer, bool doScriptStates, bool noRootElement) { -// m_log.DebugFormat("[SERIALIZER]: Starting serialization of {0}", sceneObject.Name); -// int time = System.Environment.TickCount; + //m_log.DebugFormat("[SERIALIZER]: Starting serialization of {0}", sceneObject.Name); + //int time = System.Environment.TickCount; if (!noRootElement) writer.WriteStartElement(string.Empty, "SceneObjectGroup", string.Empty); @@ -261,7 +261,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization if (!noRootElement) writer.WriteEndElement(); // SceneObjectGroup -// m_log.DebugFormat("[SERIALIZER]: Finished serialization of SOG {0}, {1}ms", sceneObject.Name, System.Environment.TickCount - time); + //m_log.DebugFormat("[SERIALIZER]: Finished serialization of SOG {0}, {1}ms", sceneObject.Name, System.Environment.TickCount - time); } protected static void ToXmlFormat(SceneObjectPart part, XmlTextWriter writer) @@ -331,7 +331,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization // Script state may, or may not, exist. Not having any, is NOT // ever a problem. sceneObject.LoadScriptState(doc); -// sceneObject.AggregatePerms(); + //sceneObject.AggregatePerms(); return sceneObject; } catch (Exception e) @@ -598,7 +598,8 @@ namespace OpenSim.Region.Framework.Scenes.Serialization {"FlexiEntry", ProcessShpFlexiEntry }, {"LightEntry", ProcessShpLightEntry }, {"SculptEntry", ProcessShpSculptEntry }, - {"Media", ProcessShpMedia } + {"Media", ProcessShpMedia }, + {"MatOvrd", ProcessShpMatOvrd } }; #region SOPXmlProcessors @@ -855,16 +856,15 @@ namespace OpenSim.Region.Framework.Scenes.Serialization obj.Animations = null; try { - string datastr; - datastr = reader.ReadElementContentAsString(); - if(string.IsNullOrEmpty(datastr)) + string datastr = reader.ReadElementContentAsString(); + if (string.IsNullOrEmpty(datastr)) return; byte[] pdata = Convert.FromBase64String(datastr); obj.DeSerializeAnimations(pdata); return; } - catch {} + catch { } m_log.DebugFormat( "[SceneObjectSerializer]: Parsing ProcessSOPAnims for object part {0} {1} encountered errors", @@ -1465,6 +1465,24 @@ namespace OpenSim.Region.Framework.Scenes.Serialization } } + private static void ProcessShpMatOvrd(PrimitiveBaseShape shp, XmlReader reader) + { + try + { + string datastr = reader.ReadElementContentAsString(); + if (!string.IsNullOrEmpty(datastr)) + { + byte[] pdata = Convert.FromBase64String(datastr); + shp.RenderMaterialsOvrFromRawBin(pdata); + } + return; + } + catch + { + shp.RenderMaterialsOvrFromRawBin(null); + } + } + #endregion ////////// Write ///////// @@ -1839,9 +1857,17 @@ namespace OpenSim.Region.Framework.Scenes.Serialization writer.WriteElementString("LightEntry", shp.LightEntry.ToString().ToLower()); writer.WriteElementString("SculptEntry", shp.SculptEntry.ToString().ToLower()); - if (shp.Media != null) + if (shp.Media is not null) writer.WriteElementString("Media", shp.Media.ToXml()); + byte[] matoverrides = shp.RenderMaterialsOvrToRawBin(); + if(matoverrides is not null) + { + writer.WriteStartElement("MatOvrd"); + writer.WriteBase64(matoverrides, 0, matoverrides.Length); + writer.WriteEndElement(); + } + writer.WriteEndElement(); // Shape } } diff --git a/OpenSim/Region/Framework/Scenes/UuidGatherer.cs b/OpenSim/Region/Framework/Scenes/UuidGatherer.cs index c0c4875440..9c3a39fe07 100644 --- a/OpenSim/Region/Framework/Scenes/UuidGatherer.cs +++ b/OpenSim/Region/Framework/Scenes/UuidGatherer.cs @@ -401,12 +401,23 @@ namespace OpenSim.Region.Framework.Scenes if (part.Shape.ProjectionTextureUUID.IsNotZero()) GatheredUuids[part.Shape.ProjectionTextureUUID] = (sbyte)AssetType.Texture; - if(part.Shape.RenderMaterials is not null && part.Shape.RenderMaterials.entries is not null) + if(part.Shape.RenderMaterials is not null) { - for(int j = 0; j < part.Shape.RenderMaterials.entries.Length; ++j) + if (part.Shape.RenderMaterials.entries is not null) { - if(part.Shape.RenderMaterials.entries[j].id.IsNotZero()) - AddForInspection(part.Shape.RenderMaterials.entries[j].id, (sbyte)AssetType.Material); + for (int j = 0; j < part.Shape.RenderMaterials.entries.Length; ++j) + { + if (part.Shape.RenderMaterials.entries[j].id.IsNotZero()) + AddForInspection(part.Shape.RenderMaterials.entries[j].id, (sbyte)AssetType.Material); + } + } + if (part.Shape.RenderMaterials.overrides is not null) + { + for (int j = 0; j < part.Shape.RenderMaterials.overrides.Length; ++j) + { + //if(!string.IsNullOrEmpty(part.Shape.RenderMaterials.overrides[j].data)) + //AddForInspection(part.Shape.RenderMaterials.overrides[j].data, (sbyte)AssetType.Material); + } } } UUID collisionSound = part.CollisionSound;