From 229c2c14f796b9d446301d9b0b8091c5e8a4f2ab Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 10 Sep 2014 23:02:31 +1000 Subject: [PATCH] Fix crash in project-from view without a brush or active object --- source/blender/editors/sculpt_paint/paint_image.c | 3 ++- .../editors/sculpt_paint/paint_image_proj.c | 15 +++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/source/blender/editors/sculpt_paint/paint_image.c b/source/blender/editors/sculpt_paint/paint_image.c index ebfb17d25ef..7c19528a049 100644 --- a/source/blender/editors/sculpt_paint/paint_image.c +++ b/source/blender/editors/sculpt_paint/paint_image.c @@ -591,11 +591,12 @@ static Brush *image_paint_brush(bContext *C) static int image_paint_poll(bContext *C) { - Object *obact = CTX_data_active_object(C); + Object *obact; if (!image_paint_brush(C)) return 0; + obact = CTX_data_active_object(C); if ((obact && obact->mode & OB_MODE_TEXTURE_PAINT) && CTX_wm_region_view3d(C)) { return 1; } diff --git a/source/blender/editors/sculpt_paint/paint_image_proj.c b/source/blender/editors/sculpt_paint/paint_image_proj.c index ef4a4e9bf79..0fb3e278f40 100644 --- a/source/blender/editors/sculpt_paint/paint_image_proj.c +++ b/source/blender/editors/sculpt_paint/paint_image_proj.c @@ -4541,7 +4541,8 @@ static void project_state_init(bContext *C, Object *ob, ProjPaintState *ps, int if (ps->tool == PAINT_TOOL_CLONE) ps->do_layer_clone = (settings->imapaint.flag & IMAGEPAINT_PROJECT_LAYER_CLONE) ? 1 : 0; - ps->do_stencil_brush = ps->brush->imagepaint_tool == PAINT_TOOL_MASK; + + ps->do_stencil_brush = (ps->brush && ps->brush->imagepaint_tool == PAINT_TOOL_MASK); /* deactivate stenciling for the stencil brush :) */ ps->do_layer_stencil = ((settings->imapaint.flag & IMAGEPAINT_PROJECT_LAYER_STENCIL) && !(ps->do_stencil_brush) && ps->stencil_ima); @@ -4660,15 +4661,15 @@ static int texture_paint_camera_project_exec(bContext *C, wmOperator *op) IDProperty *view_data = NULL; Object *ob = OBACT; - paint_proj_mesh_data_ensure(C, ob, op); - - project_state_init(C, ob, &ps, BRUSH_STROKE_NORMAL); - - if (ps.ob == NULL || ps.ob->type != OB_MESH) { + if (ob == NULL || ob->type != OB_MESH) { BKE_report(op->reports, RPT_ERROR, "No active mesh object"); return OPERATOR_CANCELLED; } + paint_proj_mesh_data_ensure(C, ob, op); + + project_state_init(C, ob, &ps, BRUSH_STROKE_NORMAL); + if (image == NULL) { BKE_report(op->reports, RPT_ERROR, "Image could not be found"); return OPERATOR_CANCELLED; @@ -4869,6 +4870,8 @@ void paint_proj_mesh_data_ensure(bContext *C, Object *ob, wmOperator *op) Main *bmain = CTX_data_main(C); Brush *br = BKE_paint_brush(&imapaint->paint); + BLI_assert(ob->type == OB_MESH); + /* no material, add one */ if (ob->totcol == 0) { Material *ma = BKE_material_add(CTX_data_main(C), "Material");