* On client login, send only one terrain patch at a time (with pauses) instead of 4 at a time
* Certain terrains which are fine went patches are sent singly cause a libsecondlife failure when patches are sent in batches * See http://opensimulator.org/mantis/view.php?id=1662 for more details0.6.0-stable
parent
7fea52be35
commit
8251508412
|
@ -1101,27 +1101,44 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
//}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Send terrain layer information to the client.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="o"></param>
|
||||||
private void DoSendLayerData(object o)
|
private void DoSendLayerData(object o)
|
||||||
{
|
{
|
||||||
float[] map = (float[])o;
|
float[] map = (float[])o;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
for (int y = 0; y < 16; y++)
|
for (int y = 0; y < 16; y++)
|
||||||
{
|
{
|
||||||
for (int x = 0; x < 16; x += 4)
|
// For some terrains, sending more than one terrain patch at once results in a libsecondlife exception
|
||||||
|
// see http://opensimulator.org/mantis/view.php?id=1662
|
||||||
|
//for (int x = 0; x < 16; x += 4)
|
||||||
|
//{
|
||||||
|
// SendLayerPacket(map, y, x);
|
||||||
|
// Thread.Sleep(150);
|
||||||
|
//}
|
||||||
|
for (int x= 0; x < 16; x++)
|
||||||
{
|
{
|
||||||
SendLayerPacket(map, y, x);
|
SendLayerData(x, y, map);
|
||||||
Thread.Sleep(150);
|
Thread.Sleep(35);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
m_log.Warn("[client]: " +
|
m_log.Warn("[CLIENT]: ClientView.API.cs: SendLayerData() - Failed with exception " + e.ToString());
|
||||||
"ClientView.API.cs: SendLayerData() - Failed with exception " + e.ToString());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Sends a set of four patches (x, x+1, ..., x+3) to the client
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="map">heightmap</param>
|
||||||
|
/// <param name="px">X coordinate for patches 0..12</param>
|
||||||
|
/// <param name="py">Y coordinate for patches 0..15</param>
|
||||||
private void SendLayerPacket(float[] map, int y, int x)
|
private void SendLayerPacket(float[] map, int y, int x)
|
||||||
{
|
{
|
||||||
int[] patches = new int[4];
|
int[] patches = new int[4];
|
||||||
|
@ -1137,8 +1154,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sends a specified patch to a client
|
/// Sends a specified patch to a client
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="px">Patch coordinate (x) 0..16</param>
|
/// <param name="px">Patch coordinate (x) 0..15</param>
|
||||||
/// <param name="py">Patch coordinate (y) 0..16</param>
|
/// <param name="py">Patch coordinate (y) 0..15</param>
|
||||||
/// <param name="map">heightmap</param>
|
/// <param name="map">heightmap</param>
|
||||||
public void SendLayerData(int px, int py, float[] map)
|
public void SendLayerData(int px, int py, float[] map)
|
||||||
{
|
{
|
||||||
|
@ -1157,8 +1174,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
m_log.Warn("[client]: " +
|
m_log.Warn("[client]: ClientView.API.cs: SendLayerData() - Failed with exception " + e.ToString());
|
||||||
"ClientView.API.cs: SendLayerData() - Failed with exception " + e.ToString());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,13 @@ namespace OpenSim.Region.Environment.Interfaces
|
||||||
int Height { get; }
|
int Height { get; }
|
||||||
double this[int x, int y] { get; set; }
|
double this[int x, int y] { get; set; }
|
||||||
int Width { get; }
|
int Width { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Squash the entire heightmap into a single dimensioned array
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
float[] GetFloatsSerialised();
|
float[] GetFloatsSerialised();
|
||||||
|
|
||||||
double[,] GetDoubles();
|
double[,] GetDoubles();
|
||||||
bool Tainted(int x, int y);
|
bool Tainted(int x, int y);
|
||||||
ITerrainChannel MakeCopy();
|
ITerrainChannel MakeCopy();
|
||||||
|
|
|
@ -45,7 +45,7 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain
|
||||||
|
|
||||||
public TerrainChannel()
|
public TerrainChannel()
|
||||||
{
|
{
|
||||||
map = new double[Constants.RegionSize,Constants.RegionSize];
|
map = new double[Constants.RegionSize, Constants.RegionSize];
|
||||||
taint = new bool[Constants.RegionSize / 16,Constants.RegionSize / 16];
|
taint = new bool[Constants.RegionSize / 16,Constants.RegionSize / 16];
|
||||||
|
|
||||||
int x;
|
int x;
|
||||||
|
|
|
@ -494,8 +494,9 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Checks to see if the terrain has been modified since last check
|
/// Checks to see if the terrain has been modified since last check.
|
||||||
/// if the call is asked to respect the estate settings for terrain_raise_limit and
|
/// If it has been modified, every all the terrain patches are sent to the client.
|
||||||
|
/// If the call is asked to respect the estate settings for terrain_raise_limit and
|
||||||
/// terrain_lower_limit, it will clamp terrain updates between these values
|
/// terrain_lower_limit, it will clamp terrain updates between these values
|
||||||
/// currently invoked by client_OnModifyTerrain only and not the Commander interfaces
|
/// currently invoked by client_OnModifyTerrain only and not the Commander interfaces
|
||||||
/// <param name="respectEstateSettings">should height map deltas be limited to the estate settings limits</param>
|
/// <param name="respectEstateSettings">should height map deltas be limited to the estate settings limits</param>
|
||||||
|
@ -520,6 +521,7 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain
|
||||||
// what we are going to send to the client
|
// what we are going to send to the client
|
||||||
serialised = m_channel.GetFloatsSerialised();
|
serialised = m_channel.GetFloatsSerialised();
|
||||||
}
|
}
|
||||||
|
|
||||||
SendToClients(serialised, x, y);
|
SendToClients(serialised, x, y);
|
||||||
shouldTaint = true;
|
shouldTaint = true;
|
||||||
}
|
}
|
||||||
|
@ -578,7 +580,11 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain
|
||||||
private void SendToClients(float[] serialised, int x, int y)
|
private void SendToClients(float[] serialised, int x, int y)
|
||||||
{
|
{
|
||||||
m_scene.ForEachClient(
|
m_scene.ForEachClient(
|
||||||
delegate(IClientAPI controller) { controller.SendLayerData(x / Constants.TerrainPatchSize, y / Constants.TerrainPatchSize, serialised); });
|
delegate(IClientAPI controller)
|
||||||
|
{ controller.SendLayerData(
|
||||||
|
x / Constants.TerrainPatchSize, y / Constants.TerrainPatchSize, serialised);
|
||||||
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void client_OnModifyTerrain(float height, float seconds, byte size, byte action, float north, float west,
|
private void client_OnModifyTerrain(float height, float seconds, byte size, byte action, float north, float west,
|
||||||
|
|
Loading…
Reference in New Issue