diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 3fe879aecb..3a5107dd9c 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -2318,7 +2318,7 @@ namespace OpenSim.Region.Framework.Scenes
{
pos = GetNewRezLocation(
RayStart, RayEnd, RayTargetID, Quaternion.Identity,
- BypassRayCast, bRayEndIsIntersection, true, group.GroupScale(), false);
+ BypassRayCast, bRayEndIsIntersection, true, group.GetAxisAlignedBoundingBox(), false);
group.AbsolutePosition = pos;
}
else
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index ac2d02e479..660ee8d156 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -1386,8 +1386,7 @@ namespace OpenSim.Region.Framework.Scenes
//increase height so its above the ground.
//should be getting the normal of the ground at the rez point and using that?
- float ScaleOffset = Math.Abs(scale.Z);
- pos.Z += ScaleOffset / 2f;
+ pos.Z += scale.Z / 2f;
return pos;
}
}
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 55ee460fe4..a40303025c 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -581,6 +581,59 @@ namespace OpenSim.Region.Framework.Scenes
return returnresult;
}
+
+
+ ///
+ /// Gets a vector representing the size of the bounding box containing all the prims in the group
+ /// Treats all prims as rectangular, so no shape (cut etc) is taken into account
+ ///
+ ///
+ public Vector3 GetAxisAlignedBoundingBox()
+ {
+ //int count = 0;
+ float maxX = 0f, maxY = 0f, maxZ = 0f, minX = 256f, minY = 256f, minZ = 256f;
+ lock (m_parts)
+ {
+ foreach (SceneObjectPart part in m_parts.Values)
+ {
+ Vector3 worldPos = part.GetWorldPosition();
+ Quaternion worldRot = part.GetWorldRotation();
+
+ Vector3 size = part.Scale * worldRot;
+
+ // m_log.InfoFormat("prim {0} , world pos is {1} , {2} , {3} , and size is {4} , {5} , {6}", count, worldPos.X, worldPos.Y, worldPos.Z, size.X, size.Y, size.Z);
+ // count++;
+
+ float tx= worldPos.X +( size.X/2);
+ float bx = worldPos.X - (size.X/2);
+ if (tx > maxX)
+ maxX = tx;
+ if (bx < minX)
+ minX = bx;
+
+ float ty = worldPos.Y + (size.Y / 2);
+ float by = worldPos.Y - (size.Y / 2);
+ if (ty > maxY)
+ maxY = ty;
+ if (by < minY)
+ minY = by;
+
+ float tz = worldPos.Z + (size.Z / 2);
+ float bz = worldPos.Z - (size.Z / 2);
+ if (tz > maxZ)
+ maxZ = tz;
+ if (bz < minZ)
+ minZ = bz;
+
+ }
+
+ }
+
+ Vector3 boundingBox = new Vector3(maxX - minX, maxY - minY, maxZ - minZ);
+ //m_log.InfoFormat("BoundingBox is {0} , {1} , {2} ", boundingBox.X, boundingBox.Y, boundingBox.Z);
+ return boundingBox;
+ }
+
#endregion
public void SaveScriptedState(XmlTextWriter writer)