Modifier stack: move Edge Split to new Mesh-based system.

This commit is contained in:
Bastien Montagne
2018-05-07 12:26:42 +02:00
parent 4e2125e967
commit 2496c08c39

View File

@@ -41,26 +41,37 @@
#include "BLI_math.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_library.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
#include "bmesh.h"
#include "bmesh_tools.h"
#include "DNA_mesh_types.h"
#include "DNA_object_types.h"
#include "MOD_modifiertypes.h"
static DerivedMesh *doEdgeSplit(DerivedMesh *dm, EdgeSplitModifierData *emd)
static Mesh *doEdgeSplit(Mesh *mesh, EdgeSplitModifierData *emd, const ModifierEvalContext *ctx)
{
DerivedMesh *result;
Mesh *result;
BMesh *bm;
BMIter iter;
BMEdge *e;
float threshold = cosf(emd->split_angle + 0.000000175f);
const bool calc_face_normals = (emd->flags & MOD_EDGESPLIT_FROMANGLE) != 0;
bm = DM_to_bmesh(dm, calc_face_normals);
bm = BKE_mesh_to_bmesh_ex(
mesh,
&(struct BMeshCreateParams){0},
&(struct BMeshFromMeshParams){
.calc_face_normal = calc_face_normals,
.add_key_index = false,
.use_shapekey = true,
.active_shapekey = ctx->object->shapenr,
});
if (emd->flags & MOD_EDGESPLIT_FROMANGLE) {
BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
/* check for 1 edge having 2 face users */
@@ -78,7 +89,7 @@ static DerivedMesh *doEdgeSplit(DerivedMesh *dm, EdgeSplitModifierData *emd)
}
}
}
if (emd->flags & MOD_EDGESPLIT_FROMFLAG) {
BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
/* check for 2 or more edge users */
@@ -91,15 +102,16 @@ static DerivedMesh *doEdgeSplit(DerivedMesh *dm, EdgeSplitModifierData *emd)
}
}
}
BM_mesh_edgesplit(bm, false, true, false);
/* BM_mesh_validate(bm); */ /* for troubleshooting */
result = CDDM_from_bmesh(bm, true);
result = BKE_id_new_nomain(ID_ME, mesh->id.name);
BM_mesh_bm_to_me(bm, result, &((struct BMeshToMeshParams){0}));
BM_mesh_free(bm);
result->dirty |= DM_DIRTY_NORMALS;
result->runtime.cd_dirty_vert |= CD_MASK_NORMAL;
return result;
}
@@ -121,16 +133,17 @@ static void copyData(ModifierData *md, ModifierData *target)
modifier_copyData_generic(md, target);
}
static DerivedMesh *applyModifier(ModifierData *md, const ModifierEvalContext *UNUSED(ctx),
DerivedMesh *dm)
static Mesh *applyModifier(ModifierData *md,
const ModifierEvalContext *ctx,
Mesh *mesh)
{
DerivedMesh *result;
Mesh *result;
EdgeSplitModifierData *emd = (EdgeSplitModifierData *) md;
if (!(emd->flags & (MOD_EDGESPLIT_FROMANGLE | MOD_EDGESPLIT_FROMFLAG)))
return dm;
return mesh;
result = doEdgeSplit(dm, emd);
result = doEdgeSplit(mesh, emd, ctx);
return result;
}
@@ -153,14 +166,14 @@ ModifierTypeInfo modifierType_EdgeSplit = {
/* deformMatrices_DM */ NULL,
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ applyModifier,
/* applyModifier_DM */ NULL,
/* applyModifierEM_DM */NULL,
/* deformVerts */ NULL,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ NULL,
/* applyModifier */ applyModifier,
/* applyModifierEM */ NULL,
/* initData */ initData,