Todo #21831: Deform modifier is applied to base mesh instead of
multires modifier if both are in the stack (patch #21965) This patch also removes limitation of multires reshaping when destination object has got modifiers after multires modifier.
This commit is contained in:
@@ -35,6 +35,7 @@ struct Mesh;
|
||||
struct MFace;
|
||||
struct Multires;
|
||||
struct MultiresModifierData;
|
||||
struct ModifierData;
|
||||
struct Object;
|
||||
|
||||
void multires_mark_as_modified(struct Object *ob);
|
||||
@@ -46,11 +47,14 @@ struct DerivedMesh *multires_dm_create_from_derived(struct MultiresModifierData*
|
||||
int local_mmd, struct DerivedMesh*, struct Object *, int, int);
|
||||
|
||||
struct MultiresModifierData *find_multires_modifier(struct Object *ob);
|
||||
struct DerivedMesh *get_multires_dm(struct Object *ob);
|
||||
void multiresModifier_join(struct Object *);
|
||||
void multiresModifier_del_levels(struct MultiresModifierData *, struct Object *, int direction);
|
||||
void multiresModifier_subdivide(struct MultiresModifierData *mmd, struct Object *ob,
|
||||
int updateblock, int simple);
|
||||
int multiresModifier_reshape(struct MultiresModifierData *mmd, struct Object *dst, struct Object *src);
|
||||
int multiresModifier_reshapeFromDM(struct MultiresModifierData *mmd, struct Object *ob, struct DerivedMesh *srcdm);
|
||||
int multiresModifier_reshapeFromDeformMod(struct MultiresModifierData *mmd, struct Object *ob, struct ModifierData *md);
|
||||
|
||||
void multires_stitch_grids(struct Object *);
|
||||
|
||||
|
||||
@@ -60,6 +60,22 @@ static const int multires_side_tot[] = {0, 2, 3, 5, 9, 17, 33, 65, 129,
|
||||
static void multires_mvert_to_ss(DerivedMesh *dm, MVert *mvert);
|
||||
static void multiresModifier_disp_run(DerivedMesh *dm, Mesh *me, int invert, int add, DMGridData **oldGridData, int totlvl);
|
||||
|
||||
DerivedMesh *get_multires_dm(Object *ob)
|
||||
{
|
||||
Mesh *me= ob->data;
|
||||
ModifierData *md= (ModifierData *)find_multires_modifier(ob);
|
||||
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
|
||||
DerivedMesh *tdm = CDDM_from_mesh(me, ob);
|
||||
DerivedMesh *dm;
|
||||
|
||||
CDDM_calc_normals(tdm);
|
||||
dm = mti->applyModifier(md, ob, tdm, 0, 1);
|
||||
|
||||
if(tdm != dm) tdm->release(tdm);
|
||||
|
||||
return dm;
|
||||
}
|
||||
|
||||
MultiresModifierData *find_multires_modifier(Object *ob)
|
||||
{
|
||||
ModifierData *md;
|
||||
@@ -191,24 +207,64 @@ void multiresModifier_join(Object *ob)
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Returns 1 on success, 0 if the src's totvert doesn't match */
|
||||
int multiresModifier_reshape(MultiresModifierData *mmd, Object *dst, Object *src)
|
||||
int multiresModifier_reshapeFromDM(MultiresModifierData *mmd, Object *ob, DerivedMesh *srcdm)
|
||||
{
|
||||
DerivedMesh *srcdm = src->derivedFinal;
|
||||
DerivedMesh *mrdm = dst->derivedFinal;
|
||||
DerivedMesh *mrdm = get_multires_dm (ob);
|
||||
|
||||
if(mrdm && srcdm && mrdm->getNumVerts(mrdm) == srcdm->getNumVerts(srcdm)) {
|
||||
multires_mvert_to_ss(mrdm, srcdm->getVertArray(srcdm));
|
||||
|
||||
multires_dm_mark_as_modified(mrdm);
|
||||
multires_force_update(dst);
|
||||
multires_force_update(ob);
|
||||
|
||||
mrdm->release(mrdm);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
mrdm->release(mrdm);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Returns 1 on success, 0 if the src's totvert doesn't match */
|
||||
int multiresModifier_reshape(MultiresModifierData *mmd, Object *dst, Object *src)
|
||||
{
|
||||
DerivedMesh *srcdm = src->derivedFinal;
|
||||
return multiresModifier_reshapeFromDM(mmd, dst, srcdm);
|
||||
}
|
||||
|
||||
int multiresModifier_reshapeFromDeformMod(MultiresModifierData *mmd, Object *ob, ModifierData *md)
|
||||
{
|
||||
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
|
||||
DerivedMesh *dm, *ndm;
|
||||
int numVerts, result;
|
||||
float (*deformedVerts)[3];
|
||||
|
||||
/* Create DerivedMesh for deformation modifier */
|
||||
dm = get_multires_dm(ob);
|
||||
numVerts= dm->getNumVerts(dm);
|
||||
deformedVerts= MEM_callocN(sizeof(float)*numVerts*3, "multiresReshape_deformVerts");
|
||||
|
||||
dm->getVertCos(dm, deformedVerts);
|
||||
mti->deformVerts(md, ob, dm, deformedVerts, numVerts, 0, 0);
|
||||
|
||||
ndm= CDDM_copy(dm);
|
||||
CDDM_apply_vert_coords(ndm, deformedVerts);
|
||||
|
||||
MEM_freeN(deformedVerts);
|
||||
dm->release(dm);
|
||||
|
||||
/* Reshaping */
|
||||
result= multiresModifier_reshapeFromDM(mmd, ob, ndm);
|
||||
|
||||
/* Cleanup */
|
||||
ndm->release(ndm);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
static void column_vectors_to_mat3(float mat[][3], float v1[3], float v2[3], float v3[3])
|
||||
{
|
||||
copy_v3_v3(mat[0], v1);
|
||||
|
||||
@@ -389,32 +389,44 @@ static int modifier_apply_shape(ReportList *reports, Scene *scene, Object *ob, M
|
||||
|
||||
static int modifier_apply_obdata(ReportList *reports, Scene *scene, Object *ob, ModifierData *md)
|
||||
{
|
||||
ModifierTypeInfo *mti= modifierType_getInfo(md->type);
|
||||
|
||||
if (!(md->mode&eModifierMode_Realtime) || (mti->isDisabled && mti->isDisabled(md, 0))) {
|
||||
BKE_report(reports, RPT_ERROR, "Modifier is disabled, skipping apply");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (ob->type==OB_MESH) {
|
||||
DerivedMesh *dm;
|
||||
Mesh *me = ob->data;
|
||||
MultiresModifierData *mmd= find_multires_modifier(ob);
|
||||
|
||||
if( me->key) {
|
||||
BKE_report(reports, RPT_ERROR, "Modifier cannot be applied to Mesh with Shape Keys");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
mesh_pmv_off(ob, me);
|
||||
|
||||
|
||||
/* Multires: ensure that recent sculpting is applied */
|
||||
if(md->type == eModifierType_Multires)
|
||||
multires_force_update(ob);
|
||||
|
||||
dm = mesh_create_derived_for_modifier(scene, ob, md);
|
||||
if (!dm) {
|
||||
BKE_report(reports, RPT_ERROR, "Modifier is disabled or returned error, skipping apply");
|
||||
return 0;
|
||||
|
||||
if (mmd && mti->type==eModifierTypeType_OnlyDeform) {
|
||||
multiresModifier_reshapeFromDeformMod (mmd, ob, md);
|
||||
} else {
|
||||
dm = mesh_create_derived_for_modifier(scene, ob, md);
|
||||
if (!dm) {
|
||||
BKE_report(reports, RPT_ERROR, "Modifier is returned error, skipping apply");
|
||||
return 0;
|
||||
}
|
||||
|
||||
DM_to_mesh(dm, me);
|
||||
|
||||
dm->release(dm);
|
||||
}
|
||||
|
||||
DM_to_mesh(dm, me);
|
||||
|
||||
dm->release(dm);
|
||||
}
|
||||
else if (ELEM(ob->type, OB_CURVE, OB_SURF)) {
|
||||
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
|
||||
Curve *cu;
|
||||
int numVerts;
|
||||
float (*vertexCos)[3];
|
||||
@@ -427,11 +439,6 @@ static int modifier_apply_obdata(ReportList *reports, Scene *scene, Object *ob,
|
||||
cu = ob->data;
|
||||
BKE_report(reports, RPT_INFO, "Applied modifier only changed CV points, not tesselated/bevel vertices");
|
||||
|
||||
if (!(md->mode&eModifierMode_Realtime) || (mti->isDisabled && mti->isDisabled(md, 0))) {
|
||||
BKE_report(reports, RPT_ERROR, "Modifier is disabled, skipping apply");
|
||||
return 0;
|
||||
}
|
||||
|
||||
vertexCos = curve_getVertexCos(cu, &cu->nurb, &numVerts);
|
||||
mti->deformVerts(md, ob, NULL, vertexCos, numVerts, 0, 0);
|
||||
curve_applyVertexCos(cu, &cu->nurb, vertexCos);
|
||||
@@ -829,11 +836,6 @@ static int multires_reshape_exec(bContext *C, wmOperator *op)
|
||||
Object *ob= ptr.id.data, *secondob= NULL;
|
||||
MultiresModifierData *mmd= ptr.data;
|
||||
|
||||
if(ob->derivedFinal == NULL || ob->derivedFinal->type != DM_TYPE_CCGDM) {
|
||||
BKE_report(op->reports, RPT_ERROR, "Active objects multires is disabled, can't reshape multires data.");
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
|
||||
CTX_DATA_BEGIN(C, Object*, selob, selected_editable_objects) {
|
||||
if(selob->type == OB_MESH && selob != ob) {
|
||||
secondob= selob;
|
||||
|
||||
Reference in New Issue
Block a user