Compare commits

...

11 Commits

Author SHA1 Message Date
8a6604f253 Merge branch 'master' into temp-gpencil-masking
Conflicts:
	source/blender/blenloader/intern/versioning_300.c
2021-05-26 12:43:03 +02:00
edf1b83367 Merge branch 'master' into temp-gpencil-masking
Conflicts:
	source/blender/blenloader/intern/versioning_300.c
2021-04-22 16:37:10 +02:00
4162d177a2 Merge branch 'master' into temp-gpencil-masking 2021-04-21 18:39:12 +02:00
c5e51222db Set test texture 2021-04-21 18:38:38 +02:00
8f3b657c9f Fix wrong flag 2021-04-20 19:19:23 +02:00
03a7f068d0 Change pass flags 2021-04-20 19:17:10 +02:00
2311c2b4fb Fix error in versioning code 2021-04-20 18:42:38 +02:00
57024cbffa Added versioning code and default values 2021-04-20 17:40:46 +02:00
532b27dede Add new shader for new pass 2021-04-20 17:28:56 +02:00
4801ac5fae Merge branch 'master' into temp-gpencil-masking 2021-04-20 17:18:57 +02:00
1a3e4e4cc2 Basic structure to Mask Intersect
WIP (still not working)
2021-04-20 16:39:06 +02:00
11 changed files with 98 additions and 3 deletions

View File

@@ -769,6 +769,7 @@ class GPENCIL_UL_masks(UIList):
if self.layout_type in {'DEFAULT', 'COMPACT'}:
row = layout.row(align=True)
row.prop(mask, "name", text="", emboss=False, icon_value=icon)
row.prop(mask, "intersect", text="", emboss=False)
row.prop(mask, "invert", text="", emboss=False)
row.prop(mask, "hide", text="", emboss=False)
elif self.layout_type == 'GRID':

View File

@@ -1534,6 +1534,7 @@ bGPDlayer_Mask *BKE_gpencil_layer_mask_add(bGPDlayer *gpl, const char *name)
bGPDlayer_Mask *mask = MEM_callocN(sizeof(bGPDlayer_Mask), "bGPDlayer_Mask");
BLI_addtail(&gpl->mask_layers, mask);
BLI_strncpy(mask->name, name, sizeof(mask->name));
mask->flag |= GP_MASK_INTERSECT;
gpl->act_mask++;
return mask;

View File

