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:
authorDalai Felinto <dfelinto@gmail.com>2018-04-22 19:56:06 +0300
committerDalai Felinto <dfelinto@gmail.com>2018-04-22 20:54:26 +0300
commit8733ad4d2a68f31332b38a1a10391cc273579e8b (patch)
treef4ea827dc0b0aecb8255bf81dbb48d3951991437 /source/blender/editors/screen/screen_draw.c
parent90068773dbf5f7556b983151544e29742dac6364 (diff)
UI: Draw round corners between the editors
This makes easier to distinguish between different editors (as oppose to an editor and its regions). Note action zones look a bit strange with this. I recommend we do next: * Make sure all 4 corners can be used as action zones. * Remove their drawing code (or show them only on mouse hover).
Diffstat (limited to 'source/blender/editors/screen/screen_draw.c')
-rw-r--r--source/blender/editors/screen/screen_draw.c110
1 files changed, 109 insertions, 1 deletions
diff --git a/source/blender/editors/screen/screen_draw.c b/source/blender/editors/screen/screen_draw.c
index 3ffb125cdde..172552b3cc3 100644
--- a/source/blender/editors/screen/screen_draw.c
+++ b/source/blender/editors/screen/screen_draw.c
@@ -28,9 +28,13 @@
#include "GPU_immediate.h"
#include "GPU_matrix.h"
+#include "BLI_math.h"
+
#include "WM_api.h"
#include "WM_types.h"
+#include "UI_interface.h"
+
#include "screen_intern.h"
/**
@@ -208,6 +212,106 @@ static void draw_join_shape(ScrArea *sa, char dir, unsigned int pos)
}
}
+#define CORNER_RESOLUTION 10
+static void drawscredge_corner_geometry(
+ int sizex, int sizey,
+ int corner_x, int corner_y,
+ int center_x, int center_y,
+ double angle_offset)
+{
+ const int radius = ABS(corner_x - center_x);
+ const float color[4] = {0.0f, 0.0f, 0.0f, 1.0f};
+ const int line_thickness = U.pixelsize;
+
+ if (corner_x < center_x) {
+ if (corner_x > 0.0f) {
+ /* Left (internal) edge. */
+ corner_x += line_thickness;
+ center_x += line_thickness;
+ }
+ }
+ else {
+ /* Right (internal) edge. */
+ if (corner_x < sizex - 1) {
+ corner_x += 1 - line_thickness;
+ center_x += 1 - line_thickness;
+ }
+ else {
+ /* Corner case, extreme right edge. */
+ corner_x += 1;
+ center_x += 1;
+ }
+ }
+
+ if (corner_y < center_y) {
+ if (corner_y > 0.0f) {
+ /* Bottom (internal) edge. */
+ corner_y += line_thickness;
+ center_y += line_thickness;
+ }
+ }
+ else {
+ /* Top (internal) edge. */
+ if (corner_y < sizey) {
+ corner_y += 1 - line_thickness;
+ center_y += 1 - line_thickness;
+ }
+ }
+
+ float tri_array[CORNER_RESOLUTION + 1][2];
+
+ tri_array[0][0] = corner_x;
+ tri_array[0][1] = corner_y;
+
+ for (int i = 0; i < CORNER_RESOLUTION; i++) {
+ double angle = angle_offset + (M_PI_2 * ((float)i / (CORNER_RESOLUTION - 1)));
+ float x = center_x + (radius * cos(angle));
+ float y = center_y + (radius * sin(angle));
+ tri_array[i + 1][0] = x;
+ tri_array[i + 1][1] = y;
+ }
+ UI_draw_anti_fan(tri_array, CORNER_RESOLUTION + 1, color);
+}
+
+#undef CORNER_RESOLUTION
+
+static void drawscredge_corner(ScrArea *sa, int sizex, int sizey)
+{
+ int size = 10 * U.pixelsize;
+
+ /* Bottom-Left. */
+ drawscredge_corner_geometry(sizex, sizey,
+ sa->v1->vec.x,
+ sa->v1->vec.y,
+ sa->v1->vec.x + size,
+ sa->v1->vec.y + size,
+ M_PI_2 * 2.0f);
+
+ /* Top-Left. */
+ drawscredge_corner_geometry(sizex, sizey,
+ sa->v2->vec.x,
+ sa->v2->vec.y,
+ sa->v2->vec.x + size,
+ sa->v2->vec.y - size,
+ M_PI_2);
+
+ /* Top-Right. */
+ drawscredge_corner_geometry(sizex, sizey,
+ sa->v3->vec.x,
+ sa->v3->vec.y,
+ sa->v3->vec.x - size,
+ sa->v3->vec.y - size,
+ 0.0f);
+
+ /* Bottom-Right. */
+ drawscredge_corner_geometry(sizex, sizey,
+ sa->v4->vec.x,
+ sa->v4->vec.y,
+ sa->v4->vec.x - size,
+ sa->v4->vec.y + size,
+ M_PI_2 * 3.0f);
+}
+
/**
* Draw screen area darker with arrow (visualization of future joining).
*/
@@ -307,7 +411,7 @@ void ED_screen_draw_edges(wmWindow *win)
if (U.pixelsize > 1.0f) {
/* FIXME: doesn't our glLineWidth already scale by U.pixelsize? */
glLineWidth((2.0f * U.pixelsize) - 1);
- immUniformColor3ub(0x50, 0x50, 0x50);
+ immUniformColor3ub(0, 0, 0);
for (sa = screen->areabase.first; sa; sa = sa->next) {
drawscredge_area(sa, winsize_x, winsize_y, pos);
@@ -323,6 +427,10 @@ void ED_screen_draw_edges(wmWindow *win)
immUnbindProgram();
+ for (sa = screen->areabase.first; sa; sa = sa->next) {
+ drawscredge_corner(sa, winsize_x, winsize_y);
+ }
+
screen->do_draw = false;
}