forked from bartvdbraak/blender
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.
This commit is contained in:
parent
f6ddb79e20
commit
4f447921d2
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user