diff options
author | Campbell Barton <ideasman42@gmail.com> | 2019-04-17 07:17:24 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2019-04-17 07:21:24 +0300 |
commit | e12c08e8d170b7ca40f204a5b0423c23a9fbc2c1 (patch) | |
tree | 8cf3453d12edb177a218ef8009357518ec6cab6a /source/blender/editors/physics/dynamicpaint_ops.c | |
parent | b3dabc200a4b0399ec6b81f2ff2730d07b44fcaa (diff) |
ClangFormat: apply to source, most of intern
Apply clang format as proposed in T53211.
For details on usage and instructions for migrating branches
without conflicts, see:
https://wiki.blender.org/wiki/Tools/ClangFormat
Diffstat (limited to 'source/blender/editors/physics/dynamicpaint_ops.c')
-rw-r--r-- | source/blender/editors/physics/dynamicpaint_ops.c | 746 |
1 files changed, 381 insertions, 365 deletions
diff --git a/source/blender/editors/physics/dynamicpaint_ops.c b/source/blender/editors/physics/dynamicpaint_ops.c index a88d2089ea1..e0ea53b06ec 100644 --- a/source/blender/editors/physics/dynamicpaint_ops.c +++ b/source/blender/editors/physics/dynamicpaint_ops.c @@ -65,269 +65,280 @@ static int surface_slot_add_exec(bContext *C, wmOperator *UNUSED(op)) { - DynamicPaintModifierData *pmd = NULL; - Object *cObject = ED_object_context(C); - DynamicPaintCanvasSettings *canvas; - DynamicPaintSurface *surface; - - /* Make sure we're dealing with a canvas */ - pmd = (DynamicPaintModifierData *)modifiers_findByType(cObject, eModifierType_DynamicPaint); - if (!pmd || !pmd->canvas) - return OPERATOR_CANCELLED; - - canvas = pmd->canvas; - surface = dynamicPaint_createNewSurface(canvas, CTX_data_scene(C)); - - if (!surface) - return OPERATOR_CANCELLED; - - /* set preview for this surface only and set active */ - canvas->active_sur = 0; - for (surface = surface->prev; surface; surface = surface->prev) { - surface->flags &= ~MOD_DPAINT_PREVIEW; - canvas->active_sur++; - } - - return OPERATOR_FINISHED; + DynamicPaintModifierData *pmd = NULL; + Object *cObject = ED_object_context(C); + DynamicPaintCanvasSettings *canvas; + DynamicPaintSurface *surface; + + /* Make sure we're dealing with a canvas */ + pmd = (DynamicPaintModifierData *)modifiers_findByType(cObject, eModifierType_DynamicPaint); + if (!pmd || !pmd->canvas) + return OPERATOR_CANCELLED; + + canvas = pmd->canvas; + surface = dynamicPaint_createNewSurface(canvas, CTX_data_scene(C)); + + if (!surface) + return OPERATOR_CANCELLED; + + /* set preview for this surface only and set active */ + canvas->active_sur = 0; + for (surface = surface->prev; surface; surface = surface->prev) { + surface->flags &= ~MOD_DPAINT_PREVIEW; + canvas->active_sur++; + } + + return OPERATOR_FINISHED; } /* add surface slot */ void DPAINT_OT_surface_slot_add(wmOperatorType *ot) { - /* identifiers */ - ot->name = "Add Surface Slot"; - ot->idname = "DPAINT_OT_surface_slot_add"; - ot->description = "Add a new Dynamic Paint surface slot"; + /* identifiers */ + ot->name = "Add Surface Slot"; + ot->idname = "DPAINT_OT_surface_slot_add"; + ot->description = "Add a new Dynamic Paint surface slot"; - /* api callbacks */ - ot->exec = surface_slot_add_exec; - ot->poll = ED_operator_object_active_editable; + /* api callbacks */ + ot->exec = surface_slot_add_exec; + ot->poll = ED_operator_object_active_editable; - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } static int surface_slot_remove_exec(bContext *C, wmOperator *UNUSED(op)) { - DynamicPaintModifierData *pmd = NULL; - Object *obj_ctx = ED_object_context(C); - DynamicPaintCanvasSettings *canvas; - DynamicPaintSurface *surface; - int id = 0; - - /* Make sure we're dealing with a canvas */ - pmd = (DynamicPaintModifierData *)modifiers_findByType(obj_ctx, eModifierType_DynamicPaint); - if (!pmd || !pmd->canvas) return OPERATOR_CANCELLED; - - canvas = pmd->canvas; - surface = canvas->surfaces.first; - - /* find active surface and remove it */ - for (; surface; surface = surface->next) { - if (id == canvas->active_sur) { - canvas->active_sur -= 1; - dynamicPaint_freeSurface(pmd, surface); - break; - } - id++; - } - - dynamicPaint_resetPreview(canvas); - DEG_id_tag_update(&obj_ctx->id, ID_RECALC_GEOMETRY); - WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, obj_ctx); - - return OPERATOR_FINISHED; + DynamicPaintModifierData *pmd = NULL; + Object *obj_ctx = ED_object_context(C); + DynamicPaintCanvasSettings *canvas; + DynamicPaintSurface *surface; + int id = 0; + + /* Make sure we're dealing with a canvas */ + pmd = (DynamicPaintModifierData *)modifiers_findByType(obj_ctx, eModifierType_DynamicPaint); + if (!pmd || !pmd->canvas) + return OPERATOR_CANCELLED; + + canvas = pmd->canvas; + surface = canvas->surfaces.first; + + /* find active surface and remove it */ + for (; surface; surface = surface->next) { + if (id == canvas->active_sur) { + canvas->active_sur -= 1; + dynamicPaint_freeSurface(pmd, surface); + break; + } + id++; + } + + dynamicPaint_resetPreview(canvas); + DEG_id_tag_update(&obj_ctx->id, ID_RECALC_GEOMETRY); + WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, obj_ctx); + + return OPERATOR_FINISHED; } /* remove surface slot */ void DPAINT_OT_surface_slot_remove(wmOperatorType *ot) { - /* identifiers */ - ot->name = "Remove Surface Slot"; - ot->idname = "DPAINT_OT_surface_slot_remove"; - ot->description = "Remove the selected surface slot"; + /* identifiers */ + ot->name = "Remove Surface Slot"; + ot->idname = "DPAINT_OT_surface_slot_remove"; + ot->description = "Remove the selected surface slot"; - /* api callbacks */ - ot->exec = surface_slot_remove_exec; - ot->poll = ED_operator_object_active_editable; + /* api callbacks */ + ot->exec = surface_slot_remove_exec; + ot->poll = ED_operator_object_active_editable; - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } static int type_toggle_exec(bContext *C, wmOperator *op) { - Object *cObject = ED_object_context(C); - Scene *scene = CTX_data_scene(C); - DynamicPaintModifierData *pmd = (DynamicPaintModifierData *)modifiers_findByType(cObject, eModifierType_DynamicPaint); - int type = RNA_enum_get(op->ptr, "type"); - - if (!pmd) return OPERATOR_CANCELLED; - - /* if type is already enabled, toggle it off */ - if (type == MOD_DYNAMICPAINT_TYPE_CANVAS && pmd->canvas) { - dynamicPaint_freeCanvas(pmd); - } - else if (type == MOD_DYNAMICPAINT_TYPE_BRUSH && pmd->brush) { - dynamicPaint_freeBrush(pmd); - } - /* else create a new type */ - else { - if (!dynamicPaint_createType(pmd, type, scene)) - return OPERATOR_CANCELLED; - } - - /* update dependency */ - DEG_id_tag_update(&cObject->id, ID_RECALC_GEOMETRY); - DEG_relations_tag_update(CTX_data_main(C)); - WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, cObject); - - return OPERATOR_FINISHED; + Object *cObject = ED_object_context(C); + Scene *scene = CTX_data_scene(C); + DynamicPaintModifierData *pmd = (DynamicPaintModifierData *)modifiers_findByType( + cObject, eModifierType_DynamicPaint); + int type = RNA_enum_get(op->ptr, "type"); + + if (!pmd) + return OPERATOR_CANCELLED; + + /* if type is already enabled, toggle it off */ + if (type == MOD_DYNAMICPAINT_TYPE_CANVAS && pmd->canvas) { + dynamicPaint_freeCanvas(pmd); + } + else if (type == MOD_DYNAMICPAINT_TYPE_BRUSH && pmd->brush) { + dynamicPaint_freeBrush(pmd); + } + /* else create a new type */ + else { + if (!dynamicPaint_createType(pmd, type, scene)) + return OPERATOR_CANCELLED; + } + + /* update dependency */ + DEG_id_tag_update(&cObject->id, ID_RECALC_GEOMETRY); + DEG_relations_tag_update(CTX_data_main(C)); + WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, cObject); + + return OPERATOR_FINISHED; } void DPAINT_OT_type_toggle(wmOperatorType *ot) { - PropertyRNA *prop; - - /* identifiers */ - ot->name = "Toggle Type Active"; - ot->idname = "DPAINT_OT_type_toggle"; - ot->description = "Toggle whether given type is active or not"; - - /* api callbacks */ - ot->exec = type_toggle_exec; - ot->poll = ED_operator_object_active_editable; - - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - - /* properties */ - prop = RNA_def_enum(ot->srna, "type", rna_enum_prop_dynamicpaint_type_items, MOD_DYNAMICPAINT_TYPE_CANVAS, "Type", ""); - ot->prop = prop; + PropertyRNA *prop; + + /* identifiers */ + ot->name = "Toggle Type Active"; + ot->idname = "DPAINT_OT_type_toggle"; + ot->description = "Toggle whether given type is active or not"; + + /* api callbacks */ + ot->exec = type_toggle_exec; + ot->poll = ED_operator_object_active_editable; + + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + + /* properties */ + prop = RNA_def_enum(ot->srna, + "type", + rna_enum_prop_dynamicpaint_type_items, + MOD_DYNAMICPAINT_TYPE_CANVAS, + "Type", + ""); + ot->prop = prop; } static int output_toggle_exec(bContext *C, wmOperator *op) { - Object *ob = ED_object_context(C); - DynamicPaintSurface *surface; - DynamicPaintModifierData *pmd = (DynamicPaintModifierData *)modifiers_findByType(ob, eModifierType_DynamicPaint); - int output = RNA_enum_get(op->ptr, "output"); /* currently only 1/0 */ - - if (!pmd || !pmd->canvas) return OPERATOR_CANCELLED; - surface = get_activeSurface(pmd->canvas); - - /* if type is already enabled, toggle it off */ - if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX) { - int exists = dynamicPaint_outputLayerExists(surface, ob, output); - const char *name; - - if (output == 0) - name = surface->output_name; - else - name = surface->output_name2; - - /* Vertex Color Layer */ - if (surface->type == MOD_DPAINT_SURFACE_T_PAINT) { - if (!exists) - ED_mesh_color_add(ob->data, name, true, true); - else - ED_mesh_color_remove_named(ob->data, name); - } - /* Vertex Weight Layer */ - else if (surface->type == MOD_DPAINT_SURFACE_T_WEIGHT) { - if (!exists) { - BKE_object_defgroup_add_name(ob, name); - } - else { - bDeformGroup *defgroup = defgroup_find_name(ob, name); - if (defgroup) BKE_object_defgroup_remove(ob, defgroup); - } - } - } - - return OPERATOR_FINISHED; + Object *ob = ED_object_context(C); + DynamicPaintSurface *surface; + DynamicPaintModifierData *pmd = (DynamicPaintModifierData *)modifiers_findByType( + ob, eModifierType_DynamicPaint); + int output = RNA_enum_get(op->ptr, "output"); /* currently only 1/0 */ + + if (!pmd || !pmd->canvas) + return OPERATOR_CANCELLED; + surface = get_activeSurface(pmd->canvas); + + /* if type is already enabled, toggle it off */ + if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX) { + int exists = dynamicPaint_outputLayerExists(surface, ob, output); + const char *name; + + if (output == 0) + name = surface->output_name; + else + name = surface->output_name2; + + /* Vertex Color Layer */ + if (surface->type == MOD_DPAINT_SURFACE_T_PAINT) { + if (!exists) + ED_mesh_color_add(ob->data, name, true, true); + else + ED_mesh_color_remove_named(ob->data, name); + } + /* Vertex Weight Layer */ + else if (surface->type == MOD_DPAINT_SURFACE_T_WEIGHT) { + if (!exists) { + BKE_object_defgroup_add_name(ob, name); + } + else { + bDeformGroup *defgroup = defgroup_find_name(ob, name); + if (defgroup) + BKE_object_defgroup_remove(ob, defgroup); + } + } + } + + return OPERATOR_FINISHED; } void DPAINT_OT_output_toggle(wmOperatorType *ot) { - static const EnumPropertyItem prop_output_toggle_types[] = { - {0, "A", 0, "Output A", ""}, - {1, "B", 0, "Output B", ""}, - {0, NULL, 0, NULL, NULL}, - }; - - /* identifiers */ - ot->name = "Toggle Output Layer"; - ot->idname = "DPAINT_OT_output_toggle"; - ot->description = "Add or remove Dynamic Paint output data layer"; - - /* api callbacks */ - ot->exec = output_toggle_exec; - ot->poll = ED_operator_object_active_editable; - - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - - /* properties */ - ot->prop = RNA_def_enum(ot->srna, "output", prop_output_toggle_types, 0, "Output Toggle", ""); + static const EnumPropertyItem prop_output_toggle_types[] = { + {0, "A", 0, "Output A", ""}, + {1, "B", 0, "Output B", ""}, + {0, NULL, 0, NULL, NULL}, + }; + + /* identifiers */ + ot->name = "Toggle Output Layer"; + ot->idname = "DPAINT_OT_output_toggle"; + ot->description = "Add or remove Dynamic Paint output data layer"; + + /* api callbacks */ + ot->exec = output_toggle_exec; + ot->poll = ED_operator_object_active_editable; + + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + + /* properties */ + ot->prop = RNA_def_enum(ot->srna, "output", prop_output_toggle_types, 0, "Output Toggle", ""); } - /***************************** Image Sequence Baking ******************************/ typedef struct DynamicPaintBakeJob { - /* from wmJob */ - void *owner; - short *stop, *do_update; - float *progress; + /* from wmJob */ + void *owner; + short *stop, *do_update; + float *progress; - struct Main *bmain; - Scene *scene; - Depsgraph *depsgraph; - Object *ob; + struct Main *bmain; + Scene *scene; + Depsgraph *depsgraph; + Object *ob; - DynamicPaintSurface *surface; - DynamicPaintCanvasSettings *canvas; + DynamicPaintSurface *surface; + DynamicPaintCanvasSettings *canvas; - int success; - double start; + int success; + double start; } DynamicPaintBakeJob; static void dpaint_bake_free(void *customdata) { - DynamicPaintBakeJob *job = customdata; - MEM_freeN(job); + DynamicPaintBakeJob *job = customdata; + MEM_freeN(job); } static void dpaint_bake_endjob(void *customdata) { - DynamicPaintBakeJob *job = customdata; - DynamicPaintCanvasSettings *canvas = job->canvas; - - canvas->flags &= ~MOD_DPAINT_BAKING; - - dynamicPaint_freeSurfaceData(job->surface); - - G.is_rendering = false; - BKE_spacedata_draw_locks(false); - - WM_set_locked_interface(G_MAIN->wm.first, false); - - /* Bake was successful: - * Report for ended bake and how long it took */ - if (job->success) { - /* Show bake info */ - WM_reportf(RPT_INFO, "DynamicPaint: Bake complete! (%.2f)", PIL_check_seconds_timer() - job->start); - } - else { - if (strlen(canvas->error)) { /* If an error occurred */ - WM_reportf(RPT_ERROR, "DynamicPaint: Bake failed: %s", canvas->error); - } - else { /* User canceled the bake */ - WM_report(RPT_WARNING, "Baking canceled!"); - } - } + DynamicPaintBakeJob *job = customdata; + DynamicPaintCanvasSettings *canvas = job->canvas; + + canvas->flags &= ~MOD_DPAINT_BAKING; + + dynamicPaint_freeSurfaceData(job->surface); + + G.is_rendering = false; + BKE_spacedata_draw_locks(false); + + WM_set_locked_interface(G_MAIN->wm.first, false); + + /* Bake was successful: + * Report for ended bake and how long it took */ + if (job->success) { + /* Show bake info */ + WM_reportf( + RPT_INFO, "DynamicPaint: Bake complete! (%.2f)", PIL_check_seconds_timer() - job->start); + } + else { + if (strlen(canvas->error)) { /* If an error occurred */ + WM_reportf(RPT_ERROR, "DynamicPaint: Bake failed: %s", canvas->error); + } + else { /* User canceled the bake */ + WM_report(RPT_WARNING, "Baking canceled!"); + } + } } /* @@ -336,110 +347,112 @@ static void dpaint_bake_endjob(void *customdata) */ static void dynamicPaint_bakeImageSequence(DynamicPaintBakeJob *job) { - DynamicPaintSurface *surface = job->surface; - Object *cObject = job->ob; - DynamicPaintCanvasSettings *canvas = surface->canvas; - Scene *scene = job->scene; - int frame = 1, orig_frame; - int frames; - - frames = surface->end_frame - surface->start_frame + 1; - if (frames <= 0) { - BLI_strncpy(canvas->error, N_("No frames to bake"), sizeof(canvas->error)); - return; - } - - /* Show progress bar. */ - *(job->do_update) = true; - - /* Set frame to start point (also inits modifier data) */ - frame = surface->start_frame; - orig_frame = scene->r.cfra; - scene->r.cfra = (int)frame; - ED_update_for_newframe(job->bmain, job->depsgraph); - - /* Init surface */ - if (!dynamicPaint_createUVSurface(scene, surface, job->progress, job->do_update)) { - job->success = 0; - return; - } - - /* Loop through selected frames */ - for (frame = surface->start_frame; frame <= surface->end_frame; frame++) { - /* The first 10% are for createUVSurface... */ - const float progress = 0.1f + 0.9f * (frame - surface->start_frame) / (float)frames; - surface->current_frame = frame; - - /* If user requested stop, quit baking */ - if (G.is_break) { - job->success = 0; - return; - } - - /* Update progress bar */ - *(job->do_update) = true; - *(job->progress) = progress; - - /* calculate a frame */ - scene->r.cfra = (int)frame; - ED_update_for_newframe(job->bmain, job->depsgraph); - if (!dynamicPaint_calculateFrame(surface, job->depsgraph, scene, cObject, frame)) { - job->success = 0; - return; - } - - /* - * Save output images - */ - { - char filename[FILE_MAX]; - - /* primary output layer */ - if (surface->flags & MOD_DPAINT_OUT1) { - /* set filepath */ - BLI_join_dirfile(filename, sizeof(filename), surface->image_output_path, surface->output_name); - BLI_path_frame(filename, frame, 4); - - /* save image */ - dynamicPaint_outputSurfaceImage(surface, filename, 0); - } - /* secondary output */ - if (surface->flags & MOD_DPAINT_OUT2 && surface->type == MOD_DPAINT_SURFACE_T_PAINT) { - /* set filepath */ - BLI_join_dirfile(filename, sizeof(filename), surface->image_output_path, surface->output_name2); - BLI_path_frame(filename, frame, 4); - - /* save image */ - dynamicPaint_outputSurfaceImage(surface, filename, 1); - } - } - } - - scene->r.cfra = orig_frame; + DynamicPaintSurface *surface = job->surface; + Object *cObject = job->ob; + DynamicPaintCanvasSettings *canvas = surface->canvas; + Scene *scene = job->scene; + int frame = 1, orig_frame; + int frames; + + frames = surface->end_frame - surface->start_frame + 1; + if (frames <= 0) { + BLI_strncpy(canvas->error, N_("No frames to bake"), sizeof(canvas->error)); + return; + } + + /* Show progress bar. */ + *(job->do_update) = true; + + /* Set frame to start point (also inits modifier data) */ + frame = surface->start_frame; + orig_frame = scene->r.cfra; + scene->r.cfra = (int)frame; + ED_update_for_newframe(job->bmain, job->depsgraph); + + /* Init surface */ + if (!dynamicPaint_createUVSurface(scene, surface, job->progress, job->do_update)) { + job->success = 0; + return; + } + + /* Loop through selected frames */ + for (frame = surface->start_frame; frame <= surface->end_frame; frame++) { + /* The first 10% are for createUVSurface... */ + const float progress = 0.1f + 0.9f * (frame - surface->start_frame) / (float)frames; + surface->current_frame = frame; + + /* If user requested stop, quit baking */ + if (G.is_break) { + job->success = 0; + return; + } + + /* Update progress bar */ + *(job->do_update) = true; + *(job->progress) = progress; + + /* calculate a frame */ + scene->r.cfra = (int)frame; + ED_update_for_newframe(job->bmain, job->depsgraph); + if (!dynamicPaint_calculateFrame(surface, job->depsgraph, scene, cObject, frame)) { + job->success = 0; + return; + } + + /* + * Save output images + */ + { + char filename[FILE_MAX]; + + /* primary output layer */ + if (surface->flags & MOD_DPAINT_OUT1) { + /* set filepath */ + BLI_join_dirfile( + filename, sizeof(filename), surface->image_output_path, surface->output_name); + BLI_path_frame(filename, frame, 4); + + /* save image */ + dynamicPaint_outputSurfaceImage(surface, filename, 0); + } + /* secondary output */ + if (surface->flags & MOD_DPAINT_OUT2 && surface->type == MOD_DPAINT_SURFACE_T_PAINT) { + /* set filepath */ + BLI_join_dirfile( + filename, sizeof(filename), surface->image_output_path, surface->output_name2); + BLI_path_frame(filename, frame, 4); + + /* save image */ + dynamicPaint_outputSurfaceImage(surface, filename, 1); + } + } + } + + scene->r.cfra = orig_frame; } static void dpaint_bake_startjob(void *customdata, short *stop, short *do_update, float *progress) { - DynamicPaintBakeJob *job = customdata; + DynamicPaintBakeJob *job = customdata; - job->stop = stop; - job->do_update = do_update; - job->progress = progress; - job->start = PIL_check_seconds_timer(); - job->success = 1; + job->stop = stop; + job->do_update = do_update; + job->progress = progress; + job->start = PIL_check_seconds_timer(); + job->success = 1; - G.is_break = false; /* reset BKE_blender_test_break*/ + G.is_break = false; /* reset BKE_blender_test_break*/ - /* XXX annoying hack: needed to prevent data corruption when changing - * scene frame in separate threads - */ - G.is_rendering = true; - BKE_spacedata_draw_locks(true); + /* XXX annoying hack: needed to prevent data corruption when changing + * scene frame in separate threads + */ + G.is_rendering = true; + BKE_spacedata_draw_locks(true); - dynamicPaint_bakeImageSequence(job); + dynamicPaint_bakeImageSequence(job); - *do_update = true; - *stop = 0; + *do_update = true; + *stop = 0; } /* @@ -447,66 +460,69 @@ static void dpaint_bake_startjob(void *customdata, short *stop, short *do_update */ static int dynamicpaint_bake_exec(struct bContext *C, struct wmOperator *op) { - DynamicPaintModifierData *pmd = NULL; - DynamicPaintCanvasSettings *canvas; - Object *ob = ED_object_context(C); - Scene *scene = CTX_data_scene(C); - - DynamicPaintSurface *surface; - - /* - * Get modifier data - */ - pmd = (DynamicPaintModifierData *)modifiers_findByType(ob, eModifierType_DynamicPaint); - if (!pmd) { - BKE_report(op->reports, RPT_ERROR, "Bake failed: no Dynamic Paint modifier found"); - return OPERATOR_CANCELLED; - } - - /* Make sure we're dealing with a canvas */ - canvas = pmd->canvas; - if (!canvas) { - BKE_report(op->reports, RPT_ERROR, "Bake failed: invalid canvas"); - return OPERATOR_CANCELLED; - } - surface = get_activeSurface(canvas); - - /* Set state to baking and init surface */ - canvas->error[0] = '\0'; - canvas->flags |= MOD_DPAINT_BAKING; - - DynamicPaintBakeJob *job = MEM_mallocN(sizeof(DynamicPaintBakeJob), "DynamicPaintBakeJob"); - job->bmain = CTX_data_main(C); - job->scene = scene; - job->depsgraph = CTX_data_depsgraph(C); - job->ob = ob; - job->canvas = canvas; - job->surface = surface; - - wmJob *wm_job = WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), scene, - "Dynamic Paint Bake", WM_JOB_PROGRESS, - WM_JOB_TYPE_DPAINT_BAKE); - - WM_jobs_customdata_set(wm_job, job, dpaint_bake_free); - WM_jobs_timer(wm_job, 0.1, NC_OBJECT | ND_MODIFIER, NC_OBJECT | ND_MODIFIER); - WM_jobs_callbacks(wm_job, dpaint_bake_startjob, NULL, NULL, dpaint_bake_endjob); - - WM_set_locked_interface(CTX_wm_manager(C), true); - - /* Bake Dynamic Paint */ - WM_jobs_start(CTX_wm_manager(C), wm_job); - - return OPERATOR_FINISHED; + DynamicPaintModifierData *pmd = NULL; + DynamicPaintCanvasSettings *canvas; + Object *ob = ED_object_context(C); + Scene *scene = CTX_data_scene(C); + + DynamicPaintSurface *surface; + + /* + * Get modifier data + */ + pmd = (DynamicPaintModifierData *)modifiers_findByType(ob, eModifierType_DynamicPaint); + if (!pmd) { + BKE_report(op->reports, RPT_ERROR, "Bake failed: no Dynamic Paint modifier found"); + return OPERATOR_CANCELLED; + } + + /* Make sure we're dealing with a canvas */ + canvas = pmd->canvas; + if (!canvas) { + BKE_report(op->reports, RPT_ERROR, "Bake failed: invalid canvas"); + return OPERATOR_CANCELLED; + } + surface = get_activeSurface(canvas); + + /* Set state to baking and init surface */ + canvas->error[0] = '\0'; + canvas->flags |= MOD_DPAINT_BAKING; + + DynamicPaintBakeJob *job = MEM_mallocN(sizeof(DynamicPaintBakeJob), "DynamicPaintBakeJob"); + job->bmain = CTX_data_main(C); + job->scene = scene; + job->depsgraph = CTX_data_depsgraph(C); + job->ob = ob; + job->canvas = canvas; + job->surface = surface; + + wmJob *wm_job = WM_jobs_get(CTX_wm_manager(C), + CTX_wm_window(C), + scene, + "Dynamic Paint Bake", + WM_JOB_PROGRESS, + WM_JOB_TYPE_DPAINT_BAKE); + + WM_jobs_customdata_set(wm_job, job, dpaint_bake_free); + WM_jobs_timer(wm_job, 0.1, NC_OBJECT | ND_MODIFIER, NC_OBJECT | ND_MODIFIER); + WM_jobs_callbacks(wm_job, dpaint_bake_startjob, NULL, NULL, dpaint_bake_endjob); + + WM_set_locked_interface(CTX_wm_manager(C), true); + + /* Bake Dynamic Paint */ + WM_jobs_start(CTX_wm_manager(C), wm_job); + + return OPERATOR_FINISHED; } void DPAINT_OT_bake(wmOperatorType *ot) { - /* identifiers */ - ot->name = "Dynamic Paint Bake"; - ot->description = "Bake dynamic paint image sequence surface"; - ot->idname = "DPAINT_OT_bake"; - - /* api callbacks */ - ot->exec = dynamicpaint_bake_exec; - ot->poll = ED_operator_object_active_editable; + /* identifiers */ + ot->name = "Dynamic Paint Bake"; + ot->description = "Bake dynamic paint image sequence surface"; + ot->idname = "DPAINT_OT_bake"; + + /* api callbacks */ + ot->exec = dynamicpaint_bake_exec; + ot->poll = ED_operator_object_active_editable; } |