forked from bartvdbraak/blender
Fix T65306: UI widgets clipped when scaled up
Normal UI widget and 3D navigation gizmo where clipping at high DPI.
This commit is contained in:
parent
62dba60e49
commit
3dde6360ff
@ -1736,7 +1736,7 @@ void ui_draw_but_UNITVEC(uiBut *but, const uiWidgetColors *wcol, const rcti *rec
|
|||||||
/* sphere color */
|
/* sphere color */
|
||||||
float diffuse[3] = {1.0f, 1.0f, 1.0f};
|
float diffuse[3] = {1.0f, 1.0f, 1.0f};
|
||||||
float light[3];
|
float light[3];
|
||||||
float size;
|
const float size = 0.5f * min_ff(BLI_rcti_size_x(rect), BLI_rcti_size_y(rect));
|
||||||
|
|
||||||
/* backdrop */
|
/* backdrop */
|
||||||
UI_draw_roundbox_corner_set(UI_CNR_ALL);
|
UI_draw_roundbox_corner_set(UI_CNR_ALL);
|
||||||
@ -1752,11 +1752,10 @@ void ui_draw_but_UNITVEC(uiBut *but, const uiWidgetColors *wcol, const rcti *rec
|
|||||||
/* transform to button */
|
/* transform to button */
|
||||||
GPU_matrix_push();
|
GPU_matrix_push();
|
||||||
|
|
||||||
if (BLI_rcti_size_x(rect) < BLI_rcti_size_y(rect)) {
|
bool use_project_matrix = (size >= -GPU_MATRIX_ORTHO_CLIP_NEAR_DEFAULT);
|
||||||
size = 0.5f * BLI_rcti_size_x(rect);
|
if (use_project_matrix) {
|
||||||
}
|
GPU_matrix_push_projection();
|
||||||
else {
|
GPU_matrix_ortho_set_z(-size, size);
|
||||||
size = 0.5f * BLI_rcti_size_y(rect);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GPU_matrix_translate_2f(rect->xmin + 0.5f * BLI_rcti_size_x(rect),
|
GPU_matrix_translate_2f(rect->xmin + 0.5f * BLI_rcti_size_x(rect),
|
||||||
@ -1784,6 +1783,10 @@ void ui_draw_but_UNITVEC(uiBut *but, const uiWidgetColors *wcol, const rcti *rec
|
|||||||
GPU_blend(false);
|
GPU_blend(false);
|
||||||
GPU_line_smooth(false);
|
GPU_line_smooth(false);
|
||||||
|
|
||||||
|
if (use_project_matrix) {
|
||||||
|
GPU_matrix_pop_projection();
|
||||||
|
}
|
||||||
|
|
||||||
/* matrix after circle */
|
/* matrix after circle */
|
||||||
GPU_matrix_pop();
|
GPU_matrix_pop();
|
||||||
|
|
||||||
|
@ -197,6 +197,7 @@ static void axis_geom_draw(const wmGizmo *gz,
|
|||||||
const bool select,
|
const bool select,
|
||||||
const struct AxisDrawInfo *draw_info)
|
const struct AxisDrawInfo *draw_info)
|
||||||
{
|
{
|
||||||
|
|
||||||
GPU_line_width(gz->line_width);
|
GPU_line_width(gz->line_width);
|
||||||
|
|
||||||
GPUVertFormat *format = immVertexFormat();
|
GPUVertFormat *format = immVertexFormat();
|
||||||
@ -239,6 +240,7 @@ static void axis_geom_draw(const wmGizmo *gz,
|
|||||||
static float axis_color[3][4];
|
static float axis_color[3][4];
|
||||||
|
|
||||||
const float axis_depth_bias = 0.01f;
|
const float axis_depth_bias = 0.01f;
|
||||||
|
const float sphere_scale = 1.15f;
|
||||||
|
|
||||||
#ifdef USE_AXIS_FONT
|
#ifdef USE_AXIS_FONT
|
||||||
struct {
|
struct {
|
||||||
@ -268,6 +270,13 @@ static void axis_geom_draw(const wmGizmo *gz,
|
|||||||
/* When the cursor is over any of the gizmos (show circle backdrop). */
|
/* When the cursor is over any of the gizmos (show circle backdrop). */
|
||||||
const bool is_active = (color[3] != 0.0f);
|
const bool is_active = (color[3] != 0.0f);
|
||||||
|
|
||||||
|
const float clip_range = gz->scale_final * sphere_scale;
|
||||||
|
bool use_project_matrix = (clip_range >= -GPU_MATRIX_ORTHO_CLIP_NEAR_DEFAULT);
|
||||||
|
if (use_project_matrix) {
|
||||||
|
GPU_matrix_push_projection();
|
||||||
|
GPU_matrix_ortho_set_z(-clip_range, clip_range);
|
||||||
|
}
|
||||||
|
|
||||||
/* Circle defining active area. */
|
/* Circle defining active area. */
|
||||||
if (is_active) {
|
if (is_active) {
|
||||||
immUniformColor4fv(color);
|
immUniformColor4fv(color);
|
||||||
@ -364,11 +373,10 @@ static void axis_geom_draw(const wmGizmo *gz,
|
|||||||
* they use a faded color which can be similar to the circle backdrop in tone. */
|
* they use a faded color which can be similar to the circle backdrop in tone. */
|
||||||
if (is_active && !is_highlight && !is_pos && !select && !(axis_align == axis)) {
|
if (is_active && !is_highlight && !is_pos && !select && !(axis_align == axis)) {
|
||||||
static const float axis_black_faded[4] = {0, 0, 0, 0.2f};
|
static const float axis_black_faded[4] = {0, 0, 0, 0.2f};
|
||||||
const float scale = 1.15f;
|
GPU_matrix_scale_1f(sphere_scale);
|
||||||
GPU_matrix_scale_1f(scale);
|
|
||||||
GPU_batch_uniform_4fv(sphere, "color", axis_black_faded);
|
GPU_batch_uniform_4fv(sphere, "color", axis_black_faded);
|
||||||
GPU_batch_draw(sphere);
|
GPU_batch_draw(sphere);
|
||||||
GPU_matrix_scale_1f(1.0 / scale);
|
GPU_matrix_scale_1f(1.0 / sphere_scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
GPU_batch_uniform_4fv(sphere, "color", is_pos_color ? color_current : color_current_fade);
|
GPU_batch_uniform_4fv(sphere, "color", is_pos_color ? color_current : color_current_fade);
|
||||||
@ -407,6 +415,10 @@ static void axis_geom_draw(const wmGizmo *gz,
|
|||||||
|
|
||||||
GPU_matrix_pop();
|
GPU_matrix_pop();
|
||||||
immUnbindProgram();
|
immUnbindProgram();
|
||||||
|
|
||||||
|
if (use_project_matrix) {
|
||||||
|
GPU_matrix_pop_projection();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void axis3d_draw_intern(const bContext *C,
|
static void axis3d_draw_intern(const bContext *C,
|
||||||
|
@ -224,4 +224,9 @@ int GPU_matrix_stack_level_get_projection(void);
|
|||||||
# define GPU_matrix_normal_inverse_get(x) GPU_matrix_normal_inverse_get(_GPU_MAT3_CAST(x))
|
# define GPU_matrix_normal_inverse_get(x) GPU_matrix_normal_inverse_get(_GPU_MAT3_CAST(x))
|
||||||
#endif /* SUPPRESS_GENERIC_MATRIX_API */
|
#endif /* SUPPRESS_GENERIC_MATRIX_API */
|
||||||
|
|
||||||
|
/* Not part of the GPU_matrix API,
|
||||||
|
* however we need to check these limits in code that calls into these API's. */
|
||||||
|
#define GPU_MATRIX_ORTHO_CLIP_NEAR_DEFAULT (-100)
|
||||||
|
#define GPU_MATRIX_ORTHO_CLIP_FAR_DEFAULT (100)
|
||||||
|
|
||||||
#endif /* __GPU_MATRIX_H__ */
|
#endif /* __GPU_MATRIX_H__ */
|
||||||
|
@ -108,7 +108,8 @@ void wmOrtho2(float x1, float x2, float y1, float y2)
|
|||||||
y2 += 1.0f;
|
y2 += 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
GPU_matrix_ortho_set(x1, x2, y1, y2, -100, 100);
|
GPU_matrix_ortho_set(
|
||||||
|
x1, x2, y1, y2, GPU_MATRIX_ORTHO_CLIP_NEAR_DEFAULT, GPU_MATRIX_ORTHO_CLIP_FAR_DEFAULT);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void wmOrtho2_offset(const float x, const float y, const float ofs)
|
static void wmOrtho2_offset(const float x, const float y, const float ofs)
|
||||||
@ -136,6 +137,6 @@ void wmGetProjectionMatrix(float mat[4][4], const rcti *winrct)
|
|||||||
(float)width - GLA_PIXEL_OFS,
|
(float)width - GLA_PIXEL_OFS,
|
||||||
-GLA_PIXEL_OFS,
|
-GLA_PIXEL_OFS,
|
||||||
(float)height - GLA_PIXEL_OFS,
|
(float)height - GLA_PIXEL_OFS,
|
||||||
-100,
|
GPU_MATRIX_ORTHO_CLIP_NEAR_DEFAULT,
|
||||||
100);
|
GPU_MATRIX_ORTHO_CLIP_FAR_DEFAULT);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user