[Bf-committers] features! features! get your juicy little features!

Roel Spruit bf-committers@blender.org
Wed, 17 Sep 2003 00:14:50 +0200


This is a multi-part message in MIME format.

------=_NextPart_000_0000_01C37CB0.B61EDC70
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: 7bit

Hiya,

I got some patches to share, do what you want with them! (hopefully commit
:)

1) Seperate unconnected:
	I made a menu for p key (I know, I know, extra clicking) where you can
seperate an object based on "loose" or
	"unconnected" objects that it contains.
	there was some discussion about where to place this feature, because making
all hotkeys into a menu is not the way to go.
	maybe the new gui will bring the solution.

2) get faces with same uv-image
	this feature (located under the special (wkey) menu in facemode) selects
all faces that have the same uv-image as the active face.
	especially handy when you want to re-map 1 image and don't want to select
all faces that have this image.

#1 can wait till the new gui, I myself don't see a reason why #2 can't be
included....but it's all up to you!

cyaaazzz

Roel

------=_NextPart_000_0000_01C37CB0.B61EDC70
Content-Type: application/octet-stream;
	name="get_same_uv.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
	filename="get_same_uv.patch"

? Changes
? obj
? bin/SDL.dll
? bin/WS_FTP.LOG
? bin/blender.exp
? bin/blender.lib
? bin/debug
? bin/gnu_gettext.dll
? intern/obj
? intern/make/msvc_6_0/Debug
? intern/make/msvc_6_0/Release
? intern/make/msvc_6_0/build_install_all.plg
? intern/make/msvc_6_0/intern.ncb
? intern/make/msvc_6_0/intern.opt
? projectfiles/blender/blender.ncb
? projectfiles/blender/blender.opt
? projectfiles/blender/blender.plg
? projectfiles/blender/makesdna/DNA_makesdna.pdb
? source/blender/makesdna/intern/DNA_makesdna.ilk
? source/blender/makesdna/intern/dna.c
Index: source/blender/include/BDR_editface.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: =
/cvsroot/bf-blender/blender/source/blender/include/BDR_editface.h,v
retrieving revision 1.5
diff -u -r1.5 BDR_editface.h
--- source/blender/include/BDR_editface.h	27 Dec 2002 13:10:20 -0000	1.5
+++ source/blender/include/BDR_editface.h	14 Sep 2003 20:47:57 -0000
@@ -51,7 +51,8 @@
 float CalcNormUV(float *a, float *b, float *c);
 void uv_autocalc_tface(void);
 void set_faceselect(void);
-void face_draw(void);  =20
+void face_draw(void);
+void get_same_uv(void);
=20
 #endif /* BDR_EDITFACE_H */

Index: source/blender/src/editface.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /cvsroot/bf-blender/blender/source/blender/src/editface.c,v
retrieving revision 1.8
diff -u -r1.8 editface.c
--- source/blender/src/editface.c	11 Jun 2003 15:43:20 -0000	1.8
+++ source/blender/src/editface.c	14 Sep 2003 20:48:00 -0000
@@ -1362,4 +1362,71 @@
 	allqueue(REDRAWIMAGE, 0);
 	allqueue(REDRAWHEADERS, 0);
 }
-#endif /* NAN_TPT */
+
+/**
+ * Selects all faces which have the same uv-texture as the active face=20
+ * @author	Roel Spruit
+ * @return	Void
+ * Errors:	- Active object not in this layer
+ *		- No active face or active face has no UV-texture		=09
+ */
+void get_same_uv()
+{
+	Object *ob;
+	Mesh *me;
+	TFace *tface;=09
+	short a, foundtex=3D0;
+	Image *ima;
+	char uvname[160];
+=09
+	ob =3D OBACT;
+	if (!(ob->lay & G.vd->lay)) {
+		error("Active object not in this layer!");
+		return;
+	}
+	me =3D get_mesh(ob);
+=09
+	=09
+	/* Search for the active face with a UV-Texture */
+	tface =3D me->tface;
+	a =3D me->totface;
+	while (a--) {	=09
+		if(tface->flag & TF_ACTIVE){		=09
+			ima=3Dtface->tpage;
+			if(ima && ima->name){
+				strcpy(uvname,ima->name);		=09
+				a=3D0;
+				foundtex=3D1;
+			}
+		}
+		tface++;
+	}	=09
+=09
+	if(!foundtex) {
+		error("No active face or active face has no UV-texture");
+		return;
+	}
+
+	/* select everything with the same texture */
+	tface =3D me->tface;
+	a =3D me->totface;
+	while (a--) {	=09
+		ima=3Dtface->tpage;
+		if(ima && ima->name){
+			if(!strcmp(ima->name, uvname)){
+				tface->flag |=3D TF_SELECT;
+			}
+			else tface->flag &=3D ~TF_SELECT;
+		}
+		else tface->flag &=3D ~TF_SELECT;
+		tface++;
+	}
+=09
+
+=09
+	/* image window redraw */
+	allqueue(REDRAWIMAGE, 0);
+	allqueue(REDRAWBUTSGAME, 0);
+	allqueue(REDRAWVIEW3D, 0);
+}
+#endif /* NAN_TPT */
\ No newline at end of file

