官术网_书友最值得收藏!

4.4.2 Culling模塊

Culling是對(duì)模型進(jìn)行裁剪的工具類,大都用在Mask(遮罩)上,只有Mask才有裁剪的需求。

如圖4-4所示,文件夾中包含四個(gè)文件,其中一個(gè)是靜態(tài)類,一個(gè)是接口類。

圖4-4 Culling模塊的文件夾結(jié)構(gòu)

Clipping類中有兩個(gè)函數(shù)比較重要,常被用在Mask的裁剪上,其源代碼如下:


public static Rect FindCullAndClipWorldRect(List<RectMask2D>rectMaskParents, 
    out bool validRect)
{
    if (rectMaskParents.Count == 0)
    {
        validRect = false;
        return new Rect();
    }
    var compoundRect = rectMaskParents[0].canvasRect;
    for (var i = 0; i<rectMaskParents.Count; ++i)
        compoundRect = RectIntersect(compoundRect, rectMaskParents[i].canvasRect);
    var cull = compoundRect.width<= 0 || compoundRect.height<= 0;
    if (cull)
    {
        validRect = false;
        return new Rect();
    }
    Vector3 point1 = new Vector3(compoundRect.x, compoundRect.y, 0.0f);
    Vector3 point2 = new Vector3(compoundRect.x + compoundRect.width, 
        compoundRect.y + compoundRect.height, 0.0f);
    validRect = true;
    return new Rect(point1.x, point1.y, point2.x - point1.x, point2.y - point1.y);
}
private static Rect RectIntersect(Rect a, Rect b)
{
    float xMin = Mathf.Max(a.x, b.x);
    float xMax = Mathf.Min(a.x + a.width, b.x + b.width);
    float yMin = Mathf.Max(a.y, b.y);
    float yMax = Mathf.Min(a.y + a.height, b.y + b.height);
    if (xMax>= xMin && yMax>= yMin)
        return new Rect(xMin, yMin, xMax - xMin, yMax - yMin);
    return new Rect(0f, 0f, 0f, 0f);
}

上述代碼中的函數(shù)為Clipping類里的函數(shù),第一個(gè)函數(shù)FindCullAndClipWorldRect()的含義是計(jì)算RectMask2D重疊部分的區(qū)域。第二個(gè)函數(shù)RectIntersect()為第一個(gè)函數(shù)提供計(jì)算服務(wù),其含義是計(jì)算兩個(gè)矩陣的重疊部分。

這兩個(gè)函數(shù)都是靜態(tài)函數(shù),也可視為工具函數(shù),直接調(diào)用即可,不需要實(shí)例化。

主站蜘蛛池模板: 邹城市| 威信县| 华池县| 澄迈县| 广饶县| 花垣县| 临夏县| 且末县| 镇原县| 恭城| 龙游县| 修水县| 香港| 博白县| 海宁市| 伊宁市| 南召县| 武安市| 资中县| 怀来县| 临沂市| 琼海市| 云霄县| 隆德县| 溆浦县| 札达县| 呼和浩特市| 潮安县| 秦安县| 延庆县| 柘城县| 江北区| 仁布县| 卓尼县| 阿合奇县| 桓台县| 衡东县| 台湾省| 宁夏| 湖南省| 沐川县|