diff options
author | Joseph Eagar <joeedh@gmail.com> | 2010-07-23 02:17:20 +0400 |
---|---|---|
committer | Joseph Eagar <joeedh@gmail.com> | 2010-07-23 02:17:20 +0400 |
commit | 37f2c8a64c3277f100ab084ef1bb3846bc7b2c62 (patch) | |
tree | d78068f89c60cacfe40595133614e65e4164e015 /source | |
parent | a23e3c42f55efed357e7b1604dbec57ab5c02a82 (diff) |
committing working copy
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/bmesh/operators/dissolveops.c | 3 | ||||
-rw-r--r-- | source/blender/editors/include/ED_view3d.h | 3 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_view.c | 20 | ||||
-rw-r--r-- | source/blender/editors/transform/transform.c | 66 |
4 files changed, 86 insertions, 6 deletions
diff --git a/source/blender/bmesh/operators/dissolveops.c b/source/blender/bmesh/operators/dissolveops.c index 000c7640e85..ceffbaa56a1 100644 --- a/source/blender/bmesh/operators/dissolveops.c +++ b/source/blender/bmesh/operators/dissolveops.c @@ -223,7 +223,8 @@ void dissolve_edgeloop_exec(BMesh *bm, BMOperator *op) /*clean up extreneous 2-valence vertices*/ for (i=0; i<BLI_array_count(verts); i++) { - BM_Collapse_Vert(bm, verts[i]->e, verts[i], 1.0); + if (verts[i]->e) + BM_Collapse_Vert(bm, verts[i]->e, verts[i], 1.0); } BLI_array_free(verts); diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h index ae670350a56..85539abd00a 100644 --- a/source/blender/editors/include/ED_view3d.h +++ b/source/blender/editors/include/ED_view3d.h @@ -107,7 +107,10 @@ int get_view3d_cliprange(struct View3D *v3d, struct RegionView3D *rv3d, float *c int get_view3d_viewplane(struct View3D *v3d, struct RegionView3D *rv3d, int winxi, int winyi, rctf *viewplane, float *clipsta, float *clipend, float *pixsize); int get_view3d_ortho(struct View3D *v3d, struct RegionView3D *rv3d); void view3d_get_object_project_mat(struct RegionView3D *v3d, struct Object *ob, float pmat[4][4]); +/* computes screen x/y in vec */ void view3d_project_float(struct ARegion *a, float *vec, float *adr, float mat[4][4]); +/* computes z, as well as x and y */ +void view3d_project_float_v3(struct ARegion *a, float *vec, float *adr, float mat[4][4]); /* drawobject.c itterators */ void mesh_foreachScreenVert(struct ViewContext *vc, void (*func)(void *userData, struct BMVert *eve, int x, int y, int index), void *userData, int clipVerts); diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c index 4471c051aa7..31138b00f17 100644 --- a/source/blender/editors/space_view3d/view3d_view.c +++ b/source/blender/editors/space_view3d/view3d_view.c @@ -699,6 +699,26 @@ void view3d_project_float(ARegion *ar, float *vec, float *adr, float mat[4][4]) } } +/* use above call to get projecting mat */ +void view3d_project_float_v3(ARegion *ar, float *vec, float *adr, float mat[4][4]) +{ + float vec4[4]; + + VECCOPY(vec4, vec); + adr[0]= IS_CLIPPED; + vec4[3]= 1.0; + + mul_m4_v4(mat, vec4); + + if( vec4[3]>FLT_EPSILON ) { + adr[0] = (float)(ar->winx/2.0f)+(ar->winx/2.0f)*vec4[0]/vec4[3]; + adr[1] = (float)(ar->winy/2.0f)+(ar->winy/2.0f)*vec4[1]/vec4[3]; + adr[2] = vec4[2]/vec4[3]; + } else { + adr[0] = adr[1] = adr[2] = 0.0f; + } +} + int boundbox_clip(RegionView3D *rv3d, float obmat[][4], BoundBox *bb) { /* return 1: draw */ diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index 5ed8ff8c8a7..da4500907e6 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -4273,9 +4273,10 @@ static int createSlideVerts(TransInfo *t) SlideData *sld = MEM_callocN(sizeof(*sld), "sld"); TransDataSlideUv *slideuvs=NULL, *suv=NULL, *suv_last=NULL; RegionView3D *v3d = t->ar->regiondata; + ARegion *ar = t->ar; float projectMat[4][4]; float start[3] = {0.0f, 0.0f, 0.0f}, end[3] = {0.0f, 0.0f, 0.0f}; - float vec[3], vec2[3]; + float vec[3], vec2[3], size, dis=0.0, z; float totvec=0.0; int uvlay_tot= CustomData_number_of_layers(&em->bm->pdata, CD_MTFACE); int uvlay_idx, numsel, i, j; @@ -4443,11 +4444,66 @@ static int createSlideVerts(TransInfo *t) sld->sv = tempsv; sld->totsv = j; - sld->start[0] = t->mval[0] - 40; - sld->start[1] = t->mval[1]; + /*find mouse vector*/ + dis = z = 10000.0f; + size = 50.0; + BM_ITER(e, &iter, em->bm, BM_EDGES_OF_MESH, NULL) { + if (BM_TestHFlag(e, BM_SELECT)) { + BMIter iter2; + BMEdge *e2; + float vec1[3], vec2[3], dir[3], vec[3], mval[2] = {t->mval[0], t->mval[1]}, d, z2; + + for (i=0; i<2; i++) { + BM_ITER(e2, &iter2, em->bm, BM_EDGES_OF_VERT, i?e->v1:e->v2) { + if (BM_TestHFlag(e2, BM_SELECT)) + continue; + + view3d_project_float_v3(ar, e2->v1->co, vec1, projectMat); + view3d_project_float_v3(ar, e2->v2->co, vec2, projectMat); + + add_v3_v3v3(vec, vec1, vec2); + mul_v3_fl(vec, 0.5); + z2 = vec[2]; + + d = dist_to_line_segment_v2(mval, vec1, vec2); + if (d < dis || (d < 15 && z2 < z)) { + dis = d; + size = len_v3v3(vec1, vec2); + } + } + } + view3d_project_float(ar, e->v1->co, vec1, projectMat); + view3d_project_float(ar, e->v2->co, vec2, projectMat); + + sub_v3_v3v3(vec, vec1, vec2); + normalize_v3(vec); + + if (dot_v3v3(dir, dir) != 0.0f) { + copy_v3_v3(dir, start); + normalize_v3(dir); + + if (dot_v3v3(dir, vec) < 0.0) { + mul_v3_fl(dir, -1.0); + } + } + + add_v3_v3(start, dir); + } + } + + normalize_v3(start); + mul_v3_fl(start, size); + + end[0] = start[1]; + end[1] = -start[0]; + + SWAP(float, start[0], start[1]); + + sld->start[0] = t->mval[0] + start[0]; + sld->start[1] = t->mval[1] + start[1]; - sld->end[0] = t->mval[0] + 40; - sld->end[1] = t->mval[1]; + sld->end[0] = t->mval[0] + end[0]; + sld->end[1] = t->mval[1] + end[1]; t->customData = sld; |