Revision: 17968 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17968 Author: campbellbarton Date: 2008-12-20 12:33:16 +0100 (Sat, 20 Dec 2008)
Log Message: ----------- view3d operators ED_VIEW3D_OT_viewhome and ED_VIEW3D_OT_viewcenter for Home, Shift+C and PadPeriod keys. Modified Paths: -------------- branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_edit.c branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_intern.h branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_ops.c branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_view.c Modified: branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_edit.c =================================================================== --- branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_edit.c 2008-12-20 10:19:24 UTC (rev 17967) +++ branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_edit.c 2008-12-20 11:33:16 UTC (rev 17968) @@ -32,6 +32,7 @@ #include <float.h> #include "DNA_action_types.h" +#include "DNA_armature_types.h" #include "DNA_camera_types.h" #include "DNA_lamp_types.h" #include "DNA_object_types.h" @@ -671,6 +672,228 @@ RNA_def_property(ot->srna, "delta", PROP_INT, PROP_NONE); } +static int viewhome_exec(bContext *C, wmOperator *op) /* was view3d_home() in 2.4x */ +{ + ScrArea *sa= CTX_wm_area(C); + ARegion *ar= CTX_wm_region(C); + View3D *v3d= sa->spacedata.first; + Scene *scene= CTX_data_scene(C); + Base *base; + + int center= RNA_boolean_get(op->ptr, "center"); + + float size, min[3], max[3], afm[3]; + int ok= 1, onedone=0; + + if(center) { + min[0]= min[1]= min[2]= 0.0f; + max[0]= max[1]= max[2]= 0.0f; + } + else { + INIT_MINMAX(min, max); + } + + for(base= scene->base.first; base; base= base->next) { + if(base->lay & v3d->lay) { + onedone= 1; + minmax_object(base->object, min, max); + } + } + if(!onedone) return OPERATOR_FINISHED; /* TODO - should this be cancel? */ + + afm[0]= (max[0]-min[0]); + afm[1]= (max[1]-min[1]); + afm[2]= (max[2]-min[2]); + size= 0.7f*MAX3(afm[0], afm[1], afm[2]); + if(size==0.0) ok= 0; + + if(ok) { + float new_dist; + float new_ofs[3]; + + new_dist = size; + new_ofs[0]= -(min[0]+max[0])/2.0f; + new_ofs[1]= -(min[1]+max[1])/2.0f; + new_ofs[2]= -(min[2]+max[2])/2.0f; + + // correction for window aspect ratio + if(ar->winy>2 && ar->winx>2) { + size= (float)ar->winx/(float)ar->winy; + if(size<1.0) size= 1.0f/size; + new_dist*= size; + } + + if (v3d->persp==V3D_CAMOB && v3d->camera) { + /* switch out of camera view */ + float orig_lens= v3d->lens; + + v3d->persp= V3D_PERSP; + v3d->dist= 0.0; + view_settings_from_ob(v3d->camera, v3d->ofs, NULL, NULL, &v3d->lens); + smooth_view(v3d, new_ofs, NULL, &new_dist, &orig_lens); /* TODO - this dosnt work yet */ + + } else { + if(v3d->persp==V3D_CAMOB) v3d->persp= V3D_PERSP; + smooth_view(v3d, new_ofs, NULL, &new_dist, NULL); /* TODO - this dosnt work yet */ + } + } +// XXX BIF_view3d_previewrender_signal(curarea, PR_DBASE|PR_DISPRECT); + + ED_region_tag_redraw(ar); + + return OPERATOR_FINISHED; +} + +void ED_VIEW3D_OT_viewhome(wmOperatorType *ot) +{ + + /* identifiers */ + ot->name= "View home"; + ot->idname= "ED_VIEW3D_OT_viewhome"; + + /* api callbacks */ + ot->exec= viewhome_exec; + ot->poll= ED_operator_areaactive; + + RNA_def_property(ot->srna, "center", PROP_BOOLEAN, PROP_NONE); +} + +static int viewcenter_exec(bContext *C, wmOperator *op) /* like a localview without local!, was centerview() in 2.4x */ +{ + ScrArea *sa= CTX_wm_area(C); + ARegion *ar= CTX_wm_region(C); + View3D *v3d= sa->spacedata.first; + Scene *scene= CTX_data_scene(C); + Object *ob= OBACT; + float size, min[3], max[3], afm[3]; + int ok=0; + + /* SMOOTHVIEW */ + float new_ofs[3]; + float new_dist; + + INIT_MINMAX(min, max); + + if (G.f & G_WEIGHTPAINT) { + /* hardcoded exception, we look for the one selected armature */ + /* this is weak code this way, we should make a generic active/selection callback interface once... */ + Base *base; + for(base=scene->base.first; base; base= base->next) { + if(TESTBASELIB(v3d, base)) { + if(base->object->type==OB_ARMATURE) + if(base->object->flag & OB_POSEMODE) + break; + } + } + if(base) + ob= base->object; + } + + + if(G.obedit) { +// XXX ok = minmax_verts(min, max); /* only selected */ + } + else if(ob && (ob->flag & OB_POSEMODE)) { + if(ob->pose) { + bArmature *arm= ob->data; + bPoseChannel *pchan; + float vec[3]; + + for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) { + if(pchan->bone->flag & BONE_SELECTED) { + if(pchan->bone->layer & arm->layer) { + ok= 1; + VECCOPY(vec, pchan->pose_head); + Mat4MulVecfl(ob->obmat, vec); + DO_MINMAX(vec, min, max); + VECCOPY(vec, pchan->pose_tail); + Mat4MulVecfl(ob->obmat, vec); + DO_MINMAX(vec, min, max); + } + } + } + } + } + else if (FACESEL_PAINT_TEST) { +// XXX ok= minmax_tface(min, max); + } + else if (G.f & G_PARTICLEEDIT) { +// XXX ok= PE_minmax(min, max); + } + else { + Base *base= FIRSTBASE; + while(base) { + if TESTBASE(v3d, base) { + minmax_object(base->object, min, max); + /* account for duplis */ + minmax_object_duplis(base->object, min, max); + + ok= 1; + } + base= base->next; + } + } + + if(ok==0) return OPERATOR_FINISHED; + + afm[0]= (max[0]-min[0]); + afm[1]= (max[1]-min[1]); + afm[2]= (max[2]-min[2]); + size= 0.7f*MAX3(afm[0], afm[1], afm[2]); + + if(size <= v3d->near*1.5f) size= v3d->near*1.5f; + + new_ofs[0]= -(min[0]+max[0])/2.0f; + new_ofs[1]= -(min[1]+max[1])/2.0f; + new_ofs[2]= -(min[2]+max[2])/2.0f; + + new_dist = size; + + /* correction for window aspect ratio */ + if(ar->winy>2 && ar->winx>2) { + size= (float)ar->winx/(float)ar->winy; + if(size<1.0f) size= 1.0f/size; + new_dist*= size; + } + + v3d->cursor[0]= -new_ofs[0]; + v3d->cursor[1]= -new_ofs[1]; + v3d->cursor[2]= -new_ofs[2]; + + if (v3d->persp==V3D_CAMOB && v3d->camera) { + float orig_lens= v3d->lens; + + v3d->persp=V3D_PERSP; + v3d->dist= 0.0f; + view_settings_from_ob(v3d->camera, v3d->ofs, NULL, NULL, &v3d->lens); + smooth_view(v3d, new_ofs, NULL, &new_dist, &orig_lens); + } else { + if(v3d->persp==V3D_CAMOB) + v3d->persp= V3D_PERSP; + + smooth_view(v3d, new_ofs, NULL, &new_dist, NULL); + } + +// XXX BIF_view3d_previewrender_signal(curarea, PR_DBASE|PR_DISPRECT); + + ED_region_tag_redraw(ar); + + return OPERATOR_FINISHED; +} + +void ED_VIEW3D_OT_viewcenter(wmOperatorType *ot) +{ + + /* identifiers */ + ot->name= "View center"; + ot->idname= "ED_VIEW3D_OT_viewcenter"; + + /* api callbacks */ + ot->exec= viewcenter_exec; + ot->poll= ED_operator_areaactive; +} + + /* ************************* below the line! *********************** */ Modified: branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_intern.h =================================================================== --- branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_intern.h 2008-12-20 10:19:24 UTC (rev 17967) +++ branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_intern.h 2008-12-20 11:33:16 UTC (rev 17968) @@ -65,6 +65,8 @@ void ED_VIEW3D_OT_viewzoom(struct wmOperatorType *ot); void ED_VIEW3D_OT_viewmove(struct wmOperatorType *ot); void ED_VIEW3D_OT_viewrotate(struct wmOperatorType *ot); +void ED_VIEW3D_OT_viewhome(struct wmOperatorType *ot); +void ED_VIEW3D_OT_viewcenter(struct wmOperatorType *ot); /* drawobject.c */ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag); @@ -118,7 +120,6 @@ void endlocalview(Scene *scene, ScrArea *sa); void centerview(ARegion *ar, View3D *v3d); -void view3d_home(View3D *v3d, ARegion *ar, int center); void view3d_align_axis_to_vector(View3D *v3d, int axisidx, float vec[3]); Modified: branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_ops.c =================================================================== --- branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_ops.c 2008-12-20 10:19:24 UTC (rev 17967) +++ branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_ops.c 2008-12-20 11:33:16 UTC (rev 17968) @@ -64,6 +64,8 @@ WM_operatortype_append(ED_VIEW3D_OT_viewrotate); WM_operatortype_append(ED_VIEW3D_OT_viewmove); WM_operatortype_append(ED_VIEW3D_OT_viewzoom); + WM_operatortype_append(ED_VIEW3D_OT_viewhome); + WM_operatortype_append(ED_VIEW3D_OT_viewcenter); } void view3d_keymap(wmWindowManager *wm) @@ -73,11 +75,16 @@ WM_keymap_verify_item(keymap, "ED_VIEW3D_OT_viewrotate", MIDDLEMOUSE, KM_PRESS, 0, 0); WM_keymap_verify_item(keymap, "ED_VIEW3D_OT_viewmove", MIDDLEMOUSE, KM_PRESS, KM_SHIFT, 0); WM_keymap_verify_item(keymap, "ED_VIEW3D_OT_viewzoom", MIDDLEMOUSE, KM_PRESS, KM_CTRL, 0); + WM_keymap_verify_item(keymap, "ED_VIEW3D_OT_viewcenter", PADPERIOD, KM_PRESS, 0, 0); RNA_int_set(WM_keymap_add_item(keymap, "ED_VIEW3D_OT_viewzoom", PADPLUSKEY, KM_PRESS, 0, 0)->ptr, "delta", 1); RNA_int_set(WM_keymap_add_item(keymap, "ED_VIEW3D_OT_viewzoom", PADMINUS, KM_PRESS, 0, 0)->ptr, "delta", -1); RNA_int_set(WM_keymap_add_item(keymap, "ED_VIEW3D_OT_viewzoom", WHEELUPMOUSE, KM_ANY, 0, 0)->ptr, "delta", 1); RNA_int_set(WM_keymap_add_item(keymap, "ED_VIEW3D_OT_viewzoom", WHEELDOWNMOUSE, KM_ANY, 0, 0)->ptr, "delta", -1); + RNA_boolean_set(WM_keymap_add_item(keymap, "ED_VIEW3D_OT_viewhome", HOMEKEY, KM_PRESS, 0, 0)->ptr, "center", 0); + RNA_boolean_set(WM_keymap_add_item(keymap, "ED_VIEW3D_OT_viewhome", CKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "center", 1); + + } Modified: branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_view.c =================================================================== --- branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_view.c 2008-12-20 10:19:24 UTC (rev 17967) +++ branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_view.c 2008-12-20 11:33:16 UTC (rev 17968) @@ -986,123 +986,6 @@ // XXX BIF_view3d_previewrender_signal(curarea, PR_DBASE|PR_DISPRECT); } -void centerview(ARegion *ar, View3D *v3d) /* like a localview without local! */ -{ - Object *ob= OBACT; - float size, min[3], max[3], afm[3]; - int ok=0; - - /* SMOOTHVIEW */ - float new_ofs[3]; - float new_dist; - - INIT_MINMAX(min, max); - - if (G.f & G_WEIGHTPAINT) { - /* hardcoded exception, we look for the one selected armature */ - /* this is weak code this way, we should make a generic active/selection callback interface once... */ - Base *base; - for(base=FIRSTBASE; base; base= base->next) { - if(TESTBASELIB(v3d, base)) { - if(base->object->type==OB_ARMATURE) - if(base->object->flag & OB_POSEMODE) - break; - } - } - if(base) - ob= base->object; - } - - - if(G.obedit) { -// XXX ok = minmax_verts(min, max); /* only selected */ - } - else if(ob && (ob->flag & OB_POSEMODE)) { - if(ob->pose) { - bArmature *arm= ob->data; - bPoseChannel *pchan; - float vec[3]; - - for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) { @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs