diff options
Diffstat (limited to 'source/blender/editors/object/object_modifier.c')
-rw-r--r-- | source/blender/editors/object/object_modifier.c | 54 |
1 files changed, 22 insertions, 32 deletions
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index 2889f798dd8..11d0fd9f9d5 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -293,9 +293,8 @@ static bool object_modifier_remove(Main *bmain, Object *ob, ModifierData *md, } else if (md->type == eModifierType_Softbody) { if (ob->soft) { - sbFree(ob->soft); - ob->soft = NULL; - ob->softflag = 0; + sbFree(ob); + ob->softflag = 0; /* TODO(Sybren): this should probably be moved into sbFree() */ } } else if (md->type == eModifierType_Collision) { @@ -692,23 +691,29 @@ int ED_object_modifier_apply( if (md != ob->modifiers.first) BKE_report(reports, RPT_INFO, "Applied modifier was not first, result may not be as expected"); + /* Get evaluated modifier, so object links pointer to evaluated data, + * but still use original object it is applied to the original mesh. */ + Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob); + ModifierData *md_eval = (ob_eval) ? modifiers_findByName(ob_eval, md->name) : md; + /* allow apply of a not-realtime modifier, by first re-enabling realtime. */ - prev_mode = md->mode; - md->mode |= eModifierMode_Realtime; + prev_mode = md_eval->mode; + md_eval->mode |= eModifierMode_Realtime; if (mode == MODIFIER_APPLY_SHAPE) { - if (!modifier_apply_shape(bmain, reports, depsgraph, scene, ob, md)) { - md->mode = prev_mode; + if (!modifier_apply_shape(bmain, reports, depsgraph, scene, ob, md_eval)) { + md_eval->mode = prev_mode; return 0; } } else { - if (!modifier_apply_obdata(reports, depsgraph, scene, ob, md)) { - md->mode = prev_mode; + if (!modifier_apply_obdata(reports, depsgraph, scene, ob, md_eval)) { + md_eval->mode = prev_mode; return 0; } } + md_eval->mode = prev_mode; BLI_remlink(&ob->modifiers, md); modifier_free(md); @@ -2063,28 +2068,9 @@ static bool ocean_bake_poll(bContext *C) return edit_modifier_poll_generic(C, &RNA_OceanModifier, 0); } -/* copied from init_ocean_modifier, MOD_ocean.c */ -static void init_ocean_modifier_bake(struct Ocean *oc, struct OceanModifierData *omd) -{ - int do_heightfield, do_chop, do_normals, do_jacobian; - - if (!omd || !oc) return; - - do_heightfield = true; - do_chop = (omd->chop_amount > 0); - do_normals = (omd->flag & MOD_OCEAN_GENERATE_NORMALS); - do_jacobian = (omd->flag & MOD_OCEAN_GENERATE_FOAM); - - BKE_ocean_init(oc, omd->resolution * omd->resolution, omd->resolution * omd->resolution, omd->spatial_size, omd->spatial_size, - omd->wind_velocity, omd->smallest_wave, 1.0, omd->wave_direction, omd->damp, omd->wave_alignment, - omd->depth, omd->time, - do_heightfield, do_chop, do_normals, do_jacobian, - omd->seed); -} - typedef struct OceanBakeJob { /* from wmJob */ - void *owner; + struct Object *owner; short *stop, *do_update; float *progress; int current_frame; @@ -2150,6 +2136,9 @@ static void oceanbake_endjob(void *customdata) oj->omd->oceancache = oj->och; oj->omd->cached = true; + + Object *ob = oj->owner; + DEG_id_tag_update(&ob->id, DEG_TAG_COPY_ON_WRITE); } static int ocean_bake_exec(bContext *C, wmOperator *op) @@ -2170,8 +2159,8 @@ static int ocean_bake_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; if (free) { - omd->refresh |= MOD_OCEAN_REFRESH_CLEAR_CACHE; - DEG_id_tag_update(&ob->id, OB_RECALC_DATA); + BKE_ocean_free_modifier_cache(omd); + DEG_id_tag_update(&ob->id, OB_RECALC_DATA | DEG_TAG_COPY_ON_WRITE); WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob); return OPERATOR_FINISHED; } @@ -2211,7 +2200,7 @@ static int ocean_bake_exec(bContext *C, wmOperator *op) /* make a copy of ocean to use for baking - threadsafety */ ocean = BKE_ocean_add(); - init_ocean_modifier_bake(ocean, omd); + BKE_ocean_init_from_modifier(ocean, omd); #if 0 BKE_ocean_bake(ocean, och); @@ -2233,6 +2222,7 @@ static int ocean_bake_exec(bContext *C, wmOperator *op) wm_job = WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), scene, "Ocean Simulation", WM_JOB_PROGRESS, WM_JOB_TYPE_OBJECT_SIM_OCEAN); oj = MEM_callocN(sizeof(OceanBakeJob), "ocean bake job"); + oj->owner = ob; oj->ocean = ocean; oj->och = och; oj->omd = omd; |