将多个几何与Direct2D组合在一起

时间:2015-03-21 16:02:45

标签: c++ geometry directx direct2d

当尝试使用Direct2D创建指南针时,我面临着组合72条单独线条的挑战。我的问题是:如何组合相对较多的ID2D1PathGeometries?

1 个答案:

答案 0 :(得分:3)

在Direct2D一次只能组合两个几何体的能力令人失望之后,我决定开始创建一种组合多种模块化的方式。

由于Direct2D DOES提供“CombineWithGeometry”功能,因此该功能仅管理该功能以及临时资源,以创建最终几何体。

一些注意事项:此函数相当昂贵,因此不应在帧渲染期间运行,而是在可能之前运行,并且应该缓存结果。此版本仅支持路径几何,但是,添加对其他几何的支持很容易,只需更改参数中的几何类型。

不用多说,这是函数:

ID2D1PathGeometry* combine_multiple_path_geometries(ID2D1Factory*& srcfactory, int geo_count, ID2D1PathGeometry* geos[]) {
    ID2D1PathGeometry* path_geo_1 = NULL;
    ID2D1PathGeometry* path_geo_2 = NULL;

    srcfactory->CreatePathGeometry(&path_geo_1);
    srcfactory->CreatePathGeometry(&path_geo_2);

    for (short i = 0; i < geo_count; i++) {

        ID2D1GeometrySink* cmpl_s1 = NULL;
        ID2D1GeometrySink* cmpl_s2 = NULL;

        if (i % 2 == 0) {
            //copying into 1
            path_geo_1->Open(&cmpl_s1);

            if (i == 0)
                geos[i]->CombineWithGeometry(geos[i], D2D1_COMBINE_MODE_UNION, NULL, cmpl_s1);
            else
                geos[i]->CombineWithGeometry(path_geo_2, D2D1_COMBINE_MODE_UNION, NULL, NULL, cmpl_s1);

            cmpl_s1->Close();
            cmpl_s1->Release();
            if (i != 0) {
                path_geo_2->Release();
                srcfactory->CreatePathGeometry(&path_geo_2);
            }
            //cmpl_g1 now contains the geometry so far              
        }
        else {
            //copying into 2
            path_geo_2->Open(&cmpl_s2);

            geos[i]->CombineWithGeometry(path_geo_1, D2D1_COMBINE_MODE_UNION, NULL, cmpl_s2);

            cmpl_s2->Close();
            cmpl_s2->Release();
            path_geo_1->Release();
            srcfactory->CreatePathGeometry(&path_geo_1);
            //cmpl_g2 now contains the geometry so far              
        }
    }

    if (geo_count % 2 == 0) {
        if (path_geo_1)
            path_geo_1->Release();
        return path_geo_2;
    }
    else {
        if (path_geo_2)
            path_geo_2->Release();
        return path_geo_1;
    }
}

你可以将它包装成一个类,保持独立,或者你认为合适。如前所述,您可以轻松支持不同的几何类型,或者,即使只需稍微调整一下,也可以支持多种几何类型。同样,只需将D2D1_COMBINE_MODE_UNION更改为您需要的任何内容,即可轻松地从联合更改组合模式。

MSDN - Direct2D几何组合模式:https://msdn.microsoft.com/en-us/library/windows/desktop/dd368083%28v=vs.85%29.aspx

MSDN - Direct2D几何图形:https://msdn.microsoft.com/en-us/library/windows/desktop/dd756653%28v=vs.85%29.aspx

MSDN - Direct2D几何组合:https://msdn.microsoft.com/en-us/library/windows/desktop/dd756676%28v=vs.85%29.aspx