第二人生的源码分析(八十五)LLView实现OpenGL窗口显示

由于 OpenGL只是负责显示3D的内容,并没有相应的UI实现,因此第二人生里就采用类LLView来实现一个窗口的显示,在这个窗口里可以显示任何其它的窗口,达到递归显示窗口的内容。下面就来仔细地分析它的显示函数,如下:
#001 void LLView::draw()
#002 {
 
如果设置调试窗口显示,就显示调试窗口。
#003     if (sDebugRects)
#004     {
#005         drawDebugRect();
#006 
#007         // Check for bogus rectangle
#008         if (getRect().mRight <= getRect().mLeft
#009             || getRect().mTop <= getRect().mBottom)
#010         {
#011             llwarns << "Bogus rectangle for " << getName() << " with " << mRect << llendl;
#012         }
#013     }
#014 
 
获取根窗口拥有的窗口大小。
#015     LLRect rootRect = getRootView()->getRect();
#016     LLRect screenRect;
#017 
 
查看这个窗口是否有输入焦点。
#018     // draw focused control on top of everything else
#019     LLView* focus_view = gFocusMgr.getKeyboardFocus();
#020     if (focus_view && focus_view->getParent() != this)
#021     {
#022         focus_view = NULL;
#023     }
#024 
 
开始显示所有子窗口, mChildList列表里保存了所有子窗口。
#025     ++sDepth;
#026     for (child_list_reverse_iter_t child_iter = mChildList.rbegin(); child_iter != mChildList.rend(); ++child_iter)
#027     {
#028         LLView *viewp = *child_iter;
#029 
 
窗口有可见属性,并且没有焦点的窗口显示。
#030         if (viewp->getVisible() && viewp != focus_view)
#031         {
#032             // Only draw views that are within the root view
 
获取仅能显示在根窗口里的大小。
#033             localRectToScreen(viewp->getRect(),&screenRect);
#034             if ( rootRect.rectInRect(&screenRect) )
#035             {
 
指明 OPENGL里当前矩阵是GL_MODELVIEW矩阵。
#036                 glMatrixMode(GL_MODELVIEW);
 
保存矩阵。
#037                 LLUI::pushMatrix();
#038                 {
 
开始显示窗口。
#039                     LLUI::translate((F32)viewp->getRect().mLeft, (F32)viewp->getRect().mBottom, 0.f);
#040                     viewp->draw();
#041                 }
 
恢复刚才的矩阵。
#042                 LLUI::popMatrix();
#043             }
#044         }
#045 
#046     }
#047     --sDepth;
#048 
 
显示有焦点输入的窗口。
#049     if (focus_view && focus_view->getVisible())
#050     {
#051         drawChild(focus_view);
#052     }
#053 
 
显示输出调试窗口。
#054     // HACK
#055     if (sEditingUI && this == sEditingUIView)
#056     {
#057         drawDebugRect();
#058     }
#059 }
 
在这个函数里,主要通过遍历子窗口列表,把所有窗口渲染到 OPENGL窗口里。
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

caimouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值