void LLViewerMediaFocus::focusZoomOnMedia(LLUUID media_id) { LLViewerMediaImpl* impl = LLViewerMedia::getMediaImplFromTextureID(media_id); if(impl) { // Get the first object from the media impl's object list. This is completely arbitrary, but should suffice. LLVOVolume *obj = impl->getSomeObject(); if(obj) { // This media is attached to at least one object. Figure out which face it's on. S32 face = obj->getFaceIndexWithMediaImpl(impl, -1); // We don't have a proper pick normal here, and finding a face's real normal is... complicated. LLVector3 normal = obj->getApproximateFaceNormal(face); if(normal.isNull()) { // If that didn't work, use the inverse of the camera "look at" axis, which should keep the camera pointed in the same direction. // llinfos << "approximate face normal invalid, using camera direction." << llendl; normal = LLViewerCamera::getInstance()->getAtAxis(); normal *= (F32)-1.0f; } // Attempt to focus/zoom on that face. setFocusFace(obj, face, impl, normal); if(mMediaControls.get()) { mMediaControls.get()->resetZoomLevel(); mMediaControls.get()->nextZoomLevel(); } } } }
U32 linesegment_box(const LLVector3 &point_a, const LLVector3 &point_b, const LLVector3 &box_center, const LLVector3 &box_scale, const LLQuaternion &box_rotation, LLVector3 &intersection, LLVector3 &intersection_normal) { LLVector3 direction = point_b - point_a; if (direction.isNull()) { return NO_SIDE; } F32 segment_length = direction.normVec(); U32 box_side = ray_box(point_a, direction, box_center, box_scale, box_rotation, intersection, intersection_normal); if (NO_SIDE == box_side || segment_length < (intersection - point_a).magVec()) { return NO_SIDE; } return box_side; }