[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44647] trunk/blender/source/blender: RegionView3D.update call, to address issue in report:

Campbell Barton ideasman42 at gmail.com
Mon Mar 5 14:02:59 CET 2012


Revision: 44647
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44647
Author:   campbellbarton
Date:     2012-03-05 13:02:45 +0000 (Mon, 05 Mar 2012)
Log Message:
-----------
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.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/include/ED_view3d.h
    trunk/blender/source/blender/editors/space_view3d/view3d_draw.c
    trunk/blender/source/blender/makesrna/intern/rna_space.c

Modified: trunk/blender/source/blender/editors/include/ED_view3d.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_view3d.h	2012-03-05 11:49:24 UTC (rev 44646)
+++ trunk/blender/source/blender/editors/include/ED_view3d.h	2012-03-05 13:02:45 UTC (rev 44647)
@@ -292,6 +292,7 @@
 
 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);

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_draw.c	2012-03-05 11:49:24 UTC (rev 44646)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_draw.c	2012-03-05 13:02:45 UTC (rev 44647)
@@ -2330,22 +2330,22 @@
 	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,13 +2365,20 @@
 		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);
 	glLoadMatrixf(rv3d->winmat);

Modified: trunk/blender/source/blender/makesrna/intern/rna_space.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_space.c	2012-03-05 11:49:24 UTC (rev 44646)
+++ trunk/blender/source/blender/makesrna/intern/rna_space.c	2012-03-05 13:02:45 UTC (rev 44647)
@@ -191,27 +191,33 @@
 	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 @@
 	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 @@
 	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)




More information about the Bf-blender-cvs mailing list