Merge branch 'master' into blender2.8
[blender.git] / source / blender / editors / sculpt_paint / paint_stroke.c
index afd24f0..b63f946 100644 (file)
@@ -51,6 +51,7 @@
 #include "BKE_curve.h"
 #include "BKE_colortools.h"
 #include "BKE_image.h"
+#include "BKE_mesh.h"
 
 #include "WM_api.h"
 #include "WM_types.h"
@@ -58,7 +59,7 @@
 #include "BIF_gl.h"
 #include "BIF_glutil.h"
 
-#include "GPU_basic_shader.h"
+#include "GPU_immediate.h"
 
 #include "ED_screen.h"
 #include "ED_view3d.h"
@@ -147,9 +148,23 @@ static void paint_draw_smooth_cursor(bContext *C, int x, int y, void *customdata
        if (stroke && brush) {
                glEnable(GL_LINE_SMOOTH);
                glEnable(GL_BLEND);
-               glColor4ubv(paint->paint_cursor_col);
-               sdrawline(x, y, (int)stroke->last_mouse_position[0],
-                         (int)stroke->last_mouse_position[1]);
+
+               ARegion *ar = stroke->vc.ar;
+
+               unsigned int pos = GWN_vertformat_attr_add(immVertexFormat(), "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT);
+               immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
+               immUniformColor4ubv(paint->paint_cursor_col);
+
+               immBegin(GWN_PRIM_LINES, 2);
+               immVertex2f(pos, x, y);
+               immVertex2f(pos,
+                           stroke->last_mouse_position[0] + ar->winrct.xmin,
+                           stroke->last_mouse_position[1] + ar->winrct.ymin);
+
+               immEnd();
+
+               immUnbindProgram();
+
                glDisable(GL_BLEND);
                glDisable(GL_LINE_SMOOTH);
        }
@@ -161,36 +176,45 @@ static void paint_draw_line_cursor(bContext *C, int x, int y, void *customdata)
        PaintStroke *stroke = customdata;
 
        glEnable(GL_LINE_SMOOTH);
-       glEnable(GL_BLEND);
 
-       GPU_basic_shader_bind_enable(GPU_SHADER_LINE | GPU_SHADER_STIPPLE);
-       GPU_basic_shader_line_stipple(3, 0xAAAA);
-       GPU_basic_shader_line_width(3.0);
+       uint shdr_pos = GWN_vertformat_attr_add(immVertexFormat(), "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT);
 
-       glColor4ub(0, 0, 0, paint->paint_cursor_col[3]);
-       if (stroke->constrain_line) {
-               sdrawline((int)stroke->last_mouse_position[0], (int)stroke->last_mouse_position[1],
-                       stroke->constrained_pos[0], stroke->constrained_pos[1]);
-       }
-       else {
-               sdrawline((int)stroke->last_mouse_position[0], (int)stroke->last_mouse_position[1],
-                       x, y);
-       }
+       immBindBuiltinProgram(GPU_SHADER_2D_LINE_DASHED_UNIFORM_COLOR);
+
+       float viewport_size[4];
+       glGetFloatv(GL_VIEWPORT, viewport_size);
+       immUniform2f("viewport_size", viewport_size[2], viewport_size[3]);
+
+       immUniform1i("num_colors", 2);  /* "advanced" mode */
+       const float alpha = (float)paint->paint_cursor_col[3] / 255.0f;
+       immUniformArray4fv("colors", (float *)(float[][4]){{0.0f, 0.0f, 0.0f, alpha}, {1.0f, 1.0f, 1.0f, alpha}}, 2);
+       immUniform1f("dash_width", 6.0f);
+
+       immBegin(GWN_PRIM_LINES, 2);
+
+       ARegion *ar = stroke->vc.ar;
 
-       glColor4ub(255, 255, 255, paint->paint_cursor_col[3]);
-       GPU_basic_shader_line_width(1.0);
        if (stroke->constrain_line) {
-               sdrawline((int)stroke->last_mouse_position[0], (int)stroke->last_mouse_position[1],
-                       stroke->constrained_pos[0], stroke->constrained_pos[1]);
+               immVertex2f(shdr_pos,
+                           stroke->last_mouse_position[0] + ar->winrct.xmin,
+                           stroke->last_mouse_position[1] + ar->winrct.ymin);
+
+               immVertex2f(shdr_pos,
+                           stroke->constrained_pos[0] + ar->winrct.xmin,
+                           stroke->constrained_pos[1] + ar->winrct.ymin);
        }
        else {
-               sdrawline((int)stroke->last_mouse_position[0], (int)stroke->last_mouse_position[1],
-                       x, y);
+               immVertex2f(shdr_pos,
+                           stroke->last_mouse_position[0] + ar->winrct.xmin,
+                           stroke->last_mouse_position[1] + ar->winrct.ymin);
+
+               immVertex2f(shdr_pos, x, y);
        }
 
-       GPU_basic_shader_bind_disable(GPU_SHADER_LINE | GPU_SHADER_STIPPLE);
+       immEnd();
+
+       immUnbindProgram();
 
-       glDisable(GL_BLEND);
        glDisable(GL_LINE_SMOOTH);
 }