[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21808] branches/bmesh/blender/source/ blender: bmeshafied uv unwrapping ops.
Joseph Eagar
joeedh at gmail.com
Thu Jul 23 00:36:00 CEST 2009
Revision: 21808
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21808
Author: joeedh
Date: 2009-07-23 00:35:58 +0200 (Thu, 23 Jul 2009)
Log Message:
-----------
bmeshafied uv unwrapping ops. for lcsm (unwrap), which only takes triangles, I used scanfill to tesselate ngons, which mostly works. scanfill however doesn't always generate nice enough tesselations for lcsm to work properly; the solution is to write a version of beauty fill (which basically turns an arbritrary triangulation into a constrained delauney triangulation) for scanfill, and use it to clean up the tesselations.
Modified Paths:
--------------
branches/bmesh/blender/source/blender/blenlib/intern/scanfill.c
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_to_editmesh.c
branches/bmesh/blender/source/blender/editors/uvedit/uvedit_unwrap_ops.c
Modified: branches/bmesh/blender/source/blender/blenlib/intern/scanfill.c
===================================================================
--- branches/bmesh/blender/source/blender/blenlib/intern/scanfill.c 2009-07-22 22:12:55 UTC (rev 21807)
+++ branches/bmesh/blender/source/blender/blenlib/intern/scanfill.c 2009-07-22 22:35:58 UTC (rev 21808)
@@ -44,6 +44,8 @@
#include "BLI_scanfill.h"
#include "BLI_callbacks.h"
+#include "BKE_utildefines.h"
+
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
@@ -778,13 +780,39 @@
/* reset variables */
eve= fillvertbase.first;
+ a = 0;
while(eve) {
eve->f= 0;
eve->xs= 0;
eve->h= 0;
eve= eve->next;
+ a += 1;
}
+ if (a == 3) {
+ eve = fillvertbase.first;
+
+ addfillface(eve, eve->next, eve->next->next, 0);
+ return 1;
+ } else if (a == 4) {
+ float vec1[3], vec2[3];
+
+ eve = fillvertbase.first;
+
+ /*use shortest diagonal for quad*/
+ VecSubf(vec1, eve->co, eve->next->next->co);
+ VecSubf(vec2, eve->next->co, eve->next->next->next->co);
+
+ if (INPR(vec1, vec1) < INPR(vec2, vec2)) {
+ addfillface(eve, eve->next, eve->next->next, 0);
+ addfillface(eve->next->next, eve->next->next->next, eve, 0);
+ } else {
+ addfillface(eve->next, eve->next->next, eve->next->next->next, 0);
+ addfillface(eve->next->next->next, eve, eve->next, 0);
+ }
+ return 1;
+ }
+
/* first test vertices if they are in edges */
/* including resetting of flags */
eed= filledgebase.first;
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_to_editmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_to_editmesh.c 2009-07-22 22:12:55 UTC (rev 21807)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_to_editmesh.c 2009-07-22 22:35:58 UTC (rev 21808)
@@ -197,15 +197,17 @@
EditMesh *em;
EditVert *eve, **evlist;
- int totvert, i, numTex, numCol;
+ int totvert, i, numTex, numCol, flag;
em = MEM_callocN(sizeof(EditMesh), "EditMesh from bmesh");
em->selectmode = bm->selectmode;
- CustomData_copy(&bm->vdata, &em->vdata, CD_MASK_BMESH, CD_CALLOC, 0);
- CustomData_copy(&bm->edata, &em->edata, CD_MASK_BMESH, CD_CALLOC, 0);
- CustomData_copy(&bm->pdata, &em->fdata, CD_MASK_BMESH, CD_CALLOC, 0);
+ flag = CD_MASK_BMESH & ~CD_MASK_MTEXPOLY;
+
+ CustomData_copy(&bm->vdata, &em->vdata, flag, CD_CALLOC, 0);
+ CustomData_copy(&bm->edata, &em->edata, flag, CD_CALLOC, 0);
+ CustomData_copy(&bm->pdata, &em->fdata, flag, CD_CALLOC, 0);
CustomData_from_bmeshpoly(&em->fdata, &bm->pdata, &bm->ldata,0);
numTex = CustomData_number_of_layers(&bm->pdata, CD_MTEXPOLY);
numCol = CustomData_number_of_layers(&bm->ldata, CD_MLOOPCOL);
Modified: branches/bmesh/blender/source/blender/editors/uvedit/uvedit_unwrap_ops.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/uvedit/uvedit_unwrap_ops.c 2009-07-22 22:12:55 UTC (rev 21807)
+++ branches/bmesh/blender/source/blender/editors/uvedit/uvedit_unwrap_ops.c 2009-07-22 22:35:58 UTC (rev 21808)
@@ -46,10 +46,12 @@
#include "BKE_global.h"
#include "BKE_mesh.h"
#include "BKE_utildefines.h"
+#include "BKE_tessmesh.h"
#include "BLI_arithb.h"
#include "BLI_edgehash.h"
#include "BLI_editVert.h"
+#include "BLI_scanfill.h"
#include "PIL_time.h"
@@ -72,20 +74,20 @@
static int ED_uvedit_ensure_uvs(bContext *C, Scene *scene, Object *obedit)
{
- EditMesh *em= BKE_mesh_get_editmesh((Mesh*)obedit->data);
- EditFace *efa;
- MTFace *tf;
+ BMEditMesh *em= ((Mesh*)obedit->data)->edit_btmesh;
+ BMFace *efa;
+ BMIter iter;
if(ED_uvedit_test(obedit)) {
- BKE_mesh_end_editmesh(obedit->data, em);
return 1;
}
- if(em && em->faces.first)
- EM_add_data_layer(em, &em->fdata, CD_MTFACE);
-
+ if(em && em->bm->totface) {// && !CustomData_has_layer(&em->bm->pdata, CD_MTEXPOLY)) {
+ BM_add_data_layer(em->bm, &em->bm->pdata, CD_MTEXPOLY);
+ BM_add_data_layer(em->bm, &em->bm->ldata, CD_MLOOPUV);
+ }
+
if(!ED_uvedit_test(obedit)) {
- BKE_mesh_end_editmesh(obedit->data, em);
return 0;
}
@@ -94,34 +96,33 @@
ED_uvedit_assign_image(scene, obedit, CTX_data_edit_image(C), NULL);
/* select new UV's */
- for(efa=em->faces.first; efa; efa=efa->next) {
- tf= (MTFace *)CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- uvedit_face_select(scene, efa, tf);
+ BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ uvedit_face_select(scene, em, efa);
}
- BKE_mesh_end_editmesh(obedit->data, em);
return 1;
}
/****************** Parametrizer Conversion ***************/
-ParamHandle *construct_param_handle(Scene *scene, EditMesh *em, short implicit, short fill, short sel, short correct_aspect)
+ParamHandle *construct_param_handle(Scene *scene, BMEditMesh *em, short implicit, short fill, short sel, short correct_aspect)
{
-#if 0
ParamHandle *handle;
- EditFace *efa;
- EditEdge *eed;
- EditVert *ev;
- MTFace *tf;
+ BMFace *efa;
+ BMLoop *l;
+ BMEdge *eed;
+ BMVert *ev;
+ BMIter iter, liter;
+ MTexPoly *tf;
int a;
handle = param_construct_begin();
if(correct_aspect) {
- efa = EM_get_actFace(em, 1);
+ efa = EDBM_get_actFace(em, 1);
if(efa) {
- MTFace *tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ MTexPoly *tf= CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
float aspx, aspy;
ED_image_uv_aspect(tf->tpage, &aspx, &aspy);
@@ -132,71 +133,101 @@
}
/* we need the vert indicies */
- for(ev= em->verts.first, a=0; ev; ev= ev->next, a++)
- ev->tmp.l = a;
+ a = 0;
+ BM_ITER(ev, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BMINDEX_SET(ev, a);
+ a++;
+ }
- for(efa= em->faces.first; efa; efa= efa->next) {
+ BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ EditVert *v, *lastv, *firstv;
+ EditFace *sefa;
ParamKey key, vkeys[4];
ParamBool pin[4], select[4];
+ BMLoop *ls[3];
+ MLoopUV *luvs[3];
float *co[4];
float *uv[4];
- int nverts;
+ int lsel;
- if((efa->h) || (sel && (efa->f & SELECT)==0))
+ if((BM_TestHFlag(efa, BM_HIDDEN)) || (sel && BM_TestHFlag(efa, BM_SELECT)==0))
continue;
- tf= (MTFace *)CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
-
- if(implicit &&
- !( uvedit_uv_selected(scene, efa, tf, 0) ||
- uvedit_uv_selected(scene, efa, tf, 1) ||
- uvedit_uv_selected(scene, efa, tf, 2) ||
- (efa->v4 && uvedit_uv_selected(scene, efa, tf, 3)) )
- ) {
- continue;
+ tf= (MTexPoly *)CustomData_em_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
+ lsel = 0;
+
+ BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ if (uvedit_uv_selected(em, scene, l)) {
+ lsel = 1;
+ break;
+ }
}
+ if (implicit && !lsel)
+ continue;
+
key = (ParamKey)efa;
- vkeys[0] = (ParamKey)efa->v1->tmp.l;
- vkeys[1] = (ParamKey)efa->v2->tmp.l;
- vkeys[2] = (ParamKey)efa->v3->tmp.l;
- co[0] = efa->v1->co;
- co[1] = efa->v2->co;
- co[2] = efa->v3->co;
+ /*scanfill time!*/
+ firstv = lastv = NULL;
+ BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ v = BLI_addfillvert(l->v->co);
+
+ v->tmp.p = l;
- uv[0] = tf->uv[0];
- uv[1] = tf->uv[1];
- uv[2] = tf->uv[2];
+ if (lastv) {
+ BLI_addfilledge(lastv, v);
+ }
- pin[0] = ((tf->unwrap & TF_PIN1) != 0);
- pin[1] = ((tf->unwrap & TF_PIN2) != 0);
- pin[2] = ((tf->unwrap & TF_PIN3) != 0);
+ lastv = v;
+ if (!firstv)
+ firstv = v;
+ }
- select[0] = ((uvedit_uv_selected(scene, efa, tf, 0)) != 0);
- select[1] = ((uvedit_uv_selected(scene, efa, tf, 1)) != 0);
- select[2] = ((uvedit_uv_selected(scene, efa, tf, 2)) != 0);
+ BLI_addfilledge(firstv, v);
+
+ BLI_edgefill(0, 0);
+ for (sefa = fillfacebase.first; sefa; sefa=sefa->next) {
+ ls[0] = sefa->v1->tmp.p;
+ ls[1] = sefa->v2->tmp.p;
+ ls[2] = sefa->v3->tmp.p;
+
+ luvs[0] = CustomData_bmesh_get(&em->bm->ldata, ls[0]->head.data, CD_MLOOPUV);
+ luvs[1] = CustomData_bmesh_get(&em->bm->ldata, ls[1]->head.data, CD_MLOOPUV);
+ luvs[2] = CustomData_bmesh_get(&em->bm->ldata, ls[2]->head.data, CD_MLOOPUV);
- if(efa->v4) {
- vkeys[3] = (ParamKey)efa->v4->tmp.l;
- co[3] = efa->v4->co;
- uv[3] = tf->uv[3];
- pin[3] = ((tf->unwrap & TF_PIN4) != 0);
- select[3] = (uvedit_uv_selected(scene, efa, tf, 3) != 0);
- nverts = 4;
+ vkeys[0] = (ParamKey)BMINDEX_GET(ls[0]->v);
+ vkeys[1] = (ParamKey)BMINDEX_GET(ls[1]->v);
+ vkeys[2] = (ParamKey)BMINDEX_GET(ls[2]->v);
+
+ co[0] = ls[0]->v->co;
+ co[1] = ls[1]->v->co;
+ co[2] = ls[2]->v->co;
+
+ uv[0] = luvs[0]->uv;
+ uv[1] = luvs[1]->uv;
+ uv[2] = luvs[2]->uv;
+
+ pin[0] = (luvs[0]->flag & MLOOPUV_PINNED) != 0;
+ pin[1] = (luvs[1]->flag & MLOOPUV_PINNED) != 0;
+ pin[2] = (luvs[2]->flag & MLOOPUV_PINNED) != 0;
+
+ select[0] = uvedit_uv_selected(em, scene, ls[0]) != 0;
+ select[1] = uvedit_uv_selected(em, scene, ls[1]) != 0;
+ select[2] = uvedit_uv_selected(em, scene, ls[2]) != 0;
+
+ param_face_add(handle, key, 3, vkeys, co, uv, pin, select);
}
- else
- nverts = 3;
- param_face_add(handle, key, nverts, vkeys, co, uv, pin, select);
+ BLI_end_edgefill();
}
if(!implicit) {
- for(eed= em->edges.first; eed; eed= eed->next) {
- if(eed->seam) {
+ BM_ITER(eed, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
+ if(BM_TestHFlag(eed, BM_SEAM)) {
ParamKey vkeys[2];
- vkeys[0] = (ParamKey)eed->v1->tmp.l;
- vkeys[1] = (ParamKey)eed->v2->tmp.l;
+ vkeys[0] = (ParamKey)BMINDEX_GET(eed->v1);
+ vkeys[1] = (ParamKey)BMINDEX_GET(eed->v2);
param_edge_set_seam(handle, vkeys);
}
}
@@ -205,7 +236,6 @@
param_construct_end(handle, fill, implicit);
return handle;
-#endif
}
/* ******************** Minimize Stretch operator **************** */
@@ -213,7 +243,7 @@
typedef struct MinStretch {
Scene *scene;
Object *obedit;
- EditMesh *em;
+ BMEditMesh *em;
ParamHandle *handle;
float blend;
double lasttime;
@@ -225,7 +255,7 @@
{
Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
- EditMesh *em= BKE_mesh_get_editmesh((Mesh*)obedit->data);
+ BMEditMesh *em= ((Mesh*)obedit->data)->edit_btmesh;
MinStretch *ms;
int fill_holes= RNA_boolean_get(op->ptr, "fill_holes");
@@ -407,7 +437,7 @@
{
Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
- EditMesh *em= BKE_mesh_get_editmesh((Mesh*)obedit->data);
+ BMEditMesh *em= ((Mesh*)obedit->data)->edit_btmesh;
ParamHandle *handle;
handle = construct_param_handle(scene, em, 1, 0, 1, 1);
@@ -418,7 +448,6 @@
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list