A stab at making a better bounding box calculation

avinationmerge
Melanie Thielker 2010-08-22 13:42:29 +02:00
parent 8613336674
commit a0a25bb8ca
1 changed files with 74 additions and 31 deletions

View File

@ -7829,17 +7829,27 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
UUID objID = UUID.Zero; UUID objID = UUID.Zero;
LSL_List result = new LSL_List(); LSL_List result = new LSL_List();
// If the ID is not valid, return null result
if (!UUID.TryParse(obj, out objID)) if (!UUID.TryParse(obj, out objID))
{ {
result.Add(new LSL_Vector()); result.Add(new LSL_Vector());
result.Add(new LSL_Vector()); result.Add(new LSL_Vector());
return result; return result;
} }
// Check if this is an attached prim. If so, replace
// the UUID with the avatar UUID and report it's bounding box
SceneObjectPart part = World.GetSceneObjectPart(objID);
if (part != null && part.ParentGroup.IsAttachment)
objID = part.ParentGroup.RootPart.AttachedAvatar;
// Find out if this is an avatar ID. If so, return it's box
ScenePresence presence = World.GetScenePresence(objID); ScenePresence presence = World.GetScenePresence(objID);
if (presence != null) if (presence != null)
{ {
if (presence.ParentID == 0) // not sat on an object // As per LSL Wiki, there is no difference between sitting
{ // and standing avatar since server 1.36
LSL_Vector lower; LSL_Vector lower;
LSL_Vector upper; LSL_Vector upper;
if (presence.Animator.Animations.DefaultAnimation.AnimID if (presence.Animator.Animations.DefaultAnimation.AnimID
@ -7857,27 +7867,60 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
lower = new LSL_Vector(-0.225f, -0.3f, height * -1.0f); lower = new LSL_Vector(-0.225f, -0.3f, height * -1.0f);
upper = new LSL_Vector(0.225f, 0.3f, height + 0.05f); upper = new LSL_Vector(0.225f, 0.3f, height + 0.05f);
} }
// Adjust to the documented error offsets (see LSL Wiki)
lower += new LSL_Vector(0.05f, 0.05f, 0.05f);
upper -= new LSL_Vector(0.05f, 0.05f, 0.05f);
if (lower.x > upper.x)
lower.x = upper.x;
if (lower.y > upper.y)
lower.y = upper.y;
if (lower.z > upper.z)
lower.z = upper.z;
result.Add(lower); result.Add(lower);
result.Add(upper); result.Add(upper);
return result; return result;
} }
else
{ part = World.GetSceneObjectPart(objID);
// sitting on an object so we need the bounding box of that
// which should include the avatar so set the UUID to the
// UUID of the object the avatar is sat on and allow it to fall through
// to processing an object
SceneObjectPart p = World.GetSceneObjectPart(presence.ParentID);
objID = p.UUID;
}
}
SceneObjectPart part = World.GetSceneObjectPart(objID);
// Currently only works for single prims without a sitting avatar // Currently only works for single prims without a sitting avatar
if (part != null) if (part != null)
{ {
Vector3 halfSize = part.Scale / 2.0f; float minX;
LSL_Vector lower = new LSL_Vector(halfSize.X * -1.0f, halfSize.Y * -1.0f, halfSize.Z * -1.0f); float maxX;
LSL_Vector upper = new LSL_Vector(halfSize.X, halfSize.Y, halfSize.Z); float minY;
float maxY;
float minZ;
float maxZ;
// This BBox is in sim coordinates, with the offset being
// a contained point.
Vector3[] offsets = World.GetCombinedBoundingBox(new List<SceneObjectGroup> { part.ParentGroup },
out minX, out maxX, out minY, out maxY, out minZ, out maxZ);
minX -= offsets[0].X;
maxX -= offsets[0].X;
minY -= offsets[0].Y;
maxY -= offsets[0].Y;
minZ -= offsets[0].Z;
maxZ -= offsets[0].Z;
LSL_Vector lower;
LSL_Vector upper;
// Adjust to the documented error offsets (see LSL Wiki)
lower = new LSL_Vector(minX + 0.05f, minY + 0.05f, minZ + 0.05f);
upper = new LSL_Vector(maxX - 0.05f, maxY - 0.05f, maxZ - 0.05f);
if (lower.x > upper.x)
lower.x = upper.x;
if (lower.y > upper.y)
lower.y = upper.y;
if (lower.z > upper.z)
lower.z = upper.z;
result.Add(lower); result.Add(lower);
result.Add(upper); result.Add(upper);
return result; return result;