Index: source/blender/src/editobject.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /cvsroot/bf-blender/blender/source/blender/src/editobject.c,v
retrieving revision 1.15
diff -u -r1.15 editobject.c
--- source/blender/src/editobject.c	14 Aug 2003 15:18:32 -0000	1.15
+++ source/blender/src/editobject.c	14 Sep 2003 20:48:15 -0000
@@ -1396,7 +1396,7 @@
 		=09
 			if(me=3D=3D0 || me->tface=3D=3D0) return;
 		=09
-			nr=3D pupmenu("Specials%t|Set     Tex%x1|         Shared%x2|         =
Light%x3|         Invisible%x4|         Collision%x5|Clr     Tex%x6|     =
    Shared%x7|         Light%x8|         Invisible%x9|         =
Collision%x10");
+			nr=3D pupmenu("Specials%t|Set     Tex%x1|         Shared%x2|         =
Light%x3|         Invisible%x4|         Collision%x5|Clr     Tex%x6|     =
    Shared%x7|         Light%x8|         Invisible%x9|         =
Collision%x10|Sel     Same tex%x11");
 =09
 			for(a=3Dme->totface, tface=3D me->tface; a>0; a--, tface++) {
 				if(tface->flag & SELECT) {
@@ -1423,6 +1423,8 @@
 						tface->mode &=3D ~TF_INVISIBLE; break;
 					case 10:
 						tface->mode &=3D ~TF_DYNAMIC; break;
+					case 11:
+						get_same_uv(); break;
 					}
 				}
 			}

------=_NextPart_000_0000_01C37CB0.B61EDC70
Content-Type: application/octet-stream;
	name="seperate_unconnected.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
	filename="seperate_unconnected.patch"

? Changes
? obj
? bin/SDL.dll
? bin/WS_FTP.LOG
? bin/blender.exp
? bin/blender.lib
? bin/debug
? bin/gnu_gettext.dll
? intern/obj
? intern/make/msvc_6_0/Debug
? intern/make/msvc_6_0/Release
? intern/make/msvc_6_0/build_install_all.plg
? intern/make/msvc_6_0/intern.ncb
? intern/make/msvc_6_0/intern.opt
? projectfiles/blender/blender.ncb
? projectfiles/blender/blender.opt
? projectfiles/blender/blender.plg
? projectfiles/blender/makesdna/DNA_makesdna.pdb
? source/blender/makesdna/intern/DNA_makesdna.ilk
? source/blender/makesdna/intern/dna.c
Index: source/blender/include/BIF_editmesh.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: =
/cvsroot/bf-blender/blender/source/blender/include/BIF_editmesh.h,v
retrieving revision 1.5
diff -u -r1.5 BIF_editmesh.h
--- source/blender/include/BIF_editmesh.h	27 Dec 2002 13:10:20 -0000	1.5
+++ source/blender/include/BIF_editmesh.h	14 Sep 2003 20:47:57 -0000
@@ -95,7 +95,11 @@
 void extrude_mesh(void);
 void adduplicate_mesh(void);
 void split_mesh(void);
-void separate_mesh(void);
+
+void seperatemenu(void);
+void seperate_mesh(void);
+void seperate_mesh_unconnected(void);
+
 void extrude_repeat_mesh(int steps, float offs);
 void spin_mesh(int steps,int degr,float *dvec, int mode);
 void screw_mesh(int steps,int turns);

Index: source/blender/src/editmesh.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /cvsroot/bf-blender/blender/source/blender/src/editmesh.c,v
retrieving revision 1.12
diff -u -r1.12 editmesh.c
--- source/blender/src/editmesh.c	10 Sep 2003 16:26:21 -0000	1.12
+++ source/blender/src/editmesh.c	14 Sep 2003 20:48:08 -0000
@@ -3607,7 +3607,24 @@
 	makeDispList(G.obedit);
 }
