Merge branch 'master' into blender2.8
[blender.git] / source / blender / editors / mesh / editmesh_loopcut.c
index b9192f58a1b7e236c887abc6bdd45aa1de28aba8..3ab56f2ebcbcc25c6f9ce9ca27e1f2ae5fcfd881 100644 (file)
@@ -45,7 +45,8 @@
 #include "BKE_DerivedMesh.h"
 #include "BKE_unit.h"
 
-#include "BIF_gl.h"
+#include "GPU_immediate.h"
+#include "GPU_matrix.h"
 
 #include "UI_interface.h"
 
@@ -62,6 +63,8 @@
 #include "WM_api.h"
 #include "WM_types.h"
 
+#include "DEG_depsgraph.h"
+
 #include "mesh_intern.h"  /* own include */
 
 #define SUBD_SMOOTH_MAX 4.0f
@@ -104,27 +107,41 @@ static void ringsel_draw(const bContext *C, ARegion *UNUSED(ar), void *arg)
                if (v3d && v3d->zbuf)
                        glDisable(GL_DEPTH_TEST);
 
-               glPushMatrix();
-               glMultMatrixf(lcd->ob->obmat);
+               gpuPushMatrix();
+               gpuMultMatrix(lcd->ob->obmat);
+
+               unsigned int pos = GWN_vertformat_attr_add(immVertexFormat(), "pos", GWN_COMP_F32, 3, GWN_FETCH_FLOAT);
+
+               immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
+               immUniformColor3ub(255, 0, 255);
 
-               glColor3ub(255, 0, 255);
                if (lcd->totedge > 0) {
-                       glEnableClientState(GL_VERTEX_ARRAY);
-                       glVertexPointer(3, GL_FLOAT, 0, lcd->edges);
-                       glDrawArrays(GL_LINES, 0, lcd->totedge * 2);
-                       glDisableClientState(GL_VERTEX_ARRAY);
+                       immBegin(GWN_PRIM_LINES, lcd->totedge * 2);
+
+                       for (int i = 0; i < lcd->totedge; i++) {
+                               immVertex3fv(pos, lcd->edges[i][0]);
+                               immVertex3fv(pos, lcd->edges[i][1]);
+                       }
+
+                       immEnd();
                }
 
                if (lcd->totpoint > 0) {
                        glPointSize(3.0f);
 
-                       glEnableClientState(GL_VERTEX_ARRAY);
-                       glVertexPointer(3, GL_FLOAT, 0, lcd->points);
-                       glDrawArrays(GL_POINTS, 0, lcd->totpoint);
-                       glDisableClientState(GL_VERTEX_ARRAY);
+                       immBegin(GWN_PRIM_POINTS, lcd->totpoint);
+
+                       for (int i = 0; i < lcd->totpoint; i++) {
+                               immVertex3fv(pos, lcd->points[i]);
+                       }
+
+                       immEnd();
                }
 
-               glPopMatrix();
+               immUnbindProgram();
+
+               gpuPopMatrix();
+
                if (v3d && v3d->zbuf)
                        glEnable(GL_DEPTH_TEST);
        }
@@ -538,20 +555,23 @@ static void loopcut_update_edge(RingSelOpData *lcd, BMEdge *e, const int preview
        }
 }
 
-static void loopcut_mouse_move(RingSelOpData *lcd, const int previewlines)
+static void loopcut_mouse_move(const struct EvaluationContext *eval_ctx, RingSelOpData *lcd, const int previewlines)
 {
        float dist = ED_view3d_select_dist_px();
-       BMEdge *e = EDBM_edge_find_nearest(&lcd->vc, &dist);
+       BMEdge *e = EDBM_edge_find_nearest(eval_ctx, &lcd->vc, &dist);
        loopcut_update_edge(lcd, e, previewlines);
 }
 
 /* called by both init() and exec() */
 static int loopcut_init(bContext *C, wmOperator *op, const wmEvent *event)
 {
+       EvaluationContext eval_ctx;
        const bool is_interactive = (event != NULL);
        Object *obedit = CTX_data_edit_object(C);
        RingSelOpData *lcd;
 
+       CTX_data_eval_ctx(C, &eval_ctx);
+
        if (modifiers_isDeformedByLattice(obedit) || modifiers_isDeformedByArmature(obedit))
                BKE_report(op->reports, RPT_WARNING, "Loop cut does not work well on deformed edit mesh display");
 
@@ -579,7 +599,7 @@ static int loopcut_init(bContext *C, wmOperator *op, const wmEvent *event)
 
        if (is_interactive) {
                copy_v2_v2_int(lcd->vc.mval, event->mval);
-               loopcut_mouse_move(lcd, is_interactive ? 1 : 0);
+               loopcut_mouse_move(&eval_ctx, lcd, is_interactive ? 1 : 0);
        }
        else {
                const int e_index = RNA_int_get(op->ptr, "edge_index");
@@ -652,12 +672,14 @@ static int loopcut_finish(RingSelOpData *lcd, bContext *C, wmOperator *op)
 
 static int loopcut_modal(bContext *C, wmOperator *op, const wmEvent *event)
 {
+       EvaluationContext eval_ctx;
        RingSelOpData *lcd = op->customdata;
        float cuts = lcd->cuts;
        float smoothness = lcd->smoothness;
        bool show_cuts = false;
        const bool has_numinput = hasNumInput(&lcd->num);
 
+       CTX_data_eval_ctx(C, &eval_ctx);
        em_setup_viewcontext(C, &lcd->vc);
        lcd->ar = lcd->vc.ar;
 
@@ -743,7 +765,7 @@ static int loopcut_modal(bContext *C, wmOperator *op, const wmEvent *event)
                                if (!has_numinput) {
                                        lcd->vc.mval[0] = event->mval[0];
                                        lcd->vc.mval[1] = event->mval[1];
-                                       loopcut_mouse_move(lcd, (int)lcd->cuts);
+                                       loopcut_mouse_move(&eval_ctx, lcd, (int)lcd->cuts);
 
                                        ED_region_tag_redraw(lcd->ar);
                                        handled = true;
@@ -847,6 +869,8 @@ void MESH_OT_loopcut(wmOperatorType *ot)
                             "Smoothness", "Smoothness factor", -SUBD_SMOOTH_MAX, SUBD_SMOOTH_MAX);
        RNA_def_property_flag(prop, PROP_SKIP_SAVE);
 
+       WM_operatortype_props_advanced_begin(ot);
+
        prop = RNA_def_property(ot->srna, "falloff", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_items(prop, rna_enum_proportional_falloff_curve_only_items);
        RNA_def_property_enum_default(prop, PROP_INVSQUARE);