Commit: 375d27f230e41e4bcb53183082739c580f74c709
Author: mano-wii
Date:   Tue Jan 9 13:29:16 2018 +1100
Branches: blender2.8
https://developer.blender.org/rB375d27f230e41e4bcb53183082739c580f74c709

Curve Edit Mode: Use curve handle theme colors

===================================================================

M       source/blender/draw/CMakeLists.txt
M       source/blender/draw/intern/draw_cache_impl_curve.c
M       source/blender/draw/intern/draw_common.c
M       source/blender/draw/intern/draw_common.h
M       source/blender/draw/modes/edit_curve_mode.c
M       source/blender/draw/modes/shaders/common_globals_lib.glsl
A       source/blender/draw/modes/shaders/edit_curve_overlay_handle_geom.glsl

===================================================================

diff --git a/source/blender/draw/CMakeLists.txt 
b/source/blender/draw/CMakeLists.txt
index 8339b6b8720..03ab9cf9435 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -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)
diff --git a/source/blender/draw/intern/draw_cache_impl_curve.c 
b/source/blender/draw/intern/draw_cache_impl_curve.c
index a6dc52f66c9..8edea5fd963 100644
--- a/source/blender/draw/intern/draw_cache_impl_curve.c
+++ b/source/blender/draw/intern/draw_cache_impl_curve.c
@@ -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;
-
-                                               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;
+                                               char col_id;
 
-                                               /* 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;
-                                               }
 
-                                               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;
+                                                       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;
+                                               }
                                        }
-                                       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;
 }
 
-/** \} */
\ No newline at end of file
+/** \} */
diff --git a/source/blender/draw/intern/draw_common.c 
b/source/blender/draw/intern/draw_common.c
index 6ce01056bfc..e86a231c19d 100644
--- a/source/blender/draw/intern/draw_common.c
+++ b/source/blender/draw/intern/draw_common.c
@@ -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 */
diff --git a/source/blender/draw/intern/draw_common.h 
b/source/blender/draw/intern/draw_common.h
index 0bdb79b3a40..0a7227287ea 100644
--- a/source/blender/draw/intern/draw_common.h
+++ b/source/blender/draw/intern/draw_common.h
@@ -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];
diff --git a/source/blender/draw/modes/edit_curve_mode.c 
b/source/blender/draw/modes/edit_curve_mode.c
index 3f2c75407b7..d1c40fe9b03 100644
--- a/source/blender/draw/modes/edit_curve_mode.c
+++ b/source/blender/draw/modes/edit_curve_mode.c
@@ -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);
 }
 
diff --git a/source/blender/draw/modes/shaders/common_globals_lib.glsl 
b/source/blender/draw/modes/shaders/common_globals_lib.glsl
index dc36d252926..0c14c1e7db0 100644
--- a/source/blender/draw/modes/shaders/common_globals_lib.glsl
+++ b/source/blender/draw/modes/shaders/common_globals_lib.glsl
@@ -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 colorH

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to