Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Eagar <joeedh@gmail.com>2009-02-28 15:49:18 +0300
committerJoseph Eagar <joeedh@gmail.com>2009-02-28 15:49:18 +0300
commit99919b1714ed79bbf10dbe057630ad0f0903c905 (patch)
tree1fb219c23a8799d327d2472b4d58aba96dd3212b /source/blender/editors/mesh/editmesh_tools.c
parentd71d78e40d9e367a48a2f4fe15913088781686ee (diff)
parentbadbba7266cf27deaaf7e704b2b751d9023054a8 (diff)
merge with trunk. also tried to fix tesselator code; new code should've worked, but there's still some problems, possibly not in the tesselator code entirely. also still have reverted tools/Blender.py since scons still isn't fixed, heh.
Diffstat (limited to 'source/blender/editors/mesh/editmesh_tools.c')
-rw-r--r--source/blender/editors/mesh/editmesh_tools.c867
1 files changed, 498 insertions, 369 deletions
diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c
index 591854c2811..3bc59fe9094 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -74,6 +74,7 @@ editmesh_tool.c: UI called tools for editmesh, geometry changes here, otherwise
#include "BKE_object.h"
#include "BKE_utildefines.h"
#include "BKE_bmesh.h"
+#include "BKE_report.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
@@ -87,6 +88,7 @@ editmesh_tool.c: UI called tools for editmesh, geometry changes here, otherwise
#include "ED_view3d.h"
#include "ED_util.h"
#include "ED_screen.h"
+#include "BIF_transform.h"
#include "UI_interface.h"
@@ -96,11 +98,9 @@ editmesh_tool.c: UI called tools for editmesh, geometry changes here, otherwise
/* XXX */
static int extern_qread() {return 0;}
static void waitcursor() {}
-static void error() {}
static int pupmenu() {return 0;}
static int qtest() {return 0;}
#define add_numbut(a, b, c, d, e, f, g) {}
-static int do_clever_numbuts() {return 0;}
static int snap_sel_to_curs() {return 0;}
static int snap_to_center() {return 0;}
@@ -108,7 +108,7 @@ static int snap_to_center() {return 0;}
/* local prototypes ---------------*/
static void free_tagged_edges_faces(EditMesh *em, EditEdge *eed, EditFace *efa);
-int EdgeLoopDelete(EditMesh *em);
+int EdgeLoopDelete(EditMesh *em, wmOperator *op);
/********* qsort routines *********/
@@ -489,8 +489,15 @@ static int removedoublesflag_exec(bContext *C, wmOperator *op)
Object *obedit= CTX_data_edit_object(C);
Scene *scene = CTX_data_scene(C);
EditMesh *em= ((Mesh *)obedit->data)->edit_mesh;
+ char msg[100];
- removedoublesflag(em,1,0,scene->toolsettings->doublimit);
+ int cnt = removedoublesflag(em,1,0,scene->toolsettings->doublimit);
+
+ if(cnt)
+ {
+ sprintf(msg, "Removed %d vertices", cnt);
+ BKE_report(op->reports, RPT_INFO, msg);
+ }
WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
@@ -616,7 +623,7 @@ void hashvert_flag(EditMesh *em, int flag)
}
/* generic extern called extruder */
-void extrude_mesh(Object *obedit, EditMesh *em)
+void extrude_mesh(Object *obedit, EditMesh *em, wmOperator *op)
{
Scene *scene= NULL; // XXX CTX!
float nor[3]= {0.0, 0.0, 0.0};
@@ -627,11 +634,11 @@ void extrude_mesh(Object *obedit, EditMesh *em)
else if(em->totvertsel==1) nr= 4;
else if(em->totedgesel==0) nr= 4;
else if(em->totfacesel==0)
- nr= pupmenu("Extrude %t|Only Edges%x3|Only Vertices%x4");
+ nr= 3; // pupmenu("Extrude %t|Only Edges%x3|Only Vertices%x4");
else if(em->totfacesel==1)
- nr= pupmenu("Extrude %t|Region %x1|Only Edges%x3|Only Vertices%x4");
+ nr= 1; // pupmenu("Extrude %t|Region %x1|Only Edges%x3|Only Vertices%x4");
else
- nr= pupmenu("Extrude %t|Region %x1||Individual Faces %x2|Only Edges%x3|Only Vertices%x4");
+ nr= 1; // pupmenu("Extrude %t|Region %x1||Individual Faces %x2|Only Edges%x3|Only Vertices%x4");
}
else if(em->selectmode & SCE_SELECT_EDGE) {
if (em->totedgesel==0) nr = 0;
@@ -640,16 +647,16 @@ void extrude_mesh(Object *obedit, EditMesh *em)
/*else if (em->totedgesel==1) nr = 3;
else if(em->totfacesel==0) nr = 3;
else if(em->totfacesel==1)
- nr= pupmenu("Extrude %t|Region %x1|Only Edges%x3");
+ nr= 1; // pupmenu("Extrude %t|Region %x1|Only Edges%x3");
else
- nr= pupmenu("Extrude %t|Region %x1||Individual Faces %x2|Only Edges%x3");
+ nr= 1; // pupmenu("Extrude %t|Region %x1||Individual Faces %x2|Only Edges%x3");
*/
}
else {
if (em->totfacesel == 0) nr = 0;
- else nr = 1; //if (em->totfacesel == 1) nr = 1;
- //else
- // nr= pupmenu("Extrude %t|Region %x1||Individual Faces %x2");
+ else if (em->totfacesel == 1) nr = 1;
+ else
+ nr= 1; // pupmenu("Extrude %t|Region %x1||Individual Faces %x2");
}
if(nr<1) return;
@@ -660,7 +667,7 @@ void extrude_mesh(Object *obedit, EditMesh *em)
else transmode= extrudeflag_face_indiv(em, SELECT, nor);
if(transmode==0) {
- error("No valid selection");
+ BKE_report(op->reports, RPT_ERROR, "Not a valid selection for extrude");
}
else {
EM_fgon_flags(em);
@@ -694,18 +701,35 @@ void extrude_mesh(Object *obedit, EditMesh *em)
}
// XXX should be a menu item
-static int mesh_extrude_exec(bContext *C, wmOperator *op)
+static int mesh_extrude_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= ((Mesh *)obedit->data)->edit_mesh;
- extrude_mesh(obedit,em);
-
+ extrude_mesh(obedit,em, op);
+
+ RNA_int_set(op->ptr, "mode", TFM_TRANSLATION);
+ WM_operator_name_call(C, "TFM_OT_transform", WM_OP_INVOKE_REGION_WIN, op->ptr);
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+
+ return OPERATOR_FINISHED;
+}
+
+/* extrude without transform */
+static int mesh_extrude_exec(bContext *C, wmOperator *op)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ EditMesh *em= ((Mesh *)obedit->data)->edit_mesh;
+
+ extrude_mesh(obedit,em, op);
+
WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
return OPERATOR_FINISHED;
}
+
void MESH_OT_extrude(wmOperatorType *ot)
{
/* identifiers */
@@ -713,11 +737,15 @@ void MESH_OT_extrude(wmOperatorType *ot)
ot->idname= "MESH_OT_extrude";
/* api callbacks */
+ ot->invoke= mesh_extrude_invoke;
ot->exec= mesh_extrude_exec;
ot->poll= ED_operator_editmesh;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* to give to transform */
+ RNA_def_int(ot->srna, "mode", TFM_TRANSLATION, 0, INT_MAX, "Mode", "", 0, INT_MAX);
}
static int split_mesh(bContext *C, wmOperator *op)
@@ -816,23 +844,28 @@ void MESH_OT_extrude_repeat(wmOperatorType *ot)
RNA_def_float(ot->srna, "offset", 2.0f, 0.0f, 100.0f, "Offset", "", 0.0f, FLT_MAX);
RNA_def_int(ot->srna, "steps", 10, 0, 180, "Steps", "", 0, INT_MAX);
}
+
+/* ************************** spin operator ******************** */
-void spin_mesh(View3D *v3d, Object *obedit, EditMesh *em, int steps, float degr, float *dvec, int mode)
+static int spin_mesh(bContext *C, float *dvec, int steps, float degr, int dupli )
{
- Scene *scene= NULL; // XXX from context!
- RegionView3D *rv3d= NULL; // XXX from context
+ Object *obedit= CTX_data_edit_object(C);
+ View3D *v3d = CTX_wm_view3d(C);
+ Scene *scene = CTX_data_scene(C);
+ EditMesh *em= ((Mesh *)obedit->data)->edit_mesh;
+ RegionView3D *rv3d= CTX_wm_region_view3d(C);
EditVert *eve,*nextve;
- float nor[3]= {0.0, 0.0, 0.0};
- float *curs, si,n[3],q[4],cmat[3][3],imat[3][3], tmat[3][3];
- float cent[3],bmat[3][3];
+ float nor[3]= {0.0f, 0.0f, 0.0f};
+ float *curs, si, n[3], q[4], cmat[3][3], imat[3][3], tmat[3][3];
+ float cent[3], bmat[3][3];
float phi;
- short a,ok;
+ short a, ok= 1;
/* imat and center and size */
Mat3CpyMat4(bmat, obedit->obmat);
Mat3Inv(imat,bmat);
- curs= give_cursor(NULL, v3d); // XXX
+ curs= give_cursor(scene, v3d);
VECCOPY(cent, curs);
cent[0]-= obedit->obmat[3][0];
cent[1]-= obedit->obmat[3][1];
@@ -864,16 +897,17 @@ void spin_mesh(View3D *v3d, Object *obedit, EditMesh *em, int steps, float degr,
Mat3MulMat3(tmat,cmat,bmat);
Mat3MulMat3(bmat,imat,tmat);
- if(mode==0) if(scene->toolsettings->editbutflag & B_KEEPORIG) adduplicateflag(em, 1);
- ok= 1;
+ if(dupli==0)
+ if(scene->toolsettings->editbutflag & B_KEEPORIG)
+ adduplicateflag(em, 1);
- for(a=0;a<steps;a++) {
- if(mode==0) ok= extrudeflag(obedit, em, SELECT, nor);
+ for(a=0; a<steps; a++) {
+ if(dupli==0) ok= extrudeflag(obedit, em, SELECT, nor);
else adduplicateflag(em, SELECT);
- if(ok==0) {
- error("No valid vertices are selected");
+
+ if(ok==0)
break;
- }
+
rotateflag(em, SELECT, cent, bmat);
if(dvec) {
Mat3MulVecfl(bmat,dvec);
@@ -893,30 +927,69 @@ void spin_mesh(View3D *v3d, Object *obedit, EditMesh *em, int steps, float degr,
eve= nextve;
}
}
- recalc_editnormals(em);
+ else {
+ recalc_editnormals(em);
- EM_fgon_flags(em);
+ EM_fgon_flags(em);
- // DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+ DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+ }
+
+ return ok;
+}
+static int spin_mesh_exec(bContext *C, wmOperator *op)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ int ok;
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+
+ ok= spin_mesh(C, NULL, RNA_int_get(op->ptr,"steps"), RNA_float_get(op->ptr,"degrees"), RNA_boolean_get(op->ptr,"dupli"));
+ if(ok==0) {
+ BKE_report(op->reports, RPT_ERROR, "No valid vertices are selected");
+ return OPERATOR_CANCELLED;
+ }
+ return OPERATOR_FINISHED;
}
-void screw_mesh(Object *obedit, EditMesh *em, int steps, int turns)
+void MESH_OT_spin(wmOperatorType *ot)
{
- View3D *v3d= NULL; // XXX
+ /* identifiers */
+ ot->name= "Spin";
+ ot->idname= "MESH_OT_spin";
+
+ /* api callbacks */
+ ot->exec= spin_mesh_exec;
+ ot->poll= ED_operator_editmesh;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /*props */
+ RNA_def_int(ot->srna, "steps", 9, 0, INT_MAX, "Steps", "Steps", 0, INT_MAX);
+ RNA_def_boolean(ot->srna, "dupli", 0, "Dupli", "Make Duplicates");
+ RNA_def_float(ot->srna, "degrees", 90.0f, -FLT_MAX, FLT_MAX, "Degrees", "Degrees", -360.0f, 360.0f);
+}
+
+static int screw_mesh_exec(bContext *C, wmOperator *op)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ EditMesh *em= ((Mesh *)obedit->data)->edit_mesh;
EditVert *eve,*v1=0,*v2=0;
EditEdge *eed;
float dvec[3], nor[3];
+ int steps, turns;
+ turns= RNA_int_get(op->ptr, "turns");
+ steps= RNA_int_get(op->ptr, "steps");
+
/* clear flags */
- eve= em->verts.first;
- while(eve) {
+ for(eve= em->verts.first; eve; eve= eve->next)
eve->f1= 0;
- eve= eve->next;
- }
+
/* edges set flags in verts */
- eed= em->edges.first;
- while(eed) {
+ for(eed= em->edges.first; eed; eed= eed->next) {
if(eed->v1->f & SELECT) {
if(eed->v2->f & SELECT) {
/* watch: f1 is a byte */
@@ -924,30 +997,27 @@ void screw_mesh(Object *obedit, EditMesh *em, int steps, int turns)
if(eed->v2->f1<2) eed->v2->f1++;
}
}
- eed= eed->next;
}
/* find two vertices with eve->f1==1, more or less is wrong */
- eve= em->verts.first;
- while(eve) {
+ for(eve= em->verts.first; eve; eve= eve->next) {
if(eve->f1==1) {
- if(v1==0) v1= eve;
- else if(v2==0) v2= eve;
+ if(v1==NULL) v1= eve;
+ else if(v2==NULL) v2= eve;
else {
- v1=0;
+ v1= NULL;
break;
}
}
- eve= eve->next;
}
- if(v1==0 || v2==0) {
- error("You have to select a string of connected vertices too");
- return;
+ if(v1==NULL || v2==NULL) {
+ BKE_report(op->reports, RPT_ERROR, "You have to select a string of connected vertices too");
+ return OPERATOR_CANCELLED;
}
/* calculate dvec */
- dvec[0]= ( (v1->co[0]- v2->co[0]) )/(steps);
- dvec[1]= ( (v1->co[1]- v2->co[1]) )/(steps);
- dvec[2]= ( (v1->co[2]- v2->co[2]) )/(steps);
+ dvec[0]= ( v1->co[0]- v2->co[0] )/steps;
+ dvec[1]= ( v1->co[1]- v2->co[1] )/steps;
+ dvec[2]= ( v1->co[2]- v2->co[2] )/steps;
VECCOPY(nor, obedit->obmat[2]);
@@ -956,11 +1026,35 @@ void screw_mesh(Object *obedit, EditMesh *em, int steps, int turns)
dvec[1]= -dvec[1];
dvec[2]= -dvec[2];
}
-
- spin_mesh(v3d, obedit, em, turns*steps, turns*360, dvec, 0);
-
+
+ if(spin_mesh(C, dvec, turns*steps, 360.0f*turns, 0)) {
+ WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+
+ return OPERATOR_FINISHED;
+ }
+ else {
+ BKE_report(op->reports, RPT_ERROR, "No valid vertices are selected");
+ return OPERATOR_CANCELLED;
+ }
}
+void MESH_OT_screw(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Screw";
+ ot->idname= "MESH_OT_screw";
+
+ /* api callbacks */
+ ot->exec= screw_mesh_exec;
+ ot->poll= ED_operator_editmesh;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /*props */
+ RNA_def_int(ot->srna, "steps", 9, 0, INT_MAX, "Steps", "Steps", 0, 256);
+ RNA_def_int(ot->srna, "turns", 1, 0, INT_MAX, "Turns", "Turns", 0, 256);
+}
static void erase_edges(EditMesh *em, ListBase *l)
{
@@ -1008,7 +1102,7 @@ static void erase_vertices(EditMesh *em, ListBase *l)
}
}
-void delete_mesh(Object *obedit, EditMesh *em, int event)
+void delete_mesh(Object *obedit, EditMesh *em, wmOperator *op, int event)
{
EditFace *efa, *nextvl;
EditVert *eve,*nextve;
@@ -1042,7 +1136,7 @@ void delete_mesh(Object *obedit, EditMesh *em, int event)
MEM_freeN(em2);
}
else if(event==6) {
- if(!EdgeLoopDelete(em))
+ if(!EdgeLoopDelete(em, op))
return;
str= "Erase Edge Loop";
@@ -1181,7 +1275,7 @@ static int delete_mesh_exec(bContext *C, wmOperator *op)
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= ((Mesh *)obedit->data)->edit_mesh;
- delete_mesh(obedit,em,RNA_enum_get(op->ptr, "type"));
+ delete_mesh(obedit,em, op,RNA_enum_get(op->ptr, "type"));
WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
@@ -1207,87 +1301,6 @@ void MESH_OT_delete(wmOperatorType *ot)
RNA_def_enum(ot->srna, "type", prop_mesh_delete_types, 10, "Type", "Method used for deleting mesh data");
}
-/* Got this from scanfill.c. You will need to juggle around the
- * callbacks for the scanfill.c code a bit for this to work. */
-void fill_mesh(EditMesh *em)
-{
- EditVert *eve,*v1;
- EditEdge *eed,*e1,*nexted;
- EditFace *efa,*nextvl, *efan;
- short ok;
-
- if(em==NULL) return;
- waitcursor(1);
-
- /* copy all selected vertices */
- eve= em->verts.first;
- while(eve) {
- if(eve->f & SELECT) {
- v1= BLI_addfillvert(eve->co);
- eve->tmp.v= v1;
- v1->tmp.v= eve;
- v1->xs= 0; // used for counting edges
- }
- eve= eve->next;
- }
- /* copy all selected edges */
- eed= em->edges.first;
- while(eed) {
- if( (eed->v1->f & SELECT) && (eed->v2->f & SELECT) ) {
- e1= BLI_addfilledge(eed->v1->tmp.v, eed->v2->tmp.v);
- e1->v1->xs++;
- e1->v2->xs++;
- }
- eed= eed->next;
- }
- /* from all selected faces: remove vertices and edges to prevent doubles */
- /* all edges add values, faces subtract,
- then remove edges with vertices ->xs<2 */
- efa= em->faces.first;
- ok= 0;
- while(efa) {
- nextvl= efa->next;
- if( faceselectedAND(efa, 1) ) {
- efa->v1->tmp.v->xs--;
- efa->v2->tmp.v->xs--;
- efa->v3->tmp.v->xs--;
- if(efa->v4) efa->v4->tmp.v->xs--;
- ok= 1;
-
- }
- efa= nextvl;
- }
- if(ok) { /* there are faces selected */
- eed= filledgebase.first;
- while(eed) {
- nexted= eed->next;
- if(eed->v1->xs<2 || eed->v2->xs<2) {
- BLI_remlink(&filledgebase,eed);
- }
- eed= nexted;
- }
- }
-
- if(BLI_edgefill(0, em->mat_nr)) {
- efa= fillfacebase.first;
- while(efa) {
- /* normals default pointing up */
- efan= addfacelist(em, efa->v3->tmp.v, efa->v2->tmp.v,
- efa->v1->tmp.v, 0, NULL, NULL);
- if(efan) EM_select_face(efan, 1);
- efa= efa->next;
- }
- }
-
- BLI_end_edgefill();
-
- // XXX option beautyfill */
-
- WM_cursor_wait(0);
- EM_select_flush(em);
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
-
-}
/*GB*/
/*-------------------------------------------------------------------------------*/
@@ -3053,172 +3066,6 @@ static void free_tagged_edges_faces(EditMesh *em, EditEdge *eed, EditFace *efa)
}
}
-/* note; the EM_selectmode_set() calls here illustrate how badly constructed it all is... from before the
- edge/face flags, with very mixed results.... */
-void beauty_fill(EditMesh *em)
-{
- EditVert *v1, *v2, *v3, *v4;
- EditEdge *eed, *nexted;
- EditEdge dia1, dia2;
- EditFace *efa, *w;
- // void **efaar, **efaa;
- EVPTuple *efaar;
- EVPtr *efaa;
- float len1, len2, len3, len4, len5, len6, opp1, opp2, fac1, fac2;
- int totedge, ok, notbeauty=8, onedone, vindex[4];
-
- /* - all selected edges with two faces
- * - find the faces: store them in edges (using datablock)
- * - per edge: - test convex
- * - test edge: flip?
- * - if true: remedge, addedge, all edges at the edge get new face pointers
- */
-
- EM_selectmode_set(em); // makes sure in selectmode 'face' the edges of selected faces are selected too
-
- totedge = count_selected_edges(em->edges.first);
- if(totedge==0) return;
-
- /* temp block with face pointers */
- efaar= (EVPTuple *) MEM_callocN(totedge * sizeof(EVPTuple), "beautyfill");
-
- while (notbeauty) {
- notbeauty--;
-
- ok = collect_quadedges(efaar, em->edges.first, em->faces.first);
-
- /* there we go */
- onedone= 0;
-
- eed= em->edges.first;
- while(eed) {
- nexted= eed->next;
-
- /* f2 is set in collect_quadedges() */
- if(eed->f2==2 && eed->h==0) {
-
- efaa = (EVPtr *) eed->tmp.p;
-
- /* none of the faces should be treated before, nor be part of fgon */
- ok= 1;
- efa= efaa[0];
- if(efa->e1->f1 || efa->e2->f1 || efa->e3->f1) ok= 0;
- if(efa->fgonf) ok= 0;
- efa= efaa[1];
- if(efa->e1->f1 || efa->e2->f1 || efa->e3->f1) ok= 0;
- if(efa->fgonf) ok= 0;
-
- if(ok) {
- /* test convex */
- givequadverts(efaa[0], efaa[1], &v1, &v2, &v3, &v4, vindex);
- if(v1 && v2 && v3 && v4) {
- if( convex(v1->co, v2->co, v3->co, v4->co) ) {
-
- /* test edges */
- if( (v1) > (v3) ) {
- dia1.v1= v3;
- dia1.v2= v1;
- }
- else {
- dia1.v1= v1;
- dia1.v2= v3;
- }
-
- if( (v2) > (v4) ) {
- dia2.v1= v4;
- dia2.v2= v2;
- }
- else {
- dia2.v1= v2;
- dia2.v2= v4;
- }
-
- /* testing rule:
- * the area divided by the total edge lengths
- */
-
- len1= VecLenf(v1->co, v2->co);
- len2= VecLenf(v2->co, v3->co);
- len3= VecLenf(v3->co, v4->co);
- len4= VecLenf(v4->co, v1->co);
- len5= VecLenf(v1->co, v3->co);
- len6= VecLenf(v2->co, v4->co);
-
- opp1= AreaT3Dfl(v1->co, v2->co, v3->co);
- opp2= AreaT3Dfl(v1->co, v3->co, v4->co);
-
- fac1= opp1/(len1+len2+len5) + opp2/(len3+len4+len5);
-
- opp1= AreaT3Dfl(v2->co, v3->co, v4->co);
- opp2= AreaT3Dfl(v2->co, v4->co, v1->co);
-
- fac2= opp1/(len2+len3+len6) + opp2/(len4+len1+len6);
-
- ok= 0;
- if(fac1 > fac2) {
- if(dia2.v1==eed->v1 && dia2.v2==eed->v2) {
- eed->f1= 1;
- efa= efaa[0];
- efa->f1= 1;
- efa= efaa[1];
- efa->f1= 1;
-
- w= EM_face_from_faces(em, efaa[0], efaa[1],
- vindex[0], vindex[1], 4+vindex[2], -1);
- w->f |= SELECT;
-
-
- w= EM_face_from_faces(em, efaa[0], efaa[1],
- vindex[0], 4+vindex[2], 4+vindex[3], -1);
- w->f |= SELECT;
-
- onedone= 1;
- }
- }
- else if(fac1 < fac2) {
- if(dia1.v1==eed->v1 && dia1.v2==eed->v2) {
- eed->f1= 1;
- efa= efaa[0];
- efa->f1= 1;
- efa= efaa[1];
- efa->f1= 1;
-
-
- w= EM_face_from_faces(em, efaa[0], efaa[1],
- vindex[1], 4+vindex[2], 4+vindex[3], -1);
- w->f |= SELECT;
-
-
- w= EM_face_from_faces(em, efaa[0], efaa[1],
- vindex[0], 4+vindex[1], 4+vindex[3], -1);
- w->f |= SELECT;
-
- onedone= 1;
- }
- }
- }
- }
- }
-
- }
- eed= nexted;
- }
-
- free_tagged_edges_faces(em, em->edges.first, em->faces.first);
-
- if(onedone==0) break;
-
- EM_selectmode_set(em); // new edges/faces were added
- }
-
- MEM_freeN(efaar);
-
- EM_select_flush(em);
-
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
-
-}
-
/* ******************** BEGIN TRIANGLE TO QUAD ************************************* */
static float measure_facepair(EditVert *v1, EditVert *v2, EditVert *v3, EditVert *v4, float limit)
@@ -3617,7 +3464,7 @@ void edge_flip(EditMesh *em)
}
-static void edge_rotate(EditMesh *em, EditEdge *eed,int dir)
+static void edge_rotate(EditMesh *em, wmOperator *op, EditEdge *eed,int dir)
{
EditVert **verts[2];
EditFace *face[2], *efa, *newFace[2];
@@ -3702,7 +3549,7 @@ static void edge_rotate(EditMesh *em, EditEdge *eed,int dir)
hiddenedges = MEM_mallocN(sizeof(EditVert*)*numhidden+1, "RotateEdgeHiddenVerts");
if(!hiddenedges) {
- error("Malloc Was not happy!");
+ BKE_report(op->reports, RPT_ERROR, "Memory allocation failed");
return;
}
@@ -3831,14 +3678,14 @@ static int edge_rotate_selected(bContext *C, wmOperator *op)
if(edgeCount==1) {
for(eed= em->edges.first; eed; eed= eed->next) {
if(eed->f1==2) {
- edge_rotate(em, eed,dir);
+ edge_rotate(em, op, eed,dir);
break;
}
}
}
else
{
- error("Select one edge or two adjacent faces");
+ BKE_report(op->reports, RPT_ERROR, "Select one edge or two adjacent faces");
return OPERATOR_CANCELLED;
}
}
@@ -3846,14 +3693,14 @@ static int edge_rotate_selected(bContext *C, wmOperator *op)
for(eed= em->edges.first; eed; eed= eed->next) {
if(eed->f & SELECT) {
EM_select_edge(eed, 0);
- edge_rotate(em, eed,dir);
+ edge_rotate(em, op, eed,dir);
break;
}
}
}
else
{
- error("Select one edge or two adjacent faces");
+ BKE_report(op->reports, RPT_ERROR, "Select one edge or two adjacent faces");
return OPERATOR_CANCELLED;
}
@@ -3977,8 +3824,14 @@ typedef struct SlideVert {
EditVert origvert;
} SlideVert;
-int EdgeSlide(EditMesh *em, short immediate, float imperc)
+int EdgeSlide(EditMesh *em, wmOperator *op, short immediate, float imperc)
{
+ return 0;
+/* XXX REFACTOR - #if 0'd for now, otherwise can't make 64bit windows builds on 64bit machine */
+#if 0
+useless:
+ goto useless // because it doesn't do anything right now
+
// NumInput num; XXX
Mesh *me= NULL; // XXX
EditFace *efa;
@@ -4032,7 +3885,7 @@ int EdgeSlide(EditMesh *em, short immediate, float imperc)
ct++;
efa->e1->f1++;
if(efa->e1->f1 > 2) {
- error("3+ face edge");
+ BKE_report(op->reports, RPT_ERROR, "3+ face edge");
return 0;
}
}
@@ -4040,7 +3893,7 @@ int EdgeSlide(EditMesh *em, short immediate, float imperc)
ct++;
efa->e2->f1++;
if(efa->e2->f1 > 2) {
- error("3+ face edge");
+ BKE_report(op->reports, RPT_ERROR, "3+ face edge");
return 0;
}
}
@@ -4048,7 +3901,7 @@ int EdgeSlide(EditMesh *em, short immediate, float imperc)
ct++;
efa->e3->f1++;
if(efa->e3->f1 > 2) {
- error("3+ face edge");
+ BKE_report(op->reports, RPT_ERROR, "3+ face edge");
return 0;
}
}
@@ -4056,13 +3909,13 @@ int EdgeSlide(EditMesh *em, short immediate, float imperc)
ct++;
efa->e4->f1++;
if(efa->e4->f1 > 2) {
- error("3+ face edge");
+ BKE_report(op->reports, RPT_ERROR, "3+ face edge");
return 0;
}
}
// Make sure loop is not 2 edges of same face
if(ct > 1) {
- error("loop crosses itself");
+ BKE_report(op->reports, RPT_ERROR, "Loop crosses itself");
return 0;
}
}
@@ -4073,7 +3926,7 @@ int EdgeSlide(EditMesh *em, short immediate, float imperc)
// Test for multiple segments
if(vertsel > numsel+1) {
- error("Was not a single edge loop");
+ BKE_report(op->reports, RPT_ERROR, "Please choose a single edge loop");
return 0;
}
@@ -4109,7 +3962,7 @@ int EdgeSlide(EditMesh *em, short immediate, float imperc)
// It looks like there was an unexpected case - Hopefully should not happen
if(timesthrough >= numsel*2) {
BLI_linklist_free(edgelist,NULL);
- error("could not order loop");
+ BKE_report(op->reports, RPT_ERROR, "Could not order loop");
return 0;
}
}
@@ -4252,7 +4105,7 @@ int EdgeSlide(EditMesh *em, short immediate, float imperc)
tempsv = BLI_ghash_lookup(vertgh,(EditVert*)look->link);
if(!tempsv->up || !tempsv->down) {
- error("Missing rails");
+ BKE_report(op->reports, RPT_ERROR, "Missing rails");
BLI_ghash_free(vertgh, NULL, (GHashValFreeFP)MEM_freeN);
BLI_linklist_free(vertlist,NULL);
BLI_linklist_free(edgelist,NULL);
@@ -4757,9 +4610,10 @@ int EdgeSlide(EditMesh *em, short immediate, float imperc)
}
return 1;
+#endif // END OF XXX
}
-int EdgeLoopDelete(EditMesh *em)
+int EdgeLoopDelete(EditMesh *em, wmOperator *op)
{
/* temporal flag setting so we keep UVs when deleting edge loops,
@@ -4767,7 +4621,7 @@ int EdgeLoopDelete(EditMesh *em)
// short uvcalc_flag_orig = 0; // XXX scene->toolsettings->uvcalc_flag;
// scene->toolsettings->uvcalc_flag |= UVCALC_TRANSFORM_CORRECT;
- if(!EdgeSlide(em, 1, 1)) {
+ if(!EdgeSlide(em, op, 1, 1)) {
return 0;
}
@@ -4783,7 +4637,7 @@ int EdgeLoopDelete(EditMesh *em)
/* -------------------- More tools ------------------ */
-
+#if 0
void mesh_set_face_flags(EditMesh *em, short mode)
{
EditFace *efa;
@@ -4851,6 +4705,7 @@ void mesh_set_face_flags(EditMesh *em, short mode)
}
}
+#endif
void mesh_set_smooth_faces(EditMesh *em, short event)
{
@@ -4871,13 +4726,15 @@ void mesh_set_smooth_faces(EditMesh *em, short event)
}
+/* ********************** mesh rip ********************** */
+
/* helper to find edge for edge_rip */
-static float mesh_rip_edgedist(float mat[][4], float *co1, float *co2, short *mval)
+static float mesh_rip_edgedist(ARegion *ar, float mat[][4], float *co1, float *co2, short *mval)
{
float vec1[3], vec2[3], mvalf[2];
-// XXX view3d_project_float(curarea, co1, vec1, mat);
-// view3d_project_float(curarea, co2, vec2, mat);
+ view3d_project_float(ar, co1, vec1, mat);
+ view3d_project_float(ar, co2, vec2, mat);
mvalf[0]= (float)mval[0];
mvalf[1]= (float)mval[1];
@@ -4905,14 +4762,18 @@ static void mesh_rip_setface(EditMesh *em, EditFace *sefa)
}
/* based on mouse cursor position, it defines how is being ripped */
-void mesh_rip(EditMesh *em)
+static int mesh_rip_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- extern void faceloop_select(EditEdge *startedge, int select);
+ ARegion *ar= CTX_wm_region(C);
+ RegionView3D *rv3d= ar->regiondata;
+ Object *obedit= CTX_data_edit_object(C);
+ EditMesh *em= ((Mesh *)obedit->data)->edit_mesh;
EditVert *eve, *nextve;
EditEdge *eed, *seed= NULL;
EditFace *efa, *sefa= NULL;
- float projectMat[4][4], vec[3], dist, mindist; // viewMat[4][4], XXX
- short doit= 1, mval[2]; // XXX ,propmode,prop;
+ float projectMat[4][4], vec[3], dist, mindist, viewMat[4][4];
+ short doit= 1, *mval= event->mval; // XXX ,propmode,prop;
+
// XXX propmode = scene->prop_mode;
// scene->prop_mode = 0;
@@ -4922,8 +4783,7 @@ void mesh_rip(EditMesh *em)
/* select flush... vertices are important */
EM_selectmode_set(em);
-// XXX getmouseco_areawin(mval);
-// view3d_get_object_project_mat(curarea, obedit, projectMat, viewMat);
+ view3d_get_object_project_mat(rv3d, obedit, projectMat, viewMat);
/* find best face, exclude triangles and break on face select or faces with 2 edges select */
mindist= 1000000.0f;
@@ -4940,7 +4800,7 @@ void mesh_rip(EditMesh *em)
if(totsel>1)
break;
-// view3d_project_float(curarea, efa->cent, vec, projectMat);
+ view3d_project_float(ar, efa->cent, vec, projectMat);
dist= sqrt( (vec[0]-mval[0])*(vec[0]-mval[0]) + (vec[1]-mval[1])*(vec[1]-mval[1]) );
if(dist<mindist) {
mindist= dist;
@@ -4950,12 +4810,12 @@ void mesh_rip(EditMesh *em)
}
if(efa) {
- error("Can't perform ripping with faces selected this way");
- return;
+ BKE_report(op->reports, RPT_ERROR, "Can't perform ripping with faces selected this way");
+ return OPERATOR_CANCELLED;
}
if(sefa==NULL) {
- error("No proper selection or faces included");
- return;
+ BKE_report(op->reports, RPT_ERROR, "No proper selection or faces included");
+ return OPERATOR_CANCELLED;
}
@@ -4980,7 +4840,7 @@ void mesh_rip(EditMesh *em)
if(seed==NULL) {
mindist= 1000000.0f;
if(sefa->e1->v1->tmp.v || sefa->e1->v2->tmp.v) {
- dist = mesh_rip_edgedist(projectMat,
+ dist = mesh_rip_edgedist(ar, projectMat,
sefa->e1->v1->co,
sefa->e1->v2->co, mval);
if(dist<mindist) {
@@ -4989,7 +4849,7 @@ void mesh_rip(EditMesh *em)
}
}
if(sefa->e2->v1->tmp.v || sefa->e2->v2->tmp.v) {
- dist = mesh_rip_edgedist(projectMat,
+ dist = mesh_rip_edgedist(ar, projectMat,
sefa->e2->v1->co,
sefa->e2->v2->co, mval);
if(dist<mindist) {
@@ -4998,7 +4858,7 @@ void mesh_rip(EditMesh *em)
}
}
if(sefa->e3->v1->tmp.v || sefa->e3->v2->tmp.v) {
- dist= mesh_rip_edgedist(projectMat,
+ dist= mesh_rip_edgedist(ar, projectMat,
sefa->e3->v1->co,
sefa->e3->v2->co, mval);
if(dist<mindist) {
@@ -5007,7 +4867,7 @@ void mesh_rip(EditMesh *em)
}
}
if(sefa->e4 && (sefa->e4->v1->tmp.v || sefa->e4->v2->tmp.v)) {
- dist= mesh_rip_edgedist(projectMat,
+ dist= mesh_rip_edgedist(ar, projectMat,
sefa->e4->v1->co,
sefa->e4->v2->co, mval);
if(dist<mindist) {
@@ -5018,11 +4878,11 @@ void mesh_rip(EditMesh *em)
}
if(seed==NULL) { // never happens?
- error("No proper edge found to start");
- return;
+ BKE_report(op->reports, RPT_ERROR, "No proper edge found to start");
+ return OPERATOR_CANCELLED;
}
- faceloop_select(seed, 2); // tmp abuse for finding all edges that need duplicated, returns OK faces with f1
+ faceloop_select(em, seed, 2); // tmp abuse for finding all edges that need duplicated, returns OK faces with f1
/* duplicate edges in the loop, with at least 1 vertex selected, needed for selection flip */
for(eed = em->edges.last; eed; eed= eed->prev) {
@@ -5033,8 +4893,9 @@ void mesh_rip(EditMesh *em)
newed= addedgelist(em, eed->v1->tmp.v?eed->v1->tmp.v:eed->v1,
eed->v2->tmp.v?eed->v2->tmp.v:eed->v2, eed);
if(eed->f & SELECT) {
- eed->f &= ~SELECT;
- newed->f |= SELECT;
+ EM_select_edge(eed, 0);
+ EM_remove_selection(em, eed, EDITEDGE);
+ EM_select_edge(newed, 1);
}
eed->tmp.v = (EditVert *)newed;
}
@@ -5101,15 +4962,36 @@ void mesh_rip(EditMesh *em)
}
}
-// BIF_TransformSetUndo("Rip");
-// initTransform(TFM_TRANSLATION, 0);
-// Transform();
-
+ RNA_int_set(op->ptr, "mode", TFM_TRANSLATION);
+ WM_operator_name_call(C, "TFM_OT_transform", WM_OP_INVOKE_REGION_WIN, op->ptr);
+
// scene->prop_mode = propmode;
// XXX scene->proportional = prop;
+
+ return OPERATOR_FINISHED;
}
-void shape_propagate(Scene *scene, Object *obedit, EditMesh *em)
+void MESH_OT_rip(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Rip";
+ ot->idname= "MESH_OT_rip";
+
+ /* api callbacks */
+ ot->invoke= mesh_rip_invoke;
+ ot->poll= ED_operator_editmesh; // XXX + v3d!
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* to give to transform */
+ RNA_def_int(ot->srna, "mode", TFM_TRANSLATION, 0, INT_MAX, "Mode", "", 0, INT_MAX);
+}
+
+
+/* ************************************** */
+
+void shape_propagate(Scene *scene, Object *obedit, EditMesh *em, wmOperator *op)
{
EditVert *ev = NULL;
Mesh* me = (Mesh*)obedit->data;
@@ -5121,7 +5003,7 @@ void shape_propagate(Scene *scene, Object *obedit, EditMesh *em)
if(me->key){
ky = me->key;
} else {
- error("Object Has No Key");
+ BKE_report(op->reports, RPT_ERROR, "Object Has No Key");
return;
}
@@ -5136,7 +5018,7 @@ void shape_propagate(Scene *scene, Object *obedit, EditMesh *em)
}
}
} else {
- error("Object Has No Blendshapes");
+ BKE_report(op->reports, RPT_ERROR, "Object Has No Blendshapes");
return;
}
@@ -5233,7 +5115,7 @@ void shape_copy_from_lerp(EditMesh *em, KeyBlock* thisBlock, KeyBlock* fromBlock
-void shape_copy_select_from(Object *obedit, EditMesh *em)
+void shape_copy_select_from(Object *obedit, EditMesh *em, wmOperator *op)
{
Mesh* me = (Mesh*)obedit->data;
EditVert *ev = NULL;
@@ -5247,7 +5129,7 @@ void shape_copy_select_from(Object *obedit, EditMesh *em)
if(me->key){
ky = me->key;
} else {
- error("Object Has No Key");
+ BKE_report(op->reports, RPT_ERROR, "Object Has No Key");
return;
}
@@ -5272,7 +5154,7 @@ void shape_copy_select_from(Object *obedit, EditMesh *em)
// XXX nr = pupmenu_col(menu, 20);
MEM_freeN(menu);
} else {
- error("Object Has No Blendshapes");
+ BKE_report(op->reports, RPT_ERROR, "Object Has No Blendshapes");
return;
}
@@ -5286,7 +5168,7 @@ void shape_copy_select_from(Object *obedit, EditMesh *em)
}
if(me->totvert != totverts){
- error("Shape Has had Verts Added/Removed, please cycle editmode before copying");
+ BKE_report(op->reports, RPT_ERROR, "Shape Has had Verts Added/Removed, please cycle editmode before copying");
return;
}
shape_copy_from_lerp(em, thisBlock,kb);
@@ -5864,7 +5746,7 @@ typedef struct PathEdge{
float w;
} PathEdge;
-void pathselect(EditMesh *em)
+void pathselect(EditMesh *em, wmOperator *op)
{
EditVert *eve, *s, *t;
EditEdge *eed;
@@ -6016,7 +5898,7 @@ void pathselect(EditMesh *em)
}
}
else{
- error("Path Selection requires that exactly two vertices be selected");
+ BKE_report(op->reports, RPT_ERROR, "Path Selection requires that exactly two vertices be selected");
return;
}
}
@@ -6025,7 +5907,6 @@ static int region_to_loop(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= ((Mesh *)obedit->data)->edit_mesh;
-
EditEdge *eed;
EditFace *efa;
@@ -6268,7 +6149,7 @@ static int mesh_rotate_uvs(bContext *C, wmOperator *op)
int shift = 0; // XXX
if (!EM_texFaceCheck(em)) {
- error("mesh has no uv/image layers");
+ BKE_report(op->reports, RPT_ERROR, "mesh has no uv/image layers");
return OPERATOR_CANCELLED;
}
@@ -6340,7 +6221,7 @@ static int mesh_mirror_uvs(bContext *C, wmOperator *op)
int shift= 0; // XXX
if (!EM_texFaceCheck(em)) {
- error("mesh has no uv/image layers");
+ BKE_report(op->reports, RPT_ERROR, "mesh has no uv/image layers");
return OPERATOR_CANCELLED;
}
@@ -6425,7 +6306,7 @@ static int mesh_rotate_colors(bContext *C, wmOperator *op)
int shift= 0; // XXX
if (!EM_vertColorCheck(em)) {
- error("mesh has no color layers");
+ BKE_report(op->reports, RPT_ERROR, "mesh has no color layers");
return OPERATOR_CANCELLED;
}
@@ -6480,7 +6361,7 @@ static int mesh_mirror_colors(bContext *C, wmOperator *op)
int shift= 0; // XXX
if (!EM_vertColorCheck(em)) {
- error("mesh has no color layers");
+ BKE_report(op->reports, RPT_ERROR, "Mesh has no color layers");
return OPERATOR_CANCELLED;
}
@@ -6760,12 +6641,260 @@ void MESH_OT_subdivs(wmOperatorType *ot)
}
+/* ************************************* */
+
+/* note; the EM_selectmode_set() calls here illustrate how badly constructed it all is... from before the
+edge/face flags, with very mixed results.... */
+static void beauty_fill(EditMesh *em)
+{
+ EditVert *v1, *v2, *v3, *v4;
+ EditEdge *eed, *nexted;
+ EditEdge dia1, dia2;
+ EditFace *efa, *w;
+ // void **efaar, **efaa;
+ EVPTuple *efaar;
+ EVPtr *efaa;
+ float len1, len2, len3, len4, len5, len6, opp1, opp2, fac1, fac2;
+ int totedge, ok, notbeauty=8, onedone, vindex[4];
+
+ /* - all selected edges with two faces
+ * - find the faces: store them in edges (using datablock)
+ * - per edge: - test convex
+ * - test edge: flip?
+ * - if true: remedge, addedge, all edges at the edge get new face pointers
+ */
+
+ EM_selectmode_set(em); // makes sure in selectmode 'face' the edges of selected faces are selected too
+
+ totedge = count_selected_edges(em->edges.first);
+ if(totedge==0) return;
+
+ /* temp block with face pointers */
+ efaar= (EVPTuple *) MEM_callocN(totedge * sizeof(EVPTuple), "beautyfill");
+
+ while (notbeauty) {
+ notbeauty--;
+
+ ok = collect_quadedges(efaar, em->edges.first, em->faces.first);
+
+ /* there we go */
+ onedone= 0;
+
+ eed= em->edges.first;
+ while(eed) {
+ nexted= eed->next;
+
+ /* f2 is set in collect_quadedges() */
+ if(eed->f2==2 && eed->h==0) {
+
+ efaa = (EVPtr *) eed->tmp.p;
+
+ /* none of the faces should be treated before, nor be part of fgon */
+ ok= 1;
+ efa= efaa[0];
+ if(efa->e1->f1 || efa->e2->f1 || efa->e3->f1) ok= 0;
+ if(efa->fgonf) ok= 0;
+ efa= efaa[1];
+ if(efa->e1->f1 || efa->e2->f1 || efa->e3->f1) ok= 0;
+ if(efa->fgonf) ok= 0;
+
+ if(ok) {
+ /* test convex */
+ givequadverts(efaa[0], efaa[1], &v1, &v2, &v3, &v4, vindex);
+ if(v1 && v2 && v3 && v4) {
+ if( convex(v1->co, v2->co, v3->co, v4->co) ) {
+
+ /* test edges */
+ if( (v1) > (v3) ) {
+ dia1.v1= v3;
+ dia1.v2= v1;
+ }
+ else {
+ dia1.v1= v1;
+ dia1.v2= v3;
+ }
+
+ if( (v2) > (v4) ) {
+ dia2.v1= v4;
+ dia2.v2= v2;
+ }
+ else {
+ dia2.v1= v2;
+ dia2.v2= v4;
+ }
+
+ /* testing rule:
+ * the area divided by the total edge lengths
+ */
+
+ len1= VecLenf(v1->co, v2->co);
+ len2= VecLenf(v2->co, v3->co);
+ len3= VecLenf(v3->co, v4->co);
+ len4= VecLenf(v4->co, v1->co);
+ len5= VecLenf(v1->co, v3->co);
+ len6= VecLenf(v2->co, v4->co);
+
+ opp1= AreaT3Dfl(v1->co, v2->co, v3->co);
+ opp2= AreaT3Dfl(v1->co, v3->co, v4->co);
+
+ fac1= opp1/(len1+len2+len5) + opp2/(len3+len4+len5);
+
+ opp1= AreaT3Dfl(v2->co, v3->co, v4->co);
+ opp2= AreaT3Dfl(v2->co, v4->co, v1->co);
+
+ fac2= opp1/(len2+len3+len6) + opp2/(len4+len1+len6);
+
+ ok= 0;
+ if(fac1 > fac2) {
+ if(dia2.v1==eed->v1 && dia2.v2==eed->v2) {
+ eed->f1= 1;
+ efa= efaa[0];
+ efa->f1= 1;
+ efa= efaa[1];
+ efa->f1= 1;
+
+ w= EM_face_from_faces(em, efaa[0], efaa[1],
+ vindex[0], vindex[1], 4+vindex[2], -1);
+ w->f |= SELECT;
+
+
+ w= EM_face_from_faces(em, efaa[0], efaa[1],
+ vindex[0], 4+vindex[2], 4+vindex[3], -1);
+ w->f |= SELECT;
+
+ onedone= 1;
+ }
+ }
+ else if(fac1 < fac2) {
+ if(dia1.v1==eed->v1 && dia1.v2==eed->v2) {
+ eed->f1= 1;
+ efa= efaa[0];
+ efa->f1= 1;
+ efa= efaa[1];
+ efa->f1= 1;
+
+
+ w= EM_face_from_faces(em, efaa[0], efaa[1],
+ vindex[1], 4+vindex[2], 4+vindex[3], -1);
+ w->f |= SELECT;
+
+
+ w= EM_face_from_faces(em, efaa[0], efaa[1],
+ vindex[0], 4+vindex[1], 4+vindex[3], -1);
+ w->f |= SELECT;
+
+ onedone= 1;
+ }
+ }
+ }
+ }
+ }
+
+ }
+ eed= nexted;
+ }
+
+ free_tagged_edges_faces(em, em->edges.first, em->faces.first);
+
+ if(onedone==0) break;
+
+ EM_selectmode_set(em); // new edges/faces were added
+ }
+
+ MEM_freeN(efaar);
+
+ EM_select_flush(em);
+
+}
+
+/* Got this from scanfill.c. You will need to juggle around the
+* callbacks for the scanfill.c code a bit for this to work. */
+static void fill_mesh(EditMesh *em)
+{
+ EditVert *eve,*v1;
+ EditEdge *eed,*e1,*nexted;
+ EditFace *efa,*nextvl, *efan;
+ short ok;
+
+ if(em==NULL) return;
+ waitcursor(1);
+
+ /* copy all selected vertices */
+ eve= em->verts.first;
+ while(eve) {
+ if(eve->f & SELECT) {
+ v1= BLI_addfillvert(eve->co);
+ eve->tmp.v= v1;
+ v1->tmp.v= eve;
+ v1->xs= 0; // used for counting edges
+ }
+ eve= eve->next;
+ }
+ /* copy all selected edges */
+ eed= em->edges.first;
+ while(eed) {
+ if( (eed->v1->f & SELECT) && (eed->v2->f & SELECT) ) {
+ e1= BLI_addfilledge(eed->v1->tmp.v, eed->v2->tmp.v);
+ e1->v1->xs++;
+ e1->v2->xs++;
+ }
+ eed= eed->next;
+ }
+ /* from all selected faces: remove vertices and edges to prevent doubles */
+ /* all edges add values, faces subtract,
+ then remove edges with vertices ->xs<2 */
+ efa= em->faces.first;
+ ok= 0;
+ while(efa) {
+ nextvl= efa->next;
+ if( faceselectedAND(efa, 1) ) {
+ efa->v1->tmp.v->xs--;
+ efa->v2->tmp.v->xs--;
+ efa->v3->tmp.v->xs--;
+ if(efa->v4) efa->v4->tmp.v->xs--;
+ ok= 1;
+
+ }
+ efa= nextvl;
+ }
+ if(ok) { /* there are faces selected */
+ eed= filledgebase.first;
+ while(eed) {
+ nexted= eed->next;
+ if(eed->v1->xs<2 || eed->v2->xs<2) {
+ BLI_remlink(&filledgebase,eed);
+ }
+ eed= nexted;
+ }
+ }
+
+ if(BLI_edgefill(0, em->mat_nr)) {
+ efa= fillfacebase.first;
+ while(efa) {
+ /* normals default pointing up */
+ efan= addfacelist(em, efa->v3->tmp.v, efa->v2->tmp.v,
+ efa->v1->tmp.v, 0, NULL, NULL);
+ if(efan) EM_select_face(efan, 1);
+ efa= efa->next;
+ }
+ }
+
+ BLI_end_edgefill();
+ beauty_fill(em);
+
+ WM_cursor_wait(0);
+ EM_select_flush(em);
+
+}
+
+
static int fill_mesh_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= ((Mesh *)obedit->data)->edit_mesh;
fill_mesh(em);
+ DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
@@ -6792,7 +6921,7 @@ static int beauty_fill_exec(bContext *C, wmOperator *op)
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= ((Mesh *)obedit->data)->edit_mesh;
- beauty_fill(em);
+ beauty_fill(em);
WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);