A global bounding box function for LSL/slua.
Lone Wanderer
The current llGetBoundingBox function returns the bounding box with the root objects axes being used to define it. A globally based one in region co-ordinates could be useful. I've just had to put a function together to achieve this to find suitable co-ordinates for a llTriggerSoundLimited call.
list GetGlobalBoundingBoxFromKey(key targetKey) {
list info = llGetObjectDetails(targetKey, [OBJECT_POS, OBJECT_ROT]);
list bbox = llGetBoundingBox(targetKey);
if (llGetListLength(info) != 2 || llGetListLength(bbox) != 2) {
// Invalid input
return [];
}
vector rootPos = llList2Vector(info, 0);
rotation rootRot = llList2Rot(info, 1);
vector localMin = llList2Vector(bbox, 0);
vector localMax = llList2Vector(bbox, 1);
list corners = [
<localMin.x, localMin.y, localMin.z>,
<localMin.x, localMin.y, localMax.z>,
<localMin.x, localMax.y, localMin.z>,
<localMin.x, localMax.y, localMax.z>,
<localMax.x, localMin.y, localMin.z>,
<localMax.x, localMin.y, localMax.z>,
<localMax.x, localMax.y, localMin.z>,
<localMax.x, localMax.y, localMax.z>
];
vector globalMin = <255.0, 255.0, 4096.0>;
vector globalMax = <0.0, 0.0, 0.0>;
integer i;
for (i = 0; i < 8; ++i) {
vector localCorner = llList2Vector(corners, i);
vector worldCorner = localCorner * rootRot + rootPos;
if (worldCorner.x < globalMin.x) globalMin.x = worldCorner.x;
if (worldCorner.y < globalMin.y) globalMin.y = worldCorner.y;
if (worldCorner.z < globalMin.z) globalMin.z = worldCorner.z;
if (worldCorner.x > globalMax.x) globalMax.x = worldCorner.x;
if (worldCorner.y > globalMax.y) globalMax.y = worldCorner.y;
if (worldCorner.z > globalMax.z) globalMax.z = worldCorner.z;
}
return [globalMin, globalMax];
Log In