Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/modifiers/intern/MOD_triangulate.c')
-rw-r--r--source/blender/modifiers/intern/MOD_triangulate.c170
1 files changed, 84 insertions, 86 deletions
diff --git a/source/blender/modifiers/intern/MOD_triangulate.c b/source/blender/modifiers/intern/MOD_triangulate.c
index 0b4de9c8d17..7d890b29365 100644
--- a/source/blender/modifiers/intern/MOD_triangulate.c
+++ b/source/blender/modifiers/intern/MOD_triangulate.c
@@ -34,114 +34,112 @@
#include "MOD_modifiertypes.h"
-static Mesh *triangulate_mesh(Mesh *mesh, const int quad_method, const int ngon_method, const int min_vertices, const int flag)
+static Mesh *triangulate_mesh(Mesh *mesh,
+ const int quad_method,
+ const int ngon_method,
+ const int min_vertices,
+ const int flag)
{
- Mesh *result;
- BMesh *bm;
- int total_edges, i;
- MEdge *me;
- CustomData_MeshMasks cddata_masks = {.vmask = CD_MASK_ORIGINDEX, .emask = CD_MASK_ORIGINDEX, .pmask = CD_MASK_ORIGINDEX};
+ Mesh *result;
+ BMesh *bm;
+ int total_edges, i;
+ MEdge *me;
+ CustomData_MeshMasks cddata_masks = {
+ .vmask = CD_MASK_ORIGINDEX, .emask = CD_MASK_ORIGINDEX, .pmask = CD_MASK_ORIGINDEX};
- bool keep_clnors = (flag & MOD_TRIANGULATE_KEEP_CUSTOMLOOP_NORMALS) != 0;
+ bool keep_clnors = (flag & MOD_TRIANGULATE_KEEP_CUSTOMLOOP_NORMALS) != 0;
- if (keep_clnors) {
- BKE_mesh_calc_normals_split(mesh);
- /* We need that one to 'survive' to/from BMesh conversions. */
- CustomData_clear_layer_flag(&mesh->ldata, CD_NORMAL, CD_FLAG_TEMPORARY);
- cddata_masks.lmask |= CD_MASK_NORMAL;
- }
+ if (keep_clnors) {
+ BKE_mesh_calc_normals_split(mesh);
+ /* We need that one to 'survive' to/from BMesh conversions. */
+ CustomData_clear_layer_flag(&mesh->ldata, CD_NORMAL, CD_FLAG_TEMPORARY);
+ cddata_masks.lmask |= CD_MASK_NORMAL;
+ }
- bm = BKE_mesh_to_bmesh_ex(
- mesh,
- &((struct BMeshCreateParams){0}),
- &((struct BMeshFromMeshParams){
- .calc_face_normal = true,
- .cd_mask_extra = cddata_masks,
- }));
+ bm = BKE_mesh_to_bmesh_ex(mesh,
+ &((struct BMeshCreateParams){0}),
+ &((struct BMeshFromMeshParams){
+ .calc_face_normal = true,
+ .cd_mask_extra = cddata_masks,
+ }));
- BM_mesh_triangulate(bm, quad_method, ngon_method, min_vertices, false, NULL, NULL, NULL);
+ BM_mesh_triangulate(bm, quad_method, ngon_method, min_vertices, false, NULL, NULL, NULL);
- result = BKE_mesh_from_bmesh_for_eval_nomain(bm, &cddata_masks);
- BM_mesh_free(bm);
+ result = BKE_mesh_from_bmesh_for_eval_nomain(bm, &cddata_masks);
+ BM_mesh_free(bm);
+ if (keep_clnors) {
+ float(*lnors)[3] = CustomData_get_layer(&result->ldata, CD_NORMAL);
+ BLI_assert(lnors != NULL);
- if (keep_clnors) {
- float (*lnors)[3] = CustomData_get_layer(&result->ldata, CD_NORMAL);
- BLI_assert(lnors != NULL);
+ BKE_mesh_set_custom_normals(result, lnors);
- BKE_mesh_set_custom_normals(result, lnors);
+ /* Do some cleanup, we do not want those temp data to stay around. */
+ CustomData_set_layer_flag(&mesh->ldata, CD_NORMAL, CD_FLAG_TEMPORARY);
+ CustomData_set_layer_flag(&result->ldata, CD_NORMAL, CD_FLAG_TEMPORARY);
+ }
- /* Do some cleanup, we do not want those temp data to stay around. */
- CustomData_set_layer_flag(&mesh->ldata, CD_NORMAL, CD_FLAG_TEMPORARY);
- CustomData_set_layer_flag(&result->ldata, CD_NORMAL, CD_FLAG_TEMPORARY);
- }
+ total_edges = result->totedge;
+ me = result->medge;
- total_edges = result->totedge;
- me = result->medge;
+ /* force drawing of all edges (seems to be omitted in CDDM_from_bmesh) */
+ for (i = 0; i < total_edges; i++, me++) {
+ me->flag |= ME_EDGEDRAW | ME_EDGERENDER;
+ }
- /* force drawing of all edges (seems to be omitted in CDDM_from_bmesh) */
- for (i = 0; i < total_edges; i++, me++) {
- me->flag |= ME_EDGEDRAW | ME_EDGERENDER;
- }
+ result->runtime.cd_dirty_vert |= CD_MASK_NORMAL;
- result->runtime.cd_dirty_vert |= CD_MASK_NORMAL;
-
- return result;
+ return result;
}
-
static void initData(ModifierData *md)
{
- TriangulateModifierData *tmd = (TriangulateModifierData *)md;
+ TriangulateModifierData *tmd = (TriangulateModifierData *)md;
- /* Enable in editmode by default */
- md->mode |= eModifierMode_Editmode;
- tmd->quad_method = MOD_TRIANGULATE_QUAD_SHORTEDGE;
- tmd->ngon_method = MOD_TRIANGULATE_NGON_BEAUTY;
- tmd->min_vertices = 4;
+ /* Enable in editmode by default */
+ md->mode |= eModifierMode_Editmode;
+ tmd->quad_method = MOD_TRIANGULATE_QUAD_SHORTEDGE;
+ tmd->ngon_method = MOD_TRIANGULATE_NGON_BEAUTY;
+ tmd->min_vertices = 4;
}
-static Mesh *applyModifier(
- ModifierData *md,
- const ModifierEvalContext *UNUSED(ctx),
- Mesh *mesh)
+static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *UNUSED(ctx), Mesh *mesh)
{
- TriangulateModifierData *tmd = (TriangulateModifierData *)md;
- Mesh *result;
- if (!(result = triangulate_mesh(mesh, tmd->quad_method, tmd->ngon_method, tmd->min_vertices, tmd->flag))) {
- return mesh;
- }
-
- return result;
+ TriangulateModifierData *tmd = (TriangulateModifierData *)md;
+ Mesh *result;
+ if (!(result = triangulate_mesh(
+ mesh, tmd->quad_method, tmd->ngon_method, tmd->min_vertices, tmd->flag))) {
+ return mesh;
+ }
+
+ return result;
}
ModifierTypeInfo modifierType_Triangulate = {
- /* name */ "Triangulate",
- /* structName */ "TriangulateModifierData",
- /* structSize */ sizeof(TriangulateModifierData),
- /* type */ eModifierTypeType_Constructive,
- /* flags */ eModifierTypeFlag_AcceptsMesh |
- eModifierTypeFlag_SupportsEditmode |
- eModifierTypeFlag_SupportsMapping |
- eModifierTypeFlag_EnableInEditmode |
- eModifierTypeFlag_AcceptsCVs,
-
- /* copyData */ modifier_copyData_generic,
-
- /* deformVerts */ NULL,
- /* deformMatrices */ NULL,
- /* deformVertsEM */ NULL,
- /* deformMatricesEM */ NULL,
- /* applyModifier */ applyModifier,
-
- /* initData */ initData,
- /* requiredDataMask */ NULL, //requiredDataMask,
- /* freeData */ NULL,
- /* isDisabled */ NULL,
- /* updateDepsgraph */ NULL,
- /* dependsOnTime */ NULL,
- /* dependsOnNormals */ NULL,
- /* foreachObjectLink */ NULL,
- /* foreachIDLink */ NULL,
- /* freeRuntimeData */ NULL,
+ /* name */ "Triangulate",
+ /* structName */ "TriangulateModifierData",
+ /* structSize */ sizeof(TriangulateModifierData),
+ /* type */ eModifierTypeType_Constructive,
+ /* flags */ eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_SupportsEditmode |
+ eModifierTypeFlag_SupportsMapping | eModifierTypeFlag_EnableInEditmode |
+ eModifierTypeFlag_AcceptsCVs,
+
+ /* copyData */ modifier_copyData_generic,
+
+ /* deformVerts */ NULL,
+ /* deformMatrices */ NULL,
+ /* deformVertsEM */ NULL,
+ /* deformMatricesEM */ NULL,
+ /* applyModifier */ applyModifier,
+
+ /* initData */ initData,
+ /* requiredDataMask */ NULL, //requiredDataMask,
+ /* freeData */ NULL,
+ /* isDisabled */ NULL,
+ /* updateDepsgraph */ NULL,
+ /* dependsOnTime */ NULL,
+ /* dependsOnNormals */ NULL,
+ /* foreachObjectLink */ NULL,
+ /* foreachIDLink */ NULL,
+ /* freeRuntimeData */ NULL,
};