Commit: fb5f9763fa3514cb570870b0f847a0b25f3ea72f Author: Antonio Vazquez Date: Mon Jul 3 20:14:12 2017 +0200 Branches: greasepencil-object https://developer.blender.org/rBfb5f9763fa3514cb570870b0f847a0b25f3ea72f
WIP: Add volumetric while drawing =================================================================== M source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c M source/blender/draw/engines/gpencil/gpencil_engine.c M source/blender/draw/engines/gpencil/gpencil_engine.h M source/blender/draw/engines/gpencil/gpencil_geom.c =================================================================== diff --git a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c index 0bf57951b3e..e0190ce8cfc 100644 --- a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c +++ b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c @@ -358,8 +358,8 @@ DRWShadingGroup *DRW_gpencil_shgroup_stroke_create(GPENCIL_e_data *e_data, GPENC } /* create shading group for volumetrics */ -static DRWShadingGroup *DRW_gpencil_shgroup_point_create(GPENCIL_e_data *e_data, GPENCIL_Data *vedata, DRWPass *pass, GPUShader *shader, Object *ob, - bGPdata *gpd, int id) +DRWShadingGroup *DRW_gpencil_shgroup_point_create(GPENCIL_e_data *e_data, GPENCIL_Data *vedata, DRWPass *pass, GPUShader *shader, Object *ob, + bGPdata *gpd, PaletteColor *palcolor, int id) { GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl; const float *viewport_size = DRW_viewport_size_get(); @@ -556,7 +556,7 @@ static void gpencil_draw_strokes(GpencilBatchCache *cache, GPENCIL_e_data *e_dat } else { stl->shgroups[id].shgrps_fill = NULL; - stl->shgroups[id].shgrps_stroke = DRW_gpencil_shgroup_point_create(e_data, vedata, psl->stroke_pass, e_data->gpencil_point_sh, ob, gpd, id); + stl->shgroups[id].shgrps_stroke = DRW_gpencil_shgroup_point_create(e_data, vedata, psl->stroke_pass, e_data->gpencil_point_sh, ob, gpd, gps->palcolor, id); } ++stl->storage->shgroup_id; @@ -598,7 +598,13 @@ void DRW_gpencil_populate_buffer_strokes(void *vedata, ToolSettings *ts, bGPdata /* if only one point, don't need to draw buffer because the user has no time to see it */ if (gpd->sbuffer_size > 1) { /* use unit matrix because the buffer is in screen space and does not need conversion */ - stl->g_data->batch_buffer_stroke = DRW_gpencil_get_buffer_stroke_geom(gpd, stl->storage->unit_matrix, lthick); + if (gpd->bstroke_style != STROKE_STYLE_VOLUMETRIC) { + stl->g_data->batch_buffer_stroke = DRW_gpencil_get_buffer_stroke_geom(gpd, stl->storage->unit_matrix, lthick); + } + else { + stl->g_data->batch_buffer_stroke = DRW_gpencil_get_buffer_point_geom(gpd, stl->storage->unit_matrix, lthick); + } + DRW_shgroup_call_add(stl->g_data->shgrps_drawing_stroke, stl->g_data->batch_buffer_stroke, stl->storage->unit_matrix); if ((gpd->sbuffer_size >= 3) && (gpd->sfill[3] > GPENCIL_ALPHA_OPACITY_THRESH)) { diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c index f7b94e6e57e..25607ee9160 100644 --- a/source/blender/draw/engines/gpencil/gpencil_engine.c +++ b/source/blender/draw/engines/gpencil/gpencil_engine.c @@ -164,16 +164,26 @@ static void GPENCIL_cache_init(void *vedata) /* edit pass */ psl->edit_pass = DRW_pass_create("Gpencil Edit Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND); stl->g_data->shgrps_edit_volumetric = DRW_gpencil_shgroup_edit_volumetric_create(psl->edit_pass, e_data.gpencil_volumetric_sh); - /* drawing buffer pass */ const DRWContextState *draw_ctx = DRW_context_state_get(); Palette *palette = BKE_palette_get_active_from_context(draw_ctx->evil_C); PaletteColor *palcolor = BKE_palette_color_get_active(palette); - stl->storage->stroke_style = STROKE_STYLE_SOLID; + if (palcolor) { + stl->storage->stroke_style = palcolor->stroke_style; + } + else { + stl->storage->stroke_style = STROKE_STYLE_SOLID; + } psl->drawing_pass = DRW_pass_create("Gpencil Drawing Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND); - stl->g_data->shgrps_drawing_stroke = DRW_gpencil_shgroup_stroke_create(&e_data, vedata, psl->drawing_pass, e_data.gpencil_stroke_sh, NULL, NULL, palcolor, -1); + if (stl->storage->stroke_style != STROKE_STYLE_VOLUMETRIC) { + stl->g_data->shgrps_drawing_stroke = DRW_gpencil_shgroup_stroke_create(&e_data, vedata, psl->drawing_pass, e_data.gpencil_stroke_sh, NULL, NULL, palcolor, -1); + } + else { + stl->g_data->shgrps_drawing_stroke = DRW_gpencil_shgroup_point_create(&e_data, vedata, psl->drawing_pass, e_data.gpencil_point_sh, NULL, NULL, palcolor, -1); + } + stl->g_data->shgrps_drawing_fill = DRW_gpencil_shgroup_drawing_fill_create(psl->drawing_pass, e_data.gpencil_drawing_fill_sh); /* we need a full screen pass to combine the result of zdepth */ diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h b/source/blender/draw/engines/gpencil/gpencil_engine.h index 0a7809a3401..b9088604af4 100644 --- a/source/blender/draw/engines/gpencil/gpencil_engine.h +++ b/source/blender/draw/engines/gpencil/gpencil_engine.h @@ -148,7 +148,9 @@ typedef struct GpencilBatchCache { } GpencilBatchCache; struct DRWShadingGroup *DRW_gpencil_shgroup_stroke_create(struct GPENCIL_e_data *e_data, struct GPENCIL_Data *vedata, struct DRWPass *pass, struct GPUShader *shader, struct Object *ob, - struct bGPdata *gpd, struct PaletteColor *palcolor, int id); + struct bGPdata *gpd, struct PaletteColor *palcolor, int id); +struct DRWShadingGroup *DRW_gpencil_shgroup_point_create(struct GPENCIL_e_data *e_data, struct GPENCIL_Data *vedata, struct DRWPass *pass, struct GPUShader *shader, struct Object *ob, + struct bGPdata *gpd, struct PaletteColor *palcolor, int id); struct DRWShadingGroup *DRW_gpencil_shgroup_point_volumetric_create(struct DRWPass *pass, struct GPUShader *shader); struct DRWShadingGroup *DRW_gpencil_shgroup_edit_volumetric_create(struct DRWPass *pass, struct GPUShader *shader); struct DRWShadingGroup *DRW_gpencil_shgroup_drawing_fill_create(struct DRWPass *pass, struct GPUShader *shader); @@ -162,7 +164,7 @@ struct Gwn_Batch *DRW_gpencil_get_fill_geom(struct bGPDstroke *gps, const float struct Gwn_Batch *DRW_gpencil_get_edit_geom(struct bGPDstroke *gps, float alpha, short dflag); struct Gwn_Batch *DRW_gpencil_get_buffer_stroke_geom(struct bGPdata *gpd, float matrix[4][4], short thickness); struct Gwn_Batch *DRW_gpencil_get_buffer_fill_geom(const struct tGPspoint *points, int totpoints, float ink[4]); -struct Gwn_Batch *DRW_gpencil_get_buffer_point_geom(struct bGPdata *gpd, short thickness); +struct Gwn_Batch *DRW_gpencil_get_buffer_point_geom(struct bGPdata *gpd, float matrix[4][4], short thickness); struct GPUTexture *DRW_gpencil_create_blank_texture(int width, int height); diff --git a/source/blender/draw/engines/gpencil/gpencil_geom.c b/source/blender/draw/engines/gpencil/gpencil_geom.c index 0c2e89c6ef5..6e2ce9c9121 100644 --- a/source/blender/draw/engines/gpencil/gpencil_geom.c +++ b/source/blender/draw/engines/gpencil/gpencil_geom.c @@ -198,49 +198,63 @@ static void gpencil_tpoint_to_point(Scene *scene, ARegion *ar, View3D *v3d, cons pt->strength = tpt->strength; } -/* create batch geometry data for current buffer for one point stroke shader */ -Gwn_Batch *DRW_gpencil_get_buffer_point_geom(bGPdata *gpd, short thickness) +/* create batch geometry data for current buffer stroke shader */ +Gwn_Batch *DRW_gpencil_get_buffer_stroke_geom(bGPdata *gpd, float matrix[4][4], short thickness) { const DRWContextState *draw_ctx = DRW_context_state_get(); Scene *scene = draw_ctx->scene; View3D *v3d = draw_ctx->v3d; ARegion *ar = draw_ctx->ar; + RegionView3D *rv3d = draw_ctx->rv3d; + ToolSettings *ts = scene->toolsettings; + Object *ob = draw_ctx->obact; - const tGPspoint *tpt = gpd->sbuffer; - bGPDspoint pt; - float ink[4]; - copy_v4_v4(ink, gpd->scolor); + tGPspoint *points = gpd->sbuffer; + int totpoints = gpd->sbuffer_size; static Gwn_VertFormat format = { 0 }; - static unsigned int pos_id, color_id, size_id; + static unsigned int pos_id, color_id, thickness_id; if (format.attrib_ct == 0) { pos_id = GWN_vertformat_attr_add(&format, "pos", GWN_COMP_F32, 3, GWN_FETCH_FLOAT); color_id = GWN_vertformat_attr_add(&format, "color", GWN_COMP_F32, 4, GWN_FETCH_FLOAT); - size_id = GWN_vertformat_attr_add(&format, "size", GWN_COMP_F32, 1, GWN_FETCH_FLOAT); + thickness_id = GWN_vertformat_attr_add(&format, "thickness", GWN_COMP_F32, 1, GWN_FETCH_FLOAT); } Gwn_VertBuf *vbo = GWN_vertbuf_create_with_format(&format); - GWN_vertbuf_data_alloc(vbo, 1); + GWN_vertbuf_data_alloc(vbo, totpoints + 2); + + /* draw stroke curve */ + const tGPspoint *tpt = points; + bGPDspoint pt; + int idx = 0; - /* convert to 3D */ - gpencil_tpoint_to_point(scene, ar, v3d, tpt, &pt); + /* get origin to reproject point */ + float origin[3]; + bGPDlayer *gpl = BKE_gpencil_layer_getactive(gpd); + ED_gp_get_drawing_reference(ts, v3d, scene, ob, gpl, ts->gpencil_v3d_align, origin); - float alpha = ink[3] * pt.strength; - CLAMP(alpha, GPENCIL_STRENGTH_MIN, 1.0f); - float col[4]; - ARRAY_SET_ITEMS(col, ink[0], ink[1], ink[2], alpha); - GWN_vertbuf_attr_set(vbo, color_id, 0, col); + for (int i = 0; i < totpoints; i++, tpt++) { + gpencil_tpoint_to_point(scene, ar, v3d, tpt, &pt); + ED_gp_project_point_to_plane(ob, rv3d, origin, ts->gp_sculpt.lock_axis - 1, ts->gpencil_src, &pt); - float thick = max_ff(pt.pressure * thickness, 1.0f); - GWN_vertbuf_attr_set(vbo, size_id, 0, &thick); + /* first point for adjacency (not drawn) */ + if (i == 0) { + gpencil_set_stroke_point(vbo, matrix, &pt, idx, pos_id, color_id, thickness_id, thickness, gpd->scolor); + ++idx; + } + /* set point */ + gpencil_set_stroke_point(vbo, matrix, &pt, idx, pos_id, color_id, thickness_id, thickness, gpd->scolor); + ++idx; + } - GWN_vertbuf_attr_set(vbo, pos_id, 0, &pt.x); + /* last adjacency point (not drawn) */ + gpencil_set_stroke_point(vbo, matrix, &pt, idx, pos_id, color_id, thickness_id, thickness, gpd->scolor); - return GWN_batch_create(GWN_PRIM_POINTS, vbo, NULL); + return GWN_batch_create(GWN_PRIM_LINE_STRIP_ADJ, vbo, NULL); } -/* create batch geometry data for current buffer stroke shader */ -Gwn_Batch *DRW_gpencil_get_buffer_stroke_geom(bGPdata *gpd, float matrix[4][4], short thickness) +/* create batch geometry data for current buffer point shader */ +Gwn_Batch *DRW_gpencil_get_buffer_point_geom(bGPdata *gpd, float matrix[4][4], short thickness) { const DRWContextState *draw_ctx = DRW_context_state_get(); Scene *scene = draw_ctx-> @@ 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