forked from bartvdbraak/blender
Fix #22213: applying deform modifier in front of multires modifier crashes,
should not do multires reshape in this case, but just regular apply.
This commit is contained in:
parent
5bacd2df29
commit
efeb8148c8
@ -47,7 +47,8 @@ void multires_force_external_reload(struct Object *ob);
|
||||
struct DerivedMesh *multires_dm_create_from_derived(struct MultiresModifierData*,
|
||||
int local_mmd, struct DerivedMesh*, struct Object *, int, int);
|
||||
|
||||
struct MultiresModifierData *find_multires_modifier(struct Scene *scene, struct Object *ob);
|
||||
struct MultiresModifierData *find_multires_modifier_before(struct Scene *scene,
|
||||
struct ModifierData *lastmd);
|
||||
struct DerivedMesh *get_multires_dm(struct Scene *scene, struct MultiresModifierData *mmd,
|
||||
struct Object *ob);
|
||||
void multiresModifier_join(struct Object *);
|
||||
|
@ -75,11 +75,11 @@ DerivedMesh *get_multires_dm(Scene *scene, MultiresModifierData *mmd, Object *ob
|
||||
return dm;
|
||||
}
|
||||
|
||||
MultiresModifierData *find_multires_modifier(Scene *scene, Object *ob)
|
||||
MultiresModifierData *find_multires_modifier_before(Scene *scene, ModifierData *lastmd)
|
||||
{
|
||||
ModifierData *md;
|
||||
|
||||
for(md = ob->modifiers.first; md; md = md->next) {
|
||||
for(md = lastmd; md; md = md->prev) {
|
||||
if(md->type == eModifierType_Multires) {
|
||||
if (modifier_isEnabled(scene, md, eModifierMode_Realtime))
|
||||
return (MultiresModifierData*)md;
|
||||
@ -249,6 +249,9 @@ int multiresModifier_reshapeFromDeformMod(Scene *scene, MultiresModifierData *mm
|
||||
int numVerts, result;
|
||||
float (*deformedVerts)[3];
|
||||
|
||||
if(multires_get_level(ob, mmd, 0) == 0)
|
||||
return 0;
|
||||
|
||||
/* Create DerivedMesh for deformation modifier */
|
||||
dm = get_multires_dm(scene, mmd, ob);
|
||||
numVerts= dm->getNumVerts(dm);
|
||||
|
@ -399,7 +399,7 @@ static int modifier_apply_obdata(ReportList *reports, Scene *scene, Object *ob,
|
||||
if (ob->type==OB_MESH) {
|
||||
DerivedMesh *dm;
|
||||
Mesh *me = ob->data;
|
||||
MultiresModifierData *mmd= find_multires_modifier(scene, ob);
|
||||
MultiresModifierData *mmd= find_multires_modifier_before(scene, md);
|
||||
|
||||
if( me->key) {
|
||||
BKE_report(reports, RPT_ERROR, "Modifier cannot be applied to Mesh with Shape Keys");
|
||||
@ -412,12 +412,15 @@ static int modifier_apply_obdata(ReportList *reports, Scene *scene, Object *ob,
|
||||
if(md->type == eModifierType_Multires)
|
||||
multires_force_update(ob);
|
||||
|
||||
if (mmd && mti->type==eModifierTypeType_OnlyDeform) {
|
||||
multiresModifier_reshapeFromDeformMod (scene, mmd, ob, md);
|
||||
if (mmd && mmd->totlvl && mti->type==eModifierTypeType_OnlyDeform) {
|
||||
if(!multiresModifier_reshapeFromDeformMod (scene, mmd, ob, md)) {
|
||||
BKE_report(reports, RPT_ERROR, "Multires modifier returned error, skipping apply");
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
dm = mesh_create_derived_for_modifier(scene, ob, md);
|
||||
if (!dm) {
|
||||
BKE_report(reports, RPT_ERROR, "Modifier is returned error, skipping apply");
|
||||
BKE_report(reports, RPT_ERROR, "Modifier returned error, skipping apply");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user