diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-03-05 17:02:45 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-03-05 17:02:45 +0400 |
commit | 4f447921d21275134358781868c898ec74abd93e (patch) | |
tree | 8287b8e485fb1925cdd9cd0cf52c0d11b62c6b60 /source/blender | |
parent | f6ddb79e20d42a56460f9587326ceaeec1be2e13 (diff) |
RegionView3D.update call, to address issue in report:
[#30454] perspective_matrix not update in real time with bpy.ops.view3d.zoom
This is so you can modifify the view settings and get the view matrix after without waiting for a redraw.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/editors/include/ED_view3d.h | 1 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_draw.c | 17 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_space.c | 48 |
3 files changed, 54 insertions, 12 deletions
diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h index 23321e0e48f..de4b964baf6 100644 --- a/source/blender/editors/include/ED_view3d.h +++ b/source/blender/editors/include/ED_view3d.h @@ -292,6 +292,7 @@ struct ImBuf *ED_view3d_draw_offscreen_imbuf_simple(struct Scene *scene, struct struct Base *ED_view3d_give_base_under_cursor(struct bContext *C, const int mval[2]); void ED_view3d_quadview_update(struct ScrArea *sa, struct ARegion *ar, short do_clip); +void ED_view3d_update_viewmat(struct Scene *scene, struct View3D *v3d, struct ARegion *ar, float viewmat[][4], float winmat[][4]); int ED_view3d_lock(struct RegionView3D *rv3d); uint64_t ED_view3d_datamask(struct Scene *scene, struct View3D *v3d); diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index f1efdd1e165..98fc4105445 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -2330,22 +2330,22 @@ CustomDataMask ED_view3d_screen_datamask(bScreen *screen) return mask; } -static void view3d_main_area_setup_view(Scene *scene, View3D *v3d, ARegion *ar, float viewmat[][4], float winmat[][4]) +void ED_view3d_update_viewmat(Scene *scene, View3D *v3d, ARegion *ar, float viewmat[][4], float winmat[][4]) { - RegionView3D *rv3d= ar->regiondata; + RegionView3D *rv3d = ar->regiondata; /* setup window matrices */ if (winmat) copy_m4_m4(rv3d->winmat, winmat); else setwinmatrixview3d(ar, v3d, NULL); /* NULL= no pickrect */ - + /* setup view matrix */ if (viewmat) copy_m4_m4(rv3d->viewmat, viewmat); else setviewmatrixview3d(scene, v3d, rv3d); /* note: calls where_is_object for camera... */ - + /* update utilitity matrices */ mult_m4_m4m4(rv3d->persmat, rv3d->winmat, rv3d->viewmat); invert_m4_m4(rv3d->persinv, rv3d->persmat); @@ -2365,12 +2365,19 @@ static void view3d_main_area_setup_view(Scene *scene, View3D *v3d, ARegion *ar, v2[0]= rv3d->persmat[0][1]; v2[1]= rv3d->persmat[1][1]; v2[2]= rv3d->persmat[2][1]; - + len1= 1.0f / len_v3(v1); len2= 1.0f / len_v3(v2); rv3d->pixsize = (2.0f * MAX2(len1, len2)) / (float)MAX2(ar->winx, ar->winy); } +} + +static void view3d_main_area_setup_view(Scene *scene, View3D *v3d, ARegion *ar, float viewmat[][4], float winmat[][4]) +{ + RegionView3D *rv3d = ar->regiondata; + + ED_view3d_update_viewmat(scene, v3d, ar, viewmat, winmat); /* set for opengl */ glMatrixMode(GL_PROJECTION); diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 246673082e7..648dbc0e8d0 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -191,27 +191,33 @@ static ScrArea *rna_area_from_space(PointerRNA *ptr) return NULL; } -static void rna_area_region_from_regiondata(PointerRNA *ptr, ScrArea **sa_r, ARegion **ar_r) +static void area_region_from_regiondata(bScreen *sc, void *regiondata, ScrArea **r_sa, ARegion **r_ar) { - bScreen *sc = (bScreen*)ptr->id.data; ScrArea *sa; ARegion *ar; - void *regiondata= ptr->data; - *sa_r= NULL; - *ar_r= NULL; + *r_sa= NULL; + *r_ar= NULL; for(sa=sc->areabase.first; sa; sa=sa->next) { for(ar=sa->regionbase.first; ar; ar=ar->next) { if(ar->regiondata == regiondata) { - *sa_r= sa; - *ar_r= ar; + *r_sa= sa; + *r_ar= ar; return; } } } } +static void rna_area_region_from_regiondata(PointerRNA *ptr, ScrArea **r_sa, ARegion **r_ar) +{ + bScreen *sc = (bScreen*)ptr->id.data; + void *regiondata = ptr->data; + + area_region_from_regiondata(sc, regiondata, r_sa, r_ar); +} + static PointerRNA rna_CurrentOrientation_get(PointerRNA *ptr) { Scene *scene = ((bScreen*)ptr->id.data)->scene; @@ -452,6 +458,25 @@ static void rna_RegionView3D_view_matrix_set(PointerRNA *ptr, const float *value ED_view3d_from_m4((float (*)[4])values, rv3d->ofs, rv3d->viewquat, &rv3d->dist); } +/* api call */ +void rna_RegionView3D_update(ID *id, RegionView3D *rv3d) +{ + bScreen *sc = (bScreen *)id; + + ScrArea *sa; + ARegion *ar; + + area_region_from_regiondata(sc, rv3d, &sa, &ar); + + if (sa && ar && sa->spacetype == SPACE_VIEW3D) { + View3D *v3d; + + v3d = (View3D *)sa->spacedata.first; + + ED_view3d_update_viewmat(sc->scene, v3d, ar, NULL, NULL); + } +} + static EnumPropertyItem *rna_SpaceView3D_viewport_shade_itemf(bContext *UNUSED(C), PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *free) { Scene *scene = ((bScreen*)ptr->id.data)->scene; @@ -1714,6 +1739,15 @@ static void rna_def_space_view3d(BlenderRNA *brna) RNA_def_property_array(prop, 2); RNA_def_property_ui_text(prop, "Camera Offset", "View shift in camera view"); RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); + + /* until we have real api call */ + { + FunctionRNA *func; + + func = RNA_def_function(srna, "update", "rna_RegionView3D_update"); + RNA_def_function_flag(func, FUNC_USE_SELF_ID); + RNA_def_function_ui_description(func, "Recalculate the view matrices"); + } } static void rna_def_space_buttons(BlenderRNA *brna) |