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.
---
.../Region/Framework/Scenes/TerrainCompressor.cs | 35 ++++++++++------------
1 file changed, 16 insertions(+), 19 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes/TerrainCompressor.cs')
diff --git a/OpenSim/Region/Framework/Scenes/TerrainCompressor.cs b/OpenSim/Region/Framework/Scenes/TerrainCompressor.cs
index e91c959..e4513ad 100644
--- a/OpenSim/Region/Framework/Scenes/TerrainCompressor.cs
+++ b/OpenSim/Region/Framework/Scenes/TerrainCompressor.cs
@@ -108,11 +108,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
return layer;
}
- // Legacy land packet generation gluing old land representation (heights) to compressed representation.
- // This is an intermediate step in converting terrain into a variable sized heightmap. Some of the
- // routines (like IClientAPI) only pass the float array of heights around. This entry
- // converts that legacy representation into the more compact represenation used in
- // TerrainData. Someday fix the plumbing between here and the scene.
+ // Create a land packet for a single patch.
public static LayerDataPacket CreateLandPacket(TerrainData terrData, int patchX, int patchY)
{
int[] xPieces = new int[1];
@@ -120,9 +116,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
xPieces[0] = patchX; // patch X dimension
yPieces[0] = patchY;
- m_log.DebugFormat("{0} CreateLandPacket. patchX={1}, patchY={2}, sizeX={3}, sizeY={4}",
- LogHeader, patchX, patchY, terrData.SizeX, terrData.SizeY);
-
return CreateLandPacket(terrData, xPieces, yPieces, (int)TerrainPatch.LayerType.Land);
}
@@ -130,19 +123,20 @@ namespace OpenSim.Region.ClientStack.LindenUDP
/// Creates a LayerData packet for compressed land data given a full
/// simulator heightmap and an array of indices of patches to compress
///
- ///
- /// 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