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

Reply via email to