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