=20
-void separate_mesh(void)
+void seperatemenu(void)
+{
+	short event;
+	printf("seperatemenu\n");
+	event =3D pupmenu("Seperate %t|Selected%x1|Unconnected Objects%x2");
+
+	switch (event) {
+
+	    case 1:=20
+		    seperate_mesh();		   =20
+		    break;
+	    case 2:	    	    	   =20
+			seperate_mesh_unconnected();	    	   =20
+			break;
+	}
+}
+
+void seperate_mesh(void)
 {
 	EditVert *eve, *v1;
 	EditEdge *eed, *e1;
@@ -3649,7 +3666,7 @@
 		base=3D base->next;
 	}
 =09
-	/* testen for split */
+	/* test for split */
 	ok=3D 0;
 	eed=3D G.eded.first;
 	while(eed) {
@@ -3743,6 +3760,205 @@
 	makeDispList(G.obedit);
=20
 }
+
+
+void seperate_mesh_unconnected(void)
+{
+	EditVert *eve, *v1;
+	EditEdge *eed, *e1;
+	EditVlak *evl, *vl1;
+	Object *oldob;
+	Mesh *me, *men;
+	Base *base, *oldbase;
+	ListBase edve, eded, edvl;
+	float trans[9];
+	int ok, vertsep=3D0, flag;=09
+	short sel,toggle=3D0, done=3D0, check=3D1, loop=3D0;
+	=09
+	waitcursor(1);=09
+=09
+	/* we are going to abuse the system as follows:
+	 * 1. add a duplicate object: this will be the new one, we remember =
old pointer
+	 * 2: then do a split if needed.
+	 * 3. put apart: all NOT selected verts, edges, faces
+	 * 4. call loadobeditdata(): this will be the new object
+	 * 5. freelist en oude verts, eds, vlakken weer terughalen
+	 */
+		=09
+=09
+		=09
+	while(done!=3D1){	=09
+		check=3D1;
+		vertsep=3D1; /* This holds the number of vertices that is about to be =
split*/
+		countall();
+	=09
+		me=3D get_mesh(G.obedit);
+		if(me->key) {
+			error("Can't separate with vertex keys");
+			return;
+		}	=09
+	=09
+		/* make only obedit selected */
+		base=3D FIRSTBASE;
+		while(base) {
+			if(base->lay & G.vd->lay) {
+				if(base->object=3D=3DG.obedit) base->flag |=3D SELECT;
+				else base->flag &=3D ~SELECT;
+			}
+			base=3D base->next;
+		}	=09
+	=09
+		/*--------- Select connected-----------*/	=09
+		sel=3D 3;	=09
+		/* clear test flags */
+		eve=3D G.edve.first;
+		while(eve) {
+			eve->f&=3D ~1;		=09
+			eve=3D eve->next;
+		}
+		eve=3D G.edve.first;
+		eve->f |=3D 1;
+	=09
+		while(check=3D=3D1) {
+			check=3D 0;		=09
+			eed=3D G.eded.first;		=09
+			while(eed) {			=09
+				if(eed->h=3D=3D0) {
+					if(eed->v1->f & 1) {
+						if( (eed->v2->f & 1)=3D=3D0 ) {
+							eed->v2->f |=3D 1;
+							vertsep++;
+							check=3D 1;
+						}
+					}
+					else if(eed->v2->f & 1) {
+						if( (eed->v1->f & 1)=3D=3D0 ) {
+							eed->v1->f |=3D 1;
+							vertsep++;
+							check=3D 1;
+						}
+					}
+				}
+				eed=3D eed->next;			=09
+			}
+		}	=09
+		/*----------End of select connected--------*/
+	=09
+	=09
+		/* If the amount of vertices that is about to be split =3D=3D total =
amount=20
+		   of verts in the mesh, it means that there is only 1 unconnected =
object, so we don't have to split
+		*/
+		if(G.totvert=3D=3Dvertsep){
+			printf("not splitting\n");
+			done=3D1;	=09
+		}
+		else{
+			printf("splitting\n");
+			/* Test for splitting: Seperate selected */
+			ok=3D 0;
+			eed=3D G.eded.first;
+			while(eed) {
+				flag=3D (eed->v1->f & 1)+(eed->v2->f & 1);
+				if(flag=3D=3D1) {
+					ok=3D 1;
+					break;
+				}
+				eed=3D eed->next;
+			}
+			if(ok) {
+				/* SPLIT: first make duplicate */
+				adduplicateflag(1);
+				/* SPLIT: old faces have 3x flag 128 set, delete these ones */
+				delvlakflag(128);
+			}=09
+		=09
+		=09
+		=09
+			/* set apart: everything that is not selected */
+			edve.first=3D edve.last=3D eded.first=3D eded.last=3D edvl.first=3D =
edvl.last=3D 0;
+			eve=3D G.edve.first;
+			while(eve) {
+				v1=3D eve->next;
+				if((eve->f & 1)=3D=3D0) {
+					BLI_remlink(&G.edve, eve);
+					BLI_addtail(&edve, eve);
+				}
+				eve=3D v1;
+			}
+			eed=3D G.eded.first;
+			while(eed) {
+				e1=3D eed->next;
+				if( (eed->v1->f & 1)=3D=3D0 || (eed->v2->f & 1)=3D=3D0 ) {
+					BLI_remlink(&G.eded, eed);
+					BLI_addtail(&eded, eed);
+				}
+				eed=3D e1;
+			}
+			evl=3D G.edvl.first;
+			while(evl) {
+				vl1=3D evl->next;
+				if( (evl->v1->f & 1)=3D=3D0 || (evl->v2->f & 1)=3D=3D0 || =
(evl->v3->f & 1)=3D=3D0 ) {
+					BLI_remlink(&G.edvl, evl);
+					BLI_addtail(&edvl, evl);
+				}
+				evl=3D vl1;
+			}
+		=09
+			oldob=3D G.obedit;
+			oldbase=3D BASACT;
+		=09
+			trans[0]=3Dtrans[1]=3Dtrans[2]=3Dtrans[3]=3Dtrans[4]=3Dtrans[5]=3D =
0.0;
+			trans[6]=3Dtrans[7]=3Dtrans[8]=3D 1.0;
+			G.qual |=3D LR_ALTKEY;	/* patch to make sure we get a linked =
duplicate */
+			adduplicate(trans);
+			G.qual &=3D ~LR_ALTKEY;
+		=09
+			G.obedit=3D BASACT->object;	/* basact was set in adduplicate()  */
+	=09
+			men=3D copy_mesh(me);
+			set_mesh(G.obedit, men);
+			/* because new mesh is a copy: reduce user count */
+			men->id.us--;
+		=09
+			load_editMesh();
+		=09
+			BASACT->flag &=3D ~SELECT;
+		=09
+			makeDispList(G.obedit);
+			free_editMesh();
+		=09
+			G.edve=3D edve;
+			G.eded=3D eded;
+			G.edvl=3D edvl;
+		=09
+			/* hashedges are freed now, make new! */
+			eed=3D G.eded.first;
+			while(eed) {
+				if( findedgelist(eed->v1, eed->v2)=3D=3DNULL )
+					insert_hashedge(eed);
+				eed=3D eed->next;
+			}
+		=09
+			G.obedit=3D oldob;
+			BASACT=3D oldbase;
+			BASACT->flag |=3D SELECT;=09
+				=09
+		}	=09
+	}
+=09
+	/* unselect the vertices that we (ab)used for the seperation*/
+	eve=3D G.edve.first;
+	while(eve) {
+		eve->f&=3D ~1;		=09
+		eve=3D eve->next;
+	}
+=09
+	waitcursor(0);
+	countall();
+	allqueue(REDRAWVIEW3D, 0);
+	makeDispList(G.obedit);=09
+}
+
=20
 void extrude_repeat_mesh(int steps, float offs)
 {

Index: source/blender/src/space.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /cvsroot/bf-blender/blender/source/blender/src/space.c,v
retrieving revision 1.43
diff -u -r1.43 space.c
--- source/blender/src/space.c	17 Aug 2003 13:02:17 -0000	1.43
+++ source/blender/src/space.c	14 Sep 2003 20:48:20 -0000
@@ -1054,7 +1054,7 @@
 					if(G.qual) {
 						if(G.qual & LR_CTRLKEY) make_parent();
 					}
-					else if(G.obedit->type=3D=3DOB_MESH) separate_mesh();
+					else if(G.obedit->type=3D=3DOB_MESH) seperatemenu();
 					else if ELEM(G.obedit->type, OB_CURVE, OB_SURF) separate_nurb();
 				}
 				else if(G.qual & LR_CTRLKEY) make_parent();

------=_NextPart_000_0000_01C37CB0.B61EDC70--