diff options
author | Campbell Barton <ideasman42@gmail.com> | 2019-04-17 07:17:24 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2019-04-17 07:21:24 +0300 |
commit | e12c08e8d170b7ca40f204a5b0423c23a9fbc2c1 (patch) | |
tree | 8cf3453d12edb177a218ef8009357518ec6cab6a /source/blender/editors/sculpt_paint/paint_utils.c | |
parent | b3dabc200a4b0399ec6b81f2ff2730d07b44fcaa (diff) |
ClangFormat: apply to source, most of intern
Apply clang format as proposed in T53211.
For details on usage and instructions for migrating branches
without conflicts, see:
https://wiki.blender.org/wiki/Tools/ClangFormat
Diffstat (limited to 'source/blender/editors/sculpt_paint/paint_utils.c')
-rw-r--r-- | source/blender/editors/sculpt_paint/paint_utils.c | 1093 |
1 files changed, 557 insertions, 536 deletions
diff --git a/source/blender/editors/sculpt_paint/paint_utils.c b/source/blender/editors/sculpt_paint/paint_utils.c index 35401c470cc..098e38dbdb5 100644 --- a/source/blender/editors/sculpt_paint/paint_utils.c +++ b/source/blender/editors/sculpt_paint/paint_utils.c @@ -80,699 +80,720 @@ /* Convert the object-space axis-aligned bounding box (expressed as * its minimum and maximum corners) into a screen-space rectangle, * returns zero if the result is empty */ -bool paint_convert_bb_to_rect( - rcti *rect, - const float bb_min[3], - const float bb_max[3], - const ARegion *ar, - RegionView3D *rv3d, - Object *ob) +bool paint_convert_bb_to_rect(rcti *rect, + const float bb_min[3], + const float bb_max[3], + const ARegion *ar, + RegionView3D *rv3d, + Object *ob) { - float projection_mat[4][4]; - int i, j, k; - - BLI_rcti_init_minmax(rect); - - /* return zero if the bounding box has non-positive volume */ - if (bb_min[0] > bb_max[0] || bb_min[1] > bb_max[1] || bb_min[2] > bb_max[2]) - return 0; - - ED_view3d_ob_project_mat_get(rv3d, ob, projection_mat); - - for (i = 0; i < 2; ++i) { - for (j = 0; j < 2; ++j) { - for (k = 0; k < 2; ++k) { - float vec[3], proj[2]; - int proj_i[2]; - vec[0] = i ? bb_min[0] : bb_max[0]; - vec[1] = j ? bb_min[1] : bb_max[1]; - vec[2] = k ? bb_min[2] : bb_max[2]; - /* convert corner to screen space */ - ED_view3d_project_float_v2_m4(ar, vec, proj, projection_mat); - /* expand 2D rectangle */ - - /* we could project directly to int? */ - proj_i[0] = proj[0]; - proj_i[1] = proj[1]; - - BLI_rcti_do_minmax_v(rect, proj_i); - } - } - } - - /* return false if the rectangle has non-positive area */ - return rect->xmin < rect->xmax && rect->ymin < rect->ymax; + float projection_mat[4][4]; + int i, j, k; + + BLI_rcti_init_minmax(rect); + + /* return zero if the bounding box has non-positive volume */ + if (bb_min[0] > bb_max[0] || bb_min[1] > bb_max[1] || bb_min[2] > bb_max[2]) + return 0; + + ED_view3d_ob_project_mat_get(rv3d, ob, projection_mat); + + for (i = 0; i < 2; ++i) { + for (j = 0; j < 2; ++j) { + for (k = 0; k < 2; ++k) { + float vec[3], proj[2]; + int proj_i[2]; + vec[0] = i ? bb_min[0] : bb_max[0]; + vec[1] = j ? bb_min[1] : bb_max[1]; + vec[2] = k ? bb_min[2] : bb_max[2]; + /* convert corner to screen space */ + ED_view3d_project_float_v2_m4(ar, vec, proj, projection_mat); + /* expand 2D rectangle */ + + /* we could project directly to int? */ + proj_i[0] = proj[0]; + proj_i[1] = proj[1]; + + BLI_rcti_do_minmax_v(rect, proj_i); + } + } + } + + /* return false if the rectangle has non-positive area */ + return rect->xmin < rect->xmax && rect->ymin < rect->ymax; } /* Get four planes in object-space that describe the projection of * screen_rect from screen into object-space (essentially converting a * 2D screens-space bounding box into four 3D planes) */ -void paint_calc_redraw_planes( - float planes[4][4], - const ARegion *ar, - Object *ob, - const rcti *screen_rect) +void paint_calc_redraw_planes(float planes[4][4], + const ARegion *ar, + Object *ob, + const rcti *screen_rect) { - BoundBox bb; - rcti rect; - - /* use some extra space just in case */ - rect = *screen_rect; - rect.xmin -= 2; - rect.xmax += 2; - rect.ymin -= 2; - rect.ymax += 2; - - ED_view3d_clipping_calc(&bb, planes, ar, ob, &rect); - negate_m4(planes); + BoundBox bb; + rcti rect; + + /* use some extra space just in case */ + rect = *screen_rect; + rect.xmin -= 2; + rect.xmax += 2; + rect.ymin -= 2; + rect.ymax += 2; + + ED_view3d_clipping_calc(&bb, planes, ar, ob, &rect); + negate_m4(planes); } -float paint_calc_object_space_radius( - ViewContext *vc, const float center[3], - float pixel_radius) +float paint_calc_object_space_radius(ViewContext *vc, const float center[3], float pixel_radius) { - Object *ob = vc->obact; - float delta[3], scale, loc[3]; - const float mval_f[2] = {pixel_radius, 0.0f}; - float zfac; + Object *ob = vc->obact; + float delta[3], scale, loc[3]; + const float mval_f[2] = {pixel_radius, 0.0f}; + float zfac; - mul_v3_m4v3(loc, ob->obmat, center); + mul_v3_m4v3(loc, ob->obmat, center); - zfac = ED_view3d_calc_zfac(vc->rv3d, loc, NULL); - ED_view3d_win_to_delta(vc->ar, mval_f, delta, zfac); + zfac = ED_view3d_calc_zfac(vc->rv3d, loc, NULL); + ED_view3d_win_to_delta(vc->ar, mval_f, delta, zfac); - scale = fabsf(mat4_to_scale(ob->obmat)); - scale = (scale == 0.0f) ? 1.0f : scale; + scale = fabsf(mat4_to_scale(ob->obmat)); + scale = (scale == 0.0f) ? 1.0f : scale; - return len_v3(delta) / scale; + return len_v3(delta) / scale; } float paint_get_tex_pixel(const MTex *mtex, float u, float v, struct ImagePool *pool, int thread) { - float intensity, rgba[4]; - float co[3] = {u, v, 0.0f}; + float intensity, rgba[4]; + float co[3] = {u, v, 0.0f}; - externtex(mtex, co, &intensity, - rgba, rgba + 1, rgba + 2, rgba + 3, thread, pool, false, false); + externtex(mtex, co, &intensity, rgba, rgba + 1, rgba + 2, rgba + 3, thread, pool, false, false); - return intensity; + return intensity; } -void paint_get_tex_pixel_col( - const MTex *mtex, float u, float v, float rgba[4], struct ImagePool *pool, - int thread, bool convert_to_linear, struct ColorSpace *colorspace) +void paint_get_tex_pixel_col(const MTex *mtex, + float u, + float v, + float rgba[4], + struct ImagePool *pool, + int thread, + bool convert_to_linear, + struct ColorSpace *colorspace) { - float co[3] = {u, v, 0.0f}; - int hasrgb; - float intensity; - - hasrgb = externtex(mtex, co, &intensity, - rgba, rgba + 1, rgba + 2, rgba + 3, thread, pool, false, false); - if (!hasrgb) { - rgba[0] = intensity; - rgba[1] = intensity; - rgba[2] = intensity; - rgba[3] = 1.0f; - } - - if (convert_to_linear) - IMB_colormanagement_colorspace_to_scene_linear_v3(rgba, colorspace); - - linearrgb_to_srgb_v3_v3(rgba, rgba); - - CLAMP(rgba[0], 0.0f, 1.0f); - CLAMP(rgba[1], 0.0f, 1.0f); - CLAMP(rgba[2], 0.0f, 1.0f); - CLAMP(rgba[3], 0.0f, 1.0f); + float co[3] = {u, v, 0.0f}; + int hasrgb; + float intensity; + + hasrgb = externtex( + mtex, co, &intensity, rgba, rgba + 1, rgba + 2, rgba + 3, thread, pool, false, false); + if (!hasrgb) { + rgba[0] = intensity; + rgba[1] = intensity; + rgba[2] = intensity; + rgba[3] = 1.0f; + } + + if (convert_to_linear) + IMB_colormanagement_colorspace_to_scene_linear_v3(rgba, colorspace); + + linearrgb_to_srgb_v3_v3(rgba, rgba); + + CLAMP(rgba[0], 0.0f, 1.0f); + CLAMP(rgba[1], 0.0f, 1.0f); + CLAMP(rgba[2], 0.0f, 1.0f); + CLAMP(rgba[3], 0.0f, 1.0f); } void paint_stroke_operator_properties(wmOperatorType *ot) { - static const EnumPropertyItem stroke_mode_items[] = { - {BRUSH_STROKE_NORMAL, "NORMAL", 0, "Regular", "Apply brush normally"}, - {BRUSH_STROKE_INVERT, "INVERT", 0, "Invert", "Invert action of brush for duration of stroke"}, - {BRUSH_STROKE_SMOOTH, "SMOOTH", 0, "Smooth", "Switch brush to smooth mode for duration of stroke"}, - {0}, - }; - - PropertyRNA *prop; - - prop = RNA_def_collection_runtime(ot->srna, "stroke", &RNA_OperatorStrokeElement, "Stroke", ""); - RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE); - - RNA_def_enum(ot->srna, "mode", stroke_mode_items, BRUSH_STROKE_NORMAL, - "Stroke Mode", - "Action taken when a paint stroke is made"); - + static const EnumPropertyItem stroke_mode_items[] = { + {BRUSH_STROKE_NORMAL, "NORMAL", 0, "Regular", "Apply brush normally"}, + {BRUSH_STROKE_INVERT, + "INVERT", + 0, + "Invert", + "Invert action of brush for duration of stroke"}, + {BRUSH_STROKE_SMOOTH, + "SMOOTH", + 0, + "Smooth", + "Switch brush to smooth mode for duration of stroke"}, + {0}, + }; + + PropertyRNA *prop; + + prop = RNA_def_collection_runtime(ot->srna, "stroke", &RNA_OperatorStrokeElement, "Stroke", ""); + RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE); + + RNA_def_enum(ot->srna, + "mode", + stroke_mode_items, + BRUSH_STROKE_NORMAL, + "Stroke Mode", + "Action taken when a paint stroke is made"); } /* 3D Paint */ static void imapaint_project(float matrix[4][4], const float co[3], float pco[4]) { - copy_v3_v3(pco, co); - pco[3] = 1.0f; + copy_v3_v3(pco, co); + pco[3] = 1.0f; - mul_m4_v4(matrix, pco); + mul_m4_v4(matrix, pco); } -static void imapaint_tri_weights( - float matrix[4][4], GLint view[4], - const float v1[3], const float v2[3], const float v3[3], - const float co[2], float w[3]) +static void imapaint_tri_weights(float matrix[4][4], + GLint view[4], + const float v1[3], + const float v2[3], + const float v3[3], + const float co[2], + float w[3]) { - float pv1[4], pv2[4], pv3[4], h[3], divw; - float wmat[3][3], invwmat[3][3]; - - /* compute barycentric coordinates */ - - /* project the verts */ - imapaint_project(matrix, v1, pv1); - imapaint_project(matrix, v2, pv2); - imapaint_project(matrix, v3, pv3); - - /* do inverse view mapping, see gluProject man page */ - h[0] = (co[0] - view[0]) * 2.0f / view[2] - 1.0f; - h[1] = (co[1] - view[1]) * 2.0f / view[3] - 1.0f; - h[2] = 1.0f; - - /* solve for (w1,w2,w3)/perspdiv in: - * h * perspdiv = Project * Model * (w1 * v1 + w2 * v2 + w3 * v3) */ - - wmat[0][0] = pv1[0]; wmat[1][0] = pv2[0]; wmat[2][0] = pv3[0]; - wmat[0][1] = pv1[1]; wmat[1][1] = pv2[1]; wmat[2][1] = pv3[1]; - wmat[0][2] = pv1[3]; wmat[1][2] = pv2[3]; wmat[2][2] = pv3[3]; - - invert_m3_m3(invwmat, wmat); - mul_m3_v3(invwmat, h); - - copy_v3_v3(w, h); - - /* w is still divided by perspdiv, make it sum to one */ - divw = w[0] + w[1] + w[2]; - if (divw != 0.0f) { - mul_v3_fl(w, 1.0f / divw); - } + float pv1[4], pv2[4], pv3[4], h[3], divw; + float wmat[3][3], invwmat[3][3]; + + /* compute barycentric coordinates */ + + /* project the verts */ + imapaint_project(matrix, v1, pv1); + imapaint_project(matrix, v2, pv2); + imapaint_project(matrix, v3, pv3); + + /* do inverse view mapping, see gluProject man page */ + h[0] = (co[0] - view[0]) * 2.0f / view[2] - 1.0f; + h[1] = (co[1] - view[1]) * 2.0f / view[3] - 1.0f; + h[2] = 1.0f; + + /* solve for (w1,w2,w3)/perspdiv in: + * h * perspdiv = Project * Model * (w1 * v1 + w2 * v2 + w3 * v3) */ + + wmat[0][0] = pv1[0]; + wmat[1][0] = pv2[0]; + wmat[2][0] = pv3[0]; + wmat[0][1] = pv1[1]; + wmat[1][1] = pv2[1]; + wmat[2][1] = pv3[1]; + wmat[0][2] = pv1[3]; + wmat[1][2] = pv2[3]; + wmat[2][2] = pv3[3]; + + invert_m3_m3(invwmat, wmat); + mul_m3_v3(invwmat, h); + + copy_v3_v3(w, h); + + /* w is still divided by perspdiv, make it sum to one */ + divw = w[0] + w[1] + w[2]; + if (divw != 0.0f) { + mul_v3_fl(w, 1.0f / divw); + } } /* compute uv coordinates of mouse in face */ -static void imapaint_pick_uv(Mesh *me_eval, Scene *scene, Object *ob_eval, unsigned int faceindex, const int xy[2], float uv[2]) +static void imapaint_pick_uv(Mesh *me_eval, + Scene *scene, + Object *ob_eval, + unsigned int faceindex, + const int xy[2], + float uv[2]) { - int i, findex; - float p[2], w[3], absw, minabsw; - float matrix[4][4], proj[4][4]; - GLint view[4]; - const eImagePaintMode mode = scene->toolsettings->imapaint.mode; - - const MLoopTri *lt = BKE_mesh_runtime_looptri_ensure(me_eval); - const int tottri = me_eval->runtime.looptris.len; - - const MVert *mvert = me_eval->mvert; - const MPoly *mpoly = me_eval->mpoly; - const MLoop *mloop = me_eval->mloop; - const int *index_mp_to_orig = CustomData_get_layer(&me_eval->pdata, CD_ORIGINDEX); - - /* get the needed opengl matrices */ - GPU_viewport_size_get_i(view); - GPU_matrix_model_view_get(matrix); - GPU_matrix_projection_get(proj); - view[0] = view[1] = 0; - mul_m4_m4m4(matrix, matrix, ob_eval->obmat); - mul_m4_m4m4(matrix, proj, matrix); - - minabsw = 1e10; - uv[0] = uv[1] = 0.0; - - /* test all faces in the derivedmesh with the original index of the picked face */ - /* face means poly here, not triangle, indeed */ - for (i = 0; i < tottri; i++, lt++) { - findex = index_mp_to_orig ? index_mp_to_orig[lt->poly] : lt->poly; - - if (findex == faceindex) { - const MLoopUV *mloopuv; - const MPoly *mp = &mpoly[lt->poly]; - const MLoopUV *tri_uv[3]; - float tri_co[3][3]; - - for (int j = 3; j--; ) { - copy_v3_v3(tri_co[j], mvert[mloop[lt->tri[j]].v].co); - } - - if (mode == IMAGEPAINT_MODE_MATERIAL) { - const Material *ma; - const TexPaintSlot *slot; - - ma = give_current_material(ob_eval, mp->mat_nr + 1); - slot = &ma->texpaintslot[ma->paint_active_slot]; - - if (!(slot && slot->uvname && - (mloopuv = CustomData_get_layer_named(&me_eval->ldata, CD_MLOOPUV, slot->uvname)))) - { - mloopuv = CustomData_get_layer(&me_eval->ldata, CD_MLOOPUV); - } - } - else { - mloopuv = CustomData_get_layer(&me_eval->ldata, CD_MLOOPUV); - } - - tri_uv[0] = &mloopuv[lt->tri[0]]; - tri_uv[1] = &mloopuv[lt->tri[1]]; - tri_uv[2] = &mloopuv[lt->tri[2]]; - - p[0] = xy[0]; - p[1] = xy[1]; - - imapaint_tri_weights(matrix, view, UNPACK3(tri_co), p, w); - absw = fabsf(w[0]) + fabsf(w[1]) + fabsf(w[2]); - if (absw < minabsw) { - uv[0] = tri_uv[0]->uv[0] * w[0] + tri_uv[1]->uv[0] * w[1] + tri_uv[2]->uv[0] * w[2]; - uv[1] = tri_uv[0]->uv[1] * w[0] + tri_uv[1]->uv[1] * w[1] + tri_uv[2]->uv[1] * w[2]; - minabsw = absw; - } - } - } + int i, findex; + float p[2], w[3], absw, minabsw; + float matrix[4][4], proj[4][4]; + GLint view[4]; + const eImagePaintMode mode = scene->toolsettings->imapaint.mode; + + const MLoopTri *lt = BKE_mesh_runtime_looptri_ensure(me_eval); + const int tottri = me_eval->runtime.looptris.len; + + const MVert *mvert = me_eval->mvert; + const MPoly *mpoly = me_eval->mpoly; + const MLoop *mloop = me_eval->mloop; + const int *index_mp_to_orig = CustomData_get_layer(&me_eval->pdata, CD_ORIGINDEX); + + /* get the needed opengl matrices */ + GPU_viewport_size_get_i(view); + GPU_matrix_model_view_get(matrix); + GPU_matrix_projection_get(proj); + view[0] = view[1] = 0; + mul_m4_m4m4(matrix, matrix, ob_eval->obmat); + mul_m4_m4m4(matrix, proj, matrix); + + minabsw = 1e10; + uv[0] = uv[1] = 0.0; + + /* test all faces in the derivedmesh with the original index of the picked face */ + /* face means poly here, not triangle, indeed */ + for (i = 0; i < tottri; i++, lt++) { + findex = index_mp_to_orig ? index_mp_to_orig[lt->poly] : lt->poly; + + if (findex == faceindex) { + const MLoopUV *mloopuv; + const MPoly *mp = &mpoly[lt->poly]; + const MLoopUV *tri_uv[3]; + float tri_co[3][3]; + + for (int j = 3; j--;) { + copy_v3_v3(tri_co[j], mvert[mloop[lt->tri[j]].v].co); + } + + if (mode == IMAGEPAINT_MODE_MATERIAL) { + const Material *ma; + const TexPaintSlot *slot; + + ma = give_current_material(ob_eval, mp->mat_nr + 1); + slot = &ma->texpaintslot[ma->paint_active_slot]; + + if (!(slot && slot->uvname && + (mloopuv = CustomData_get_layer_named(&me_eval->ldata, CD_MLOOPUV, slot->uvname)))) { + mloopuv = CustomData_get_layer(&me_eval->ldata, CD_MLOOPUV); + } + } + else { + mloopuv = CustomData_get_layer(&me_eval->ldata, CD_MLOOPUV); + } + + tri_uv[0] = &mloopuv[lt->tri[0]]; + tri_uv[1] = &mloopuv[lt->tri[1]]; + tri_uv[2] = &mloopuv[lt->tri[2]]; + + p[0] = xy[0]; + p[1] = xy[1]; + + imapaint_tri_weights(matrix, view, UNPACK3(tri_co), p, w); + absw = fabsf(w[0]) + fabsf(w[1]) + fabsf(w[2]); + if (absw < minabsw) { + uv[0] = tri_uv[0]->uv[0] * w[0] + tri_uv[1]->uv[0] * w[1] + tri_uv[2]->uv[0] * w[2]; + uv[1] = tri_uv[0]->uv[1] * w[0] + tri_uv[1]->uv[1] * w[1] + tri_uv[2]->uv[1] * w[2]; + minabsw = absw; + } + } + } } /* returns 0 if not found, otherwise 1 */ -static int imapaint_pick_face( - ViewContext *vc, const int mval[2], - unsigned int *r_index, unsigned int totpoly) +static int imapaint_pick_face(ViewContext *vc, + const int mval[2], + unsigned int *r_index, + unsigned int totpoly) { - if (totpoly == 0) - return 0; + if (totpoly == 0) + return 0; - /* sample only on the exact position */ - *r_index = ED_view3d_select_id_sample(vc, mval[0], mval[1]); + /* sample only on the exact position */ + *r_index = ED_view3d_select_id_sample(vc, mval[0], mval[1]); - if ((*r_index) == 0 || (*r_index) > (unsigned int)totpoly) { - return 0; - } + if ((*r_index) == 0 || (*r_index) > (unsigned int)totpoly) { + return 0; + } - (*r_index)--; + (*r_index)--; - return 1; + return 1; } - static Image *imapaint_face_image(Object *ob, Mesh *me, int face_index) { - Image *ima; - MPoly *mp = me->mpoly + face_index; - Material *ma = give_current_material(ob, mp->mat_nr + 1); - ima = ma && ma->texpaintslot ? ma->texpaintslot[ma->paint_active_slot].ima : NULL; + Image *ima; + MPoly *mp = me->mpoly + face_index; + Material *ma = give_current_material(ob, mp->mat_nr + 1); + ima = ma && ma->texpaintslot ? ma->texpaintslot[ma->paint_active_slot].ima : NULL; - return ima; + return ima; } /* Uses symm to selectively flip any axis of a coordinate. */ void flip_v3_v3(float out[3], const float in[3], const char symm) { - if (symm & PAINT_SYMM_X) - out[0] = -in[0]; - else - out[0] = in[0]; - if (symm & PAINT_SYMM_Y) - out[1] = -in[1]; - else - out[1] = in[1]; - if (symm & PAINT_SYMM_Z) - out[2] = -in[2]; - else - out[2] = in[2]; + if (symm & PAINT_SYMM_X) + out[0] = -in[0]; + else + out[0] = in[0]; + if (symm & PAINT_SYMM_Y) + out[1] = -in[1]; + else + out[1] = in[1]; + if (symm & PAINT_SYMM_Z) + out[2] = -in[2]; + else + out[2] = in[2]; } void flip_qt_qt(float out[4], const float in[4], const char symm) { - float axis[3], angle; - - quat_to_axis_angle(axis, &angle, in); - normalize_v3(axis); - - if (symm & PAINT_SYMM_X) { - axis[0] *= -1.0f; - angle *= -1.0f; - } - if (symm & PAINT_SYMM_Y) { - axis[1] *= -1.0f; - angle *= -1.0f; - } - if (symm & PAINT_SYMM_Z) { - axis[2] *= -1.0f; - angle *= -1.0f; - } - - axis_angle_normalized_to_quat(out, axis, angle); + float axis[3], angle; + + quat_to_axis_angle(axis, &angle, in); + normalize_v3(axis); + + if (symm & PAINT_SYMM_X) { + axis[0] *= -1.0f; + angle *= -1.0f; + } + if (symm & PAINT_SYMM_Y) { + axis[1] *= -1.0f; + angle *= -1.0f; + } + if (symm & PAINT_SYMM_Z) { + axis[2] *= -1.0f; + angle *= -1.0f; + } + + axis_angle_normalized_to_quat(out, axis, angle); } /* used for both 3d view and image window */ -void paint_sample_color(bContext *C, ARegion *ar, int x, int y, bool texpaint_proj, bool use_palette) +void paint_sample_color( + bContext *C, ARegion *ar, int x, int y, bool texpaint_proj, bool use_palette) { - Scene *scene = CTX_data_scene(C); - Depsgraph *depsgraph = CTX_data_depsgraph(C); - Paint *paint = BKE_paint_get_active_from_context(C); - Palette *palette = BKE_paint_palette(paint); - PaletteColor *color = NULL; - Brush *br = BKE_paint_brush(BKE_paint_get_active_from_context(C)); - unsigned int col; - const unsigned char *cp; - - CLAMP(x, 0, ar->winx); - CLAMP(y, 0, ar->winy); - - if (use_palette) { - if (!palette) { - palette = BKE_palette_add(CTX_data_main(C), "Palette"); - BKE_paint_palette_set(paint, palette); - } - - color = BKE_palette_color_add(palette); - palette->active_color = BLI_listbase_count(&palette->colors) - 1; - } - - - if (CTX_wm_view3d(C) && texpaint_proj) { - /* first try getting a colour directly from the mesh faces if possible */ - ViewLayer *view_layer = CTX_data_view_layer(C); - Object *ob = OBACT(view_layer); - Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob); - bool sample_success = false; - ImagePaintSettings *imapaint = &scene->toolsettings->imapaint; - bool use_material = (imapaint->mode == IMAGEPAINT_MODE_MATERIAL); - - if (ob) { - CustomData_MeshMasks cddata_masks = CD_MASK_BAREMESH; - cddata_masks.pmask |= CD_MASK_ORIGINDEX; - Mesh *me = (Mesh *)ob->data; - Mesh *me_eval = mesh_get_eval_final(depsgraph, scene, ob_eval, &cddata_masks); - - ViewContext vc; - const int mval[2] = {x, y}; - unsigned int faceindex; - unsigned int totpoly = me->totpoly; - - if (CustomData_has_layer(&me_eval->ldata, CD_MLOOPUV)) { - ED_view3d_viewcontext_init(C, &vc); - - view3d_operator_needs_opengl(C); - - if (imapaint_pick_face(&vc, mval, &faceindex, totpoly)) { - Image *image; - - if (use_material) - image = imapaint_face_image(ob_eval, me_eval, faceindex); - else - image = imapaint->canvas; - - if (image) { - ImBuf *ibuf = BKE_image_acquire_ibuf(image, NULL, NULL); - if (ibuf && ibuf->rect) { - float uv[2]; - float u, v; - imapaint_pick_uv(me_eval, scene, ob_eval, faceindex, mval, uv); - sample_success = true; - - u = fmodf(uv[0], 1.0f); - v = fmodf(uv[1], 1.0f); - - if (u < 0.0f) u += 1.0f; - if (v < 0.0f) v += 1.0f; - - u = u * ibuf->x; - v = v * ibuf->y; - - if (ibuf->rect_float) { - float rgba_f[4]; - bilinear_interpolation_color_wrap(ibuf, NULL, rgba_f, u, v); - straight_to_premul_v4(rgba_f); - if (use_palette) { - linearrgb_to_srgb_v3_v3(color->rgb, rgba_f); - } - else { - linearrgb_to_srgb_v3_v3(rgba_f, rgba_f); - BKE_brush_color_set(scene, br, rgba_f); - } - } - else { - unsigned char rgba[4]; - bilinear_interpolation_color_wrap(ibuf, rgba, NULL, u, v); - if (use_palette) { - rgb_uchar_to_float(color->rgb, rgba); - } - else { - float rgba_f[3]; - rgb_uchar_to_float(rgba_f, rgba); - BKE_brush_color_set(scene, br, rgba_f); - } - } - } - - BKE_image_release_ibuf(image, ibuf, NULL); - } - } - } - } - - if (!sample_success) { - glReadBuffer(GL_FRONT); - glReadPixels(x + ar->winrct.xmin, y + ar->winrct.ymin, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &col); - glReadBuffer(GL_BACK); - } - else - return; - } - else { - glReadBuffer(GL_FRONT); - glReadPixels(x + ar->winrct.xmin, y + ar->winrct.ymin, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &col); - glReadBuffer(GL_BACK); - } - cp = (unsigned char *)&col; - - if (use_palette) { - rgb_uchar_to_float(color->rgb, cp); - } - else { - float rgba_f[3]; - rgb_uchar_to_float(rgba_f, cp); - BKE_brush_color_set(scene, br, rgba_f); - } + Scene *scene = CTX_data_scene(C); + Depsgraph *depsgraph = CTX_data_depsgraph(C); + Paint *paint = BKE_paint_get_active_from_context(C); + Palette *palette = BKE_paint_palette(paint); + PaletteColor *color = NULL; + Brush *br = BKE_paint_brush(BKE_paint_get_active_from_context(C)); + unsigned int col; + const unsigned char *cp; + + CLAMP(x, 0, ar->winx); + CLAMP(y, 0, ar->winy); + + if (use_palette) { + if (!palette) { + palette = BKE_palette_add(CTX_data_main(C), "Palette"); + BKE_paint_palette_set(paint, palette); + } + + color = BKE_palette_color_add(palette); + palette->active_color = BLI_listbase_count(&palette->colors) - 1; + } + + if (CTX_wm_view3d(C) && texpaint_proj) { + /* first try getting a colour directly from the mesh faces if possible */ + ViewLayer *view_layer = CTX_data_view_layer(C); + Object *ob = OBACT(view_layer); + Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob); + bool sample_success = false; + ImagePaintSettings *imapaint = &scene->toolsettings->imapaint; + bool use_material = (imapaint->mode == IMAGEPAINT_MODE_MATERIAL); + + if (ob) { + CustomData_MeshMasks cddata_masks = CD_MASK_BAREMESH; + cddata_masks.pmask |= CD_MASK_ORIGINDEX; + Mesh *me = (Mesh *)ob->data; + Mesh *me_eval = mesh_get_eval_final(depsgraph, scene, ob_eval, &cddata_masks); + + ViewContext vc; + const int mval[2] = {x, y}; + unsigned int faceindex; + unsigned int totpoly = me->totpoly; + + if (CustomData_has_layer(&me_eval->ldata, CD_MLOOPUV)) { + ED_view3d_viewcontext_init(C, &vc); + + view3d_operator_needs_opengl(C); + + if (imapaint_pick_face(&vc, mval, &faceindex, totpoly)) { + Image *image; + + if (use_material) + image = imapaint_face_image(ob_eval, me_eval, faceindex); + else + image = imapaint->canvas; + + if (image) { + ImBuf *ibuf = BKE_image_acquire_ibuf(image, NULL, NULL); + if (ibuf && ibuf->rect) { + float uv[2]; + float u, v; + imapaint_pick_uv(me_eval, scene, ob_eval, faceindex, mval, uv); + sample_success = true; + + u = fmodf(uv[0], 1.0f); + v = fmodf(uv[1], 1.0f); + + if (u < 0.0f) + u += 1.0f; + if (v < 0.0f) + v += 1.0f; + + u = u * ibuf->x; + v = v * ibuf->y; + + if (ibuf->rect_float) { + float rgba_f[4]; + bilinear_interpolation_color_wrap(ibuf, NULL, rgba_f, u, v); + straight_to_premul_v4(rgba_f); + if (use_palette) { + linearrgb_to_srgb_v3_v3(color->rgb, rgba_f); + } + else { + linearrgb_to_srgb_v3_v3(rgba_f, rgba_f); + BKE_brush_color_set(scene, br, rgba_f); + } + } + else { + unsigned char rgba[4]; + bilinear_interpolation_color_wrap(ibuf, rgba, NULL, u, v); + if (use_palette) { + rgb_uchar_to_float(color->rgb, rgba); + } + else { + float rgba_f[3]; + rgb_uchar_to_float(rgba_f, rgba); + BKE_brush_color_set(scene, br, rgba_f); + } + } + } + + BKE_image_release_ibuf(image, ibuf, NULL); + } + } + } + } + + if (!sample_success) { + glReadBuffer(GL_FRONT); + glReadPixels( + x + ar->winrct.xmin, y + ar->winrct.ymin, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &col); + glReadBuffer(GL_BACK); + } + else + return; + } + else { + glReadBuffer(GL_FRONT); + glReadPixels(x + ar->winrct.xmin, y + ar->winrct.ymin, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &col); + glReadBuffer(GL_BACK); + } + cp = (unsigned char *)&col; + + if (use_palette) { + rgb_uchar_to_float(color->rgb, cp); + } + else { + float rgba_f[3]; + rgb_uchar_to_float(rgba_f, cp); + BKE_brush_color_set(scene, br, rgba_f); + } } static int brush_curve_preset_exec(bContext *C, wmOperator *op) { - Brush *br = BKE_paint_brush(BKE_paint_get_active_from_context(C)); + Brush *br = BKE_paint_brush(BKE_paint_get_active_from_context(C)); - if (br) { - Scene *scene = CTX_data_scene(C); - ViewLayer *view_layer = CTX_data_view_layer(C); - BKE_brush_curve_preset(br, RNA_enum_get(op->ptr, "shape")); - BKE_paint_invalidate_cursor_overlay(scene, view_layer, br->curve); - } + if (br) { + Scene *scene = CTX_data_scene(C); + ViewLayer *view_layer = CTX_data_view_layer(C); + BKE_brush_curve_preset(br, RNA_enum_get(op->ptr, "shape")); + BKE_paint_invalidate_cursor_overlay(scene, view_layer, br->curve); + } - return OPERATOR_FINISHED; + return OPERATOR_FINISHED; } static bool brush_curve_preset_poll(bContext *C) { - Brush *br = BKE_paint_brush(BKE_paint_get_active_from_context(C)); + Brush *br = BKE_paint_brush(BKE_paint_get_active_from_context(C)); - return br && br->curve; + return br && br->curve; } void BRUSH_OT_curve_preset(wmOperatorType *ot) { - PropertyRNA *prop; - static const EnumPropertyItem prop_shape_items[] = { - {CURVE_PRESET_SHARP, "SHARP", 0, "Sharp", ""}, - {CURVE_PRESET_SMOOTH, "SMOOTH", 0, "Smooth", ""}, - {CURVE_PRESET_MAX, "MAX", 0, "Max", ""}, - {CURVE_PRESET_LINE, "LINE", 0, "Line", ""}, - {CURVE_PRESET_ROUND, "ROUND", 0, "Round", ""}, - {CURVE_PRESET_ROOT, "ROOT", 0, "Root", ""}, - {0, NULL, 0, NULL, NULL}, - }; - - ot->name = "Preset"; - ot->description = "Set brush shape"; - ot->idname = "BRUSH_OT_curve_preset"; - - ot->exec = brush_curve_preset_exec; - ot->poll = brush_curve_preset_poll; - - prop = RNA_def_enum(ot->srna, "shape", prop_shape_items, CURVE_PRESET_SMOOTH, "Mode", ""); - RNA_def_property_translation_context(prop, BLT_I18NCONTEXT_ID_CURVE); /* Abusing id_curve :/ */ + PropertyRNA *prop; + static const EnumPropertyItem prop_shape_items[] = { + {CURVE_PRESET_SHARP, "SHARP", 0, "Sharp", ""}, + {CURVE_PRESET_SMOOTH, "SMOOTH", 0, "Smooth", ""}, + {CURVE_PRESET_MAX, "MAX", 0, "Max", ""}, + {CURVE_PRESET_LINE, "LINE", 0, "Line", ""}, + {CURVE_PRESET_ROUND, "ROUND", 0, "Round", ""}, + {CURVE_PRESET_ROOT, "ROOT", 0, "Root", ""}, + {0, NULL, 0, NULL, NULL}, + }; + + ot->name = "Preset"; + ot->description = "Set brush shape"; + ot->idname = "BRUSH_OT_curve_preset"; + + ot->exec = brush_curve_preset_exec; + ot->poll = brush_curve_preset_poll; + + prop = RNA_def_enum(ot->srna, "shape", prop_shape_items, CURVE_PRESET_SMOOTH, "Mode", ""); + RNA_def_property_translation_context(prop, BLT_I18NCONTEXT_ID_CURVE); /* Abusing id_curve :/ */ } - /* face-select ops */ static int paint_select_linked_exec(bContext *C, wmOperator *UNUSED(op)) { - paintface_select_linked(C, CTX_data_active_object(C), NULL, true); - ED_region_tag_redraw(CTX_wm_region(C)); - return OPERATOR_FINISHED; + paintface_select_linked(C, CTX_data_active_object(C), NULL, true); + ED_region_tag_redraw(CTX_wm_region(C)); + return OPERATOR_FINISHED; } void PAINT_OT_face_select_linked(wmOperatorType *ot) { - ot->name = "Select Linked"; - ot->description = "Select linked faces"; - ot->idname = "PAINT_OT_face_select_linked"; + ot->name = "Select Linked"; + ot->description = "Select linked faces"; + ot->idname = "PAINT_OT_face_select_linked"; - ot->exec = paint_select_linked_exec; - ot->poll = facemask_paint_poll; + ot->exec = paint_select_linked_exec; + ot->poll = facemask_paint_poll; - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } static int paint_select_linked_pick_invoke(bContext *C, wmOperator *op, const wmEvent *event) { - const bool select = !RNA_boolean_get(op->ptr, "deselect"); - view3d_operator_needs_opengl(C); - paintface_select_linked(C, CTX_data_active_object(C), event->mval, select); - ED_region_tag_redraw(CTX_wm_region(C)); - return OPERATOR_FINISHED; + const bool select = !RNA_boolean_get(op->ptr, "deselect"); + view3d_operator_needs_opengl(C); + paintface_select_linked(C, CTX_data_active_object(C), event->mval, select); + ED_region_tag_redraw(CTX_wm_region(C)); + return OPERATOR_FINISHED; } void PAINT_OT_face_select_linked_pick(wmOperatorType *ot) { - ot->name = "Select Linked Pick"; - ot->description = "Select linked faces under the cursor"; - ot->idname = "PAINT_OT_face_select_linked_pick"; + ot->name = "Select Linked Pick"; + ot->description = "Select linked faces under the cursor"; + ot->idname = "PAINT_OT_face_select_linked_pick"; - ot->invoke = paint_select_linked_pick_invoke; - ot->poll = facemask_paint_poll; + ot->invoke = paint_select_linked_pick_invoke; + ot->poll = facemask_paint_poll; - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - RNA_def_boolean(ot->srna, "deselect", 0, "Deselect", "Deselect rather than select items"); + RNA_def_boolean(ot->srna, "deselect", 0, "Deselect", "Deselect rather than select items"); } - static int face_select_all_exec(bContext *C, wmOperator *op) { - Object *ob = CTX_data_active_object(C); - if (paintface_deselect_all_visible(C, ob, RNA_enum_get(op->ptr, "action"), true)) { - ED_region_tag_redraw(CTX_wm_region(C)); - return OPERATOR_FINISHED; - } - return OPERATOR_CANCELLED; + Object *ob = CTX_data_active_object(C); + if (paintface_deselect_all_visible(C, ob, RNA_enum_get(op->ptr, "action"), true)) { + ED_region_tag_redraw(CTX_wm_region(C)); + return OPERATOR_FINISHED; + } + return OPERATOR_CANCELLED; } - void PAINT_OT_face_select_all(wmOperatorType *ot) { - ot->name = "(De)select All"; - ot->description = "Change selection for all faces"; - ot->idname = "PAINT_OT_face_select_all"; + ot->name = "(De)select All"; + ot->description = "Change selection for all faces"; + ot->idname = "PAINT_OT_face_select_all"; - ot->exec = face_select_all_exec; - ot->poll = facemask_paint_poll; + ot->exec = face_select_all_exec; + ot->poll = facemask_paint_poll; - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - WM_operator_properties_select_all(ot); + WM_operator_properties_select_all(ot); } - static int vert_select_all_exec(bContext *C, wmOperator *op) { - Object *ob = CTX_data_active_object(C); - paintvert_deselect_all_visible(ob, RNA_enum_get(op->ptr, "action"), true); - paintvert_tag_select_update(C, ob); - ED_region_tag_redraw(CTX_wm_region(C)); - return OPERATOR_FINISHED; + Object *ob = CTX_data_active_object(C); + paintvert_deselect_all_visible(ob, RNA_enum_get(op->ptr, "action"), true); + paintvert_tag_select_update(C, ob); + ED_region_tag_redraw(CTX_wm_region(C)); + return OPERATOR_FINISHED; } - void PAINT_OT_vert_select_all(wmOperatorType *ot) { - ot->name = "(De)select All"; - ot->description = "Change selection for all vertices"; - ot->idname = "PAINT_OT_vert_select_all"; + ot->name = "(De)select All"; + ot->description = "Change selection for all vertices"; + ot->idname = "PAINT_OT_vert_select_all"; - ot->exec = vert_select_all_exec; - ot->poll = vert_paint_poll; + ot->exec = vert_select_all_exec; + ot->poll = vert_paint_poll; - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - WM_operator_properties_select_all(ot); + WM_operator_properties_select_all(ot); } - static int vert_select_ungrouped_exec(bContext *C, wmOperator *op) { - Object *ob = CTX_data_active_object(C); - Mesh *me = ob->data; - - if (BLI_listbase_is_empty(&ob->defbase) || (me->dvert == NULL)) { - BKE_report(op->reports, RPT_ERROR, "No weights/vertex groups on object"); - return OPERATOR_CANCELLED; - } - - paintvert_select_ungrouped(ob, RNA_boolean_get(op->ptr, "extend"), true); - paintvert_tag_select_update(C, ob); - ED_region_tag_redraw(CTX_wm_region(C)); - return OPERATOR_FINISHED; + Object *ob = CTX_data_active_object(C); + Mesh *me = ob->data; + + if (BLI_listbase_is_empty(&ob->defbase) || (me->dvert == NULL)) { + BKE_report(op->reports, RPT_ERROR, "No weights/vertex groups on object"); + return OPERATOR_CANCELLED; + } + + paintvert_select_ungrouped(ob, RNA_boolean_get(op->ptr, "extend"), true); + paintvert_tag_select_update(C, ob); + ED_region_tag_redraw(CTX_wm_region(C)); + return OPERATOR_FINISHED; } void PAINT_OT_vert_select_ungrouped(wmOperatorType *ot) { - /* identifiers */ - ot->name = "Select Ungrouped"; - ot->idname = "PAINT_OT_vert_select_ungrouped"; - ot->description = "Select vertices without a group"; + /* identifiers */ + ot->name = "Select Ungrouped"; + ot->idname = "PAINT_OT_vert_select_ungrouped"; + ot->description = "Select vertices without a group"; - /* api callbacks */ - ot->exec = vert_select_ungrouped_exec; - ot->poll = vert_paint_poll; + /* api callbacks */ + ot->exec = vert_select_ungrouped_exec; + ot->poll = vert_paint_poll; - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - RNA_def_boolean(ot->srna, "extend", false, "Extend", "Extend the selection"); + RNA_def_boolean(ot->srna, "extend", false, "Extend", "Extend the selection"); } static int face_select_hide_exec(bContext *C, wmOperator *op) { - const bool unselected = RNA_boolean_get(op->ptr, "unselected"); - Object *ob = CTX_data_active_object(C); - paintface_hide(C, ob, unselected); - ED_region_tag_redraw(CTX_wm_region(C)); - return OPERATOR_FINISHED; + const bool unselected = RNA_boolean_get(op->ptr, "unselected"); + Object *ob = CTX_data_active_object(C); + paintface_hide(C, ob, unselected); + ED_region_tag_redraw(CTX_wm_region(C)); + return OPERATOR_FINISHED; } void PAINT_OT_face_select_hide(wmOperatorType *ot) { - ot->name = "Face Select Hide"; - ot->description = "Hide selected faces"; - ot->idname = "PAINT_OT_face_select_hide"; + ot->name = "Face Select Hide"; + ot->description = "Hide selected faces"; + ot->idname = "PAINT_OT_face_select_hide"; - ot->exec = face_select_hide_exec; - ot->poll = facemask_paint_poll; + ot->exec = face_select_hide_exec; + ot->poll = facemask_paint_poll; - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - RNA_def_boolean(ot->srna, "unselected", 0, "Unselected", "Hide unselected rather than selected objects"); + RNA_def_boolean( + ot->srna, "unselected", 0, "Unselected", "Hide unselected rather than selected objects"); } static int face_select_reveal_exec(bContext *C, wmOperator *op) { - const bool select = RNA_boolean_get(op->ptr, "select"); - Object *ob = CTX_data_active_object(C); - paintface_reveal(C, ob, select); - ED_region_tag_redraw(CTX_wm_region(C)); - return OPERATOR_FINISHED; + const bool select = RNA_boolean_get(op->ptr, "select"); + Object *ob = CTX_data_active_object(C); + paintface_reveal(C, ob, select); + ED_region_tag_redraw(CTX_wm_region(C)); + return OPERATOR_FINISHED; } void PAINT_OT_face_select_reveal(wmOperatorType *ot) { - ot->name = "Face Select Reveal"; - ot->description = "Reveal hidden faces"; - ot->idname = "PAINT_OT_face_select_reveal"; + ot->name = "Face Select Reveal"; + ot->description = "Reveal hidden faces"; + ot->idname = "PAINT_OT_face_select_reveal"; - ot->exec = face_select_reveal_exec; - ot->poll = facemask_paint_poll; + ot->exec = face_select_reveal_exec; + ot->poll = facemask_paint_poll; - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - RNA_def_boolean(ot->srna, "select", true, "Select", ""); + RNA_def_boolean(ot->srna, "select", true, "Select", ""); } |