Curve Edit Mode: Use curve handle theme colors
This commit is contained in:
parent
c26da06ae6
commit
375d27f230
|
@ -202,6 +202,7 @@ data_to_c_simple(modes/shaders/edit_mesh_overlay_mix_frag.glsl SRC)
|
|||
data_to_c_simple(modes/shaders/edit_mesh_overlay_facefill_vert.glsl SRC)
|
||||
data_to_c_simple(modes/shaders/edit_mesh_overlay_facefill_frag.glsl SRC)
|
||||
data_to_c_simple(modes/shaders/edit_curve_overlay_frag.glsl SRC)
|
||||
data_to_c_simple(modes/shaders/edit_curve_overlay_handle_geom.glsl SRC)
|
||||
data_to_c_simple(modes/shaders/edit_curve_overlay_loosevert_vert.glsl SRC)
|
||||
data_to_c_simple(modes/shaders/edit_lattice_overlay_frag.glsl SRC)
|
||||
data_to_c_simple(modes/shaders/edit_lattice_overlay_loosevert_vert.glsl SRC)
|
||||
|
|
|
@ -40,9 +40,22 @@
|
|||
|
||||
#include "GPU_batch.h"
|
||||
|
||||
#include "UI_resources.h"
|
||||
|
||||
#include "draw_cache_impl.h" /* own include */
|
||||
|
||||
#define SELECT 1
|
||||
#define SELECT 1
|
||||
#define ACTIVE_NURB 1 << 7 /* last char bite */
|
||||
#define HANDLE_SEL_OFFSET (TH_HANDLE_SEL_FREE - TH_HANDLE_FREE)
|
||||
|
||||
/* Used as values of `color_id` in `edit_curve_overlay_handle_geom.glsl` */
|
||||
enum {
|
||||
COLOR_NURB_ULINE_ID = TH_HANDLE_SEL_AUTOCLAMP - TH_HANDLE_FREE + 1,
|
||||
COLOR_NURB_SEL_ULINE_ID,
|
||||
COLOR_ACTIVE_SPLINE,
|
||||
|
||||
TOT_HANDLE_COL,
|
||||
};
|
||||
|
||||
/**
|
||||
* TODO
|
||||
|
@ -742,47 +755,50 @@ static void curve_batch_cache_create_overlay_batches(Curve *cu)
|
|||
int vbo_len_used = 0;
|
||||
GWN_vertbuf_data_alloc(vbo, vbo_len_capacity);
|
||||
int i = 0;
|
||||
for (Nurb *nu = rdata->nurbs->first; nu; nu = nu->next) {
|
||||
for (Nurb *nu = rdata->nurbs->first; nu; nu = nu->next, i++) {
|
||||
const bool is_active_nurb = (i == cu->actnu);
|
||||
|
||||
if (nu->bezt) {
|
||||
int a = 0;
|
||||
for (const BezTriple *bezt = nu->bezt; a < nu->pntsu; a++, bezt++) {
|
||||
if (bezt->hide == false) {
|
||||
const bool is_active = (i == rdata->actvert);
|
||||
char vflag;
|
||||
char col_id;
|
||||
|
||||
vflag = (bezt->f1 & SELECT) ? (is_active ? VFLAG_VERTEX_ACTIVE : VFLAG_VERTEX_SELECTED) : 0;
|
||||
GWN_vertbuf_attr_set(vbo, attr_id.pos, vbo_len_used, bezt->vec[0]);
|
||||
GWN_vertbuf_attr_set(vbo, attr_id.data, vbo_len_used, &vflag);
|
||||
vbo_len_used += 1;
|
||||
|
||||
/* same vertex twice, only check different selection */
|
||||
for (int j = 0; j < 2; j++) {
|
||||
vflag = ((j ? bezt->f3 : bezt->f1) & SELECT) ?
|
||||
(is_active ? VFLAG_VERTEX_ACTIVE : VFLAG_VERTEX_SELECTED) : 0;
|
||||
for (int j = 0; j < 2; j += 1) {
|
||||
/* same vertex twice, only check different selection */
|
||||
GWN_vertbuf_attr_set(vbo, attr_id.pos, vbo_len_used, bezt->vec[1]);
|
||||
GWN_vertbuf_attr_set(vbo, attr_id.data, vbo_len_used, &vflag);
|
||||
vbo_len_used += 1;
|
||||
|
||||
col_id = (&bezt->h1)[j];
|
||||
if ((&bezt->f1)[j * 2] & SELECT) {
|
||||
col_id += HANDLE_SEL_OFFSET;
|
||||
}
|
||||
if (is_active_nurb) {
|
||||
col_id |= ACTIVE_NURB;
|
||||
}
|
||||
|
||||
GWN_vertbuf_attr_set(vbo, attr_id.pos, vbo_len_used, bezt->vec[j * 2]);
|
||||
GWN_vertbuf_attr_set(vbo, attr_id.data, vbo_len_used, &col_id);
|
||||
vbo_len_used += 1;
|
||||
}
|
||||
|
||||
vflag = (bezt->f3 & SELECT) ? (is_active ? VFLAG_VERTEX_ACTIVE : VFLAG_VERTEX_SELECTED) : 0;
|
||||
GWN_vertbuf_attr_set(vbo, attr_id.pos, vbo_len_used, bezt->vec[2]);
|
||||
GWN_vertbuf_attr_set(vbo, attr_id.data, vbo_len_used, &vflag);
|
||||
vbo_len_used += 1;
|
||||
}
|
||||
i += 1;
|
||||
}
|
||||
}
|
||||
else if (nu->bp) {
|
||||
int a = 1;
|
||||
for (const BPoint *bp_prev = nu->bp, *bp_curr = &nu->bp[1]; a < nu->pntsu; a++, bp_prev = bp_curr++) {
|
||||
if ((bp_prev->hide == false) && (bp_curr->hide == false)) {
|
||||
char vflag;
|
||||
vflag = ((bp_prev->f1 & SELECT) && (bp_curr->f1 & SELECT)) ? VFLAG_VERTEX_SELECTED : 0;
|
||||
char col_id = ((bp_prev->f1 & SELECT) && (bp_curr->f1 & SELECT)) ? COLOR_NURB_SEL_ULINE_ID : COLOR_NURB_ULINE_ID;
|
||||
|
||||
if (is_active_nurb) {
|
||||
col_id |= ACTIVE_NURB;
|
||||
}
|
||||
|
||||
GWN_vertbuf_attr_set(vbo, attr_id.pos, vbo_len_used, bp_prev->vec);
|
||||
GWN_vertbuf_attr_set(vbo, attr_id.data, vbo_len_used, &vflag);
|
||||
vbo_len_used += 1;
|
||||
|
||||
GWN_vertbuf_attr_set(vbo, attr_id.pos, vbo_len_used, bp_curr->vec);
|
||||
GWN_vertbuf_attr_set(vbo, attr_id.data, vbo_len_used, &vflag);
|
||||
GWN_vertbuf_attr_set(vbo, attr_id.data, vbo_len_used, &col_id);
|
||||
vbo_len_used += 1;
|
||||
|
||||
}
|
||||
|
@ -1092,4 +1108,4 @@ Gwn_Batch *DRW_curve_batch_cache_get_overlay_cursor(Curve *cu)
|
|||
return cache->text.cursor;
|
||||
}
|
||||
|
||||
/** \} */
|
||||
/** \} */
|
||||
|
|
|
@ -81,6 +81,21 @@ void DRW_globals_update(void)
|
|||
UI_GetThemeColor4fv(TH_FACE_DOT, ts.colorFaceDot);
|
||||
UI_GetThemeColor4fv(TH_BACK, ts.colorBackground);
|
||||
|
||||
/* Curve */
|
||||
UI_GetThemeColor4fv(TH_HANDLE_FREE, ts.colorHandleFree);
|
||||
UI_GetThemeColor4fv(TH_HANDLE_AUTO, ts.colorHandleAuto);
|
||||
UI_GetThemeColor4fv(TH_HANDLE_VECT, ts.colorHandleVect);
|
||||
UI_GetThemeColor4fv(TH_HANDLE_ALIGN, ts.colorHandleAlign);
|
||||
UI_GetThemeColor4fv(TH_HANDLE_AUTOCLAMP, ts.colorHandleAutoclamp);
|
||||
UI_GetThemeColor4fv(TH_HANDLE_SEL_FREE, ts.colorHandleSelFree);
|
||||
UI_GetThemeColor4fv(TH_HANDLE_SEL_AUTO, ts.colorHandleSelAuto);
|
||||
UI_GetThemeColor4fv(TH_HANDLE_SEL_VECT, ts.colorHandleSelVect);
|
||||
UI_GetThemeColor4fv(TH_HANDLE_SEL_ALIGN, ts.colorHandleSelAlign);
|
||||
UI_GetThemeColor4fv(TH_HANDLE_SEL_AUTOCLAMP, ts.colorHandleSelAutoclamp);
|
||||
UI_GetThemeColor4fv(TH_NURB_ULINE, ts.colorNurbUline);
|
||||
UI_GetThemeColor4fv(TH_NURB_SEL_ULINE, ts.colorNurbSelUline);
|
||||
UI_GetThemeColor4fv(TH_ACTIVE_SPLINE, ts.colorActiveSpline);
|
||||
|
||||
/* Grid */
|
||||
UI_GetThemeColorShade4fv(TH_GRID, 10, ts.colorGrid);
|
||||
/* emphasise division lines lighter instead of darker, if background is darker than grid */
|
||||
|
|
|
@ -72,6 +72,20 @@ typedef struct GlobalsUboStorage {
|
|||
|
||||
float colorBackground[4];
|
||||
|
||||
float colorHandleFree[4];
|
||||
float colorHandleAuto[4];
|
||||
float colorHandleVect[4];
|
||||
float colorHandleAlign[4];
|
||||
float colorHandleAutoclamp[4];
|
||||
float colorHandleSelFree[4];
|
||||
float colorHandleSelAuto[4];
|
||||
float colorHandleSelVect[4];
|
||||
float colorHandleSelAlign[4];
|
||||
float colorHandleSelAutoclamp[4];
|
||||
float colorNurbUline[4];
|
||||
float colorNurbSelUline[4];
|
||||
float colorActiveSpline[4];
|
||||
|
||||
float colorGrid[4];
|
||||
float colorGridEmphasise[4];
|
||||
float colorGridAxisX[4];
|
||||
|
|
|
@ -45,10 +45,12 @@ extern struct GlobalsUboStorage ts; /* draw_common.c */
|
|||
extern char datatoc_common_globals_lib_glsl[];
|
||||
extern char datatoc_edit_curve_overlay_loosevert_vert_glsl[];
|
||||
extern char datatoc_edit_curve_overlay_frag_glsl[];
|
||||
extern char datatoc_edit_curve_overlay_handle_geom_glsl[];
|
||||
|
||||
extern char datatoc_gpu_shader_3D_vert_glsl[];
|
||||
extern char datatoc_gpu_shader_uniform_color_frag_glsl[];
|
||||
extern char datatoc_gpu_shader_point_uniform_color_frag_glsl[];
|
||||
extern char datatoc_gpu_shader_flat_color_frag_glsl[];
|
||||
|
||||
/* *********** LISTS *********** */
|
||||
/* All lists are per viewport specific datas.
|
||||
|
@ -158,7 +160,11 @@ static void EDIT_CURVE_engine_init(void *vedata)
|
|||
}
|
||||
|
||||
if (!e_data.overlay_edge_sh) {
|
||||
e_data.overlay_edge_sh = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR);
|
||||
e_data.overlay_edge_sh = DRW_shader_create_with_lib(
|
||||
datatoc_edit_curve_overlay_loosevert_vert_glsl,
|
||||
datatoc_edit_curve_overlay_handle_geom_glsl,
|
||||
datatoc_gpu_shader_flat_color_frag_glsl,
|
||||
datatoc_common_globals_lib_glsl, NULL);
|
||||
}
|
||||
|
||||
if (!e_data.overlay_vert_sh) {
|
||||
|
@ -189,15 +195,14 @@ static void EDIT_CURVE_cache_init(void *vedata)
|
|||
stl->g_data->wire_shgrp = DRW_shgroup_create(e_data.wire_sh, psl->wire_pass);
|
||||
|
||||
|
||||
/* TODO: following handle theme colors,
|
||||
* For now use overlay vert shader for handles (we want them colored):
|
||||
* TH_NURB_ULINE, TH_NURB_SEL_ULINE, TH_HANDLE_* */
|
||||
psl->overlay_edge_pass = DRW_pass_create(
|
||||
"Curve Handle Overlay",
|
||||
DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_WIRE);
|
||||
/* TODO: following handle theme colors,
|
||||
* For now use overlay vert shader for handles (we want them colored) */
|
||||
stl->g_data->overlay_edge_shgrp = DRW_shgroup_create(e_data.overlay_vert_sh, psl->overlay_edge_pass);
|
||||
|
||||
DRWShadingGroup *overlay_edge_shgrp = DRW_shgroup_create(e_data.overlay_edge_sh, psl->overlay_edge_pass);
|
||||
DRW_shgroup_uniform_vec2(overlay_edge_shgrp, "viewportSize", DRW_viewport_size_get(), 1);
|
||||
stl->g_data->overlay_edge_shgrp = overlay_edge_shgrp;
|
||||
|
||||
|
||||
psl->overlay_vert_pass = DRW_pass_create(
|
||||
"Curve Vert Overlay",
|
||||
|
@ -293,6 +298,7 @@ static void EDIT_CURVE_draw_scene(void *vedata)
|
|||
* Mostly used for freeing shaders */
|
||||
static void EDIT_CURVE_engine_free(void)
|
||||
{
|
||||
DRW_SHADER_FREE_SAFE(e_data.overlay_edge_sh);
|
||||
DRW_SHADER_FREE_SAFE(e_data.overlay_vert_sh);
|
||||
}
|
||||
|
||||
|
|
|
@ -37,6 +37,20 @@ layout(std140) uniform globalsBlock {
|
|||
|
||||
vec4 colorBackground;
|
||||
|
||||
vec4 colorHandleFree;
|
||||
vec4 colorHandleAuto;
|
||||
vec4 colorHandleVect;
|
||||
vec4 colorHandleAlign;
|
||||
vec4 colorHandleAutoclamp;
|
||||
vec4 colorHandleSelFree;
|
||||
vec4 colorHandleSelAuto;
|
||||
vec4 colorHandleSelVect;
|
||||
vec4 colorHandleSelAlign;
|
||||
vec4 colorHandleSelAutoclamp;
|
||||
vec4 colorNurbUline;
|
||||
vec4 colorNurbSelUline;
|
||||
vec4 colorActiveSpline;
|
||||
|
||||
vec4 colorGrid;
|
||||
vec4 colorGridEmphasise;
|
||||
vec4 colorGridAxisX;
|
||||
|
|
|
@ -0,0 +1,79 @@
|
|||
|
||||
#define ACTIVE_NURB 1 << 7 /* Keep the same value of `ACTIVE_NURB` in `draw_cache_imp_curve.c` */
|
||||
|
||||
layout(lines) in;
|
||||
layout(line_strip, max_vertices = 6) out;
|
||||
|
||||
uniform vec2 viewportSize;
|
||||
|
||||
flat in int vertFlag[];
|
||||
|
||||
flat out vec4 finalColor;
|
||||
|
||||
void main()
|
||||
{
|
||||
/* TODO: vertex size */
|
||||
|
||||
vec4 v1 = gl_in[0].gl_Position;
|
||||
vec4 v2 = gl_in[1].gl_Position;
|
||||
|
||||
int is_active_nurb = vertFlag[1] & ACTIVE_NURB;
|
||||
int color_id = vertFlag[1] ^ is_active_nurb;
|
||||
|
||||
if (is_active_nurb != 0) {
|
||||
/* draw the outline. */
|
||||
vec2 v1_2 = v2.xy - v1.xy;
|
||||
vec2 offset;
|
||||
|
||||
if (abs(v1_2.x * viewportSize.x) < abs(v1_2.y * viewportSize.y)) {
|
||||
offset = vec2(2.0 / viewportSize.x, 0.0);
|
||||
}
|
||||
else {
|
||||
offset = vec2(0.0, 2.0 / viewportSize.y);
|
||||
}
|
||||
|
||||
finalColor = colorActiveSpline;
|
||||
|
||||
gl_Position = v1;
|
||||
gl_Position.xy += offset * v1.w;
|
||||
EmitVertex();
|
||||
|
||||
gl_Position = v2;
|
||||
gl_Position.xy += offset * v2.w;
|
||||
EmitVertex();
|
||||
|
||||
EndPrimitive();
|
||||
|
||||
gl_Position = v1;
|
||||
gl_Position.xy -= offset * v1.w;
|
||||
EmitVertex();
|
||||
|
||||
gl_Position = v2;
|
||||
gl_Position.xy -= offset * v2.w;
|
||||
EmitVertex();
|
||||
|
||||
EndPrimitive();
|
||||
}
|
||||
|
||||
if (color_id == 0) finalColor = colorHandleFree;
|
||||
else if (color_id == 1) finalColor = colorHandleAuto;
|
||||
else if (color_id == 2) finalColor = colorHandleVect;
|
||||
else if (color_id == 3) finalColor = colorHandleAlign;
|
||||
else if (color_id == 4) finalColor = colorHandleAutoclamp;
|
||||
else if (color_id == 5) finalColor = colorHandleSelFree;
|
||||
else if (color_id == 6) finalColor = colorHandleSelAuto;
|
||||
else if (color_id == 7) finalColor = colorHandleSelVect;
|
||||
else if (color_id == 8) finalColor = colorHandleSelAlign;
|
||||
else if (color_id == 9) finalColor = colorHandleSelAutoclamp;
|
||||
else if (color_id == 10) finalColor = colorNurbUline;
|
||||
else if (color_id == 11) finalColor = colorNurbSelUline;
|
||||
else finalColor = colorVertexSelect;
|
||||
|
||||
gl_Position = v1;
|
||||
EmitVertex();
|
||||
|
||||
gl_Position = v2;
|
||||
EmitVertex();
|
||||
|
||||
EndPrimitive();
|
||||
}
|
Loading…
Reference in New Issue