[Bf-committers] Finally, a working patch

joeedh joeeagar at prodigy.net
Sun Oct 3 23:38:47 CEST 2004


Nathan Letwory wrote:

>Hi,
>
>the patch finally applied ok, but there were problems compiling, so I
>dived in after all. Now a few technical comments:
>
>* don't introduce new variables in the middle of a function (unless it's
>at the start of a statement block). Where this might be acceptable for C++
>it is not for a few C compilers. So you should move EditFace *workface; to
>the beginning of the function, along with the rest. Make sure you don't
>start using expressions before everything necessary has been declared.
>After that has been cleared up, it compiles fine.
>* use the coding style:
>http://www.blender3d.org/cms/Coding_Style.141.0.html to write your code
>and patches. In your case, use hard-tabs instead of soft-tabs/spaces for
>indentation.
>
>I did a bit of cleaning and I have the following patch:
>http://www.letwory.net/patch/individual_facesextrude.patch
>
>  
>
Ok, I cleaned it up some, heres a new patch.

>Anyway, it is quite a handy one, even if there is some odd mousebehaviour.
>See http://www.letwory.net/tutes/individual_faceextrude.htm for an
>example. Notice how I have to move my mouse up, to extrude the face
>down...
>  
>
It doesn't do that for me. . .hmm  ..

