[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [36096] branches/bmesh/blender/source/ blender: =bmesh=
Joseph Eagar
joeedh at gmail.com
Mon Apr 11 03:38:21 CEST 2011
Revision: 36096
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=36096
Author: joeedh
Date: 2011-04-11 01:38:20 +0000 (Mon, 11 Apr 2011)
Log Message:
-----------
=bmesh=
Made the new "superknife" tool much stabler
then it was, though a few minor quirks remain.
Rather then the shortest-distance-in-graph method
I was using to rebuild the mesh post-knife I
reworked it to build a triangulation instead,
then merge the triangles into the right correct
faces.
Modified Paths:
--------------
branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c
branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
branches/bmesh/blender/source/blender/blenlib/intern/scanfill.c
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
branches/bmesh/blender/source/blender/editors/mesh/editbmesh_bvh.c
branches/bmesh/blender/source/blender/editors/mesh/knifetool.c
branches/bmesh/blender/source/blender/editors/mesh/mesh_ops.c
branches/bmesh/blender/source/blender/editors/space_view3d/drawmesh.c
branches/bmesh/blender/source/blender/modifiers/intern/MOD_ngoninterp.c
branches/bmesh/blender/source/blender/modifiers/intern/MOD_solidify.c
Modified: branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c 2011-04-11 01:18:25 UTC (rev 36095)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c 2011-04-11 01:38:20 UTC (rev 36096)
@@ -202,7 +202,7 @@
/*complete the loop*/
BLI_addfilledge(firstv, v);
- BLI_edgefill(0);
+ BLI_edgefill(2);
for (efa = fillfacebase.first; efa; efa=efa->next) {
BMLoop *l1, *l2, *l3;
Modified: branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c 2011-04-11 01:18:25 UTC (rev 36095)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c 2011-04-11 01:38:20 UTC (rev 36096)
@@ -2008,7 +2008,7 @@
}
BLI_addfilledge(lastv, firstv);
- BLI_edgefill(0);
+ BLI_edgefill(2);
for (f=fillfacebase.first; f; f=f->next) {
BLI_array_growone(mf);
BLI_array_growone(origIndex);
Modified: branches/bmesh/blender/source/blender/blenlib/intern/scanfill.c
===================================================================
--- branches/bmesh/blender/source/blender/blenlib/intern/scanfill.c 2011-04-11 01:18:25 UTC (rev 36095)
+++ branches/bmesh/blender/source/blender/blenlib/intern/scanfill.c 2011-04-11 01:38:20 UTC (rev 36096)
@@ -791,17 +791,17 @@
a += 1;
}
- if (a == 3) {
+ if (a == 3 && (mat_nr & 2)) {
eve = fillvertbase.first;
addfillface(eve, eve->next, eve->next->next, 0);
return 1;
- } else if (a == 4) {
+ } else if (a == 4 && (mat_nr & 2)) {
float vec1[3], vec2[3];
eve = fillvertbase.first;
- if (1) { //BMESH_TODO this is correct, right? -joeedh //mode & 2) {
+ if (1) { //BMESH_TODO) {
/*use shortest diagonal for quad*/
sub_v3_v3v3(vec1, eve->co, eve->next->next->co);
sub_v3_v3v3(vec2, eve->next->co, eve->next->next->next->co);
@@ -855,6 +855,13 @@
while(eve) {
if(v2) {
if( compare_v3v3(v2, eve->co, COMPLIMIT)==0) {
+ float inner = angle_v3v3v3(v1, v2, eve->co);
+
+ if (fabs(inner-M_PI) < 0.05 || fabs(inner) < 0.05) {
+ eve = eve->next;
+ continue;
+ }
+
len= normal_tri_v3( norm,v1, v2, eve->co);
if(len != 0.0) break;
}
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c 2011-04-11 01:18:25 UTC (rev 36095)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c 2011-04-11 01:38:20 UTC (rev 36096)
@@ -209,8 +209,8 @@
f = BM_Make_Face(bm, verts, edar, len);
- if(example)
- CustomData_bmesh_copy_data(&bm->pdata, &bm->pdata, example->head.data, &f->head.data);
+ if(example && f)
+ BM_Copy_Attributes(bm, bm, example, f);
}
Modified: branches/bmesh/blender/source/blender/editors/mesh/editbmesh_bvh.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/editbmesh_bvh.c 2011-04-11 01:18:25 UTC (rev 36095)
+++ branches/bmesh/blender/source/blender/editors/mesh/editbmesh_bvh.c 2011-04-11 01:38:20 UTC (rev 36096)
@@ -213,7 +213,7 @@
hit.dist = FLT_MAX;
hit.index = -1;
- BLI_bvhtree_ray_cast(tree->tree, co, dir, FLT_MAX, &hit, raycallback, tree);
+ BLI_bvhtree_ray_cast(tree->tree, co, dir, 0.0f, &hit, raycallback, tree);
if (hit.dist != FLT_MAX && hit.index != -1) {
if (hitout) {
VECCOPY(hitout, hit.co);
Modified: branches/bmesh/blender/source/blender/editors/mesh/knifetool.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/knifetool.c 2011-04-11 01:18:25 UTC (rev 36095)
+++ branches/bmesh/blender/source/blender/editors/mesh/knifetool.c 2011-04-11 01:38:20 UTC (rev 36096)
@@ -52,8 +52,10 @@
#include "BLI_memarena.h"
#include "BLI_mempool.h"
#include "BLI_math.h"
+#include "BLI_rand.h"
#include "BLI_kdopbvh.h"
#include "BLI_smallhash.h"
+#include "BLI_scanfill.h"
#include "BKE_blender.h"
#include "BKE_context.h"
@@ -85,6 +87,7 @@
#include "editbmesh_bvh.h"
#define MAXGROUP 30
+#define KMAXDIST 25 /*max mouse distance from edge before not detecting it*/
/* knifetool operator */
typedef struct KnifeVert {
@@ -92,7 +95,7 @@
ListBase edges;
float co[3], sco[3]; /*sco is screen coordinates*/
- short flag, draw, isface;
+ short flag, draw, isface, inspace;
} KnifeVert;
typedef struct Ref {
@@ -109,16 +112,13 @@
BMEdge *e, *oe; /*non-NULL if this is an original edge*/
} KnifeEdge;
-#define KMAXDIST 12 /*max mouse distance from edge before not detecting it*/
-#define MARK 4
-#define DEL 8
-
typedef struct BMEdgeHit {
KnifeEdge *kfe;
float hit[3];
- float shit[3];
+ float realhit[3]; /*used in midpoint mode*/
+ float schit[3];
float l; /*lambda along line*/
- BMVert *v; //set if snapped to a vert
+ KnifeVert *v; //set if snapped to a vert
BMFace *f;
} BMEdgeHit;
@@ -166,13 +166,19 @@
BLI_mempool *refs;
float projmat[4][4];
- int is_ortho, clipsta, clipend;
+ int is_ortho;
+ float clipsta, clipend;
enum {
MODE_IDLE,
MODE_DRAGGING,
MODE_CONNECT,
+ MODE_PANNING,
} mode;
+
+ int snap_midpoints, prevmode, extend;
+
+ int is_space, prev_is_space; /*1 if current cut location, vertco, isn't on the mesh*/
} knifetool_opdata;
static ListBase *knife_get_face_kedges(knifetool_opdata *kcd, BMFace *f);
@@ -266,6 +272,8 @@
kcd->prevvert = kcd->curvert;
kcd->prevbmface = kcd->curbmface;
kcd->cutnr++;
+ kcd->prev_is_space = kcd->is_space;
+ kcd->is_space = 0;
copy_v3_v3(kcd->prevco, kcd->vertco);
}
@@ -425,13 +433,17 @@
if (kcd->prevedge && kcd->prevedge == kcd->curedge)
return;
+ kfe->draw = 1;
+
if (kcd->prevvert) {
kfe->v1 = kcd->prevvert;
} else if (kcd->prevedge) {
kfe->v1 = knife_split_edge(kcd, kcd->prevedge, kcd->prevco, &kfe2);
} else {
kfe->v1 = new_knife_vert(kcd, kcd->prevco);
- kfe->v1->draw = 1;
+ kfe->v1->draw = kfe->draw = !kcd->prev_is_space;
+ kfe->v1->inspace = kcd->prev_is_space;
+ kfe->draw = !kcd->prev_is_space;
kfe->v1->isface = 1;
}
@@ -439,20 +451,22 @@
kfe->v2 = kcd->curvert;
} else if (kcd->curedge) {
kfe->v2 = knife_split_edge(kcd, kcd->curedge, kcd->vertco, &kfe3);
-
+
kcd->curvert = kfe->v2;
} else {
kfe->v2 = new_knife_vert(kcd, kcd->vertco);
- kfe->v2->draw = 1;
+ kfe->v2->draw = !kcd->is_space;
kfe->v2->isface = 1;
+ kfe->v2->inspace = kcd->is_space;
+
+ if (kcd->is_space)
+ kfe->draw = 0;
kcd->curvert = kfe->v2;
}
knife_find_basef(kcd, kfe);
- kfe->draw = 1;
-
ref = BLI_mempool_calloc(kcd->refs);
ref->ref = kfe;
BLI_addtail(&kfe->v1->edges, ref);
@@ -482,6 +496,7 @@
kcd->prevvert = kcd->curvert;
kcd->prevedge = kcd->curedge;
copy_v3_v3(kcd->prevco, kcd->vertco);
+ kcd->prev_is_space = kcd->is_space;
}
static int verge_linehit(const void *vlh1, const void *vlh2)
@@ -526,9 +541,20 @@
lastlh = firstlh = NULL;
}
- if (!lastlh && len_v3v3(kcd->prevco, lh->hit) < FLT_EPSILON*10)
+ if (len_v3v3(kcd->prevco, lh->realhit) < FLT_EPSILON*80)
continue;
+ if (len_v3v3(kcd->vertco, lh->realhit) < FLT_EPSILON*80)
+ continue;
+ if (kcd->prev_is_space || kcd->is_space) {
+ kcd->prev_is_space = kcd->is_space = 0;
+ copy_v3_v3(kcd->prevco, lh->hit);
+ kcd->prevedge = lh->kfe;
+ kcd->curbmface = lh->f;
+ continue;
+ }
+
+ kcd->is_space = 0;
kcd->curedge = lh->kfe;
kcd->curbmface = lh->f;
kcd->curvert = lh->v;
@@ -540,6 +566,7 @@
kcd->curbmface = oldkcd.curbmface;
kcd->curvert = oldkcd.curvert;
kcd->curedge = oldkcd.curedge;
+ kcd->is_space = oldkcd.is_space;
copy_v3_v3(kcd->vertco, oldkcd.vertco);
knife_add_single_cut(kcd);
@@ -563,7 +590,9 @@
knifetool_opdata *kcd = arg;
glDisable(GL_DEPTH_TEST);
-
+
+ glPolygonOffset(1.0f, 1.0f);
+
glPushMatrix();
glMultMatrixf(kcd->ob->obmat);
@@ -624,12 +653,13 @@
knife_project_v3(kcd, lh->kfe->v1->co, sv1);
knife_project_v3(kcd, lh->kfe->v2->co, sv2);
+ knife_project_v3(kcd, lh->hit, lh->schit);
- if (len_v2v2(lh->shit, sv1) < kcd->vthresh/4) {
+ if (len_v2v2(lh->schit, sv1) < kcd->vthresh/4) {
copy_v3_v3(lh->hit, lh->kfe->v1->co);
glVertex3fv(lh->hit);
lh->v = lh->kfe->v1;
- } else if (len_v2v2(lh->shit, sv2) < kcd->vthresh/4) {
+ } else if (len_v2v2(lh->schit, sv2) < kcd->vthresh/4) {
copy_v3_v3(lh->hit, lh->kfe->v2->co);
glVertex3fv(lh->hit);
lh->v = lh->kfe->v2;
@@ -723,6 +753,27 @@
fflush(stdout);
}
+static int kfe_vert_in_edge(KnifeEdge *e, KnifeVert *v) {
+ return e->v1 == v || e->v2 == v;
+}
+
+static int point_on_line(float p[3], float v1[3], float v2[3])
+{
+ float d = dist_to_line_segment_v3(p, v1, v2);
+ if (d < 0.01) {
+ d = len_v3v3(v1, v2);
+ if (d == 0.0)
+ return 0;
+
+ d = len_v3v3(p, v1) / d;
+
+ if (d >= -FLT_EPSILON*10 || d <= 1.0+FLT_EPSILON*10)
+ return 1;
+ }
+
+ return 0;
+}
+
BMEdgeHit *knife_edge_tri_isect(knifetool_opdata *kcd, BMBVHTree *bmtree, float v1[3],
float v2[3], float v3[3], SmallHash *ehash, bglMats *mats, int *count)
{
@@ -732,7 +783,8 @@
BVHTreeOverlap *results, *result;
BMLoop **ls;
float cos[9], uv[3], lambda;
- int tot=0, i, j;
+ unsigned int tot=0;
+ int i, j;
copy_v3_v3(cos, v1);
copy_v3_v3(cos+3, v2);
@@ -756,6 +808,9 @@
for (ref=lst->first; ref; ref=ref->next) {
KnifeEdge *kfe = ref->ref;
+ if (kfe == kcd->curedge || kfe== kcd->prevedge)
+ continue;
+
if (isect_line_tri_v3(kfe->v1->co, kfe->v2->co, v1, v2, v3, &lambda, uv)) {
float no[3], view[3], sp[3];
@@ -763,6 +818,17 @@
mul_v3_fl(p, lambda);
add_v3_v3(p, kfe->v1->co);
+ if (kcd->curedge && point_on_line(p, kcd->curedge->v1->co, kcd->curedge->v2->co))
+ continue;
+ if (kcd->prevedge && point_on_line(p, kcd->prevedge->v1->co, kcd->prevedge->v2->co))
+ continue;
+ if (kcd->curvert && len_v3v3(kcd->curvert->co, p) < FLT_EPSILON*50)
+ continue;
+ if (kcd->prevvert && len_v3v3(kcd->prevvert->co, p) < FLT_EPSILON*50)
+ continue;
+ if (len_v3v3(kcd->prevco, p) < FLT_EPSILON*50 || len_v3v3(kcd->vertco, p) < FLT_EPSILON*50)
+ continue;
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list