From a266e6dc4b4cfee3ccc3de97dbe6be350aabdef5 Mon Sep 17 00:00:00 2001 From: MW Date: Wed, 15 Jul 2009 19:46:32 +0000 Subject: Bounding Box/find rez from inventory point code now seems to be working correctly. So next step is to clean up that code and wait for bug reports. --- OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 7 ++++++- .../Region/Framework/Scenes/SceneObjectGroup.cs | 23 +++++++++++++++++----- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 3a5107d..c277bdd 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -2312,14 +2312,19 @@ namespace OpenSim.Region.Framework.Scenes AddNewSceneObject(group, true); + // m_log.InfoFormat("ray end point for inventory rezz is {0} {1} {2} ", RayEnd.X, RayEnd.Y, RayEnd.Z); // if attachment we set it's asset id so object updates can reflect that // if not, we set it's position in world. if (!attachment) { + float offsetHeight = 0; pos = GetNewRezLocation( RayStart, RayEnd, RayTargetID, Quaternion.Identity, - BypassRayCast, bRayEndIsIntersection, true, group.GetAxisAlignedBoundingBox(), false); + BypassRayCast, bRayEndIsIntersection, true, group.GetAxisAlignedBoundingBox(out offsetHeight), false); + pos.Z += offsetHeight; group.AbsolutePosition = pos; + // m_log.InfoFormat("rezx point for inventory rezz is {0} {1} {2} and offsetheight was {3}", pos.X, pos.Y, pos.Z, offsetHeight); + } else { diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index d0de5f2..e987445 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -587,21 +587,22 @@ 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 + /// offsetHeight is the offset in the Z axis from the centre of the bounding box to the centre of the root prim /// /// - public Vector3 GetAxisAlignedBoundingBox() + public Vector3 GetAxisAlignedBoundingBox(out float offsetHeight) { float maxX = -256f, maxY = -256f, maxZ = -256f, minX = 256f, minY = 256f, minZ = 256f; lock (m_parts) { foreach (SceneObjectPart part in m_parts.Values) { - + Vector3 worldPos = part.GetWorldPosition(); Vector3 offset = worldPos - AbsolutePosition; Quaternion worldRot; @@ -659,7 +660,6 @@ namespace OpenSim.Region.Framework.Scenes backBottomRight.Y = orig.Y + (part.Scale.Y / 2); backBottomRight.Z = orig.Z - (part.Scale.Z / 2); - frontTopLeft = frontTopLeft * worldRot; frontTopRight = frontTopRight * worldRot; frontBottomLeft = frontBottomLeft * worldRot; @@ -795,10 +795,23 @@ namespace OpenSim.Region.Framework.Scenes } Vector3 boundingBox = new Vector3(maxX - minX, maxY - minY, maxZ - minZ); + + offsetHeight = 0; + float lower = (minZ * -1); + if (lower > maxZ) + { + offsetHeight = lower - (boundingBox.Z / 2); + + } + else if (maxZ > lower) + { + offsetHeight = maxZ - (boundingBox.Z / 2); + offsetHeight *= -1; + } + // m_log.InfoFormat("BoundingBox is {0} , {1} , {2} ", boundingBox.X, boundingBox.Y, boundingBox.Z); return boundingBox; } - #endregion public void SaveScriptedState(XmlTextWriter writer) -- cgit v1.1