[Bf-committers] Individual Faces extrude
joeedh
joeeagar at prodigy.net
Sun Sep 26 07:40:11 CEST 2004
Hi, I just finished coding my favorite Wings3D feature, individual faces
extrude (along the face normals)! I believe someone mentioned this
earlier. . .
Anyway, in face editmode mode only (since I couldn't get the dual
face-edge extrusion function to work with individual faces) pressing 'e'
will bring up a menu asking whether to use average-normal regional
extrusion or normal individual faces extrusion.
As a sidenote, the new function uses a TOSEL (to be selected) bitflag to
figure out which verts to select after everything is done. The whole
vert->vn thing confused me (is vn supposed to mean New Vert? It seemed
that way to me. . .).
Also, the old faces are left intact (I'm not sure if it's a good idea to
delete them. . .this is a functionality issue, any ideas?).
AND: I modified the 'n' transform() mode, because it was majorly messing
things up. The dot variable is now simply the average of the "dvecp"
vector (line 5285).
joeedh
P.S.: Thanks to everyone who did the editmode refactoring, which made
this really easy to do. I really love the new system!
-------------- next part --------------
? blender/source/blender/makesdna/DNA.c
? blender/source/blender/makesdna/intern/DNA.c
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
> #define TOSEL 4
Index: blender/source/blender/include/editmesh.h
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/blender/include/editmesh.h,v
retrieving revision 1.4
diff -r1.4 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.4
diff -r1.4 editmesh_lib.c
335a336,426
>
> static short extrudeflag_iface(short flag)
> {
> //compiler header cache was messing things up. . .
>
>
> EditMesh *em = G.editMesh;
> EditVert *eve, *nextve;
> EditEdge *eed, *nexted;
> EditFace *efa, *nextfa;
> 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();
>
>
> /* step 2: make new faces*/
> EditFace *workface;
> EditVert *wv1, *wv2, *wv3, *wv4;
>
>
> for(efa= em->faces.last; efa; efa= efa->prev) {
> 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;
>
> }
> }
>
> /* step 7: redo selection */
> EM_clear_flag_all(SELECT);
>
> Normalise(nor); // 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;
> }
>
716c807,818
< 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)
718c820
< 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.6
diff -r1.6 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.113
diff -r1.113 editobject.c
3860a3861
> EditFace *efa;
4900a4902
> 'i' -> Grab along individual face normals.
5283,5284c5285,5286
<
< dot= tv->nor[0]*dvecp[0] + tv->nor[1]*dvecp[1] + tv->nor[2]*dvecp[2];
---
> dot = (dvecp[0] + dvecp[1] + dvecp[2]) / 3;
> //dot= tv->nor[0]*dvecp[0] + tv->nor[1]*dvecp[1] + tv->nor[2]*dvecp[2];
8040c8042
< }
\ No newline at end of file
---
> }
More information about the Bf-committers
mailing list