we still don't have extended wind and cloud neither do viewers

avinationmerge
UbitUmarov 2015-09-24 20:55:39 +01:00
parent a6b8eb7bca
commit 13b8b17b9a
2 changed files with 36 additions and 49 deletions

View File

@ -1406,12 +1406,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
patches[1].Data[x] = windSpeeds[x].Y; patches[1].Data[x] = windSpeeds[x].Y;
} }
// neither we or viewers have extended wind
byte layerType = (byte)TerrainPatch.LayerType.Wind; byte layerType = (byte)TerrainPatch.LayerType.Wind;
if (m_scene.RegionInfo.RegionSizeX > Constants.RegionSize || m_scene.RegionInfo.RegionSizeY > Constants.RegionSize)
layerType = (byte)TerrainPatch.LayerType.WindExtended;
LayerDataPacket layerpack = OpenSimTerrainCompressor.CreateLayerDataPacket(patches, layerType, LayerDataPacket layerpack = OpenSimTerrainCompressor.CreateLayerDataPacketStandardSize(patches, layerType);
(int)m_scene.RegionInfo.RegionSizeX, (int)m_scene.RegionInfo.RegionSizeY);
layerpack.Header.Zerocoded = true; layerpack.Header.Zerocoded = true;
OutPacket(layerpack, ThrottleOutPacketType.Wind); OutPacket(layerpack, ThrottleOutPacketType.Wind);
} }
@ -1434,13 +1432,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
patches[0].Data[y * 16 + x] = cloudCover[y * 16 + x]; patches[0].Data[y * 16 + x] = cloudCover[y * 16 + x];
} }
} }
// neither we or viewers have extended clouds
byte layerType = (byte)TerrainPatch.LayerType.Cloud; byte layerType = (byte)TerrainPatch.LayerType.Cloud;
if (m_scene.RegionInfo.RegionSizeX > Constants.RegionSize || m_scene.RegionInfo.RegionSizeY > Constants.RegionSize)
layerType = (byte)TerrainPatch.LayerType.CloudExtended;
LayerDataPacket layerpack = OpenSimTerrainCompressor.CreateLayerDataPacket(patches, layerType, LayerDataPacket layerpack = OpenSimTerrainCompressor.CreateLayerDataPacketStandardSize(patches, layerType);
(int)m_scene.RegionInfo.RegionSizeX, (int)m_scene.RegionInfo.RegionSizeY);
layerpack.Header.Zerocoded = true; layerpack.Header.Zerocoded = true;
OutPacket(layerpack, ThrottleOutPacketType.Cloud); OutPacket(layerpack, ThrottleOutPacketType.Cloud);
} }

View File

