aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ClientStack/Linden
diff options
context:
space:
mode:
authorUbitUmarov2019-01-20 20:58:27 +0000
committerUbitUmarov2019-01-20 20:58:27 +0000
commit0c38d52538a5d713e034fcec8da8df434e3ca924 (patch)
treeb54bb1749bae275e77bbfcaafb98833fd436748b /OpenSim/Region/ClientStack/Linden
parentcosmetics (diff)
downloadopensim-SC-0c38d52538a5d713e034fcec8da8df434e3ca924.zip
opensim-SC-0c38d52538a5d713e034fcec8da8df434e3ca924.tar.gz
opensim-SC-0c38d52538a5d713e034fcec8da8df434e3ca924.tar.bz2
opensim-SC-0c38d52538a5d713e034fcec8da8df434e3ca924.tar.xz
cosmetics on terrain patchs
Diffstat (limited to 'OpenSim/Region/ClientStack/Linden')
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs138
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs16
2 files changed, 50 insertions, 104 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index b61bdeb..d197f5c 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -1185,13 +1185,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1185 /// region's patches to the client. 1185 /// region's patches to the client.
1186 /// </summary> 1186 /// </summary>
1187 /// <param name="map">heightmap</param> 1187 /// <param name="map">heightmap</param>
1188 public virtual void SendLayerData(float[] map) 1188 public virtual void SendLayerData()
1189 { 1189 {
1190 Util.FireAndForget(DoSendLayerData, m_scene.Heightmap.GetTerrainData(), "LLClientView.DoSendLayerData"); 1190 Util.FireAndForget(DoSendLayerData, null, "LLClientView.DoSendLayerData");
1191
1192 // Send it sync, and async. It's not that much data
1193 // and it improves user experience just so much!
1194// DoSendLayerData(map);
1195 } 1191 }
1196 1192
1197 /// <summary> 1193 /// <summary>
@@ -1200,21 +1196,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1200 /// <param name="o"></param> 1196 /// <param name="o"></param>
1201 private void DoSendLayerData(object o) 1197 private void DoSendLayerData(object o)
1202 { 1198 {
1203 TerrainData map = (TerrainData)o; 1199 TerrainData map = m_scene.Heightmap.GetTerrainData();
1204
1205 try 1200 try
1206 { 1201 {
1207 // Send LayerData in typerwriter pattern
1208 //for (int y = 0; y < 16; y++)
1209 //{
1210 // for (int x = 0; x < 16; x++)
1211 // {
1212 // SendLayerData(x, y, map);
1213 // }
1214 //}
1215
1216 // Send LayerData in a spiral pattern. Fun! 1202 // Send LayerData in a spiral pattern. Fun!
1217 SendLayerTopRight(map, 0, 0, map.SizeX / Constants.TerrainPatchSize - 1, map.SizeY / Constants.TerrainPatchSize - 1); 1203 SendLayerTopRight(0, 0, map.SizeX / Constants.TerrainPatchSize - 1, map.SizeY / Constants.TerrainPatchSize - 1);
1218 } 1204 }
1219 catch (Exception e) 1205 catch (Exception e)
1220 { 1206 {
@@ -1222,63 +1208,68 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1222 } 1208 }
1223 } 1209 }
1224 1210
1225 private void SendLayerTopRight(TerrainData map, int x1, int y1, int x2, int y2) 1211 private void SendLayerTopRight(int x1, int y1, int x2, int y2)
1226 { 1212 {
1213 int[] p = new int[2];
1214
1227 // Row 1215 // Row
1228 for (int i = x1; i <= x2; i++) 1216 p[1] = y1;
1229 SendLayerData(i, y1, map); 1217 for (int i = x1; i <= x2; ++i)
1218 {
1219 p[0] = i;
1220 SendLayerData(p);
1221 }
1230 1222
1231 // Column 1223 // Column
1232 for (int j = y1 + 1; j <= y2; j++) 1224 p[0] = x2;
1233 SendLayerData(x2, j, map); 1225 for (int j = y1 + 1; j <= y2; ++j)
1226 {
1227 p[1] = j;
1228 SendLayerData(p);
1229 }
1234 1230
1235 if (x2 - x1 > 0 && y2 - y1 > 0) 1231 if (x2 - x1 > 0 && y2 - y1 > 0)
1236 SendLayerBottomLeft(map, x1, y1 + 1, x2 - 1, y2); 1232 SendLayerBottomLeft(x1, y1 + 1, x2 - 1, y2);
1237 } 1233 }
1238 1234
1239 void SendLayerBottomLeft(TerrainData map, int x1, int y1, int x2, int y2) 1235 void SendLayerBottomLeft(int x1, int y1, int x2, int y2)
1240 { 1236 {
1237 int[] p = new int[2];
1238
1241 // Row in reverse 1239 // Row in reverse
1242 for (int i = x2; i >= x1; i--) 1240 p[1] = y2;
1243 SendLayerData(i, y2, map); 1241 for (int i = x2; i >= x1; --i)
1242 {
1243 p[0] = i;
1244 SendLayerData(p);
1245 }
1244 1246
1245 // Column in reverse 1247 // Column in reverse
1246 for (int j = y2 - 1; j >= y1; j--) 1248 p[0] = x1;
1247 SendLayerData(x1, j, map); 1249 for (int j = y2 - 1; j >= y1; --j)
1250 {
1251 p[1] = j;
1252 SendLayerData(p);
1253 }
1248 1254
1249 if (x2 - x1 > 0 && y2 - y1 > 0) 1255 if (x2 - x1 > 0 && y2 - y1 > 0)
1250 SendLayerTopRight(map, x1 + 1, y1, x2, y2 - 1); 1256 SendLayerTopRight(x1 + 1, y1, x2, y2 - 1);
1251 } 1257 }
1252 1258
1253 1259 public void SendLayerData(int[] map)
1254 // Legacy form of invocation that passes around a bare data array.
1255 // Just ignore what was passed and use the real terrain info that is part of the scene.
1256 // As a HORRIBLE kludge in an attempt to not change the definition of IClientAPI,
1257 // there is a special form for specifying multiple terrain patches to send.
1258 // The form is to pass 'px' as negative the number of patches to send and to
1259 // pass the float array as pairs of patch X and Y coordinates. So, passing 'px'
1260 // as -2 and map= [3, 5, 8, 4] would mean to send two terrain heightmap patches
1261 // and the patches to send are <3,5> and <8,4>.
1262 public void SendLayerData(int px, int py, float[] map)
1263 { 1260 {
1264 if (px >= 0) 1261 if(map == null)
1262 return;
1263
1264 try
1265 { 1265 {
1266 SendLayerData(px, py, m_scene.Heightmap.GetTerrainData()); 1266 List<LayerDataPacket> packets = OpenSimTerrainCompressor.CreateLayerDataPackets(m_scene.Heightmap.GetTerrainData(), map);
1267 foreach (LayerDataPacket pkt in packets)
1268 OutPacket(pkt, ThrottleOutPacketType.Land);
1267 } 1269 }
1268 else 1270 catch (Exception e)
1269 { 1271 {
1270 int numPatches = -px; 1272 m_log.Error("[CLIENT]: SendLayerData() Failed with exception: " + e.Message, e);
1271 int[] xPatches = new int[numPatches];
1272 int[] yPatches = new int[numPatches];
1273 for (int pp = 0; pp < numPatches; pp++)
1274 {
1275 xPatches[pp] = (int)map[pp * 2];
1276 yPatches[pp] = (int)map[pp * 2 + 1];
1277 }
1278
1279 // DebugSendingPatches("SendLayerData", xPatches, yPatches);
1280
1281 SendLayerData(xPatches, yPatches, m_scene.Heightmap.GetTerrainData());
1282 } 1273 }
1283 } 1274 }
1284 1275
@@ -1298,43 +1289,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1298 } 1289 }
1299 } 1290 }
1300 1291
1301 /// <summary>
1302
1303 /// Sends a terrain packet for the point specified.
1304 /// This is a legacy call that has refarbed the terrain into a flat map of floats.
1305 /// We just use the terrain from the region we know about.
1306 /// </summary>
1307 /// <param name="px">Patch coordinate (x) 0..15</param>
1308 /// <param name="py">Patch coordinate (y) 0..15</param>
1309 /// <param name="map">heightmap</param>
1310 public void SendLayerData(int px, int py, TerrainData terrData)
1311 {
1312 int[] xPatches = new[] { px };
1313 int[] yPatches = new[] { py };
1314 SendLayerData(xPatches, yPatches, terrData);
1315 }
1316
1317 private void SendLayerData(int[] px, int[] py, TerrainData terrData)
1318 {
1319 try
1320 {
1321 byte landPacketType;
1322 if (terrData.SizeX > Constants.RegionSize || terrData.SizeY > Constants.RegionSize)
1323 landPacketType = (byte)TerrainPatch.LayerType.LandExtended;
1324 else
1325 landPacketType = (byte)TerrainPatch.LayerType.Land;
1326
1327 List<LayerDataPacket> packets = OpenSimTerrainCompressor.CreateLayerDataPackets(terrData, px, py, landPacketType);
1328 foreach(LayerDataPacket pkt in packets)
1329 OutPacket(pkt, ThrottleOutPacketType.Land);
1330 }
1331 catch (Exception e)
1332 {
1333 m_log.Error("[CLIENT]: SendLayerData() Failed with exception: " + e.Message, e);
1334 }
1335 }
1336
1337
1338 // wind caching 1292 // wind caching
1339 private static Dictionary<ulong,int> lastWindVersion = new Dictionary<ulong,int>(); 1293 private static Dictionary<ulong,int> lastWindVersion = new Dictionary<ulong,int>();
1340 private static Dictionary<ulong,List<LayerDataPacket>> lastWindPackets = 1294 private static Dictionary<ulong,List<LayerDataPacket>> lastWindPackets =
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
index 5f35782..35d29a5 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
@@ -866,21 +866,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
866 m_log.Error("[LLUDPSERVER]: Failed to split " + packet.Type + " with estimated length " + packet.Length); 866 m_log.Error("[LLUDPSERVER]: Failed to split " + packet.Type + " with estimated length " + packet.Length);
867 867
868 for (int i = 0; i < packetCount; i++) 868 for (int i = 0; i < packetCount; i++)
869 { 869 SendPacketData(udpClient, datas[i], packet.Type, category, method);
870 byte[] data = datas[i];
871// if (!SendPacketData(udpClient, data, packet.Type, category, method))
872// packetQueued = true;
873 SendPacketData(udpClient, data, packet.Type, category, method);
874 }
875 } 870 }
876 else 871 else
877 { 872 {
878 byte[] data = packet.ToBytes(); 873 byte[] data = packet.ToBytes();
879// if (!SendPacketData(udpClient, data, packet.Type, category, method))
880// packetQueued = true;
881 SendPacketData(udpClient, data, packet.Type, category, method); 874 SendPacketData(udpClient, data, packet.Type, category, method);
882 } 875 }
883
884 PacketPool.Instance.ReturnPacket(packet); 876 PacketPool.Instance.ReturnPacket(packet);
885 } 877 }
886 878
@@ -908,7 +900,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
908 if (zerocount != 0) 900 if (zerocount != 0)
909 { 901 {
910 dest[zerolen++] = 0x00; 902 dest[zerolen++] = 0x00;
911 dest[zerolen++] = (byte)zerocount; 903 dest[zerolen++] = zerocount;
912 zerocount = 0; 904 zerocount = 0;
913 } 905 }
914 906
@@ -919,10 +911,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
919 if (zerocount != 0) 911 if (zerocount != 0)
920 { 912 {
921 dest[zerolen++] = 0x00; 913 dest[zerolen++] = 0x00;
922 dest[zerolen++] = (byte)zerocount; 914 dest[zerolen++] = zerocount;
923 } 915 }
924 916
925 return (int)zerolen; 917 return zerolen;
926 } 918 }
927 /// <summary> 919 /// <summary>
928 /// Start the process of sending a packet to the client. 920 /// Start the process of sending a packet to the client.