Modifiers: port Remesh from DerivedMesh to Mesh

D3331 by @alikendarfen
This commit is contained in:
2018-05-12 09:31:44 +02:00
parent df2de43459
commit dcc55c89fa

View File

@@ -30,15 +30,15 @@
#include "BLI_math_vector.h"
#include "BLI_utildefines.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_DerivedMesh.h"
#include "DNA_meshdata_types.h"
#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
#include "DNA_mesh_types.h"
#include "MOD_modifiertypes.h"
#include "BKE_mesh.h"
#include <assert.h>
#include <stdlib.h>
#include <string.h>
@@ -61,28 +61,30 @@ static void initData(ModifierData *md)
#ifdef WITH_MOD_REMESH
static void init_dualcon_mesh(DualConInput *mesh, DerivedMesh *dm)
static void init_dualcon_mesh(DualConInput *input, Mesh *mesh)
{
memset(mesh, 0, sizeof(DualConInput));
memset(input, 0, sizeof(DualConInput));
mesh->co = (void *)dm->getVertArray(dm);
mesh->co_stride = sizeof(MVert);
mesh->totco = dm->getNumVerts(dm);
input->co = (void *)mesh->mvert;
input->co_stride = sizeof(MVert);
input->totco = mesh->totvert;
mesh->mloop = (void *)dm->getLoopArray(dm);
mesh->loop_stride = sizeof(MLoop);
mesh->looptri = (void *)dm->getLoopTriArray(dm);
mesh->tri_stride = sizeof(MLoopTri);
mesh->tottri = dm->getNumLoopTri(dm);
input->mloop = (void *)mesh->mloop;
input->loop_stride = sizeof(MLoop);
INIT_MINMAX(mesh->min, mesh->max);
dm->getMinMax(dm, mesh->min, mesh->max);
BKE_mesh_runtime_looptri_ensure(mesh);
input->looptri = (void *)mesh->runtime.looptris.array;
input->tri_stride = sizeof(MLoopTri);
input->tottri = mesh->runtime.looptris.len;
INIT_MINMAX(input->min, input->max);
BKE_mesh_minmax(mesh, input->min, input->max);
}
/* simple structure to hold the output: a CDDM and two counters to
* keep track of the current elements */
typedef struct {
DerivedMesh *dm;
Mesh *mesh;
int curvert, curface;
} DualConOutput;
@@ -97,33 +99,33 @@ static void *dualcon_alloc_output(int totvert, int totquad)
return NULL;
}
output->dm = CDDM_new(totvert, 0, 0, 4 * totquad, totquad);
output->mesh = BKE_mesh_new_nomain(totvert, 0, 0, 4 * totquad, totquad);
return output;
}
static void dualcon_add_vert(void *output_v, const float co[3])
{
DualConOutput *output = output_v;
DerivedMesh *dm = output->dm;
Mesh *mesh = output->mesh;
assert(output->curvert < dm->getNumVerts(dm));
assert(output->curvert < mesh->totvert);
copy_v3_v3(CDDM_get_verts(dm)[output->curvert].co, co);
copy_v3_v3(mesh->mvert[output->curvert].co, co);
output->curvert++;
}
static void dualcon_add_quad(void *output_v, const int vert_indices[4])
{
DualConOutput *output = output_v;
DerivedMesh *dm = output->dm;
Mesh *mesh = output->mesh;
MLoop *mloop;
MPoly *cur_poly;
int i;
assert(output->curface < dm->getNumPolys(dm));
assert(output->curface < mesh->totpoly);
mloop = CDDM_get_loops(dm);
cur_poly = CDDM_get_poly(dm, output->curface);
mloop = mesh->mloop;
cur_poly = &mesh->mpoly[output->curface];
cur_poly->loopstart = output->curface * 4;
cur_poly->totloop = 4;
@@ -133,21 +135,21 @@ static void dualcon_add_quad(void *output_v, const int vert_indices[4])
output->curface++;
}
static DerivedMesh *applyModifier(
static Mesh *applyModifier(
ModifierData *md,
const ModifierEvalContext *UNUSED(ctx),
DerivedMesh *dm)
Mesh *mesh)
{
RemeshModifierData *rmd;
DualConOutput *output;
DualConInput input;
DerivedMesh *result;
Mesh *result;
DualConFlags flags = 0;
DualConMode mode = 0;
rmd = (RemeshModifierData *)md;
init_dualcon_mesh(&input, dm);
init_dualcon_mesh(&input, mesh);
if (rmd->flag & MOD_REMESH_FLOOD_FILL)
flags |= DUALCON_FLOOD_FILL;
@@ -174,12 +176,12 @@ static DerivedMesh *applyModifier(
rmd->hermite_num,
rmd->scale,
rmd->depth);
result = output->dm;
result = output->mesh;
MEM_freeN(output);
if (rmd->flag & MOD_REMESH_SMOOTH_SHADING) {
MPoly *mpoly = CDDM_get_polys(result);
int i, totpoly = result->getNumPolys(result);
MPoly *mpoly = result->mpoly;
int i, totpoly = result->totpoly;
/* Apply smooth shading to output faces */
for (i = 0; i < totpoly; i++) {
@@ -187,19 +189,19 @@ static DerivedMesh *applyModifier(
}
}
CDDM_calc_edges(result);
result->dirty |= DM_DIRTY_NORMALS;
BKE_mesh_calc_edges(result, true, false);
result->runtime.cd_dirty_vert |= CD_MASK_NORMAL;
return result;
}
#else /* !WITH_MOD_REMESH */
static DerivedMesh *applyModifier(
static Mesh *applyModifier(
ModifierData *UNUSED(md),
const ModifierEvalContext *UNUSED(ctx),
DerivedMesh *derivedData)
Mesh *mesh)
{
return derivedData;
return mesh;
}
#endif /* !WITH_MOD_REMESH */
@@ -219,14 +221,14 @@ ModifierTypeInfo modifierType_Remesh = {
/* 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,