Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorianwill <wpgermano@gmail.com>2017-02-24 23:33:09 +0300
committerMike Erwin <significant.bit@gmail.com>2017-02-24 23:33:32 +0300
commitbda0456933e87c2f623a8e4f980bf7cfc6b3982a (patch)
tree87375bc766b4c0866f6b4ad4c96544c74509ff12 /source/blender/windowmanager/intern/wm_gesture.c
parent1f453a8909527a95fedd597b4fdaab90c18712f9 (diff)
OpenGL: wm_gesture uses new imm mode
D2376 by @ianwill, part of T49043 review by @merwin Box select, circle select, etc. Introducing the dashed-line shader! See D2376 for more info.
Diffstat (limited to 'source/blender/windowmanager/intern/wm_gesture.c')
-rw-r--r--source/blender/windowmanager/intern/wm_gesture.c286
1 files changed, 209 insertions, 77 deletions
diff --git a/source/blender/windowmanager/intern/wm_gesture.c b/source/blender/windowmanager/intern/wm_gesture.c
index 196ddfbdac0..e95d5cbc2ed 100644
--- a/source/blender/windowmanager/intern/wm_gesture.c
+++ b/source/blender/windowmanager/intern/wm_gesture.c
@@ -54,6 +54,7 @@
#include "wm_draw.h"
#include "GPU_basic_shader.h"
+#include "GPU_immediate.h"
#include "GPU_shader.h"
#include "BIF_glutil.h"
@@ -169,69 +170,156 @@ int wm_gesture_evaluate(wmGesture *gesture)
/* ******************* gesture draw ******************* */
+static void wm_gesture_draw_line(wmGesture *gt)
+{
+ rcti *rect = (rcti *)gt->customdata;
+
+ VertexFormat* format = immVertexFormat();
+ unsigned pos = add_attrib(format, "pos", COMP_F32, 2, KEEP_FLOAT);
+ unsigned line_origin = add_attrib(format, "line_origin", COMP_F32, 2, KEEP_FLOAT);
+
+ immBindBuiltinProgram(GPU_SHADER_2D_LINE_DASHED_COLOR);
+
+ immUniform4f("color1", 0.4f, 0.4f, 0.4f, 1.0f);
+ immUniform4f("color2", 1.0f, 1.0f, 1.0f, 1.0f);
+ immUniform1f("dash_width", 8.0f);
+ immUniform1f("dash_width_on", 4.0f);
+
+ float xmin = (float)rect->xmin;
+ float ymin = (float)rect->ymin;
+
+ immBegin(PRIM_LINES, 2);
+
+ immAttrib2f(line_origin, xmin, ymin);
+ immVertex2f(pos, xmin, ymin);
+ immAttrib2f(line_origin, xmin, ymin);
+ immVertex2f(pos, (float)rect->xmax, (float)rect->ymax);
+
+ immEnd();
+
+ immUnbindProgram();
+}
+
+static void imm_draw_line_box_dashed(unsigned pos, unsigned line_origin, float x1, float y1, float x2, float y2)
+{
+ immBegin(PRIM_LINES, 8);
+ immAttrib2f(line_origin, x1, y1);
+ immVertex2f(pos, x1, y1);
+ immVertex2f(pos, x1, y2);
+ immAttrib2f(line_origin, x1, y2);
+ immVertex2f(pos, x1, y2);
+ immVertex2f(pos, x2, y2);
+ immAttrib2f(line_origin, x2, y1);
+ immVertex2f(pos, x2, y2);
+ immVertex2f(pos, x2, y1);
+ immAttrib2f(line_origin, x1, y1);
+ immVertex2f(pos, x2, y1);
+ immVertex2f(pos, x1, y1);
+ immEnd();
+}
+
static void wm_gesture_draw_rect(wmGesture *gt)
{
rcti *rect = (rcti *)gt->customdata;
+
+ VertexFormat* format = immVertexFormat();
+ unsigned pos = add_attrib(format, "pos", COMP_F32, 2, KEEP_FLOAT);
+
+ immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
glEnable(GL_BLEND);
- glColor4f(1.0, 1.0, 1.0, 0.05);
- glBegin(GL_QUADS);
- glVertex2s(rect->xmax, rect->ymin);
- glVertex2s(rect->xmax, rect->ymax);
- glVertex2s(rect->xmin, rect->ymax);
- glVertex2s(rect->xmin, rect->ymin);
- glEnd();
+
+ immUniform4f("color", 1.0f, 1.0f, 1.0f, 0.05f);
+
+ immBegin(GL_QUADS, 4);
+
+ immVertex2f(pos, (float)rect->xmax, (float)rect->ymin);
+ immVertex2f(pos, (float)rect->xmax, (float)rect->ymax);
+ immVertex2f(pos, (float)rect->xmin, (float)rect->ymax);
+ immVertex2f(pos, (float)rect->xmin, (float)rect->ymin);
+
+ immEnd();
+
+ immUnbindProgram();
+
glDisable(GL_BLEND);
+
+ format = immVertexFormat();
+ pos = add_attrib(format, "pos", COMP_F32, 2, KEEP_FLOAT);
+ unsigned line_origin = add_attrib(format, "line_origin", COMP_F32, 2, KEEP_FLOAT);
+
+ immBindBuiltinProgram(GPU_SHADER_2D_LINE_DASHED_COLOR);
+
+ immUniform4f("color1", 0.4f, 0.4f, 0.4f, 1.0f);
+ immUniform4f("color2", 1.0f, 1.0f, 1.0f, 1.0f);
+ immUniform1f("dash_width", 8.0f);
+ immUniform1f("dash_width_on", 4.0f);
- GPU_basic_shader_bind(GPU_SHADER_LINE | GPU_SHADER_STIPPLE | GPU_SHADER_USE_COLOR);
- glColor3ub(96, 96, 96);
- GPU_basic_shader_line_stipple(1, 0xCCCC);
- sdrawbox(rect->xmin, rect->ymin, rect->xmax, rect->ymax);
- glColor3ub(255, 255, 255);
- GPU_basic_shader_line_stipple(1, 0x3333);
- sdrawbox(rect->xmin, rect->ymin, rect->xmax, rect->ymax);
- GPU_basic_shader_bind(GPU_SHADER_USE_COLOR);
+ imm_draw_line_box_dashed(pos, line_origin,
+ (float)rect->xmin, (float)rect->ymin, (float)rect->xmax, (float)rect->ymax);
+
+ immUnbindProgram();
+
+ // wm_gesture_draw_line(gt); // draws a diagonal line in the lined box to test wm_gesture_draw_line
}
-static void wm_gesture_draw_line(wmGesture *gt)
+static void imm_draw_lined_dashed_circle(unsigned pos, unsigned line_origin, float x, float y, float rad, int nsegments)
{
- rcti *rect = (rcti *)gt->customdata;
-
- GPU_basic_shader_bind(GPU_SHADER_LINE | GPU_SHADER_STIPPLE);
- glColor3ub(96, 96, 96);
- GPU_basic_shader_line_stipple(1, 0xAAAA);
- sdrawline(rect->xmin, rect->ymin, rect->xmax, rect->ymax);
- glColor3ub(255, 255, 255);
- GPU_basic_shader_line_stipple(1, 0x5555);
- sdrawline(rect->xmin, rect->ymin, rect->xmax, rect->ymax);
-
- GPU_basic_shader_bind(GPU_SHADER_USE_COLOR);
-
+ float xpos, ypos;
+
+ xpos = x + rad;
+ ypos = y;
+
+ immBegin(PRIM_LINES, nsegments * 2);
+
+ for (int i = 1; i <= nsegments; ++i) {
+ float angle = 2 * M_PI * ((float)i / (float)nsegments);
+
+ immAttrib2f(line_origin, xpos, ypos);
+ immVertex2f(pos, xpos, ypos);
+
+ xpos = x + rad * cosf(angle);
+ ypos = y + rad * sinf(angle);
+
+ immVertex2f(pos, xpos, ypos);
+ }
+
+ immEnd();
}
static void wm_gesture_draw_circle(wmGesture *gt)
{
rcti *rect = (rcti *)gt->customdata;
- glTranslatef((float)rect->xmin, (float)rect->ymin, 0.0f);
-
glEnable(GL_BLEND);
- glColor4f(1.0, 1.0, 1.0, 0.05);
- glutil_draw_filled_arc(0.0, M_PI * 2.0, rect->xmax, 40);
+
+ VertexFormat* format = immVertexFormat();
+ unsigned pos = add_attrib(format, "pos", COMP_F32, 2, KEEP_FLOAT);
+
+ immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
+
+ immUniformColor4f(1.0, 1.0, 1.0, 0.05);
+ imm_draw_filled_circle(pos, (float)rect->xmin, (float)rect->ymin, (float)rect->xmax, 40);
+
+ immUnbindProgram();
+
glDisable(GL_BLEND);
- // for USE_GLSL works bad because of no relation between lines
- GPU_basic_shader_bind(GPU_SHADER_LINE | GPU_SHADER_STIPPLE | GPU_SHADER_USE_COLOR);
- glColor3ub(96, 96, 96);
- GPU_basic_shader_line_stipple(1, 0xAAAA);
- glutil_draw_lined_arc(0.0, M_PI * 2.0, rect->xmax, 40);
- glColor3ub(255, 255, 255);
- GPU_basic_shader_line_stipple(1, 0x5555);
- glutil_draw_lined_arc(0.0, M_PI * 2.0, rect->xmax, 40);
-
- GPU_basic_shader_bind(GPU_SHADER_USE_COLOR);
- glTranslatef(-rect->xmin, -rect->ymin, 0.0f);
+ format = immVertexFormat();
+ pos = add_attrib(format, "pos", COMP_F32, 2, KEEP_FLOAT);
+ unsigned line_origin = add_attrib(format, "line_origin", COMP_F32, 2, KEEP_FLOAT);
+
+ immBindBuiltinProgram(GPU_SHADER_2D_LINE_DASHED_COLOR);
+
+ immUniform4f("color1", 0.4f, 0.4f, 0.4f, 1.0f);
+ immUniform4f("color2", 1.0f, 1.0f, 1.0f, 1.0f);
+ immUniform1f("dash_width", 4.0f);
+ immUniform1f("dash_width_on", 2.0f);
+ imm_draw_lined_dashed_circle(pos, line_origin,
+ (float)rect->xmin, (float)rect->ymin, (float)rect->xmax, 40);
+
+ immUnbindProgram();
}
struct LassoFillData {
@@ -310,35 +398,52 @@ static void draw_filled_lasso(wmWindow *win, wmGesture *gt)
static void wm_gesture_draw_lasso(wmWindow *win, wmGesture *gt, bool filled)
{
const short *lasso = (short *)gt->customdata;
- int i;
+ int i, numverts;
+ float x, y;
if (filled) {
draw_filled_lasso(win, gt);
}
- // for USE_GLSL can't check this yet
- GPU_basic_shader_bind(GPU_SHADER_LINE | GPU_SHADER_STIPPLE | GPU_SHADER_USE_COLOR);
- glColor3ub(96, 96, 96);
- GPU_basic_shader_line_stipple(1, 0xAAAA);
- glBegin(GL_LINE_STRIP);
- for (i = 0; i < gt->points; i++, lasso += 2)
- glVertex2sv(lasso);
- if (gt->type == WM_GESTURE_LASSO)
- glVertex2sv((short *)gt->customdata);
- glEnd();
-
- glColor3ub(255, 255, 255);
- GPU_basic_shader_line_stipple(1, 0x5555);
- glBegin(GL_LINE_STRIP);
- lasso = (short *)gt->customdata;
- for (i = 0; i < gt->points; i++, lasso += 2)
- glVertex2sv(lasso);
- if (gt->type == WM_GESTURE_LASSO)
- glVertex2sv((short *)gt->customdata);
- glEnd();
-
- GPU_basic_shader_bind(GPU_SHADER_USE_COLOR);
+ VertexFormat* format = immVertexFormat();
+ unsigned pos = add_attrib(format, "pos", COMP_F32, 2, KEEP_FLOAT);
+ unsigned line_origin = add_attrib(format, "line_origin", COMP_F32, 2, KEEP_FLOAT);
+
+ immBindBuiltinProgram(GPU_SHADER_2D_LINE_DASHED_COLOR);
+
+ immUniform4f("color1", 0.4f, 0.4f, 0.4f, 1.0f);
+ immUniform4f("color2", 1.0f, 1.0f, 1.0f, 1.0f);
+ immUniform1f("dash_width", 2.0f);
+ immUniform1f("dash_width_on", 1.0f);
+
+ numverts = gt->points;
+ if (gt->type == WM_GESTURE_LASSO) {
+ numverts++;
+ }
+
+ immBegin(PRIM_LINE_STRIP, numverts);
+
+ for (i = 0; i < gt->points; i++, lasso += 2) {
+
+ /* get line_origin coordinates only from the first vertex of each line */
+ if (!(i % 2)) {
+ x = (float)lasso[0];
+ y = (float)lasso[1];
+ }
+
+ immAttrib2f(line_origin, x, y);
+ immVertex2f(pos, (float)lasso[0], (float)lasso[1]);
+ }
+
+ if (gt->type == WM_GESTURE_LASSO) {
+ immAttrib2f(line_origin, x, y);
+ lasso = (short *)gt->customdata;
+ immVertex2f(pos, (float)lasso[0], (float)lasso[1]);
+ }
+
+ immEnd();
+ immUnbindProgram();
}
static void wm_gesture_draw_cross(wmWindow *win, wmGesture *gt)
@@ -347,17 +452,44 @@ static void wm_gesture_draw_cross(wmWindow *win, wmGesture *gt)
const int winsize_x = WM_window_pixels_x(win);
const int winsize_y = WM_window_pixels_y(win);
- GPU_basic_shader_bind(GPU_SHADER_LINE | GPU_SHADER_STIPPLE | GPU_SHADER_USE_COLOR);
- glColor3ub(96, 96, 96);
- GPU_basic_shader_line_stipple(1, 0xCCCC);
- sdrawline(rect->xmin - winsize_x, rect->ymin, rect->xmin + winsize_x, rect->ymin);
- sdrawline(rect->xmin, rect->ymin - winsize_y, rect->xmin, rect->ymin + winsize_y);
-
- glColor3ub(255, 255, 255);
- GPU_basic_shader_line_stipple(1, 0x3333);
- sdrawline(rect->xmin - winsize_x, rect->ymin, rect->xmin + winsize_x, rect->ymin);
- sdrawline(rect->xmin, rect->ymin - winsize_y, rect->xmin, rect->ymin + winsize_y);
- GPU_basic_shader_bind(GPU_SHADER_USE_COLOR);
+ float x1, x2, y1, y2;
+
+ VertexFormat* format = immVertexFormat();
+ unsigned pos = add_attrib(format, "pos", COMP_F32, 2, KEEP_FLOAT);
+ unsigned line_origin = add_attrib(format, "line_origin", COMP_F32, 2, KEEP_FLOAT);
+
+ immBindBuiltinProgram(GPU_SHADER_2D_LINE_DASHED_COLOR);
+
+ immUniform4f("color1", 0.4f, 0.4f, 0.4f, 1.0f);
+ immUniform4f("color2", 1.0f, 1.0f, 1.0f, 1.0f);
+ immUniform1f("dash_width", 8.0f);
+ immUniform1f("dash_width_on", 4.0f);
+
+ immBegin(PRIM_LINES, 4);
+
+ x1 = (float)(rect->xmin - winsize_x);
+ y1 = (float)rect->ymin;
+ x2 = (float)(rect->xmin + winsize_x);
+ y2 = y1;
+
+ immAttrib2f(line_origin, x1, y1);
+ immVertex2f(pos, x1, y1);
+ immAttrib2f(line_origin, x1, y1);
+ immVertex2f(pos, x2, y2);
+
+ x1 = (float)rect->xmin;
+ y1 = (float)(rect->ymin - winsize_y);
+ x2 = x1;
+ y2 = (float)(rect->ymin + winsize_y);
+
+ immAttrib2f(line_origin, x1, y1);
+ immVertex2f(pos, x1, y1);
+ immAttrib2f(line_origin, x1, y1);
+ immVertex2f(pos, x2, y2);
+
+ immEnd();
+
+ immUnbindProgram();
}
/* called in wm_draw.c */