diff options
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_DerivedMesh.h | 3 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_paint.h | 3 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/DerivedMesh.c | 117 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/cdderivedmesh.c | 40 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/paint.c | 6 |
5 files changed, 148 insertions, 21 deletions
diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h index 55ade5fe5d9..1d060846175 100644 --- a/source/blender/blenkernel/BKE_DerivedMesh.h +++ b/source/blender/blenkernel/BKE_DerivedMesh.h @@ -222,6 +222,9 @@ struct DerivedMesh { /* Draw all vertices as bgl points (no options) */ void (*drawVerts)(DerivedMesh *dm); + /* Jason Draw all selected vertices as bgl points (no options) */ + void (*drawSelectedVerts)(DerivedMesh *dm); + /* Draw edges in the UV mesh (if exists) */ void (*drawUVEdges)(DerivedMesh *dm); diff --git a/source/blender/blenkernel/BKE_paint.h b/source/blender/blenkernel/BKE_paint.h index ef16129e1e7..cee97e7631f 100644 --- a/source/blender/blenkernel/BKE_paint.h +++ b/source/blender/blenkernel/BKE_paint.h @@ -59,7 +59,8 @@ void paint_brush_set(struct Paint *paint, struct Brush *br); * Texture paint could be removed since selected faces are not used * however hiding faces is useful */ int paint_facesel_test(struct Object *ob); - +/* Jason */ +int paint_vertsel_test(struct Object *ob); /* Session data (mode-specific) */ typedef struct SculptSession { diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 62b8830de20..dd2f3e2c699 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -40,6 +40,9 @@ #include "DNA_cloth_types.h" #include "DNA_key_types.h" #include "DNA_meshdata_types.h" +// Jason +#include "DNA_armature_types.h" + #include "DNA_object_types.h" #include "DNA_scene_types.h" // N_T @@ -72,6 +75,8 @@ #include "GPU_material.h" #include "ED_sculpt.h" /* for ED_sculpt_modifiers_changed */ +// Jason was here, this is for multi-paint +#include "ED_armature.h" /////////////////////////////////// /////////////////////////////////// @@ -1602,19 +1607,50 @@ void weight_to_rgb(float input, float *fr, float *fg, float *fb) } } -static void calc_weightpaint_vert_color(Object *ob, ColorBand *coba, int vert, unsigned char *col) +static void calc_weightpaint_vert_color(Object *ob, ColorBand *coba, int vert, unsigned char *col, char *dg_flags, int selected, int unselected, int multipaint, int auto_normalize) { Mesh *me = ob->data; - float colf[4], input = 0.0f; + float colf[4], input = 0.0f;// Jason int i; + char make_black = FALSE; + char was_a_nonzero = FALSE; if (me->dvert) { - for (i=0; i<me->dvert[vert].totweight; i++) - if (me->dvert[vert].dw[i].def_nr==ob->actdef-1) - input+=me->dvert[vert].dw[i].weight; - } + for (i=0; i<me->dvert[vert].totweight; i++) { + // Jason was here + // in multipaint, get the average if auto normalize is inactive + // get the sum if it is active + if(multipaint && selected > 1) { + if(dg_flags[me->dvert[vert].dw[i].def_nr]) { + if(me->dvert[vert].dw[i].weight) { + input+=me->dvert[vert].dw[i].weight; + was_a_nonzero = TRUE; + } + } + } else if (me->dvert[vert].dw[i].def_nr==ob->actdef-1) { + input+=me->dvert[vert].dw[i].weight; + } + } + + // Jason was here + // make it black if the selected groups have no weight on a vertex + if(!make_black && multipaint && selected > 1) { + if(!was_a_nonzero) { + make_black = TRUE; + } else if (!auto_normalize){ + // get the average + input /= selected; + } - CLAMP(input, 0.0f, 1.0f); + } + } + + if(make_black) { + input = -1; + }else { + CLAMP(input, 0.0f, 1.0f); + } + if(coba) do_colorband(coba, input, colf); @@ -1633,26 +1669,69 @@ void vDM_ColorBand_store(ColorBand *coba) { stored_cb= coba; } - -static void add_weight_mcol_dm(Object *ob, DerivedMesh *dm) +/* TODO move duplicates to header */ +/* Jason was here duplicate function in paint_vertex.c*/ +static char* get_selected_defgroups(Object *ob, int defcnt) { + bPoseChannel *chan; + bPose *pose; + bDeformGroup *defgroup; + //Bone *bone; + char *dg_flags = MEM_callocN(defcnt*sizeof(char), "dg_selected_flags"); + int i; + Object *armob = ED_object_pose_armature(ob); + + if(armob) { + pose = armob->pose; + for (chan=pose->chanbase.first; chan; chan=chan->next) { + for (i = 0, defgroup = ob->defbase.first; i < defcnt && defgroup; defgroup = defgroup->next, i++) { + if(!strcmp(defgroup->name, chan->bone->name)) { + dg_flags[i] = (chan->bone->flag & BONE_SELECTED); + } + } + } + } + + return dg_flags; +} +/* TODO move duplicates to header */ +/* Jason was here duplicate function */ +static int count_true(char *list, int len) +{ + int i; + int cnt = 0; + for(i = 0; i < len; i++) { + if (list[i]) { + cnt++; + } + } + return cnt; +} +static void add_weight_mcol_dm(Object *ob, DerivedMesh *dm, int multipaint, int auto_normalize) { Mesh *me = ob->data; MFace *mf = me->mface; ColorBand *coba= stored_cb; /* warning, not a local var */ unsigned char *wtcol; int i; - + // Jason was here + int defcnt = BLI_countlist(&ob->defbase); + char *dg_flags = get_selected_defgroups(ob, defcnt); + int selected = count_true(dg_flags, defcnt); + int unselected = defcnt - selected; + wtcol = MEM_callocN (sizeof (unsigned char) * me->totface*4*4, "weightmap"); memset(wtcol, 0x55, sizeof (unsigned char) * me->totface*4*4); for (i=0; i<me->totface; i++, mf++) { - calc_weightpaint_vert_color(ob, coba, mf->v1, &wtcol[(i*4 + 0)*4]); - calc_weightpaint_vert_color(ob, coba, mf->v2, &wtcol[(i*4 + 1)*4]); - calc_weightpaint_vert_color(ob, coba, mf->v3, &wtcol[(i*4 + 2)*4]); + calc_weightpaint_vert_color(ob, coba, mf->v1, &wtcol[(i*4 + 0)*4], dg_flags, selected, unselected, multipaint, auto_normalize); + calc_weightpaint_vert_color(ob, coba, mf->v2, &wtcol[(i*4 + 1)*4], dg_flags, selected, unselected, multipaint, auto_normalize); + calc_weightpaint_vert_color(ob, coba, mf->v3, &wtcol[(i*4 + 2)*4], dg_flags, selected, unselected, multipaint, auto_normalize); if (mf->v4) - calc_weightpaint_vert_color(ob, coba, mf->v4, &wtcol[(i*4 + 3)*4]); + calc_weightpaint_vert_color(ob, coba, mf->v4, &wtcol[(i*4 + 3)*4], dg_flags, selected, unselected, multipaint, auto_normalize); } - + // Jason + MEM_freeN(dg_flags); + CustomData_add_layer(&dm->faceData, CD_WEIGHT_MCOL, CD_ASSIGN, wtcol, dm->numFaceData); } @@ -1859,7 +1938,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos } if((dataMask & CD_MASK_WEIGHT_MCOL) && (ob->mode & OB_MODE_WEIGHT_PAINT)) - add_weight_mcol_dm(ob, dm); + add_weight_mcol_dm(ob, dm, scene->toolsettings->multipaint, scene->toolsettings->auto_normalize);// Jason /* Constructive modifiers need to have an origindex * otherwise they wont have anywhere to copy the data from. @@ -1971,7 +2050,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos CDDM_calc_normals(finaldm); if((dataMask & CD_MASK_WEIGHT_MCOL) && (ob->mode & OB_MODE_WEIGHT_PAINT)) - add_weight_mcol_dm(ob, finaldm); + add_weight_mcol_dm(ob, finaldm, scene->toolsettings->multipaint, scene->toolsettings->auto_normalize);// Jason } else if(dm) { finaldm = dm; } else { @@ -1983,7 +2062,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos } if((dataMask & CD_MASK_WEIGHT_MCOL) && (ob->mode & OB_MODE_WEIGHT_PAINT)) - add_weight_mcol_dm(ob, finaldm); + add_weight_mcol_dm(ob, finaldm, scene->toolsettings->multipaint, scene->toolsettings->auto_normalize);// Jason } /* add an orco layer if needed */ @@ -2256,7 +2335,7 @@ static void clear_mesh_caches(Object *ob) static void mesh_build_data(Scene *scene, Object *ob, CustomDataMask dataMask) { Object *obact = scene->basact?scene->basact->object:NULL; - int editing = paint_facesel_test(ob); + int editing = paint_facesel_test(ob) || paint_vertsel_test(ob);// Jason: paint_vertsel_test /* weight paint and face select need original indices because of selection buffer drawing */ int needMapping = (ob==obact) && (editing || (ob->mode & (OB_MODE_WEIGHT_PAINT|OB_MODE_VERTEX_PAINT))); diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index 662c872b7f1..47686c2626f 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -268,6 +268,44 @@ static void cdDM_update_normals_from_pbvh(DerivedMesh *dm) BLI_pbvh_update(cddm->pbvh, PBVH_UpdateNormals, face_nors); } +// Jason +static void cdDM_drawSelectedVerts(DerivedMesh *dm) +{ + CDDerivedMesh *cddm = (CDDerivedMesh*) dm; + MVert *mv = cddm->mvert; + int i; + if( GPU_buffer_legacy(dm) ) { + char prev_sel= 0; /* always invalid */; + + glBegin(GL_POINTS); + for(i = 0; i < dm->numVertData; i++, mv++) { + if(!(mv->flag & ME_HIDE)) { + const char sel= mv->flag & 1; + if(prev_sel != sel) { + prev_sel= sel; + + // TODO define selected color + if(sel) { + glColor3f(1.0f, 1.0f, 0.0f); + }else { + glColor3f(0.0f, 0.0f, 0.0f); + } + } + + glVertex3fv(mv->co); + } + } + glEnd(); + } + else { /* use OpenGL VBOs or Vertex Arrays instead for better, faster rendering */ + GPU_vertex_setup(dm); + if( !GPU_buffer_legacy(dm) ) { + if(dm->drawObject->tot_triangle_point) glDrawArrays(GL_POINTS,0, dm->drawObject->tot_triangle_point); + else glDrawArrays(GL_POINTS,0, dm->drawObject->tot_loose_point); + } + GPU_buffer_unbind(); + } +} static void cdDM_drawVerts(DerivedMesh *dm) { @@ -1514,6 +1552,8 @@ static CDDerivedMesh *cdDM_create(const char *desc) dm->getFaceMap = cdDM_getFaceMap; dm->drawVerts = cdDM_drawVerts; + // Jason + dm->drawSelectedVerts = cdDM_drawSelectedVerts; dm->drawUVEdges = cdDM_drawUVEdges; dm->drawEdges = cdDM_drawEdges; diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c index d00eb6192da..eac98519fcc 100644 --- a/source/blender/blenkernel/intern/paint.c +++ b/source/blender/blenkernel/intern/paint.c @@ -96,7 +96,11 @@ int paint_facesel_test(Object *ob) { return (ob && ob->type==OB_MESH && ob->data && (((Mesh *)ob->data)->editflag & ME_EDIT_PAINT_MASK) && (ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT))); } - +/* Jason */ +int paint_vertsel_test(Object *ob) +{ + return (ob && ob->type==OB_MESH && ob->data && (((Mesh *)ob->data)->editflag & ME_EDIT_VERT_SEL) && (ob->mode & OB_MODE_WEIGHT_PAINT)); +} void paint_init(Paint *p, const char col[3]) { Brush *brush; |