diff options
Diffstat (limited to 'OpenSim/Region')
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs | 54 | ||||
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs | 4 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Scene.cs | 2 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 2 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 109 | ||||
-rw-r--r-- | OpenSim/Region/Physics/Manager/ZeroMesher.cs | 3 | ||||
-rw-r--r-- | OpenSim/Region/Physics/Meshing/Meshmerizer.cs | 2 |
7 files changed, 102 insertions, 74 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs index d2cd6d9..0948e1c 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs | |||
@@ -144,6 +144,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
144 | private readonly OutgoingPacket[] m_nextPackets = new OutgoingPacket[THROTTLE_CATEGORY_COUNT]; | 144 | private readonly OutgoingPacket[] m_nextPackets = new OutgoingPacket[THROTTLE_CATEGORY_COUNT]; |
145 | /// <summary>A reference to the LLUDPServer that is managing this client</summary> | 145 | /// <summary>A reference to the LLUDPServer that is managing this client</summary> |
146 | private readonly LLUDPServer m_udpServer; | 146 | private readonly LLUDPServer m_udpServer; |
147 | /// <summary>Locks access to the variables used while calculating round-trip | ||
148 | /// packet times and the retransmission timeout</summary> | ||
149 | private readonly object m_roundTripCalcLock = new object(); | ||
147 | 150 | ||
148 | /// <summary> | 151 | /// <summary> |
149 | /// Default constructor | 152 | /// Default constructor |
@@ -484,29 +487,52 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
484 | const float BETA = 0.25f; | 487 | const float BETA = 0.25f; |
485 | const float K = 4.0f; | 488 | const float K = 4.0f; |
486 | 489 | ||
487 | if (RTTVAR == 0.0f) | 490 | lock (m_roundTripCalcLock) |
488 | { | 491 | { |
489 | // First RTT measurement | 492 | if (RTTVAR == 0.0f) |
490 | SRTT = r; | 493 | { |
491 | RTTVAR = r * 0.5f; | 494 | // First RTT measurement |
492 | } | 495 | SRTT = r; |
493 | else | 496 | RTTVAR = r * 0.5f; |
494 | { | 497 | } |
495 | // Subsequence RTT measurement | 498 | else |
496 | RTTVAR = (1.0f - BETA) * RTTVAR + BETA * Math.Abs(SRTT - r); | 499 | { |
497 | SRTT = (1.0f - ALPHA) * SRTT + ALPHA * r; | 500 | // Subsequence RTT measurement |
498 | } | 501 | RTTVAR = (1.0f - BETA) * RTTVAR + BETA * Math.Abs(SRTT - r); |
502 | SRTT = (1.0f - ALPHA) * SRTT + ALPHA * r; | ||
503 | } | ||
499 | 504 | ||
500 | RTO = (int)(SRTT + Math.Max(m_udpServer.TickCountResolution, K * RTTVAR)); | 505 | int rto = (int)(SRTT + Math.Max(m_udpServer.TickCountResolution, K * RTTVAR)); |
501 | 506 | ||
502 | // Clamp the retransmission timeout to manageable values | 507 | // Clamp the retransmission timeout to manageable values |
503 | RTO = Utils.Clamp(RTO, 3000, 60000); | 508 | rto = Utils.Clamp(RTO, 3000, 60000); |
509 | |||
510 | RTO = rto; | ||
511 | } | ||
504 | 512 | ||
505 | //m_log.Debug("[LLUDPCLIENT]: Setting agent " + this.Agent.FullName + "'s RTO to " + RTO + "ms with an RTTVAR of " + | 513 | //m_log.Debug("[LLUDPCLIENT]: Setting agent " + this.Agent.FullName + "'s RTO to " + RTO + "ms with an RTTVAR of " + |
506 | // RTTVAR + " based on new RTT of " + r + "ms"); | 514 | // RTTVAR + " based on new RTT of " + r + "ms"); |
507 | } | 515 | } |
508 | 516 | ||
509 | /// <summary> | 517 | /// <summary> |
518 | /// Exponential backoff of the retransmission timeout, per section 5.5 | ||
519 | /// of RFC 2988 | ||
520 | /// </summary> | ||
521 | public void BackoffRTO() | ||
522 | { | ||
523 | lock (m_roundTripCalcLock) | ||
524 | { | ||
525 | // Reset SRTT and RTTVAR, we assume they are bogus since things | ||
526 | // didn't work out and we're backing off the timeout | ||
527 | SRTT = 0.0f; | ||
528 | RTTVAR = 0.0f; | ||
529 | |||
530 | // Double the retransmission timeout | ||
531 | RTO = Math.Min(RTO * 2, 60000); | ||
532 | } | ||
533 | } | ||
534 | |||
535 | /// <summary> | ||
510 | /// Does an early check to see if this queue empty callback is already | 536 | /// Does an early check to see if this queue empty callback is already |
511 | /// running, then asynchronously firing the event | 537 | /// running, then asynchronously firing the event |
512 | /// </summary> | 538 | /// </summary> |
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs index 1dd58bf..82ae640 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs | |||
@@ -431,8 +431,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
431 | { | 431 | { |
432 | m_log.Debug("[LLUDPSERVER]: Resending " + expiredPackets.Count + " packets to " + udpClient.AgentID + ", RTO=" + udpClient.RTO); | 432 | m_log.Debug("[LLUDPSERVER]: Resending " + expiredPackets.Count + " packets to " + udpClient.AgentID + ", RTO=" + udpClient.RTO); |
433 | 433 | ||
434 | // Backoff the RTO | 434 | // Exponential backoff of the retransmission timeout |
435 | udpClient.RTO = Math.Min(udpClient.RTO * 2, 60000); | 435 | udpClient.BackoffRTO(); |
436 | 436 | ||
437 | // Resend packets | 437 | // Resend packets |
438 | for (int i = 0; i < expiredPackets.Count; i++) | 438 | for (int i = 0; i < expiredPackets.Count; i++) |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 47b13bd..f052c65 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -4246,7 +4246,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
4246 | 4246 | ||
4247 | public void ForEachClient(Action<IClientAPI> action) | 4247 | public void ForEachClient(Action<IClientAPI> action) |
4248 | { | 4248 | { |
4249 | ClientManager.ForEach(action); | 4249 | ClientManager.ForEachSync(action); |
4250 | } | 4250 | } |
4251 | 4251 | ||
4252 | public void ForEachSOG(Action<SceneObjectGroup> action) | 4252 | public void ForEachSOG(Action<SceneObjectGroup> action) |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index dd8da20..34ada4c 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -1334,7 +1334,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1334 | (parcel.LandData.GroupID != GroupID || | 1334 | (parcel.LandData.GroupID != GroupID || |
1335 | parcel.LandData.GroupID == UUID.Zero)) | 1335 | parcel.LandData.GroupID == UUID.Zero)) |
1336 | { | 1336 | { |
1337 | if ((DateTime.Now - RootPart.Rezzed).TotalMinutes > | 1337 | if ((DateTime.UtcNow - RootPart.Rezzed).TotalMinutes > |
1338 | parcel.LandData.OtherCleanTime) | 1338 | parcel.LandData.OtherCleanTime) |
1339 | { | 1339 | { |
1340 | DetachFromBackup(); | 1340 | DetachFromBackup(); |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 7193002..d84c35c 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -102,16 +102,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
102 | 102 | ||
103 | #region Fields | 103 | #region Fields |
104 | 104 | ||
105 | public bool AllowedDrop = false; | 105 | public bool AllowedDrop; |
106 | 106 | ||
107 | [XmlIgnore] | 107 | [XmlIgnore] |
108 | public bool DIE_AT_EDGE = false; | 108 | public bool DIE_AT_EDGE; |
109 | 109 | ||
110 | // TODO: This needs to be persisted in next XML version update! | 110 | // TODO: This needs to be persisted in next XML version update! |
111 | [XmlIgnore] | 111 | [XmlIgnore] |
112 | public int[] PayPrice = {-2,-2,-2,-2,-2}; | 112 | public readonly int[] PayPrice = {-2,-2,-2,-2,-2}; |
113 | [XmlIgnore] | 113 | [XmlIgnore] |
114 | public PhysicsActor PhysActor = null; | 114 | public PhysicsActor PhysActor; |
115 | 115 | ||
116 | //Xantor 20080528 Sound stuff: | 116 | //Xantor 20080528 Sound stuff: |
117 | // Note: This isn't persisted in the database right now, as the fields for that aren't just there yet. | 117 | // Note: This isn't persisted in the database right now, as the fields for that aren't just there yet. |
@@ -130,55 +130,56 @@ namespace OpenSim.Region.Framework.Scenes | |||
130 | public double SoundRadius; | 130 | public double SoundRadius; |
131 | 131 | ||
132 | [XmlIgnore] | 132 | [XmlIgnore] |
133 | public uint TimeStampFull = 0; | 133 | public uint TimeStampFull; |
134 | 134 | ||
135 | [XmlIgnore] | 135 | [XmlIgnore] |
136 | public uint TimeStampLastActivity = 0; // Will be used for AutoReturn | 136 | public uint TimeStampLastActivity; // Will be used for AutoReturn |
137 | 137 | ||
138 | [XmlIgnore] | 138 | [XmlIgnore] |
139 | public uint TimeStampTerse = 0; | 139 | public uint TimeStampTerse; |
140 | 140 | ||
141 | [XmlIgnore] | 141 | [XmlIgnore] |
142 | public UUID FromItemID = UUID.Zero; | 142 | public UUID FromItemID; |
143 | 143 | ||
144 | /// <value> | 144 | /// <value> |
145 | /// The UUID of the user inventory item from which this object was rezzed if this is a root part. | 145 | /// The UUID of the user inventory item from which this object was rezzed if this is a root part. |
146 | /// If UUID.Zero then either this is not a root part or there is no connection with a user inventory item. | 146 | /// If UUID.Zero then either this is not a root part or there is no connection with a user inventory item. |
147 | /// </value> | 147 | /// </value> |
148 | private UUID m_fromUserInventoryItemID = UUID.Zero; | 148 | private UUID m_fromUserInventoryItemID; |
149 | 149 | ||
150 | [XmlIgnore] | 150 | [XmlIgnore] |
151 | public UUID FromUserInventoryItemID | 151 | public UUID FromUserInventoryItemID |
152 | { | 152 | { |
153 | get { return m_fromUserInventoryItemID; } | 153 | get { return m_fromUserInventoryItemID; } |
154 | } | 154 | } |
155 | 155 | ||
156 | [XmlIgnore] | 156 | [XmlIgnore] |
157 | public bool IsAttachment = false; | 157 | public bool IsAttachment; |
158 | 158 | ||
159 | [XmlIgnore] | 159 | [XmlIgnore] |
160 | public scriptEvents AggregateScriptEvents = 0; | 160 | public scriptEvents AggregateScriptEvents; |
161 | 161 | ||
162 | [XmlIgnore] | 162 | [XmlIgnore] |
163 | public UUID AttachedAvatar = UUID.Zero; | 163 | public UUID AttachedAvatar; |
164 | 164 | ||
165 | [XmlIgnore] | 165 | [XmlIgnore] |
166 | public Vector3 AttachedPos = Vector3.Zero; | 166 | public Vector3 AttachedPos; |
167 | 167 | ||
168 | [XmlIgnore] | 168 | [XmlIgnore] |
169 | public uint AttachmentPoint = (byte)0; | 169 | public uint AttachmentPoint; |
170 | 170 | ||
171 | [XmlIgnore] | 171 | [XmlIgnore] |
172 | public PhysicsVector RotationAxis = new PhysicsVector(1f,1f,1f); | 172 | public PhysicsVector RotationAxis = new PhysicsVector(1f, 1f, 1f); |
173 | 173 | ||
174 | [XmlIgnore] | 174 | [XmlIgnore] |
175 | public bool VolumeDetectActive = false; // XmlIgnore set to avoid problems with persistance until I come to care for this | 175 | public bool VolumeDetectActive; // XmlIgnore set to avoid problems with persistance until I come to care for this |
176 | // Certainly this must be a persistant setting finally | 176 | // Certainly this must be a persistant setting finally |
177 | 177 | ||
178 | [XmlIgnore] | 178 | [XmlIgnore] |
179 | public bool IsWaitingForFirstSpinUpdatePacket = false; | 179 | public bool IsWaitingForFirstSpinUpdatePacket; |
180 | |||
180 | [XmlIgnore] | 181 | [XmlIgnore] |
181 | public Quaternion SpinOldOrientation = new Quaternion(); | 182 | public Quaternion SpinOldOrientation = Quaternion.Identity; |
182 | 183 | ||
183 | /// <summary> | 184 | /// <summary> |
184 | /// This part's inventory | 185 | /// This part's inventory |
@@ -191,34 +192,32 @@ namespace OpenSim.Region.Framework.Scenes | |||
191 | protected SceneObjectPartInventory m_inventory; | 192 | protected SceneObjectPartInventory m_inventory; |
192 | 193 | ||
193 | [XmlIgnore] | 194 | [XmlIgnore] |
194 | public bool Undoing = false; | 195 | public bool Undoing; |
195 | 196 | ||
196 | [XmlIgnore] | 197 | [XmlIgnore] |
197 | private PrimFlags LocalFlags = 0; | 198 | private PrimFlags LocalFlags; |
198 | [XmlIgnore] | 199 | [XmlIgnore] |
199 | private float m_damage = -1.0f; | 200 | private float m_damage = -1.0f; |
200 | private byte[] m_TextureAnimation; | 201 | private byte[] m_TextureAnimation; |
201 | private byte m_clickAction = 0; | 202 | private byte m_clickAction; |
202 | private Color m_color = Color.Black; | 203 | private Color m_color = Color.Black; |
203 | private string m_description = String.Empty; | 204 | private string m_description = String.Empty; |
204 | private readonly List<uint> m_lastColliders = new List<uint>(); | 205 | private readonly List<uint> m_lastColliders = new List<uint>(); |
205 | // private PhysicsVector m_lastRotationalVelocity = PhysicsVector.Zero; | 206 | private int m_linkNum; |
206 | private int m_linkNum = 0; | ||
207 | [XmlIgnore] | 207 | [XmlIgnore] |
208 | private int m_scriptAccessPin = 0; | 208 | private int m_scriptAccessPin; |
209 | [XmlIgnore] | 209 | [XmlIgnore] |
210 | private readonly Dictionary<UUID, scriptEvents> m_scriptEvents = new Dictionary<UUID, scriptEvents>(); | 210 | private readonly Dictionary<UUID, scriptEvents> m_scriptEvents = new Dictionary<UUID, scriptEvents>(); |
211 | private string m_sitName = String.Empty; | 211 | private string m_sitName = String.Empty; |
212 | private Quaternion m_sitTargetOrientation = Quaternion.Identity; | 212 | private Quaternion m_sitTargetOrientation = Quaternion.Identity; |
213 | private Vector3 m_sitTargetPosition = Vector3.Zero; | 213 | private Vector3 m_sitTargetPosition; |
214 | private string m_sitAnimation = "SIT"; | 214 | private string m_sitAnimation = "SIT"; |
215 | private string m_text = String.Empty; | 215 | private string m_text = String.Empty; |
216 | private string m_touchName = String.Empty; | 216 | private string m_touchName = String.Empty; |
217 | private readonly UndoStack<UndoState> m_undo = new UndoStack<UndoState>(5); | 217 | private readonly UndoStack<UndoState> m_undo = new UndoStack<UndoState>(5); |
218 | private UUID _creatorID; | 218 | private UUID _creatorID; |
219 | 219 | ||
220 | 220 | private bool m_passTouches; | |
221 | private bool m_passTouches = false; | ||
222 | 221 | ||
223 | /// <summary> | 222 | /// <summary> |
224 | /// Only used internally to schedule client updates. | 223 | /// Only used internally to schedule client updates. |
@@ -236,28 +235,28 @@ namespace OpenSim.Region.Framework.Scenes | |||
236 | //unkown if this will be kept, added as a way of removing the group position from the group class | 235 | //unkown if this will be kept, added as a way of removing the group position from the group class |
237 | protected Vector3 m_groupPosition; | 236 | protected Vector3 m_groupPosition; |
238 | protected uint m_localId; | 237 | protected uint m_localId; |
239 | protected Material m_material = (Material)3; // Wood | 238 | protected Material m_material = OpenMetaverse.Material.Wood; |
240 | protected string m_name; | 239 | protected string m_name; |
241 | protected Vector3 m_offsetPosition; | 240 | protected Vector3 m_offsetPosition; |
242 | 241 | ||
243 | // FIXME, TODO, ERROR: 'ParentGroup' can't be in here, move it out. | 242 | // FIXME, TODO, ERROR: 'ParentGroup' can't be in here, move it out. |
244 | protected SceneObjectGroup m_parentGroup; | 243 | protected SceneObjectGroup m_parentGroup; |
245 | protected byte[] m_particleSystem = new byte[0]; | 244 | protected byte[] m_particleSystem = Utils.EmptyBytes; |
246 | protected ulong m_regionHandle; | 245 | protected ulong m_regionHandle; |
247 | protected Quaternion m_rotationOffset; | 246 | protected Quaternion m_rotationOffset; |
248 | protected PrimitiveBaseShape m_shape = null; | 247 | protected PrimitiveBaseShape m_shape; |
249 | protected UUID m_uuid; | 248 | protected UUID m_uuid; |
250 | protected Vector3 m_velocity; | 249 | protected Vector3 m_velocity; |
251 | 250 | ||
252 | // TODO: Those have to be changed into persistent properties at some later point, | 251 | // TODO: Those have to be changed into persistent properties at some later point, |
253 | // or sit-camera on vehicles will break on sim-crossing. | 252 | // or sit-camera on vehicles will break on sim-crossing. |
254 | private Vector3 m_cameraEyeOffset = new Vector3(0.0f, 0.0f, 0.0f); | 253 | private Vector3 m_cameraEyeOffset; |
255 | private Vector3 m_cameraAtOffset = new Vector3(0.0f, 0.0f, 0.0f); | 254 | private Vector3 m_cameraAtOffset; |
256 | private bool m_forceMouselook = false; | 255 | private bool m_forceMouselook; |
257 | 256 | ||
258 | // TODO: Collision sound should have default. | 257 | // TODO: Collision sound should have default. |
259 | private UUID m_collisionSound = UUID.Zero; | 258 | private UUID m_collisionSound; |
260 | private float m_collisionSoundVolume = 0.0f; | 259 | private float m_collisionSoundVolume; |
261 | 260 | ||
262 | #endregion Fields | 261 | #endregion Fields |
263 | 262 | ||
@@ -269,9 +268,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
269 | public SceneObjectPart() | 268 | public SceneObjectPart() |
270 | { | 269 | { |
271 | // It's not necessary to persist this | 270 | // It's not necessary to persist this |
272 | m_TextureAnimation = new byte[0]; | 271 | m_TextureAnimation = Utils.EmptyBytes; |
273 | m_particleSystem = new byte[0]; | 272 | m_particleSystem = Utils.EmptyBytes; |
274 | Rezzed = DateTime.Now; | 273 | Rezzed = DateTime.UtcNow; |
275 | 274 | ||
276 | m_inventory = new SceneObjectPartInventory(this); | 275 | m_inventory = new SceneObjectPartInventory(this); |
277 | } | 276 | } |
@@ -290,8 +289,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
290 | { | 289 | { |
291 | m_name = "Primitive"; | 290 | m_name = "Primitive"; |
292 | 291 | ||
293 | Rezzed = DateTime.Now; | 292 | Rezzed = DateTime.UtcNow; |
294 | _creationDate = (Int32) (DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; | 293 | _creationDate = (int)Utils.DateTimeToUnixTime(Rezzed); |
295 | _ownerID = ownerID; | 294 | _ownerID = ownerID; |
296 | _creatorID = _ownerID; | 295 | _creatorID = _ownerID; |
297 | _lastOwnerID = UUID.Zero; | 296 | _lastOwnerID = UUID.Zero; |
@@ -299,19 +298,19 @@ namespace OpenSim.Region.Framework.Scenes | |||
299 | Shape = shape; | 298 | Shape = shape; |
300 | // Todo: Add More Object Parameter from above! | 299 | // Todo: Add More Object Parameter from above! |
301 | _ownershipCost = 0; | 300 | _ownershipCost = 0; |
302 | _objectSaleType = (byte) 0; | 301 | _objectSaleType = 0; |
303 | _salePrice = 0; | 302 | _salePrice = 0; |
304 | _category = (uint) 0; | 303 | _category = 0; |
305 | _lastOwnerID = _creatorID; | 304 | _lastOwnerID = _creatorID; |
306 | // End Todo: /// | 305 | // End Todo: /// |
307 | GroupPosition = groupPosition; | 306 | GroupPosition = groupPosition; |
308 | OffsetPosition = offsetPosition; | 307 | OffsetPosition = offsetPosition; |
309 | RotationOffset = rotationOffset; | 308 | RotationOffset = rotationOffset; |
310 | Velocity = new Vector3(0, 0, 0); | 309 | Velocity = Vector3.Zero; |
311 | AngularVelocity = new Vector3(0, 0, 0); | 310 | AngularVelocity = Vector3.Zero; |
312 | Acceleration = new Vector3(0, 0, 0); | 311 | Acceleration = Vector3.Zero; |
313 | m_TextureAnimation = new byte[0]; | 312 | m_TextureAnimation = Utils.EmptyBytes; |
314 | m_particleSystem = new byte[0]; | 313 | m_particleSystem = Utils.EmptyBytes; |
315 | 314 | ||
316 | // Prims currently only contain a single folder (Contents). From looking at the Second Life protocol, | 315 | // Prims currently only contain a single folder (Contents). From looking at the Second Life protocol, |
317 | // this appears to have the same UUID (!) as the prim. If this isn't the case, one can't drag items from | 316 | // this appears to have the same UUID (!) as the prim. If this isn't the case, one can't drag items from |
@@ -3548,7 +3547,7 @@ if (m_shape != null) { | |||
3548 | // in SL. | 3547 | // in SL. |
3549 | // | 3548 | // |
3550 | if (ParentGroup.RootPart != this) | 3549 | if (ParentGroup.RootPart != this) |
3551 | ParentGroup.RootPart.Rezzed = DateTime.Now; | 3550 | ParentGroup.RootPart.Rezzed = DateTime.UtcNow; |
3552 | 3551 | ||
3553 | ParentGroup.HasGroupChanged = true; | 3552 | ParentGroup.HasGroupChanged = true; |
3554 | ScheduleFullUpdate(); | 3553 | ScheduleFullUpdate(); |
diff --git a/OpenSim/Region/Physics/Manager/ZeroMesher.cs b/OpenSim/Region/Physics/Manager/ZeroMesher.cs index f9d0f2a..81eeed2 100644 --- a/OpenSim/Region/Physics/Manager/ZeroMesher.cs +++ b/OpenSim/Region/Physics/Manager/ZeroMesher.cs | |||
@@ -67,6 +67,9 @@ namespace OpenSim.Region.Physics.Manager | |||
67 | 67 | ||
68 | public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, PhysicsVector size, float lod, bool isPhysical) | 68 | public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, PhysicsVector size, float lod, bool isPhysical) |
69 | { | 69 | { |
70 | // Remove the reference to the encoded JPEG2000 data so it can be GCed | ||
71 | primShape.SculptData = OpenMetaverse.Utils.EmptyBytes; | ||
72 | |||
70 | return null; | 73 | return null; |
71 | } | 74 | } |
72 | } | 75 | } |
diff --git a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs index f609e73..01093e2 100644 --- a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs +++ b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs | |||
@@ -281,7 +281,7 @@ namespace OpenSim.Region.Physics.Meshing | |||
281 | 281 | ||
282 | if (idata == null) | 282 | if (idata == null) |
283 | { | 283 | { |
284 | if (primShape.SculptData.Length == 0) | 284 | if (primShape.SculptData == null || primShape.SculptData.Length == 0) |
285 | return null; | 285 | return null; |
286 | 286 | ||
287 | try | 287 | try |