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:
Diffstat (limited to 'source/blender/editors/transform/transform_conversions.c')
-rw-r--r--source/blender/editors/transform/transform_conversions.c430
1 files changed, 243 insertions, 187 deletions
diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c
index bc7514b4c9a..595303c0da4 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -73,6 +73,7 @@
#include "BKE_sequencer.h"
#include "BKE_pointcache.h"
#include "BKE_bmesh.h"
+#include "BKE_tessmesh.h"
#include "BKE_scene.h"
#include "BKE_report.h"
#include "BKE_tracking.h"
@@ -103,13 +104,16 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
+#include "BLI_array.h"
#include "BLI_utildefines.h"
+#include "BLI_smallhash.h"
#include "RNA_access.h"
extern ListBase editelems;
#include "transform.h"
+#include "bmesh.h"
#include "BLO_sys_types.h" // for intptr_t support
@@ -298,16 +302,17 @@ static void createTransTexspace(TransInfo *t)
static void createTransEdge(TransInfo *t)
{
- EditMesh *em = ((Mesh *)t->obedit->data)->edit_mesh;
+ BMEditMesh *em = ((Mesh *)t->obedit->data)->edit_btmesh;
TransData *td = NULL;
- EditEdge *eed;
+ BMEdge *eed;
+ BMIter iter;
float mtx[3][3], smtx[3][3];
int count=0, countsel=0;
int propmode = t->flag & T_PROP_EDIT;
- for(eed= em->edges.first; eed; eed= eed->next) {
- if(eed->h==0) {
- if (eed->f & SELECT) countsel++;
+ BM_ITER(eed, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
+ if (!BM_TestHFlag(eed, BM_HIDDEN)) {
+ if (BM_TestHFlag(eed, BM_SELECT)) countsel++;
if (propmode) count++;
}
}
@@ -327,14 +332,17 @@ static void createTransEdge(TransInfo *t)
copy_m3_m4(mtx, t->obedit->obmat);
invert_m3_m3(smtx, mtx);
- for(eed= em->edges.first; eed; eed= eed->next) {
- if(eed->h==0 && (eed->f & SELECT || propmode)) {
+ BM_ITER(eed, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
+ if(!BM_TestHFlag(eed, BM_HIDDEN) && (BM_TestHFlag(eed, BM_SELECT) || propmode)) {
+ float *bweight = CustomData_bmesh_get(&em->bm->edata, eed->head.data, CD_BWEIGHT);
+ float *crease = CustomData_bmesh_get(&em->bm->edata, eed->head.data, CD_CREASE);
+
/* need to set center for center calculations */
add_v3_v3v3(td->center, eed->v1->co, eed->v2->co);
mul_v3_fl(td->center, 0.5f);
td->loc= NULL;
- if (eed->f & SELECT)
+ if (BM_TestHFlag(eed, BM_SELECT))
td->flag= TD_SELECTED;
else
td->flag= 0;
@@ -345,12 +353,12 @@ static void createTransEdge(TransInfo *t)
td->ext = NULL;
if (t->mode == TFM_BWEIGHT) {
- td->val = &(eed->bweight);
- td->ival = eed->bweight;
+ td->val = bweight;
+ td->ival = bweight ? *bweight : 1.0f;
}
else {
- td->val = &(eed->crease);
- td->ival = eed->crease;
+ td->val = crease;
+ td->ival = crease ? *crease : 0.0f;
}
td++;
@@ -1822,113 +1830,110 @@ void flushTransParticles(TransInfo *t)
/* proportional distance based on connectivity */
#define THRESHOLDFACTOR (1.0f-0.0001f)
-static int connectivity_edge(float mtx[][3], EditVert *v1, EditVert *v2)
+/*I did this wrong, it should be a breadth-first search
+ but instead it's a depth-first search, fudged
+ to report shortest distances. I have no idea how fast
+ or slow this is.*/
+static void editmesh_set_connectivity_distance(BMEditMesh *em, float mtx[][3], float *dists)
{
- float edge_vec[3];
- float edge_len;
- int done = 0;
-
- /* note: hidden verts are not being checked for, this assumes
- * flushing of hidden faces & edges is working right */
-
- if (v1->f2 + v2->f2 == 4)
- return 0;
+ BMVert **queue = NULL;
+ float *dqueue = NULL;
+ int *tots = MEM_callocN(sizeof(int)*em->bm->totvert, "tots editmesh_set_connectivity_distance");
+ BLI_array_declare(queue);
+ BLI_array_declare(dqueue);
+ SmallHash svisit, *visit=&svisit;
+ BMVert *v;
+ BMIter viter;
+ int i, start;
- sub_v3_v3v3(edge_vec, v1->co, v2->co);
- mul_m3_v3(mtx, edge_vec);
-
- edge_len = len_v3(edge_vec);
-
- if (v1->f2) {
- if (v2->f2) {
- if (v2->tmp.fp + edge_len < THRESHOLDFACTOR * v1->tmp.fp) {
- v1->tmp.fp = v2->tmp.fp + edge_len;
- done = 1;
- } else if (v1->tmp.fp + edge_len < THRESHOLDFACTOR * v2->tmp.fp) {
- v2->tmp.fp = v1->tmp.fp + edge_len;
- done = 1;
- }
- }
- else {
- v2->f2 = 1;
- v2->tmp.fp = v1->tmp.fp + edge_len;
- done = 1;
- }
- }
- else if (v2->f2) {
- v1->f2 = 1;
- v1->tmp.fp = v2->tmp.fp + edge_len;
- done = 1;
- }
+ fill_vn_fl(dists, em->bm->totvert, FLT_MAX);
- return done;
-}
+ BM_ElemIndex_Ensure(em->bm, BM_VERT);
-static void editmesh_set_connectivity_distance(EditMesh *em, float mtx[][3])
-{
- EditVert *eve;
- EditEdge *eed;
- EditFace *efa;
- int done= 1;
-
- /* f2 flag is used for 'selection' */
- /* tmp.l is offset on scratch array */
- for(eve= em->verts.first; eve; eve= eve->next) {
- if(eve->h==0) {
- eve->tmp.fp = 0;
-
- if(eve->f & SELECT) {
- eve->f2= 2;
- }
- else {
- eve->f2 = 0;
- }
- }
- }
+ BLI_smallhash_init(visit);
+ BM_ITER(v, &viter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ if (BM_TestHFlag(v, BM_SELECT)==0 || BM_TestHFlag(v, BM_HIDDEN))
+ continue;
+
+
+ BLI_smallhash_insert(visit, (uintptr_t)v, NULL);
+ BLI_array_append(queue, v);
+ BLI_array_append(dqueue, 0.0f);
+ dists[BM_GetIndex(v)] = 0.0f;
+ }
+
+ start = 0;
+ while (start < BLI_array_count(queue)) {
+ BMIter eiter;
+ BMEdge *e;
+ BMVert *v3, *v2;
+ float d, vec[3];
+
+ v2 = queue[start];
+ d = dqueue[start];
+
+ BM_ITER(e, &eiter, em->bm, BM_EDGES_OF_VERT, v2) {
+ float d2;
+ v3 = BM_OtherEdgeVert(e, v2);
+
+ if (BM_TestHFlag(v3, BM_SELECT) || BM_TestHFlag(v3, BM_HIDDEN))
+ continue;
+
+ sub_v3_v3v3(vec, v2->co, v3->co);
+ mul_m3_v3(mtx, vec);
+
+ d2 = d + len_v3(vec);
+
+ if (dists[BM_GetIndex(v3)] != FLT_MAX)
+ dists[BM_GetIndex(v3)] = MIN2(d2, dists[BM_GetIndex(v3)]);
+ else
+ dists[BM_GetIndex(v3)] = d2;
+
+ tots[BM_GetIndex(v3)] = 1;
- /* Floodfill routine */
- /*
- At worst this is n*n of complexity where n is number of edges
- Best case would be n if the list is ordered perfectly.
- Estimate is n log n in average (so not too bad)
- */
- while(done) {
- done= 0;
-
- for(eed= em->edges.first; eed; eed= eed->next) {
- if(eed->h==0) {
- done |= connectivity_edge(mtx, eed->v1, eed->v2);
- }
+ if (BLI_smallhash_haskey(visit, (uintptr_t)v3))
+ continue;
+
+ BLI_smallhash_insert(visit, (uintptr_t)v3, NULL);
+
+ BLI_array_append(queue, v3);
+ BLI_array_append(dqueue, d2);
}
+
+ start++;
+ }
- /* do internal edges for quads */
- for(efa= em->faces.first; efa; efa= efa->next) {
- if (efa->v4 && efa->h==0) {
- done |= connectivity_edge(mtx, efa->v1, efa->v3);
- done |= connectivity_edge(mtx, efa->v2, efa->v4);
- }
- }
+ BLI_smallhash_release(visit);
+
+ for (i=0; i<em->bm->totvert; i++) {
+ if (tots[i])
+ dists[i] /= (float)tots[i];
}
+
+ BLI_array_free(queue);
+ BLI_array_free(dqueue);
+ MEM_freeN(tots);
}
/* loop-in-a-loop I know, but we need it! (ton) */
-static void get_face_center(float *cent, EditMesh *em, EditVert *eve)
+ static void get_face_center(float cent_r[3], BMesh *bm, BMVert *eve)
+
{
- EditFace *efa;
+ BMFace *efa;
+ BMIter iter;
- for(efa= em->faces.first; efa; efa= efa->next)
- if(efa->f & SELECT)
- if(efa->v1==eve || efa->v2==eve || efa->v3==eve || efa->v4==eve)
- break;
- if(efa) {
- copy_v3_v3(cent, efa->cent);
+ BM_ITER(efa, &iter, bm, BM_FACES_OF_VERT, eve) {
+ if (BM_Selected(bm, efa)) {
+ BM_Compute_Face_CenterMean(bm, efa, cent_r);
+ break;
+ }
}
}
/* way to overwrite what data is edited with transform
* static void VertsToTransData(TransData *td, EditVert *eve, BakeKey *key) */
-static void VertsToTransData(TransInfo *t, TransData *td, EditMesh *em, EditVert *eve)
+static void VertsToTransData(TransInfo *t, TransData *td, BMEditMesh *em, BMVert *eve, float *bweight)
{
td->flag = 0;
//if(key)
@@ -1938,7 +1943,7 @@ static void VertsToTransData(TransInfo *t, TransData *td, EditMesh *em, EditVert
copy_v3_v3(td->center, td->loc);
if(t->around==V3D_LOCAL && (em->selectmode & SCE_SELECT_FACE))
- get_face_center(td->center, em, eve);
+ get_face_center(td->center, em->bm, eve);
copy_v3_v3(td->iloc, td->loc);
// Setting normals
@@ -1954,8 +1959,8 @@ static void VertsToTransData(TransInfo *t, TransData *td, EditMesh *em, EditVert
td->val = NULL;
td->extra = NULL;
if (t->mode == TFM_BWEIGHT) {
- td->val = &(eve->bweight);
- td->ival = eve->bweight;
+ td->val = bweight;
+ td->ival = bweight ? *(bweight) : 1.0f;
}
}
@@ -1963,18 +1968,23 @@ static void createTransEditVerts(bContext *C, TransInfo *t)
{
ToolSettings *ts = CTX_data_tool_settings(C);
TransData *tob = NULL;
- EditMesh *em = ((Mesh *)t->obedit->data)->edit_mesh;
- EditVert *eve;
- EditVert *eve_act = NULL;
+ BMEditMesh *em = ((Mesh *)t->obedit->data)->edit_btmesh;
+ BMesh *bm = em->bm;
+ BMVert *eve;
+ BMIter iter;
+ BMVert *eve_act = NULL;
float *mappedcos = NULL, *quats= NULL;
float mtx[3][3], smtx[3][3], (*defmats)[3][3] = NULL, (*defcos)[3] = NULL;
- int count=0, countsel=0, a, totleft;
+ float *dists=NULL;
+ int count=0, countsel=0, a, totleft, *selstate = NULL;
+ BLI_array_declare(selstate);
int propmode = (t->flag & T_PROP_EDIT) ? (t->flag & (T_PROP_EDIT | T_PROP_CONNECTED)) : 0;
int mirror = 0;
short selectmode = ts->selectmode;
if (t->flag & T_MIRROR)
{
+ EDBM_CacheMirrorVerts(em, TRUE);
mirror = 1;
}
@@ -1983,55 +1993,88 @@ static void createTransEditVerts(bContext *C, TransInfo *t)
selectmode = SCE_SELECT_EDGE;
}
+ /* BMESH_TODO, writing into the index values is BAD!, means we cant
+ * use the values for vertex mirror - campbell */
+
// transform now requires awareness for select mode, so we tag the f1 flags in verts
if(selectmode & SCE_SELECT_VERTEX) {
- for(eve= em->verts.first; eve; eve= eve->next) {
- if(eve->h==0 && (eve->f & SELECT))
- eve->f1= SELECT;
- else
- eve->f1= 0;
+ BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ if (BM_Selected(bm, eve)) {
+ BM_SetHFlag(eve, BM_TMP_TAG);
+ }
+ else {
+ BM_ClearHFlag(eve, BM_TMP_TAG);
+ }
}
}
else if(selectmode & SCE_SELECT_EDGE) {
- EditEdge *eed;
- for(eve= em->verts.first; eve; eve= eve->next) eve->f1= 0;
- for(eed= em->edges.first; eed; eed= eed->next) {
- if(eed->h==0 && (eed->f & SELECT))
- eed->v1->f1= eed->v2->f1= SELECT;
+ BMEdge *eed;
+
+ eve = BMIter_New(&iter, bm, BM_VERTS_OF_MESH, NULL);
+ for( ; eve; eve=BMIter_Step(&iter)) BM_ClearHFlag(eve, BM_TMP_TAG);
+
+ eed = BMIter_New(&iter, bm, BM_EDGES_OF_MESH, NULL);
+ for( ; eed; eed=BMIter_Step(&iter)) {
+ if (BM_Selected(bm, eed)) {
+ BM_SetHFlag(eed->v1, BM_TMP_TAG);
+ BM_SetHFlag(eed->v2, BM_TMP_TAG);
+ }
}
}
else {
- EditFace *efa;
- for(eve= em->verts.first; eve; eve= eve->next) eve->f1= 0;
- for(efa= em->faces.first; efa; efa= efa->next) {
- if(efa->h==0 && (efa->f & SELECT)) {
- efa->v1->f1= efa->v2->f1= efa->v3->f1= SELECT;
- if(efa->v4) efa->v4->f1= SELECT;
+ BMFace *efa;
+ eve = BMIter_New(&iter, bm, BM_VERTS_OF_MESH, NULL);
+ for( ; eve; eve=BMIter_Step(&iter)) BM_ClearHFlag(eve, BM_TMP_TAG);
+
+ efa = BMIter_New(&iter, bm, BM_FACES_OF_MESH, NULL);
+ for( ; efa; efa=BMIter_Step(&iter)) {
+ if (BM_Selected(bm, efa)) {
+ BMIter liter;
+ BMLoop *l;
+
+ l = BMIter_New(&liter, bm, BM_LOOPS_OF_FACE, efa);
+ for (; l; l=BMIter_Step(&liter)) {
+ BM_SetHFlag(l->v, BM_TMP_TAG);
+ }
}
}
}
- /* now we can count */
- for(eve= em->verts.first; eve; eve= eve->next) {
- if(eve->h==0) {
- if(eve->f1) countsel++;
- if(propmode) count++;
+ /* now we can count. we store selection state in selstate, since
+ get_crazy_mapped_editverts messes up the index state of the
+ verts*/
+ eve = BMIter_New(&iter, bm, BM_VERTS_OF_MESH, NULL);
+ for(a=0; eve; eve=BMIter_Step(&iter), a++) {
+ BLI_array_growone(selstate);
+
+ if (BM_TestHFlag(eve, BM_TMP_TAG)) {
+ selstate[a] = 1;
+ countsel++;
}
+ if(propmode) count++;
}
- /* note: in prop mode we need at least 1 selected */
- if (countsel==0) return;
+ /* note: in prop mode we need at least 1 selected */
+ if (countsel == 0) {
+ goto cleanup;
+ }
/* check active */
- if (em->selected.last) {
- EditSelection *ese = em->selected.last;
- if ( ese->type == EDITVERT ) {
- eve_act = (EditVert *)ese->data;
+ if (em->bm->selected.last) {
+ BMEditSelection *ese = em->bm->selected.last;
+ if (ese->htype == BM_VERT) {
+ eve_act = (BMVert *)ese->data;
}
}
- if(propmode) t->total = count;
+ if(propmode) {
+ t->total = count;
+
+ /* allocating scratch arrays */
+ if (propmode & T_PROP_CONNECTED)
+ dists = MEM_mallocN(em->bm->totvert * sizeof(float), "scratch nears");
+ }
else t->total = countsel;
tob= t->data= MEM_callocN(t->total*sizeof(TransData), "TransObData(Mesh EditMode)");
@@ -2040,7 +2083,7 @@ static void createTransEditVerts(bContext *C, TransInfo *t)
invert_m3_m3(smtx, mtx);
if(propmode & T_PROP_CONNECTED) {
- editmesh_set_connectivity_distance(em, mtx);
+ editmesh_set_connectivity_distance(em, mtx, dists);
}
/* detect CrazySpace [tm] */
@@ -2048,7 +2091,7 @@ static void createTransEditVerts(bContext *C, TransInfo *t)
if(modifiers_isCorrectableDeformed(t->obedit)) {
/* check if we can use deform matrices for modifier from the
start up to stack, they are more accurate than quats */
- totleft= editmesh_get_first_deform_matrices(t->scene, t->obedit, em, &defmats, &defcos);
+ totleft= editbmesh_get_first_deform_matrices(t->scene, t->obedit, em, &defmats, &defcos);
/* if we still have more modifiers, also do crazyspace
correction with quats, relative to the coordinates after
@@ -2056,7 +2099,7 @@ static void createTransEditVerts(bContext *C, TransInfo *t)
if(totleft > 0) {
mappedcos= crazyspace_get_mapped_editverts(t->scene, t->obedit);
quats= MEM_mallocN( (t->total)*sizeof(float)*4, "crazy quats");
- crazyspace_set_quats_editmesh(em, (float*)defcos, mappedcos, quats);
+ crazyspace_set_quats_editmesh(em, (float*)defcos, mappedcos, quats); /* BMESH_TODO, abuses vertex index, should use an int array */
if(mappedcos)
MEM_freeN(mappedcos);
}
@@ -2068,8 +2111,9 @@ static void createTransEditVerts(bContext *C, TransInfo *t)
/* find out which half we do */
if(mirror) {
- for (eve=em->verts.first; eve; eve=eve->next) {
- if(eve->h==0 && eve->f1 && eve->co[0]!=0.0f) {
+ eve = BMIter_New(&iter, bm, BM_VERTS_OF_MESH, NULL);
+ for(a=0; eve; eve=BMIter_Step(&iter), a++) {
+ if(!BM_TestHFlag(eve, BM_HIDDEN) && selstate[a] && eve->co[0]!=0.0f) {
if(eve->co[0]<0.0f)
{
t->mirror = -1;
@@ -2080,34 +2124,36 @@ static void createTransEditVerts(bContext *C, TransInfo *t)
}
}
- for (a=0, eve=em->verts.first; eve; eve=eve->next, a++) {
- if(eve->h==0) {
- if(propmode || eve->f1) {
- VertsToTransData(t, tob, em, eve);
+ eve = BMIter_New(&iter, bm, BM_VERTS_OF_MESH, NULL);
+ for(a=0; eve; eve=BMIter_Step(&iter), a++) {
+ if(!BM_TestHFlag(eve, BM_HIDDEN)) {
+ if(propmode || selstate[a]) {
+ float *bweight = CustomData_bmesh_get(&bm->vdata, eve->head.data, CD_BWEIGHT);
+
+ VertsToTransData(t, tob, em, eve, bweight);
/* selected */
- if(eve->f1) tob->flag |= TD_SELECTED;
+ if(selstate[a]) tob->flag |= TD_SELECTED;
/* active */
if(eve == eve_act) tob->flag |= TD_ACTIVE;
if(propmode) {
- if (eve->f2) {
- tob->dist= eve->tmp.fp;
- }
- else {
+ if (propmode & T_PROP_CONNECTED) {
+ tob->dist = dists[a];
+ } else {
tob->flag |= TD_NOTCONNECTED;
tob->dist = MAXFLOAT;
}
}
/* CrazySpace */
- if(defmats || (quats && eve->tmp.p)) {
- float mat[3][3], imat[3][3], qmat[3][3];
+ if(defmats || (quats && BM_GetIndex(eve) != -1)) {
+ float mat[3][3], qmat[3][3], imat[3][3];
/* use both or either quat and defmat correction */
- if(quats && eve->tmp.f) {
- quat_to_mat3( qmat,eve->tmp.p);
+ if(quats && BM_GetIndex(eve) != -1) {
+ quat_to_mat3(qmat, quats + 4*BM_GetIndex(eve));
if(defmats)
mul_serie_m3(mat, mtx, qmat, defmats[a],
@@ -2130,8 +2176,8 @@ static void createTransEditVerts(bContext *C, TransInfo *t)
/* Mirror? */
if( (mirror>0 && tob->iloc[0]>0.0f) || (mirror<0 && tob->iloc[0]<0.0f)) {
- EditVert *vmir= editmesh_get_x_mirror_vert(t->obedit, em, eve, tob->iloc, a); /* initializes octree on first call */
- if(vmir != eve) {
+ BMVert *vmir= EDBM_GetMirrorVert(em, eve); //t->obedit, em, eve, tob->iloc, a);
+ if(vmir && vmir != eve) {
tob->extra = vmir;
}
}
@@ -2151,12 +2197,22 @@ static void createTransEditVerts(bContext *C, TransInfo *t)
}
}
}
-
+
+cleanup:
/* crazy space free */
if(quats)
MEM_freeN(quats);
if(defmats)
MEM_freeN(defmats);
+ if (dists)
+ MEM_freeN(dists);
+
+ BLI_array_free(selstate);
+
+ if (t->flag & T_MIRROR) {
+ EDBM_EndMirrorCache(em);
+ mirror = 1;
+ }
}
/* *** NODE EDITOR *** */
@@ -2328,30 +2384,33 @@ static void createTransUVs(bContext *C, TransInfo *t)
Scene *scene = t->scene;
TransData *td = NULL;
TransData2D *td2d = NULL;
- MTFace *tf;
+ MTexPoly *tf;
+ MLoopUV *luv;
+ BMEditMesh *em = ((Mesh *)t->obedit->data)->edit_btmesh;
+ BMFace *efa;
+ BMLoop *l;
+ BMIter iter, liter;
int count=0, countsel=0;
int propmode = t->flag & T_PROP_EDIT;
- EditMesh *em = ((Mesh *)t->obedit->data)->edit_mesh;
- EditFace *efa;
-
if(!ED_space_image_show_uvedit(sima, t->obedit)) return;
/* count */
- for (efa= em->faces.first; efa; efa= efa->next) {
- tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ tf= CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
- if(uvedit_face_visible(scene, ima, efa, tf)) {
- efa->tmp.p = tf;
+ if(!uvedit_face_visible(scene, ima, efa, tf)) {
+ BM_ClearHFlag(efa, BM_TMP_TAG);
+ continue;
+ }
+
+ BM_SetHFlag(efa, BM_TMP_TAG);
+ BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ if (uvedit_uv_selected(em, scene, l))
+ countsel++;
- if (uvedit_uv_selected(scene, efa, tf, 0)) countsel++;
- if (uvedit_uv_selected(scene, efa, tf, 1)) countsel++;
- if (uvedit_uv_selected(scene, efa, tf, 2)) countsel++;
- if (efa->v4 && uvedit_uv_selected(scene, efa, tf, 3)) countsel++;
if(propmode)
- count += (efa->v4)? 4: 3;
- } else {
- efa->tmp.p = NULL;
+ count++;
}
}
@@ -2370,20 +2429,17 @@ static void createTransUVs(bContext *C, TransInfo *t)
td= t->data;
td2d= t->data2d;
- for (efa= em->faces.first; efa; efa= efa->next) {
- if ((tf=(MTFace *)efa->tmp.p)) {
- if (propmode) {
- UVsToTransData(sima, td++, td2d++, tf->uv[0], uvedit_uv_selected(scene, efa, tf, 0));
- UVsToTransData(sima, td++, td2d++, tf->uv[1], uvedit_uv_selected(scene, efa, tf, 1));
- UVsToTransData(sima, td++, td2d++, tf->uv[2], uvedit_uv_selected(scene, efa, tf, 2));
- if(efa->v4)
- UVsToTransData(sima, td++, td2d++, tf->uv[3], uvedit_uv_selected(scene, efa, tf, 3));
- } else {
- if(uvedit_uv_selected(scene, efa, tf, 0)) UVsToTransData(sima, td++, td2d++, tf->uv[0], 1);
- if(uvedit_uv_selected(scene, efa, tf, 1)) UVsToTransData(sima, td++, td2d++, tf->uv[1], 1);
- if(uvedit_uv_selected(scene, efa, tf, 2)) UVsToTransData(sima, td++, td2d++, tf->uv[2], 1);
- if(efa->v4 && uvedit_uv_selected(scene, efa, tf, 3)) UVsToTransData(sima, td++, td2d++, tf->uv[3], 1);
- }
+ BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ if (!BM_TestHFlag(efa, BM_TMP_TAG))
+ continue;
+
+ tf= CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
+ BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ if (!propmode && !uvedit_uv_selected(em, scene, l))
+ continue;
+
+ luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
+ UVsToTransData(sima, td++, td2d++, luv->uv, uvedit_uv_selected(em, scene, l));
}
}
@@ -4758,7 +4814,7 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
if (t->spacetype==SPACE_VIEW3D) {
if (t->obedit) {
if (cancelled==0) {
- EM_automerge(t->scene, t->obedit, 1);
+ EDBM_automerge(t->scene, t->obedit, 1);
}
}
}
@@ -5008,7 +5064,7 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
else if (t->obedit) {
if (t->obedit->type == OB_MESH)
{
- EditMesh *em = ((Mesh *)t->obedit->data)->edit_mesh;
+ BMEditMesh *em = ((Mesh *)t->obedit->data)->edit_btmesh;
/* table needs to be created for each edit command, since vertices can move etc */
mesh_octree_table(t->obedit, em, NULL, 'e');
}