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