@ -82,8 +82,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
} }
// Used to send cloud and wind patches // Used to send cloud and wind patches
public static LayerDataPacket CreateLayerDataPacket(TerrainPatch[] patches, byte type, int pRegionSizeX, public static LayerDataPacket CreateLayerDataPacketStandardSize(TerrainPatch[] patches, byte type)
int pRegionSizeY)
{ {
LayerDataPacket layer = new LayerDataPacket {LayerID = {Type = type}}; LayerDataPacket layer = new LayerDataPacket {LayerID = {Type = type}};
@ -98,7 +97,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
bitpack.PackBits(type, 8); bitpack.PackBits(type, 8);
foreach (TerrainPatch t in patches) foreach (TerrainPatch t in patches)
CreatePatch(bitpack, t.Data, t.X, t.Y, pRegionSizeX, pRegionSizeY); CreatePatchtStandardSize(bitpack, t.Data, t.X, t.Y);
bitpack.PackBits(END_OF_PATCHES, 8); bitpack.PackBits(END_OF_PATCHES, 8);
@ -108,27 +107,38 @@ namespace OpenSim.Region.ClientStack.LindenUDP
return layer; return layer;
} }
public static void CreatePatch(BitPack output, float[] patchData, int x, int y, int pRegionSizeX, int pRegionSizeY) public static void CreatePatchtStandardSize(BitPack output, float[] patchData, int x, int y)
{ {
TerrainPatch.Header header = PrescanPatch(patchData); TerrainPatch.Header header = PrescanPatch(patchData);
header.QuantWBits = 136; header.QuantWBits = 136;
if (pRegionSizeX > Constants.RegionSize || pRegionSizeY > Constants.RegionSize)
{
header.PatchIDs = (y & 0xFFFF);
header.PatchIDs += (x << 16);
}
else
{
header.PatchIDs = (y & 0x1F); header.PatchIDs = (y & 0x1F);
header.PatchIDs += (x << 5); header.PatchIDs += (x << 5);
}
int wbits; int wbits;
int[] patch = CompressPatch(patchData, header, 10, out wbits); int[] patch = CompressPatch(patchData, header, 10, out wbits);
wbits = EncodePatchHeader(output, header, patch, Constants.RegionSize, Constants.RegionSize, wbits); EncodePatchHeader(output, header, patch, false, ref wbits);
EncodePatch(output, patch, 0, wbits); EncodePatch(output, patch, 0, wbits);
} }
private static TerrainPatch.Header PrescanPatch(float[] patch)
{
TerrainPatch.Header header = new TerrainPatch.Header();
float zmax = -99999999.0f;
float zmin = 99999999.0f;
for (int i = 0; i < Constants.TerrainPatchSize * Constants.TerrainPatchSize; i++)
{
float val = patch[i];
if (val > zmax) zmax = val;
if (val < zmin) zmin = val;
}
header.DCOffset = zmin;
header.Range = (int)((zmax - zmin) + 1.0f);
return header;
}
private static int[] CompressPatch(float[] patchData, TerrainPatch.Header header, int prequant, out int wbits) private static int[] CompressPatch(float[] patchData, TerrainPatch.Header header, int prequant, out int wbits)
{ {
float[] block = new float[Constants.TerrainPatchSize * Constants.TerrainPatchSize]; float[] block = new float[Constants.TerrainPatchSize * Constants.TerrainPatchSize];
@ -232,11 +242,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
TerrainPatch.Header header = PrescanPatch(terrData, patchX, patchY, out frange); TerrainPatch.Header header = PrescanPatch(terrData, patchX, patchY, out frange);
header.QuantWBits = 130; header.QuantWBits = 130;
bool largeRegion = false;
// If larger than legacy region size, pack patch X and Y info differently. // If larger than legacy region size, pack patch X and Y info differently.
if (terrData.SizeX > Constants.RegionSize || terrData.SizeY > Constants.RegionSize) if (terrData.SizeX > Constants.RegionSize || terrData.SizeY > Constants.RegionSize)
{ {
header.PatchIDs = (patchY & 0xFFFF); header.PatchIDs = (patchY & 0xFFFF);
header.PatchIDs += (patchX << 16); header.PatchIDs += (patchX << 16);
largeRegion = true;
} }
else else
{ {
@ -246,7 +258,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
if(Math.Round((double)frange,2) == 1.0) if(Math.Round((double)frange,2) == 1.0)
{ {
// flat terrain spead up things // flat terrain speed up things
header.DCOffset -= 0.5f; header.DCOffset -= 0.5f;
@ -254,7 +266,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
output.PackBits(header.QuantWBits, 8); output.PackBits(header.QuantWBits, 8);
output.PackFloat(header.DCOffset); output.PackFloat(header.DCOffset);
output.PackBits(1, 16); output.PackBits(1, 16);
if (terrData.SizeX > Constants.RegionSize || terrData.SizeY > Constants.RegionSize) if (largeRegion)
output.PackBits(header.PatchIDs, 32); output.PackBits(header.PatchIDs, 32);
else else
output.PackBits(header.PatchIDs, 10); output.PackBits(header.PatchIDs, 10);
@ -266,28 +278,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
int wbits; int wbits;
int[] patch = CompressPatch(terrData, patchX, patchY, header, 10, out wbits); int[] patch = CompressPatch(terrData, patchX, patchY, header, 10, out wbits);
wbits = EncodePatchHeader(output, header, patch, (uint)terrData.SizeX, (uint)terrData.SizeY, wbits); EncodePatchHeader(output, header, patch, largeRegion, ref wbits);
EncodePatch(output, patch, 0, wbits); EncodePatch(output, patch, 0, wbits);
} }
private static TerrainPatch.Header PrescanPatch(float[] patch)
{
TerrainPatch.Header header = new TerrainPatch.Header();
float zmax = -99999999.0f;
float zmin = 99999999.0f;
for (int i = 0; i < Constants.TerrainPatchSize*Constants.TerrainPatchSize; i++)
{
float val = patch[i];
if (val > zmax) zmax = val;
if (val < zmin) zmin = val;
}
header.DCOffset = zmin;
header.Range = (int) ((zmax - zmin) + 1.0f);
return header;
}
// Scan the height info we're returning and return a patch packet header for this patch. // Scan the height info we're returning and return a patch packet header for this patch.
private static TerrainPatch.Header PrescanPatch(TerrainData terrData, int patchX, int patchY, out float frange) private static TerrainPatch.Header PrescanPatch(TerrainData terrData, int patchX, int patchY, out float frange)
@ -338,8 +333,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
return header; return header;
} }
private static int EncodePatchHeader(BitPack output, TerrainPatch.Header header, int[] patch, uint pRegionSizeX, private static void EncodePatchHeader(BitPack output, TerrainPatch.Header header, int[] patch, bool largeRegion, ref int wbits)
uint pRegionSizeY, int wbits)
{ {
if (wbits > 17) if (wbits > 17)
wbits = 17; wbits = 17;
@ -352,12 +346,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
output.PackBits(header.QuantWBits, 8); output.PackBits(header.QuantWBits, 8);
output.PackFloat(header.DCOffset); output.PackFloat(header.DCOffset);
output.PackBits(header.Range, 16); output.PackBits(header.Range, 16);
if (pRegionSizeX > Constants.RegionSize || pRegionSizeY > Constants.RegionSize) if (largeRegion)
output.PackBits(header.PatchIDs, 32); output.PackBits(header.PatchIDs, 32);
else else
output.PackBits(header.PatchIDs, 10); output.PackBits(header.PatchIDs, 10);
return wbits;
} }
private static void IDCTColumn16(float[] linein, float[] lineout, int column) private static void IDCTColumn16(float[] linein, float[] lineout, int column)