void LLVOTree::setPixelAreaAndAngle(LLAgent &agent) { // First calculate values as for any other object (for mAppAngle) LLViewerObject::setPixelAreaAndAngle(agent); // Re-calculate mPixelArea accurately // This should be the camera's center, as soon as we move to all region-local. LLVector3 relative_position = getPositionAgent() - agent.getCameraPositionAgent(); F32 range = relative_position.length(); // ugh, square root 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()) * range); mPixelArea = (pixels_per_meter) * (pixels_per_meter) * area; #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 }
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 }