forked from bartvdbraak/blender
reduce customdata lookups for UV drawing and tools.
This commit is contained in:
parent
dc4636827b
commit
889a940cef
@ -134,14 +134,15 @@ static void draw_uvs_shadow(Object *obedit)
|
||||
BMIter iter, liter;
|
||||
MLoopUV *luv;
|
||||
|
||||
const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPUV);
|
||||
|
||||
/* draws the gray mesh when painting */
|
||||
glColor3ub(112, 112, 112);
|
||||
|
||||
BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
|
||||
glBegin(GL_LINE_LOOP);
|
||||
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
|
||||
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
|
||||
|
||||
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
|
||||
glVertex2fv(luv->uv);
|
||||
}
|
||||
glEnd();
|
||||
@ -173,6 +174,9 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, BMEditMesh *em, MTe
|
||||
float aspx, aspy, col[4];
|
||||
int i;
|
||||
|
||||
const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPUV);
|
||||
const int cd_poly_tex_offset = CustomData_get_offset(&bm->pdata, CD_MTEXPOLY);
|
||||
|
||||
ED_space_image_get_uv_aspect(sima, &aspx, &aspy);
|
||||
|
||||
switch (sima->dt_uvstretch) {
|
||||
@ -184,10 +188,10 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, BMEditMesh *em, MTe
|
||||
const int efa_len = efa->len;
|
||||
float (*tf_uv)[2] = BLI_array_alloca(tf_uv, efa_len);
|
||||
float (*tf_uvorig)[2] = BLI_array_alloca(tf_uvorig, efa_len);
|
||||
tf = CustomData_bmesh_get(&bm->pdata, efa->head.data, CD_MTEXPOLY);
|
||||
tf = BM_ELEM_CD_GET_VOID_P(efa, cd_poly_tex_offset);
|
||||
|
||||
BM_ITER_ELEM_INDEX (l, &liter, efa, BM_LOOPS_OF_FACE, i) {
|
||||
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
|
||||
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
|
||||
copy_v2_v2(tf_uvorig[i], luv->uv);
|
||||
}
|
||||
|
||||
@ -214,7 +218,7 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, BMEditMesh *em, MTe
|
||||
if (BM_elem_flag_test(efa, BM_ELEM_TAG)) {
|
||||
glBegin(GL_POLYGON);
|
||||
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
|
||||
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
|
||||
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
|
||||
glVertex2fv(luv->uv);
|
||||
}
|
||||
glEnd();
|
||||
@ -231,7 +235,7 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, BMEditMesh *em, MTe
|
||||
area = BM_face_calc_area(efa) / totarea;
|
||||
|
||||
BM_ITER_ELEM_INDEX (l, &liter, efa, BM_LOOPS_OF_FACE, i) {
|
||||
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
|
||||
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
|
||||
copy_v2_v2(tf_uvorig[i], luv->uv);
|
||||
}
|
||||
|
||||
@ -251,7 +255,7 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, BMEditMesh *em, MTe
|
||||
|
||||
glBegin(GL_POLYGON);
|
||||
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
|
||||
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
|
||||
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
|
||||
glVertex2fv(luv->uv);
|
||||
}
|
||||
glEnd();
|
||||
@ -269,7 +273,7 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, BMEditMesh *em, MTe
|
||||
glShadeModel(GL_SMOOTH);
|
||||
|
||||
BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
|
||||
tf = CustomData_bmesh_get(&bm->pdata, efa->head.data, CD_MTEXPOLY);
|
||||
tf = BM_ELEM_CD_GET_VOID_P(efa, cd_poly_tex_offset);
|
||||
|
||||
if (uvedit_face_visible_test(scene, ima, efa, tf)) {
|
||||
const int efa_len = efa->len;
|
||||
@ -284,7 +288,7 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, BMEditMesh *em, MTe
|
||||
BM_elem_flag_enable(efa, BM_ELEM_TAG);
|
||||
|
||||
BM_ITER_ELEM_INDEX (l, &liter, efa, BM_LOOPS_OF_FACE, i) {
|
||||
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
|
||||
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
|
||||
copy_v2_v2(tf_uvorig[i], luv->uv);
|
||||
}
|
||||
|
||||
@ -310,7 +314,7 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, BMEditMesh *em, MTe
|
||||
|
||||
glBegin(GL_POLYGON);
|
||||
BM_ITER_ELEM_INDEX (l, &liter, efa, BM_LOOPS_OF_FACE, i) {
|
||||
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
|
||||
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
|
||||
a = fabsf(uvang[i] - ang[i]) / (float)M_PI;
|
||||
weight_to_rgb(col, 1.0f - powf((1.0f - a), 2.0f));
|
||||
glColor3fv(col);
|
||||
@ -418,6 +422,9 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
|
||||
int drawfaces, interpedges;
|
||||
Image *ima = sima->image;
|
||||
|
||||
const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPUV);
|
||||
const int cd_poly_tex_offset = CustomData_get_offset(&bm->pdata, CD_MTEXPOLY);
|
||||
|
||||
activetf = EDBM_mtexpoly_active_get(em, &efa_act, FALSE, FALSE); /* will be set to NULL if hidden */
|
||||
activef = BM_active_face_get(bm, FALSE, FALSE);
|
||||
ts = scene->toolsettings;
|
||||
@ -467,7 +474,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
|
||||
glEnable(GL_BLEND);
|
||||
|
||||
BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
|
||||
tf = CustomData_bmesh_get(&bm->pdata, efa->head.data, CD_MTEXPOLY);
|
||||
tf = BM_ELEM_CD_GET_VOID_P(efa, cd_poly_tex_offset);
|
||||
|
||||
if (uvedit_face_visible_test(scene, ima, efa, tf)) {
|
||||
BM_elem_flag_enable(efa, BM_ELEM_TAG);
|
||||
@ -480,7 +487,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
|
||||
|
||||
glBegin(GL_POLYGON);
|
||||
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
|
||||
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
|
||||
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
|
||||
glVertex2fv(luv->uv);
|
||||
}
|
||||
glEnd();
|
||||
@ -497,7 +504,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
|
||||
/* would be nice to do this within a draw loop but most below are optional, so it would involve too many checks */
|
||||
|
||||
BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
|
||||
tf = CustomData_bmesh_get(&bm->pdata, efa->head.data, CD_MTEXPOLY);
|
||||
tf = BM_ELEM_CD_GET_VOID_P(efa, cd_poly_tex_offset);
|
||||
|
||||
if (uvedit_face_visible_test(scene, ima, efa, tf)) {
|
||||
BM_elem_flag_enable(efa, BM_ELEM_TAG);
|
||||
@ -514,7 +521,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
|
||||
/* 3. draw active face stippled */
|
||||
|
||||
if (activef) {
|
||||
tf = CustomData_bmesh_get(&bm->pdata, activef->head.data, CD_MTEXPOLY);
|
||||
tf = BM_ELEM_CD_GET_VOID_P(activef, cd_poly_tex_offset);
|
||||
if (uvedit_face_visible_test(scene, ima, activef, tf)) {
|
||||
glEnable(GL_BLEND);
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
@ -525,7 +532,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
|
||||
|
||||
glBegin(GL_POLYGON);
|
||||
BM_ITER_ELEM (l, &liter, activef, BM_LOOPS_OF_FACE) {
|
||||
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
|
||||
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
|
||||
glVertex2fv(luv->uv);
|
||||
}
|
||||
glEnd();
|
||||
@ -548,14 +555,14 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
|
||||
BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
|
||||
if (!BM_elem_flag_test(efa, BM_ELEM_TAG))
|
||||
continue;
|
||||
tf = CustomData_bmesh_get(&bm->pdata, efa->head.data, CD_MTEXPOLY);
|
||||
tf = BM_ELEM_CD_GET_VOID_P(efa, cd_poly_tex_offset);
|
||||
|
||||
if (tf) {
|
||||
cpack(0x111111);
|
||||
|
||||
glBegin(GL_LINE_LOOP);
|
||||
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
|
||||
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
|
||||
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
|
||||
glVertex2fv(luv->uv);
|
||||
}
|
||||
glEnd();
|
||||
@ -565,20 +572,11 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
|
||||
|
||||
glBegin(GL_LINE_LOOP);
|
||||
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
|
||||
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
|
||||
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
|
||||
glVertex2fv(luv->uv);
|
||||
}
|
||||
glEnd();
|
||||
|
||||
#if 0
|
||||
glBegin(GL_LINE_STRIP);
|
||||
luv = CustomData_bmesh_get(&bm->ldata, efa->lbase->head.data, CD_MLOOPUV);
|
||||
glVertex2fv(luv->uv);
|
||||
luv = CustomData_bmesh_get(&bm->ldata, efa->lbase->next->head.data, CD_MLOOPUV);
|
||||
glVertex2fv(luv->uv);
|
||||
glEnd();
|
||||
#endif
|
||||
|
||||
setlinestyle(0);
|
||||
}
|
||||
}
|
||||
@ -594,7 +592,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
|
||||
|
||||
glBegin(GL_LINE_LOOP);
|
||||
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
|
||||
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
|
||||
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
|
||||
glVertex2fv(luv->uv);
|
||||
}
|
||||
glEnd();
|
||||
@ -610,7 +608,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
|
||||
|
||||
glBegin(GL_LINE_LOOP);
|
||||
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
|
||||
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
|
||||
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
|
||||
glVertex2fv(luv->uv);
|
||||
}
|
||||
glEnd();
|
||||
@ -636,7 +634,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
|
||||
sel = (uvedit_uv_select_test(em, scene, l) ? 1 : 0);
|
||||
glColor4ubv(sel ? (GLubyte *)col1 : (GLubyte *)col2);
|
||||
|
||||
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
|
||||
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
|
||||
glVertex2fv(luv->uv);
|
||||
}
|
||||
glEnd();
|
||||
@ -656,9 +654,9 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
|
||||
glColor4ubv(sel ? (GLubyte *)col1 : (GLubyte *)col2);
|
||||
lastsel = sel;
|
||||
}
|
||||
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
|
||||
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
|
||||
glVertex2fv(luv->uv);
|
||||
luv = CustomData_bmesh_get(&bm->ldata, l->next->head.data, CD_MLOOPUV);
|
||||
luv = BM_ELEM_CD_GET_VOID_P(l->next, cd_loop_uv_offset);
|
||||
glVertex2fv(luv->uv);
|
||||
}
|
||||
glEnd();
|
||||
@ -673,7 +671,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
|
||||
|
||||
glBegin(GL_LINE_LOOP);
|
||||
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
|
||||
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
|
||||
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
|
||||
glVertex2fv(luv->uv);
|
||||
}
|
||||
glEnd();
|
||||
@ -741,7 +739,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
|
||||
continue;
|
||||
|
||||
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
|
||||
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
|
||||
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
|
||||
if (!uvedit_uv_select_test(em, scene, l))
|
||||
bglVertex2fv(luv->uv);
|
||||
}
|
||||
@ -759,7 +757,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
|
||||
continue;
|
||||
|
||||
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
|
||||
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
|
||||
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
|
||||
|
||||
if (luv->flag & MLOOPUV_PINNED)
|
||||
bglVertex2fv(luv->uv);
|
||||
@ -777,7 +775,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
|
||||
continue;
|
||||
|
||||
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
|
||||
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
|
||||
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
|
||||
|
||||
if (uvedit_uv_select_test(em, scene, l))
|
||||
bglVertex2fv(luv->uv);
|
||||
|
@ -59,7 +59,7 @@ typedef struct NearestHit {
|
||||
struct BMFace *efa;
|
||||
struct MTexPoly *tf;
|
||||
struct BMLoop *l, *nextl;
|
||||
struct MLoopUV *luv, *nextluv;
|
||||
struct MLoopUV *luv, *luv_next;
|
||||
int lindex; //index of loop within face
|
||||
int vert1, vert2; //index in mesh of edge vertices
|
||||
} NearestHit;
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -161,13 +161,16 @@ static int ED_uvedit_ensure_uvs(bContext *C, Scene *scene, Object *obedit)
|
||||
|
||||
/****************** Parametrizer Conversion ***************/
|
||||
|
||||
static int uvedit_have_selection(Scene *scene, BMEditMesh *em, short implicit)
|
||||
static bool uvedit_have_selection(Scene *scene, BMEditMesh *em, short implicit)
|
||||
{
|
||||
BMFace *efa;
|
||||
BMLoop *l;
|
||||
BMIter iter, liter;
|
||||
MLoopUV *luv;
|
||||
|
||||
if (!CustomData_has_layer(&em->bm->ldata, CD_MLOOPUV)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/* verify if we have any selected uv's before unwrapping,
|
||||
* so we can cancel the operator early */
|
||||
BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
|
||||
@ -175,14 +178,10 @@ static int uvedit_have_selection(Scene *scene, BMEditMesh *em, short implicit)
|
||||
if (BM_elem_flag_test(efa, BM_ELEM_HIDDEN))
|
||||
continue;
|
||||
}
|
||||
else if (BM_elem_flag_test(efa, BM_ELEM_HIDDEN) || !BM_elem_flag_test(efa, BM_ELEM_SELECT))
|
||||
else if (!BM_elem_flag_test(efa, BM_ELEM_SELECT))
|
||||
continue;
|
||||
|
||||
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
|
||||
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
|
||||
if (!luv)
|
||||
return 1;
|
||||
|
||||
if (uvedit_uv_select_test(em, scene, l))
|
||||
break;
|
||||
}
|
||||
@ -190,10 +189,10 @@ static int uvedit_have_selection(Scene *scene, BMEditMesh *em, short implicit)
|
||||
if (implicit && !l)
|
||||
continue;
|
||||
|
||||
return 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
void uvedit_get_aspect(Scene *scene, Object *ob, BMEditMesh *em, float *aspx, float *aspy)
|
||||
@ -226,6 +225,7 @@ static ParamHandle *construct_param_handle(Scene *scene, Object *ob, BMEditMesh
|
||||
short implicit, short fill, short sel,
|
||||
short correct_aspect)
|
||||
{
|
||||
BMesh *bm = em->bm;
|
||||
ScanFillContext sf_ctx;
|
||||
ParamHandle *handle;
|
||||
BMFace *efa;
|
||||
@ -233,8 +233,11 @@ static ParamHandle *construct_param_handle(Scene *scene, Object *ob, BMEditMesh
|
||||
BMEdge *eed;
|
||||
BMIter iter, liter;
|
||||
|
||||
const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPUV);
|
||||
|
||||
handle = param_construct_begin();
|
||||
|
||||
|
||||
if (correct_aspect) {
|
||||
float aspx, aspy;
|
||||
|
||||
@ -284,7 +287,7 @@ static ParamHandle *construct_param_handle(Scene *scene, Object *ob, BMEditMesh
|
||||
* about which split is best for unwrapping than scanfill */
|
||||
i = 0;
|
||||
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
|
||||
MLoopUV *luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
|
||||
MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
|
||||
vkeys[i] = (ParamKey)BM_elem_index_get(l->v);
|
||||
co[i] = l->v->co;
|
||||
uv[i] = luv->uv;
|
||||
@ -332,7 +335,7 @@ static ParamHandle *construct_param_handle(Scene *scene, Object *ob, BMEditMesh
|
||||
ls[2] = sf_tri->v3->tmp.p;
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
MLoopUV *luv = CustomData_bmesh_get(&em->bm->ldata, ls[i]->head.data, CD_MLOOPUV);
|
||||
MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(ls[i], cd_loop_uv_offset);
|
||||
vkeys[i] = (ParamKey)BM_elem_index_get(ls[i]->v);
|
||||
co[i] = ls[i]->v->co;
|
||||
uv[i] = luv->uv;
|
||||
@ -370,16 +373,19 @@ static void texface_from_original_index(BMFace *efa, int index, float **uv, Para
|
||||
BMIter liter;
|
||||
MLoopUV *luv;
|
||||
|
||||
const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
|
||||
|
||||
*uv = NULL;
|
||||
*pin = 0;
|
||||
*select = 1;
|
||||
|
||||
|
||||
if (index == ORIGINDEX_NONE)
|
||||
return;
|
||||
|
||||
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
|
||||
if (BM_elem_index_get(l->v) == index) {
|
||||
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
|
||||
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
|
||||
*uv = luv->uv;
|
||||
*pin = (luv->flag & MLOOPUV_PINNED) ? 1 : 0;
|
||||
*select = (uvedit_uv_select_test(em, scene, l) != 0);
|
||||
@ -547,7 +553,7 @@ typedef struct MinStretch {
|
||||
wmTimer *timer;
|
||||
} MinStretch;
|
||||
|
||||
static int minimize_stretch_init(bContext *C, wmOperator *op)
|
||||
static bool minimize_stretch_init(bContext *C, wmOperator *op)
|
||||
{
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
Object *obedit = CTX_data_edit_object(C);
|
||||
@ -557,7 +563,7 @@ static int minimize_stretch_init(bContext *C, wmOperator *op)
|
||||
short implicit = 1;
|
||||
|
||||
if (!uvedit_have_selection(scene, em, implicit)) {
|
||||
return 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
ms = MEM_callocN(sizeof(MinStretch), "MinStretch");
|
||||
@ -576,7 +582,7 @@ static int minimize_stretch_init(bContext *C, wmOperator *op)
|
||||
|
||||
op->customdata = ms;
|
||||
|
||||
return 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
static void minimize_stretch_iteration(bContext *C, wmOperator *op, int interactive)
|
||||
@ -1047,6 +1053,8 @@ static void correct_uv_aspect(Scene *scene, Object *ob, BMEditMesh *em)
|
||||
BMFace *efa;
|
||||
float scale, aspx, aspy;
|
||||
|
||||
const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
|
||||
|
||||
uvedit_get_aspect(scene, ob, em, &aspx, &aspy);
|
||||
|
||||
if (aspx == aspy)
|
||||
@ -1056,11 +1064,11 @@ static void correct_uv_aspect(Scene *scene, Object *ob, BMEditMesh *em)
|
||||
scale = aspy / aspx;
|
||||
|
||||
BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
|
||||
if (!BM_elem_flag_test(efa, BM_ELEM_SELECT) || BM_elem_flag_test(efa, BM_ELEM_HIDDEN))
|
||||
if (!BM_elem_flag_test(efa, BM_ELEM_SELECT))
|
||||
continue;
|
||||
|
||||
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
|
||||
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
|
||||
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
|
||||
luv->uv[0] = ((luv->uv[0] - 0.5f) * scale) + 0.5f;
|
||||
}
|
||||
}
|
||||
@ -1069,11 +1077,11 @@ static void correct_uv_aspect(Scene *scene, Object *ob, BMEditMesh *em)
|
||||
scale = aspx / aspy;
|
||||
|
||||
BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
|
||||
if (!BM_elem_flag_test(efa, BM_ELEM_SELECT) || BM_elem_flag_test(efa, BM_ELEM_HIDDEN))
|
||||
if (!BM_elem_flag_test(efa, BM_ELEM_SELECT))
|
||||
continue;
|
||||
|
||||
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
|
||||
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
|
||||
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
|
||||
luv->uv[1] = ((luv->uv[1] - 0.5f) * scale) + 0.5f;
|
||||
}
|
||||
}
|
||||
@ -1103,6 +1111,8 @@ static void uv_map_clip_correct(Scene *scene, Object *ob, BMEditMesh *em, wmOper
|
||||
int clip_to_bounds = RNA_boolean_get(op->ptr, "clip_to_bounds");
|
||||
int scale_to_bounds = RNA_boolean_get(op->ptr, "scale_to_bounds");
|
||||
|
||||
const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
|
||||
|
||||
/* correct for image aspect ratio */
|
||||
if (correct_aspect)
|
||||
correct_uv_aspect(scene, ob, em);
|
||||
@ -1115,7 +1125,7 @@ static void uv_map_clip_correct(Scene *scene, Object *ob, BMEditMesh *em, wmOper
|
||||
continue;
|
||||
|
||||
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
|
||||
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
|
||||
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
|
||||
minmax_v2v2_v2(min, max, luv->uv);
|
||||
}
|
||||
}
|
||||
@ -1134,7 +1144,7 @@ static void uv_map_clip_correct(Scene *scene, Object *ob, BMEditMesh *em, wmOper
|
||||
continue;
|
||||
|
||||
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
|
||||
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
|
||||
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
|
||||
|
||||
luv->uv[0] = (luv->uv[0] - min[0]) * dx;
|
||||
luv->uv[1] = (luv->uv[1] - min[1]) * dy;
|
||||
@ -1148,7 +1158,7 @@ static void uv_map_clip_correct(Scene *scene, Object *ob, BMEditMesh *em, wmOper
|
||||
continue;
|
||||
|
||||
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
|
||||
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
|
||||
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
|
||||
CLAMP(luv->uv[0], 0.0f, 1.0f);
|
||||
CLAMP(luv->uv[1], 0.0f, 1.0f);
|
||||
}
|
||||
@ -1296,11 +1306,15 @@ static int uv_from_view_exec(bContext *C, wmOperator *op)
|
||||
MLoopUV *luv;
|
||||
float rotmat[4][4];
|
||||
|
||||
int cd_loop_uv_offset;
|
||||
|
||||
/* add uvs if they don't exist yet */
|
||||
if (!ED_uvedit_ensure_uvs(C, scene, obedit)) {
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
|
||||
cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
|
||||
|
||||
/* establish the camera object, so we can default to view mapping if anything is wrong with it */
|
||||
if ((rv3d->persp == RV3D_CAMOB) && (v3d->camera) && (v3d->camera->type == OB_CAMERA)) {
|
||||
camera = v3d->camera->data;
|
||||
@ -1314,7 +1328,7 @@ static int uv_from_view_exec(bContext *C, wmOperator *op)
|
||||
continue;
|
||||
|
||||
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
|
||||
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
|
||||
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
|
||||
BLI_uvproject_from_view_ortho(luv->uv, l->v->co, rotmat);
|
||||
}
|
||||
}
|
||||
@ -1328,7 +1342,7 @@ static int uv_from_view_exec(bContext *C, wmOperator *op)
|
||||
continue;
|
||||
|
||||
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
|
||||
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
|
||||
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
|
||||
BLI_uvproject_from_camera(luv->uv, l->v->co, uci);
|
||||
}
|
||||
}
|
||||
@ -1344,7 +1358,7 @@ static int uv_from_view_exec(bContext *C, wmOperator *op)
|
||||
continue;
|
||||
|
||||
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
|
||||
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
|
||||
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
|
||||
BLI_uvproject_from_view(luv->uv, l->v->co, rv3d->persmat, rotmat, ar->winx, ar->winy);
|
||||
}
|
||||
}
|
||||
@ -1448,11 +1462,11 @@ static void uv_map_mirror(BMEditMesh *em, BMFace *efa, MTexPoly *UNUSED(tf))
|
||||
float dx;
|
||||
int i, mi;
|
||||
|
||||
i = 0;
|
||||
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
|
||||
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
|
||||
const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
|
||||
|
||||
BM_ITER_ELEM_INDEX (l, &liter, efa, BM_LOOPS_OF_FACE, i) {
|
||||
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
|
||||
uvs[i] = luv->uv;
|
||||
i++;
|
||||
}
|
||||
|
||||
mi = 0;
|
||||
@ -1480,11 +1494,15 @@ static int sphere_project_exec(bContext *C, wmOperator *op)
|
||||
MLoopUV *luv;
|
||||
float center[3], rotmat[4][4];
|
||||
|
||||
int cd_loop_uv_offset;
|
||||
|
||||
/* add uvs if they don't exist yet */
|
||||
if (!ED_uvedit_ensure_uvs(C, scene, obedit)) {
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
|
||||
cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
|
||||
|
||||
uv_map_transform(C, op, center, rotmat);
|
||||
|
||||
BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
|
||||
@ -1492,7 +1510,7 @@ static int sphere_project_exec(bContext *C, wmOperator *op)
|
||||
continue;
|
||||
|
||||
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
|
||||
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
|
||||
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
|
||||
|
||||
uv_sphere_project(luv->uv, l->v->co, center, rotmat);
|
||||
}
|
||||
@ -1555,11 +1573,15 @@ static int cylinder_project_exec(bContext *C, wmOperator *op)
|
||||
MLoopUV *luv;
|
||||
float center[3], rotmat[4][4];
|
||||
|
||||
int cd_loop_uv_offset;
|
||||
|
||||
/* add uvs if they don't exist yet */
|
||||
if (!ED_uvedit_ensure_uvs(C, scene, obedit)) {
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
|
||||
cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
|
||||
|
||||
uv_map_transform(C, op, center, rotmat);
|
||||
|
||||
BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
|
||||
@ -1567,7 +1589,7 @@ static int cylinder_project_exec(bContext *C, wmOperator *op)
|
||||
continue;
|
||||
|
||||
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
|
||||
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
|
||||
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
|
||||
|
||||
uv_cylinder_project(luv->uv, l->v->co, center, rotmat);
|
||||
}
|
||||
@ -1617,11 +1639,15 @@ static int cube_project_exec(bContext *C, wmOperator *op)
|
||||
float cube_size, *loc, dx, dy;
|
||||
int cox, coy;
|
||||
|
||||
int cd_loop_uv_offset;
|
||||
|
||||
/* add uvs if they don't exist yet */
|
||||
if (!ED_uvedit_ensure_uvs(C, scene, obedit)) {
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
|
||||
cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
|
||||
|
||||
loc = obedit->obmat[3];
|
||||
cube_size = RNA_float_get(op->ptr, "cube_size");
|
||||
|
||||
@ -1639,7 +1665,7 @@ static int cube_project_exec(bContext *C, wmOperator *op)
|
||||
|
||||
dx = dy = 0;
|
||||
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
|
||||
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
|
||||
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
|
||||
|
||||
luv->uv[0] = 0.5f + 0.5f * cube_size * (loc[cox] + l->v->co[cox]);
|
||||
luv->uv[1] = 0.5f + 0.5f * cube_size * (loc[coy] + l->v->co[coy]);
|
||||
|
Loading…
Reference in New Issue
Block a user