@@ -26,10 +26,12 @@
#include "DNA_brush_types.h"
#include "DNA_genfile.h"
#include "DNA_gpencil_types.h"
#include "DNA_modifier_types.h"
#include "DNA_text_types.h"
#include "BKE_lib_id.h"
#include "BKE_main.h"
#include "BKE_node.h"
@@ -45,7 +47,24 @@ void do_versions_after_linking_300(Main *bmain, ReportList *UNUSED(reports))
id_fake_user_set(&text->id);
}
}
/* Grease Pencil Masking Intersect. */
Scene *scene = bmain->scenes.first;
if (scene != NULL) {
LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
if (ob->type != OB_GPENCIL) {
continue;
}
bGPdata *gpd = ob->data;
LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
LISTBASE_FOREACH (bGPDlayer_Mask *, mask, &gpl->mask_layers) {
mask->flag |= GP_MASK_INTERSECT;
}
}
}
}
}
/**
* Versioning code until next subversion bump goes here.
*

View File

@@ -335,6 +335,7 @@ data_to_c_simple(engines/gpencil/shaders/gpencil_antialiasing_vert.glsl SRC)
data_to_c_simple(engines/gpencil/shaders/gpencil_common_lib.glsl SRC)
data_to_c_simple(engines/gpencil/shaders/gpencil_layer_blend_frag.glsl SRC)
data_to_c_simple(engines/gpencil/shaders/gpencil_mask_invert_frag.glsl SRC)
data_to_c_simple(engines/gpencil/shaders/gpencil_mask_intersect_frag.glsl SRC)
data_to_c_simple(engines/gpencil/shaders/gpencil_depth_merge_frag.glsl SRC)
data_to_c_simple(engines/gpencil/shaders/gpencil_depth_merge_vert.glsl SRC)
data_to_c_simple(engines/gpencil/shaders/gpencil_vfx_frag.glsl SRC)

View File

@@ -277,9 +277,9 @@ GPENCIL_tLayer *gpencil_layer_cache_add(GPENCIL_PrivateData *pd,
bool is_masked = (gpl->flag & GP_LAYER_USE_MASK) && !BLI_listbase_is_empty(&gpl->mask_layers);
float vert_col_opacity = (override_vertcol) ?
(is_vert_col_mode ? pd->vertex_paint_opacity : 0.0f) :
pd->is_render ? gpl->vertex_paint_opacity :
pd->vertex_paint_opacity;
(is_vert_col_mode ? pd->vertex_paint_opacity : 0.0f) :
pd->is_render ? gpl->vertex_paint_opacity :
pd->vertex_paint_opacity;
/* Negate thickness sign to tag that strokes are in screen space.
* Convert to world units (by default, 1 meter = 2000 px). */
float thickness_scale = (is_screenspace) ? -1.0f : (gpd->pixfactor / GPENCIL_PIXEL_FACTOR);
@@ -294,6 +294,7 @@ GPENCIL_tLayer *gpencil_layer_cache_add(GPENCIL_PrivateData *pd,
tgp_layer->layer_id = BLI_findindex(&gpd->layers, gpl);
tgp_layer->mask_bits = NULL;
tgp_layer->mask_invert_bits = NULL;
tgp_layer->mask_union_bits = NULL;
tgp_layer->blend_ps = NULL;
/* Masking: Go through mask list and extract valid masks in a bitmap. */
@@ -303,6 +304,7 @@ GPENCIL_tLayer *gpencil_layer_cache_add(GPENCIL_PrivateData *pd,
* TODO(fclem): Find a better system without any limitation. */
tgp_layer->mask_bits = BLI_memblock_alloc(pd->gp_maskbit_pool);
tgp_layer->mask_invert_bits = BLI_memblock_alloc(pd->gp_maskbit_pool);
tgp_layer->mask_union_bits = BLI_memblock_alloc(pd->gp_maskbit_pool);
BLI_bitmap_set_all(tgp_layer->mask_bits, false, GP_MAX_MASKBITS);
LISTBASE_FOREACH (bGPDlayer_Mask *, mask, &gpl->mask_layers) {
@@ -312,8 +314,10 @@ GPENCIL_tLayer *gpencil_layer_cache_add(GPENCIL_PrivateData *pd,
int index = BLI_findindex(&gpd->layers, gpl_mask);
if (index < GP_MAX_MASKBITS) {
const bool invert = (mask->flag & GP_MASK_INVERT) != 0;
const bool intersect = (mask->flag & GP_MASK_INTERSECT) != 0;
BLI_BITMAP_SET(tgp_layer->mask_bits, index, true);
BLI_BITMAP_SET(tgp_layer->mask_invert_bits, index, invert);
BLI_BITMAP_SET(tgp_layer->mask_union_bits, index, intersect);
valid_mask = true;
}
}

View File

@@ -308,7 +308,15 @@ void GPENCIL_cache_init(void *ved)
grp = DRW_shgroup_create(sh, psl->mask_invert_ps);
DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
}
{
DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_MUL;
DRW_PASS_CREATE(psl->mask_intersect_ps, state);
GPUShader *sh = GPENCIL_shader_mask_intersect_get();
grp = DRW_shgroup_create(sh, psl->mask_intersect_ps);
DRW_shgroup_uniform_texture_ref(grp, "maskBuf", &pd->mask_tx);
DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
}
Camera *cam = (pd->camera != NULL) ? pd->camera->data : NULL;
/* Pseudo DOF setup. */
@@ -752,6 +760,15 @@ void GPENCIL_cache_finish(void *ved)
GPU_ATTACHMENT_TEXTURE(color_tx),
GPU_ATTACHMENT_TEXTURE(pd->mask_tx),
});
pd->mask_intersect_tx = DRW_texture_pool_query_2d(
size[0], size[1], mask_format, &draw_engine_gpencil_type);
GPU_framebuffer_ensure_config(&fbl->mask_intersect_fb,
{
GPU_ATTACHMENT_TEXTURE(depth_tx),
GPU_ATTACHMENT_TEXTURE(color_tx),
GPU_ATTACHMENT_TEXTURE(pd->mask_intersect_tx),
});
}
GPENCIL_antialiasing_init(vedata);
@@ -818,6 +835,14 @@ static void gpencil_draw_mask(GPENCIL_Data *vedata, GPENCIL_tObject *ob, GPENCIL
GPU_framebuffer_clear_color_depth(fbl->mask_fb, clear_col, clear_depth);
}
if (!BLI_BITMAP_TEST_BOOL(layer->mask_union_bits, i)) {
/* mask_intersect_fb is the same as mask_fb it can even reuse the same color & depth
texture.
* But it needs a dedicated mask_tx (named mask_intersect_tx). */
GPU_framebuffer_bind(fbl->mask_intersect_fb);
GPU_framebuffer_clear_color(fbl->mask_intersect_fb, clear_col);
}
GPENCIL_tLayer *mask_layer = gpencil_layer_cache_get(ob, i);
/* When filtering by viewlayer, the mask could be null and must be ignored. */
if (mask_layer == NULL) {
@@ -825,6 +850,11 @@ static void gpencil_draw_mask(GPENCIL_Data *vedata, GPENCIL_tObject *ob, GPENCIL
}
DRW_draw_pass(mask_layer->geom_ps);
if (!BLI_BITMAP_TEST_BOOL(layer->mask_union_bits, i)) {
/* Fullscreen quad outputing. 1.0 - mask_intersect_tx in multiply blend mode. */
DRW_draw_pass(psl->mask_intersect_ps);
}
}
if (!inverted) {

View File

@@ -167,6 +167,7 @@ typedef struct GPENCIL_tLayer {
/** Layer id of the mask. */
BLI_bitmap *mask_bits;
BLI_bitmap *mask_invert_bits;
BLI_bitmap *mask_union_bits;
/** Index in the layer list. Used as id for masking. */
int layer_id;
} GPENCIL_tLayer;
@@ -211,6 +212,8 @@ typedef struct GPENCIL_PassList {
struct DRWPass *merge_depth_ps;
/* Invert mask buffer content. */
struct DRWPass *mask_invert_ps;
/* Intersect mask buffer content. */
struct DRWPass *mask_intersect_ps;
/* Anti-Aliasing. */
struct DRWPass *smaa_edge_ps;
struct DRWPass *smaa_weight_ps;
@@ -224,6 +227,7 @@ typedef struct GPENCIL_FramebufferList {
struct GPUFrameBuffer *layer_fb;
struct GPUFrameBuffer *object_fb;
struct GPUFrameBuffer *mask_fb;
struct GPUFrameBuffer *mask_intersect_fb;
struct GPUFrameBuffer *smaa_edge_fb;
struct GPUFrameBuffer *smaa_weight_fb;
} GPENCIL_FramebufferList;
@@ -283,6 +287,7 @@ typedef struct GPENCIL_PrivateData {
GPUTexture *reveal_object_tx;
/* Mask texture */
GPUTexture *mask_tx;
GPUTexture *mask_intersect_tx;
/* Anti-Aliasing. */
GPUTexture *smaa_edge_tx;
GPUTexture *smaa_weight_tx;
@@ -412,6 +417,7 @@ struct GPUShader *GPENCIL_shader_antialiasing(int stage);
struct GPUShader *GPENCIL_shader_geometry_get(void);
struct GPUShader *GPENCIL_shader_layer_blend_get(void);
struct GPUShader *GPENCIL_shader_mask_invert_get(void);
struct GPUShader *GPENCIL_shader_mask_intersect_get(void);
struct GPUShader *GPENCIL_shader_depth_merge_get(void);
struct GPUShader *GPENCIL_shader_fx_blur_get(void);
struct GPUShader *GPENCIL_shader_fx_colorize_get(void);

View File

@@ -30,6 +30,7 @@ extern char datatoc_gpencil_antialiasing_frag_glsl[];
extern char datatoc_gpencil_antialiasing_vert_glsl[];
extern char datatoc_gpencil_layer_blend_frag_glsl[];
extern char datatoc_gpencil_mask_invert_frag_glsl[];
extern char datatoc_gpencil_mask_intersect_frag_glsl[];
extern char datatoc_gpencil_depth_merge_frag_glsl[];
extern char datatoc_gpencil_depth_merge_vert_glsl[];
extern char datatoc_gpencil_vfx_frag_glsl[];
@@ -52,6 +53,8 @@ static struct {
GPUShader *depth_merge_sh;
/* Invert the content of the mask buffer. */
GPUShader *mask_invert_sh;
/* Intersect the content of the mask buffer. */
GPUShader *mask_intersect_sh;
/* Effects. */
GPUShader *fx_composite_sh;
GPUShader *fx_colorize_sh;
@@ -208,6 +211,15 @@ GPUShader *GPENCIL_shader_mask_invert_get(void)
return g_shaders.mask_invert_sh;
}
GPUShader *GPENCIL_shader_mask_intersect_get(void)
{
if (!g_shaders.mask_intersect_sh) {
g_shaders.mask_intersect_sh = DRW_shader_create_fullscreen(
datatoc_gpencil_mask_intersect_frag_glsl, NULL);
}
return g_shaders.mask_intersect_sh;
}
GPUShader *GPENCIL_shader_depth_merge_get(void)
{
if (!g_shaders.depth_merge_sh) {

View File

@@ -0,0 +1,12 @@
uniform sampler2D maskBuf;
in vec4 uvcoordsvar;
/* Blend mode is multiply. */
layout(location = 0) out vec4 fragColor;
layout(location = 1) out vec4 fragRevealage;
void main()
{
float mask = textureLod(maskBuf, uvcoordsvar.xy, 0).r;
fragRevealage = fragColor = vec4(1.0 - mask);
}

View File

@@ -438,6 +438,8 @@ typedef enum ebGPDlayer_Mask_Flag {
GP_MASK_HIDE = (1 << 0),
/* Mask is inverted. */
GP_MASK_INVERT = (1 << 1),
/* Mask is intersecting. */
GP_MASK_INTERSECT = (1 << 2),
} ebGPDlayer_Mask_Flag;
/* Runtime temp data for bGPDlayer */

View File

@@ -1944,6 +1944,13 @@ static void rna_def_gpencil_layer_mask(BlenderRNA *brna)
RNA_def_property_ui_icon(prop, ICON_CLIPUV_HLT, -1);
RNA_def_property_ui_text(prop, "Invert", "Invert mask");
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update");
prop = RNA_def_property(srna, "intersect", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_MASK_INTERSECT);
// TODO (antoniov) Better icon
RNA_def_property_ui_icon(prop, ICON_RADIOBUT_OFF, 1);
RNA_def_property_ui_text(prop, "Intersect", "Intersect mask");
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update");
}
static void rna_def_gpencil_layer(BlenderRNA *brna)