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:
-rw-r--r--release/scripts/startup/bl_ui/properties_data_gpencil.py18
-rw-r--r--release/scripts/startup/bl_ui/properties_material_gpencil.py9
-rw-r--r--release/scripts/startup/bl_ui/space_dopesheet.py4
-rw-r--r--release/scripts/startup/bl_ui/space_topbar.py4
-rw-r--r--source/blender/blenkernel/intern/material.c2
-rw-r--r--source/blender/draw/engines/eevee/eevee_engine.c3
-rw-r--r--source/blender/draw/engines/eevee/eevee_materials.c160
-rw-r--r--source/blender/draw/engines/eevee/eevee_private.h11
-rw-r--r--source/blender/draw/engines/eevee/eevee_render.c3
-rw-r--r--source/blender/draw/engines/eevee/eevee_shaders.c5
-rw-r--r--source/blender/draw/engines/eevee/shaders/prepass_vert.glsl14
-rw-r--r--source/blender/draw/engines/eevee/shaders/surface_vert.glsl17
-rw-r--r--source/blender/draw/engines/gpencil/shaders/gpencil_common_lib.glsl2
-rw-r--r--source/blender/makesdna/DNA_gpencil_types.h2
-rw-r--r--source/blender/makesdna/DNA_material_types.h2
-rw-r--r--source/blender/makesrna/intern/rna_gpencil.c5
-rw-r--r--source/blender/makesrna/intern/rna_material.c5
17 files changed, 233 insertions, 33 deletions
diff --git a/release/scripts/startup/bl_ui/properties_data_gpencil.py b/release/scripts/startup/bl_ui/properties_data_gpencil.py
index e71ea2f31a4..aaa6a782f5a 100644
--- a/release/scripts/startup/bl_ui/properties_data_gpencil.py
+++ b/release/scripts/startup/bl_ui/properties_data_gpencil.py
@@ -133,7 +133,7 @@ class DATA_PT_gpencil_layers(DataButtonsPanel, Panel):
else:
self.draw_layers(context, layout, gpd)
- def draw_layers(self, _context, layout, gpd):
+ def draw_layers(self, context, layout, gpd):
gpl = gpd.layers.active
@@ -175,16 +175,18 @@ class DATA_PT_gpencil_layers(DataButtonsPanel, Panel):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = True
- col = layout.column(align=True)
+ row = layout.row(align=True)
+ row.prop(gpl, "blend_mode", text="Blend")
- col = layout.row(align=True)
- col.prop(gpl, "blend_mode", text="Blend")
+ row = layout.row(align=True)
+ row.prop(gpl, "opacity", text="Opacity", slider=True)
- col = layout.row(align=True)
- col.prop(gpl, "opacity", text="Opacity", slider=True)
+ row = layout.row(align=True)
+ row.prop(gpl, "use_lights")
- col = layout.row(align=True)
- col.prop(gpl, "use_lights")
+ row = layout.row(align=True)
+ row.enabled = context.engine == 'BLENDER_EEVEE'
+ row.prop(gpl, "use_cast_shadows")
class DATA_PT_gpencil_layer_masks(LayerDataButtonsPanel, GreasePencilLayerMasksPanel, Panel):
diff --git a/release/scripts/startup/bl_ui/properties_material_gpencil.py b/release/scripts/startup/bl_ui/properties_material_gpencil.py
index 9d099ff2231..774a6ee848c 100644
--- a/release/scripts/startup/bl_ui/properties_material_gpencil.py
+++ b/release/scripts/startup/bl_ui/properties_material_gpencil.py
@@ -261,7 +261,14 @@ class MATERIAL_PT_gpencil_settings(GPMaterialButtonsPanel, Panel):
ma = context.material
gpcolor = ma.grease_pencil
- layout.prop(gpcolor, "pass_index")
+
+ row = layout.row()
+ row.enabled = context.engine == 'BLENDER_EEVEE'
+ row.prop(gpcolor, "use_cast_shadows")
+
+ row = layout.row()
+ row.prop(gpcolor, "pass_index")
+
class MATERIAL_PT_gpencil_material_presets(PresetPanel, Panel):
diff --git a/release/scripts/startup/bl_ui/space_dopesheet.py b/release/scripts/startup/bl_ui/space_dopesheet.py
index e7893b8c448..346a57f6b38 100644
--- a/release/scripts/startup/bl_ui/space_dopesheet.py
+++ b/release/scripts/startup/bl_ui/space_dopesheet.py
@@ -731,6 +731,10 @@ class DOPESHEET_PT_gpencil_mode(LayersDopeSheetPanel, Panel):
row = layout.row(align=True)
row.prop(gpl, "use_lights")
+ row = layout.row(align=True)
+ row.enabled = context.engine == 'BLENDER_EEVEE'
+ row.prop(gpl, "use_cast_shadows")
+
class DOPESHEET_PT_gpencil_layer_masks(LayersDopeSheetPanel, GreasePencilLayerMasksPanel, Panel):
bl_label = "Masks"
diff --git a/release/scripts/startup/bl_ui/space_topbar.py b/release/scripts/startup/bl_ui/space_topbar.py
index 5e68896a2a7..5e3ed4899fe 100644
--- a/release/scripts/startup/bl_ui/space_topbar.py
+++ b/release/scripts/startup/bl_ui/space_topbar.py
@@ -171,6 +171,10 @@ class TOPBAR_PT_gpencil_layers(Panel):
srow = col.row(align=True)
srow.prop(gpl, "use_lights")
+ srow = col.row(align=True)
+ srow.enabled = context.engine == 'BLENDER_EEVEE'
+ srow.prop(gpl, "use_cast_shadows")
+
col = row.column()
sub = col.column(align=True)
diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c
index 468f735257a..3d9b8df8c31 100644
--- a/source/blender/blenkernel/intern/material.c
+++ b/source/blender/blenkernel/intern/material.c
@@ -295,7 +295,7 @@ void BKE_gpencil_material_attr_init(Material *ma)
gp_style->texture_pixsize = 100.0f;
gp_style->mix_factor = 0.5f;
- gp_style->flag |= GP_MATERIAL_STROKE_SHOW;
+ gp_style->flag |= GP_MATERIAL_STROKE_SHOW | GP_MATERIAL_CAST_SHADOWS;
}
}
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index 88fd823bc72..513aec057c8 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -131,6 +131,9 @@ void EEVEE_cache_populate(void *vedata, Object *ob)
else if (ob->type == OB_VOLUME) {
EEVEE_volumes_cache_object_add(sldata, vedata, draw_ctx->scene, ob);
}
+ else if (ob->type == OB_GPENCIL) {
+ EEVEE_gpencil_cache_populate(vedata, sldata, ob, &cast_shadow);
+ }
else if (!USE_SCENE_LIGHT(draw_ctx->v3d)) {
/* do not add any scene light sources to the cache */
}
diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c
index d2e0c8308c5..2f63a655806 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -30,9 +30,11 @@
#include "BLI_rand.h"
#include "BLI_string_utils.h"
+#include "BKE_gpencil.h"
#include "BKE_paint.h"
#include "BKE_particle.h"
+#include "DNA_gpencil_types.h"
#include "DNA_hair_types.h"
#include "DNA_modifier_types.h"
#include "DNA_view3d_types.h"
@@ -42,6 +44,8 @@
#include "DEG_depsgraph_query.h"
+#include "ED_screen.h"
+
#include "eevee_engine.h"
#include "eevee_lut.h"
#include "eevee_private.h"
@@ -229,6 +233,14 @@ void EEVEE_materials_init(EEVEE_ViewLayerData *sldata,
const DRWContextState *draw_ctx = DRW_context_state_get();
EEVEE_PrivateData *g_data = stl->g_data;
+ g_data->cfra = (int)DEG_get_ctime(draw_ctx->depsgraph);
+ /* Grease pencil simplify. */
+ const bool playing = (draw_ctx->evil_C != NULL) ?
+ ED_screen_animation_playing(CTX_wm_manager(draw_ctx->evil_C)) != NULL :
+ false;
+ Scene *scene = draw_ctx->scene;
+ g_data->gpencil_simplify_fill = GPENCIL_SIMPLIFY_FILL(scene, playing);
+
if (!e_data.util_tex) {
EEVEE_shaders_material_shaders_init();
@@ -470,6 +482,7 @@ BLI_INLINE void material_shadow(EEVEE_Data *vedata,
EEVEE_ViewLayerData *sldata,
Material *ma,
bool is_hair,
+ bool is_gpencil,
EeveeMaterialCache *emc)
{
EEVEE_PrivateData *pd = vedata->stl->g_data;
@@ -484,6 +497,7 @@ BLI_INLINE void material_shadow(EEVEE_Data *vedata,
int mat_options = VAR_MAT_MESH | VAR_MAT_DEPTH;
SET_FLAG_FROM_TEST(mat_options, use_shadow_shader, VAR_MAT_HASH);
SET_FLAG_FROM_TEST(mat_options, is_hair, VAR_MAT_HAIR);
+ SET_FLAG_FROM_TEST(mat_options, is_gpencil, VAR_MAT_GPENCIL);
GPUMaterial *gpumat = (use_shadow_shader) ?
EEVEE_material_get(vedata, scene, ma, NULL, mat_options) :
EEVEE_material_default_get(scene, ma, mat_options);
@@ -521,7 +535,8 @@ BLI_INLINE void material_shadow(EEVEE_Data *vedata,
static EeveeMaterialCache material_opaque(EEVEE_Data *vedata,
EEVEE_ViewLayerData *sldata,
Material *ma,
- const bool is_hair)
+ const bool is_hair,
+ const bool is_gpencil)
{
EEVEE_EffectsInfo *effects = vedata->stl->effects;
EEVEE_PrivateData *pd = vedata->stl->g_data;
@@ -529,7 +544,7 @@ static EeveeMaterialCache material_opaque(EEVEE_Data *vedata,
const DRWContextState *draw_ctx = DRW_context_state_get();
Scene *scene = draw_ctx->scene;
- const bool do_cull = !is_hair && (ma->blend_flag & MA_BL_CULL_BACKFACE) != 0;
+ const bool do_cull = !is_gpencil && !is_hair && (ma->blend_flag & MA_BL_CULL_BACKFACE) != 0;
const bool use_gpumat = (ma->use_nodes && ma->nodetree);
const bool use_ssrefract = use_gpumat && ((ma->blend_flag & MA_BL_SS_REFRACTION) != 0) &&
((effects->enabled_effects & EFFECT_REFRACT) != 0);
@@ -537,7 +552,7 @@ static EeveeMaterialCache material_opaque(EEVEE_Data *vedata,
/* HACK: Assume the struct will never be smaller than our variations.
* This allow us to only keep one ghash and avoid bigger keys comparisons/hashing. */
- void *key = (char *)ma + is_hair;
+ void *key = (char *)ma + is_hair + is_gpencil * 2;
/* Search for other material instances (sharing the same Material data-block). */
EeveeMaterialCache **emc_p, *emc;
if (BLI_ghash_ensure_p(pd->material_hash, key, (void ***)&emc_p)) {
@@ -546,7 +561,7 @@ static EeveeMaterialCache material_opaque(EEVEE_Data *vedata,
*emc_p = emc = BLI_memblock_alloc(sldata->material_cache);
- material_shadow(vedata, sldata, ma, is_hair, emc);
+ material_shadow(vedata, sldata, ma, is_hair, is_gpencil, emc);
{
/* Depth Pass */
@@ -554,6 +569,7 @@ static EeveeMaterialCache material_opaque(EEVEE_Data *vedata,
SET_FLAG_FROM_TEST(mat_options, use_ssrefract, VAR_MAT_REFRACT);
SET_FLAG_FROM_TEST(mat_options, use_depth_shader, VAR_MAT_HASH);
SET_FLAG_FROM_TEST(mat_options, is_hair, VAR_MAT_HAIR);
+ SET_FLAG_FROM_TEST(mat_options, is_gpencil, VAR_MAT_GPENCIL);
GPUMaterial *gpumat = (use_depth_shader) ?
EEVEE_material_get(vedata, scene, ma, NULL, mat_options) :
EEVEE_material_default_get(scene, ma, mat_options);
@@ -595,6 +611,7 @@ static EeveeMaterialCache material_opaque(EEVEE_Data *vedata,
int mat_options = VAR_MAT_MESH;
SET_FLAG_FROM_TEST(mat_options, use_ssrefract, VAR_MAT_REFRACT);
SET_FLAG_FROM_TEST(mat_options, is_hair, VAR_MAT_HAIR);
+ SET_FLAG_FROM_TEST(mat_options, is_gpencil, VAR_MAT_GPENCIL);
GPUMaterial *gpumat = EEVEE_material_get(vedata, scene, ma, NULL, mat_options);
const bool use_sss = GPU_material_flag_get(gpumat, GPU_MATFLAG_SSS);
@@ -609,7 +626,7 @@ static EeveeMaterialCache material_opaque(EEVEE_Data *vedata,
psl->material_cull_ps,
}[option];
/* Hair are rendered inside the non-cull pass but needs to have a separate cache key */
- option = option * 2 + is_hair;
+ option = option * 3 + is_hair + is_gpencil * 2;
/* Search for the same shaders usage in the pass. */
/* HACK: Assume the struct will never be smaller than our variations.
@@ -668,7 +685,7 @@ static EeveeMaterialCache material_transparent(EEVEE_Data *vedata,
DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_DEPTH_EQUAL |
DRW_STATE_BLEND_CUSTOM);
- material_shadow(vedata, sldata, ma, false, &emc);
+ material_shadow(vedata, sldata, ma, false, false, &emc);
if (use_prepass) {
/* Depth prepass */
@@ -735,15 +752,20 @@ BLI_INLINE Material *eevee_object_material_get(Object *ob, int slot, bool holdou
return ma;
}
-BLI_INLINE EeveeMaterialCache eevee_material_cache_get(
- EEVEE_Data *vedata, EEVEE_ViewLayerData *sldata, Object *ob, int slot, bool is_hair)
+BLI_INLINE EeveeMaterialCache eevee_material_cache_get(EEVEE_Data *vedata,
+ EEVEE_ViewLayerData *sldata,
+ Object *ob,
+ int slot,
+ bool is_hair,
+ bool is_gpencil)
{
const bool holdout = (ob->base_flag & BASE_HOLDOUT) != 0;
EeveeMaterialCache matcache;
Material *ma = eevee_object_material_get(ob, slot, holdout);
switch (ma->blend_method) {
case MA_BM_BLEND:
- if (!is_hair) {
+ /* TODO(fclem) support gpencil transparent materials. */
+ if (!is_hair && !is_gpencil) {
matcache = material_transparent(vedata, sldata, ma);
break;
}
@@ -752,7 +774,7 @@ BLI_INLINE EeveeMaterialCache eevee_material_cache_get(
case MA_BM_CLIP:
case MA_BM_HASHED:
default:
- matcache = material_opaque(vedata, sldata, ma, is_hair);
+ matcache = material_opaque(vedata, sldata, ma, is_hair, is_gpencil);
break;
}
return matcache;
@@ -766,7 +788,8 @@ static void eevee_hair_cache_populate(EEVEE_Data *vedata,
int matnr,
bool *cast_shadow)
{
- EeveeMaterialCache matcache = eevee_material_cache_get(vedata, sldata, ob, matnr - 1, true);
+ EeveeMaterialCache matcache = eevee_material_cache_get(
+ vedata, sldata, ob, matnr - 1, true, false);
if (matcache.depth_grp) {
*matcache.depth_grp_p = DRW_shgroup_hair_create_sub(ob, psys, md, matcache.depth_grp);
@@ -824,7 +847,7 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata,
EeveeMaterialCache *matcache = BLI_array_alloca(matcache, materials_len);
for (int i = 0; i < materials_len; i++) {
- matcache[i] = eevee_material_cache_get(vedata, sldata, ob, i, false);
+ matcache[i] = eevee_material_cache_get(vedata, sldata, ob, i, false, false);
}
/* Only support single volume material for now. */
@@ -930,6 +953,119 @@ void EEVEE_object_hair_cache_populate(EEVEE_Data *vedata,
eevee_hair_cache_populate(vedata, sldata, ob, NULL, NULL, HAIR_MATERIAL_NR, cast_shadow);
}
+typedef struct gpIterData {
+ EEVEE_PrivateData *pd;
+ Object *ob;
+ DRWShadingGroup *stroke_shadow_grp;
+ DRWShadingGroup *fill_shadow_grp;
+ int cfra;
+ float plane[4];
+} gpIterData;
+
+static void eevee_gpencil_layer_cache_populate(bGPDlayer *gpl,
+ bGPDframe *UNUSED(gpf),
+ bGPDstroke *UNUSED(gps),
+ void *thunk)
+{
+ gpIterData *iter = (gpIterData *)thunk;
+ bGPdata *gpd = (bGPdata *)iter->ob->data;
+
+ const bool is_screenspace = (gpd->flag & GP_DATA_STROKE_KEEPTHICKNESS) != 0;
+ const bool is_stroke_order_3d = (gpd->draw_mode == GP_DRAWMODE_3D);
+
+ float object_scale = mat4_to_scale(iter->ob->obmat);
+ /* 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 / 2000.0f);
+
+ DRWShadingGroup *grp = iter->stroke_shadow_grp = DRW_shgroup_create_sub(iter->stroke_shadow_grp);
+ DRW_shgroup_uniform_bool_copy(grp, "strokeOrder3d", is_stroke_order_3d);
+ DRW_shgroup_uniform_vec2_copy(grp, "sizeViewportInv", DRW_viewport_invert_size_get());
+ DRW_shgroup_uniform_vec2_copy(grp, "sizeViewport", DRW_viewport_size_get());
+ DRW_shgroup_uniform_float_copy(grp, "thicknessScale", object_scale);
+ DRW_shgroup_uniform_float_copy(grp, "thicknessOffset", (float)gpl->line_change);
+ DRW_shgroup_uniform_float_copy(grp, "thicknessWorldScale", thickness_scale);
+ DRW_shgroup_uniform_vec4_copy(grp, "gpDepthPlane", iter->plane);
+}
+
+static void eevee_gpencil_stroke_cache_populate(bGPDlayer *gpl,
+ bGPDframe *UNUSED(gpf),
+ bGPDstroke *gps,
+ void *thunk)
+{
+ gpIterData *iter = (gpIterData *)thunk;
+
+ MaterialGPencilStyle *gp_style = BKE_gpencil_material_settings(iter->ob, gps->mat_nr + 1);
+
+ const bool cast_layer_shadows = (gpl->flag & GP_LAYER_CAST_SHADOWS) != 0;
+ const bool cast_material_shadows = (gp_style->flag & GP_MATERIAL_CAST_SHADOWS) != 0;
+ const bool simplify_fill = iter->pd->gpencil_simplify_fill;
+ const bool hide_material = (gp_style->flag & GP_MATERIAL_HIDE) != 0;
+ const bool show_stroke = (gp_style->flag & GP_MATERIAL_STROKE_SHOW) != 0;
+ const bool show_fill = (!simplify_fill) && (gps->tot_triangles > 0) &&
+ (gp_style->flag & GP_MATERIAL_FILL_SHOW) != 0;
+
+ if ((hide_material) || (!cast_layer_shadows) || (!cast_material_shadows)) {
+ return;
+ }
+
+ if (show_fill) {
+ struct GPUBatch *geom = DRW_cache_gpencil_fills_get(iter->ob, iter->cfra);
+ int vfirst = gps->runtime.fill_start * 3;
+ int vcount = gps->tot_triangles * 3;
+ DRW_shgroup_call_range(iter->fill_shadow_grp, iter->ob, geom, vfirst, vcount);
+ }
+
+ if (show_stroke) {
+ struct GPUBatch *geom = DRW_cache_gpencil_strokes_get(iter->ob, iter->cfra);
+ /* Start one vert before to have gl_InstanceID > 0 (see shader). */
+ int vfirst = gps->runtime.stroke_start - 1;
+ /* Include "potential" cyclic vertex and start adj vertex (see shader). */
+ int vcount = gps->totpoints + 1 + 1;
+ DRW_shgroup_call_instance_range(iter->stroke_shadow_grp, iter->ob, geom, vfirst, vcount);
+ }
+}
+
+void EEVEE_gpencil_cache_populate(EEVEE_Data *vedata,
+ EEVEE_ViewLayerData *sldata,
+ Object *ob,
+ bool *cast_shadow)
+{
+ EEVEE_PrivateData *pd = vedata->stl->g_data;
+ EeveeMaterialCache matcache = eevee_material_cache_get(vedata, sldata, ob, 0, false, true);
+
+ gpIterData iter = {
+ .ob = ob,
+ .pd = pd,
+ .stroke_shadow_grp = NULL,
+ .fill_shadow_grp = NULL,
+ .cfra = pd->cfra,
+ };
+
+ // if (gpd->draw_mode == GP_DRAWMODE_2D) {
+ // gpencil_depth_plane(ob, iter.plane);
+ // }
+
+ if (matcache.shadow_grp) {
+ iter.stroke_shadow_grp = matcache.shadow_grp;
+ iter.fill_shadow_grp = DRW_shgroup_create_sub(matcache.shadow_grp);
+
+ *matcache.shadow_grp_p = matcache.shadow_grp = iter.fill_shadow_grp;
+ *cast_shadow = true;
+ }
+
+ bool any_material_visible = matcache.shadow_grp != NULL;
+ if (any_material_visible) {
+ BKE_gpencil_visible_stroke_iter(NULL,
+ ob,
+ eevee_gpencil_layer_cache_populate,
+ eevee_gpencil_stroke_cache_populate,
+ &iter,
+ false,
+ pd->cfra);
+ }
+}
+
void EEVEE_materials_cache_finish(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata)
{
EEVEE_PrivateData *pd = vedata->stl->g_data;
diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index bc04fe024fc..5c3ecb0e311 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -176,7 +176,7 @@ enum {
VAR_MAT_MESH = (1 << 0),
VAR_MAT_VOLUME = (1 << 1),
VAR_MAT_HAIR = (1 << 2),
- /* VAR_MAT_PROBE = (1 << 3), UNUSED */
+ VAR_MAT_GPENCIL = (1 << 3),
VAR_MAT_BLEND = (1 << 4),
VAR_MAT_LOOKDEV = (1 << 5),
VAR_MAT_HOLDOUT = (1 << 6),
@@ -1066,6 +1066,11 @@ typedef struct EEVEE_PrivateData {
/** For rendering planar reflections. */
struct DRWView *planar_views[MAX_PLANAR];
+ /** For rendering Gpencil Objects. */
+ int cfra;
+ /** Simplify grease pencil fill. */
+ bool gpencil_simplify_fill;
+
int render_timesteps;
int render_sample_count_per_timestep;
} EEVEE_PrivateData; /* Transient data */
@@ -1113,6 +1118,10 @@ void EEVEE_object_hair_cache_populate(EEVEE_Data *vedata,
EEVEE_ViewLayerData *sldata,
Object *ob,
bool *cast_shadow);
+void EEVEE_gpencil_cache_populate(EEVEE_Data *vedata,
+ EEVEE_ViewLayerData *sldata,
+ Object *ob,
+ bool *cast_shadow);
void EEVEE_materials_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
void EEVEE_materials_free(void);
void EEVEE_update_noise(EEVEE_PassList *psl, EEVEE_FramebufferList *fbl, const double offsets[3]);
diff --git a/source/blender/draw/engines/eevee/eevee_render.c b/source/blender/draw/engines/eevee/eevee_render.c
index aaa087f9eb4..4949c18dbbc 100644
--- a/source/blender/draw/engines/eevee/eevee_render.c
+++ b/source/blender/draw/engines/eevee/eevee_render.c
@@ -256,6 +256,9 @@ void EEVEE_render_cache(void *vedata,
Scene *scene = DEG_get_evaluated_scene(depsgraph);
EEVEE_volumes_cache_object_add(sldata, vedata, scene, ob);
}
+ else if (ob->type == OB_GPENCIL) {
+ EEVEE_gpencil_cache_populate(vedata, sldata, ob, &cast_shadow);
+ }
else if (ob->type == OB_LIGHTPROBE) {
EEVEE_lightprobes_cache_add(sldata, vedata, ob);
}
diff --git a/source/blender/draw/engines/eevee/eevee_shaders.c b/source/blender/draw/engines/eevee/eevee_shaders.c
index 90b7eeb9293..086293388b2 100644
--- a/source/blender/draw/engines/eevee/eevee_shaders.c
+++ b/source/blender/draw/engines/eevee/eevee_shaders.c
@@ -184,6 +184,7 @@ extern char datatoc_common_hair_lib_glsl[];
extern char datatoc_common_math_lib_glsl[];
extern char datatoc_common_math_geom_lib_glsl[];
extern char datatoc_common_view_lib_glsl[];
+extern char datatoc_gpencil_common_lib_glsl[];
extern char datatoc_gpu_shader_common_obinfos_lib_glsl[];
extern char datatoc_ambient_occlusion_lib_glsl[];
@@ -290,6 +291,7 @@ static void eevee_shader_library_ensure(void)
DRW_SHADER_LIB_ADD(e_data.lib, common_view_lib);
DRW_SHADER_LIB_ADD(e_data.lib, common_uniforms_lib);
DRW_SHADER_LIB_ADD(e_data.lib, gpu_shader_common_obinfos_lib);
+ DRW_SHADER_LIB_ADD(e_data.lib, gpencil_common_lib);
DRW_SHADER_LIB_ADD(e_data.lib, random_lib);
DRW_SHADER_LIB_ADD(e_data.lib, renderpass_lib);
DRW_SHADER_LIB_ADD(e_data.lib, bsdf_common_lib);
@@ -1358,6 +1360,9 @@ static char *eevee_get_defines(int options)
if ((options & VAR_MAT_HAIR) != 0) {
BLI_dynstr_append(ds, "#define HAIR_SHADER\n");
}
+ if ((options & VAR_MAT_GPENCIL) != 0) {
+ BLI_dynstr_append(ds, "#define GPENCIL_SHADER\n");
+ }
if ((options & VAR_WORLD_PROBE) != 0) {
BLI_dynstr_append(ds, "#define PROBE_CAPTURE\n");
}
diff --git a/source/blender/draw/engines/eevee/shaders/prepass_vert.glsl b/source/blender/draw/engines/eevee/shaders/prepass_vert.glsl
index f650e2eeb8c..ac3467744de 100644
--- a/source/blender/draw/engines/eevee/shaders/prepass_vert.glsl
+++ b/source/blender/draw/engines/eevee/shaders/prepass_vert.glsl
@@ -1,10 +1,7 @@
#pragma BLENDER_REQUIRE(common_hair_lib.glsl)
#pragma BLENDER_REQUIRE(common_view_lib.glsl)
-
-#ifndef HAIR_SHADER
-in vec3 pos;
-#endif
+#pragma BLENDER_REQUIRE(gpencil_common_lib.glsl)
void main()
{
@@ -23,8 +20,11 @@ void main()
time,
thickness,
thick_time);
+#elif defined(GPENCIL_SHADER)
+ /* TODO */
+ vec3 worldPosition = vec3(0.0);
#else
- vec3 worldPosition = point_object_to_world(pos);
+ vec3 worldPosition = point_object_to_world(pos.xyz);
#endif
gl_Position = point_world_to_ndc(worldPosition);
@@ -32,4 +32,8 @@ void main()
#ifdef CLIP_PLANES
gl_ClipDistance[0] = dot(vec4(worldPosition.xyz, 1.0), clipPlanes[0]);
#endif
+
+#if defined(GPENCIL_SHADER)
+ gpencil_vertex();
+#endif
}
diff --git a/source/blender/draw/engines/eevee/shaders/surface_vert.glsl b/source/blender/draw/engines/eevee/shaders/surface_vert.glsl
index 0ad1393dd70..969312812e3 100644
--- a/source/blender/draw/engines/eevee/shaders/surface_vert.glsl
+++ b/source/blender/draw/engines/eevee/shaders/surface_vert.glsl
@@ -2,9 +2,9 @@
#pragma BLENDER_REQUIRE(common_hair_lib.glsl)
#pragma BLENDER_REQUIRE(common_view_lib.glsl)
#pragma BLENDER_REQUIRE(surface_lib.glsl)
+#pragma BLENDER_REQUIRE(gpencil_common_lib.glsl)
-#ifndef HAIR_SHADER
-in vec3 pos;
+#if !defined(HAIR_SHADER) && !defined(GPENCIL_SHADER)
in vec3 nor;
#endif
@@ -31,12 +31,21 @@ void main()
hairThickTime);
worldNormal = cross(hairTangent, binor);
vec3 world_pos = pos;
+#elif defined(GPENCIL_SHADER)
+ /* TODO */
+ vec3 pos = vec3(0.0);
+ vec3 nor = vec3(1.0);
+ vec3 world_pos = pos.xyz;
#else
- vec3 world_pos = point_object_to_world(pos);
+ vec3 world_pos = point_object_to_world(pos.xyz);
#endif
gl_Position = point_world_to_ndc(world_pos);
+#if defined(GPENCIL_SHADER)
+ gpencil_vertex();
+#endif
+
/* Used for planar reflections */
gl_ClipDistance[0] = dot(vec4(world_pos, 1.0), clipPlanes[0]);
@@ -54,7 +63,7 @@ void main()
# ifdef HAIR_SHADER
pos = hair_get_strand_pos();
# endif
- pass_attr(pos, NormalMatrix, ModelMatrixInverse);
+ pass_attr(pos.xyz, NormalMatrix, ModelMatrixInverse);
# endif
#endif
}
diff --git a/source/blender/draw/engines/gpencil/shaders/gpencil_common_lib.glsl b/source/blender/draw/engines/gpencil/shaders/gpencil_common_lib.glsl
index ac48b94fea9..63a85fe85dc 100644
--- a/source/blender/draw/engines/gpencil/shaders/gpencil_common_lib.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/gpencil_common_lib.glsl
@@ -149,7 +149,7 @@ void blend_mode_output(
}
}
-IN_OUT ShaderStageInterface
+IN_OUT GpencilShaderStageInterface
{
vec4 finalColorMul;
vec4 finalColorAdd;
diff --git a/source/blender/makesdna/DNA_gpencil_types.h b/source/blender/makesdna/DNA_gpencil_types.h
index ea3c1ff7275..b88eb693420 100644
--- a/source/blender/makesdna/DNA_gpencil_types.h
+++ b/source/blender/makesdna/DNA_gpencil_types.h
@@ -550,6 +550,8 @@ typedef enum eGPDlayer_Flag {
GP_LAYER_FRAMELOCK = (1 << 6),
/* don't render xray (which is default) */
GP_LAYER_NO_XRAY = (1 << 7),
+ /* Show render shadows */
+ GP_LAYER_CAST_SHADOWS = (1 << 8),
/* "volumetric" strokes */
GP_LAYER_VOLUMETRIC = (1 << 10),
/* Use Scene lights */
diff --git a/source/blender/makesdna/DNA_material_types.h b/source/blender/makesdna/DNA_material_types.h
index 55d5ea202f7..84392cd2029 100644
--- a/source/blender/makesdna/DNA_material_types.h
+++ b/source/blender/makesdna/DNA_material_types.h
@@ -137,6 +137,8 @@ typedef enum eMaterialGPencilStyle_Flag {
GP_MATERIAL_IS_STROKE_HOLDOUT = (1 << 13),
/* Material used as fill masking. */
GP_MATERIAL_IS_FILL_HOLDOUT = (1 << 14),
+ /* Show Eevee shadows */
+ GP_MATERIAL_CAST_SHADOWS = (1 << 15),
} eMaterialGPencilStyle_Flag;
typedef enum eMaterialGPencilStyle_Mode {
diff --git a/source/blender/makesrna/intern/rna_gpencil.c b/source/blender/makesrna/intern/rna_gpencil.c
index 19ed5f960cf..9223046516b 100644
--- a/source/blender/makesrna/intern/rna_gpencil.c
+++ b/source/blender/makesrna/intern/rna_gpencil.c
@@ -2215,6 +2215,11 @@ static void rna_def_gpencil_layer(BlenderRNA *brna)
prop, "Use Lights", "Enable the use of lights on stroke and fill materials");
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update");
+ prop = RNA_def_property(srna, "use_cast_shadows", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_CAST_SHADOWS);
+ RNA_def_property_ui_text(prop, "Cast Shadows", "Show shadows produced by grease pencil object");
+ RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update");
+
/* solo mode: Only display frames with keyframe */
prop = RNA_def_property(srna, "use_solo_mode", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_SOLO_MODE);
diff --git a/source/blender/makesrna/intern/rna_material.c b/source/blender/makesrna/intern/rna_material.c
index a4052430d9a..a64d7eacae3 100644
--- a/source/blender/makesrna/intern/rna_material.c
+++ b/source/blender/makesrna/intern/rna_material.c
@@ -596,6 +596,11 @@ static void rna_def_material_greasepencil(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Show Fill", "Show stroke fills of this material");
RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_update");
+ prop = RNA_def_property(srna, "use_cast_shadows", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_MATERIAL_CAST_SHADOWS);
+ RNA_def_property_ui_text(prop, "Cast Shadows", "Show shadows produced by grease pencil object");
+ RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_update");
+
/* Mode to align Dots and Boxes to drawing path and object rotation */
prop = RNA_def_property(srna, "alignment_mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_bitflag_sdna(prop, NULL, "alignment_mode");