Merge branch 'master' into blender2.8
[blender.git] / source / blender / editors / sculpt_paint / paint_utils.c
index 77c9dcf..80c4d40 100644 (file)
 
 #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;