2012.11.30

1.CEGUI如何把一个按钮图片画到屏幕上的

今天大致看懂CEGUI如何把一个按钮图片画到屏幕上的啦,细节还有很多没整明白,就说个大概吧。首先要讲清楚,从DX的角度出发,用户要把一个按钮图片画到屏幕,到底是干了什么,其实很简单,就是把一个四边形面片提交给DX,然后让DX画,这个四边形面片包含以下信息:

(1)面片对应的纹理;

(2)面片的4个角在该纹理中的纹理坐标;

(3)面片绘制在屏幕(如果是缓存到纹理,例如CEGUI中FrameWIndow的子控件包括它自己都缓存到一张新建的纹理)上后,它左上角的坐标,以及它的高和宽。


CEGUI的把纹理封装成ImageSet对象,按钮图片就是里面的一个区块,这个区块的信息通过Image对象封装。如果在layout文件中没有特别指定按钮图片,那么按钮图片就是从LookNFeel文件中取得,取得的过程比较复杂,有好几层封装,这里先不说,暂时就简单地理解为现在知道了按钮图片所在的纹理,以及它在纹理中的位置,也就是知道了它的纹理坐标。

比较难理解的是对于按钮面片的左上角坐标和它的高宽的处理。这两部分信息,CEGUI是分别储存的。面片在内存中cache的时候,统一按照左上角在(0,0)点放置,它的左上角的真实坐标储存于在另外一个地方,当面片数据最终由内存提交到显存的时候,会首先将左上角的坐标通过设置世界坐标系变化矩阵的方式通知DX,然后再提交cache的面片数据,这种两步走的方式是有好处的,好处就是当按钮的位置移动的时候,cache的面片数据是不需要变得,只用重新设置左上角坐标就可以了,提高了效率。

按钮的高宽是在layout中设定的,这个很好取得。如果没有剪裁,那么按钮面片的4个角的纹理坐标就是是按钮图片的4个角在它所在纹理中的纹理坐标,但如果考虑剪裁,问题就有点麻烦了,要算出减去的高宽在原高宽所占的比例,然后利用该比例算出剪裁后面片的四个角的纹理坐标。

按钮左上角坐标的取得比较麻烦,在CEGUI中FrameWindow会被cache为一个四边形面片,这样的好处是,如果FrameWindow上的子控件没有变化,那么只是移动该FrameWindow时,cache的内容不需要改变。而按钮一般是属于一个FrameWindow的,所以按钮是不渲染到FrameWindow对应的cache纹理的,所以它的左上角坐标不是它在屏幕空中的坐标,而是它相对于整个FrameWindow的坐标,做法是通过getUnclippedOuterRect()获取按钮和FrameWindow的屏幕坐标,然后想减。



。。。有点受不了了,写得好烂,这问题根本都没写清楚,这种程序类的剖析该怎么写啊,我还想写个CEGUI的整体剖析的,应该要借助画图才可以。




2.系统如何知道鼠标当前在哪一个控件上面

除了GuiSheet,CEGUI中每一个控件都有几个父控件,所以这就形成了一颗以GUISheet为根节点的控件树。每个控件都保存了一个名为d_hitTestRect的Rect,它记录的是控件在屏幕坐标系中的位置和像素大小。需要查找鼠标在哪个控件上面的时候,只用遍历这棵控件树,查找到是哪一个d_hitTestRect包含鼠标屏幕坐标就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值