NGUI渲染组件基类:UIWidget
目录:NGUI源码学习
一、UIGeometry:保存了集合图形的顶点信息,包括顶点坐标、uv、颜色值信息,并提供了这些信息的获取方法。这些顶点信息最终会添加到所属UIWidget的UIDrawcall里。
UIGeometry:几何对象数据存储、获取 property: verts:顶点数组,正常是4个 uvs:纹理 cols:颜色 mRtpVerts:相对panel的顶点 mRtpNormal:相对panel的法线 mRtpTan:相对panel的切线 function: hasVertices:是否拥有顶点,有顶点才参与绘制 ApplyTransform:计算mRtpVerts、mRtpNormal、mRtpTan WriteToBuffers:获取mRtpVerts、uvs、cols、mRtpNormal、mRtpTan
二、UIWidget:坐标、透明度、大小的更新,在UIPanel调用。
UILabel、UITexture、UISprite的父类,提供了大部分组件都需要的一些字段,如width、height、depth、color、alpha等等,同时也有一些共同的方法,如较为重要的UpdateGeometry、UpdateTransform等。
UIWidget:UIRect property: mChanged:标记当前是否有修改,有修改则更新矩形 mMoved:标记当前位置是否有更改 geometry:几何信息,用来保存顶点,位置,顶点UV,顶点颜色等信息,一对一 drawCall:当前UIWidget所属的DC对象,一对多,一个DC可以包含多个Widget,但一个Widget只能有一个DC。 drawRegion:用来表示一个widget最后渲染的区域(而不改变widget本身的大小)。例如UIProgressBar进度条就是修改的drawRegion而不是width/height。 drawingDimensions:实际显示区域大小 width&height:get;set;宽高 color:get;set;颜色 mIsVisibleByPanel:panel是否可见 mIsVisibleByAlpha:parent是否可见 finalAlpha:最终的alpha值 pivot:get;set;锚点,立即生效,rawPivot是设置标记位mChanged depth:get;set;相对于父节Panel显示层级,会导致dc重建 raycastDepth:get;最终显示层级,(panel != null) ? mDepth + panel.depth * 1000 : mDepth;并不生效 localCorners/localCenter:get;显示矩形的四个角信息,顺序是:左下,左上,右上,右下 worldCorners/worldCenter:get;显示矩形的四个角信息 material:get;set;材质 mainTexture:get;材质球的贴图 shader:get;材质球的shader function: SetDimensions:修改矩形大小 GetSides:获取widget四个边的世界坐标 SetRect:设置矩形的位置、大小 CalculateBounds:bounds包围盒计算 SetDirty:标记需要更新矩形所属的DrawCall MarkAsChanged:更新矩形以及所属的DrwaCall OnAnchor:更新矩形大小、坐标,设置mChanged UpdateVisibility:更新是否可见 UpdateFinalAlpha:更新透明度 UpdateTransform:更新坐标变化 UpdateGeometry:更新geometry信息,调用OnFill OnFill:填充geometry,任何几何和渲染属性(比如锚点,大小,颜色,Alpha,位置)发生变化,都会导致这个方法被调用。 通常这个方法也是最消耗cpu的。 ConvertToTexCoords:sprite的x,y对应图集的左上角,这边转成(0,1)范围的以左下角起点、相对图集位置的uv点 LateUpdate-UpdateSelf-UpdateDrawCalls UpdateSelf-UpdateTransformMatrix-UpdateLayers-UpdateWidgets-FillAllDrawCalls-WriteToBuffers UpdateWidgets-UpdateTransform-UpdateVisibility-UpdateGeometry UpdateGeometry-OnFill-Fill
- 核心方法调用顺序:UpdateWidgets-UpdateTransform-UpdateVisibility-UpdateGeometry。在UIPanel的LateUpdate更新时调用。
- 坐标更新UpdateTransform:调用SetDimensions设置mMoved=true或trans.hasChanged=true时,会重新计算并更新左下、右上角的坐标mOldV0、mOldV1,并通知调用UpdateVisibility。
- alpha更新:分三步
- 计算widget的透明度:bool vis =(w.CalculateCumulativeAlpha(frame) > 0.001f);
- 计算widget是否被panel裁剪:UIPanel.IsVisible(w);
- 更新mIsVisibleByAlpha、mIsVisibleByPanel状态。
- geometry更新:
- 如果透明度和显示状态变化,调用子类实现的OnFill方法填充geometry。
- 调用geometry.ApplyTransform转换顶点坐标。
- 如果mMoved或mChanged(移动、显示状态变化)为true,通知所属的drawCall更新自己。
一直想把之前工作、学习时记录的文档整理到博客上,一方面温故而知新,一方面和大家一起学习 -程序小白