Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntonio Vazquez <blendergit@gmail.com>2020-09-18 19:23:25 +0300
committerAntonio Vazquez <blendergit@gmail.com>2020-09-18 19:28:17 +0300
commit0335c1fd21dd49906968a2aa85b0016c8047f695 (patch)
treec424f99fbb8ee688156de6c51f4e9f65f3e9aa66 /source/blender/draw/engines/gpencil/gpencil_shader_fx.c
parent7b988188dc3f5ea05d90b8e16337147778f9f580 (diff)
GPencil: Implement Holdout materials
This new feature allows to use the strokes as an eraser of any stroke below. This is very handy to open holes in filled areas. After running some tests, we have decided to keep the additive effect of the holdout color. To get clean holdout areas, just move the color to black to remove any additive effect. To have additive effect can be used in situations like tint slightly a transparent window with blue to simulate the glass. See T79878 for more details Differential Revision: https://developer.blender.org/D8932
Diffstat (limited to 'source/blender/draw/engines/gpencil/gpencil_shader_fx.c')
-rw-r--r--source/blender/draw/engines/gpencil/gpencil_shader_fx.c74
1 files changed, 36 insertions, 38 deletions
diff --git a/source/blender/draw/engines/gpencil/gpencil_shader_fx.c b/source/blender/draw/engines/gpencil/gpencil_shader_fx.c
index cf6e78f4702..bf146add19d 100644
--- a/source/blender/draw/engines/gpencil/gpencil_shader_fx.c
+++ b/source/blender/draw/engines/gpencil/gpencil_shader_fx.c
@@ -585,10 +585,6 @@ void gpencil_vfx_cache_populate(GPENCIL_Data *vedata, Object *ob, GPENCIL_tObjec
bGPdata *gpd = (bGPdata *)ob->data;
GPENCIL_FramebufferList *fbl = vedata->fbl;
GPENCIL_PrivateData *pd = vedata->stl->pd;
- /* If simplify enabled, nothing more to do. */
- if (pd->simplify_fx) {
- return;
- }
/* These may not be allocated yet, use adress of future pointer. */
gpIterVfxData iter = {
@@ -601,44 +597,46 @@ void gpencil_vfx_cache_populate(GPENCIL_Data *vedata, Object *ob, GPENCIL_tObjec
.target_reveal_tx = &pd->reveal_layer_tx,
.source_reveal_tx = &pd->reveal_object_tx,
};
-
- LISTBASE_FOREACH (ShaderFxData *, fx, &ob->shader_fx) {
- if (effect_is_active(gpd, fx, pd->is_viewport)) {
- switch (fx->type) {
- case eShaderFxType_Blur:
- gpencil_vfx_blur((BlurShaderFxData *)fx, ob, &iter);
- break;
- case eShaderFxType_Colorize:
- gpencil_vfx_colorize((ColorizeShaderFxData *)fx, ob, &iter);
- break;
- case eShaderFxType_Flip:
- gpencil_vfx_flip((FlipShaderFxData *)fx, ob, &iter);
- break;
- case eShaderFxType_Pixel:
- gpencil_vfx_pixelize((PixelShaderFxData *)fx, ob, &iter);
- break;
- case eShaderFxType_Rim:
- gpencil_vfx_rim((RimShaderFxData *)fx, ob, &iter);
- break;
- case eShaderFxType_Shadow:
- gpencil_vfx_shadow((ShadowShaderFxData *)fx, ob, &iter);
- break;
- case eShaderFxType_Glow:
- gpencil_vfx_glow((GlowShaderFxData *)fx, ob, &iter);
- break;
- case eShaderFxType_Swirl:
- gpencil_vfx_swirl((SwirlShaderFxData *)fx, ob, &iter);
- break;
- case eShaderFxType_Wave:
- gpencil_vfx_wave((WaveShaderFxData *)fx, ob, &iter);
- break;
- default:
- break;
+ /* If simplify enabled, nothing more to do. */
+ if (!pd->simplify_fx) {
+ LISTBASE_FOREACH (ShaderFxData *, fx, &ob->shader_fx) {
+ if (effect_is_active(gpd, fx, pd->is_viewport)) {
+ switch (fx->type) {
+ case eShaderFxType_Blur:
+ gpencil_vfx_blur((BlurShaderFxData *)fx, ob, &iter);
+ break;
+ case eShaderFxType_Colorize:
+ gpencil_vfx_colorize((ColorizeShaderFxData *)fx, ob, &iter);
+ break;
+ case eShaderFxType_Flip:
+ gpencil_vfx_flip((FlipShaderFxData *)fx, ob, &iter);
+ break;
+ case eShaderFxType_Pixel:
+ gpencil_vfx_pixelize((PixelShaderFxData *)fx, ob, &iter);
+ break;
+ case eShaderFxType_Rim:
+ gpencil_vfx_rim((RimShaderFxData *)fx, ob, &iter);
+ break;
+ case eShaderFxType_Shadow:
+ gpencil_vfx_shadow((ShadowShaderFxData *)fx, ob, &iter);
+ break;
+ case eShaderFxType_Glow:
+ gpencil_vfx_glow((GlowShaderFxData *)fx, ob, &iter);
+ break;
+ case eShaderFxType_Swirl:
+ gpencil_vfx_swirl((SwirlShaderFxData *)fx, ob, &iter);
+ break;
+ case eShaderFxType_Wave:
+ gpencil_vfx_wave((WaveShaderFxData *)fx, ob, &iter);
+ break;
+ default:
+ break;
+ }
}
}
}
- if (tgp_ob->vfx.first != NULL) {
+ if ((!pd->simplify_fx && tgp_ob->vfx.first != NULL) || tgp_ob->do_mat_holdout) {
/* We need an extra pass to combine result to main buffer. */
iter.target_fb = &fbl->gpencil_fb;