forked from bartvdbraak/blender
initial cleanup for weight paint branch
- move get_selected_defgroups & count_selected_defgroups into blenkernel - split calc_weightpaint_vert_color() logic so its more obvious whats default and multipaint behavior
This commit is contained in:
parent
c3a718702f
commit
98961c9f19
@ -136,7 +136,6 @@ class DATA_PT_vertex_groups(MeshButtonsPanel, Panel):
|
|||||||
ob = context.object
|
ob = context.object
|
||||||
group = ob.vertex_groups.active
|
group = ob.vertex_groups.active
|
||||||
|
|
||||||
|
|
||||||
rows = 2
|
rows = 2
|
||||||
if group:
|
if group:
|
||||||
rows = 5
|
rows = 5
|
||||||
|
@ -100,6 +100,9 @@ void get_objectspace_bone_matrix (struct Bone* bone, float M_accumulatedMatrix[]
|
|||||||
void vec_roll_to_mat3(float *vec, float roll, float mat[][3]);
|
void vec_roll_to_mat3(float *vec, float roll, float mat[][3]);
|
||||||
void mat3_to_vec_roll(float mat[][3], float *vec, float *roll);
|
void mat3_to_vec_roll(float mat[][3], float *vec, float *roll);
|
||||||
|
|
||||||
|
char* get_selected_defgroups(struct Object *ob, int defcnt);
|
||||||
|
int count_selected_defgroups(const char *list, int len);
|
||||||
|
|
||||||
/* Common Conversions Between Co-ordinate Spaces */
|
/* Common Conversions Between Co-ordinate Spaces */
|
||||||
void armature_mat_world_to_pose(struct Object *ob, float inmat[][4], float outmat[][4]);
|
void armature_mat_world_to_pose(struct Object *ob, float inmat[][4], float outmat[][4]);
|
||||||
void armature_loc_world_to_pose(struct Object *ob, float *inloc, float *outloc);
|
void armature_loc_world_to_pose(struct Object *ob, float *inloc, float *outloc);
|
||||||
|
@ -62,6 +62,7 @@
|
|||||||
#include "BKE_paint.h"
|
#include "BKE_paint.h"
|
||||||
#include "BKE_texture.h"
|
#include "BKE_texture.h"
|
||||||
#include "BKE_multires.h"
|
#include "BKE_multires.h"
|
||||||
|
#include "BKE_armature.h"
|
||||||
|
|
||||||
#include "BLO_sys_types.h" // for intptr_t support
|
#include "BLO_sys_types.h" // for intptr_t support
|
||||||
|
|
||||||
@ -73,8 +74,6 @@
|
|||||||
#include "GPU_material.h"
|
#include "GPU_material.h"
|
||||||
|
|
||||||
extern GLubyte stipple_quarttone[128]; /* glutil.c, bad level data */
|
extern GLubyte stipple_quarttone[128]; /* glutil.c, bad level data */
|
||||||
// Jason was here, this is for multi-paint
|
|
||||||
#include "ED_armature.h"
|
|
||||||
|
|
||||||
///////////////////////////////////
|
///////////////////////////////////
|
||||||
///////////////////////////////////
|
///////////////////////////////////
|
||||||
@ -1678,47 +1677,58 @@ 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, char *dg_flags, int selected, int unselected, int multipaint, int auto_normalize)
|
/* draw_flag's for calc_weightpaint_vert_color */
|
||||||
|
enum {
|
||||||
|
CALC_WP_MULTIPAINT= (1<<0),
|
||||||
|
CALC_WP_AUTO_NORMALIZE= (1<<1),
|
||||||
|
};
|
||||||
|
|
||||||
|
static void calc_weightpaint_vert_color(Object *ob, ColorBand *coba, int vert, unsigned char *col, char *dg_flags, int selected, int UNUSED(unselected), const int draw_flag)
|
||||||
{
|
{
|
||||||
Mesh *me = ob->data;
|
Mesh *me = ob->data;
|
||||||
float colf[4], input = 0.0f;// Jason
|
float colf[4], input = 0.0f;
|
||||||
int i;
|
int i;
|
||||||
char make_black = FALSE;
|
|
||||||
char was_a_nonzero = FALSE;
|
// Jason was here
|
||||||
|
int make_black= FALSE;
|
||||||
|
|
||||||
if (me->dvert) {
|
if (me->dvert) {
|
||||||
for (i=0; i<me->dvert[vert].totweight; i++) {
|
if ((selected > 1) && (draw_flag & CALC_WP_MULTIPAINT)) {
|
||||||
// Jason was here
|
// Jason was here
|
||||||
// in multipaint, get the average if auto normalize is inactive
|
int was_a_nonzero= FALSE;
|
||||||
// get the sum if it is active
|
for (i=0; i<me->dvert[vert].totweight; i++) {
|
||||||
if(multipaint && selected > 1) {
|
/* in multipaint, get the average if auto normalize is inactive
|
||||||
|
* get the sum if it is active */
|
||||||
if(dg_flags[me->dvert[vert].dw[i].def_nr]) {
|
if(dg_flags[me->dvert[vert].dw[i].def_nr]) {
|
||||||
if(me->dvert[vert].dw[i].weight) {
|
if(me->dvert[vert].dw[i].weight) {
|
||||||
input+=me->dvert[vert].dw[i].weight;
|
input+= me->dvert[vert].dw[i].weight;
|
||||||
was_a_nonzero = TRUE;
|
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 */
|
||||||
// make it black if the selected groups have no weight on a vertex
|
if(was_a_nonzero == FALSE) {
|
||||||
if(!make_black && multipaint && selected > 1) {
|
|
||||||
if(!was_a_nonzero) {
|
|
||||||
make_black = TRUE;
|
make_black = TRUE;
|
||||||
} else if (!auto_normalize){
|
|
||||||
// get the average
|
|
||||||
input /= selected;
|
|
||||||
}
|
}
|
||||||
|
else if ((draw_flag & CALC_WP_AUTO_NORMALIZE) == FALSE) {
|
||||||
|
input /= selected; /* get the average */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* default, non tricky behavior */
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(make_black) {
|
if (make_black) {
|
||||||
input = -1;
|
input = -1;
|
||||||
}else {
|
}
|
||||||
|
else {
|
||||||
CLAMP(input, 0.0f, 1.0f);
|
CLAMP(input, 0.0f, 1.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1740,65 +1750,30 @@ void vDM_ColorBand_store(ColorBand *coba)
|
|||||||
{
|
{
|
||||||
stored_cb= coba;
|
stored_cb= coba;
|
||||||
}
|
}
|
||||||
/* 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) {
|
static void add_weight_mcol_dm(Object *ob, DerivedMesh *dm, int const draw_flag)
|
||||||
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;
|
Mesh *me = ob->data;
|
||||||
MFace *mf = me->mface;
|
MFace *mf = me->mface;
|
||||||
ColorBand *coba= stored_cb; /* warning, not a local var */
|
ColorBand *coba= stored_cb; /* warning, not a local var */
|
||||||
unsigned char *wtcol;
|
unsigned char *wtcol;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
// Jason was here
|
// Jason was here
|
||||||
int defcnt = BLI_countlist(&ob->defbase);
|
int defcnt = BLI_countlist(&ob->defbase);
|
||||||
char *dg_flags = get_selected_defgroups(ob, defcnt);
|
char *dg_flags = get_selected_defgroups(ob, defcnt);
|
||||||
int selected = count_true(dg_flags, defcnt);
|
int selected = count_selected_defgroups(dg_flags, defcnt);
|
||||||
int unselected = defcnt - selected;
|
int unselected = defcnt - selected;
|
||||||
|
|
||||||
wtcol = MEM_callocN (sizeof (unsigned char) * me->totface*4*4, "weightmap");
|
wtcol = MEM_callocN (sizeof (unsigned char) * me->totface*4*4, "weightmap");
|
||||||
|
|
||||||
memset(wtcol, 0x55, sizeof (unsigned char) * me->totface*4*4);
|
memset(wtcol, 0x55, sizeof (unsigned char) * me->totface*4*4);
|
||||||
for (i=0; i<me->totface; i++, mf++) {
|
for (i=0; i<me->totface; i++, mf++) {
|
||||||
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->v1, &wtcol[(i*4 + 0)*4], dg_flags, selected, unselected, draw_flag);
|
||||||
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->v2, &wtcol[(i*4 + 1)*4], dg_flags, selected, unselected, draw_flag);
|
||||||
calc_weightpaint_vert_color(ob, coba, mf->v3, &wtcol[(i*4 + 2)*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, draw_flag);
|
||||||
if (mf->v4)
|
if (mf->v4)
|
||||||
calc_weightpaint_vert_color(ob, coba, mf->v4, &wtcol[(i*4 + 3)*4], dg_flags, selected, unselected, multipaint, auto_normalize);
|
calc_weightpaint_vert_color(ob, coba, mf->v4, &wtcol[(i*4 + 3)*4], dg_flags, selected, unselected, draw_flag);
|
||||||
}
|
}
|
||||||
// Jason
|
// Jason
|
||||||
MEM_freeN(dg_flags);
|
MEM_freeN(dg_flags);
|
||||||
@ -1830,6 +1805,10 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
|
|||||||
int has_multires = mmd != NULL, multires_applied = 0;
|
int has_multires = mmd != NULL, multires_applied = 0;
|
||||||
int sculpt_mode = ob->mode & OB_MODE_SCULPT && ob->sculpt;
|
int sculpt_mode = ob->mode & OB_MODE_SCULPT && ob->sculpt;
|
||||||
|
|
||||||
|
// Jason
|
||||||
|
int draw_flag= ((scene->toolsettings->multipaint ? CALC_WP_MULTIPAINT : 0) |
|
||||||
|
(scene->toolsettings->auto_normalize ? CALC_WP_AUTO_NORMALIZE : 0));
|
||||||
|
|
||||||
if(mmd && !mmd->sculptlvl)
|
if(mmd && !mmd->sculptlvl)
|
||||||
has_multires = 0;
|
has_multires = 0;
|
||||||
|
|
||||||
@ -2009,7 +1988,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
|
|||||||
}
|
}
|
||||||
|
|
||||||
if((dataMask & CD_MASK_WEIGHT_MCOL) && (ob->mode & OB_MODE_WEIGHT_PAINT))
|
if((dataMask & CD_MASK_WEIGHT_MCOL) && (ob->mode & OB_MODE_WEIGHT_PAINT))
|
||||||
add_weight_mcol_dm(ob, dm, scene->toolsettings->multipaint, scene->toolsettings->auto_normalize);// Jason
|
add_weight_mcol_dm(ob, dm, draw_flag); // Jason
|
||||||
|
|
||||||
/* Constructive modifiers need to have an origindex
|
/* Constructive modifiers need to have an origindex
|
||||||
* otherwise they wont have anywhere to copy the data from.
|
* otherwise they wont have anywhere to copy the data from.
|
||||||
@ -2121,7 +2100,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
|
|||||||
CDDM_calc_normals(finaldm);
|
CDDM_calc_normals(finaldm);
|
||||||
|
|
||||||
if((dataMask & CD_MASK_WEIGHT_MCOL) && (ob->mode & OB_MODE_WEIGHT_PAINT))
|
if((dataMask & CD_MASK_WEIGHT_MCOL) && (ob->mode & OB_MODE_WEIGHT_PAINT))
|
||||||
add_weight_mcol_dm(ob, finaldm, scene->toolsettings->multipaint, scene->toolsettings->auto_normalize);// Jason
|
add_weight_mcol_dm(ob, finaldm, draw_flag);// Jason
|
||||||
} else if(dm) {
|
} else if(dm) {
|
||||||
finaldm = dm;
|
finaldm = dm;
|
||||||
} else {
|
} else {
|
||||||
@ -2133,7 +2112,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
|
|||||||
}
|
}
|
||||||
|
|
||||||
if((dataMask & CD_MASK_WEIGHT_MCOL) && (ob->mode & OB_MODE_WEIGHT_PAINT))
|
if((dataMask & CD_MASK_WEIGHT_MCOL) && (ob->mode & OB_MODE_WEIGHT_PAINT))
|
||||||
add_weight_mcol_dm(ob, finaldm, scene->toolsettings->multipaint, scene->toolsettings->auto_normalize);// Jason
|
add_weight_mcol_dm(ob, finaldm, draw_flag);// Jason
|
||||||
}
|
}
|
||||||
|
|
||||||
/* add an orco layer if needed */
|
/* add an orco layer if needed */
|
||||||
|
@ -2465,3 +2465,42 @@ void where_is_pose (Scene *scene, Object *ob)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Jason was here */
|
||||||
|
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 = object_pose_armature_get(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 */
|
||||||
|
int count_selected_defgroups(const char *list, int len)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int cnt = 0;
|
||||||
|
for(i = 0; i < len; i++) {
|
||||||
|
if (list[i]) {
|
||||||
|
cnt++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return cnt;
|
||||||
|
}
|
||||||
|
@ -64,6 +64,7 @@
|
|||||||
#include "RNA_enum_types.h"
|
#include "RNA_enum_types.h"
|
||||||
|
|
||||||
#include "BKE_DerivedMesh.h"
|
#include "BKE_DerivedMesh.h"
|
||||||
|
#include "BKE_armature.h"
|
||||||
#include "BKE_action.h"
|
#include "BKE_action.h"
|
||||||
#include "BKE_brush.h"
|
#include "BKE_brush.h"
|
||||||
#include "BKE_context.h"
|
#include "BKE_context.h"
|
||||||
@ -1493,42 +1494,6 @@ static int apply_mp_lcks_normalize(Object *ob, Mesh *me, int index, MDeformWeigh
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Jason was here duplicate function I used in DerivedMesh.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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// the array has whether or not the corresponding group is 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;
|
|
||||||
}
|
|
||||||
// within the current dvert index, get the dw that is selected and has a weight above 0
|
// within the current dvert index, get the dw that is selected and has a weight above 0
|
||||||
// this helps multi-paint
|
// this helps multi-paint
|
||||||
static int get_first_selected_nonzero_weight(MDeformVert *dvert, char *selection) {
|
static int get_first_selected_nonzero_weight(MDeformVert *dvert, char *selection) {
|
||||||
@ -1588,7 +1553,7 @@ static void do_weight_paint_vertex(VPaint *wp, Object *ob, int index,
|
|||||||
/* Jason was here */
|
/* Jason was here */
|
||||||
flags = gen_lck_flags(ob, defcnt = BLI_countlist(&ob->defbase), bone_groups);
|
flags = gen_lck_flags(ob, defcnt = BLI_countlist(&ob->defbase), bone_groups);
|
||||||
selection = get_selected_defgroups(ob, defcnt);
|
selection = get_selected_defgroups(ob, defcnt);
|
||||||
selected = count_true(selection, defcnt);
|
selected = count_selected_defgroups(selection, defcnt);
|
||||||
if(!selected && ob->actdef) {
|
if(!selected && ob->actdef) {
|
||||||
selected = 1;
|
selected = 1;
|
||||||
}
|
}
|
||||||
|
@ -2004,9 +2004,6 @@ static int view3d_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
|||||||
short enumerate= RNA_boolean_get(op->ptr, "enumerate");
|
short enumerate= RNA_boolean_get(op->ptr, "enumerate");
|
||||||
short object= RNA_boolean_get(op->ptr, "object");
|
short object= RNA_boolean_get(op->ptr, "object");
|
||||||
int retval = 0;
|
int retval = 0;
|
||||||
// Jason
|
|
||||||
Mesh *me;
|
|
||||||
Scene *scene = CTX_data_scene(C);
|
|
||||||
|
|
||||||
view3d_operator_needs_opengl(C);
|
view3d_operator_needs_opengl(C);
|
||||||
|
|
||||||
@ -2040,8 +2037,8 @@ static int view3d_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
|||||||
else if(obact && paint_facesel_test(obact))
|
else if(obact && paint_facesel_test(obact))
|
||||||
retval = paintface_mouse_select(C, obact, event->mval, extend);
|
retval = paintface_mouse_select(C, obact, event->mval, extend);
|
||||||
/*Jason*/
|
/*Jason*/
|
||||||
else if (paint_vertsel_test(obact) && (me = (Mesh*)(obact->data))) {
|
else if (paint_vertsel_test(obact)) {
|
||||||
retval = mouse_wp_select(C, event->mval, extend, obact, me);
|
retval = mouse_wp_select(C, event->mval, extend, obact, obact->data);
|
||||||
} else {
|
} else {
|
||||||
retval = mouse_select(C, event->mval, extend, center, enumerate);
|
retval = mouse_select(C, event->mval, extend, center, enumerate);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user