From ccb6e1904abf358c0f999019ffd62d407ecc920b Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 19 Jan 2010 22:44:43 +0000 Subject: [PATCH] =?UTF-8?q?patch=20from=20Bj=C3=B8rnar=20Hansen=20(anachro?= =?UTF-8?q?n)=20Multiple=20background=20images=20displaying=20each=20on=20?= =?UTF-8?q?a=20different=20axis.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Changes made from the original patch. - Use an enum rather then multiple booleans. - Reduced the space taken up by the user interface. - Made the image template compact display not show fields & premul options. - Added readfile.c lines so old blendfile images are loaded. - Option to hide BGpic UI (like modifiers & constraints) - Use the index rather then a bgpic from the context for the remove operator. note: could be good to use 1 image for both left+right, for eg, but for this to work as intended we would need to add image flipping depending on the axis so left this commented out for now. --- release/scripts/ui/space_view3d.py | 42 ++-- source/blender/blenkernel/BKE_sequencer.h | 8 +- source/blender/blenloader/intern/readfile.c | 38 +++- source/blender/blenloader/intern/writefile.c | 4 +- .../editors/space_image/image_buttons.c | 32 +-- .../editors/space_view3d/space_view3d.c | 30 ++- .../editors/space_view3d/view3d_draw.c | 208 +++++++++--------- .../editors/space_view3d/view3d_edit.c | 75 +++++++ .../editors/space_view3d/view3d_intern.h | 2 + .../blender/editors/space_view3d/view3d_ops.c | 2 + source/blender/makesdna/DNA_view3d_types.h | 15 +- source/blender/makesrna/intern/rna_space.c | 68 +++--- 12 files changed, 336 insertions(+), 188 deletions(-) diff --git a/release/scripts/ui/space_view3d.py b/release/scripts/ui/space_view3d.py index af0e2ec7879..c422781d00e 100644 --- a/release/scripts/ui/space_view3d.py +++ b/release/scripts/ui/space_view3d.py @@ -1783,7 +1783,7 @@ class VIEW3D_PT_3dview_curvedisplay(bpy.types.Panel): class VIEW3D_PT_background_image(bpy.types.Panel): bl_space_type = 'VIEW_3D' bl_region_type = 'UI' - bl_label = "Background Image" + bl_label = "Background Images" bl_default_closed = True def poll(self, context): @@ -1795,34 +1795,38 @@ class VIEW3D_PT_background_image(bpy.types.Panel): layout = self.layout view = context.space_data - layout.prop(view, "display_background_image", text="") + layout.prop(view, "display_background_images", text="") def draw(self, context): layout = self.layout view = context.space_data - bg = view.background_image + + col = layout.column() + col.operator("view3d.add_background_image", text="Add Image") - if bg: - layout.active = view.display_background_image + for i, bg in enumerate(view.background_images): + layout.active = view.display_background_images box = layout.box() - if (bg.image): - box.template_ID(bg, "image", open="image.open") - box.template_image(bg, "image", bg.image_user, compact=True) - else: - box.template_ID(bg, "image", open="image.open") + row = box.row(align=True) + row.prop(bg, "show_expanded", text="", no_bg=True) + row.label(text=getattr(bg.image, "name", "Not Set")) + row.operator("view3d.remove_background_image", text="", icon='X').index = i - col = layout.column() - col.label(text="Display Settings") + box.prop(bg, "view_axis", text="Axis") - col = layout.column() - col.prop(bg, "size") - col.prop(bg, "transparency", slider=True) + if bg.show_expanded: + row = box.row() + row.template_ID(bg, "image", open="image.open") + if (bg.image): + box.template_image(bg, "image", bg.image_user, compact=True) - col = layout.column() - col.label(text="Offset") - col.prop(bg, "offset_x", text="X") - col.prop(bg, "offset_y", text="Y") + box.prop(bg, "transparency", slider=True) + box.prop(bg, "size") + row = box.row(align=True) + row.prop(bg, "offset_x", text="X") + row.prop(bg, "offset_y", text="Y") + class VIEW3D_PT_transform_orientations(bpy.types.Panel): bl_space_type = 'VIEW_3D' diff --git a/source/blender/blenkernel/BKE_sequencer.h b/source/blender/blenkernel/BKE_sequencer.h index dc7b6d3ad9b..492ece74e69 100644 --- a/source/blender/blenkernel/BKE_sequencer.h +++ b/source/blender/blenkernel/BKE_sequencer.h @@ -28,8 +28,8 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifndef BKE_SEQUENCE_H -#define BKE_SEQUENCE_H +#ifndef BKE_SEQUENCER_H +#define BKE_SEQUENCER_H struct Editing; struct Sequence; @@ -77,8 +77,6 @@ void seq_array(struct Editing *ed, struct Sequence ***seqarray, int *tot, int us seq_end(&iter); \ } -#endif - /* Wipe effect */ enum {DO_SINGLE_WIPE, DO_DOUBLE_WIPE, DO_BOX_WIPE, DO_CROSS_WIPE, @@ -238,3 +236,5 @@ struct Sequence *sequencer_add_movie_strip(struct bContext *C, ListBase *seqbase /* copy/paste */ extern ListBase seqbase_clipboard; extern int seqbase_clipboard_frame; + +#endif // BKE_SEQUENCER_H diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 96b2b793267..11a9a6efff5 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -4630,12 +4630,20 @@ static void lib_link_screen(FileData *fd, Main *main) for (sl= sa->spacedata.first; sl; sl= sl->next) { if(sl->spacetype==SPACE_VIEW3D) { View3D *v3d= (View3D*) sl; + BGpic *bgpic; v3d->camera= newlibadr(fd, sc->id.lib, v3d->camera); v3d->ob_centre= newlibadr(fd, sc->id.lib, v3d->ob_centre); + /* should be do_versions but not easy adding into the listbase */ if(v3d->bgpic) { - v3d->bgpic->ima= newlibadr_us(fd, sc->id.lib, v3d->bgpic->ima); + v3d->bgpic= newlibadr(fd, sc->id.lib, v3d->bgpic); + BLI_addtail(&v3d->bgpicbase, bgpic); + v3d->bgpic= NULL; + } + + for(bgpic= v3d->bgpicbase.first; bgpic; bgpic= bgpic->next) { + bgpic->ima= newlibadr_us(fd, sc->id.lib, bgpic->ima); } if(v3d->localvd) { v3d->localvd->camera= newlibadr(fd, sc->id.lib, v3d->localvd->camera); @@ -4809,14 +4817,15 @@ void lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *curscene) for (sl= sa->spacedata.first; sl; sl= sl->next) { if(sl->spacetype==SPACE_VIEW3D) { View3D *v3d= (View3D*) sl; + BGpic *bgpic; v3d->camera= restore_pointer_by_name(newmain, (ID *)v3d->camera, 1); if(v3d->camera==NULL) v3d->camera= sc->scene->camera; v3d->ob_centre= restore_pointer_by_name(newmain, (ID *)v3d->ob_centre, 1); - if(v3d->bgpic) { - v3d->bgpic->ima= restore_pointer_by_name(newmain, (ID *)v3d->bgpic->ima, 1); + for(bgpic= v3d->bgpicbase.first; bgpic; bgpic= bgpic->next) { + bgpic->ima= restore_pointer_by_name(newmain, (ID *)bgpic->ima, 1); } if(v3d->localvd) { /*Base *base;*/ @@ -5089,10 +5098,22 @@ static void direct_link_screen(FileData *fd, bScreen *sc) if (sl->spacetype==SPACE_VIEW3D) { View3D *v3d= (View3D*) sl; - v3d->bgpic= newdataadr(fd, v3d->bgpic); + BGpic *bgpic; + v3d->flag |= V3D_INVALID_BACKBUF; - if(v3d->bgpic) - v3d->bgpic->iuser.ok= 1; + + link_list(fd, &(v3d->bgpicbase)); + + /* should be do_versions except this doesnt fit well there */ + if(v3d->bgpic) { + bgpic= newdataadr(fd, v3d->bgpic); + BLI_addtail(&v3d->bgpicbase, bgpic); + v3d->bgpic= NULL; + } + + for(bgpic= v3d->bgpicbase.first; bgpic; bgpic= bgpic->next) + bgpic->iuser.ok= 1; + if(v3d->gpd) { v3d->gpd= newdataadr(fd, v3d->gpd); direct_link_gpencil(fd, v3d->gpd); @@ -8350,8 +8371,9 @@ static void do_versions(FileData *fd, Library *lib, Main *main) ((SpaceImage *)sl)->iuser.fie_ima= 2; else if(sl->spacetype==SPACE_VIEW3D) { View3D *v3d= (View3D *)sl; - if(v3d->bgpic) - v3d->bgpic->iuser.fie_ima= 2; + BGpic *bgpic; + for(bgpic= v3d->bgpicbase.first; bgpic; bgpic= bgpic->next) + bgpic->iuser.fie_ima= 2; } } } diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index 4c9c54012f8..7064b8c380f 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -2035,8 +2035,10 @@ static void write_screens(WriteData *wd, ListBase *scrbase) if(sl->spacetype==SPACE_VIEW3D) { View3D *v3d= (View3D *) sl; + BGpic *bgpic; writestruct(wd, DATA, "View3D", 1, v3d); - if(v3d->bgpic) writestruct(wd, DATA, "BGpic", 1, v3d->bgpic); + for (bgpic= v3d->bgpicbase.first; bgpic; bgpic= bgpic->next) + writestruct(wd, DATA, "BGpic", 1, bgpic); if(v3d->localvd) writestruct(wd, DATA, "View3D", 1, v3d->localvd); } else if(sl->spacetype==SPACE_IPO) { diff --git a/source/blender/editors/space_image/image_buttons.c b/source/blender/editors/space_image/image_buttons.c index c882c8db6c6..94df99d9c8d 100644 --- a/source/blender/editors/space_image/image_buttons.c +++ b/source/blender/editors/space_image/image_buttons.c @@ -888,26 +888,30 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propn uiblock_layer_pass_arrow_buttons(layout, ima->rr, iuser); } else if(ima->source != IMA_SRC_GENERATED) { - ibuf= BKE_image_acquire_ibuf(ima, iuser, &lock); - image_info(ima, ibuf, str); - BKE_image_release_ibuf(ima, lock); - uiItemL(layout, str, 0); + if(compact == 0) { + ibuf= BKE_image_acquire_ibuf(ima, iuser, &lock); + image_info(ima, ibuf, str); + BKE_image_release_ibuf(ima, lock); + uiItemL(layout, str, 0); + } } if(ima->source != IMA_SRC_GENERATED) { - uiItemS(layout); + if(compact == 0) { /* background image view doesnt need these */ + uiItemS(layout); - split= uiLayoutSplit(layout, 0, 0); + split= uiLayoutSplit(layout, 0, 0); - col= uiLayoutColumn(split, 0); - uiItemR(col, NULL, 0, &imaptr, "fields", 0); - row= uiLayoutRow(col, 0); - uiItemR(row, NULL, 0, &imaptr, "field_order", UI_ITEM_R_EXPAND); - uiLayoutSetActive(row, RNA_boolean_get(&imaptr, "fields")); + col= uiLayoutColumn(split, 0); + uiItemR(col, NULL, 0, &imaptr, "fields", 0); + row= uiLayoutRow(col, 0); + uiItemR(row, NULL, 0, &imaptr, "field_order", UI_ITEM_R_EXPAND); + uiLayoutSetActive(row, RNA_boolean_get(&imaptr, "fields")); - col= uiLayoutColumn(split, 0); - uiItemR(col, NULL, 0, &imaptr, "antialias", 0); - uiItemR(col, NULL, 0, &imaptr, "premultiply", 0); + col= uiLayoutColumn(split, 0); + uiItemR(col, NULL, 0, &imaptr, "antialias", 0); + uiItemR(col, NULL, 0, &imaptr, "premultiply", 0); + } } if(ELEM(ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE)) { diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c index 6ba27870022..b3bd31d53ac 100644 --- a/source/blender/editors/space_view3d/space_view3d.c +++ b/source/blender/editors/space_view3d/space_view3d.c @@ -266,12 +266,13 @@ static SpaceLink *view3d_new(const bContext *C) static void view3d_free(SpaceLink *sl) { View3D *vd= (View3D *) sl; - - if(vd->bgpic) { - if(vd->bgpic->ima) vd->bgpic->ima->id.us--; - MEM_freeN(vd->bgpic); + + BGpic *bgpic; + for(bgpic= vd->bgpicbase.first; bgpic; bgpic= bgpic->next) { + if(bgpic->ima) bgpic->ima->id.us--; } - + BLI_freelistN(&vd->bgpicbase); + if(vd->localvd) MEM_freeN(vd->localvd); if(vd->properties_storage) MEM_freeN(vd->properties_storage); @@ -303,9 +304,12 @@ static SpaceLink *view3d_duplicate(SpaceLink *sl) /* copy or clear inside new stuff */ - if(v3dn->bgpic) { - v3dn->bgpic= MEM_dupallocN(v3dn->bgpic); - if(v3dn->bgpic->ima) v3dn->bgpic->ima->id.us++; + if(v3dn->bgpicbase.first) { + BGpic *bgpic; + for ( bgpic= v3dn->bgpicbase.first; bgpic; bgpic= bgpic->next ) { + bgpic= MEM_dupallocN(bgpic); + if(bgpic->ima) bgpic->ima->id.us++; + } } v3dn->properties_storage= NULL; @@ -790,11 +794,13 @@ void space_view3d_listener(struct ScrArea *area, struct wmNotifier *wmn) { if (wmn->category == NC_SCENE && wmn->data == ND_FRAME) { View3D *v3d = area->spacedata.first; - - if (v3d->bgpic && v3d->bgpic->ima) { - Scene *scene = wmn->reference; + BGpic *bgpic = v3d->bgpicbase.first; - BKE_image_user_calc_frame(&v3d->bgpic->iuser, scene->r.cfra, 0); + for (; bgpic; bgpic = bgpic->next) { + if (bgpic->ima) { + Scene *scene = wmn->reference; + BKE_image_user_calc_imanr(&bgpic->iuser, scene->r.cfra, 0); + } } } } diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index 529b100c1d4..fa155489b59 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -1312,109 +1312,113 @@ static void draw_bgpic(Scene *scene, ARegion *ar, View3D *v3d) ImBuf *ibuf= NULL; float vec[4], fac, asp, zoomx, zoomy; float x1, y1, x2, y2, cx, cy; - - bgpic= v3d->bgpic; - if(bgpic==NULL) return; - - ima= bgpic->ima; - if(ima) { - /* notifier can also call this however screen_ops.c */ - BKE_image_user_calc_frame(&bgpic->iuser, CFRA, 0); - ibuf= BKE_image_get_ibuf(ima, &bgpic->iuser); - } - if(ibuf==NULL || (ibuf->rect==NULL && ibuf->rect_float==NULL) ) - return; - if(ibuf->channels!=4) - return; - if(ibuf->rect==NULL) - IMB_rect_from_float(ibuf); - - if(rv3d->persp==2) { - rctf vb; - - calc_viewborder(scene, ar, v3d, &vb); - - x1= vb.xmin; - y1= vb.ymin; - x2= vb.xmax; - y2= vb.ymax; - } - else { - float sco[2]; - - /* calc window coord */ - initgrabz(rv3d, 0.0, 0.0, 0.0); - window_to_3d_delta(ar, vec, 1, 0); - fac= MAX3( fabs(vec[0]), fabs(vec[1]), fabs(vec[1]) ); - fac= 1.0/fac; - - asp= ( (float)ibuf->y)/(float)ibuf->x; - - vec[0] = vec[1] = vec[2] = 0.0; - view3d_project_float(ar, vec, sco, rv3d->persmat); - cx = sco[0]; - cy = sco[1]; - - x1= cx+ fac*(bgpic->xof-bgpic->size); - y1= cy+ asp*fac*(bgpic->yof-bgpic->size); - x2= cx+ fac*(bgpic->xof+bgpic->size); - y2= cy+ asp*fac*(bgpic->yof+bgpic->size); - } - - /* complete clip? */ - - if(x2 < 0 ) return; - if(y2 < 0 ) return; - if(x1 > ar->winx ) return; - if(y1 > ar->winy ) return; - - zoomx= (x2-x1)/ibuf->x; - zoomy= (y2-y1)/ibuf->y; - - /* for some reason; zoomlevels down refuses to use GL_ALPHA_SCALE */ - if(zoomx < 1.0f || zoomy < 1.0f) { - float tzoom= MIN2(zoomx, zoomy); - int mip= 0; - - if(ibuf->mipmap[0]==NULL) - IMB_makemipmap(ibuf, 0, 0); - - while(tzoom < 1.0f && mip<8 && ibuf->mipmap[mip]) { - tzoom*= 2.0f; - zoomx*= 2.0f; - zoomy*= 2.0f; - mip++; + + for ( bgpic= v3d->bgpicbase.first; bgpic; bgpic= bgpic->next ) { + + if( (bgpic->view == 0) || /* zero for any */ + (bgpic->view & (1<view)) || /* check agaist flags */ + (rv3d->persp==RV3D_CAMOB && bgpic->view == (1<ima; + if(ima==NULL) + continue; + BKE_image_user_calc_frame(&bgpic->iuser, CFRA, 0); + ibuf= BKE_image_get_ibuf(ima, &bgpic->iuser); + if(ibuf==NULL || (ibuf->rect==NULL && ibuf->rect_float==NULL) ) + continue; + if(ibuf->channels!=4) + continue; + if(ibuf->rect==NULL) + IMB_rect_from_float(ibuf); + + if(rv3d->persp==RV3D_CAMOB) { + rctf vb; + + calc_viewborder(scene, ar, v3d, &vb); + + x1= vb.xmin; + y1= vb.ymin; + x2= vb.xmax; + y2= vb.ymax; + } + else { + float sco[2]; + + /* calc window coord */ + initgrabz(rv3d, 0.0, 0.0, 0.0); + window_to_3d_delta(ar, vec, 1, 0); + fac= MAX3( fabs(vec[0]), fabs(vec[1]), fabs(vec[1]) ); + fac= 1.0/fac; + + asp= ( (float)ibuf->y)/(float)ibuf->x; + + vec[0] = vec[1] = vec[2] = 0.0; + view3d_project_float(ar, vec, sco, rv3d->persmat); + cx = sco[0]; + cy = sco[1]; + + x1= cx+ fac*(bgpic->xof-bgpic->size); + y1= cy+ asp*fac*(bgpic->yof-bgpic->size); + x2= cx+ fac*(bgpic->xof+bgpic->size); + y2= cy+ asp*fac*(bgpic->yof+bgpic->size); + } + + /* complete clip? */ + + if(x2 < 0 ) continue; + if(y2 < 0 ) continue; + if(x1 > ar->winx ) continue; + if(y1 > ar->winy ) continue; + + zoomx= (x2-x1)/ibuf->x; + zoomy= (y2-y1)/ibuf->y; + + /* for some reason; zoomlevels down refuses to use GL_ALPHA_SCALE */ + if(zoomx < 1.0f || zoomy < 1.0f) { + float tzoom= MIN2(zoomx, zoomy); + int mip= 0; + + if(ibuf->mipmap[0]==NULL) + IMB_makemipmap(ibuf, 0, 0); + + while(tzoom < 1.0f && mip<8 && ibuf->mipmap[mip]) { + tzoom*= 2.0f; + zoomx*= 2.0f; + zoomy*= 2.0f; + mip++; + } + if(mip>0) + ibuf= ibuf->mipmap[mip-1]; + } + + if(v3d->zbuf) glDisable(GL_DEPTH_TEST); + glDepthMask(0); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + /* need to use wm push/pop matrix because ED_region_pixelspace + uses the wm functions too, otherwise gets out of sync */ + wmPushMatrix(); + ED_region_pixelspace(ar); + + glEnable(GL_BLEND); + + glPixelZoom(zoomx, zoomy); + glColor4f(1.0, 1.0, 1.0, 1.0-bgpic->blend); + glaDrawPixelsTex(x1, y1, ibuf->x, ibuf->y, GL_UNSIGNED_BYTE, ibuf->rect); + + glPixelZoom(1.0, 1.0); + glPixelTransferf(GL_ALPHA_SCALE, 1.0f); + + wmPopMatrix(); + + glDisable(GL_BLEND); + + glDepthMask(1); + if(v3d->zbuf) glEnable(GL_DEPTH_TEST); } - if(mip>0) - ibuf= ibuf->mipmap[mip-1]; } - - if(v3d->zbuf) glDisable(GL_DEPTH_TEST); - glDepthMask(0); - - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - /* need to use wm push/pop matrix because ED_region_pixelspace - uses the wm functions too, otherwise gets out of sync */ - wmPushMatrix(); - ED_region_pixelspace(ar); - - glEnable(GL_BLEND); - - glPixelZoom(zoomx, zoomy); - glColor4f(1.0, 1.0, 1.0, 1.0-bgpic->blend); - glaDrawPixelsTex(x1, y1, ibuf->x, ibuf->y, GL_UNSIGNED_BYTE, ibuf->rect); - - glPixelZoom(1.0, 1.0); - glPixelTransferf(GL_ALPHA_SCALE, 1.0f); - - wmPopMatrix(); - - glDisable(GL_BLEND); - - glDepthMask(1); - if(v3d->zbuf) glEnable(GL_DEPTH_TEST); } /* ****************** View3d afterdraw *************** */ @@ -2059,7 +2063,7 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar) star_stuff_term_func); } } - if(v3d->flag & V3D_DISPBGPIC) draw_bgpic(scene, ar, v3d); + if(v3d->flag & V3D_DISPBGPICS) draw_bgpic(scene, ar, v3d); } } else { @@ -2071,7 +2075,7 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar) glMatrixMode(GL_MODELVIEW); wmLoadMatrix(rv3d->viewmat); - if(v3d->flag & V3D_DISPBGPIC) { + if(v3d->flag & V3D_DISPBGPICS) { draw_bgpic(scene, ar, v3d); } } diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c index 54e5ff75146..77c9f867801 100644 --- a/source/blender/editors/space_view3d/view3d_edit.c +++ b/source/blender/editors/space_view3d/view3d_edit.c @@ -2071,7 +2071,82 @@ void VIEW3D_OT_view_persportho(wmOperatorType *ot) ot->flag= 0; } +/* ******************** add background image operator **************** */ +static int add_background_image_exec(bContext *C, wmOperator *op) +{ + View3D *v3d= CTX_wm_view3d(C); + + BGpic *bgpic= MEM_callocN(sizeof(BGpic), "Background Image"); + bgpic->size= 5.0; + bgpic->blend= 0.5; + bgpic->iuser.fie_ima= 2; + bgpic->iuser.ok= 1; + bgpic->view= 0; /* 0 for all */ + + BLI_addtail(&v3d->bgpicbase, bgpic); + + //ED_region_tag_redraw(v3d); + + return OPERATOR_FINISHED; +} + +static int add_background_image_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + return add_background_image_exec(C, op); +} + +void VIEW3D_OT_add_background_image(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Add Background Image"; + ot->description= "Add a new background image."; + ot->idname = "VIEW3D_OT_add_background_image"; + + /* api callbacks */ + ot->invoke = add_background_image_invoke; + ot->exec = add_background_image_exec; + ot->poll = ED_operator_view3d_active; + + /* flags */ + ot->flag = 0; +} + +/* ***** remove image operator ******* */ +static int remove_background_image_exec(bContext *C, wmOperator *op) +{ + BGpic *bgpic_rem = CTX_data_pointer_get_type(C, "bgpic", &RNA_BackgroundImage).data; + View3D *vd = CTX_wm_view3d(C); + int index = RNA_int_get(op->ptr, "index"); + + bgpic_rem = BLI_findlink(&vd->bgpicbase, index); + if(bgpic_rem) { + BLI_remlink(&vd->bgpicbase, bgpic_rem); + if(bgpic_rem->ima) bgpic_rem->ima->id.us--; + MEM_freeN(bgpic_rem); + } + + WM_event_add_notifier(C, NC_SPACE|ND_SPACE_VIEW3D, vd); + + return OPERATOR_FINISHED; +} + +void VIEW3D_OT_remove_background_image(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Remove Background Image"; + ot->description= "Remove a background image from the 3D view"; + ot->idname = "VIEW3D_OT_remove_background_image"; + + /* api callbacks */ + ot->exec = remove_background_image_exec; + ot->poll = ED_operator_view3d_active; + + /* flags */ + ot->flag = 0; + + RNA_def_int(ot->srna, "index", 0, 0, INT_MAX, "Index", "Background image index to remove ", 0, INT_MAX); +} /* ********************* set clipping operator ****************** */ static void calc_clipping_plane(float clip[6][4], BoundBox *clipbb) diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h index 81de9ac7d34..bdcaa4a7e32 100644 --- a/source/blender/editors/space_view3d/view3d_intern.h +++ b/source/blender/editors/space_view3d/view3d_intern.h @@ -77,6 +77,8 @@ void VIEW3D_OT_view_selected(struct wmOperatorType *ot); void VIEW3D_OT_view_center_cursor(struct wmOperatorType *ot); void VIEW3D_OT_view_pan(struct wmOperatorType *ot); void VIEW3D_OT_view_persportho(struct wmOperatorType *ot); +void VIEW3D_OT_add_background_image(struct wmOperatorType *ot); +void VIEW3D_OT_remove_background_image(struct wmOperatorType *ot); void VIEW3D_OT_view_orbit(struct wmOperatorType *ot); void VIEW3D_OT_clip_border(struct wmOperatorType *ot); void VIEW3D_OT_cursor3d(struct wmOperatorType *ot); diff --git a/source/blender/editors/space_view3d/view3d_ops.c b/source/blender/editors/space_view3d/view3d_ops.c index ad5bdcf0095..2192eb13cd0 100644 --- a/source/blender/editors/space_view3d/view3d_ops.c +++ b/source/blender/editors/space_view3d/view3d_ops.c @@ -70,6 +70,8 @@ void view3d_operatortypes(void) WM_operatortype_append(VIEW3D_OT_view_orbit); WM_operatortype_append(VIEW3D_OT_view_pan); WM_operatortype_append(VIEW3D_OT_view_persportho); + WM_operatortype_append(VIEW3D_OT_add_background_image); + WM_operatortype_append(VIEW3D_OT_remove_background_image); WM_operatortype_append(VIEW3D_OT_view_selected); WM_operatortype_append(VIEW3D_OT_view_center_cursor); WM_operatortype_append(VIEW3D_OT_select); diff --git a/source/blender/makesdna/DNA_view3d_types.h b/source/blender/makesdna/DNA_view3d_types.h index 4ad18a90a6b..6546ec5747a 100644 --- a/source/blender/makesdna/DNA_view3d_types.h +++ b/source/blender/makesdna/DNA_view3d_types.h @@ -63,9 +63,14 @@ struct wmTimer; /* Background Picture in 3D-View */ typedef struct BGpic { + struct BGpic *next, *prev; + struct Image *ima; struct ImageUser iuser; float xof, yof, size, blend; + short view; + short flag; + float pad2; } BGpic; /* ********************************* */ @@ -140,7 +145,10 @@ typedef struct View3D { short view; /* XXX depricated */ struct Object *camera, *ob_centre; - struct BGpic *bgpic; + + struct ListBase bgpicbase; + struct BGpic *bgpic; /* deprecated, use bgpicbase, only kept for do_versions(...) */ + struct View3D *localvd; char ob_centre_bone[32]; /* optional string for armature bone to define center */ @@ -197,7 +205,7 @@ typedef struct View3D { /* View3D->flag (short) */ #define V3D_MODE (16+32+64+128+256+512) #define V3D_DISPIMAGE 1 -#define V3D_DISPBGPIC 2 +#define V3D_DISPBGPICS 2 #define V3D_HIDE_HELPLINES 4 #define V3D_INVALID_BACKBUF 8 #define V3D_EDITMODE 16 @@ -283,6 +291,9 @@ typedef struct View3D { #define V3D_DRAW_MANIPULATOR 2 #define V3D_CALC_MANIPULATOR 4 +/* BGPic->flag */ +/* may want to use 1 for select ?*/ +#define V3D_BGPIC_EXPANDED 2 #endif diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 4f75a7756d0..88c2eb9d121 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -425,22 +425,6 @@ static void rna_ConsoleLine_cursor_index_range(PointerRNA *ptr, int *min, int *m *max= ci->len; } -static void rna_View3D_display_background_image_set(PointerRNA *ptr, int value) -{ - View3D *vd= (View3D*)ptr->data; - - if(value) vd->flag |= V3D_DISPBGPIC; - else vd->flag &= ~V3D_DISPBGPIC; - - if((vd->flag & V3D_DISPBGPIC) && vd->bgpic == NULL) { - vd->bgpic= MEM_callocN(sizeof(BGpic), "bgpic"); - vd->bgpic->size= 5.0; - vd->bgpic->blend= 0.5; - vd->bgpic->iuser.fie_ima= 2; - vd->bgpic->iuser.ok= 1; - } -} - /* Space Time */ static void rna_SpaceTime_redraw_update(Main *bmain, Scene *scene, PointerRNA *ptr) @@ -667,6 +651,25 @@ static void rna_def_background_image(BlenderRNA *brna) StructRNA *srna; PropertyRNA *prop; + /* note: combinations work but dont flip so arnt that useful */ + static EnumPropertyItem bgpic_axis_items[] = { + {0, "", 0, "X Axis", ""}, + {(1<