Commit: 693dfda035583df22c7ae86baa1fae740e8b5494 Author: Antonio Vazquez Date: Sun Jun 18 19:46:08 2017 +0200 Branches: greasepencil-object https://developer.blender.org/rB693dfda035583df22c7ae86baa1fae740e8b5494
WIP: adjust the shift factor with distance =================================================================== 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/shaders/gpencil_fill_frag.glsl M source/blender/draw/engines/gpencil/shaders/gpencil_stroke_geom.glsl =================================================================== 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 788952454af..d4b14d23434 100644 --- a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c +++ b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c @@ -159,7 +159,8 @@ static GpencilBatchCache *gpencil_batch_cache_get(bGPdata *gpd, int cfra) } /* create shading group for filling */ -static DRWShadingGroup *DRW_gpencil_shgroup_fill_create(GPENCIL_Data *vedata, DRWPass *pass, GPUShader *shader, bGPdata *gpd, PaletteColor *palcolor, int id) +static DRWShadingGroup *DRW_gpencil_shgroup_fill_create(GPENCIL_Data *vedata, DRWPass *pass, GPUShader *shader, Object *ob, + bGPdata *gpd, PaletteColor *palcolor, int id, float zdepth) { GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl; @@ -214,6 +215,21 @@ static DRWShadingGroup *DRW_gpencil_shgroup_fill_create(GPENCIL_Data *vedata, DR } } + /* object scale and depth */ + if ((ob) && (id > -1)) { + stl->shgroups[id].obj_scale = (ob->size[0] + ob->size[1] + ob->size[2]) / 3.0f; + stl->shgroups[id].obj_zdepth = zdepth; + DRW_shgroup_uniform_float(grp, "objscale", &stl->shgroups[id].obj_scale, 1); + DRW_shgroup_uniform_float(grp, "obj_zdepth", &stl->shgroups[id].obj_zdepth, 1); + } + else { + stl->storage->objscale = 1.0f; + stl->storage->zdepth = 0.0f; + DRW_shgroup_uniform_float(grp, "objscale", &stl->storage->objscale, 1); + DRW_shgroup_uniform_float(grp, "obj_zdepth", &stl->storage->zdepth, 1); + } + + return grp; } @@ -227,7 +243,8 @@ DRWShadingGroup *DRW_gpencil_shgroup_point_volumetric_create(DRWPass *pass, GPUS } /* create shading group for strokes */ -DRWShadingGroup *DRW_gpencil_shgroup_stroke_create(GPENCIL_Data *vedata, DRWPass *pass, GPUShader *shader, Object *ob, bGPdata *gpd, int id) +DRWShadingGroup *DRW_gpencil_shgroup_stroke_create(GPENCIL_Data *vedata, DRWPass *pass, GPUShader *shader, Object *ob, + bGPdata *gpd, int id, float zdepth) { GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl; const float *viewport_size = DRW_viewport_size_get(); @@ -239,14 +256,19 @@ DRWShadingGroup *DRW_gpencil_shgroup_stroke_create(GPENCIL_Data *vedata, DRWPass DRW_shgroup_uniform_float(grp, "pixsize", DRW_viewport_pixelsize_get(), 1); DRW_shgroup_uniform_float(grp, "pixelsize", &U.pixelsize, 1); - /* object scale */ - stl->storage->objscale = 1.0f; - float scale; - if (ob) { - scale = (ob->size[0] + ob->size[1] + ob->size[2]) / 3.0f; - stl->storage->objscale = scale; + /* object scale and depth */ + if ((ob) && (id > -1)) { + stl->shgroups[id].obj_scale = (ob->size[0] + ob->size[1] + ob->size[2]) / 3.0f; + stl->shgroups[id].obj_zdepth = zdepth; + DRW_shgroup_uniform_float(grp, "objscale", &stl->shgroups[id].obj_scale, 1); + DRW_shgroup_uniform_float(grp, "obj_zdepth", &stl->shgroups[id].obj_zdepth, 1); + } + else { + stl->storage->objscale = 1.0f; + stl->storage->zdepth = 0.0f; + DRW_shgroup_uniform_float(grp, "objscale", &stl->storage->objscale, 1); + DRW_shgroup_uniform_float(grp, "obj_zdepth", &stl->storage->zdepth, 1); } - DRW_shgroup_uniform_float(grp, "objscale", &stl->storage->objscale, 1); /* If disable zoom for strokes, disable scale */ if ((gpd) && (gpd->flag & GP_DATA_STROKE_KEEPTHICKNESS)) { @@ -388,7 +410,7 @@ static void gpencil_add_editpoints_shgroup(GPENCIL_StorageList *stl, GpencilBatc /* main function to draw strokes */ static void gpencil_draw_strokes(GpencilBatchCache *cache, GPENCIL_e_data *e_data, void *vedata, ToolSettings *ts, Object *ob, bGPdata *gpd, bGPDlayer *gpl, bGPDframe *gpf, - const float opacity, const float tintcolor[4], const bool onion, const bool custonion) + const float opacity, const float tintcolor[4], const bool onion, const bool custonion, float zdepth) { GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl; GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl; @@ -423,10 +445,10 @@ static void gpencil_draw_strokes(GpencilBatchCache *cache, GPENCIL_e_data *e_dat if (gps->totpoints > 1) { int id = stl->storage->pal_id; stl->shgroups[id].sort = stl->g_data->main_sort; - stl->shgroups[id].shgrps_fill = DRW_gpencil_shgroup_fill_create(vedata, psl->stroke_pass, e_data->gpencil_fill_sh, gpd, gps->palcolor, id); - stl->shgroups[id].shgrps_stroke = DRW_gpencil_shgroup_stroke_create(vedata, psl->stroke_pass, e_data->gpencil_stroke_sh, ob, gpd, id); + stl->shgroups[id].shgrps_fill = DRW_gpencil_shgroup_fill_create(vedata, psl->stroke_pass, e_data->gpencil_fill_sh, ob, gpd, gps->palcolor, id, zdepth); + stl->shgroups[id].shgrps_stroke = DRW_gpencil_shgroup_stroke_create(vedata, psl->stroke_pass, e_data->gpencil_stroke_sh, ob, gpd, id, zdepth); ++stl->storage->pal_id; - stl->g_data->main_sort += 6; + stl->g_data->main_sort += 15; fillgrp = stl->shgroups[id].shgrps_fill; strokegrp = stl->shgroups[id].shgrps_stroke; @@ -486,7 +508,8 @@ static void gpencil_draw_buffer_strokes(GpencilBatchCache *cache, void *vedata, } /* draw onion-skinning for a layer */ -static void gpencil_draw_onionskins(GpencilBatchCache *cache, GPENCIL_e_data *e_data, void *vedata, ToolSettings *ts, Object *ob, bGPdata *gpd, bGPDlayer *gpl, bGPDframe *gpf) +static void gpencil_draw_onionskins(GpencilBatchCache *cache, GPENCIL_e_data *e_data, void *vedata, + ToolSettings *ts, Object *ob, bGPdata *gpd, bGPDlayer *gpl, bGPDframe *gpf, float zdepth) { const float default_color[3] = { UNPACK3(U.gpencil_new_layer_col) }; const float alpha = 1.0f; @@ -508,7 +531,7 @@ static void gpencil_draw_onionskins(GpencilBatchCache *cache, GPENCIL_e_data *e_ /* alpha decreases with distance from curframe index */ float fac = 1.0f - ((float)(gpf->framenum - gf->framenum) / (float)(gpl->gstep + 1)); color[3] = alpha * fac * 0.66f; - gpencil_draw_strokes(cache, e_data, vedata, ts, ob, gpd, gpl, gf, 1.0f, color, true, gpl->flag & GP_LAYER_GHOST_PREVCOL); + gpencil_draw_strokes(cache, e_data, vedata, ts, ob, gpd, gpl, gf, 1.0f, color, true, gpl->flag & GP_LAYER_GHOST_PREVCOL, zdepth); } else break; @@ -518,7 +541,7 @@ static void gpencil_draw_onionskins(GpencilBatchCache *cache, GPENCIL_e_data *e_ /* draw the strokes for the ghost frames (at half of the alpha set by user) */ if (gpf->prev) { color[3] = (alpha / 7); - gpencil_draw_strokes(cache, e_data, vedata, ts, ob, gpd, gpl, gpf->prev, 1.0f, color, true, gpl->flag & GP_LAYER_GHOST_PREVCOL); + gpencil_draw_strokes(cache, e_data, vedata, ts, ob, gpd, gpl, gpf->prev, 1.0f, color, true, gpl->flag & GP_LAYER_GHOST_PREVCOL, zdepth); } } else { @@ -541,7 +564,7 @@ static void gpencil_draw_onionskins(GpencilBatchCache *cache, GPENCIL_e_data *e_ /* alpha decreases with distance from curframe index */ float fac = 1.0f - ((float)(gf->framenum - gpf->framenum) / (float)(gpl->gstep_next + 1)); color[3] = alpha * fac * 0.66f; - gpencil_draw_strokes(cache, e_data, vedata, ts, ob, gpd, gpl, gf, 1.0f, color, true, gpl->flag & GP_LAYER_GHOST_NEXTCOL); + gpencil_draw_strokes(cache, e_data, vedata, ts, ob, gpd, gpl, gf, 1.0f, color, true, gpl->flag & GP_LAYER_GHOST_NEXTCOL, zdepth); } else break; @@ -551,7 +574,7 @@ static void gpencil_draw_onionskins(GpencilBatchCache *cache, GPENCIL_e_data *e_ /* draw the strokes for the ghost frames (at half of the alpha set by user) */ if (gpf->next) { color[3] = (alpha / 4); - gpencil_draw_strokes(cache, e_data, vedata, ts, ob, gpd, gpl, gpf->next, 1.0f, color, true, gpl->flag & GP_LAYER_GHOST_NEXTCOL); + gpencil_draw_strokes(cache, e_data, vedata, ts, ob, gpd, gpl, gpf->next, 1.0f, color, true, gpl->flag & GP_LAYER_GHOST_NEXTCOL, zdepth); } } else { @@ -566,7 +589,20 @@ void DRW_gpencil_populate_datablock(GPENCIL_e_data *e_data, void *vedata, Scene printf("DRW_gpencil_populate_datablock for %s\n", gpd->id.name); } GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl; - stl->g_data->main_sort = 0; + const DRWContextState *draw_ctx = DRW_context_state_get(); + RegionView3D *rv3d = draw_ctx->rv3d; + /* get object zdepth */ + float zdepth = 0.0; + if (ob) { + if (rv3d->is_persp) { + zdepth = ED_view3d_calc_zfac(rv3d, ob->loc, NULL); + } + else { + zdepth = -dot_v3v3(rv3d->viewinv[2], ob->loc); + } + } + + stl->g_data->main_sort = -300; GpencilBatchCache *cache = gpencil_batch_cache_get(gpd, CFRA); cache->cache_idx = 0; @@ -582,13 +618,13 @@ void DRW_gpencil_populate_datablock(GPENCIL_e_data *e_data, void *vedata, Scene /* draw onion skins */ if ((gpl->flag & GP_LAYER_ONIONSKIN) || (gpl->flag & GP_LAYER_GHOST_ALWAYS)) { - gpencil_draw_onionskins(cache, e_data, vedata, ts, ob, gpd, gpl, gpf); + gpencil_draw_onionskins(cache, e_data, vedata, ts, ob, gpd, gpl, gpf, zdepth); } /* draw normal strokes */ - gpencil_draw_strokes(cache, e_data, vedata, ts, ob, gpd, gpl, gpf, gpl->opacity, gpl->tintcolor, false, false); + gpencil_draw_strokes(cache, e_data, vedata, ts, ob, gpd, gpl, gpf, gpl->opacity, gpl->tintcolor, false, false, zdepth); /* separate layers */ - stl->g_data->main_sort += 20; + stl->g_data->main_sort += 40; } /* draw current painting strokes */ gpencil_draw_buffer_strokes(cache, vedata, ts, gpd); diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c index 9b7f3fd2cf8..79ea17c7c21 100644 --- a/source/blender/draw/engines/gpencil/gpencil_engine.c +++ b/source/blender/draw/engines/gpencil/gpencil_engine.c @@ -125,7 +125,7 @@ static void GPENCIL_cache_init(void *vedata) /* drawing buffer pass */ psl->drawing_pass = DRW_pass_create("Gpencil Drawing Pass", state); - stl->g_data->shgrps_drawing_stroke = DRW_gpencil_shgroup_stroke_create(vedata, psl->drawing_pass, e_data.gpencil_stroke_sh, NULL, NULL, -1); + stl->g_data->shgrps_drawing_stroke = DRW_gpencil_shgroup_stroke_create(vedata, psl->drawing_pass, e_data.gpencil_stroke_sh, NULL, NULL, -1, 0.0); stl->g_data->shgrps_drawing_fill = DRW_gpencil_shgroup_drawing_fill_create(psl->drawing_pass, e_data.gpencil_drawing_fill_sh); } } diff --git a/source/blender/draw/engine @@ 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