fix for weight paint face selection.
since removing tesselation faces we can no longer rely on me->totface & me->mface being set. now use polygons instead.
This commit is contained in:
@@ -147,7 +147,7 @@ static int facesel_face_pick(struct bContext *C, Mesh *me, Object *ob, const int
|
||||
on an edge in the backbuf, we can still select a face */
|
||||
|
||||
int dist;
|
||||
*index = view3d_sample_backbuf_rect(&vc, mval, 3, 1, me->totface+1, &dist,0,NULL, NULL);
|
||||
*index = view3d_sample_backbuf_rect(&vc, mval, 3, 1, me->totpoly+1, &dist,0,NULL, NULL);
|
||||
}
|
||||
else {
|
||||
/* sample only on the exact position */
|
||||
@@ -610,10 +610,8 @@ int do_paintface_box_select(ViewContext *vc, rcti *rect, int select, int extend)
|
||||
int sy= rect->ymax-rect->ymin+1;
|
||||
|
||||
me= get_mesh(ob);
|
||||
if(me==0) return 0;
|
||||
if(me->totpoly==0) return 0;
|
||||
|
||||
if(me==NULL || me->totface==0 || sx*sy <= 0)
|
||||
if(me==NULL || me->totpoly==0 || sx*sy <= 0)
|
||||
return OPERATOR_CANCELLED;
|
||||
|
||||
selar= MEM_callocN(me->totpoly+1, "selar");
|
||||
@@ -640,7 +638,7 @@ int do_paintface_box_select(ViewContext *vc, rcti *rect, int select, int extend)
|
||||
while(a--) {
|
||||
if(*rt) {
|
||||
index= WM_framebuffer_to_index(*rt);
|
||||
if(index<=me->totface) selar[index]= 1;
|
||||
if(index<=me->totpoly) selar[index]= 1;
|
||||
}
|
||||
rt++;
|
||||
}
|
||||
|
||||
@@ -115,25 +115,23 @@ static void get_marked_edge_info__orFlags(EdgeHash *eh, int v0, int v1, int flag
|
||||
static EdgeHash *get_tface_mesh_marked_edge_info(Mesh *me)
|
||||
{
|
||||
EdgeHash *eh = BLI_edgehash_new();
|
||||
MFace *mf;
|
||||
int i;
|
||||
MPoly *mp;
|
||||
MLoop *ml;
|
||||
MLoop *ml_next;
|
||||
int i, j;
|
||||
|
||||
for(i=0; i<me->totface; i++) {
|
||||
mf = &me->mface[i];
|
||||
for(i=0; i<me->totpoly; i++) {
|
||||
mp = &me->mpoly[i];
|
||||
|
||||
if(!(mf->flag & ME_HIDE)) {
|
||||
if (!(mp->flag & ME_HIDE)) {
|
||||
unsigned int flags = eEdge_Visible;
|
||||
if(mf->flag & ME_FACE_SEL) flags |= eEdge_Select;
|
||||
if (mp->flag & ME_FACE_SEL) flags |= eEdge_Select;
|
||||
|
||||
get_marked_edge_info__orFlags(eh, mf->v1, mf->v2, flags);
|
||||
get_marked_edge_info__orFlags(eh, mf->v2, mf->v3, flags);
|
||||
|
||||
if(mf->v4) {
|
||||
get_marked_edge_info__orFlags(eh, mf->v3, mf->v4, flags);
|
||||
get_marked_edge_info__orFlags(eh, mf->v4, mf->v1, flags);
|
||||
ml = me->mloop + mp->loopstart;
|
||||
for (j=0; j<mp->totloop; j++, ml++) {
|
||||
ml_next = ME_POLY_LOOP_NEXT(me->mloop, mp, j);
|
||||
get_marked_edge_info__orFlags(eh, ml->v, ml_next->v, flags);
|
||||
}
|
||||
else
|
||||
get_marked_edge_info__orFlags(eh, mf->v3, mf->v1, flags);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -592,8 +590,8 @@ static int wpaint__setSolidDrawOptions_material(void *userData, int index, int *
|
||||
static int wpaint__setSolidDrawOptions_facemask(void *userData, int index, int *drawSmooth_r)
|
||||
{
|
||||
Mesh *me = (Mesh*)userData;
|
||||
MFace *mface = &me->mface[index];
|
||||
if (mface->flag & ME_HIDE) return 0;
|
||||
MPoly *mp = &me->mpoly[index];
|
||||
if (mp->flag & ME_HIDE) return 0;
|
||||
*drawSmooth_r = 1;
|
||||
return 1;
|
||||
}
|
||||
@@ -863,9 +861,9 @@ static int tex_mat_set_face_mesh_cb(void *userData, int index)
|
||||
/* faceselect mode face hiding */
|
||||
TexMatCallback *data= (TexMatCallback*)userData;
|
||||
Mesh *me = (Mesh*)data->me;
|
||||
MPoly *mface = &me->mpoly[index];
|
||||
MPoly *mp = &me->mpoly[index];
|
||||
|
||||
return !(mface->flag & ME_HIDE);
|
||||
return !(mp->flag & ME_HIDE);
|
||||
}
|
||||
|
||||
static int tex_mat_set_face_editmesh_cb(void *userData, int index)
|
||||
|
||||
@@ -3239,7 +3239,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
|
||||
/* weight paint in solid mode, special case. focus on making the weights clear
|
||||
* rather than the shading, this is also forced in wire view */
|
||||
GPU_enable_material(0, NULL);
|
||||
dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, GPU_enable_material, NULL, me->mface, 1);
|
||||
dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, GPU_enable_material, NULL, me->mpoly, 1);
|
||||
|
||||
bglPolygonOffset(rv3d->dist, 1.0);
|
||||
glDepthMask(0); // disable write in zbuffer, selected edge wires show better
|
||||
@@ -3364,7 +3364,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
|
||||
glEnable(GL_LIGHTING);
|
||||
glEnable(GL_COLOR_MATERIAL);
|
||||
|
||||
dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, GPU_enable_material, NULL, me->mface, 1);
|
||||
dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, GPU_enable_material, NULL, me->mpoly, 1);
|
||||
glDisable(GL_COLOR_MATERIAL);
|
||||
glDisable(GL_LIGHTING);
|
||||
|
||||
@@ -7144,7 +7144,7 @@ static int bbs_mesh_solid_hide__setDrawOpts(void *userData, int index, int *UNUS
|
||||
{
|
||||
Mesh *me = userData;
|
||||
|
||||
if (!(me->mface[index].flag&ME_HIDE)) {
|
||||
if (!(me->mpoly[index].flag&ME_HIDE)) {
|
||||
WM_set_framebuffer_index_color(index+1);
|
||||
return 1;
|
||||
} else {
|
||||
@@ -7157,7 +7157,7 @@ static int bbs_mesh_solid_hide2__setDrawOpts(void *userData, int index, int *UNU
|
||||
{
|
||||
Mesh *me = userData;
|
||||
|
||||
if (!(me->mface[index].flag & ME_HIDE)) {
|
||||
if (!(me->mpoly[index].flag & ME_HIDE)) {
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
|
||||
@@ -857,7 +857,7 @@ static void do_lasso_select_paintface(ViewContext *vc, int mcords[][2], short mo
|
||||
Mesh *me= ob?ob->data:NULL;
|
||||
rcti rect;
|
||||
|
||||
if(me==NULL || me->totface==0)
|
||||
if(me==NULL || me->totpoly==0)
|
||||
return;
|
||||
|
||||
if(extend==0 && select)
|
||||
|
||||
Reference in New Issue
Block a user