[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18472] branches/blender2.5/blender/source /blender/editors/object: 2.5

Michael Fox mfoxdogg at gmail.com
Tue Jan 13 06:32:05 CET 2009


Revision: 18472
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18472
Author:   mfoxdogg
Date:     2009-01-13 06:31:33 +0100 (Tue, 13 Jan 2009)

Log Message:
-----------
  2.5
*******

- Ported  ObData to center, center new and centur cursor
	- its currently 1 operator
	- no warning or error popups until its figured out how best to do so
	- possibly full of ugly code and things done worng way, had a hard time trying to understand this code

- some more house cleaning and removal of unused functions

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/object/object_edit.c
    branches/blender2.5/blender/source/blender/editors/object/object_intern.h
    branches/blender2.5/blender/source/blender/editors/object/object_ops.c

Modified: branches/blender2.5/blender/source/blender/editors/object/object_edit.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/object/object_edit.c	2009-01-13 02:39:46 UTC (rev 18471)
+++ branches/blender2.5/blender/source/blender/editors/object/object_edit.c	2009-01-13 05:31:33 UTC (rev 18472)
@@ -902,94 +902,8 @@
 	BIF_undo_push("Add hook");
 }
 
-void make_track(Scene *scene, View3D *v3d, short mode)
-{
-	Base *base;
-	/*short mode=0;*/
-	
-	if(scene->id.lib) return;
-	if(scene->obedit) {
-		return; 
-	}
-	if(BASACT==0) return;
-
-	mode= pupmenu("Make Track %t|TrackTo Constraint %x1|LockTrack Constraint %x2|Old Track %x3");
-	if (mode == 0){
-		return;
-	}
-	else if (mode == 1){
-		bConstraint *con;
-		bTrackToConstraint *data;
-
-		for(base= FIRSTBASE; base; base= base->next) {
-			if(TESTBASELIB(v3d, base)) {
-				if(base!=BASACT) {
-					con = add_new_constraint(CONSTRAINT_TYPE_TRACKTO);
-					strcpy (con->name, "AutoTrack");
-
-					data = con->data;
-					data->tar = BASACT->object;
-					base->object->recalc |= OB_RECALC;
-					
-					/* Lamp and Camera track differently by default */
-					if (base->object->type == OB_LAMP || base->object->type == OB_CAMERA) {
-						data->reserved1 = TRACK_nZ;
-						data->reserved2 = UP_Y;
-					}
-
-					add_constraint_to_object(con, base->object);
-				}
-			}
-		}
-
-	}
-	else if (mode == 2){
-		bConstraint *con;
-		bLockTrackConstraint *data;
-
-		for(base= FIRSTBASE; base; base= base->next) {
-			if(TESTBASELIB(v3d, base)) {
-				if(base!=BASACT) {
-					con = add_new_constraint(CONSTRAINT_TYPE_LOCKTRACK);
-					strcpy (con->name, "AutoTrack");
-
-					data = con->data;
-					data->tar = BASACT->object;
-					base->object->recalc |= OB_RECALC;
-					
-					/* Lamp and Camera track differently by default */
-					if (base->object->type == OB_LAMP || base->object->type == OB_CAMERA) {
-						data->trackflag = TRACK_nZ;
-						data->lockflag = LOCK_Y;
-					}
-
-					add_constraint_to_object(con, base->object);
-				}
-			}
-		}
-
-	}
-	else if (mode == 3){
-		for(base= FIRSTBASE; base; base= base->next) {
-			if(TESTBASELIB(v3d, base)) {
-				if(base!=BASACT) {
-					base->object->track= BASACT->object;
-					base->object->recalc |= OB_RECALC;
-				}
-			}
-		}
-	}
-
-	allqueue(REDRAWOOPS, 0);
-	allqueue(REDRAWVIEW3D, 0);
-	DAG_scene_sort(scene);
-	
-	BIF_undo_push("Make Track");
-}
-
 /* ******************** clear parent operator ******************* */
 
