[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27128] trunk/blender: view selected now uses boundboxes of dupli-objects and ignores centerpoints of the instance objects when it has duplis .

Campbell Barton ideasman42 at gmail.com
Wed Feb 24 21:11:37 CET 2010


Revision: 27128
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27128
Author:   campbellbarton
Date:     2010-02-24 21:11:35 +0100 (Wed, 24 Feb 2010)

Log Message:
-----------
view selected now uses boundboxes of dupli-objects and ignores centerpoints of the instance objects when it has duplis. view selected also working again for selected paint mask faces.

Modified Paths:
--------------
    trunk/blender/release/scripts/ui/space_view3d.py
    trunk/blender/source/blender/blenkernel/BKE_object.h
    trunk/blender/source/blender/blenkernel/intern/object.c
    trunk/blender/source/blender/editors/mesh/editface.c
    trunk/blender/source/blender/editors/space_view3d/view3d_edit.c

Modified: trunk/blender/release/scripts/ui/space_view3d.py
===================================================================
--- trunk/blender/release/scripts/ui/space_view3d.py	2010-02-24 18:57:21 UTC (rev 27127)
+++ trunk/blender/release/scripts/ui/space_view3d.py	2010-02-24 20:11:35 UTC (rev 27128)
@@ -849,7 +849,6 @@
         layout = self.layout
 
         layout.operator("paint.vertex_color_set")
-        layout.operator("paint.vertex_color_set", text="Set Selected Vertex Colors").selected = True
 
 
 class VIEW3D_MT_hook(bpy.types.Menu):

Modified: trunk/blender/source/blender/blenkernel/BKE_object.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_object.h	2010-02-24 18:57:21 UTC (rev 27127)
+++ trunk/blender/source/blender/blenkernel/BKE_object.h	2010-02-24 20:11:35 UTC (rev 27128)
@@ -112,7 +112,7 @@
 struct BoundBox *object_get_boundbox(struct Object *ob);
 void object_boundbox_flag(struct Object *ob, int flag, int set);
 void minmax_object(struct Object *ob, float *min, float *max);
-void minmax_object_duplis(struct Scene *scene, struct Object *ob, float *min, float *max);
+int minmax_object_duplis(struct Scene *scene, struct Object *ob, float *min, float *max);
 void solve_tracking (struct Object *ob, float targetmat[][4]);
 int ray_hit_boundbox(struct BoundBox *bb, float ray_start[3], float ray_normal[3]);
 

Modified: trunk/blender/source/blender/blenkernel/intern/object.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/object.c	2010-02-24 18:57:21 UTC (rev 27127)
+++ trunk/blender/source/blender/blenkernel/intern/object.c	2010-02-24 20:11:35 UTC (rev 27128)
@@ -2373,25 +2373,37 @@
 	}
 }
 
-/* TODO - use dupli objects bounding boxes */
-void minmax_object_duplis(Scene *scene, Object *ob, float *min, float *max)
+int minmax_object_duplis(Scene *scene, Object *ob, float *min, float *max)
 {
+	int ok= 0;
 	if ((ob->transflag & OB_DUPLI)==0) {
-		return;
+		return ok;
 	} else {
 		ListBase *lb;
 		DupliObject *dob;
 		
 		lb= object_duplilist(scene, ob);
 		for(dob= lb->first; dob; dob= dob->next) {
-			if(dob->no_draw);
-			else {
-				/* should really use bound box of dup object */
-				DO_MINMAX(dob->mat[3], min, max);
+			if(dob->no_draw == 0) {
+				BoundBox *bb= object_get_boundbox(dob->ob);
+
+				if(bb) {
+					int i;
+					for(i=0; i<8; i++) {
+						float vec[3];
+						mul_v3_m4v3(vec, dob->mat, bb->vec[i]);
+						DO_MINMAX(vec, min, max);
+						// print_v3(dob->ob->id.name, vec); // some dupligroups give odd results - campbell
+					}
+
+					ok= 1;
+				}
 			}
 		}
 		free_object_duplilist(lb);	/* does restore */
 	}
+
+	return ok;
 }
 
 

Modified: trunk/blender/source/blender/editors/mesh/editface.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editface.c	2010-02-24 18:57:21 UTC (rev 27127)
+++ trunk/blender/source/blender/editors/mesh/editface.c	2010-02-24 20:11:35 UTC (rev 27128)
@@ -450,52 +450,28 @@
 // XXX notifier!		object_tface_flags_changed(OBACT, 0);
 }
 
