[Bf-blender-cvs] [9982d1bc091] greasepencil-edit-curve: GPencil: First test to create handles drawing
Antonio Vazquez
noreply at git.blender.org
Sun Jun 7 19:03:58 CEST 2020
Commit: 9982d1bc091a7cc15a37fd465d46eaad395bf334
Author: Antonio Vazquez
Date: Sun Jun 7 19:01:40 2020 +0200
Branches: greasepencil-edit-curve
https://developer.blender.org/rB9982d1bc091a7cc15a37fd465d46eaad395bf334
GPencil: First test to create handles drawing
Basic structure
===================================================================
M release/scripts/startup/bl_ui/space_view3d.py
M source/blender/draw/engines/overlay/overlay_gpencil.c
M source/blender/draw/engines/overlay/overlay_private.h
M source/blender/draw/intern/draw_cache.h
M source/blender/draw/intern/draw_cache_impl_gpencil.c
M source/blender/makesdna/DNA_gpencil_types.h
===================================================================
diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index 9e66cc72bf8..4651d290143 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -6786,6 +6786,12 @@ class VIEW3D_PT_overlay_gpencil_options(Panel):
layout.prop(overlay, "vertex_opacity", text="Vertex Opacity", slider=True)
+ # Handles for Curve Edit
+ if context.object.mode == 'EDIT_GPENCIL':
+ gpd = context.object.data
+ if gpd.use_curve_edit:
+ layout.prop(overlay, "display_handle", text="Handles")
+
if context.object.mode in {'PAINT_GPENCIL', 'VERTEX_GPENCIL'}:
layout.label(text="Vertex Paint")
layout.prop(overlay, "gpencil_vertex_paint_opacity", text="Opacity", slider=True)
diff --git a/source/blender/draw/engines/overlay/overlay_gpencil.c b/source/blender/draw/engines/overlay/overlay_gpencil.c
index ccc914e0422..d4274618ea9 100644
--- a/source/blender/draw/engines/overlay/overlay_gpencil.c
+++ b/source/blender/draw/engines/overlay/overlay_gpencil.c
@@ -49,6 +49,10 @@ void OVERLAY_edit_gpencil_cache_init(OVERLAY_Data *vedata)
pd->edit_gpencil_wires_grp = NULL;
psl->edit_gpencil_ps = NULL;
+ pd->edit_gpencil_curve_handle_grp = NULL;
+ pd->edit_gpencil_curve_points_grp = NULL;
+ psl->edit_gpencil_curve_ps = NULL;
+
const DRWContextState *draw_ctx = DRW_context_state_get();
View3D *v3d = draw_ctx->v3d;
Object *ob = draw_ctx->obact;
@@ -105,7 +109,8 @@ void OVERLAY_edit_gpencil_cache_init(OVERLAY_Data *vedata)
(GPENCIL_EDIT_MODE(gpd) &&
(ts->gpencil_selectmode_edit != GP_SELECTMODE_STROKE));
- if ((!GPENCIL_VERTEX_MODE(gpd) && !GPENCIL_PAINT_MODE(gpd)) || use_vertex_mask) {
+ if ((!GPENCIL_CURVE_EDIT_SESSIONS_ON(gpd)) &&
+ ((!GPENCIL_VERTEX_MODE(gpd) && !GPENCIL_PAINT_MODE(gpd)) || use_vertex_mask)) {
DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL |
DRW_STATE_BLEND_ALPHA;
DRW_PASS_CREATE(psl->edit_gpencil_ps, state | pd->clipping_state);
@@ -132,6 +137,25 @@ void OVERLAY_edit_gpencil_cache_init(OVERLAY_Data *vedata)
}
}
+ /* Handles and curve point for Curve Edit submode. */
+ if (GPENCIL_CURVE_EDIT_SESSIONS_ON(gpd)) {
+ DRWState state = DRW_STATE_WRITE_COLOR;
+ DRW_PASS_CREATE(psl->edit_gpencil_curve_ps, state | pd->clipping_state);
+
+ sh = OVERLAY_shader_edit_curve_handle();
+ pd->edit_gpencil_curve_handle_grp = grp = DRW_shgroup_create(sh, psl->edit_gpencil_curve_ps);
+ DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
+ DRW_shgroup_uniform_bool_copy(grp, "showCurveHandles", pd->edit_curve.show_handles);
+ DRW_shgroup_uniform_int_copy(grp, "curveHandleDisplay", pd->edit_curve.handle_display);
+ DRW_shgroup_state_enable(grp, DRW_STATE_BLEND_ALPHA);
+
+ sh = OVERLAY_shader_edit_curve_point();
+ pd->edit_gpencil_curve_points_grp = grp = DRW_shgroup_create(sh, psl->edit_gpencil_curve_ps);
+ DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
+ DRW_shgroup_uniform_bool_copy(grp, "showCurveHandles", pd->edit_curve.show_handles);
+ DRW_shgroup_uniform_int_copy(grp, "curveHandleDisplay", pd->edit_curve.handle_display);
+ }
+
/* control points for primitives and speed guide */
const bool is_cppoint = (gpd->runtime.tot_cp_points > 0);
const bool is_speed_guide = (ts->gp_sculpt.guide.use_guide &&
@@ -182,6 +206,7 @@ void OVERLAY_edit_gpencil_cache_init(OVERLAY_Data *vedata)
void OVERLAY_gpencil_cache_init(OVERLAY_Data *vedata)
{
OVERLAY_PassList *psl = vedata->psl;
+ OVERLAY_PrivateData *pd = vedata->stl->pd;
struct GPUShader *sh;
DRWShadingGroup *grp;
@@ -196,6 +221,9 @@ void OVERLAY_gpencil_cache_init(OVERLAY_Data *vedata)
ToolSettings *ts = scene->toolsettings;
const View3DCursor *cursor = &scene->cursor;
+ pd->edit_curve.show_handles = v3d->overlay.handle_display != CURVE_HANDLE_NONE;
+ pd->edit_curve.handle_display = v3d->overlay.handle_display;
+
if (gpd == NULL || ob->type != OB_GPENCIL) {
return;
}
@@ -303,6 +331,20 @@ static void OVERLAY_edit_gpencil_cache_populate(OVERLAY_Data *vedata, Object *ob
struct GPUBatch *geom = DRW_cache_gpencil_edit_points_get(ob, pd->cfra);
DRW_shgroup_call_no_cull(grp, geom, ob);
}
+
+ if (pd->edit_gpencil_curve_handle_grp) {
+ struct GPUBatch *geom = DRW_cache_gpencil_edit_curve_handles_get(ob, pd->cfra);
+ if (geom) {
+ DRW_shgroup_call_no_cull(pd->edit_gpencil_curve_handle_grp, geom, ob);
+ }
+ }
+
+ if (pd->edit_gpencil_curve_points_grp) {
+ struct GPUBatch *geom = DRW_cache_gpencil_edit_curve_points_get(ob, pd->cfra);
+ if (geom) {
+ DRW_shgroup_call_no_cull(pd->edit_gpencil_curve_points_grp, geom, ob);
+ }
+ }
}
static void overlay_gpencil_draw_stroke_color_name(bGPDlayer *UNUSED(gpl),
@@ -407,4 +449,9 @@ void OVERLAY_edit_gpencil_draw(OVERLAY_Data *vedata)
if (psl->edit_gpencil_ps) {
DRW_draw_pass(psl->edit_gpencil_ps);
}
+
+ /* Curve edit handles. */
+ if (psl->edit_gpencil_curve_ps) {
+ DRW_draw_pass(psl->edit_gpencil_curve_ps);
+ }
}
diff --git a/source/blender/draw/engines/overlay/overlay_private.h b/source/blender/draw/engines/overlay/overlay_private.h
index ed0a9cf6981..3b3d1bb710b 100644
--- a/source/blender/draw/engines/overlay/overlay_private.h
+++ b/source/blender/draw/engines/overlay/overlay_private.h
@@ -61,6 +61,7 @@ typedef struct OVERLAY_PassList {
DRWPass *edit_curve_handle_ps;
DRWPass *edit_gpencil_ps;
DRWPass *edit_gpencil_gizmos_ps;
+ DRWPass *edit_gpencil_curve_ps;
DRWPass *edit_lattice_ps;
DRWPass *edit_mesh_depth_ps[2];
DRWPass *edit_mesh_verts_ps[2];
@@ -224,6 +225,8 @@ typedef struct OVERLAY_PrivateData {
DRWShadingGroup *edit_lattice_wires_grp;
DRWShadingGroup *edit_gpencil_points_grp;
DRWShadingGroup *edit_gpencil_wires_grp;
+ DRWShadingGroup *edit_gpencil_curve_handle_grp;
+ DRWShadingGroup *edit_gpencil_curve_points_grp;
DRWShadingGroup *edit_mesh_depth_grp[2];
DRWShadingGroup *edit_mesh_faces_grp[2];
DRWShadingGroup *edit_mesh_faces_cage_grp[2];
diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h
index 221fb89612f..a26ff474c1b 100644
--- a/source/blender/draw/intern/draw_cache.h
+++ b/source/blender/draw/intern/draw_cache.h
@@ -240,6 +240,8 @@ struct GPUBatch *DRW_cache_gpencil_strokes_get(struct Object *ob, int cfra);
struct GPUBatch *DRW_cache_gpencil_fills_get(struct Object *ob, int cfra);
struct GPUBatch *DRW_cache_gpencil_edit_lines_get(struct Object *ob, int cfra);
struct GPUBatch *DRW_cache_gpencil_edit_points_get(struct Object *ob, int cfra);
+struct GPUBatch *DRW_cache_gpencil_edit_curve_handles_get(struct Object *ob, int cfra);
+struct GPUBatch *DRW_cache_gpencil_edit_curve_points_get(struct Object *ob, int cfra);
struct GPUBatch *DRW_cache_gpencil_sbuffer_stroke_get(struct Object *ob);
struct GPUBatch *DRW_cache_gpencil_sbuffer_fill_get(struct Object *ob);
diff --git a/source/blender/draw/intern/draw_cache_impl_gpencil.c b/source/blender/draw/intern/draw_cache_impl_gpencil.c
index b4974330043..dd0cce89297 100644
--- a/source/blender/draw/intern/draw_cache_impl_gpencil.c
+++ b/source/blender/draw/intern/draw_cache_impl_gpencil.c
@@ -21,6 +21,7 @@
* \ingroup draw
*/
+#include "DNA_curve_types.h"
#include "DNA_gpencil_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_screen_types.h"
@@ -43,6 +44,9 @@
#include "draw_cache.h"
#include "draw_cache_impl.h"
+#define BEZIER_HANDLE 1 << 3
+#define COLOR_SHIFT 5
+
/* ---------------------------------------------------------------------- */
typedef struct GpencilBatchCache {
/** Instancing Data */
@@ -59,6 +63,10 @@ typedef struct GpencilBatchCache {
GPUVertBuf *edit_vbo;
GPUBatch *edit_lines_batch;
GPUBatch *edit_points_batch;
+ /** Edit Curve Mode */
+ GPUVertBuf *edit_curve_vbo;
+ GPUBatch *edit_curve_handles_batch;
+ GPUBatch *edit_curve_points_batch;
/** Cache is dirty */
bool is_dirty;
@@ -123,6 +131,10 @@ static void gpencil_batch_cache_clear(GpencilBatchCache *cache)
GPU_BATCH_DISCARD_SAFE(cache->edit_points_batch);
GPU_VERTBUF_DISCARD_SAFE(cache->edit_vbo);
+ GPU_BATCH_DISCARD_SAFE(cache->edit_curve_handles_batch);
+ GPU_BATCH_DISCARD_SAFE(cache->edit_curve_points_batch);
+ GPU_VERTBUF_DISCARD_SAFE(cache->edit_curve_vbo);
+
cache->is_dirty = true;
}
@@ -198,6 +210,23 @@ static GPUVertFormat *gpencil_edit_stroke_format(void)
return &format;
}
+/* MUST match the format below. */
+typedef struct gpEditCurveVert {
+ float pos[3];
+ int data;
+} gpEditCurveVert;
+
+static GPUVertFormat *gpencil_edit_curve_format(void)
+{
+ static GPUVertFormat format = {0};
+ if (format.attr_len == 0) {
+ /* initialize vertex formats */
+ GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
+ GPU_vertformat_attr_add(&format, "data", GPU_COMP_U8, 1, GPU_FETCH_INT);
+ }
+ return &format;
+}
+
/* MUST match the format below. */
typedef struct gpColorVert {
float vcol[4]; /* Vertex color */
@@ -230,6 +259,7 @@ typedef struct gpIterData {
GPUIndexBufBuilder ibo;
int vert_len;
int tri_len;
+ int curve_len;
} gpIterData;
static GPUVertBuf *gpencil_dummy_buffer_get(void)
@@ -385,6 +415,7 @@ static void gpencil_batches_ensure(Object *ob, GpencilBatchCache *cache, int cfr
.ibo = {0},
.vert_len = 1, /* Start at 1 for the gl_InstanceID trick to work (see vert shader). */
.tri_len = 0,
+ .curve_len = 0,
};
BKE_gpencil_visible_stroke_iter(
NULL, ob, NULL, gp_object_verts_count_cb, &iter, do_onion, cfra);
@@ -652,6 +683,11 @@ typedef struct gpEditIterData {
int vgindex;
} gpEditIterData;
+typedef struct gpEditCurveIterData {
+ gpEditCurveVert *verts;
+ int vgindex;
+} gpEditCurveIterData;
+
static uint32_t gpencil_point_edit_flag(const bool layer_lock,
const bGPDspoint *pt,
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list