aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs99
1 files changed, 71 insertions, 28 deletions
diff --git a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs
index 024c29b..dfafcad 100644
--- a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs
+++ b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs
@@ -1031,47 +1031,90 @@ namespace OpenSim.Region.CoreModules.World.Terrain
1031 { 1031 {
1032 List<PatchesToSend> ret = new List<PatchesToSend>(); 1032 List<PatchesToSend> ret = new List<PatchesToSend>();
1033 1033
1034 int npatchs = 0;
1035
1034 ScenePresence presence = pups.Presence; 1036 ScenePresence presence = pups.Presence;
1035 if (presence == null) 1037 if (presence == null)
1036 return ret; 1038 return ret;
1037 1039
1040 float minz = presence.AbsolutePosition.Z;
1041 if (presence.CameraPosition.Z < minz)
1042 minz = presence.CameraPosition.Z;
1043
1044 // this limit should be max terrainheight + max draw
1045 if (minz > 1500f)
1046 return ret;
1047
1048 int DrawDistance = (int)presence.DrawDistance;
1049
1050 DrawDistance = DrawDistance / Constants.TerrainPatchSize;
1051
1052 int testposX;
1053 int testposY;
1054
1055 if (Math.Abs(presence.AbsolutePosition.X - presence.CameraPosition.X) > 30
1056 || Math.Abs(presence.AbsolutePosition.Y - presence.CameraPosition.Y) > 30)
1057 {
1058 testposX = (int)presence.CameraPosition.X / Constants.TerrainPatchSize;
1059 testposY = (int)presence.CameraPosition.Y / Constants.TerrainPatchSize;
1060 }
1061 else
1062 {
1063 testposX = (int)presence.AbsolutePosition.X / Constants.TerrainPatchSize;
1064 testposY = (int)presence.AbsolutePosition.Y / Constants.TerrainPatchSize;
1065 }
1066 int limitX = (int)m_scene.RegionInfo.RegionSizeX / Constants.TerrainPatchSize;
1067 int limitY = (int)m_scene.RegionInfo.RegionSizeY / Constants.TerrainPatchSize;
1068
1038 // Compute the area of patches within our draw distance 1069 // Compute the area of patches within our draw distance
1039 int startX = (((int) (presence.AbsolutePosition.X - presence.DrawDistance))/Constants.TerrainPatchSize) - 2; 1070 int startX = testposX - DrawDistance;
1040 startX = Math.Max(startX, 0); 1071 if (startX < 0)
1041 startX = Math.Min(startX, (int)m_scene.RegionInfo.RegionSizeX/Constants.TerrainPatchSize); 1072 startX = 0;
1042 int startY = (((int) (presence.AbsolutePosition.Y - presence.DrawDistance))/Constants.TerrainPatchSize) - 2; 1073 else if (startX > limitX)
1043 startY = Math.Max(startY, 0); 1074 startX = limitX;
1044 startY = Math.Min(startY, (int)m_scene.RegionInfo.RegionSizeY/Constants.TerrainPatchSize); 1075
1045 int endX = (((int) (presence.AbsolutePosition.X + presence.DrawDistance))/Constants.TerrainPatchSize) + 2; 1076 int startY = testposY - DrawDistance;
1046 endX = Math.Max(endX, 0); 1077 if (startY < 0)
1047 endX = Math.Min(endX, (int)m_scene.RegionInfo.RegionSizeX/Constants.TerrainPatchSize); 1078 startY = 0;
1048 int endY = (((int) (presence.AbsolutePosition.Y + presence.DrawDistance))/Constants.TerrainPatchSize) + 2; 1079 else if (startY > limitY)
1049 endY = Math.Max(endY, 0); 1080 startY = limitY;
1050 endY = Math.Min(endY, (int)m_scene.RegionInfo.RegionSizeY/Constants.TerrainPatchSize); 1081
1051 // m_log.DebugFormat("{0} GetModifiedPatchesInViewDistance. rName={1}, ddist={2}, apos={3}, start=<{4},{5}>, end=<{6},{7}>", 1082 int endX = testposX + DrawDistance;
1052 // LogHeader, m_scene.RegionInfo.RegionName, 1083 if (endX < 0)
1053 // presence.DrawDistance, presence.AbsolutePosition, 1084 endX = 0;
1054 // startX, startY, endX, endY); 1085 else if (endX > limitX)
1086 endX = limitX;
1087
1088 int endY = testposY + DrawDistance;
1089 if (endY < 0)
1090 endY = 0;
1091 else if (endY > limitY)
1092 endY = limitY;
1093
1094 int distx;
1095 int disty;
1096 int distsq;
1097
1098 DrawDistance *= DrawDistance;
1099
1055 for (int x = startX; x < endX; x++) 1100 for (int x = startX; x < endX; x++)
1056 { 1101 {
1057 for (int y = startY; y < endY; y++) 1102 for (int y = startY; y < endY; y++)
1058 { 1103 {
1059 //Need to make sure we don't send the same ones over and over
1060 Vector3 presencePos = presence.AbsolutePosition;
1061 Vector3 patchPos = new Vector3(x * Constants.TerrainPatchSize, y * Constants.TerrainPatchSize, presencePos.Z);
1062 if (pups.GetByPatch(x, y)) 1104 if (pups.GetByPatch(x, y))
1063 { 1105 {
1064 //Check which has less distance, camera or avatar position, both have to be done. 1106 distx = x - testposX;
1065 //Its not a radius, its a diameter and we add 50 so that it doesn't look like it cuts off 1107 disty = y - testposY;
1066 if (Util.DistanceLessThan(presencePos, patchPos, presence.DrawDistance + 50) 1108 distsq = distx * distx + disty * disty;
1067 || Util.DistanceLessThan(presence.CameraPosition, patchPos, presence.DrawDistance + 50)) 1109 if (distsq < DrawDistance)
1068 { 1110 {
1069 //They can see it, send it to them
1070 pups.SetByPatch(x, y, false); 1111 pups.SetByPatch(x, y, false);
1071 float dist = Vector3.DistanceSquared(presencePos, patchPos); 1112 ret.Add(new PatchesToSend(x, y, (float)distsq));
1072 ret.Add(new PatchesToSend(x, y, dist)); 1113 if (npatchs++ > 65536)
1073 //Wait and send them all at once 1114 {
1074 // pups.client.SendLayerData(x, y, null); 1115 y = endY;
1116 x = endX;
1117 }
1075 } 1118 }
1076 } 1119 }
1077 } 1120 }