joeedh
-------------- next part --------------
Index: blender/source/blender/blenkernel/BKE_utildefines.h
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/blender/blenkernel/BKE_utildefines.h,v
retrieving revision 1.11
diff -r1.11 BKE_utildefines.h
293a294,295
> #define TOSEL 4
> #define TODEL 8
Index: blender/source/blender/include/editmesh.h
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/blender/include/editmesh.h,v
retrieving revision 1.5
diff -r1.5 editmesh.h
75a76
> extern short extrudeflag_iface(short flag);
Index: blender/source/blender/makesdna/DNA_mesh_types.h
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/blender/makesdna/DNA_mesh_types.h,v
retrieving revision 1.20
diff -r1.20 DNA_mesh_types.h
104c104,105
< 
---
> //individual extrude faces flag
> #define EX_IFACE 1024
165c166
< 
---
> #
Index: blender/source/blender/src/editmesh_lib.c
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/blender/src/editmesh_lib.c,v
retrieving revision 1.8
diff -r1.8 editmesh_lib.c
467a468,553
> static short extrudeflag_iface(short flag)
> {
> 	EditMesh *em = G.editMesh;
> 	EditVert *eve, *nextve;
> 	EditEdge *eed, *nexted;
> 	EditFace *efa, *nextfa;
> 	EditFace *workface;
> 	EditVert *wv1, *wv2, *wv3, *wv4;
> 	EditFace *next = NULL;
> 	
> 	float nor[3]={0.0, 0.0, 0.0};
> 	short del_old= 0;
> 	
> 	if(G.obedit==0 || get_mesh(G.obedit)==0) return 0;
> 	
> 
> 	/* step 1; init, count faces in edges */
> 	recalc_editnormals();
> 	EM_clear_flag_all(TODEL);
> 		
> 	/* step 2: make new faces*/
> 	
> 	efa = em->faces.last;
> 	while (efa) {
> 		if(efa->f & SELECT) {
> 			wv1 = addvertlist(efa->v1->co);
> 			VECCOPY(wv1->no, efa->n);
> 			wv2 = addvertlist(efa->v2->co);
> 			VECCOPY(wv2->no, efa->n);
> 			wv3 = addvertlist(efa->v3->co);
> 			VECCOPY(wv3->no, efa->n);
> 			if (efa->v4) { 
> 				wv4 = addvertlist(efa->v4->co);
> 				VECCOPY(wv4->no, efa->n);         
> 			}    
> 			workface = addfacelist(efa->v1, efa->v2,wv2, wv1, efa); 
> 			workface = addfacelist(efa->v2, efa->v3, wv3, wv2, efa);
> 			if (efa->v4) workface = addfacelist(efa->v3, efa->v4,wv4, wv3, efa);
> 			else workface = addfacelist(efa->v3, efa->v1, wv1, wv3, efa);
>            	
>         	if (efa->v4) workface = addfacelist(efa->v4, efa->v1,wv1, wv4, efa);
>             if (efa->v4)workface = addfacelist(wv1, wv2, wv3, wv4, efa);
> 			else workface = addfacelist(wv1, wv2, wv3, NULL, efa); 
> 		    
> 		    
> 			workface->e1 = addedgelist(workface->v1, workface->v2, workface->e1);
> 			workface->e2 = addedgelist(workface->v2, workface->v3, workface->e2);
> 			if (!workface->e4) workface->e3 = addedgelist(workface->v3, workface->v1, workface->e3);
> 			else workface->e3 = addedgelist(workface->v3, workface->v4, workface->e3);
> 			if (workface->e4) workface->e4 = addedgelist(workface->v4, workface->v1, workface->e4);
> 		    
> 			workface->f |= SELECT;
> 			workface->f |= TOSEL;
> 			workface->v1->f1 |= TOSEL;
> 			workface->v2->f1 |= TOSEL;
> 			workface->v3->f1 |= TOSEL;
> 			if (workface->v4) workface->v4->f1 |= TOSEL;
>             
> 			next = efa->prev;
> 			efa->f |= TODEL;
> 			/*BLI_remlink(&em->faces, efa);
> 			free_editface(efa);*/        
> 		} else next = NULL;
> 		if (!next)
> 			efa = efa->prev;
> 		else efa = next;
> 	}
> 	delfaceflag(TODEL);
> 		/* step 7: redo selection */
> 	EM_clear_flag_all(SELECT);
>     EM_clear_flag_all(TODEL);
> 	Normalise(nor);	/*for translation normal grab*/
> 	
> 	for(eve= em->verts.first; eve; eve= eve->next) {
> 		if(eve->f1 & TOSEL) {
> 			eve->f |= SELECT;
> 			eve->f1 &= ~TOSEL;
> 		}
> 		 
> 	}
> 
> 	EM_select_flush();
> 	
> 	return 1;
> }
> 
870c956,967
< 	if(G.scene->selectmode & SCE_SELECT_VERTEX)
---
> 	short event;
>     if (G.scene->selectmode & SCE_SELECT_FACE) {
> 		event= pupmenu("Extrusion Type %t|Region%x1|Faces%x2");
> 		switch (event) {
> 			case 1:
> 				return extrudeflag_edge(flag);
> 				break;
> 			case 2:
> 				return extrudeflag_iface(flag);
> 				break;
> 		}    
>     } else if(G.scene->selectmode & SCE_SELECT_VERTEX)
872c969
< 	else 
---
> 	else if (G.scene->selectmode & SCE_SELECT_EDGE)
Index: blender/source/blender/src/editmesh_tools.c
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/blender/src/editmesh_tools.c,v
retrieving revision 1.8
diff -r1.8 editmesh_tools.c
534c534,535
< 
---
>     short event;
>     
551a553,574
> 
> /*void extrude_ifaces_mesh(void)
> {
> 	short a;
> 
> 	TEST_EDITMESH
> 
> 	if(okee("Extrude")==0) return;
> 	
> 	a= extrudeflag(SELECT);
> 
> 	if(a==0) {
> 		error("No valid selection");
> 	}
> 	else {
> 		EM_fgon_flags();
> 		countall();  /* for G.totvert in calc_meshverts() 
> 		calc_meshverts();
> 		transform('n');
> 	}
> 
> }*/
Index: blender/source/blender/src/editobject.c
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/blender/src/editobject.c,v
retrieving revision 1.117
diff -r1.117 editobject.c
5336,5337c5336,5339
< 								
< 								dot= tv->nor[0]*dvecp[0] + tv->nor[1]*dvecp[1] + tv->nor[2]*dvecp[2];
---
> 								/*this messes up individual face extrude. . .
> 								  dot= tv->nor[0]*dvecp[0] + tv->nor[1]*dvecp[1] + tv->nor[2]*dvecp[2];
> 							      so average it. . .*/
> 								dot = (dvecp[0] + dvecp[1] + dvecp[2]) / 3;
8093c8095
< }
\ No newline at end of file
---
> }


More information about the Bf-committers mailing list