From 39777db8ef0604ad228854ce226bb530c2d27239 Mon Sep 17 00:00:00 2001
From: Robert Adams
Date: Thu, 31 Oct 2013 09:24:06 -0700
Subject: varregion: fix problem of X/Y dimensions swapped and incorrect
terrain compression base computation. Complete replacement of float[] for
terrain heightmap with TerrainData instance.
---
OpenSim/Framework/TerrainData.cs | 2 +-
.../Region/ClientStack/Linden/UDP/LLClientView.cs | 25 +++++++++-------
OpenSim/Region/Framework/Scenes/TerrainChannel.cs | 20 +++++++------
.../Region/Framework/Scenes/TerrainCompressor.cs | 35 ++++++++++------------
4 files changed, 42 insertions(+), 40 deletions(-)
(limited to 'OpenSim')
diff --git a/OpenSim/Framework/TerrainData.cs b/OpenSim/Framework/TerrainData.cs
index 103359b..d7f1655 100644
--- a/OpenSim/Framework/TerrainData.cs
+++ b/OpenSim/Framework/TerrainData.cs
@@ -103,7 +103,7 @@ namespace OpenSim.Framework
{
m_heightmap[x, y] = newVal;
m_taint[x / Constants.TerrainPatchSize, y / Constants.TerrainPatchSize] = true;
- m_log.DebugFormat("{0} set[{1},{2}] to {3} ({4})", LogHeader, x, y, value, newVal);
+ // m_log.DebugFormat("{0} set[{1},{2}] to {3} ({4})", LogHeader, x, y, value, newVal);
}
}
}
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index 2b8a04f..c8e7eb5 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -1154,7 +1154,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
/// heightmap
public virtual void SendLayerData(float[] map)
{
- Util.FireAndForget(DoSendLayerData, map);
+ Util.FireAndForget(DoSendLayerData, m_scene.Heightmap.GetTerrainData());
}
///
@@ -1163,7 +1163,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
///
private void DoSendLayerData(object o)
{
- float[] map = (float[])o;
+ TerrainData map = (TerrainData)o;
try
{
@@ -1177,7 +1177,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
//}
// Send LayerData in a spiral pattern. Fun!
- SendLayerTopRight(map, 0, 0, 15, 15);
+ SendLayerTopRight(map, 0, 0, map.SizeX/Constants.TerrainPatchSize-1, map.SizeY/Constants.TerrainPatchSize-1);
}
catch (Exception e)
{
@@ -1185,7 +1185,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
}
}
- private void SendLayerTopRight(float[] map, int x1, int y1, int x2, int y2)
+ private void SendLayerTopRight(TerrainData map, int x1, int y1, int x2, int y2)
{
// Row
for (int i = x1; i <= x2; i++)
@@ -1199,7 +1199,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
SendLayerBottomLeft(map, x1, y1 + 1, x2 - 1, y2);
}
- void SendLayerBottomLeft(float[] map, int x1, int y1, int x2, int y2)
+ void SendLayerBottomLeft(TerrainData map, int x1, int y1, int x2, int y2)
{
// Row in reverse
for (int i = x2; i >= x1; i--)
@@ -1231,6 +1231,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
// OutPacket(layerpack, ThrottleOutPacketType.Land);
// }
+ // Legacy form of invocation that passes around a bare data array.
+ // Just ignore what was passed and use the real terrain info that is part of the scene.
+ public void SendLayerData(int px, int py, float[] map)
+ {
+ SendLayerData(px, py, m_scene.Heightmap.GetTerrainData());
+ }
+
///
/// Sends a terrain packet for the point specified.
/// This is a legacy call that has refarbed the terrain into a flat map of floats.
@@ -1239,15 +1246,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
/// Patch coordinate (x) 0..15
/// Patch coordinate (y) 0..15
/// heightmap
- public void SendLayerData(int px, int py, float[] map)
+ public void SendLayerData(int px, int py, TerrainData terrData)
{
try
{
- // For unknown reasons, after this point, patch numbers are swapped X for y.
- // That means, that for
- ///
- /// A 256 * 256 array of floating point values
- /// specifying the height at each meter in the simulator
+ ///
+ /// Terrain data that can result in a meter square heightmap.
///
///
- /// Array of indexes in the 16x16 grid of patches
- /// for this simulator. For example if 1 and 17 are specified, patches
- /// x=1,y=0 and x=1,y=1 are sent
+ /// Array of indexes in the grid of patches
+ /// for this simulator.
+ /// If creating a packet for multiple patches, there will be entries in
+ /// both the X and Y arrays for each of the patches.
+ /// For example if patches 1 and 17 are to be sent,
+ /// x[] = {1,1} and y[] = {0,1} which specifies the patches at
+ /// indexes <1,0> and <1,1> (presuming the terrain size is 16x16 patches).
///
///
- /// Array of indexes in the 16x16 grid of patches
- /// for this simulator. For example if 1 and 17 are specified, patches
- /// x=1,y=0 and x=1,y=1 are sent
+ /// Array of indexes in the grid of patches.
///
///
///
@@ -228,6 +222,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
header.PatchIDs += (patchX << 5);
}
+ // m_log.DebugFormat("{0} CreatePatchFromHeightmap. patchX={1}, patchY={2}, DCOffset={3}, range={4}",
+ // LogHeader, patchX, patchY, header.DCOffset, header.Range);
+
// NOTE: No idea what prequant and postquant should be or what they do
int wbits;
int[] patch = CompressPatch(terrData, patchX, patchY, header, 10, out wbits);
@@ -266,7 +263,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
for (int i = patchX*16; i < (patchX + 1)*16; i++)
{
// short val = heightmap[j*pRegionSizeX + i];
- float val = terrData[j, i];
+ float val = terrData[i, j];
if (val > zmax) zmax = val;
if (val < zmin) zmin = val;
}
@@ -838,7 +835,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
for (int i = patchX * Constants.TerrainPatchSize; i < iPatchLimit; i++)
{
// block[k++] = (heightmap[j*pRegionSizeX + i])*premult - sub;
- block[k++] = terrData[j, i] - sub;
+ block[k++] = terrData[i, j] * premult - sub;
}
}
--
cgit v1.1