add to databases a table to store baked terrain.
parent
0cdad0faf4
commit
3f9f105295
|
@ -639,6 +639,53 @@ namespace OpenSim.Data.MySQL
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void StoreBakedTerrain(TerrainData terrData, UUID regionID)
|
||||||
|
{
|
||||||
|
Util.FireAndForget(delegate(object x)
|
||||||
|
{
|
||||||
|
m_log.Info("[REGION DB]: Storing Baked terrain");
|
||||||
|
|
||||||
|
lock (m_dbLock)
|
||||||
|
{
|
||||||
|
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
|
||||||
|
{
|
||||||
|
dbcon.Open();
|
||||||
|
|
||||||
|
using (MySqlCommand cmd = dbcon.CreateCommand())
|
||||||
|
{
|
||||||
|
cmd.CommandText = "delete from bakedterrain where RegionUUID = ?RegionUUID";
|
||||||
|
cmd.Parameters.AddWithValue("RegionUUID", regionID.ToString());
|
||||||
|
|
||||||
|
using (MySqlCommand cmd2 = dbcon.CreateCommand())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
cmd2.CommandText = "insert into bakedterrain (RegionUUID, " +
|
||||||
|
"Revision, Heightfield) values (?RegionUUID, " +
|
||||||
|
"?Revision, ?Heightfield)";
|
||||||
|
|
||||||
|
int terrainDBRevision;
|
||||||
|
Array terrainDBblob;
|
||||||
|
terrData.GetDatabaseBlob(out terrainDBRevision, out terrainDBblob);
|
||||||
|
|
||||||
|
cmd2.Parameters.AddWithValue("RegionUUID", regionID.ToString());
|
||||||
|
cmd2.Parameters.AddWithValue("Revision", terrainDBRevision);
|
||||||
|
cmd2.Parameters.AddWithValue("Heightfield", terrainDBblob);
|
||||||
|
|
||||||
|
ExecuteNonQuery(cmd);
|
||||||
|
ExecuteNonQuery(cmd2);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
m_log.ErrorFormat(e.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Legacy region loading
|
// Legacy region loading
|
||||||
public virtual double[,] LoadTerrain(UUID regionID)
|
public virtual double[,] LoadTerrain(UUID regionID)
|
||||||
{
|
{
|
||||||
|
|
|
@ -379,3 +379,14 @@ ALTER TABLE `prims` ADD COLUMN `RotationAxisLocks` tinyint(4) NOT NULL default '
|
||||||
|
|
||||||
COMMIT;
|
COMMIT;
|
||||||
|
|
||||||
|
:VERSION 54 #----- add baked terrain store
|
||||||
|
|
||||||
|
BEGIN;
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS `bakedterrain` (
|
||||||
|
`RegionUUID` varchar(255) DEFAULT NULL,
|
||||||
|
`Revision` int(11) DEFAULT NULL,
|
||||||
|
`Heightfield` longblob
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
COMMIT;
|
||||||
|
|
|
@ -133,6 +133,7 @@ namespace OpenSim.Data.Null
|
||||||
}
|
}
|
||||||
|
|
||||||
Dictionary<UUID, TerrainData> m_terrains = new Dictionary<UUID, TerrainData>();
|
Dictionary<UUID, TerrainData> m_terrains = new Dictionary<UUID, TerrainData>();
|
||||||
|
Dictionary<UUID, TerrainData> m_bakedterrains = new Dictionary<UUID, TerrainData>();
|
||||||
public void StoreTerrain(TerrainData ter, UUID regionID)
|
public void StoreTerrain(TerrainData ter, UUID regionID)
|
||||||
{
|
{
|
||||||
if (m_terrains.ContainsKey(regionID))
|
if (m_terrains.ContainsKey(regionID))
|
||||||
|
@ -140,6 +141,13 @@ namespace OpenSim.Data.Null
|
||||||
m_terrains.Add(regionID, ter);
|
m_terrains.Add(regionID, ter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void StoreBakedTerrain(TerrainData ter, UUID regionID)
|
||||||
|
{
|
||||||
|
if (m_bakedterrains.ContainsKey(regionID))
|
||||||
|
m_bakedterrains.Remove(regionID);
|
||||||
|
m_bakedterrains.Add(regionID, ter);
|
||||||
|
}
|
||||||
|
|
||||||
// Legacy. Just don't do this.
|
// Legacy. Just don't do this.
|
||||||
public void StoreTerrain(double[,] ter, UUID regionID)
|
public void StoreTerrain(double[,] ter, UUID regionID)
|
||||||
{
|
{
|
||||||
|
|
|
@ -623,6 +623,49 @@ namespace OpenSim.Data.PGSQL
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Stores the baked terrain map to DB.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="terrain">terrain map data.</param>
|
||||||
|
/// <param name="regionID">regionID.</param>
|
||||||
|
public void StoreBakedTerrain(TerrainData terrData, UUID regionID)
|
||||||
|
{
|
||||||
|
//Delete old terrain map
|
||||||
|
string sql = @"delete from bakedterrain where ""RegionUUID""=:RegionUUID";
|
||||||
|
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||||
|
{
|
||||||
|
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||||
|
{
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("RegionUUID", regionID));
|
||||||
|
conn.Open();
|
||||||
|
cmd.ExecuteNonQuery();
|
||||||
|
|
||||||
|
_Log.InfoFormat("{0} Deleted bakedterrain id = {1}", LogHeader, regionID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int terrainDBRevision;
|
||||||
|
Array terrainDBblob;
|
||||||
|
terrData.GetDatabaseBlob(out terrainDBRevision, out terrainDBblob);
|
||||||
|
|
||||||
|
sql = @"insert into bakedterrain(""RegionUUID"", ""Revision"", ""Heightfield"") values(:RegionUUID, :Revision, :Heightfield)";
|
||||||
|
|
||||||
|
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||||
|
{
|
||||||
|
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||||
|
{
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("RegionUUID", regionID));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("Revision", terrainDBRevision));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("Heightfield", terrainDBblob));
|
||||||
|
conn.Open();
|
||||||
|
cmd.ExecuteNonQuery();
|
||||||
|
|
||||||
|
_Log.InfoFormat("{0} Stored bakedterrain id = {1}, terrainSize = <{2},{3}>",
|
||||||
|
LogHeader, regionID, terrData.SizeX, terrData.SizeY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Loads all the land objects of a region.
|
/// Loads all the land objects of a region.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -1182,3 +1182,16 @@ BEGIN TRANSACTION;
|
||||||
ALTER TABLE prims ADD "RotationAxisLocks" smallint NOT NULL DEFAULT (0);
|
ALTER TABLE prims ADD "RotationAxisLocks" smallint NOT NULL DEFAULT (0);
|
||||||
|
|
||||||
COMMIT;
|
COMMIT;
|
||||||
|
|
||||||
|
:VERSION 44 #---- add baked terrain store
|
||||||
|
|
||||||
|
BEGIN TRANSACTION;
|
||||||
|
|
||||||
|
CREATE TABLE bakedterrain
|
||||||
|
(
|
||||||
|
"RegionUUID" uuid NULL,
|
||||||
|
"Revision" int NULL,
|
||||||
|
"Heightfield" bytea NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
COMMIT;
|
||||||
|
|
|
@ -352,3 +352,14 @@ BEGIN;
|
||||||
ALTER TABLE prims ADD COLUMN `RotationAxisLocks` tinyint(4) NOT NULL default '0';
|
ALTER TABLE prims ADD COLUMN `RotationAxisLocks` tinyint(4) NOT NULL default '0';
|
||||||
|
|
||||||
COMMIT;
|
COMMIT;
|
||||||
|
|
||||||
|
:VERSION 34 #---- add baked terrain store
|
||||||
|
|
||||||
|
BEGIN;
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS bakedterrain(
|
||||||
|
RegionUUID varchar(255),
|
||||||
|
Revision integer,
|
||||||
|
Heightfield blob);
|
||||||
|
|
||||||
|
COMMIT;
|
||||||
|
|
|
@ -827,7 +827,7 @@ namespace OpenSim.Data.SQLite
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Store a terrain revision in region storage
|
/// Store a terrain in region storage
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="ter">terrain heightfield</param>
|
/// <param name="ter">terrain heightfield</param>
|
||||||
/// <param name="regionID">region UUID</param>
|
/// <param name="regionID">region UUID</param>
|
||||||
|
@ -851,7 +851,44 @@ namespace OpenSim.Data.SQLite
|
||||||
Array terrainDBblob;
|
Array terrainDBblob;
|
||||||
terrData.GetDatabaseBlob(out terrainDBRevision, out terrainDBblob);
|
terrData.GetDatabaseBlob(out terrainDBRevision, out terrainDBblob);
|
||||||
|
|
||||||
m_log.DebugFormat("{0} Storing terrain revision r {1}", LogHeader, terrainDBRevision);
|
m_log.DebugFormat("{0} Storing terrain format {1}", LogHeader, terrainDBRevision);
|
||||||
|
|
||||||
|
using (SqliteCommand cmd = new SqliteCommand(sql, m_conn))
|
||||||
|
{
|
||||||
|
cmd.Parameters.Add(new SqliteParameter(":RegionUUID", regionID.ToString()));
|
||||||
|
cmd.Parameters.Add(new SqliteParameter(":Revision", terrainDBRevision));
|
||||||
|
cmd.Parameters.Add(new SqliteParameter(":Heightfield", terrainDBblob));
|
||||||
|
cmd.ExecuteNonQuery();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Store baked terrain in region storage
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ter">terrain heightfield</param>
|
||||||
|
/// <param name="regionID">region UUID</param>
|
||||||
|
public void StoreBakedTerrain(TerrainData terrData, UUID regionID)
|
||||||
|
{
|
||||||
|
lock (ds)
|
||||||
|
{
|
||||||
|
using (
|
||||||
|
SqliteCommand cmd = new SqliteCommand("delete from bakedterrain where RegionUUID=:RegionUUID", m_conn))
|
||||||
|
{
|
||||||
|
cmd.Parameters.Add(new SqliteParameter(":RegionUUID", regionID.ToString()));
|
||||||
|
cmd.ExecuteNonQuery();
|
||||||
|
}
|
||||||
|
|
||||||
|
// the following is an work around for .NET. The perf
|
||||||
|
// issues associated with it aren't as bad as you think.
|
||||||
|
String sql = "insert into bakedterrain(RegionUUID, Revision, Heightfield)" +
|
||||||
|
" values(:RegionUUID, :Revision, :Heightfield)";
|
||||||
|
|
||||||
|
int terrainDBRevision;
|
||||||
|
Array terrainDBblob;
|
||||||
|
terrData.GetDatabaseBlob(out terrainDBRevision, out terrainDBblob);
|
||||||
|
|
||||||
|
m_log.DebugFormat("{0} Storing bakedterrain format {1}", LogHeader, terrainDBRevision);
|
||||||
|
|
||||||
using (SqliteCommand cmd = new SqliteCommand(sql, m_conn))
|
using (SqliteCommand cmd = new SqliteCommand(sql, m_conn))
|
||||||
{
|
{
|
||||||
|
@ -1354,7 +1391,7 @@ namespace OpenSim.Data.SQLite
|
||||||
createCol(land, "Name", typeof(String));
|
createCol(land, "Name", typeof(String));
|
||||||
createCol(land, "Desc", typeof(String));
|
createCol(land, "Desc", typeof(String));
|
||||||
createCol(land, "OwnerUUID", typeof(String));
|
createCol(land, "OwnerUUID", typeof(String));
|
||||||
createCol(land, "IsGroupOwned", typeof(String));
|
createCol(land, "IsGroupOwned", typeof(Boolean));
|
||||||
createCol(land, "Area", typeof(Int32));
|
createCol(land, "Area", typeof(Int32));
|
||||||
createCol(land, "AuctionID", typeof(Int32)); //Unemplemented
|
createCol(land, "AuctionID", typeof(Int32)); //Unemplemented
|
||||||
createCol(land, "Category", typeof(Int32)); //Enum OpenMetaverse.Parcel.ParcelCategory
|
createCol(land, "Category", typeof(Int32)); //Enum OpenMetaverse.Parcel.ParcelCategory
|
||||||
|
@ -1387,9 +1424,6 @@ namespace OpenSim.Data.SQLite
|
||||||
createCol(land, "MediaLoop", typeof(Boolean));
|
createCol(land, "MediaLoop", typeof(Boolean));
|
||||||
createCol(land, "ObscureMedia", typeof(Boolean));
|
createCol(land, "ObscureMedia", typeof(Boolean));
|
||||||
createCol(land, "ObscureMusic", typeof(Boolean));
|
createCol(land, "ObscureMusic", typeof(Boolean));
|
||||||
createCol(land, "SeeAVs", typeof(Boolean));
|
|
||||||
createCol(land, "AnyAVSounds", typeof(Boolean));
|
|
||||||
createCol(land, "GroupAVSounds", typeof(Boolean));
|
|
||||||
|
|
||||||
land.PrimaryKey = new DataColumn[] { land.Columns["UUID"] };
|
land.PrimaryKey = new DataColumn[] { land.Columns["UUID"] };
|
||||||
|
|
||||||
|
@ -1832,7 +1866,7 @@ namespace OpenSim.Data.SQLite
|
||||||
newData.Name = (String)row["Name"];
|
newData.Name = (String)row["Name"];
|
||||||
newData.Description = (String)row["Desc"];
|
newData.Description = (String)row["Desc"];
|
||||||
newData.OwnerID = (UUID)(String)row["OwnerUUID"];
|
newData.OwnerID = (UUID)(String)row["OwnerUUID"];
|
||||||
newData.IsGroupOwned = Convert.ToBoolean(row["IsGroupOwned"]);
|
newData.IsGroupOwned = (Boolean)row["IsGroupOwned"];
|
||||||
newData.Area = Convert.ToInt32(row["Area"]);
|
newData.Area = Convert.ToInt32(row["Area"]);
|
||||||
newData.AuctionID = Convert.ToUInt32(row["AuctionID"]); //Unemplemented
|
newData.AuctionID = Convert.ToUInt32(row["AuctionID"]); //Unemplemented
|
||||||
newData.Category = (ParcelCategory)Convert.ToInt32(row["Category"]);
|
newData.Category = (ParcelCategory)Convert.ToInt32(row["Category"]);
|
||||||
|
@ -2248,7 +2282,7 @@ namespace OpenSim.Data.SQLite
|
||||||
row["Name"] = land.Name;
|
row["Name"] = land.Name;
|
||||||
row["Desc"] = land.Description;
|
row["Desc"] = land.Description;
|
||||||
row["OwnerUUID"] = land.OwnerID.ToString();
|
row["OwnerUUID"] = land.OwnerID.ToString();
|
||||||
row["IsGroupOwned"] = land.IsGroupOwned.ToString();
|
row["IsGroupOwned"] = land.IsGroupOwned;
|
||||||
row["Area"] = land.Area;
|
row["Area"] = land.Area;
|
||||||
row["AuctionID"] = land.AuctionID; //Unemplemented
|
row["AuctionID"] = land.AuctionID; //Unemplemented
|
||||||
row["Category"] = land.Category; //Enum OpenMetaverse.Parcel.ParcelCategory
|
row["Category"] = land.Category; //Enum OpenMetaverse.Parcel.ParcelCategory
|
||||||
|
@ -2942,9 +2976,6 @@ namespace OpenSim.Data.SQLite
|
||||||
{
|
{
|
||||||
return DbType.Binary;
|
return DbType.Binary;
|
||||||
}
|
}
|
||||||
else if (type == typeof(Boolean)) {
|
|
||||||
return DbType.Boolean;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return DbType.String;
|
return DbType.String;
|
||||||
|
|
|
@ -64,12 +64,19 @@ namespace OpenSim.Region.Framework.Interfaces
|
||||||
List<SceneObjectGroup> LoadObjects(UUID regionUUID);
|
List<SceneObjectGroup> LoadObjects(UUID regionUUID);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Store a terrain revision in region storage
|
/// Store terrain in region storage
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="ter">HeightField data</param>
|
/// <param name="ter">HeightField data</param>
|
||||||
/// <param name="regionID">region UUID</param>
|
/// <param name="regionID">region UUID</param>
|
||||||
void StoreTerrain(TerrainData terrain, UUID regionID);
|
void StoreTerrain(TerrainData terrain, UUID regionID);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Store baked terrain in region storage
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ter">HeightField data</param>
|
||||||
|
/// <param name="regionID">region UUID</param>
|
||||||
|
void StoreBakedTerrain(TerrainData terrain, UUID regionID);
|
||||||
|
|
||||||
// Legacy version kept for downward compabibility
|
// Legacy version kept for downward compabibility
|
||||||
void StoreTerrain(double[,] terrain, UUID regionID);
|
void StoreTerrain(double[,] terrain, UUID regionID);
|
||||||
|
|
||||||
|
|
|
@ -75,12 +75,20 @@ namespace OpenSim.Region.Framework.Interfaces
|
||||||
List<SceneObjectGroup> LoadObjects(UUID regionUUID);
|
List<SceneObjectGroup> LoadObjects(UUID regionUUID);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Store a terrain revision in region storage
|
/// Store a terrain in region storage
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="ter">HeightField data</param>
|
/// <param name="ter">HeightField data</param>
|
||||||
/// <param name="regionID">region UUID</param>
|
/// <param name="regionID">region UUID</param>
|
||||||
void StoreTerrain(TerrainData terrain, UUID regionID);
|
void StoreTerrain(TerrainData terrain, UUID regionID);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Store baked terrain in region storage
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ter">HeightField data</param>
|
||||||
|
/// <param name="regionID">region UUID</param>
|
||||||
|
void StoreBakedTerrain(TerrainData terrain, UUID regionID);
|
||||||
|
|
||||||
|
|
||||||
// Legacy version kept for downward compabibility
|
// Legacy version kept for downward compabibility
|
||||||
void StoreTerrain(double[,] terrain, UUID regionID);
|
void StoreTerrain(double[,] terrain, UUID regionID);
|
||||||
|
|
||||||
|
|
|
@ -104,6 +104,11 @@ namespace OpenSim.Services.SimulationService
|
||||||
m_database.StoreTerrain(terrain, regionID);
|
m_database.StoreTerrain(terrain, regionID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void StoreBakedTerrain(TerrainData terrain, UUID regionID)
|
||||||
|
{
|
||||||
|
m_database.StoreBakedTerrain(terrain, regionID);
|
||||||
|
}
|
||||||
|
|
||||||
public void StoreTerrain(double[,] terrain, UUID regionID)
|
public void StoreTerrain(double[,] terrain, UUID regionID)
|
||||||
{
|
{
|
||||||
m_database.StoreTerrain(terrain, regionID);
|
m_database.StoreTerrain(terrain, regionID);
|
||||||
|
|
|
@ -74,6 +74,11 @@ namespace OpenSim.Data.Null
|
||||||
m_store.StoreTerrain(terrain, regionID);
|
m_store.StoreTerrain(terrain, regionID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void StoreBakedTerrain(TerrainData terrain, UUID regionID)
|
||||||
|
{
|
||||||
|
m_store.StoreBakedTerrain(terrain, regionID);
|
||||||
|
}
|
||||||
|
|
||||||
public double[,] LoadTerrain(UUID regionID)
|
public double[,] LoadTerrain(UUID regionID)
|
||||||
{
|
{
|
||||||
return m_store.LoadTerrain(regionID);
|
return m_store.LoadTerrain(regionID);
|
||||||
|
@ -170,6 +175,7 @@ namespace OpenSim.Data.Null
|
||||||
protected Dictionary<UUID, ICollection<TaskInventoryItem>> m_primItems
|
protected Dictionary<UUID, ICollection<TaskInventoryItem>> m_primItems
|
||||||
= new Dictionary<UUID, ICollection<TaskInventoryItem>>();
|
= new Dictionary<UUID, ICollection<TaskInventoryItem>>();
|
||||||
protected Dictionary<UUID, TerrainData> m_terrains = new Dictionary<UUID, TerrainData>();
|
protected Dictionary<UUID, TerrainData> m_terrains = new Dictionary<UUID, TerrainData>();
|
||||||
|
protected Dictionary<UUID, TerrainData> m_bakedterrains = new Dictionary<UUID, TerrainData>();
|
||||||
protected Dictionary<UUID, LandData> m_landData = new Dictionary<UUID, LandData>();
|
protected Dictionary<UUID, LandData> m_landData = new Dictionary<UUID, LandData>();
|
||||||
|
|
||||||
public void Initialise(string dbfile)
|
public void Initialise(string dbfile)
|
||||||
|
@ -319,6 +325,11 @@ namespace OpenSim.Data.Null
|
||||||
m_terrains[regionID] = ter;
|
m_terrains[regionID] = ter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void StoreBakedTerrain(TerrainData ter, UUID regionID)
|
||||||
|
{
|
||||||
|
m_bakedterrains[regionID] = ter;
|
||||||
|
}
|
||||||
|
|
||||||
public void StoreTerrain(double[,] ter, UUID regionID)
|
public void StoreTerrain(double[,] ter, UUID regionID)
|
||||||
{
|
{
|
||||||
m_terrains[regionID] = new HeightmapTerrainData(ter);
|
m_terrains[regionID] = new HeightmapTerrainData(ter);
|
||||||
|
|
Loading…
Reference in New Issue