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:
parent
41ce7807a6
commit
631067e559
|
@ -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},
|
||||
};
|
||||
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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},
|
||||
};
|
||||
|
||||
|
|
|
@ -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},
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue