[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23772] trunk/blender/source/blender/ editors: bugfix for exitmode verts being unselectable.

Campbell Barton ideasman42 at gmail.com
Sun Oct 11 21:57:56 CEST 2009


Revision: 23772
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23772
Author:   campbellbarton
Date:     2009-10-11 21:57:56 +0200 (Sun, 11 Oct 2009)

Log Message:
-----------
bugfix for exitmode verts being unselectable. caused by view3d_project_short_clip/noclip being used by selecton code outside of object drawing (which isnt supposed to happen according to view3d_project_short_* comments).

Deal with this by adding ED_view3d_init_mats_rv3d(ob, r3d) which initialized the region mat's and is used in mesh_foreachScreenVert, mesh_foreachScreenEdge etc.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/include/ED_view3d.h
    trunk/blender/source/blender/editors/mesh/editmesh.c
    trunk/blender/source/blender/editors/space_view3d/drawobject.c
    trunk/blender/source/blender/editors/space_view3d/space_view3d.c

Modified: trunk/blender/source/blender/editors/include/ED_view3d.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_view3d.h	2009-10-11 19:06:38 UTC (rev 23771)
+++ trunk/blender/source/blender/editors/include/ED_view3d.h	2009-10-11 19:57:56 UTC (rev 23772)
@@ -134,5 +134,7 @@
 /* get 3d region from context, also if mouse is in header or toolbar */
 struct RegionView3D *ED_view3d_context_rv3d(struct bContext *C);
 
+void ED_view3d_init_mats_rv3d(struct Object *ob, struct RegionView3D *rv3d);
+
 #endif /* ED_VIEW3D_H */
 

Modified: trunk/blender/source/blender/editors/mesh/editmesh.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh.c	2009-10-11 19:06:38 UTC (rev 23771)
+++ trunk/blender/source/blender/editors/mesh/editmesh.c	2009-10-11 19:57:56 UTC (rev 23772)
@@ -1796,6 +1796,14 @@
 
 /* *************** END UNDO *************/
 
+void EM_init_viewmats(Object *ob, RegionView3D *rv3d)
+{
+	wmMultMatrix(ob->obmat);
+	/* local viewmat and persmat, to calculate projections */
+	wmGetMatrix(rv3d->viewmatob);
+	wmGetSingleMatrix(rv3d->persmatob);
+}
+
 static EditVert **g_em_vert_array = NULL;
 static EditEdge **g_em_edge_array = NULL;
 static EditFace **g_em_face_array = NULL;

Modified: trunk/blender/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/drawobject.c	2009-10-11 19:06:38 UTC (rev 23771)
+++ trunk/blender/source/blender/editors/space_view3d/drawobject.c	2009-10-11 19:57:56 UTC (rev 23772)
@@ -139,7 +139,9 @@
 static void draw_empty_cone(float size);
 
 
-/* ************* only use while object drawing ************** */
+/* ************* only use while object drawing **************
+ * or after running ED_view3d_init_mats_rv3d
+ * */
 static void view3d_project_short_clip(ARegion *ar, float *vec, short *adr)
 {
 	RegionView3D *rv3d= ar->regiondata;
@@ -1205,6 +1207,8 @@
 	int i, N = lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
 	short s[2] = {IS_CLIPPED, 0};
 
+	ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d); /* so view3d_project_short works */
+
 	for (i=0; i<N; i++, bp++, co+=3) {
 		if (bp->hide==0) {
 			view3d_project_short_clip(vc->ar, dl?co:bp->vec, s);
@@ -1328,6 +1332,7 @@
 	data.userData = userData;
 	data.clipVerts = clipVerts;
 
+	ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d); /* so view3d_project_short works */
 	EM_init_index_arrays(vc->em, 1, 0, 0);
 	dm->foreachMappedVert(dm, mesh_foreachScreenVert__mapFunc, &data);
 	EM_free_index_arrays();
@@ -1370,6 +1375,7 @@
 	data.userData = userData;
 	data.clipVerts = clipVerts;
 
+	ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d); /* so view3d_project_short works */
 	EM_init_index_arrays(vc->em, 0, 1, 0);
 	dm->foreachMappedEdge(dm, mesh_foreachScreenEdge__mapFunc, &data);
 	EM_free_index_arrays();
@@ -1399,6 +1405,7 @@
 	data.func = func;
 	data.userData = userData;
 
+	ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d); /* so view3d_project_short works */
 	EM_init_index_arrays(vc->em, 0, 0, 1);
 	dm->foreachMappedFaceCenter(dm, mesh_foreachScreenFace__mapFunc, &data);
 	EM_free_index_arrays();
@@ -1413,6 +1420,8 @@
 	Nurb *nu;
 	int i;
 
+	ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d); /* so view3d_project_short works */
+
 	for (nu= cu->editnurb->first; nu; nu=nu->next) {
 		if(nu->type == CU_BEZIER) {
 			for (i=0; i<nu->pntsu; i++) {
@@ -5451,11 +5460,9 @@
 	/* draw paths... */
 	// TODO...
 
-	/* multiply view with object matrix */
-	wmMultMatrix(ob->obmat);
-	/* local viewmat and persmat, to calculate projections */
-	wmGetMatrix(rv3d->viewmatob);
-	wmGetSingleMatrix(rv3d->persmatob);
+	/* multiply view with object matrix.
+	 * local viewmat and persmat, to calculate projections */
+	ED_view3d_init_mats_rv3d(ob, rv3d);
 
 	/* which wire color */
 	if((flag & DRAW_CONSTCOLOR) == 0) {

Modified: trunk/blender/source/blender/editors/space_view3d/space_view3d.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/space_view3d.c	2009-10-11 19:06:38 UTC (rev 23771)
+++ trunk/blender/source/blender/editors/space_view3d/space_view3d.c	2009-10-11 19:57:56 UTC (rev 23772)
@@ -158,6 +158,24 @@
 	return rv3d;
 }
 
+/* Most of the time this isn't needed since you could assume the view matrix was
+ * set while drawing, however when functions like mesh_foreachScreenVert are
+ * called by selection tools, we can't be sure this object was the last.
+ *
+ * for example, transparent objects are drawn after editmode and will cause
+ * the rv3d mat's to change and break selection.
+ *
+ * 'ED_view3d_init_mats_rv3d' should be called before
+ * view3d_project_short_clip and view3d_project_short_noclip in cases where
+ * these functions are not used during draw_object
+ */
+void ED_view3d_init_mats_rv3d(struct Object *ob, struct RegionView3D *rv3d)
+{
+	wmMultMatrix(ob->obmat);
+	/* local viewmat and persmat, to calculate projections */
+	wmGetMatrix(rv3d->viewmatob);
+	wmGetSingleMatrix(rv3d->persmatob);
+}
 
 /* ******************** default callbacks for view3d space ***************** */
 





More information about the Bf-blender-cvs mailing list