Add support for a longest diagonal quad triangulation mode

The new triangulation mode for quads is the opposite of the current default
shortest diagonal mode. It is optimal for cloth simulations using quad meshes.

Differential Revision: http://developer.blender.org/D13777
This commit is contained in:
Henrik Dick 2022-01-11 18:49:08 +01:00
parent 41ce7807a6
commit 631067e559
6 changed files with 22 additions and 2 deletions

View File

@ -1186,6 +1186,7 @@ static BMO_FlagSet bmo_enum_triangulate_quad_method[] = {
{MOD_TRIANGULATE_QUAD_FIXED, "FIXED"},
{MOD_TRIANGULATE_QUAD_ALTERNATE, "ALTERNATE"},
{MOD_TRIANGULATE_QUAD_SHORTEDGE, "SHORT_EDGE"},
{MOD_TRIANGULATE_QUAD_LONGEDGE, "LONG_EDGE"},
{0, NULL},
};

View File

@ -1007,6 +1007,7 @@ void BM_face_triangulate(BMesh *bm,
break;
}
case MOD_TRIANGULATE_QUAD_SHORTEDGE:
case MOD_TRIANGULATE_QUAD_LONGEDGE:
case MOD_TRIANGULATE_QUAD_BEAUTY:
default: {
BMLoop *l_v3, *l_v4;
@ -1023,6 +1024,12 @@ void BM_face_triangulate(BMesh *bm,
d2 = len_squared_v3v3(l_v1->v->co, l_v3->v->co);
split_24 = ((d2 - d1) > 0.0f);
}
else if (quad_method == MOD_TRIANGULATE_QUAD_LONGEDGE) {
float d1, d2;
d1 = len_squared_v3v3(l_v4->v->co, l_v2->v->co);
d2 = len_squared_v3v3(l_v1->v->co, l_v3->v->co);
split_24 = ((d2 - d1) < 0.0f);
}
else {
/* first check if the quad is concave on either diagonal */
const int flip_flag = is_quad_flip_v3(

View File

@ -1852,6 +1852,7 @@ enum {
MOD_TRIANGULATE_QUAD_FIXED = 1,
MOD_TRIANGULATE_QUAD_ALTERNATE = 2,
MOD_TRIANGULATE_QUAD_SHORTEDGE = 3,
MOD_TRIANGULATE_QUAD_LONGEDGE = 4,
};
typedef struct LaplacianSmoothModifierData {

View File

@ -2118,6 +2118,7 @@ typedef enum GeometryNodeTriangulateQuads {
GEO_NODE_TRIANGULATE_QUAD_FIXED = 1,
GEO_NODE_TRIANGULATE_QUAD_ALTERNATE = 2,
GEO_NODE_TRIANGULATE_QUAD_SHORTEDGE = 3,
GEO_NODE_TRIANGULATE_QUAD_LONGEDGE = 4,
} GeometryNodeTriangulateQuads;
typedef enum GeometryNodePointInstanceType {

View File

@ -331,7 +331,12 @@ const EnumPropertyItem rna_enum_modifier_triangulate_quad_method_items[] = {
"SHORTEST_DIAGONAL",
0,
"Shortest Diagonal",
"Split the quads based on the distance between the vertices"},
"Split the quads along their shortest diagonal"},
{MOD_TRIANGULATE_QUAD_LONGEDGE,
"LONGEST_DIAGONAL",
0,
"Longest Diagonal",
"Split the quads along their longest diagonal"},
{0, NULL, 0, NULL, NULL},
};

View File

@ -9488,7 +9488,12 @@ static void def_geo_triangulate(StructRNA *srna)
"SHORTEST_DIAGONAL",
0,
"Shortest Diagonal",
"Split the quads based on the distance between the vertices"},
"Split the quads along their shortest diagonal"},
{GEO_NODE_TRIANGULATE_QUAD_LONGEDGE,
"LONGEST_DIAGONAL",
0,
"Longest Diagonal",
"Split the quads along their longest diagonal"},
{0, NULL, 0, NULL, NULL},
};