diff options
Diffstat (limited to 'source/blender/editors/sculpt_paint/paint_utils.c')
-rw-r--r-- | source/blender/editors/sculpt_paint/paint_utils.c | 84 |
1 files changed, 40 insertions, 44 deletions
diff --git a/source/blender/editors/sculpt_paint/paint_utils.c b/source/blender/editors/sculpt_paint/paint_utils.c index 77c9dcf8ac6..80c4d4099a2 100644 --- a/source/blender/editors/sculpt_paint/paint_utils.c +++ b/source/blender/editors/sculpt_paint/paint_utils.c @@ -50,17 +50,21 @@ #include "BKE_brush.h" #include "BKE_context.h" -#include "BKE_DerivedMesh.h" +#include "BKE_customdata.h" #include "BKE_image.h" #include "BKE_material.h" +#include "BKE_object.h" #include "BKE_paint.h" #include "BKE_report.h" +#include "DEG_depsgraph.h" +#include "DEG_depsgraph_query.h" + #include "RNA_access.h" #include "RNA_define.h" -#include "BIF_gl.h" -#include "BIF_glutil.h" +#include "GPU_glew.h" +#include "GPU_matrix.h" #include "IMB_colormanagement.h" #include "IMB_imbuf_types.h" @@ -130,17 +134,12 @@ bool paint_convert_bb_to_rect(rcti *rect, * 2D screens-space bounding box into four 3D planes) */ void paint_calc_redraw_planes(float planes[4][4], const ARegion *ar, - RegionView3D *rv3d, Object *ob, const rcti *screen_rect) { BoundBox bb; - bglMats mats; rcti rect; - memset(&bb, 0, sizeof(BoundBox)); - view3d_get_transformation(ar, rv3d, ob, &mats); - /* use some extra space just in case */ rect = *screen_rect; rect.xmin -= 2; @@ -148,7 +147,7 @@ void paint_calc_redraw_planes(float planes[4][4], rect.ymin -= 2; rect.ymax += 2; - ED_view3d_clipping_calc(&bb, planes, &mats, &rect); + ED_view3d_clipping_calc(&bb, planes, ar, ob, &rect); negate_m4(planes); } @@ -277,26 +276,26 @@ static void imapaint_tri_weights(float matrix[4][4], GLint view[4], } /* compute uv coordinates of mouse in face */ -static void imapaint_pick_uv(Scene *scene, Object *ob, 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]) { - DerivedMesh *dm = mesh_get_derived_final(scene, ob, CD_MASK_BAREMESH); - const int tottri = dm->getNumLoopTri(dm); + const int tottri = me_eval->runtime.looptris.len; 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 = dm->getLoopTriArray(dm); - const MPoly *mpoly = dm->getPolyArray(dm); - const MLoop *mloop = dm->getLoopArray(dm); - const int *index_mp_to_orig = dm->getPolyDataArray(dm, CD_ORIGINDEX); + const MLoopTri *lt = me_eval->runtime.looptris.array; + 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 */ glGetIntegerv(GL_VIEWPORT, view); - glGetFloatv(GL_MODELVIEW_MATRIX, (float *)matrix); - glGetFloatv(GL_PROJECTION_MATRIX, (float *)proj); + gpuGetModelViewMatrix(matrix); + gpuGetProjectionMatrix(proj); view[0] = view[1] = 0; - mul_m4_m4m4(matrix, matrix, ob->obmat); + mul_m4_m4m4(matrix, matrix, ob_eval->obmat); mul_m4_m4m4(matrix, proj, matrix); minabsw = 1e10; @@ -313,25 +312,25 @@ static void imapaint_pick_uv(Scene *scene, Object *ob, unsigned int faceindex, c const MLoopUV *tri_uv[3]; float tri_co[3][3]; - dm->getVertCo(dm, mloop[lt->tri[0]].v, tri_co[0]); - dm->getVertCo(dm, mloop[lt->tri[1]].v, tri_co[1]); - dm->getVertCo(dm, mloop[lt->tri[2]].v, tri_co[2]); + 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 = dm->mat[mp->mat_nr]; + ma = give_current_material(ob_eval, mp->mat_nr); slot = &ma->texpaintslot[ma->paint_active_slot]; if (!(slot && slot->uvname && - (mloopuv = CustomData_get_layer_named(&dm->loopData, CD_MLOOPUV, slot->uvname)))) + (mloopuv = CustomData_get_layer_named(&me_eval->ldata, CD_MLOOPUV, slot->uvname)))) { - mloopuv = CustomData_get_layer(&dm->loopData, CD_MLOOPUV); + mloopuv = CustomData_get_layer(&me_eval->ldata, CD_MLOOPUV); } } else { - mloopuv = CustomData_get_layer(&dm->loopData, CD_MLOOPUV); + mloopuv = CustomData_get_layer(&me_eval->ldata, CD_MLOOPUV); } tri_uv[0] = &mloopuv[lt->tri[0]]; @@ -350,12 +349,12 @@ static void imapaint_pick_uv(Scene *scene, Object *ob, unsigned int faceindex, c } } } - - dm->release(dm); } /* 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; @@ -427,6 +426,7 @@ void flip_qt_qt(float out[4], const float in[4], const char symm) 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; @@ -450,21 +450,23 @@ void paint_sample_color(bContext *C, ARegion *ar, int x, int y, bool texpaint_pr if (CTX_wm_view3d(C) && texpaint_proj) { /* first try getting a colour directly from the mesh faces if possible */ - Object *ob = OBACT; + 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) { Mesh *me = (Mesh *)ob->data; - DerivedMesh *dm = mesh_get_derived_final(scene, ob, CD_MASK_BAREMESH); + Mesh *me_eval = BKE_object_get_evaluated_mesh(depsgraph, ob); /* Or shall we just do ob_eval->mesh_eval ? */ ViewContext vc; const int mval[2] = {x, y}; unsigned int faceindex; unsigned int totpoly = me->totpoly; - if (dm->getLoopDataArray(dm, CD_MLOOPUV)) { + if (CustomData_has_layer(&me_eval->ldata, CD_MLOOPUV)) { ED_view3d_viewcontext_init(C, &vc); view3d_operator_needs_opengl(C); @@ -473,7 +475,7 @@ void paint_sample_color(bContext *C, ARegion *ar, int x, int y, bool texpaint_pr Image *image; if (use_material) - image = imapaint_face_image(ob, me, faceindex); + image = imapaint_face_image(ob_eval, me_eval, faceindex); else image = imapaint->canvas; @@ -482,7 +484,7 @@ void paint_sample_color(bContext *C, ARegion *ar, int x, int y, bool texpaint_pr if (ibuf && ibuf->rect) { float uv[2]; float u, v; - imapaint_pick_uv(scene, ob, faceindex, mval, uv); + imapaint_pick_uv(me_eval, scene, ob_eval, faceindex, mval, uv); sample_success = true; u = fmodf(uv[0], 1.0f); @@ -496,10 +498,7 @@ void paint_sample_color(bContext *C, ARegion *ar, int x, int y, bool texpaint_pr if (ibuf->rect_float) { float rgba_f[4]; - if (U.gameflags & USER_DISABLE_MIPMAP) - nearest_interpolation_color_wrap(ibuf, NULL, rgba_f, u, v); - else - bilinear_interpolation_color_wrap(ibuf, NULL, rgba_f, u, v); + 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); @@ -511,10 +510,7 @@ void paint_sample_color(bContext *C, ARegion *ar, int x, int y, bool texpaint_pr } else { unsigned char rgba[4]; - if (U.gameflags & USER_DISABLE_MIPMAP) - nearest_interpolation_color_wrap(ibuf, rgba, NULL, u, v); - else - bilinear_interpolation_color_wrap(ibuf, rgba, NULL, u, v); + bilinear_interpolation_color_wrap(ibuf, rgba, NULL, u, v); if (use_palette) { rgb_uchar_to_float(color->rgb, rgba); } @@ -530,7 +526,6 @@ void paint_sample_color(bContext *C, ARegion *ar, int x, int y, bool texpaint_pr } } } - dm->release(dm); } if (!sample_success) { @@ -564,8 +559,9 @@ static int brush_curve_preset_exec(bContext *C, wmOperator *op) 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, br->curve); + BKE_paint_invalidate_cursor_overlay(scene, view_layer, br->curve); } return OPERATOR_FINISHED; |