-int minmax_tface(Scene *scene, float *min, float *max)
+int minmax_tface(Scene *scene, Object *ob, float *min, float *max)
 {
-	Object *ob;
-	Mesh *me;
+	Mesh *me= get_mesh(ob);
 	MFace *mf;
-	MTFace *tf;
 	MVert *mv;
 	int a, ok=0;
-	float vec[3], bmat[3][3];
-	
-	ob = OBACT;
-	if (ob==0) return ok;
-	me= get_mesh(ob);
-	if(me==0 || me->mtface==0) return ok;
-	
-	copy_m3_m4(bmat, ob->obmat);
+	float vec[3];
 
+	if(me==NULL)
+		return ok;
+
 	mv= me->mvert;
 	mf= me->mface;
-	tf= me->mtface;
-	for (a=me->totface; a>0; a--, mf++, tf++) {
-		if (mf->flag & ME_HIDE || !(mf->flag & ME_FACE_SEL))
-			continue;
-
-		VECCOPY(vec, (mv+mf->v1)->co);
-		mul_m3_v3(bmat, vec);
-		add_v3_v3v3(vec, vec, ob->obmat[3]);
-		DO_MINMAX(vec, min, max);		
-
-		VECCOPY(vec, (mv+mf->v2)->co);
-		mul_m3_v3(bmat, vec);
-		add_v3_v3v3(vec, vec, ob->obmat[3]);
-		DO_MINMAX(vec, min, max);		
-
-		VECCOPY(vec, (mv+mf->v3)->co);
-		mul_m3_v3(bmat, vec);
-		add_v3_v3v3(vec, vec, ob->obmat[3]);
-		DO_MINMAX(vec, min, max);		
-
-		if (mf->v4) {
-			VECCOPY(vec, (mv+mf->v4)->co);
-			mul_m3_v3(bmat, vec);
-			add_v3_v3v3(vec, vec, ob->obmat[3]);
-			DO_MINMAX(vec, min, max);
+	for (a=me->totface; a>0; a--, mf++) {
+		if ((mf->flag & ME_HIDE || !(mf->flag & ME_FACE_SEL)) == 0) {
+			int i= mf->v4 ? 3:2;
+			do {
+				mul_v3_m4v3(vec, ob->obmat, (mv + (*(&mf->v1 + i)))->co);
+				DO_MINMAX(vec, min, max);
+			} while (i--);
+			ok= 1;
 		}
-		ok= 1;
 	}
 	return ok;
 }

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_edit.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_edit.c	2010-02-24 18:57:21 UTC (rev 27127)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_edit.c	2010-02-24 20:11:35 UTC (rev 27128)
@@ -1384,7 +1384,7 @@
 		}
 	}
 	else if (paint_facesel_test(ob)) {
-// XXX		ok= minmax_tface(min, max);
+		ok= minmax_tface(scene, ob, min, max);
 	}
 	else if (ob && (ob->mode & OB_MODE_PARTICLE_EDIT)) {
 		ok= PE_minmax(scene, min, max);
@@ -1393,9 +1393,10 @@
 		Base *base= FIRSTBASE;
 		while(base) {
 			if(TESTBASE(v3d, base))  {
-				minmax_object(base->object, min, max);
+
 				/* account for duplis */
-				minmax_object_duplis(scene, base->object, min, max);
+				if (minmax_object_duplis(scene, base->object, min, max)==0)
+					minmax_object(base->object, min, max); /* use if duplis not found */
 
 				ok= 1;
 			}





More information about the Bf-blender-cvs mailing list