-
 static EnumPropertyItem prop_clear_parent_types[] = {
 	{0, "CLEAR", "Clear Parent", ""},
 	{1, "CLEAR_KEEP_TRANSFORM", "Clear and Keep Transformation (Clear Track)", ""},
@@ -2139,15 +2053,14 @@
 	Scene *scene= CTX_data_scene(C);
 	ScrArea *sa= CTX_wm_area(C);
 	View3D *v3d= sa->spacedata.first;
-	Base *base;
-	
+		
 	if(scene->id.lib) return OPERATOR_CANCELLED;
 
 	if(RNA_enum_is_equal(op->ptr, "type", "TRACKTO")){
 		bConstraint *con;
 		bTrackToConstraint *data;
 
-		for(base= FIRSTBASE; base; base= base->next) {
+		CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
 			if(TESTBASELIB(v3d, base)) {
 				if(base!=BASACT) {
 					con = add_new_constraint(CONSTRAINT_TYPE_TRACKTO);
@@ -2167,13 +2080,13 @@
 				}
 			}
 		}
-
+		CTX_DATA_END;
 	}
 	else if(RNA_enum_is_equal(op->ptr, "type", "LOCKTRACK")){
 		bConstraint *con;
 		bLockTrackConstraint *data;
 
-		for(base= FIRSTBASE; base; base= base->next) {
+		CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
 			if(TESTBASELIB(v3d, base)) {
 				if(base!=BASACT) {
 					con = add_new_constraint(CONSTRAINT_TYPE_LOCKTRACK);
@@ -2193,10 +2106,10 @@
 				}
 			}
 		}
-
+		CTX_DATA_END;
 	}
 	else if(RNA_enum_is_equal(op->ptr, "type", "OLDTRACK")){
-		for(base= FIRSTBASE; base; base= base->next) {
+		CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
 			if(TESTBASELIB(v3d, base)) {
 				if(base!=BASACT) {
 					base->object->track= BASACT->object;
@@ -2204,6 +2117,7 @@
 				}
 			}
 		}
+		CTX_DATA_END;
 	}
 	DAG_scene_sort(CTX_data_scene(C));
 	ED_anim_dag_flush_update(C);	
@@ -2231,8 +2145,363 @@
 	prop = RNA_def_property(ot->srna, "type", PROP_ENUM, PROP_NONE);
 	RNA_def_property_enum_items(prop, prop_make_track_types);
 }
+/* ******************* Set Object Center ********************** */
 
+static EnumPropertyItem prop_set_center_types[] = {
+	{0, "CENTER", "ObData to Center", "Move object data around Object center"},
+	{1, "CENTERNEW", "Center New", "Move Object center to center of object data"},
+	{2, "CENTERCURSOR", "Center Cursor", "Move Object Center to position of the 3d cursor"},
+	{0, NULL, NULL, NULL}
+};
 
