diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 55ee460..a403030 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -581,6 +581,59 @@ namespace OpenSim.Region.Framework.Scenes | |||
581 | return returnresult; | 581 | return returnresult; |
582 | } | 582 | } |
583 | 583 | ||
584 | |||
585 | |||
586 | /// <summary> | ||
587 | /// Gets a vector representing the size of the bounding box containing all the prims in the group | ||
588 | /// Treats all prims as rectangular, so no shape (cut etc) is taken into account | ||
589 | /// </summary> | ||
590 | /// <returns></returns> | ||
591 | public Vector3 GetAxisAlignedBoundingBox() | ||
592 | { | ||
593 | //int count = 0; | ||
594 | float maxX = 0f, maxY = 0f, maxZ = 0f, minX = 256f, minY = 256f, minZ = 256f; | ||
595 | lock (m_parts) | ||
596 | { | ||
597 | foreach (SceneObjectPart part in m_parts.Values) | ||
598 | { | ||
599 | Vector3 worldPos = part.GetWorldPosition(); | ||
600 | Quaternion worldRot = part.GetWorldRotation(); | ||
601 | |||
602 | Vector3 size = part.Scale * worldRot; | ||
603 | |||
604 | // 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); | ||
605 | // count++; | ||
606 | |||
607 | float tx= worldPos.X +( size.X/2); | ||
608 | float bx = worldPos.X - (size.X/2); | ||
609 | if (tx > maxX) | ||
610 | maxX = tx; | ||
611 | if (bx < minX) | ||
612 | minX = bx; | ||
613 | |||
614 | float ty = worldPos.Y + (size.Y / 2); | ||
615 | float by = worldPos.Y - (size.Y / 2); | ||
616 | if (ty > maxY) | ||
617 | maxY = ty; | ||
618 | if (by < minY) | ||
619 | minY = by; | ||
620 | |||
621 | float tz = worldPos.Z + (size.Z / 2); | ||
622 | float bz = worldPos.Z - (size.Z / 2); | ||
623 | if (tz > maxZ) | ||
624 | maxZ = tz; | ||
625 | if (bz < minZ) | ||
626 | minZ = bz; | ||
627 | |||
628 | } | ||
629 | |||
630 | } | ||
631 | |||
632 | Vector3 boundingBox = new Vector3(maxX - minX, maxY - minY, maxZ - minZ); | ||
633 | //m_log.InfoFormat("BoundingBox is {0} , {1} , {2} ", boundingBox.X, boundingBox.Y, boundingBox.Z); | ||
634 | return boundingBox; | ||
635 | } | ||
636 | |||
584 | #endregion | 637 | #endregion |
585 | 638 | ||
586 | public void SaveScriptedState(XmlTextWriter writer) | 639 | public void SaveScriptedState(XmlTextWriter writer) |