From 54fe5747eabb88b9994220364abe0b6228b8950c Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sat, 8 Jun 2024 21:58:46 +0100 Subject: [PATCH 1/6] add storage for pbr terrain feature that viewers for opensim may add --- OpenSim/Data/MySQL/MySQLSimulationData.cs | 16 ++- .../MySQL/Resources/RegionStore.migrations | 8 ++ OpenSim/Data/PGSQL/PGSQLSimulationData.cs | 107 ++++++++++-------- .../PGSQL/Resources/RegionStore.migrations | 8 ++ .../SQLite/Resources/RegionStore.migrations | 9 ++ OpenSim/Data/SQLite/SQLiteSimulationData.cs | 15 +++ OpenSim/Framework/RegionSettings.cs | 67 ++++++----- .../External/RegionSettingsSerializer.cs | 16 +++ .../CoreModules/Asset/FlotsamAssetCache.cs | 6 + .../World/Archiver/ArchiveReadRequest.cs | 4 + .../World/Archiver/ArchiveWriteRequest.cs | 14 ++- OpenSim/Region/Framework/Scenes/Scene.cs | 9 ++ .../Shared/Api/Implementation/OSSL_Api.cs | 1 + 13 files changed, 201 insertions(+), 79 deletions(-) diff --git a/OpenSim/Data/MySQL/MySQLSimulationData.cs b/OpenSim/Data/MySQL/MySQLSimulationData.cs index e0e2c4bab2..b3e39811b3 100644 --- a/OpenSim/Data/MySQL/MySQLSimulationData.cs +++ b/OpenSim/Data/MySQL/MySQLSimulationData.cs @@ -901,7 +901,8 @@ namespace OpenSim.Data.MySQL "covenant, covenant_datetime, Sandbox, sunvectorx, sunvectory, " + "sunvectorz, loaded_creation_datetime, " + "loaded_creation_id, map_tile_ID, block_search, casino, " + - "TelehubObject, parcel_tile_ID, cacheID) " + + "TelehubObject, parcel_tile_ID, cacheID, " + + "TerrainPBR1, TerrainPBR2, TerrainPBR3, TerrainPBR4)" + "values (?RegionUUID, ?BlockTerraform, " + "?BlockFly, ?AllowDamage, ?RestrictPushing, " + "?AllowLandResell, ?AllowLandJoinDivide, " + @@ -918,7 +919,8 @@ namespace OpenSim.Data.MySQL "?SunVectorX, ?SunVectorY, ?SunVectorZ, " + "?loaded_creation_datetime, ?loaded_creation_id, " + "?map_tile_ID, ?block_search, ?casino, " + - "?TelehubObject, ?parcel_tile_ID, ?cacheID)"; + "?TelehubObject, ?parcel_tile_ID, ?cacheID, " + + "?TerrainPBR1, ?TerrainPBR2, ?TerrainPBR3, ?TerrainPBR4)"; FillRegionSettingsCommand(cmd, rs); ExecuteNonQuery(cmd); @@ -1298,6 +1300,11 @@ namespace OpenSim.Data.MySQL if (row["cacheID"] is not DBNull) newSettings.CacheID = DBGuid.FromDB(row["cacheID"]); + newSettings.TerrainPBR1 = DBGuid.FromDB(row["TerrainPBR1"]); + newSettings.TerrainPBR2 = DBGuid.FromDB(row["TerrainPBR2"]); + newSettings.TerrainPBR3 = DBGuid.FromDB(row["TerrainPBR3"]); + newSettings.TerrainPBR4 = DBGuid.FromDB(row["TerrainPBR4"]); + return newSettings; } @@ -1700,6 +1707,11 @@ namespace OpenSim.Data.MySQL cmd.Parameters.AddWithValue("parcel_tile_ID", settings.ParcelImageID.ToString()); cmd.Parameters.AddWithValue("TelehubObject", settings.TelehubObject.ToString()); cmd.Parameters.AddWithValue("cacheID", settings.CacheID.ToString()); + + cmd.Parameters.AddWithValue("TerrainPBR1", settings.TerrainPBR1.ToString()); + cmd.Parameters.AddWithValue("TerrainPBR2", settings.TerrainPBR2.ToString()); + cmd.Parameters.AddWithValue("TerrainPBR3", settings.TerrainPBR3.ToString()); + cmd.Parameters.AddWithValue("TerrainPBR4", settings.TerrainPBR4.ToString()); } /// diff --git a/OpenSim/Data/MySQL/Resources/RegionStore.migrations b/OpenSim/Data/MySQL/Resources/RegionStore.migrations index 918d3df7d7..1e949c6a89 100644 --- a/OpenSim/Data/MySQL/Resources/RegionStore.migrations +++ b/OpenSim/Data/MySQL/Resources/RegionStore.migrations @@ -558,4 +558,12 @@ COMMIT; :VERSION 65 #----- add linkset data binary storage column BEGIN; ALTER TABLE `prims` ADD COLUMN `lnkstBinData` blob default NULL; +COMMIT; + +:VERSION 66 #----- add PBR Terrain storage column +BEGIN; +ALTER TABLE `regionsettings` ADD COLUMN `TerrainPBR1` varchar(36) NOT NULL; +ALTER TABLE `regionsettings` ADD COLUMN `TerrainPBR2` varchar(36) NOT NULL; +ALTER TABLE `regionsettings` ADD COLUMN `TerrainPBR3` varchar(36) NOT NULL; +ALTER TABLE `regionsettings` ADD COLUMN `TerrainPBR4` varchar(36) NOT NULL; COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/PGSQL/PGSQLSimulationData.cs b/OpenSim/Data/PGSQL/PGSQLSimulationData.cs index efc8bc88ed..155594f33c 100755 --- a/OpenSim/Data/PGSQL/PGSQLSimulationData.cs +++ b/OpenSim/Data/PGSQL/PGSQLSimulationData.cs @@ -957,7 +957,8 @@ namespace OpenSim.Data.PGSQL ,block_show_in_search = :block_show_in_search ,agent_limit = :agent_limit ,object_bonus = :object_bonus ,maturity = :maturity ,disable_scripts = :disable_scripts ,disable_collisions = :disable_collisions ,disable_physics = :disable_physics ,terrain_texture_1 = :terrain_texture_1 ,terrain_texture_2 = :terrain_texture_2 ,terrain_texture_3 = :terrain_texture_3 -,terrain_texture_4 = :terrain_texture_4 ,elevation_1_nw = :elevation_1_nw ,elevation_2_nw = :elevation_2_nw +,terrain_texture_4 = :terrain_texture_4 , TerrainPBR1 = :TerrainPBR1, TerrainPBR2 = :TerrainPBR2, TerrainPBR3 = :TerrainPBR3 +,TerrainPBR4 = :TerrainPBR4, elevation_1_nw = :elevation_1_nw ,elevation_2_nw = :elevation_2_nw ,elevation_1_ne = :elevation_1_ne ,elevation_2_ne = :elevation_2_ne ,elevation_1_se = :elevation_1_se ,elevation_2_se = :elevation_2_se ,elevation_1_sw = :elevation_1_sw ,elevation_2_sw = :elevation_2_sw ,water_height = :water_height ,terrain_raise_limit = :terrain_raise_limit ,terrain_lower_limit = :terrain_lower_limit ,use_estate_sun = :use_estate_sun ,fixed_sun = :fixed_sun ,sun_position = :sun_position @@ -1080,6 +1081,12 @@ namespace OpenSim.Data.PGSQL if (!(row["cacheID"] is DBNull)) newSettings.CacheID = new UUID((Guid)row["cacheID"]); + + newSettings.TerrainPBR1 = new UUID((Guid)row["TerrainPBR1"]); + newSettings.TerrainPBR2 = new UUID((Guid)row["TerrainPBR2"]); + newSettings.TerrainPBR3 = new UUID((Guid)row["TerrainPBR3"]); + newSettings.TerrainPBR4 = new UUID((Guid)row["TerrainPBR4"]); + return newSettings; } @@ -1552,53 +1559,57 @@ namespace OpenSim.Data.PGSQL /// private NpgsqlParameter[] CreateRegionSettingParameters(RegionSettings settings) { - List parameters = new List(); - - parameters.Add(_Database.CreateParameter("regionUUID", settings.RegionUUID)); - parameters.Add(_Database.CreateParameter("block_terraform", settings.BlockTerraform)); - parameters.Add(_Database.CreateParameter("block_fly", settings.BlockFly)); - parameters.Add(_Database.CreateParameter("allow_damage", settings.AllowDamage)); - parameters.Add(_Database.CreateParameter("restrict_pushing", settings.RestrictPushing)); - parameters.Add(_Database.CreateParameter("allow_land_resell", settings.AllowLandResell)); - parameters.Add(_Database.CreateParameter("allow_land_join_divide", settings.AllowLandJoinDivide)); - parameters.Add(_Database.CreateParameter("block_show_in_search", settings.BlockShowInSearch)); - parameters.Add(_Database.CreateParameter("agent_limit", settings.AgentLimit)); - parameters.Add(_Database.CreateParameter("object_bonus", settings.ObjectBonus)); - parameters.Add(_Database.CreateParameter("maturity", settings.Maturity)); - parameters.Add(_Database.CreateParameter("disable_scripts", settings.DisableScripts)); - parameters.Add(_Database.CreateParameter("disable_collisions", settings.DisableCollisions)); - parameters.Add(_Database.CreateParameter("disable_physics", settings.DisablePhysics)); - parameters.Add(_Database.CreateParameter("terrain_texture_1", settings.TerrainTexture1)); - parameters.Add(_Database.CreateParameter("terrain_texture_2", settings.TerrainTexture2)); - parameters.Add(_Database.CreateParameter("terrain_texture_3", settings.TerrainTexture3)); - parameters.Add(_Database.CreateParameter("terrain_texture_4", settings.TerrainTexture4)); - parameters.Add(_Database.CreateParameter("elevation_1_nw", settings.Elevation1NW)); - parameters.Add(_Database.CreateParameter("elevation_2_nw", settings.Elevation2NW)); - parameters.Add(_Database.CreateParameter("elevation_1_ne", settings.Elevation1NE)); - parameters.Add(_Database.CreateParameter("elevation_2_ne", settings.Elevation2NE)); - parameters.Add(_Database.CreateParameter("elevation_1_se", settings.Elevation1SE)); - parameters.Add(_Database.CreateParameter("elevation_2_se", settings.Elevation2SE)); - parameters.Add(_Database.CreateParameter("elevation_1_sw", settings.Elevation1SW)); - parameters.Add(_Database.CreateParameter("elevation_2_sw", settings.Elevation2SW)); - parameters.Add(_Database.CreateParameter("water_height", settings.WaterHeight)); - parameters.Add(_Database.CreateParameter("terrain_raise_limit", settings.TerrainRaiseLimit)); - parameters.Add(_Database.CreateParameter("terrain_lower_limit", settings.TerrainLowerLimit)); - parameters.Add(_Database.CreateParameter("use_estate_sun", settings.UseEstateSun)); - parameters.Add(_Database.CreateParameter("Sandbox", settings.Sandbox)); - parameters.Add(_Database.CreateParameter("fixed_sun", settings.FixedSun)); - parameters.Add(_Database.CreateParameter("sun_position", settings.SunPosition)); - parameters.Add(_Database.CreateParameter("sunvectorx", settings.SunVector.X)); - parameters.Add(_Database.CreateParameter("sunvectory", settings.SunVector.Y)); - parameters.Add(_Database.CreateParameter("sunvectorz", settings.SunVector.Z)); - parameters.Add(_Database.CreateParameter("covenant", settings.Covenant)); - parameters.Add(_Database.CreateParameter("covenant_datetime", settings.CovenantChangedDateTime)); - parameters.Add(_Database.CreateParameter("Loaded_Creation_DateTime", settings.LoadedCreationDateTime)); - parameters.Add(_Database.CreateParameter("Loaded_Creation_ID", settings.LoadedCreationID)); - parameters.Add(_Database.CreateParameter("TerrainImageID", settings.TerrainImageID)); - parameters.Add(_Database.CreateParameter("ParcelImageID", settings.ParcelImageID)); - parameters.Add(_Database.CreateParameter("TelehubObject", settings.TelehubObject)); - - parameters.Add(_Database.CreateParameter("cacheID", settings.CacheID)); + List parameters = + [ + _Database.CreateParameter("regionUUID", settings.RegionUUID), + _Database.CreateParameter("block_terraform", settings.BlockTerraform), + _Database.CreateParameter("block_fly", settings.BlockFly), + _Database.CreateParameter("allow_damage", settings.AllowDamage), + _Database.CreateParameter("restrict_pushing", settings.RestrictPushing), + _Database.CreateParameter("allow_land_resell", settings.AllowLandResell), + _Database.CreateParameter("allow_land_join_divide", settings.AllowLandJoinDivide), + _Database.CreateParameter("block_show_in_search", settings.BlockShowInSearch), + _Database.CreateParameter("agent_limit", settings.AgentLimit), + _Database.CreateParameter("object_bonus", settings.ObjectBonus), + _Database.CreateParameter("maturity", settings.Maturity), + _Database.CreateParameter("disable_scripts", settings.DisableScripts), + _Database.CreateParameter("disable_collisions", settings.DisableCollisions), + _Database.CreateParameter("disable_physics", settings.DisablePhysics), + _Database.CreateParameter("terrain_texture_1", settings.TerrainTexture1), + _Database.CreateParameter("terrain_texture_2", settings.TerrainTexture2), + _Database.CreateParameter("terrain_texture_3", settings.TerrainTexture3), + _Database.CreateParameter("terrain_texture_4", settings.TerrainTexture4), + _Database.CreateParameter("elevation_1_nw", settings.Elevation1NW), + _Database.CreateParameter("elevation_2_nw", settings.Elevation2NW), + _Database.CreateParameter("elevation_1_ne", settings.Elevation1NE), + _Database.CreateParameter("elevation_2_ne", settings.Elevation2NE), + _Database.CreateParameter("elevation_1_se", settings.Elevation1SE), + _Database.CreateParameter("elevation_2_se", settings.Elevation2SE), + _Database.CreateParameter("elevation_1_sw", settings.Elevation1SW), + _Database.CreateParameter("elevation_2_sw", settings.Elevation2SW), + _Database.CreateParameter("water_height", settings.WaterHeight), + _Database.CreateParameter("terrain_raise_limit", settings.TerrainRaiseLimit), + _Database.CreateParameter("terrain_lower_limit", settings.TerrainLowerLimit), + _Database.CreateParameter("use_estate_sun", settings.UseEstateSun), + _Database.CreateParameter("Sandbox", settings.Sandbox), + _Database.CreateParameter("fixed_sun", settings.FixedSun), + _Database.CreateParameter("sun_position", settings.SunPosition), + _Database.CreateParameter("sunvectorx", settings.SunVector.X), + _Database.CreateParameter("sunvectory", settings.SunVector.Y), + _Database.CreateParameter("sunvectorz", settings.SunVector.Z), + _Database.CreateParameter("covenant", settings.Covenant), + _Database.CreateParameter("covenant_datetime", settings.CovenantChangedDateTime), + _Database.CreateParameter("Loaded_Creation_DateTime", settings.LoadedCreationDateTime), + _Database.CreateParameter("Loaded_Creation_ID", settings.LoadedCreationID), + _Database.CreateParameter("TerrainImageID", settings.TerrainImageID), + _Database.CreateParameter("ParcelImageID", settings.ParcelImageID), + _Database.CreateParameter("TelehubObject", settings.TelehubObject), + _Database.CreateParameter("cacheID", settings.CacheID), + _Database.CreateParameter("TerrainPBR1", settings.TerrainPBR1), + _Database.CreateParameter("TerrainPBR2", settings.TerrainPBR2), + _Database.CreateParameter("TerrainPBR3", settings.TerrainPBR3), + _Database.CreateParameter("TerrainPBR4", settings.TerrainPBR4), + ]; return parameters.ToArray(); } diff --git a/OpenSim/Data/PGSQL/Resources/RegionStore.migrations b/OpenSim/Data/PGSQL/Resources/RegionStore.migrations index 3e51d34309..0c89495036 100644 --- a/OpenSim/Data/PGSQL/Resources/RegionStore.migrations +++ b/OpenSim/Data/PGSQL/Resources/RegionStore.migrations @@ -1259,3 +1259,11 @@ COMMIT; BEGIN; ALTER TABLE "public"."prims" ADD COLUMN "lnkstBinData" bytea NULL; COMMIT; + +:VERSION 54 #----- add pbr terrain storage +BEGIN; +ALTER TABLE regionsettings ADD COLUMN "TerrainPBR1" uuid NOT NULL; +ALTER TABLE regionsettings ADD COLUMN "TerrainPBR2" uuid NOT NULL; +ALTER TABLE regionsettings ADD COLUMN "TerrainPBR3" uuid NOT NULL; +ALTER TABLE regionsettings ADD COLUMN "TerrainPBR4" uuid NOT NULL; +COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/RegionStore.migrations b/OpenSim/Data/SQLite/Resources/RegionStore.migrations index 8e7085532e..92d046e6b5 100644 --- a/OpenSim/Data/SQLite/Resources/RegionStore.migrations +++ b/OpenSim/Data/SQLite/Resources/RegionStore.migrations @@ -410,3 +410,12 @@ COMMIT; BEGIN; ALTER TABLE `prims` ADD COLUMN `lnkstBinData` blob default NULL; COMMIT; + + +:VERSION 42 #----- add pbr terrain storage +BEGIN; +ALTER TABLE `regionsettings` ADD COLUMN `TerrainPBR1` char(36) NOT NULL; +ALTER TABLE `regionsettings` ADD COLUMN `TerrainPBR2` char(36) NOT NULL; +ALTER TABLE `regionsettings` ADD COLUMN `TerrainPBR3` char(36) NOT NULL; +ALTER TABLE `regionsettings` ADD COLUMN `TerrainPBR4` char(36) NOT NULL; +COMMIT; diff --git a/OpenSim/Data/SQLite/SQLiteSimulationData.cs b/OpenSim/Data/SQLite/SQLiteSimulationData.cs index 211805b77b..7ca7d1fd3c 100644 --- a/OpenSim/Data/SQLite/SQLiteSimulationData.cs +++ b/OpenSim/Data/SQLite/SQLiteSimulationData.cs @@ -1438,6 +1438,10 @@ namespace OpenSim.Data.SQLite createCol(regionsettings, "terrain_texture_2", typeof(String)); createCol(regionsettings, "terrain_texture_3", typeof(String)); createCol(regionsettings, "terrain_texture_4", typeof(String)); + createCol(regionsettings, "TerrainPBR1", typeof(String)); + createCol(regionsettings, "TerrainPBR2", typeof(String)); + createCol(regionsettings, "TerrainPBR3", typeof(String)); + createCol(regionsettings, "TerrainPBR4", typeof(String)); createCol(regionsettings, "elevation_1_nw", typeof(Double)); createCol(regionsettings, "elevation_2_nw", typeof(Double)); createCol(regionsettings, "elevation_1_ne", typeof(Double)); @@ -2010,6 +2014,11 @@ namespace OpenSim.Data.SQLite if (row["cacheID"] is not System.DBNull) newSettings.CacheID = new UUID((String)row["cacheID"]); + newSettings.TerrainPBR1 = new UUID((String)row["TerrainPBR1"]); + newSettings.TerrainPBR2 = new UUID((String)row["TerrainPBR2"]); + newSettings.TerrainPBR3 = new UUID((String)row["TerrainPBR3"]); + newSettings.TerrainPBR4 = new UUID((String)row["TerrainPBR4"]); + return newSettings; } @@ -2370,6 +2379,12 @@ namespace OpenSim.Data.SQLite row["block_search"] = settings.GodBlockSearch; row["casino"] = settings.Casino; row["cacheID"] = settings.CacheID; + + row["TerrainPBR1"] = settings.TerrainPBR1.ToString(); + row["TerrainPBR2"] = settings.TerrainPBR2.ToString(); + row["TerrainPBR3"] = settings.TerrainPBR3.ToString(); + row["TerrainPBR4"] = settings.TerrainPBR4.ToString(); + } /// diff --git a/OpenSim/Framework/RegionSettings.cs b/OpenSim/Framework/RegionSettings.cs index 90814f771d..7b74a1f4e0 100644 --- a/OpenSim/Framework/RegionSettings.cs +++ b/OpenSim/Framework/RegionSettings.cs @@ -116,6 +116,12 @@ namespace OpenSim.Framework public static readonly UUID DEFAULT_TERRAIN_TEXTURE_3 = new("179cdabd-398a-9b6b-1391-4dc333ba321f"); public static readonly UUID DEFAULT_TERRAIN_TEXTURE_4 = new("beb169c7-11ea-fff2-efe5-0f24dc881df2"); + public static readonly UUID DEFAULT_TERRAIN_PBR_1 = new("b8d3965a-ad78-bf43-699b-bff8eca6c975"); + public static readonly UUID DEFAULT_TERRAIN_PBR_2 = new("abb783e6-3e93-26c0-248a-247666855da3"); + public static readonly UUID DEFAULT_TERRAIN_PBR_3 = new("179cdabd-398a-9b6b-1391-4dc333ba321f"); + public static readonly UUID DEFAULT_TERRAIN_PBR_4 = new("beb169c7-11ea-fff2-efe5-0f24dc881df2"); + + public void Save() { OnSave?.Invoke(this); @@ -226,13 +232,7 @@ namespace OpenSim.Framework public UUID TerrainTexture1 { get { return m_TerrainTexture1; } - set - { - if (value.IsZero()) - m_TerrainTexture1 = DEFAULT_TERRAIN_TEXTURE_1; - else - m_TerrainTexture1 = value; - } + set { m_TerrainTexture1 = value.IsZero() ? DEFAULT_TERRAIN_TEXTURE_1 : value; } } private UUID m_TerrainTexture2 = UUID.Zero; @@ -240,13 +240,7 @@ namespace OpenSim.Framework public UUID TerrainTexture2 { get { return m_TerrainTexture2; } - set - { - if (value.IsZero()) - m_TerrainTexture2 = DEFAULT_TERRAIN_TEXTURE_2; - else - m_TerrainTexture2 = value; - } + set { m_TerrainTexture2 = value.IsZero() ? DEFAULT_TERRAIN_TEXTURE_2 : value; } } private UUID m_TerrainTexture3 = UUID.Zero; @@ -254,13 +248,7 @@ namespace OpenSim.Framework public UUID TerrainTexture3 { get { return m_TerrainTexture3; } - set - { - if (value.IsZero()) - m_TerrainTexture3 = DEFAULT_TERRAIN_TEXTURE_3; - else - m_TerrainTexture3 = value; - } + set { m_TerrainTexture3 = value.IsZero() ? DEFAULT_TERRAIN_TEXTURE_3 : value; } } private UUID m_TerrainTexture4 = UUID.Zero; @@ -268,15 +256,38 @@ namespace OpenSim.Framework public UUID TerrainTexture4 { get { return m_TerrainTexture4; } - set - { - if (value.IsZero()) - m_TerrainTexture4 = DEFAULT_TERRAIN_TEXTURE_4; - else - m_TerrainTexture4 = value; - } + set { m_TerrainTexture4 = value.IsZero() ? DEFAULT_TERRAIN_TEXTURE_4 : value; } } + private UUID m_TerrainPBR1 = UUID.Zero; + public UUID TerrainPBR1 + { + get { return m_TerrainPBR1; } + set { m_TerrainPBR1 = value.IsZero() ? DEFAULT_TERRAIN_PBR_1 : value; } + } + + private UUID m_TerrainPBR2 = UUID.Zero; + public UUID TerrainPBR2 + { + get { return m_TerrainPBR2; } + set { m_TerrainPBR2 = value.IsZero() ? DEFAULT_TERRAIN_PBR_2 : value; } + } + + private UUID m_TerrainPBR3 = UUID.Zero; + public UUID TerrainPBR3 + { + get { return m_TerrainPBR3; } + set { m_TerrainPBR3 = value.IsZero() ? DEFAULT_TERRAIN_PBR_3 : value; } + } + private UUID m_TerrainPBR4 = UUID.Zero; + + public UUID TerrainPBR4 + { + get { return m_TerrainPBR4; } + set { m_TerrainPBR4 = value.IsZero() ? DEFAULT_TERRAIN_PBR_4 : value; } + } + + private double m_Elevation1NW = 10; public double Elevation1NW { diff --git a/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs b/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs index 8341e04a56..648c9b6025 100644 --- a/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs +++ b/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs @@ -140,6 +140,18 @@ namespace OpenSim.Framework.Serialization.External case "Texture4": settings.TerrainTexture4 = UUID.Parse(xtr.ReadElementContentAsString()); break; + case "PBR1": + settings.TerrainPBR1 = UUID.Parse(xtr.ReadElementContentAsString()); + break; + case "PBR2": + settings.TerrainPBR2 = UUID.Parse(xtr.ReadElementContentAsString()); + break; + case "PBR3": + settings.TerrainPBR3 = UUID.Parse(xtr.ReadElementContentAsString()); + break; + case "PBR4": + settings.TerrainPBR3 = UUID.Parse(xtr.ReadElementContentAsString()); + break; case "ElevationLowSW": settings.Elevation1SW = double.Parse(xtr.ReadElementContentAsString(), Culture.NumberFormatInfo); break; @@ -301,6 +313,10 @@ namespace OpenSim.Framework.Serialization.External xtw.WriteElementString("Texture2", settings.TerrainTexture2.ToString()); xtw.WriteElementString("Texture3", settings.TerrainTexture3.ToString()); xtw.WriteElementString("Texture4", settings.TerrainTexture4.ToString()); + xtw.WriteElementString("PBR1", settings.TerrainPBR1.ToString()); + xtw.WriteElementString("PBR2", settings.TerrainPBR2.ToString()); + xtw.WriteElementString("PBR3", settings.TerrainPBR3.ToString()); + xtw.WriteElementString("PBR4", settings.TerrainPBR4.ToString()); xtw.WriteElementString("ElevationLowSW", settings.Elevation1SW.ToString()); xtw.WriteElementString("ElevationLowNW", settings.Elevation1NW.ToString()); xtw.WriteElementString("ElevationLowSE", settings.Elevation1SE.ToString()); diff --git a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs index a35c18cd4a..13ef265e2b 100755 --- a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs +++ b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs @@ -1164,6 +1164,12 @@ namespace OpenSim.Region.CoreModules.Asset gatherer.AddGathered(s.RegionInfo.RegionSettings.TerrainTexture2, (sbyte)AssetType.Texture); gatherer.AddGathered(s.RegionInfo.RegionSettings.TerrainTexture3, (sbyte)AssetType.Texture); gatherer.AddGathered(s.RegionInfo.RegionSettings.TerrainTexture4, (sbyte)AssetType.Texture); + + gatherer.AddGathered(s.RegionInfo.RegionSettings.TerrainPBR1, (sbyte)AssetType.Texture); + gatherer.AddGathered(s.RegionInfo.RegionSettings.TerrainPBR2, (sbyte)AssetType.Texture); + gatherer.AddGathered(s.RegionInfo.RegionSettings.TerrainPBR3, (sbyte)AssetType.Texture); + gatherer.AddGathered(s.RegionInfo.RegionSettings.TerrainPBR4, (sbyte)AssetType.Texture); + gatherer.AddGathered(s.RegionInfo.RegionSettings.TerrainImageID, (sbyte)AssetType.Texture); s.RegionEnvironment?.GatherAssets(gatheredids); diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs index 42a0f37853..bdfbecc0b0 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs @@ -1119,6 +1119,10 @@ namespace OpenSim.Region.CoreModules.World.Archiver currentRegionSettings.TerrainTexture2 = loadedRegionSettings.TerrainTexture2; currentRegionSettings.TerrainTexture3 = loadedRegionSettings.TerrainTexture3; currentRegionSettings.TerrainTexture4 = loadedRegionSettings.TerrainTexture4; + currentRegionSettings.TerrainPBR1 = loadedRegionSettings.TerrainPBR1; + currentRegionSettings.TerrainPBR2 = loadedRegionSettings.TerrainPBR2; + currentRegionSettings.TerrainPBR3 = loadedRegionSettings.TerrainPBR3; + currentRegionSettings.TerrainPBR4 = loadedRegionSettings.TerrainPBR4; currentRegionSettings.UseEstateSun = loadedRegionSettings.UseEstateSun; currentRegionSettings.WaterHeight = loadedRegionSettings.WaterHeight; currentRegionSettings.TelehubObject = loadedRegionSettings.TelehubObject; diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequest.cs index c219097a9b..fb163bb35f 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequest.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequest.cs @@ -320,7 +320,19 @@ namespace OpenSim.Region.CoreModules.World.Archiver if (regionSettings.TerrainTexture4 != RegionSettings.DEFAULT_TERRAIN_TEXTURE_4) assetUuids[regionSettings.TerrainTexture4] = (sbyte)AssetType.Texture; - if(scene.RegionEnvironment != null) + if (regionSettings.TerrainPBR1 != RegionSettings.DEFAULT_TERRAIN_PBR_1) + assetUuids[regionSettings.TerrainPBR1] = (sbyte)AssetType.Texture; // it can be both tex or material + + if (regionSettings.TerrainPBR2 != RegionSettings.DEFAULT_TERRAIN_PBR_2) + assetUuids[regionSettings.TerrainPBR2] = (sbyte)AssetType.Texture; + + if (regionSettings.TerrainPBR3 != RegionSettings.DEFAULT_TERRAIN_PBR_3) + assetUuids[regionSettings.TerrainPBR3] = (sbyte)AssetType.Texture; + + if (regionSettings.TerrainPBR4 != RegionSettings.DEFAULT_TERRAIN_PBR_4) + assetUuids[regionSettings.TerrainPBR4] = (sbyte)AssetType.Texture; + + if (scene.RegionEnvironment != null) scene.RegionEnvironment.GatherAssets(assetUuids); List landObjects = scene.LandChannel.AllParcels(); diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index c4dc47e594..74df9f951e 100755 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -856,6 +856,15 @@ namespace OpenSim.Region.Framework.Scenes updatedTerrainTextures = true; } + if (rs.TerrainPBR1.IsZero()) + rs.TerrainPBR1 = RegionSettings.DEFAULT_TERRAIN_PBR_1; + if (rs.TerrainPBR2.IsZero()) + rs.TerrainPBR2 = RegionSettings.DEFAULT_TERRAIN_PBR_2; + if (rs.TerrainPBR3.IsZero()) + rs.TerrainPBR3 = RegionSettings.DEFAULT_TERRAIN_PBR_3; + if (rs.TerrainPBR4.IsZero()) + rs.TerrainPBR4 = RegionSettings.DEFAULT_TERRAIN_PBR_4; + if (updatedTerrainTextures) rs.Save(); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 1688e65007..c3a1e540f7 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -6592,6 +6592,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Vector osTemperature2sRGB(LSL_Float dtemp) { + //aproximate fit to http://www.vendian.org/mncharity/dir3/blackbody/ 10degree D65 tables float temp = (float)dtemp.value; if (temp <= 1000f) return new LSL_Vector(1.0, 0.0401, 0); From 183350b61740ee49e1d76efe62b8c0dc0b705e7c Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sat, 8 Jun 2024 22:04:55 +0100 Subject: [PATCH 2/6] viewers MUST ask for pbr terrain, requesting fake cap VTPBR if only support terrain pbr on standard size regions or cap VETPBR support on all region sizes --- OpenSim/Capabilities/Caps.cs | 3 ++- .../Linden/Caps/BunchOfCaps/BunchOfCaps.cs | 11 ++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/OpenSim/Capabilities/Caps.cs b/OpenSim/Capabilities/Caps.cs index 279bbcbfe9..0eb312413f 100644 --- a/OpenSim/Capabilities/Caps.cs +++ b/OpenSim/Capabilities/Caps.cs @@ -126,7 +126,8 @@ namespace OpenSim.Framework.Capabilities WLEnv = 0x200, AdvEnv = 0x400, PBR = 0x800, - ViewerBenefits = 0x1000 + ViewerBenefits = 0x1000, + TPBR = 0x2000 } public CapsFlags Flags { get; set;} diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs index 516ea00ae3..3ce2acf182 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs @@ -350,9 +350,18 @@ namespace OpenSim.Region.ClientStack.Linden { case "SEED": continue; - case "ViewerBenefits": // this may need a proper cap but not currently + case "ViewerBenefits": m_HostCapsObj.Flags |= Caps.CapsFlags.ViewerBenefits; continue; + case "VTPBR": + if (m_Scene.RegionInfo.RegionSizeX == Constants.RegionSize && + m_Scene.RegionInfo.RegionSizeY == Constants.RegionSize && + m_Scene.RegionInfo.RegionSizeZ == Constants.RegionSize) + m_HostCapsObj.Flags |= Caps.CapsFlags.TPBR; + continue; + case "VETPBR": + m_HostCapsObj.Flags |= Caps.CapsFlags.TPBR; + continue; case "ObjectAnimation": m_HostCapsObj.Flags |= Caps.CapsFlags.ObjectAnim; break; From 65738b3766da04d0bbbe7b1405b380b8e85533f0 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Mon, 10 Jun 2024 21:02:31 +0100 Subject: [PATCH 3/6] a few more changes for hypothetical terrain PBR --- OpenSim/Framework/Constants.cs | 2 +- OpenSim/Framework/IClientAPI.cs | 14 +++++ .../Linden/Caps/BunchOfCaps/BunchOfCaps.cs | 10 +++- .../Linden/Caps/SimulatorFeaturesModule.cs | 31 ++++------ .../ClientStack/Linden/UDP/LLClientView.cs | 56 ++++++++++++++----- .../World/Estate/EstateManagementCommands.cs | 45 +++++++++++++++ .../World/Estate/EstateManagementModule.cs | 53 +++++++++++++----- .../Region/Framework/Scenes/ScenePresence.cs | 6 +- .../Server/IRCClientView.cs | 1 + .../OptionalModules/World/NPC/NPCAvatar.cs | 2 + .../Services/LLLoginService/LLLoginService.cs | 4 +- 11 files changed, 167 insertions(+), 57 deletions(-) diff --git a/OpenSim/Framework/Constants.cs b/OpenSim/Framework/Constants.cs index 5dbd0bd9ac..63f7edf231 100644 --- a/OpenSim/Framework/Constants.cs +++ b/OpenSim/Framework/Constants.cs @@ -59,7 +59,7 @@ namespace OpenSim.Framework public const float MinWaterHeight = 0; public const float MaxWaterHeight = 8000f; - public const int MaxTextureResolution = 1024; + public const int MaxTextureResolution = 2048; public static readonly string DefaultTexture = "89556747-24cb-43ed-920b-47caed15465f"; //plywood public static readonly UUID DefaultTextureID = new UUID(DefaultTexture); diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index 965e68eacc..11915a4318 100755 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs @@ -598,6 +598,18 @@ namespace OpenSim.Framework public int Price; } + [Flags] + public enum ViewerFlags:uint + { + SentSeeds = 0x1000, + ObjectAnim = 0x2000, + WLEnv = 0x4000, + AdvEnv = 0x8000, + PBR = 0x10000, + TPBR = 0x20000, + SentTPBR = 0x40000, + } + /// /// Specifies the fields that have been changed when sending a prim or /// avatar update @@ -671,6 +683,8 @@ namespace OpenSim.Framework ulong ActiveGroupPowers { get; set;} + ViewerFlags ViewerFlags { get;} + Dictionary GetGroupPowers(); void SetGroupPowers(Dictionary powers); diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs index 3ce2acf182..c0b709104b 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs @@ -357,10 +357,14 @@ namespace OpenSim.Region.ClientStack.Linden if (m_Scene.RegionInfo.RegionSizeX == Constants.RegionSize && m_Scene.RegionInfo.RegionSizeY == Constants.RegionSize && m_Scene.RegionInfo.RegionSizeZ == Constants.RegionSize) - m_HostCapsObj.Flags |= Caps.CapsFlags.TPBR; + { + m_HostCapsObj.Flags |= Caps.CapsFlags.PBR | Caps.CapsFlags.TPBR; + } + else + m_HostCapsObj.Flags |= Caps.CapsFlags.PBR; continue; case "VETPBR": - m_HostCapsObj.Flags |= Caps.CapsFlags.TPBR; + m_HostCapsObj.Flags |= Caps.CapsFlags.PBR | Caps.CapsFlags.TPBR; continue; case "ObjectAnimation": m_HostCapsObj.Flags |= Caps.CapsFlags.ObjectAnim; @@ -379,7 +383,7 @@ namespace OpenSim.Region.ClientStack.Linden } validCaps.Add(cstr); } - + osUTF8 sb = LLSDxmlEncode2.Start(); LLSDxmlEncode2.AddMap(sb); m_HostCapsObj.GetCapsDetailsLLSDxml(validCaps, sb); diff --git a/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs index 65c2479863..cadfb4e9ff 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs @@ -158,12 +158,6 @@ namespace OpenSim.Region.ClientStack.Linden m_features["MeshUploadEnabled"] = true; m_features["MeshXferEnabled"] = true; - /* - m_features["MirrorsEnabled"] = false; - m_features["PBRMaterialSwatchEnabled"] = false; - m_features["PBRTerrainEnabled"] = false; - */ - m_features["PhysicsMaterialsEnabled"] = true; m_features["PhysicsShapeTypes"] = new OSDMap() @@ -196,7 +190,7 @@ namespace OpenSim.Region.ClientStack.Linden new SimpleStreamHandler("/" + UUID.Random(), delegate (IOSHttpRequest request, IOSHttpResponse response) { - HandleSimulatorFeaturesRequest(request, response, agentID); + HandleSimulatorFeaturesRequest(request, response, caps); })); if (m_doScriptSyntax && !m_scriptSyntaxID.IsZero() && m_scriptSyntaxXML != null) @@ -276,7 +270,7 @@ namespace OpenSim.Region.ClientStack.Linden return (OSDMap)copy; } - private void HandleSimulatorFeaturesRequest(IOSHttpRequest request, IOSHttpResponse response, UUID agentID) + private void HandleSimulatorFeaturesRequest(IOSHttpRequest request, IOSHttpResponse response, Caps caps) { // m_log.DebugFormat("[SIMULATOR FEATURES MODULE]: SimulatorFeatures request"); @@ -286,24 +280,21 @@ namespace OpenSim.Region.ClientStack.Linden return; } - /* - ScenePresence sp = m_scene.GetScenePresence(agentID); - if (sp == null) - { - response.StatusCode = (int)HttpStatusCode.ServiceUnavailable; - response.AddHeader("Retry-After", "5"); - return; - } - */ - OSDMap copy = DeepCopy(); + if ((caps.Flags & Caps.CapsFlags.TPBR) != 0) + { + copy["PBRMaterialSwatchEnabled"] = true; + copy["PBRTerrainEnabled"] = true; + copy["MirrorsEnabled"] = true; + } + // Let's add the agentID to the destination guide, if it is expecting that. if(copy.TryGetValue("OpenSimExtras", out OSD oe)) { if(((OSDMap)oe).TryGetValue("destination-guide-url", out OSD dgl)) { - ((OSDMap)oe)["destination-guide-url"] = Replace(dgl.AsString(), "[USERID]", agentID.ToString()); + ((OSDMap)oe)["destination-guide-url"] = Replace(dgl.AsString(), "[USERID]", caps.AgentID.ToString()); } } @@ -312,7 +303,7 @@ namespace OpenSim.Region.ClientStack.Linden foreach(SimulatorFeaturesRequestDelegate sd in OnSimulatorFeaturesRequest.GetInvocationList()) try { - sd?.Invoke(agentID, ref copy); + sd?.Invoke(caps.AgentID, ref copy); } catch { } } diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index ca88013fc3..b55e02f4d5 100755 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -341,8 +341,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP private readonly Prioritizer m_prioritizer; private bool m_disableFacelights; - // needs optimization - private HashSet GroupsInView = new(); + private HashSet GroupsInView = []; #pragma warning disable 0414 private bool m_VelocityInterpolate; #pragma warning restore 0414 @@ -350,6 +349,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP private bool m_SupportObjectAnimations; private bool m_SupportPBR; + public bool SupportTerrainPBR { get; private set; } + public ViewerFlags ViewerFlags { get; private set; } /// /// Maintain a record of all the objects killed. This allows us to stop an update being sent from the @@ -877,6 +878,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP public void SendRegionHandshake() { + GetViewerCaps(); // make sure this is up to date + RegionInfo regionInfo = m_scene.RegionInfo; RegionSettings regionSettings = regionInfo.RegionSettings; EstateSettings es = regionInfo.EstateSettings; @@ -915,14 +918,29 @@ namespace OpenSim.Region.ClientStack.LindenUDP // this seem now obsolete, sending zero uuids // we should send the basic low resolution default ? zc.AddZeros(16 * 4); - //TerrainDetail0 - zc.AddUUID(regionSettings.TerrainTexture1); - //TerrainDetail1 - zc.AddUUID(regionSettings.TerrainTexture2); - //TerrainDetail2 - zc.AddUUID(regionSettings.TerrainTexture3); - //TerrainDetail3 - zc.AddUUID(regionSettings.TerrainTexture4); + if(SupportTerrainPBR) + { + //TerrainDetail0 + zc.AddUUID(regionSettings.TerrainPBR1); + //TerrainDetail1 + zc.AddUUID(regionSettings.TerrainPBR2); + //TerrainDetail2 + zc.AddUUID(regionSettings.TerrainPBR3); + //TerrainDetail3 + zc.AddUUID(regionSettings.TerrainPBR4); + ViewerFlags |= ViewerFlags.SentTPBR; + } + else + { + //TerrainDetail0 + zc.AddUUID(regionSettings.TerrainTexture1); + //TerrainDetail1 + zc.AddUUID(regionSettings.TerrainTexture2); + //TerrainDetail2 + zc.AddUUID(regionSettings.TerrainTexture3); + //TerrainDetail3 + zc.AddUUID(regionSettings.TerrainTexture4); + } //TerrainStartHeight00 zc.AddFloat((float)regionSettings.Elevation1SW); //TerrainStartHeight01 @@ -13435,21 +13453,29 @@ namespace OpenSim.Region.ClientStack.LindenUDP if(cap != null) { if((cap.Flags & Caps.CapsFlags.SentSeeds) != 0) - ret |= 0x1000; + ret |= (uint)ViewerFlags.SentSeeds; if ((cap.Flags & Caps.CapsFlags.ObjectAnim) != 0) { m_SupportObjectAnimations = true; - ret |= 0x2000; + ret |= (uint)ViewerFlags.ObjectAnim; } if ((cap.Flags & Caps.CapsFlags.WLEnv) != 0) - ret |= 0x4000; + ret |= (uint)ViewerFlags.WLEnv; if ((cap.Flags & Caps.CapsFlags.AdvEnv) != 0) - ret |= 0x8000; + ret |= (uint)ViewerFlags.AdvEnv; if ((cap.Flags & Caps.CapsFlags.PBR) != 0) + { + ret |= (uint)ViewerFlags.PBR; m_SupportPBR = true; + } + if ((cap.Flags & Caps.CapsFlags.TPBR) != 0) + { + ret |= (uint)ViewerFlags.TPBR; + SupportTerrainPBR = true; + } } } - + ViewerFlags = (ViewerFlags)ret; return ret; } } diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementCommands.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementCommands.cs index 7879f83e97..b9723e8c4b 100644 --- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementCommands.cs +++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementCommands.cs @@ -68,6 +68,13 @@ namespace OpenSim.Region.CoreModules.World.Estate " that coordinate.", consoleSetTerrainTexture); + m_module.Scene.AddCommand("Regions", m_module, "set terrain pbr", + "set terrain pbr [] []", + "Sets the pbr to , if or are specified, it will only " + + "set it on regions with a matching coordinate. Specify -1 in or to wildcard" + + " that coordinate.", + consoleSetTerrainPBR); + m_module.Scene.AddCommand("Regions", m_module, "set terrain heights", "set terrain heights [] []", "Sets the terrain texture heights on corner # to /, if or are specified, it will only " + @@ -127,6 +134,44 @@ namespace OpenSim.Region.CoreModules.World.Estate } } } + protected void consoleSetTerrainPBR(string module, string[] args) + { + string num = args[3]; + string uuid = args[4]; + int x = (args.Length > 5 ? int.Parse(args[5]) : -1); + int y = (args.Length > 6 ? int.Parse(args[6]) : -1); + + if (x == -1 || m_module.Scene.RegionInfo.RegionLocX == x) + { + if (y == -1 || m_module.Scene.RegionInfo.RegionLocY == y) + { + int corner = int.Parse(num); + UUID texture = UUID.Parse(uuid); + + m_log.Debug($"[ESTATEMODULE]: Setting terrain PBR asset for {m_module.Scene.RegionInfo.RegionName} to {texture}"); + + switch (corner) + { + case 0: + m_module.Scene.RegionInfo.RegionSettings.TerrainPBR1 = texture; + break; + case 1: + m_module.Scene.RegionInfo.RegionSettings.TerrainPBR2 = texture; + break; + case 2: + m_module.Scene.RegionInfo.RegionSettings.TerrainPBR3 = texture; + break; + case 3: + m_module.Scene.RegionInfo.RegionSettings.TerrainPBR4 = texture; + break; + } + + m_module.Scene.RegionInfo.RegionSettings.Save(); + m_module.TriggerRegionInfoChange(); + m_module.sendRegionHandshakeToAll(); + } + } + } protected void consoleSetWaterHeight(string module, string[] args) { string heightstring = args[3]; diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs index 9a07d7f84b..55c5bf2781 100644 --- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs @@ -541,22 +541,45 @@ namespace OpenSim.Region.CoreModules.World.Estate if (texture.IsZero()) return; - switch (level) + if((remoteClient.ViewerFlags & ViewerFlags.TPBR) != 0) { - case 0: - Scene.RegionInfo.RegionSettings.TerrainTexture1 = texture; - break; - case 1: - Scene.RegionInfo.RegionSettings.TerrainTexture2 = texture; - break; - case 2: - Scene.RegionInfo.RegionSettings.TerrainTexture3 = texture; - break; - case 3: - Scene.RegionInfo.RegionSettings.TerrainTexture4 = texture; - break; - default: - return; + switch (level) + { + case 0: + Scene.RegionInfo.RegionSettings.TerrainPBR1 = texture; + break; + case 1: + Scene.RegionInfo.RegionSettings.TerrainPBR2 = texture; + break; + case 2: + Scene.RegionInfo.RegionSettings.TerrainPBR3 = texture; + break; + case 3: + Scene.RegionInfo.RegionSettings.TerrainPBR4 = texture; + break; + default: + return; + } + } + else + { + switch (level) + { + case 0: + Scene.RegionInfo.RegionSettings.TerrainTexture1 = texture; + break; + case 1: + Scene.RegionInfo.RegionSettings.TerrainTexture2 = texture; + break; + case 2: + Scene.RegionInfo.RegionSettings.TerrainTexture3 = texture; + break; + case 3: + Scene.RegionInfo.RegionSettings.TerrainTexture4 = texture; + break; + default: + return; + } } Scene.RegionInfo.RegionSettings.Save(); diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 416e6babef..804c58900b 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -3998,7 +3998,7 @@ namespace OpenSim.Region.Framework.Scenes return; uint flags = ControllingClient.GetViewerCaps(); - if ((flags & 0x1000) == 0) // wait for seeds sending + if ((flags & (uint)ViewerFlags.SentSeeds) == 0) // wait for seeds sending return; // give some extra time to make sure viewers did process seeds @@ -4058,6 +4058,10 @@ namespace OpenSim.Region.Framework.Scenes m_agentTransfer?.CloseOldChildAgents(this); } + uint flags = ControllingClient.GetViewerCaps(); + if ((flags & (uint)(ViewerFlags.TPBR | ViewerFlags.SentSeeds)) == (uint)ViewerFlags.TPBR) + ControllingClient.SendRegionHandshake(); + m_log.DebugFormat("[SCENE PRESENCE({0})]: SendInitialData for {1}", m_scene.RegionInfo.RegionName, UUID); if (m_teleportFlags <= 0) { diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs index dcb366e233..8db57eb7d3 100755 --- a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs +++ b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs @@ -57,6 +57,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server private UUID m_agentID = UUID.Random(); public ISceneAgent SceneAgent { get; set; } + public ViewerFlags ViewerFlags { get; private set; } = 0; public int PingTimeMS { get { return 0; } } diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs index 53cf030585..b83e369652 100755 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs @@ -57,6 +57,8 @@ namespace OpenSim.Region.OptionalModules.World.NPC /// public event ChatToNPC OnChatToNPC; + public ViewerFlags ViewerFlags { get; private set; } + /// /// Fired when the NPC receives an instant message. /// diff --git a/OpenSim/Services/LLLoginService/LLLoginService.cs b/OpenSim/Services/LLLoginService/LLLoginService.cs index 297c86eee4..a8758f478e 100755 --- a/OpenSim/Services/LLLoginService/LLLoginService.cs +++ b/OpenSim/Services/LLLoginService/LLLoginService.cs @@ -731,8 +731,8 @@ namespace OpenSim.Services.LLLoginService else { position = pinfo.LastPosition; - position.X = Util.Clamp(position.X, 0.5f, region.RegionSizeX - 0.5f); - position.Y = Util.Clamp(position.Y, 0.5f, region.RegionSizeY - 0.5f); + position.X = Math.Clamp(position.X, 0.5f, region.RegionSizeX - 0.5f); + position.Y = Math.Clamp(position.Y, 0.5f, region.RegionSizeY - 0.5f); lookAt = pinfo.LastLookAt; } From f81a11aaab031c64458bc76d94240aceb1153e2c Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Tue, 11 Jun 2024 22:26:15 +0100 Subject: [PATCH 4/6] duhh why did i compare regionSize Z ?? phhhh --- .../Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs index c0b709104b..3f1c22b66c 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs @@ -355,8 +355,7 @@ namespace OpenSim.Region.ClientStack.Linden continue; case "VTPBR": if (m_Scene.RegionInfo.RegionSizeX == Constants.RegionSize && - m_Scene.RegionInfo.RegionSizeY == Constants.RegionSize && - m_Scene.RegionInfo.RegionSizeZ == Constants.RegionSize) + m_Scene.RegionInfo.RegionSizeY == Constants.RegionSize ) { m_HostCapsObj.Flags |= Caps.CapsFlags.PBR | Caps.CapsFlags.TPBR; } From 8becea09c1393de814a3ceadd67021f9ed220966 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Tue, 11 Jun 2024 23:21:33 +0100 Subject: [PATCH 5/6] oops wrong sent flag --- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 804c58900b..c9193274d2 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -4059,7 +4059,7 @@ namespace OpenSim.Region.Framework.Scenes } uint flags = ControllingClient.GetViewerCaps(); - if ((flags & (uint)(ViewerFlags.TPBR | ViewerFlags.SentSeeds)) == (uint)ViewerFlags.TPBR) + if ((flags & (uint)(ViewerFlags.TPBR | ViewerFlags.SentTPBR)) == (uint)ViewerFlags.TPBR) ControllingClient.SendRegionHandshake(); m_log.DebugFormat("[SCENE PRESENCE({0})]: SendInitialData for {1}", m_scene.RegionInfo.RegionName, UUID); From ed455616f773983598ef217216c013aa13f5e064 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Wed, 12 Jun 2024 13:33:50 +0100 Subject: [PATCH 6/6] decouple mirrors feature from VTPBR --- .../Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs index cadfb4e9ff..c1ebc5fa4f 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs @@ -158,6 +158,8 @@ namespace OpenSim.Region.ClientStack.Linden m_features["MeshUploadEnabled"] = true; m_features["MeshXferEnabled"] = true; + m_features["MirrorsEnabled"] = true; + m_features["PhysicsMaterialsEnabled"] = true; m_features["PhysicsShapeTypes"] = new OSDMap() @@ -286,7 +288,6 @@ namespace OpenSim.Region.ClientStack.Linden { copy["PBRMaterialSwatchEnabled"] = true; copy["PBRTerrainEnabled"] = true; - copy["MirrorsEnabled"] = true; } // Let's add the agentID to the destination guide, if it is expecting that.