+/* 0 == do center, 1 == center new, 2 == center cursor */
+static int object_set_center_exec(bContext *C, wmOperator *op)
+{
+	Scene *scene= CTX_data_scene(C);
+	ScrArea *sa= CTX_wm_area(C);
+	View3D *v3d= sa->spacedata.first;
+	Object *obedit= CTX_data_edit_object(C);
+	Object *ob;
+	Mesh *me, *tme;
+	Curve *cu;
+/*	BezTriple *bezt;
+	BPoint *bp; */
+	Nurb *nu, *nu1;
+	EditVert *eve;
+	float cent[3], centn[3], min[3], max[3], omat[3][3];
+	int a, total= 0;
+	int centermode = RNA_enum_get(op->ptr, "type");
+	
+	/* keep track of what is changed */
+	int tot_change=0, tot_lib_error=0, tot_multiuser_arm_error=0;
+	MVert *mvert;
+
+	if(scene->id.lib || v3d==NULL) return OPERATOR_CANCELLED;
+	if (obedit && centermode > 0) return OPERATOR_CANCELLED;
+		
+	cent[0]= cent[1]= cent[2]= 0.0;	
+	
+	if(obedit) {
+
+		INIT_MINMAX(min, max);
+	
+		if(obedit->type==OB_MESH) {
+			Mesh *me= obedit->data;
+			
+			for(eve= me->edit_mesh->verts.first; eve; eve= eve->next) {
+				if(v3d->around==V3D_CENTROID) {
+					total++;
+					VECADD(cent, cent, eve->co);
+				}
+				else {
+					DO_MINMAX(eve->co, min, max);
+				}
+			}
+			
+			if(v3d->around==V3D_CENTROID) {
+				VecMulf(cent, 1.0f/(float)total);
+			}
+			else {
+				cent[0]= (min[0]+max[0])/2.0f;
+				cent[1]= (min[1]+max[1])/2.0f;
+				cent[2]= (min[2]+max[2])/2.0f;
+			}
+			
+			for(eve= me->edit_mesh->verts.first; eve; eve= eve->next) {
+				VecSubf(eve->co, eve->co, cent);			
+			}
+			
+			recalc_editnormals(me->edit_mesh);
+			tot_change++;
+			DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+		}
+	}
+	
+	/* reset flags */
+	CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
+			base->object->flag &= ~OB_DONE;
+	}
+	CTX_DATA_END;
+	
+	for (me= G.main->mesh.first; me; me= me->id.next) {
+		me->flag &= ~ME_ISDONE;
+	}
+	
+	CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
+		if((base->object->flag & OB_DONE)==0) {
+			base->object->flag |= OB_DONE;
+				
+			if(base->object->id.lib) {
+				tot_lib_error++;
+			}
+			else if(obedit==0 && (me=get_mesh(base->object)) ) {
+				if (me->id.lib) {
+					tot_lib_error++;
+				} else {
+					if(centermode==2) {
+						VECCOPY(cent, give_cursor(scene, v3d));
+						Mat4Invert(base->object->imat, base->object->obmat);
+						Mat4MulVecfl(base->object->imat, cent);
+					} else {
+						INIT_MINMAX(min, max);
+						mvert= me->mvert;
+						for(a=0; a<me->totvert; a++, mvert++) {
+							DO_MINMAX(mvert->co, min, max);
+						}
+					
+						cent[0]= (min[0]+max[0])/2.0f;
+						cent[1]= (min[1]+max[1])/2.0f;
+						cent[2]= (min[2]+max[2])/2.0f;
+					}
+
+					mvert= me->mvert;
+					for(a=0; a<me->totvert; a++, mvert++) {
+						VecSubf(mvert->co, mvert->co, cent);
+					}
+					
+					if (me->key) {
+						KeyBlock *kb;
+						for (kb=me->key->block.first; kb; kb=kb->next) {
+							float *fp= kb->data;
+							
+							for (a=0; a<kb->totelem; a++, fp+=3) {
+								VecSubf(fp, fp, cent);
+							}
+						}
+					}
+						
+					me->flag |= ME_ISDONE;
+						
+					if(centermode) {
+						Mat3CpyMat4(omat, base->object->obmat);
+						
+						VECCOPY(centn, cent);
+						Mat3MulVecfl(omat, centn);
+						base->object->loc[0]+= centn[0];
+						base->object->loc[1]+= centn[1];
+						base->object->loc[2]+= centn[2];
+						
+						where_is_object(scene, base->object);
+						ignore_parent_tx(scene, base->object);
+						
+						/* other users? */
+						CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
+							ob = base->object;
+							if((ob->flag & OB_DONE)==0) {
+								tme= get_mesh(ob);
+								
+								if(tme==me) {
+									
+									ob->flag |= OB_DONE;
+									ob->recalc= OB_RECALC_OB|OB_RECALC_DATA;
+
+									Mat3CpyMat4(omat, ob->obmat);
+									VECCOPY(centn, cent);
+									Mat3MulVecfl(omat, centn);
+									ob->loc[0]+= centn[0];
+									ob->loc[1]+= centn[1];
+									ob->loc[2]+= centn[2];
+									
+									where_is_object(scene, ob);
+									ignore_parent_tx(scene, ob);
+									
+									if(tme && (tme->flag & ME_ISDONE)==0) {
+										mvert= tme->mvert;
+										for(a=0; a<tme->totvert; a++, mvert++) {
+											VecSubf(mvert->co, mvert->co, cent);
+										}
+										
+										if (tme->key) {
+											KeyBlock *kb;
+											for (kb=tme->key->block.first; kb; kb=kb->next) {
+												float *fp= kb->data;
+												
+												for (a=0; a<kb->totelem; a++, fp+=3) {
+													VecSubf(fp, fp, cent);
+												}
+											}
+										}
+										
+										tme->flag |= ME_ISDONE;
+									}
+								}
+							}
+							
+							ob= ob->id.next;
+						}
+						CTX_DATA_END;
+					}
+					tot_change++;
+				}
+			}
+			else if (ELEM(base->object->type, OB_CURVE, OB_SURF)) {
+				
+				/* totally weak code here... (ton) */
+				if(obedit==base->object) {
+					extern ListBase editNurb;
+					nu1= editNurb.first;
+					cu= obedit->data;
+				}
+				else {
+					cu= base->object->data;
+					nu1= cu->nurb.first;
+				}
+				
+				if (cu->id.lib) {
+					tot_lib_error++;
+				} else {
+					if(centermode==2) {
+						VECCOPY(cent, give_cursor(scene, v3d));
+						Mat4Invert(base->object->imat, base->object->obmat);
+						Mat4MulVecfl(base->object->imat, cent);
+
+						/* don't allow Z change if curve is 2D */
+						if( !( cu->flag & CU_3D ) )
+							cent[2] = 0.0;
+					} 
+					else {
+						INIT_MINMAX(min, max);
+						
+						nu= nu1;
+						while(nu) {
+							minmaxNurb(nu, min, max);
+							nu= nu->next;
+						}
+						
+						cent[0]= (min[0]+max[0])/2.0f;
+						cent[1]= (min[1]+max[1])/2.0f;
+						cent[2]= (min[2]+max[2])/2.0f;
+					}
+					
+					nu= nu1;
+					while(nu) {
+						if( (nu->type & 7)==1) {
+							a= nu->pntsu;
+							while (a--) {
+								VecSubf(nu->bezt[a].vec[0], nu->bezt[a].vec[0], cent);
+								VecSubf(nu->bezt[a].vec[1], nu->bezt[a].vec[1], cent);
+								VecSubf(nu->bezt[a].vec[2], nu->bezt[a].vec[2], cent);
+							}
+						}
+						else {
+							a= nu->pntsu*nu->pntsv;
+							while (a--)

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list