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