diff options
author | Campbell Barton <ideasman42@gmail.com> | 2007-09-10 16:26:36 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2007-09-10 16:26:36 +0400 |
commit | e8a808da24e0c791a557aae7e3930550982f45c7 (patch) | |
tree | 804b01e82ee92e2081aa5aa5b56105342e021fdb /source/blender/src/editmesh_lib.c | |
parent | 0e3460dd1b6b9521f1833998b63d7753639c5339 (diff) |
UV Editing is now done in editmode rather then UV/Face Select mode.
Notes
* you cant edit UV's in the image window in "UV Face Select" mode. (removed UV from the name)
* going into Face Select mode no longer adds UV's and does not need UV's to work.
* The UV Calculation menu is now in editmode (Alt+W)
Todo..
* Image replace - partly broken in stable also.
* Rotate/Mirror UV/VCol are still only in Face Select mode.
* Hide/Reveal is not quite right, (issue with editmode flushing)
Diffstat (limited to 'source/blender/src/editmesh_lib.c')
-rw-r--r-- | source/blender/src/editmesh_lib.c | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/source/blender/src/editmesh_lib.c b/source/blender/src/editmesh_lib.c index 78cf2d17c04..d6781c8e430 100644 --- a/source/blender/src/editmesh_lib.c +++ b/source/blender/src/editmesh_lib.c @@ -2070,3 +2070,134 @@ void EM_fgon_flags(void) } } + +/* editmesh vertmap, copied from intern.mesh.c + * if do_face_idx_array is 0 it means we need to run it as well as freeing + * */ + +UvVertMap *make_uv_vert_map_EM(int selected, int do_face_idx_array, float *limit) +{ + EditMesh *em = G.editMesh; + EditVert *ev; + EditFace *efa; + int totverts; + + /* vars from original func */ + UvVertMap *vmap; + UvMapVert *buf; + MTFace *tf; + unsigned int a; + int i, totuv, nverts; + + if (do_face_idx_array) + EM_init_index_arrays(0, 0, 1); + + /* we need the vert */ + for (ev= em->verts.first, totverts=0; ev; ev= ev->next, totverts++) { + ev->tmp.l = totverts; + } + + totuv = 0; + + /* generate UvMapVert array */ + for (efa= em->faces.first; efa; efa= efa->next) + if(!selected || ((!efa->h) && (efa->f & SELECT))) + totuv += (efa->v4)? 4: 3; + + if(totuv==0) + return NULL; + + vmap= (UvVertMap*)MEM_mallocN(sizeof(*vmap), "UvVertMap"); + if (!vmap) + return NULL; + + vmap->vert= (UvMapVert**)MEM_callocN(sizeof(*vmap->vert)*totverts, "UvMapVert*"); + buf= vmap->buf= (UvMapVert*)MEM_mallocN(sizeof(*vmap->buf)*totuv, "UvMapVert"); + + if (!vmap->vert || !vmap->buf) { + free_uv_vert_map(vmap); + return NULL; + } + + for (a=0, efa= em->faces.first; efa; a++, efa= efa->next) { + if(!selected || ((!efa->h) && (efa->f & SELECT))) { + nverts= (efa->v4)? 4: 3; + + for(i=0; i<nverts; i++) { + buf->tfindex= i; + buf->f= a; + buf->separate = 0; + + buf->next= vmap->vert[(*(&efa->v1 + i))->tmp.l]; + vmap->vert[(*(&efa->v1 + i))->tmp.l]= buf; + + buf++; + } + } + } + + /* sort individual uvs for each vert */ + for(a=0, ev=em->verts.first; ev; a++, ev= ev->next) { + UvMapVert *newvlist= NULL, *vlist=vmap->vert[a]; + UvMapVert *iterv, *v, *lastv, *next; + float *uv, *uv2, uvdiff[2]; + + while(vlist) { + v= vlist; + vlist= vlist->next; + v->next= newvlist; + newvlist= v; + + efa = EM_get_face_for_index(v->f); + tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); + uv = tf->uv[v->tfindex]; + + lastv= NULL; + iterv= vlist; + + while(iterv) { + next= iterv->next; + efa = EM_get_face_for_index(iterv->f); + tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); + uv2 = tf->uv[iterv->tfindex]; + + Vec2Subf(uvdiff, uv2, uv); + + if(fabs(uv[0]-uv2[0]) < limit[0] && fabs(uv[1]-uv2[1]) < limit[1]) { + if(lastv) lastv->next= next; + else vlist= next; + iterv->next= newvlist; + newvlist= iterv; + } + else + lastv=iterv; + + iterv= next; + } + + newvlist->separate = 1; + } + + vmap->vert[a]= newvlist; + } + + if (do_face_idx_array) + EM_free_index_arrays(); + + return vmap; +} + +UvMapVert *get_uv_map_vert_EM(UvVertMap *vmap, unsigned int v) +{ + return vmap->vert[v]; +} + +void free_uv_vert_map_EM(UvVertMap *vmap) +{ + if (vmap) { + if (vmap->vert) MEM_freeN(vmap->vert); + if (vmap->buf) MEM_freeN(vmap->buf); + MEM_freeN(vmap); + } +} + |