void LLVOTree::setPixelAreaAndAngle(LLAgent &agent) { LLVector3 center = getPositionAgent();//center of tree. LLVector3 viewer_pos_agent = gAgent.getCameraPositionAgent(); LLVector3 lookAt = center - viewer_pos_agent; F32 dist = lookAt.normVec() ; F32 cos_angle_to_view_dir = lookAt * LLViewerCamera::getInstance()->getXAxis() ; F32 range = dist - getMinScale()/2; if (range < F_ALMOST_ZERO) // range == zero { range = 0; mAppAngle = 180.f; } else { mAppAngle = (F32) atan2( getMaxScale(), range) * RAD_TO_DEG; } F32 max_scale = mBillboardScale * getMaxScale(); F32 area = max_scale * (max_scale*mBillboardRatio); // Compute pixels per meter at the given range F32 pixels_per_meter = LLViewerCamera::getInstance()->getViewHeightInPixels() / (tan(LLViewerCamera::getInstance()->getView()) * dist); mPixelArea = pixels_per_meter * pixels_per_meter * area ; F32 importance = LLFace::calcImportanceToCamera(cos_angle_to_view_dir, dist) ; mPixelArea = LLFace::adjustPixelArea(importance, mPixelArea) ; if (mPixelArea > LLViewerCamera::getInstance()->getScreenPixelArea()) { mAppAngle = 180.f; } #if 0 // mAppAngle is a bit of voodoo; // use the one calculated LLViewerObject::setPixelAreaAndAngle above // to avoid LOD miscalculations mAppAngle = (F32) atan2( max_scale, range) * RAD_TO_DEG; #endif }
//////////////////////////////////////////////////////////////////////// // // Description: // This routine sets the limitBox. // The limit box is defined in a space aligned and scaled as // LOCAL space, but with it's center remaining fixed in WORLD // space. // // Use: static private // void SoDragPointDragger::updateLimitBoxAndFeedback() // //////////////////////////////////////////////////////////////////////// { // This gets called in the constructor, while the ref count is still 0. // Since there will be some ref'ing and unref'ing done inside here, // add a temporary ref and undo it at the end. ref(); if ( xFeedback.getValue() != oldXAxisNode || yFeedback.getValue() != oldYAxisNode || zFeedback.getValue() != oldZAxisNode ) { oldXAxisNode = SO_GET_ANY_PART(this,"xFeedback",SoSeparator); oldYAxisNode = SO_GET_ANY_PART(this,"yFeedback",SoSeparator); oldZAxisNode = SO_GET_ANY_PART(this,"zFeedback",SoSeparator); // Get the bounds of the axis parts. static SoGetBoundingBoxAction *bba = NULL; if (bba == NULL) bba = new SoGetBoundingBoxAction(getViewportRegion()); else bba->setViewportRegion(getViewportRegion()); float xMin, yMin, zMin, xMax, yMax, zMax; SbVec3f min, max; bba->apply(xFeedback.getValue()); bba->getBoundingBox().getBounds( xMin, yMin, zMin, xMax, yMax, zMax ); min[0] = xMin; max[0] = xMax; bba->apply(yFeedback.getValue()); bba->getBoundingBox().getBounds( xMin, yMin, zMin, xMax, yMax, zMax ); min[1] = yMin; max[1] = yMax; bba->apply(zFeedback.getValue()); bba->getBoundingBox().getBounds( xMin, yMin, zMin, xMax, yMax, zMax ); min[2] = zMin; max[2] = zMax; // The limit box is defined in a space aligned and scaled as // LOCAL space, but with it's center remaining fixed in WORLD // space. SbVec3f newDiag = (max - min) / 2.0; // Give a default size of 1, in case no axis parts exist. for (int i = 0; i < 3; i++) { if (newDiag[i] <= getMinScale()) newDiag[i] = 1.0; } SbVec3f oldDiag = limitBox.getMax() - limitBox.getCenter(); // If the size of the boundingBox has changed... if ( newDiag != oldDiag ) { // curEdit point needs to be the current origin expressed in world // space (i.e., this bizarro space). SbMatrix localToWorld = getLocalToWorldMatrix(); SbVec3f zeroPt(0,0,0); localToWorld.multVecMatrix( zeroPt, zeroPt ); limitBox.setBounds(zeroPt - newDiag, zeroPt + newDiag ); } } setFeedbackGeometry(); // undo the temporary ref. unrefNoDelete(); }