diff options
author | Campbell Barton <ideasman42@gmail.com> | 2017-04-15 09:46:17 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2017-04-19 17:38:44 +0300 |
commit | cdba73c8faf7ec28de66b380ed2952d42a2aac38 (patch) | |
tree | a8c07ccfcbf3fe513ba1c83cfc392a0d5a903841 /source/blender/draw/modes/edit_curve_mode.c | |
parent | ce6b01f203caae98a648bb3024479dba2e033c2a (diff) |
Draw Manager: curve support
Draws the curve centerline and editmode verts/handles.
Handle theme colors, and normal display still need adding.
Diffstat (limited to 'source/blender/draw/modes/edit_curve_mode.c')
-rw-r--r-- | source/blender/draw/modes/edit_curve_mode.c | 108 |
1 files changed, 79 insertions, 29 deletions
diff --git a/source/blender/draw/modes/edit_curve_mode.c b/source/blender/draw/modes/edit_curve_mode.c index 084550a0445..8aabae588a3 100644 --- a/source/blender/draw/modes/edit_curve_mode.c +++ b/source/blender/draw/modes/edit_curve_mode.c @@ -39,6 +39,14 @@ extern struct GPUUniformBuffer *globals_ubo; /* draw_common.c */ 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_gpu_shader_3D_vert_glsl[]; +extern char datatoc_gpu_shader_uniform_color_frag_glsl[]; +extern char datatoc_gpu_shader_point_uniform_color_frag_glsl[]; + /* *********** LISTS *********** */ /* All lists are per viewport specific datas. * They are all free when viewport changes engines @@ -50,7 +58,9 @@ typedef struct EDIT_CURVE_PassList { /* Declare all passes here and init them in * EDIT_CURVE_cache_init(). * Only contains (DRWPass *) */ - struct DRWPass *pass; + struct DRWPass *wire_pass; + struct DRWPass *overlay_edge_pass; + struct DRWPass *overlay_vert_pass; } EDIT_CURVE_PassList; typedef struct EDIT_CURVE_FramebufferList { @@ -93,15 +103,22 @@ static struct { * Add sources to source/blender/draw/modes/shaders * init in EDIT_CURVE_engine_init(); * free in EDIT_CURVE_engine_free(); */ - struct GPUShader *custom_shader; -} e_data = {NULL}; /* Engine data */ + struct GPUShader *wire_sh; -typedef struct g_data { + struct GPUShader *overlay_edge_sh; /* handles and nurbs control cage */ + struct GPUShader *overlay_vert_sh; +} e_data = {NULL}; /* Engine data */ +typedef struct g_data { /* This keeps the references of the shading groups for * easy access in EDIT_CURVE_cache_populate() */ - DRWShadingGroup *group; + + /* resulting curve as 'wire' for curves (and optionally normals) */ + DRWShadingGroup *wire_shgrp; + + DRWShadingGroup *overlay_edge_shgrp; + DRWShadingGroup *overlay_vert_shgrp; } g_data; /* Transient data */ /* *********** FUNCTIONS *********** */ @@ -132,8 +149,19 @@ static void EDIT_CURVE_engine_init(void *vedata) * tex, 2); */ - if (!e_data.custom_shader) { - e_data.custom_shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR); + if (!e_data.wire_sh) { + e_data.wire_sh = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR); + } + + if (!e_data.overlay_edge_sh) { + e_data.overlay_edge_sh = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR); + } + + if (!e_data.overlay_vert_sh) { + e_data.overlay_vert_sh = DRW_shader_create_with_lib( + datatoc_edit_curve_overlay_loosevert_vert_glsl, NULL, + datatoc_edit_curve_overlay_frag_glsl, + datatoc_common_globals_lib_glsl, NULL); } } @@ -150,22 +178,28 @@ static void EDIT_CURVE_cache_init(void *vedata) } { - /* Create a pass */ - DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_BLEND | DRW_STATE_WIRE; - psl->pass = DRW_pass_create("My Pass", state); - - /* Create a shadingGroup using a function in draw_common.c or custom one */ - /* - * stl->g_data->group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); - * -- or -- - * stl->g_data->group = DRW_shgroup_create(e_data.custom_shader, psl->pass); - */ - stl->g_data->group = DRW_shgroup_create(e_data.custom_shader, psl->pass); - - /* Uniforms need a pointer to it's value so be sure it's accessible at - * any given time (i.e. use static vars) */ - static float color[4] = {0.2f, 0.5f, 0.3f, 1.0}; - DRW_shgroup_uniform_vec4(stl->g_data->group, "color", color, 1); + /* Center-Line (wire) */ + psl->wire_pass = DRW_pass_create( + "Curve Wire", + DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_WIRE); + 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); + + psl->overlay_vert_pass = DRW_pass_create( + "Curve Vert Overlay", + DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH); + + stl->g_data->overlay_vert_shgrp = DRW_shgroup_create(e_data.overlay_vert_sh, psl->overlay_vert_pass); } } @@ -175,15 +209,29 @@ static void EDIT_CURVE_cache_populate(void *vedata, Object *ob) { EDIT_CURVE_PassList *psl = ((EDIT_CURVE_Data *)vedata)->psl; EDIT_CURVE_StorageList *stl = ((EDIT_CURVE_Data *)vedata)->stl; + const struct bContext *C = DRW_get_context(); + Scene *scene = CTX_data_scene(C); + Object *obedit = scene->obedit; UNUSED_VARS(psl, stl); - if (ob->type == OB_MESH) { - /* Get geometry cache */ - struct Batch *geom = DRW_cache_mesh_surface_get(ob); + if (ob->type == OB_CURVE) { + if (ob == obedit) { + /* Get geometry cache */ + struct Batch *geom; + +// geom = DRW_cache_mesh_surface_get(ob); + + geom = DRW_cache_curve_edge_wire_get(ob); + DRW_shgroup_call_add(stl->g_data->wire_shgrp, geom, ob->obmat); + + /* Add geom to a shading group */ + geom = DRW_cache_curve_edge_overlay_get(ob); + DRW_shgroup_call_add(stl->g_data->overlay_edge_shgrp, geom, ob->obmat); - /* Add geom to a shading group */ - DRW_shgroup_call_add(stl->g_data->group, geom, ob->obmat); + geom = DRW_cache_curve_vert_overlay_get(ob); + DRW_shgroup_call_add(stl->g_data->overlay_vert_shgrp, geom, ob->obmat); + } } } @@ -219,7 +267,9 @@ static void EDIT_CURVE_draw_scene(void *vedata) */ /* ... or just render passes on default framebuffer. */ - DRW_draw_pass(psl->pass); + DRW_draw_pass(psl->wire_pass); + DRW_draw_pass(psl->overlay_edge_pass); + DRW_draw_pass(psl->overlay_vert_pass); /* If you changed framebuffer, double check you rebind * the default one with its textures attached before finishing */ |