[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21759] branches/bmesh/blender/source/ blender: finished first pass at bmeshafying uvedit_ops.c.
Joseph Eagar
joeedh at gmail.com
Tue Jul 21 13:48:58 CEST 2009
Revision: 21759
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21759
Author: joeedh
Date: 2009-07-21 13:48:58 +0200 (Tue, 21 Jul 2009)
Log Message:
-----------
finished first pass at bmeshafying uvedit_ops.c. not everything works yet, loop select for example crashes.
Modified Paths:
--------------
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mesh.c
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c
branches/bmesh/blender/source/blender/editors/include/ED_mesh.h
branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c
branches/bmesh/blender/source/blender/editors/uvedit/uvedit_ops.c
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c 2009-07-21 11:34:55 UTC (rev 21758)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c 2009-07-21 11:48:58 UTC (rev 21759)
@@ -298,6 +298,7 @@
return tot;
}
+/*note: by design, this will not touch the editselection history stuff*/
void BM_Select(struct BMesh *bm, void *element, int select)
{
BMHeader *head = element;
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mesh.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mesh.c 2009-07-21 11:34:55 UTC (rev 21758)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mesh.c 2009-07-21 11:48:58 UTC (rev 21759)
@@ -214,11 +214,13 @@
}
/*Zero out vertex normals*/
- for(v = BMIter_New(&verts, bm, BM_VERTS_OF_MESH, bm ); v; v = BMIter_Step(&verts)) v->no[0] = v->no[1] = v->no[2] = 0.0;
+ for(v = BMIter_New(&verts, bm, BM_VERTS_OF_MESH, bm ); v; v = BMIter_Step(&verts))
+ v->no[0] = v->no[1] = v->no[2] = 0.0;
/*add face normals to vertices*/
for(f = BMIter_New(&faces, bm, BM_FACES_OF_MESH, bm ); f; f = BMIter_Step(&faces)){
- for(l = BMIter_New(&loops, bm, BM_LOOPS_OF_FACE, f ); l; l = BMIter_Step(&loops)) VecAddf(l->v->no, l->v->no, f->no);
+ for(l = BMIter_New(&loops, bm, BM_LOOPS_OF_FACE, f ); l; l = BMIter_Step(&loops))
+ VecAddf(l->v->no, l->v->no, f->no);
}
/*average the vertex normals*/
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c 2009-07-21 11:34:55 UTC (rev 21758)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c 2009-07-21 11:48:58 UTC (rev 21759)
@@ -445,7 +445,7 @@
i += 1;
}while(l!=f->loopbase);
- compute_poly_plane(projectverts, f->len);
+ //compute_poly_plane(projectverts, f->len);
compute_poly_normal(f->no, projectverts, f->len);
}
else if(f->len == 3){
Modified: branches/bmesh/blender/source/blender/editors/include/ED_mesh.h
===================================================================
--- branches/bmesh/blender/source/blender/editors/include/ED_mesh.h 2009-07-21 11:34:55 UTC (rev 21758)
+++ branches/bmesh/blender/source/blender/editors/include/ED_mesh.h 2009-07-21 11:48:58 UTC (rev 21759)
@@ -103,6 +103,9 @@
void EDBM_selectmode_set(struct BMEditMesh *em);
void EDBM_convertsel(struct BMEditMesh *em, short oldmode, short selectmode);
+void EDBM_hide_mesh(struct BMEditMesh *em, int swap);
+void EDBM_reveal_mesh(struct BMEditMesh *em);
+
int EDBM_check_backbuf(unsigned int index);
int EDBM_mask_init_backbuf_border(struct ViewContext *vc, short mcords[][2], short tot, short xmin, short ymin, short xmax, short ymax);
void EDBM_free_backbuf(void);
Modified: branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c 2009-07-21 11:34:55 UTC (rev 21758)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c 2009-07-21 11:48:58 UTC (rev 21759)
@@ -697,4 +697,15 @@
{
/* some of these checks could be a touch overkill */
return em && em->bm->totface && CustomData_has_layer(&em->bm->pdata, CD_MTEXPOLY);
+}
+
+void EDBM_hide_mesh(BMEditMesh *em, int swap)
+{
+ //BMESH_TODO
+}
+
+
+void EDBM_reveal_mesh(BMEditMesh *em)
+{
+ //BMESH_TODO
}
\ No newline at end of file
Modified: branches/bmesh/blender/source/blender/editors/uvedit/uvedit_ops.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/uvedit/uvedit_ops.c 2009-07-21 11:34:55 UTC (rev 21758)
+++ branches/bmesh/blender/source/blender/editors/uvedit/uvedit_ops.c 2009-07-21 11:48:58 UTC (rev 21759)
@@ -622,7 +622,11 @@
mindist= 1e10f;
memset(hit, 0, sizeof(*hit));
-
+
+ /*this will fill in hit.vert1 and hit.vert2*/
+ find_nearest_uv_edge(scene, ima, em, co, hit);
+ hit->l = hit->nextl = hit->luv = hit->nextluv = NULL;
+
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))
@@ -706,6 +710,10 @@
float mindist, dist;
int i, nverts;
+ /*this will fill in hit.vert1 and hit.vert2*/
+ find_nearest_uv_edge(scene, ima, em, co, hit);
+ hit->l = hit->nextl = hit->luv = hit->nextluv = NULL;
+
mindist= 1e10f;
memset(hit, 0, sizeof(*hit));
@@ -911,8 +919,8 @@
/* set flags for first face and verts */
nverts= hit->efa->len;
- iterv1= uv_vertex_map_get(vmap, hit->efa, hit->vert1);
- iterv2= uv_vertex_map_get(vmap, hit->efa, (hit->vert1+1)%nverts);
+ iterv1= uv_vertex_map_get(vmap, hit->efa, hit->lindex);
+ iterv2= uv_vertex_map_get(vmap, hit->efa, (hit->lindex+1)%nverts);
uv_vertex_loop_flag(iterv1);
uv_vertex_loop_flag(iterv2);
@@ -938,6 +946,9 @@
/* check face not hidden and not tagged */
iterv1= uv_vertex_map_get(vmap, efa, a);
iterv2= uv_vertex_map_get(vmap, efa, (a+1)%nverts);
+
+ if (!iterv1 || !iterv2)
+ continue;
/* check if vertex is tagged and has right valence */
if(iterv1->flag || iterv2->flag) {
@@ -956,9 +967,9 @@
}
/* do the actual select/deselect */
- nverts= efa->len;
- iterv1= uv_vertex_map_get(vmap, hit->efa, hit->vert1);
- iterv2= uv_vertex_map_get(vmap, hit->efa, (hit->vert1+1)%nverts);
+ nverts= hit->efa->len;
+ iterv1= uv_vertex_map_get(vmap, hit->efa, hit->lindex);
+ iterv2= uv_vertex_map_get(vmap, hit->efa, (hit->lindex+1)%nverts);
iterv1->flag= 1;
iterv2->flag= 1;
@@ -2589,75 +2600,62 @@
static int snap_uvs_to_adjacent_unselected(Scene *scene, Image *ima, Object *obedit)
{
-#if 0
- EditMesh *em= BKE_mesh_get_editmesh((Mesh*)obedit->data);
- EditFace *efa;
- EditVert *eve;
- MTFace *tface;
+ BMEditMesh *em= ((Mesh*)obedit->data)->edit_btmesh;
+ BMFace *efa;
+ BMLoop *l;
+ BMIter iter, liter;
+ BMVert *eve;
+ MTexPoly *tface;
+ MLoopUV *luv;
short change = 0;
int count = 0;
float *coords;
short *usercount, users;
/* set all verts to -1 : an unused index*/
- for(eve= em->verts.first; eve; eve= eve->next)
- eve->tmp.l=-1;
+ BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL)
+ BMINDEX_SET(eve, -1);
/* index every vert that has a selected UV using it, but only once so as to
* get unique indicies and to count how much to malloc */
- for(efa= em->faces.first; efa; efa= efa->next) {
- tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ tface= CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
+ if(!uvedit_face_visible(scene, ima, efa, tface)) {
+ BMINDEX_SET(efa, 0);
+ continue;
+ } else {
+ BMINDEX_SET(efa, 1);
+ }
- if(uvedit_face_visible(scene, ima, efa, tface)) {
- if(uvedit_uv_selected(em, scene, efa, tface, 0) && efa->v1->tmp.l==-1) efa->v1->tmp.l= count++;
- if(uvedit_uv_selected(em, scene, efa, tface, 1) && efa->v2->tmp.l==-1) efa->v2->tmp.l= count++;
- if(uvedit_uv_selected(em, scene, efa, tface, 2) && efa->v3->tmp.l==-1) efa->v3->tmp.l= count++;
- if(efa->v4)
- if(uvedit_uv_selected(em, scene, efa, tface, 3) && efa->v4->tmp.l==-1) efa->v4->tmp.l= count++;
-
- change = 1;
-
- /* optional speedup */
- efa->tmp.p = tface;
+ change = 1;
+ BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ if (uvedit_uv_selected(em, scene, l) && BMINDEX_GET(l->v) == -1) {
+ BMINDEX_SET(l->v, count);
+ count++;
+ }
}
- else
- efa->tmp.p = NULL;
}
coords = MEM_callocN(sizeof(float)*count*2, "snap to adjacent coords");
usercount = MEM_callocN(sizeof(short)*count, "snap to adjacent counts");
/* add all UV coords from visible, unselected UV coords as well as counting them to average later */
- for(efa= em->faces.first; efa; efa= efa->next) {
- if((tface=(MTFace *)efa->tmp.p)) {
- /* is this an unselected UV we can snap to? */
- if(efa->v1->tmp.l >= 0 && (!uvedit_uv_selected(em, scene, efa, tface, 0))) {
- coords[efa->v1->tmp.l*2] += tface->uv[0][0];
- coords[(efa->v1->tmp.l*2)+1] += tface->uv[0][1];
- usercount[efa->v1->tmp.l]++;
- change = 1;
+ BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ if (!BMINDEX_GET(efa))
+ continue;
+
+ tface= CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
+ if(!uvedit_face_visible(scene, ima, efa, tface))
+ continue;
+
+ BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ if (BMINDEX_GET(l->v) >= 0 &&
+ (!uvedit_uv_selected(em, scene, l))) {
+ luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
+ coords[BMINDEX_GET(l->v)*2] += luv->uv[0];
+ coords[BMINDEX_GET(l->v)*2+1] += luv->uv[1];
+ change = 1;
}
- if(efa->v2->tmp.l >= 0 && (!uvedit_uv_selected(em, scene, efa, tface, 1))) {
- coords[efa->v2->tmp.l*2] += tface->uv[1][0];
- coords[(efa->v2->tmp.l*2)+1] += tface->uv[1][1];
- usercount[efa->v2->tmp.l]++;
- change = 1;
- }
- if(efa->v3->tmp.l >= 0 && (!uvedit_uv_selected(em, scene, efa, tface, 2))) {
- coords[efa->v3->tmp.l*2] += tface->uv[2][0];
- coords[(efa->v3->tmp.l*2)+1] += tface->uv[2][1];
- usercount[efa->v3->tmp.l]++;
- change = 1;
- }
-
- if(efa->v4) {
- if(efa->v4->tmp.l >= 0 && (!uvedit_uv_selected(em, scene, efa, tface, 3))) {
- coords[efa->v4->tmp.l*2] += tface->uv[3][0];
- coords[(efa->v4->tmp.l*2)+1] += tface->uv[3][1];
- usercount[efa->v4->tmp.l]++;
- change = 1;
- }
- }
}
}
@@ -2665,65 +2663,43 @@
if(!change) {
MEM_freeN(coords);
MEM_freeN(usercount);
- BKE_mesh_end_editmesh(obedit->data, em);
return change;
}
/* copy the averaged unselected UVs back to the selected UVs */
- for(efa= em->faces.first; efa; efa= efa->next) {
- if((tface=(MTFace *)efa->tmp.p)) {
-
- if( uvedit_uv_selected(em, scene, efa, tface, 0) &&
- efa->v1->tmp.l >= 0 &&
- (users = usercount[efa->v1->tmp.l])
- ) {
- tface->uv[0][0] = coords[efa->v1->tmp.l*2] / users;
- tface->uv[0][1] = coords[(efa->v1->tmp.l*2)+1] / users;
- }
+ BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list