pre-merge commit; decided might as well get it over with.
This commit is contained in:
@@ -76,7 +76,7 @@ MINLINE void add_v3_v3(float *r, float *a)
|
|||||||
{
|
{
|
||||||
r[0] += a[0];
|
r[0] += a[0];
|
||||||
r[1] += a[1];
|
r[1] += a[1];
|
||||||
r[1] += a[1];
|
r[2] += a[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
MINLINE void add_v3_v3v3(float *r, float *a, float *b)
|
MINLINE void add_v3_v3v3(float *r, float *a, float *b)
|
||||||
@@ -102,7 +102,7 @@ MINLINE void sub_v3_v3(float *r, float *a)
|
|||||||
{
|
{
|
||||||
r[0] -= a[0];
|
r[0] -= a[0];
|
||||||
r[1] -= a[1];
|
r[1] -= a[1];
|
||||||
r[1] -= a[1];
|
r[2] -= a[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
MINLINE void sub_v3_v3v3(float *r, float *a, float *b)
|
MINLINE void sub_v3_v3v3(float *r, float *a, float *b)
|
||||||
|
@@ -249,21 +249,11 @@ void dissolveedges_exec(BMesh *bm, BMOperator *op)
|
|||||||
|
|
||||||
BMO_ITER(e, &oiter, bm, op, "edges", BM_EDGE) {
|
BMO_ITER(e, &oiter, bm, op, "edges", BM_EDGE) {
|
||||||
if (BM_Edge_FaceCount(e) == 2) {
|
if (BM_Edge_FaceCount(e) == 2) {
|
||||||
BMO_SetFlag(bm, e->v1, VERT_MARK);
|
|
||||||
BMO_SetFlag(bm, e->v2, VERT_MARK);
|
|
||||||
|
|
||||||
BM_Join_Faces(bm, e->loop->f,
|
BM_Join_Faces(bm, e->loop->f,
|
||||||
((BMLoop*)e->loop->radial.next->data)->f,
|
((BMLoop*)e->loop->radial.next->data)->f,
|
||||||
e);
|
e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//BMO_InitOpf(bm, &fop, "dissolvefaces faces=%ff", FACE_MARK);
|
|
||||||
//BMO_Exec_Op(bm, &fop);
|
|
||||||
|
|
||||||
//BMO_CopySlot(op, &fop, "regionout", "regionout");
|
|
||||||
|
|
||||||
//BMO_Finish_Op(bm, &fop);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int test_extra_verts(BMesh *bm, BMVert *v)
|
static int test_extra_verts(BMesh *bm, BMVert *v)
|
||||||
|
@@ -503,8 +503,7 @@ void EDBM_clear_flag_all(BMEditMesh *em, int flag)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ele = BMIter_New(&iter, em->bm, type, NULL);
|
BM_ITER(ele, &iter, em->bm, type, NULL) {
|
||||||
for ( ; ele; ele=BMIter_Step(&iter)) {
|
|
||||||
if (flag & BM_SELECT) BM_Select(em->bm, ele, 0);
|
if (flag & BM_SELECT) BM_Select(em->bm, ele, 0);
|
||||||
BM_ClearHFlag(ele, flag);
|
BM_ClearHFlag(ele, flag);
|
||||||
}
|
}
|
||||||
|
@@ -3930,7 +3930,7 @@ int BoneEnvelope(TransInfo *t, short mval[2])
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* ******************** Edge Slide *************** */
|
/* ******************** Edge Slide *************** */
|
||||||
#if 1
|
#if 0
|
||||||
static int createSlideVerts(TransInfo *t) {
|
static int createSlideVerts(TransInfo *t) {
|
||||||
#else
|
#else
|
||||||
static BMEdge *get_other_edge(BMesh *bm, BMVert *v, BMEdge *e)
|
static BMEdge *get_other_edge(BMesh *bm, BMVert *v, BMEdge *e)
|
||||||
@@ -3938,24 +3938,20 @@ static BMEdge *get_other_edge(BMesh *bm, BMVert *v, BMEdge *e)
|
|||||||
BMIter iter;
|
BMIter iter;
|
||||||
BMEdge *e2;
|
BMEdge *e2;
|
||||||
|
|
||||||
BM_ITER(e, &iter, bm, BM_EDGES_OF_VERT, v) {
|
BM_ITER(e2, &iter, bm, BM_EDGES_OF_VERT, v) {
|
||||||
if (BM_TestHFlag(e2, BM_SELECT) && e2 != e)
|
if (BM_TestHFlag(e2, BM_SELECT) && e2 != e)
|
||||||
return e;
|
return e2;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BMLoop *get_next_loop(BMesh *bm, BMVert *v, BMFace *f,
|
static BMLoop *get_next_loop(BMesh *bm, BMVert *v, BMLoop *l,
|
||||||
BMEdge *olde, BMEdge *nexte)
|
BMEdge *olde, BMEdge *nexte, float vec[3])
|
||||||
{
|
{
|
||||||
BMIter iter;
|
BMLoop *firstl;
|
||||||
BMLoop *l, firstl;
|
float a[3] = {0.0f, 0.0f, 0.0f}, n[3] = {0.0f, 0.0f, 0.0f};
|
||||||
|
int i=0;
|
||||||
BM_ITER(l, &iter, bm, BM_LOOPS_OF_FACE, f) {
|
|
||||||
if (l->e == olde)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
firstl = l;
|
firstl = l;
|
||||||
do {
|
do {
|
||||||
@@ -3963,15 +3959,47 @@ static BMLoop *get_next_loop(BMesh *bm, BMVert *v, BMFace *f,
|
|||||||
if (l->radial.next->data == l)
|
if (l->radial.next->data == l)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (BM_OtherFaceLoop(l->e, l->f, v)->e == nexte)
|
if (l->e == nexte) {
|
||||||
return BM_OtherFaceLoop(l->e, l->f, v);
|
if (i) {
|
||||||
|
mul_v3_fl(a, 1.0f / (float)i);
|
||||||
if (l->e == nexte)
|
} else {
|
||||||
return l;
|
float f1[3], f2[3], f3[3], n[3];
|
||||||
|
|
||||||
|
sub_v3_v3v3(f1, BM_OtherEdgeVert(olde, v)->co, v->co);
|
||||||
|
sub_v3_v3v3(f2, BM_OtherEdgeVert(nexte, v)->co, v->co);
|
||||||
|
|
||||||
|
cross_v3_v3v3(f3, f1, l->f->no);
|
||||||
|
cross_v3_v3v3(a, f2, l->f->no);
|
||||||
|
mul_v3_fl(a, -1.0f);
|
||||||
|
|
||||||
|
add_v3_v3(a, f3);
|
||||||
|
mul_v3_fl(a, 0.5f);
|
||||||
|
}
|
||||||
|
|
||||||
|
VECCOPY(vec, a);
|
||||||
|
return l;
|
||||||
|
} else {
|
||||||
|
sub_v3_v3v3(n, BM_OtherEdgeVert(l->e, l->v)->co, l->v->co);
|
||||||
|
add_v3_v3v3(a, a, n);
|
||||||
|
i += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (BM_OtherFaceLoop(l->e, l->f, v)->e == nexte) {
|
||||||
|
if (i)
|
||||||
|
mul_v3_fl(a, 1.0f / (float)i);
|
||||||
|
|
||||||
|
VECCOPY(vec, a);
|
||||||
|
return BM_OtherFaceLoop(l->e, l->f, v);
|
||||||
|
}
|
||||||
|
|
||||||
l = l->radial.next->data;
|
l = l->radial.next->data;
|
||||||
} while (l != firstl);
|
} while (l != firstl);
|
||||||
|
|
||||||
|
if (i)
|
||||||
|
mul_v3_fl(a, 1.0f / (float)i);
|
||||||
|
|
||||||
|
VECCOPY(vec, a);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3979,21 +4007,22 @@ static int createSlideVerts(TransInfo *t)
|
|||||||
{
|
{
|
||||||
Mesh *me = t->obedit->data;
|
Mesh *me = t->obedit->data;
|
||||||
BMEditMesh *em = me->edit_btmesh;
|
BMEditMesh *em = me->edit_btmesh;
|
||||||
|
BMesh *bm = em->bm;
|
||||||
BMIter iter, iter2;
|
BMIter iter, iter2;
|
||||||
BMEdge *e, *e1, *e2;
|
BMEdge *e, *e1, *e2;
|
||||||
BMVert *v, *first;
|
BMVert *v, *v2, *first;
|
||||||
BMLoop *l, *l1, *l2;
|
BMLoop *l, *l1, *l2;
|
||||||
TransDataSlideVert *tempsv;
|
TransDataSlideVert *tempsv, *sv;
|
||||||
GHash **uvarray= NULL;
|
GHash **uvarray= NULL;
|
||||||
SlideData *sld = MEM_callocN(sizeof(*sld), "sld");
|
SlideData *sld = MEM_callocN(sizeof(*sld), "sld");
|
||||||
int uvlay_tot= CustomData_number_of_layers(&em->fdata, CD_MTFACE);
|
|
||||||
int uvlay_idx;
|
|
||||||
TransDataSlideUv *slideuvs=NULL, *suv=NULL, *suv_last=NULL;
|
TransDataSlideUv *slideuvs=NULL, *suv=NULL, *suv_last=NULL;
|
||||||
RegionView3D *v3d = t->ar->regiondata;
|
RegionView3D *v3d = t->ar->regiondata;
|
||||||
float projectMat[4][4];
|
float projectMat[4][4];
|
||||||
float start[3] = {0.0f, 0.0f, 0.0f}, end[3] = {0.0f, 0.0f, 0.0f};
|
float start[3] = {0.0f, 0.0f, 0.0f}, end[3] = {0.0f, 0.0f, 0.0f};
|
||||||
float vec[3], i, j;
|
float vec[3], vec2[3];
|
||||||
float totvec=0.0;
|
float totvec=0.0;
|
||||||
|
int uvlay_tot= CustomData_number_of_layers(&em->bm->pdata, CD_MTFACE);
|
||||||
|
int uvlay_idx, numsel, i, j;
|
||||||
|
|
||||||
if (!v3d) {
|
if (!v3d) {
|
||||||
/*ok, let's try to survive this*/
|
/*ok, let's try to survive this*/
|
||||||
@@ -4024,7 +4053,7 @@ static int createSlideVerts(TransInfo *t)
|
|||||||
|
|
||||||
BM_ITER(e, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
|
BM_ITER(e, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
|
||||||
if (BM_TestHFlag(e, BM_SELECT)) {
|
if (BM_TestHFlag(e, BM_SELECT)) {
|
||||||
if (BM_Edge_FaceCount(e) > 2)
|
if (BM_Edge_FaceCount(e) > 2 || BM_Edge_FaceCount(e) == 0)
|
||||||
return 0; //can't handle more then 2 faces around an edge
|
return 0; //can't handle more then 2 faces around an edge
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4054,10 +4083,10 @@ static int createSlideVerts(TransInfo *t)
|
|||||||
if (!v)
|
if (!v)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
BMINDX_SET(v, 0);
|
BMINDEX_SET(v, 0);
|
||||||
|
|
||||||
if (!v->edge)
|
if (!v->edge)
|
||||||
continue
|
continue;
|
||||||
|
|
||||||
first = v;
|
first = v;
|
||||||
|
|
||||||
@@ -4067,38 +4096,104 @@ static int createSlideVerts(TransInfo *t)
|
|||||||
/*first, rewind*/
|
/*first, rewind*/
|
||||||
numsel = 0;
|
numsel = 0;
|
||||||
do {
|
do {
|
||||||
|
BMINDEX_SET(v, 0);
|
||||||
|
|
||||||
e = get_other_edge(bm, v, e);
|
e = get_other_edge(bm, v, e);
|
||||||
if (!e) {
|
if (!e) {
|
||||||
e = v->edge;
|
e = v->edge;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
v = BM_OtherEdgeVert(e, v);
|
|
||||||
numsel += 1;
|
numsel += 1;
|
||||||
} while (e != v->edge);
|
|
||||||
|
if (!BMINDEX_GET(BM_OtherEdgeVert(e, v)))
|
||||||
|
break;
|
||||||
|
|
||||||
|
v = BM_OtherEdgeVert(e, v);
|
||||||
|
} while (e != first->edge);
|
||||||
|
|
||||||
l1 = l2 = l = NULL;
|
l1 = l2 = l = NULL;
|
||||||
|
l1 = e->loop;
|
||||||
|
l2 = e->loop->radial.next->data;
|
||||||
|
|
||||||
|
l = BM_OtherFaceLoop(l1->e, l1->f, v);
|
||||||
|
sub_v3_v3v3(vec, BM_OtherEdgeVert(l->e, v)->co, v->co);
|
||||||
|
|
||||||
|
if (l2 != l1) {
|
||||||
|
l = BM_OtherFaceLoop(l2->e, l2->f, v);
|
||||||
|
sub_v3_v3v3(vec2, BM_OtherEdgeVert(l->e, v)->co, v->co);
|
||||||
|
} else {
|
||||||
|
l2 = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/*iterate over the loop*/
|
/*iterate over the loop*/
|
||||||
first = v;
|
first = v;
|
||||||
|
j = 0;
|
||||||
do {
|
do {
|
||||||
TransDataSlideVert *sv = tempsv + j;
|
TransDataSlideVert *sv = tempsv + j;
|
||||||
|
|
||||||
sv->v = v;
|
sv->v = v;
|
||||||
sv->origvert = *v;
|
sv->origvert = *v;
|
||||||
|
VECCOPY(sv->upvec, vec);
|
||||||
|
if (l2)
|
||||||
|
VECCOPY(sv->downvec, vec2);
|
||||||
|
|
||||||
|
l = BM_OtherFaceLoop(l1->e, l1->f, v);
|
||||||
|
sv->up = BM_OtherEdgeVert(l->e, v);
|
||||||
|
|
||||||
|
if (l2) {
|
||||||
|
l = BM_OtherFaceLoop(l2->e, l2->f, v);
|
||||||
|
sv->down = BM_OtherEdgeVert(l->e, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
v2=v, v = BM_OtherEdgeVert(e, v);
|
||||||
|
|
||||||
|
e1 = e;
|
||||||
e = get_other_edge(bm, v, e);
|
e = get_other_edge(bm, v, e);
|
||||||
if (!e) {
|
if (!e) {
|
||||||
e = v->edge;
|
sv = tempsv + j + 1;
|
||||||
|
sv->v = v;
|
||||||
|
sv->origvert = *v;
|
||||||
|
|
||||||
|
l = BM_OtherFaceLoop(l1->e, l1->f, v);
|
||||||
|
sv->up = BM_OtherEdgeVert(l->e, v);
|
||||||
|
|
||||||
|
if (l2) {
|
||||||
|
l = BM_OtherFaceLoop(l2->e, l2->f, v);
|
||||||
|
sv->down = BM_OtherEdgeVert(l->e, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
BMINDEX_SET(v, 0);
|
||||||
|
BMINDEX_SET(v2, 0);
|
||||||
|
|
||||||
|
j += 2;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
v = BM_OtherEdgeVert(e, v);
|
l1 = get_next_loop(bm, v, l1, e1, e, vec);
|
||||||
j += 1
|
l2 = l2 ? get_next_loop(bm, v, l2, e1, e, vec2) : NULL;
|
||||||
} while (e != v->edge);
|
|
||||||
|
j += 1;
|
||||||
|
|
||||||
|
BMINDEX_SET(v, 0);
|
||||||
|
BMINDEX_SET(v2, 0);
|
||||||
|
} while (e != first->edge && l1);
|
||||||
}
|
}
|
||||||
|
|
||||||
MEM_freeN(tempsv);
|
//EDBM_clear_flag_all(em, BM_SELECT);
|
||||||
|
|
||||||
|
sld->sv = tempsv;
|
||||||
|
sld->totsv = j;
|
||||||
|
|
||||||
|
sld->start[0] = t->mval[0] - 40;
|
||||||
|
sld->start[1] = t->mval[1];
|
||||||
|
|
||||||
|
sld->end[0] = t->mval[0] + 40;
|
||||||
|
sld->end[1] = t->mval[1];
|
||||||
|
|
||||||
|
t->customData = sld;
|
||||||
|
|
||||||
|
return 1;
|
||||||
#endif
|
#endif
|
||||||
#if 0
|
#if 0
|
||||||
Mesh *me = t->obedit->data;
|
Mesh *me = t->obedit->data;
|
||||||
@@ -4632,6 +4727,25 @@ void initEdgeSlide(TransInfo *t)
|
|||||||
|
|
||||||
int doEdgeSlide(TransInfo *t, float perc)
|
int doEdgeSlide(TransInfo *t, float perc)
|
||||||
{
|
{
|
||||||
|
SlideData *sld = t->customData;
|
||||||
|
TransDataSlideVert *svlist = sld->sv, *sv;
|
||||||
|
float vec[3];
|
||||||
|
int i;
|
||||||
|
|
||||||
|
sv = svlist;
|
||||||
|
for (i=0; i<sld->totsv; i++, sv++) {
|
||||||
|
if (perc > 0.0f) {
|
||||||
|
VECCOPY(vec, sv->upvec);
|
||||||
|
mul_v3_fl(vec, perc);
|
||||||
|
add_v3_v3v3(sv->v->co, sv->origvert.co, vec);
|
||||||
|
} else {
|
||||||
|
VECCOPY(vec, sv->downvec);
|
||||||
|
mul_v3_fl(vec, perc);
|
||||||
|
add_v3_v3v3(sv->v->co, sv->origvert.co, vec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
#if 0
|
#if 0
|
||||||
Mesh *me= t->obedit->data;
|
Mesh *me= t->obedit->data;
|
||||||
EditMesh *em = me->edit_mesh;
|
EditMesh *em = me->edit_mesh;
|
||||||
@@ -4738,8 +4852,9 @@ int doEdgeSlide(TransInfo *t, float perc)
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
return 1;
|
return 1;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int EdgeSlide(TransInfo *t, short mval[2])
|
int EdgeSlide(TransInfo *t, short mval[2])
|
||||||
|
@@ -195,16 +195,23 @@ typedef struct TransDataSlideVert {
|
|||||||
struct BMVert vup, vdown;
|
struct BMVert vup, vdown;
|
||||||
struct BMVert origvert;
|
struct BMVert origvert;
|
||||||
|
|
||||||
struct BMEdge *up, *down;
|
struct BMVert *up, *down;
|
||||||
struct BMVert *v;
|
struct BMVert *v;
|
||||||
|
|
||||||
|
float upvec[3], downvec[3];
|
||||||
} TransDataSlideVert;
|
} TransDataSlideVert;
|
||||||
|
|
||||||
typedef struct SlideData {
|
typedef struct SlideData {
|
||||||
|
TransDataSlideVert *sv;
|
||||||
|
int totsv;
|
||||||
|
|
||||||
|
/*
|
||||||
TransDataSlideUv *slideuv, *suv_last;
|
TransDataSlideUv *slideuv, *suv_last;
|
||||||
int totuv, uvlay_tot;
|
int totuv, uvlay_tot;
|
||||||
struct GHash *vhash, **uvhash;
|
struct GHash *vhash, **uvhash;
|
||||||
struct EditVert *nearest;
|
struct EditVert *nearest;
|
||||||
struct LinkNode *edgelist, *vertlist;
|
struct LinkNode *edgelist, *vertlist;
|
||||||
|
*/
|
||||||
short start[2], end[2];
|
short start[2], end[2];
|
||||||
} SlideData;
|
} SlideData;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user