From 095b3e5756bb3160b30c9c5670ba008fa13d2e66 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Thu, 1 Sep 2011 01:22:28 +0100 Subject: Remove pointless cluttering SOP.ParentGroup != null checks. The only times when ParentGroup might be null is during regression tests (which might not be a valid thing) and when scene objects are being constructed from the database. At all other times it's not possible for a SOP not to have a SOG parent. --- OpenSim/Region/Framework/Scenes/Prioritizer.cs | 3 +- OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 49 ++-- OpenSim/Region/Framework/Scenes/Scene.cs | 82 +++--- OpenSim/Region/Framework/Scenes/SceneGraph.cs | 29 +-- OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 282 +++++++++------------ .../Framework/Scenes/SceneObjectPartInventory.cs | 10 +- OpenSim/Region/Framework/Scenes/SceneViewer.cs | 2 +- 7 files changed, 185 insertions(+), 272 deletions(-) (limited to 'OpenSim/Region/Framework') diff --git a/OpenSim/Region/Framework/Scenes/Prioritizer.cs b/OpenSim/Region/Framework/Scenes/Prioritizer.cs index 33407ec..1b10e3c 100644 --- a/OpenSim/Region/Framework/Scenes/Prioritizer.cs +++ b/OpenSim/Region/Framework/Scenes/Prioritizer.cs @@ -208,8 +208,7 @@ namespace OpenSim.Region.Framework.Scenes if (entity is SceneObjectPart) { SceneObjectGroup group = (entity as SceneObjectPart).ParentGroup; - if (group != null) - entityPos = group.AbsolutePosition; + entityPos = group.AbsolutePosition; } // Use the camera position for local agents and avatar position for remote agents diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index addc20c..4700c3b 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -225,16 +225,8 @@ namespace OpenSim.Region.Framework.Scenes SceneObjectPart part = GetSceneObjectPart(primId); if (part == null) return new ArrayList(); - SceneObjectGroup group = part.ParentGroup; - if (null == group) - { - m_log.ErrorFormat( - "[PRIM INVENTORY]: " + - "Prim inventory update requested for item ID {0} in prim ID {1} but this prim does not exist", - itemId, primId); - return new ArrayList(); - } + SceneObjectGroup group = part.ParentGroup; // Retrieve item TaskInventoryItem item = group.GetInventoryItem(part.LocalId, itemId); @@ -971,33 +963,23 @@ namespace OpenSim.Region.Framework.Scenes SceneObjectPart part = GetSceneObjectPart(localID); if (part == null) return; + SceneObjectGroup group = part.ParentGroup; - if (group != null) - { - if (!Permissions.CanEditObjectInventory(part.UUID, remoteClient.AgentId)) - return; - - TaskInventoryItem item = group.GetInventoryItem(localID, itemID); - if (item == null) - return; + if (!Permissions.CanEditObjectInventory(part.UUID, remoteClient.AgentId)) + return; + + TaskInventoryItem item = group.GetInventoryItem(localID, itemID); + if (item == null) + return; - if (item.Type == 10) - { - part.RemoveScriptEvents(itemID); - EventManager.TriggerRemoveScript(localID, itemID); - } - - group.RemoveInventoryItem(localID, itemID); - part.GetProperties(remoteClient); - } - else + if (item.Type == 10) { - m_log.ErrorFormat( - "[PRIM INVENTORY]: " + - "Removal of item {0} requested of prim {1} but this prim does not exist", - itemID, - localID); + part.RemoveScriptEvents(itemID); + EventManager.TriggerRemoveScript(localID, itemID); } + + group.RemoveInventoryItem(localID, itemID); + part.GetProperties(remoteClient); } private InventoryItemBase CreateAgentInventoryItemFromTask(UUID destAgent, SceneObjectPart part, UUID itemId) @@ -1770,7 +1752,7 @@ namespace OpenSim.Region.Framework.Scenes continue; // Already deleted by someone else - if (part.ParentGroup == null || part.ParentGroup.IsDeleted) + if (part.ParentGroup.IsDeleted) continue; // Can't delete child prims @@ -2034,6 +2016,7 @@ namespace OpenSim.Region.Framework.Scenes SceneObjectPart part = GetSceneObjectPart(localID); if (part == null) continue; + if (!groups.Contains(part.ParentGroup)) groups.Add(part.ParentGroup); } diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 9368285..7f5aea7 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -3012,58 +3012,51 @@ namespace OpenSim.Region.Framework.Scenes Vector3 AXOrigin = new Vector3(RayStart.X, RayStart.Y, RayStart.Z); Vector3 AXdirection = new Vector3(direction.X, direction.Y, direction.Z); - if (target2.ParentGroup != null) - { - pos = target2.AbsolutePosition; - //m_log.Info("[OBJECT_REZ]: TargetPos: " + pos.ToString() + ", RayStart: " + RayStart.ToString() + ", RayEnd: " + RayEnd.ToString() + ", Volume: " + Util.GetDistanceTo(RayStart,RayEnd).ToString() + ", mag1: " + Util.GetMagnitude(RayStart).ToString() + ", mag2: " + Util.GetMagnitude(RayEnd).ToString()); + pos = target2.AbsolutePosition; + //m_log.Info("[OBJECT_REZ]: TargetPos: " + pos.ToString() + ", RayStart: " + RayStart.ToString() + ", RayEnd: " + RayEnd.ToString() + ", Volume: " + Util.GetDistanceTo(RayStart,RayEnd).ToString() + ", mag1: " + Util.GetMagnitude(RayStart).ToString() + ", mag2: " + Util.GetMagnitude(RayEnd).ToString()); - // TODO: Raytrace better here + // TODO: Raytrace better here - //EntityIntersection ei = m_sceneGraph.GetClosestIntersectingPrim(new Ray(AXOrigin, AXdirection)); - Ray NewRay = new Ray(AXOrigin, AXdirection); + //EntityIntersection ei = m_sceneGraph.GetClosestIntersectingPrim(new Ray(AXOrigin, AXdirection)); + Ray NewRay = new Ray(AXOrigin, AXdirection); - // Ray Trace against target here - EntityIntersection ei = target2.TestIntersectionOBB(NewRay, Quaternion.Identity, frontFacesOnly, CopyCenters); + // Ray Trace against target here + EntityIntersection ei = target2.TestIntersectionOBB(NewRay, Quaternion.Identity, frontFacesOnly, CopyCenters); - // Un-comment out the following line to Get Raytrace results printed to the console. - //m_log.Info("[RAYTRACERESULTS]: Hit:" + ei.HitTF.ToString() + " Point: " + ei.ipoint.ToString() + " Normal: " + ei.normal.ToString()); - float ScaleOffset = 0.5f; + // Un-comment out the following line to Get Raytrace results printed to the console. + //m_log.Info("[RAYTRACERESULTS]: Hit:" + ei.HitTF.ToString() + " Point: " + ei.ipoint.ToString() + " Normal: " + ei.normal.ToString()); + float ScaleOffset = 0.5f; - // If we hit something - if (ei.HitTF) + // If we hit something + if (ei.HitTF) + { + Vector3 scale = target.Scale; + Vector3 scaleComponent = new Vector3(ei.AAfaceNormal.X, ei.AAfaceNormal.Y, ei.AAfaceNormal.Z); + if (scaleComponent.X != 0) ScaleOffset = scale.X; + if (scaleComponent.Y != 0) ScaleOffset = scale.Y; + if (scaleComponent.Z != 0) ScaleOffset = scale.Z; + ScaleOffset = Math.Abs(ScaleOffset); + Vector3 intersectionpoint = new Vector3(ei.ipoint.X, ei.ipoint.Y, ei.ipoint.Z); + Vector3 normal = new Vector3(ei.normal.X, ei.normal.Y, ei.normal.Z); + Vector3 offset = normal * (ScaleOffset / 2f); + pos = intersectionpoint + offset; + + // stick in offset format from the original prim + pos = pos - target.ParentGroup.AbsolutePosition; + if (CopyRotates) { - Vector3 scale = target.Scale; - Vector3 scaleComponent = new Vector3(ei.AAfaceNormal.X, ei.AAfaceNormal.Y, ei.AAfaceNormal.Z); - if (scaleComponent.X != 0) ScaleOffset = scale.X; - if (scaleComponent.Y != 0) ScaleOffset = scale.Y; - if (scaleComponent.Z != 0) ScaleOffset = scale.Z; - ScaleOffset = Math.Abs(ScaleOffset); - Vector3 intersectionpoint = new Vector3(ei.ipoint.X, ei.ipoint.Y, ei.ipoint.Z); - Vector3 normal = new Vector3(ei.normal.X, ei.normal.Y, ei.normal.Z); - Vector3 offset = normal * (ScaleOffset / 2f); - pos = intersectionpoint + offset; - - // stick in offset format from the original prim - pos = pos - target.ParentGroup.AbsolutePosition; - if (CopyRotates) - { - Quaternion worldRot = target2.GetWorldRotation(); + Quaternion worldRot = target2.GetWorldRotation(); - // SceneObjectGroup obj = m_sceneGraph.DuplicateObject(localID, pos, target.GetEffectiveObjectFlags(), AgentID, GroupID, worldRot); - m_sceneGraph.DuplicateObject(localID, pos, target.GetEffectiveObjectFlags(), AgentID, GroupID, worldRot); - //obj.Rotation = worldRot; - //obj.UpdateGroupRotationR(worldRot); - } - else - { - m_sceneGraph.DuplicateObject(localID, pos, target.GetEffectiveObjectFlags(), AgentID, GroupID); - } + // SceneObjectGroup obj = m_sceneGraph.DuplicateObject(localID, pos, target.GetEffectiveObjectFlags(), AgentID, GroupID, worldRot); + m_sceneGraph.DuplicateObject(localID, pos, target.GetEffectiveObjectFlags(), AgentID, GroupID, worldRot); + //obj.Rotation = worldRot; + //obj.UpdateGroupRotationR(worldRot); + } + else + { + m_sceneGraph.DuplicateObject(localID, pos, target.GetEffectiveObjectFlags(), AgentID, GroupID); } - - return; } - - return; } } @@ -3233,12 +3226,13 @@ namespace OpenSim.Region.Framework.Scenes SceneObjectPart part = GetSceneObjectPart(localID); if (part != null) // It is a prim { - if (part.ParentGroup != null && !part.ParentGroup.IsDeleted) // Valid + if (!part.ParentGroup.IsDeleted) // Valid { if (part.ParentGroup.RootPart != part) // Child part return; } } + ForEachClient(delegate(IClientAPI client) { client.SendKillObject(m_regionHandle, localID); }); } diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index 76ed55c..17a1bcc 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs @@ -1630,27 +1630,18 @@ namespace OpenSim.Region.Framework.Scenes SceneObjectGroup parentGroup = root.ParentGroup; List childGroups = new List(); - if (parentGroup != null) - { - // We do this in reverse to get the link order of the prims correct - for (int i = children.Count - 1; i >= 0; i--) - { - SceneObjectGroup child = children[i].ParentGroup; - if (child != null) - { - // Make sure no child prim is set for sale - // So that, on delink, no prims are unwittingly - // left for sale and sold off - child.RootPart.ObjectSaleType = 0; - child.RootPart.SalePrice = 10; - childGroups.Add(child); - } - } - } - else + // We do this in reverse to get the link order of the prims correct + for (int i = children.Count - 1; i >= 0; i--) { - return; // parent is null so not in this region + SceneObjectGroup child = children[i].ParentGroup; + + // Make sure no child prim is set for sale + // So that, on delink, no prims are unwittingly + // left for sale and sold off + child.RootPart.ObjectSaleType = 0; + child.RootPart.SalePrice = 10; + childGroups.Add(child); } foreach (SceneObjectGroup child in childGroups) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 71023a9..4e7504a 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -302,7 +302,6 @@ namespace OpenSim.Region.Framework.Scenes protected string m_name; protected Vector3 m_offsetPosition; - // FIXME, TODO, ERROR: 'ParentGroup' can't be in here, move it out. protected SceneObjectGroup m_parentGroup; protected byte[] m_particleSystem = Utils.EmptyBytes; protected ulong m_regionHandle; @@ -592,6 +591,7 @@ namespace OpenSim.Region.Framework.Scenes set { m_passTouches = value; + if (ParentGroup != null) ParentGroup.HasGroupChanged = true; } @@ -759,13 +759,10 @@ namespace OpenSim.Region.Framework.Scenes // TODO if we decide to do sitting in a more SL compatible way (multiple avatars per prim), this has to be fixed, too if (m_sitTargetAvatar != UUID.Zero) { - if (m_parentGroup != null) // TODO can there be a SOP without a SOG? + ScenePresence avatar; + if (m_parentGroup.Scene.TryGetScenePresence(m_sitTargetAvatar, out avatar)) { - ScenePresence avatar; - if (m_parentGroup.Scene.TryGetScenePresence(m_sitTargetAvatar, out avatar)) - { - avatar.ParentPosition = GetWorldPosition(); - } + avatar.ParentPosition = GetWorldPosition(); } } } @@ -854,7 +851,9 @@ namespace OpenSim.Region.Framework.Scenes actor.Orientation = resultingrotation; //m_log.Info("[PART]: RO2:" + actor.Orientation.ToString()); } - m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor); + + if (m_parentGroup != null) + m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor); //} } catch (Exception ex) @@ -862,7 +861,6 @@ namespace OpenSim.Region.Framework.Scenes m_log.Error("[SCENEOBJECTPART]: ROTATIONOFFSET" + ex.Message); } } - } } @@ -1018,7 +1016,7 @@ namespace OpenSim.Region.Framework.Scenes m_shape.Scale = value; PhysicsActor actor = PhysActor; - if (actor != null && m_parentGroup != null) + if (actor != null) { if (m_parentGroup.Scene != null) { @@ -1059,7 +1057,7 @@ namespace OpenSim.Region.Framework.Scenes set { m_mediaUrl = value; - + if (ParentGroup != null) ParentGroup.HasGroupChanged = true; } @@ -1107,7 +1105,6 @@ namespace OpenSim.Region.Framework.Scenes set { m_sitTargetOrientation = value; } } - public Vector3 SitTargetPosition { get { return m_sitTargetPosition; } @@ -1262,7 +1259,7 @@ namespace OpenSim.Region.Framework.Scenes { get { - if (ParentGroup != null && ParentGroup.Scene != null) + if (ParentGroup.Scene != null) return ParentGroup.Scene.RegionInfo.RegionID; else return UUID.Zero; @@ -1277,14 +1274,13 @@ namespace OpenSim.Region.Framework.Scenes get { if (ParentGroup != null) - { _parentUUID = ParentGroup.UUID; - } + return _parentUUID; } + set { _parentUUID = value; } } - public string SitAnimation { @@ -1514,10 +1510,7 @@ namespace OpenSim.Region.Framework.Scenes impulse = newimpulse; } - if (m_parentGroup != null) - { - m_parentGroup.applyAngularImpulse(impulse); - } + m_parentGroup.applyAngularImpulse(impulse); } /// @@ -1540,10 +1533,7 @@ namespace OpenSim.Region.Framework.Scenes impulse = newimpulse; } - if (m_parentGroup != null) - { - m_parentGroup.setAngularImpulse(impulse); - } + m_parentGroup.setAngularImpulse(impulse); } public Vector3 GetTorque() @@ -1951,8 +1941,6 @@ namespace OpenSim.Region.Framework.Scenes public bool GetDieAtEdge() { - if (m_parentGroup == null) - return false; if (m_parentGroup.IsDeleted) return false; @@ -1961,8 +1949,6 @@ namespace OpenSim.Region.Framework.Scenes public bool GetReturnAtEdge() { - if (m_parentGroup == null) - return false; if (m_parentGroup.IsDeleted) return false; @@ -1971,8 +1957,6 @@ namespace OpenSim.Region.Framework.Scenes public void SetReturnAtEdge(bool p) { - if (m_parentGroup == null) - return; if (m_parentGroup.IsDeleted) return; @@ -1981,8 +1965,6 @@ namespace OpenSim.Region.Framework.Scenes public bool GetBlockGrab() { - if (m_parentGroup == null) - return false; if (m_parentGroup.IsDeleted) return false; @@ -1991,8 +1973,6 @@ namespace OpenSim.Region.Framework.Scenes public void SetBlockGrab(bool p) { - if (m_parentGroup == null) - return; if (m_parentGroup.IsDeleted) return; @@ -2001,8 +1981,6 @@ namespace OpenSim.Region.Framework.Scenes public void SetStatusSandbox(bool p) { - if (m_parentGroup == null) - return; if (m_parentGroup.IsDeleted) return; StatusSandboxPos = m_parentGroup.RootPart.AbsolutePosition; @@ -2011,8 +1989,6 @@ namespace OpenSim.Region.Framework.Scenes public bool GetStatusSandbox() { - if (m_parentGroup == null) - return false; if (m_parentGroup.IsDeleted) return false; @@ -2090,11 +2066,7 @@ namespace OpenSim.Region.Framework.Scenes public UUID GetRootPartUUID() { - if (m_parentGroup != null) - { - return m_parentGroup.UUID; - } - return UUID.Zero; + return m_parentGroup.UUID; } /// @@ -2220,8 +2192,6 @@ namespace OpenSim.Region.Framework.Scenes m_lastColliders.Remove(localID); } - if (m_parentGroup == null) - return; if (m_parentGroup.IsDeleted) return; @@ -2242,9 +2212,6 @@ namespace OpenSim.Region.Framework.Scenes { if (localId == 0) continue; - // always running this check because if the user deletes the object it would return a null reference. - if (m_parentGroup == null) - return; if (m_parentGroup.Scene == null) return; @@ -2253,7 +2220,8 @@ namespace OpenSim.Region.Framework.Scenes string data = ""; if (obj != null) { - if (m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.UUID.ToString()) || m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.Name)) + if (m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.UUID.ToString()) + || m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.Name)) { bool found = m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); //If it is 1, it is to accept ONLY collisions from this object @@ -2300,7 +2268,8 @@ namespace OpenSim.Region.Framework.Scenes { if (av.LocalId == localId) { - if (m_parentGroup.RootPart.CollisionFilter.ContainsValue(av.UUID.ToString()) || m_parentGroup.RootPart.CollisionFilter.ContainsValue(av.Name)) + if (m_parentGroup.RootPart.CollisionFilter.ContainsValue(av.UUID.ToString()) + || m_parentGroup.RootPart.CollisionFilter.ContainsValue(av.Name)) { bool found = m_parentGroup.RootPart.CollisionFilter.TryGetValue(1, out data); //If it is 1, it is to accept ONLY collisions from this avatar @@ -2348,12 +2317,10 @@ namespace OpenSim.Region.Framework.Scenes if (colliding.Count > 0) { StartCollidingMessage.Colliders = colliding; - // always running this check because if the user deletes the object it would return a null reference. - if (m_parentGroup == null) - return; if (m_parentGroup.Scene == null) return; + if (m_parentGroup.PassCollision == true) { //TODO: Add pass to root prim! @@ -2374,9 +2341,6 @@ namespace OpenSim.Region.Framework.Scenes // always running this check because if the user deletes the object it would return a null reference. if (localId == 0) continue; - - if (m_parentGroup == null) - return; if (m_parentGroup.Scene == null) return; @@ -2385,7 +2349,8 @@ namespace OpenSim.Region.Framework.Scenes string data = ""; if (obj != null) { - if (m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.UUID.ToString()) || m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.Name)) + if (m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.UUID.ToString()) + || m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.Name)) { bool found = m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); //If it is 1, it is to accept ONLY collisions from this object @@ -2432,7 +2397,8 @@ namespace OpenSim.Region.Framework.Scenes { if (av.LocalId == localId) { - if (m_parentGroup.RootPart.CollisionFilter.ContainsValue(av.UUID.ToString()) || m_parentGroup.RootPart.CollisionFilter.ContainsValue(av.Name)) + if (m_parentGroup.RootPart.CollisionFilter.ContainsValue(av.UUID.ToString()) + || m_parentGroup.RootPart.CollisionFilter.ContainsValue(av.Name)) { bool found = m_parentGroup.RootPart.CollisionFilter.TryGetValue(1, out data); //If it is 1, it is to accept ONLY collisions from this avatar @@ -2480,9 +2446,6 @@ namespace OpenSim.Region.Framework.Scenes if (colliding.Count > 0) { CollidingMessage.Colliders = colliding; - // always running this check because if the user deletes the object it would return a null reference. - if (m_parentGroup == null) - return; if (m_parentGroup.Scene == null) return; @@ -2503,11 +2466,9 @@ namespace OpenSim.Region.Framework.Scenes if (localId == 0) continue; - // always running this check because if the user deletes the object it would return a null reference. - if (m_parentGroup == null) - return; if (m_parentGroup.Scene == null) return; + SceneObjectPart obj = m_parentGroup.Scene.GetSceneObjectPart(localId); string data = ""; if (obj != null) @@ -2559,7 +2520,8 @@ namespace OpenSim.Region.Framework.Scenes { if (av.LocalId == localId) { - if (m_parentGroup.RootPart.CollisionFilter.ContainsValue(av.UUID.ToString()) || m_parentGroup.RootPart.CollisionFilter.ContainsValue(av.Name)) + if (m_parentGroup.RootPart.CollisionFilter.ContainsValue(av.UUID.ToString()) + || m_parentGroup.RootPart.CollisionFilter.ContainsValue(av.Name)) { bool found = m_parentGroup.RootPart.CollisionFilter.TryGetValue(1, out data); //If it is 1, it is to accept ONLY collisions from this avatar @@ -2608,9 +2570,6 @@ namespace OpenSim.Region.Framework.Scenes if (colliding.Count > 0) { EndCollidingMessage.Colliders = colliding; - // always running this check because if the user deletes the object it would return a null reference. - if (m_parentGroup == null) - return; if (m_parentGroup.Scene == null) return; @@ -2619,6 +2578,7 @@ namespace OpenSim.Region.Framework.Scenes } } } + if ((m_parentGroup.RootPart.ScriptEvents & scriptEvents.land_collision_start) != 0) { if (startedColliders.Count > 0) @@ -2646,9 +2606,6 @@ namespace OpenSim.Region.Framework.Scenes if (colliding.Count > 0) { LandStartCollidingMessage.Colliders = colliding; - // always running this check because if the user deletes the object it would return a null reference. - if (m_parentGroup == null) - return; if (m_parentGroup.Scene == null) return; @@ -2657,6 +2614,7 @@ namespace OpenSim.Region.Framework.Scenes } } } + if ((m_parentGroup.RootPart.ScriptEvents & scriptEvents.land_collision) != 0) { if (m_lastColliders.Count > 0) @@ -2684,9 +2642,6 @@ namespace OpenSim.Region.Framework.Scenes if (colliding.Count > 0) { LandCollidingMessage.Colliders = colliding; - // always running this check because if the user deletes the object it would return a null reference. - if (m_parentGroup == null) - return; if (m_parentGroup.Scene == null) return; @@ -2695,6 +2650,7 @@ namespace OpenSim.Region.Framework.Scenes } } } + if ((m_parentGroup.RootPart.ScriptEvents & scriptEvents.land_collision_end) != 0) { if (endedColliders.Count > 0) @@ -2722,9 +2678,6 @@ namespace OpenSim.Region.Framework.Scenes if (colliding.Count > 0) { LandEndCollidingMessage.Colliders = colliding; - // always running this check because if the user deletes the object it would return a null reference. - if (m_parentGroup == null) - return; if (m_parentGroup.Scene == null) return; @@ -2748,10 +2701,12 @@ namespace OpenSim.Region.Framework.Scenes { if (PhysActor != null) { - Vector3 newpos = new Vector3(PhysActor.Position.GetBytes(), 0); - if (m_parentGroup.Scene.TestBorderCross(newpos, Cardinals.N) | m_parentGroup.Scene.TestBorderCross(newpos, Cardinals.S) | m_parentGroup.Scene.TestBorderCross(newpos, Cardinals.E) | m_parentGroup.Scene.TestBorderCross(newpos, Cardinals.W)) + if (m_parentGroup.Scene.TestBorderCross(newpos, Cardinals.N) + | m_parentGroup.Scene.TestBorderCross(newpos, Cardinals.S) + | m_parentGroup.Scene.TestBorderCross(newpos, Cardinals.E) + | m_parentGroup.Scene.TestBorderCross(newpos, Cardinals.W)) { m_parentGroup.AbsolutePosition = newpos; return; @@ -2909,11 +2864,11 @@ namespace OpenSim.Region.Framework.Scenes public void ScheduleFullUpdate() { // m_log.DebugFormat("[SCENE OBJECT PART]: Scheduling full update for {0} {1}", Name, LocalId); - - if (m_parentGroup != null) - { - m_parentGroup.QueueForUpdateCheck(); - } + + if (m_parentGroup == null) + return; + + m_parentGroup.QueueForUpdateCheck(); int timeNow = Util.UnixTimeSinceEpoch(); @@ -2942,13 +2897,14 @@ namespace OpenSim.Region.Framework.Scenes /// public void ScheduleTerseUpdate() { + if (m_parentGroup == null) + return; + if (m_updateFlag < 1) { - if (m_parentGroup != null) - { - m_parentGroup.HasGroupChanged = true; - m_parentGroup.QueueForUpdateCheck(); - } + m_parentGroup.HasGroupChanged = true; + m_parentGroup.QueueForUpdateCheck(); + TimeStampTerse = (uint) Util.UnixTimeSinceEpoch(); m_updateFlag = 1; @@ -2960,10 +2916,7 @@ namespace OpenSim.Region.Framework.Scenes public void ScriptSetPhysicsStatus(bool UsePhysics) { - if (m_parentGroup == null) - DoPhysicsPropertyUpdate(UsePhysics, false); - else - m_parentGroup.ScriptSetPhysicsStatus(UsePhysics); + m_parentGroup.ScriptSetPhysicsStatus(UsePhysics); } /// @@ -3003,6 +2956,9 @@ namespace OpenSim.Region.Framework.Scenes /// protected internal void SendFullUpdate(IClientAPI remoteClient, uint clientFlags) { + if (m_parentGroup == null) + return; + // m_log.DebugFormat( // "[SOG]: Sendinging part full update to {0} for {1} {2}", remoteClient.Name, part.Name, part.LocalId); @@ -3028,6 +2984,9 @@ namespace OpenSim.Region.Framework.Scenes /// public void SendFullUpdateToAllClients() { + if (m_parentGroup == null) + return; + m_parentGroup.Scene.ForEachScenePresence(delegate(ScenePresence avatar) { SendFullUpdate(avatar.ControllingClient, avatar.GenerateClientFlags(UUID)); @@ -3040,6 +2999,9 @@ namespace OpenSim.Region.Framework.Scenes /// public void SendFullUpdateToAllClientsExcept(UUID agentID) { + if (m_parentGroup == null) + return; + m_parentGroup.Scene.ForEachScenePresence(delegate(ScenePresence avatar) { // Ugly reference :( @@ -3068,6 +3030,9 @@ namespace OpenSim.Region.Framework.Scenes /// public void SendFullUpdateToClient(IClientAPI remoteClient, Vector3 lPos, uint clientFlags) { + if (ParentGroup == null) + return; + // Suppress full updates during attachment editing // if (ParentGroup.IsSelected && ParentGroup.IsAttachment) @@ -3250,10 +3215,7 @@ namespace OpenSim.Region.Framework.Scenes public void SetAxisRotation(int axis, int rotate) { - if (m_parentGroup != null) - { - m_parentGroup.SetAxisRotation(axis, rotate); - } + m_parentGroup.SetAxisRotation(axis, rotate); //Cannot use ScriptBaseClass constants as no referance to it currently. if (axis == 2)//STATUS_ROTATE_X @@ -3276,8 +3238,6 @@ namespace OpenSim.Region.Framework.Scenes public void SetDieAtEdge(bool p) { - if (m_parentGroup == null) - return; if (m_parentGroup.IsDeleted) return; @@ -3530,7 +3490,7 @@ namespace OpenSim.Region.Framework.Scenes } /// - /// + /// Set the parent group of this prim. /// public void SetParent(SceneObjectGroup parent) { @@ -3587,8 +3547,11 @@ namespace OpenSim.Region.Framework.Scenes { Text = text; - ParentGroup.HasGroupChanged = true; - ScheduleFullUpdate(); + if (ParentGroup != null) + { + ParentGroup.HasGroupChanged = true; + ScheduleFullUpdate(); + } } public void StopLookAt() @@ -3632,7 +3595,7 @@ namespace OpenSim.Region.Framework.Scenes { if (!IgnoreUndoUpdate) { - if (m_parentGroup != null) + if (ParentGroup != null) { lock (m_undo) { @@ -3644,31 +3607,31 @@ namespace OpenSim.Region.Framework.Scenes // TODO: May need to fix for group comparison if (last.Compare(this)) { -// m_log.DebugFormat( -// "[SCENE OBJECT PART]: Not storing undo for {0} {1} since current state is same as last undo state, initial stack size {2}", -// Name, LocalId, m_undo.Count); - + // m_log.DebugFormat( + // "[SCENE OBJECT PART]: Not storing undo for {0} {1} since current state is same as last undo state, initial stack size {2}", + // Name, LocalId, m_undo.Count); + return; } } } - -// m_log.DebugFormat( -// "[SCENE OBJECT PART]: Storing undo state for {0} {1}, forGroup {2}, initial stack size {3}", -// Name, LocalId, forGroup, m_undo.Count); - + + // m_log.DebugFormat( + // "[SCENE OBJECT PART]: Storing undo state for {0} {1}, forGroup {2}, initial stack size {3}", + // Name, LocalId, forGroup, m_undo.Count); + if (m_parentGroup.GetSceneMaxUndo() > 0) { UndoState nUndo = new UndoState(this, forGroup); - + m_undo.Push(nUndo); - + if (m_redo.Count > 0) m_redo.Clear(); - -// m_log.DebugFormat( -// "[SCENE OBJECT PART]: Stored undo state for {0} {1}, forGroup {2}, stack size now {3}", -// Name, LocalId, forGroup, m_undo.Count); + + // m_log.DebugFormat( + // "[SCENE OBJECT PART]: Stored undo state for {0} {1}, forGroup {2}, stack size now {3}", + // Name, LocalId, forGroup, m_undo.Count); } } } @@ -4245,8 +4208,11 @@ namespace OpenSim.Region.Framework.Scenes } } - ParentGroup.HasGroupChanged = true; - ScheduleFullUpdate(); + if (ParentGroup != null) + { + ParentGroup.HasGroupChanged = true; + ScheduleFullUpdate(); + } } public void UpdateGroupPosition(Vector3 pos) @@ -4450,14 +4416,12 @@ namespace OpenSim.Region.Framework.Scenes if (!wasUsingPhysics) { DoPhysicsPropertyUpdate(UsePhysics, false); - if (m_parentGroup != null) + + if (!m_parentGroup.IsDeleted) { - if (!m_parentGroup.IsDeleted) + if (LocalId == m_parentGroup.RootPart.LocalId) { - if (LocalId == m_parentGroup.RootPart.LocalId) - { - m_parentGroup.CheckSculptAndLoad(); - } + m_parentGroup.CheckSculptAndLoad(); } } } @@ -4510,14 +4474,11 @@ namespace OpenSim.Region.Framework.Scenes PhysActor.SetMaterial(Material); DoPhysicsPropertyUpdate(UsePhysics, true); - if (m_parentGroup != null) + if (!m_parentGroup.IsDeleted) { - if (!m_parentGroup.IsDeleted) + if (LocalId == m_parentGroup.RootPart.LocalId) { - if (LocalId == m_parentGroup.RootPart.LocalId) - { - m_parentGroup.CheckSculptAndLoad(); - } + m_parentGroup.CheckSculptAndLoad(); } } @@ -4541,14 +4502,12 @@ namespace OpenSim.Region.Framework.Scenes pa.IsPhysical = UsePhysics; DoPhysicsPropertyUpdate(UsePhysics, false); // Update physical status. If it's phantom this will remove the prim - if (m_parentGroup != null) + + if (!m_parentGroup.IsDeleted) { - if (!m_parentGroup.IsDeleted) + if (LocalId == m_parentGroup.RootPart.LocalId) { - if (LocalId == m_parentGroup.RootPart.LocalId) - { - m_parentGroup.CheckSculptAndLoad(); - } + m_parentGroup.CheckSculptAndLoad(); } } } @@ -4591,8 +4550,11 @@ namespace OpenSim.Region.Framework.Scenes } // m_log.Debug("Update: PHY:" + UsePhysics.ToString() + ", T:" + IsTemporary.ToString() + ", PHA:" + IsPhantom.ToString() + " S:" + CastsShadows.ToString()); - ParentGroup.HasGroupChanged = true; - ScheduleFullUpdate(); + if (ParentGroup != null) + { + ParentGroup.HasGroupChanged = true; + ScheduleFullUpdate(); + } // m_log.DebugFormat("[SCENE OBJECT PART]: Updated PrimFlags on {0} {1} to {2}", Name, LocalId, Flags); } @@ -4605,8 +4567,12 @@ namespace OpenSim.Region.Framework.Scenes (rot.W != RotationOffset.W)) { RotationOffset = rot; - ParentGroup.HasGroupChanged = true; - ScheduleTerseUpdate(); + + if (ParentGroup != null) + { + ParentGroup.HasGroupChanged = true; + ScheduleTerseUpdate(); + } } } @@ -4797,14 +4763,6 @@ namespace OpenSim.Region.Framework.Scenes } } - if (m_parentGroup == null) - { -// m_log.DebugFormat( -// "[SCENE OBJECT PART]: Scheduling part {0} {1} for full update in aggregateScriptEvents() since m_parentGroup == null", Name, LocalId); - ScheduleFullUpdate(); - return; - } - //if ((GetEffectiveObjectFlags() & (uint)PrimFlags.Scripted) != 0) //{ // m_parentGroup.Scene.EventManager.OnScriptTimerEvent += handleTimerAccounting; @@ -4830,36 +4788,22 @@ namespace OpenSim.Region.Framework.Scenes public int registerTargetWaypoint(Vector3 target, float tolerance) { - if (m_parentGroup != null) - { - return m_parentGroup.registerTargetWaypoint(target, tolerance); - } - return 0; + return m_parentGroup.registerTargetWaypoint(target, tolerance); } public void unregisterTargetWaypoint(int handle) { - if (m_parentGroup != null) - { - m_parentGroup.unregisterTargetWaypoint(handle); - } + m_parentGroup.unregisterTargetWaypoint(handle); } public int registerRotTargetWaypoint(Quaternion target, float tolerance) { - if (m_parentGroup != null) - { - return m_parentGroup.registerRotTargetWaypoint(target, tolerance); - } - return 0; + return m_parentGroup.registerRotTargetWaypoint(target, tolerance); } public void unregisterRotTargetWaypoint(int handle) { - if (m_parentGroup != null) - { - m_parentGroup.unregisterRotTargetWaypoint(handle); - } + m_parentGroup.unregisterRotTargetWaypoint(handle); } public void SetCameraAtOffset(Vector3 v) @@ -4901,7 +4845,7 @@ namespace OpenSim.Region.Framework.Scenes public void SendTerseUpdateToClient(IClientAPI remoteClient) { - if (ParentGroup == null || ParentGroup.IsDeleted) + if (ParentGroup.IsDeleted) return; if (ParentGroup.IsAttachment && ParentGroup.RootPart != this) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 108089e..e40e57d 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -112,15 +112,17 @@ namespace OpenSim.Region.Framework.Scenes } /// - /// Reset UUIDs for all the items in the prim's inventory. This involves either generating + /// Reset UUIDs for all the items in the prim's inventory. + /// + /// + /// This involves either generating /// new ones or setting existing UUIDs to the correct parent UUIDs. /// /// If this method is called and there are inventory items, then we regard the inventory as having changed. - /// - /// Link number for the part + /// public void ResetInventoryIDs() { - if (null == m_part || null == m_part.ParentGroup) + if (null == m_part) return; lock (m_items) diff --git a/OpenSim/Region/Framework/Scenes/SceneViewer.cs b/OpenSim/Region/Framework/Scenes/SceneViewer.cs index 997845b..e2ea830 100644 --- a/OpenSim/Region/Framework/Scenes/SceneViewer.cs +++ b/OpenSim/Region/Framework/Scenes/SceneViewer.cs @@ -110,7 +110,7 @@ namespace OpenSim.Region.Framework.Scenes { SceneObjectPart part = m_partsUpdateQueue.Dequeue(); - if (part.ParentGroup == null || part.ParentGroup.IsDeleted) + if (part.ParentGroup.IsDeleted) continue; if (m_updateTimes.ContainsKey(part.UUID)) -- cgit v1.1