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:
authorClément Foucault <foucault.clem@gmail.com>2017-06-22 03:41:17 +0300
committerClément Foucault <foucault.clem@gmail.com>2017-06-22 04:51:06 +0300
commit5ccc02277d7cee7affa5d3b49a8b9e6e4368b201 (patch)
treecb6e7f9ecf9f4acde5a50aecec9b02c99cb0bfba /source/blender/draw
parent1159d8ccc9649fe1da7cfab006c19843e19eb61d (diff)
Eevee: Improve material variation managment.
- Unify variations between default shaders and material shader. - Only create default shader passes if needed. Downside is that we have a big array of passes and shading grp in the vedata ... And it will double in size each time a new variation flag is added.
Diffstat (limited to 'source/blender/draw')
-rw-r--r--source/blender/draw/engines/eevee/eevee_engine.c4
-rw-r--r--source/blender/draw/engines/eevee/eevee_lightprobes.c6
-rw-r--r--source/blender/draw/engines/eevee/eevee_materials.c284
-rw-r--r--source/blender/draw/engines/eevee/eevee_private.h29
4 files changed, 202 insertions, 121 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index 8d3cf5ea077..62edfa642eb 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -157,9 +157,7 @@ static void EEVEE_draw_scene(void *vedata)
/* Shading pass */
DRW_draw_pass(psl->probe_display);
- DRW_draw_pass(psl->default_pass);
- DRW_draw_pass(psl->default_flat_pass);
- DRW_draw_pass(psl->default_hair_pass);
+ EEVEE_draw_default_passes(psl);
DRW_draw_pass(psl->material_pass);
/* Post Process */
diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.c b/source/blender/draw/engines/eevee/eevee_lightprobes.c
index 15a4b86129d..0d6f589f8a5 100644
--- a/source/blender/draw/engines/eevee/eevee_lightprobes.c
+++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c
@@ -922,8 +922,7 @@ static void render_scene_to_probe(
DRW_draw_pass(psl->depth_pass_cull);
/* Shading pass */
- DRW_draw_pass(psl->default_pass);
- DRW_draw_pass(psl->default_flat_pass);
+ EEVEE_draw_default_passes(psl);
DRW_draw_pass(psl->material_pass);
DRW_framebuffer_texture_detach(sldata->probe_rt);
@@ -985,8 +984,7 @@ static void render_scene_to_planar(
DRW_draw_pass(psl->depth_pass_clip_cull);
/* Shading pass */
- DRW_draw_pass(psl->default_pass);
- DRW_draw_pass(psl->default_flat_pass);
+ EEVEE_draw_default_passes(psl);
DRW_draw_pass(psl->material_pass);
DRW_state_invert_facing();
diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c
index 75eec99b1a1..09c30ff5a69 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -38,6 +38,14 @@
#include "eevee_lut.h"
#include "eevee_private.h"
+#if defined(IRRADIANCE_SH_L2)
+#define SHADER_IRRADIANCE "#define IRRADIANCE_SH_L2\n"
+#elif defined(IRRADIANCE_CUBEMAP)
+#define SHADER_IRRADIANCE "#define IRRADIANCE_CUBEMAP\n"
+#elif defined(IRRADIANCE_HL2)
+#define SHADER_IRRADIANCE "#define IRRADIANCE_HL2\n"
+#endif
+
#define SHADER_DEFINES \
"#define EEVEE_ENGINE\n" \
"#define MAX_PROBE " STRINGIFY(MAX_PROBE) "\n" \
@@ -47,20 +55,8 @@
"#define MAX_SHADOW_CUBE " STRINGIFY(MAX_SHADOW_CUBE) "\n" \
"#define MAX_SHADOW_MAP " STRINGIFY(MAX_SHADOW_MAP) "\n" \
"#define MAX_SHADOW_CASCADE " STRINGIFY(MAX_SHADOW_CASCADE) "\n" \
- "#define MAX_CASCADE_NUM " STRINGIFY(MAX_CASCADE_NUM) "\n"
-
-/* World shader variations */
-enum {
- VAR_WORLD_BACKGROUND,
- VAR_WORLD_PROBE,
-};
-
-/* Material shader variations */
-enum {
- VAR_MAT_MESH = (1 << 0),
- VAR_MAT_PROBE = (1 << 1),
- VAR_MAT_HAIR = (1 << 2),
-};
+ "#define MAX_CASCADE_NUM " STRINGIFY(MAX_CASCADE_NUM) "\n" \
+ SHADER_IRRADIANCE
/* *********** STATIC *********** */
static struct {
@@ -68,15 +64,15 @@ static struct {
struct GPUShader *default_prepass_sh;
struct GPUShader *default_prepass_clip_sh;
- struct GPUShader *default_lit;
- struct GPUShader *default_lit_flat;
- struct GPUShader *default_lit_hair;
+ struct GPUShader *default_lit[VAR_MAT_MAX];
struct GPUShader *default_background;
/* 64*64 array texture containing all LUTs and other utilitarian arrays.
* Packing enables us to same precious textures slots. */
struct GPUTexture *util_tex;
+
+ float viewvecs[2][4];
} e_data = {NULL}; /* Engine data */
extern char datatoc_prepass_frag_glsl[];
@@ -166,6 +162,76 @@ static struct GPUTexture *create_ggx_lut_texture(int UNUSED(w), int UNUSED(h))
}
#endif
+static char *eevee_get_defines(int options)
+{
+ char *str = NULL;
+
+ BLI_assert(options < VAR_MAT_MAX);
+
+ DynStr *ds = BLI_dynstr_new();
+ BLI_dynstr_appendf(ds, SHADER_DEFINES);
+
+ if ((options & VAR_MAT_MESH) != 0) {
+ BLI_dynstr_appendf(ds, "#define MESH_SHADER\n");
+ }
+ if ((options & VAR_MAT_HAIR) != 0) {
+ BLI_dynstr_appendf(ds, "#define HAIR_SHADER\n");
+ }
+ if ((options & VAR_MAT_PROBE) != 0) {
+ BLI_dynstr_appendf(ds, "#define PROBE_CAPTURE\n");
+ }
+ if ((options & VAR_MAT_AO) != 0) {
+ BLI_dynstr_appendf(ds, "#define USE_AO\n");
+ }
+ if ((options & VAR_MAT_FLAT) != 0) {
+ BLI_dynstr_appendf(ds, "#define USE_FLAT_NORMAL\n");
+ }
+ if ((options & VAR_MAT_BENT) != 0) {
+ BLI_dynstr_appendf(ds, "#define USE_BENT_NORMAL\n");
+ }
+
+ str = BLI_dynstr_get_cstring(ds);
+ BLI_dynstr_free(ds);
+
+ return str;
+}
+
+static void add_standard_uniforms(DRWShadingGroup *shgrp, EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata)
+{
+ DRW_shgroup_uniform_block(shgrp, "probe_block", sldata->probe_ubo);
+ DRW_shgroup_uniform_block(shgrp, "grid_block", sldata->grid_ubo);
+ DRW_shgroup_uniform_block(shgrp, "planar_block", sldata->planar_ubo);
+ DRW_shgroup_uniform_block(shgrp, "light_block", sldata->light_ubo);
+ DRW_shgroup_uniform_block(shgrp, "shadow_block", sldata->shadow_ubo);
+ DRW_shgroup_uniform_int(shgrp, "light_count", &sldata->lamps->num_light, 1);
+ DRW_shgroup_uniform_int(shgrp, "probe_count", &sldata->probes->num_render_cube, 1);
+ DRW_shgroup_uniform_int(shgrp, "grid_count", &sldata->probes->num_render_grid, 1);
+ DRW_shgroup_uniform_int(shgrp, "planar_count", &sldata->probes->num_planar, 1);
+ DRW_shgroup_uniform_bool(shgrp, "specToggle", &sldata->probes->specular_toggle, 1);
+ DRW_shgroup_uniform_float(shgrp, "lodMax", &sldata->probes->lodmax, 1);
+ DRW_shgroup_uniform_texture(shgrp, "utilTex", e_data.util_tex);
+ DRW_shgroup_uniform_buffer(shgrp, "probeCubes", &sldata->probe_pool);
+ DRW_shgroup_uniform_buffer(shgrp, "probePlanars", &vedata->txl->planar_pool);
+ DRW_shgroup_uniform_buffer(shgrp, "irradianceGrid", &sldata->irradiance_pool);
+ DRW_shgroup_uniform_buffer(shgrp, "shadowCubes", &sldata->shadow_depth_cube_pool);
+ DRW_shgroup_uniform_buffer(shgrp, "shadowCascades", &sldata->shadow_depth_cascade_pool);
+}
+
+static void create_default_shader(int options)
+{
+ DynStr *ds_frag = BLI_dynstr_new();
+ BLI_dynstr_append(ds_frag, e_data.frag_shader_lib);
+ BLI_dynstr_append(ds_frag, datatoc_default_frag_glsl);
+ char *frag_str = BLI_dynstr_get_cstring(ds_frag);
+ BLI_dynstr_free(ds_frag);
+
+ char *defines = eevee_get_defines(options);
+
+ e_data.default_lit[options] = DRW_shader_create(datatoc_lit_surface_vert_glsl, NULL, frag_str, defines);
+
+ MEM_freeN(defines);
+ MEM_freeN(frag_str);
+}
void EEVEE_materials_init(void)
{
if (!e_data.frag_shader_lib) {
@@ -191,37 +257,6 @@ void EEVEE_materials_init(void)
e_data.default_background = DRW_shader_create_fullscreen(
datatoc_default_world_frag_glsl, NULL);
- e_data.default_lit = DRW_shader_create(
- datatoc_lit_surface_vert_glsl, NULL, frag_str,
- SHADER_DEFINES
-#if defined(IRRADIANCE_SH_L2)
- "#define IRRADIANCE_SH_L2\n"
-#elif defined(IRRADIANCE_CUBEMAP)
- "#define IRRADIANCE_CUBEMAP\n"
-#elif defined(IRRADIANCE_HL2)
- "#define IRRADIANCE_HL2\n"
-#endif
- "#define MESH_SHADER\n");
-
- e_data.default_lit_flat = DRW_shader_create(
- datatoc_lit_surface_vert_glsl, NULL, frag_str,
- SHADER_DEFINES
-#if defined(IRRADIANCE_SH_L2)
- "#define IRRADIANCE_SH_L2\n"
-#elif defined(IRRADIANCE_CUBEMAP)
- "#define IRRADIANCE_CUBEMAP\n"
-#elif defined(IRRADIANCE_HL2)
- "#define IRRADIANCE_HL2\n"
-#endif
- "#define MESH_SHADER\n"
- "#define USE_FLAT_NORMAL\n");
-
- e_data.default_lit_hair = DRW_shader_create(
- datatoc_lit_surface_vert_glsl, NULL, frag_str,
- SHADER_DEFINES
- "#define MESH_SHADER\n"
- "#define HAIR_SHADER\n");
-
e_data.default_prepass_sh = DRW_shader_create(
datatoc_prepass_vert_glsl, NULL, datatoc_prepass_frag_glsl,
NULL);
@@ -280,58 +315,93 @@ struct GPUMaterial *EEVEE_material_world_background_get(struct Scene *scene, Wor
SHADER_DEFINES "#define WORLD_BACKGROUND\n");
}
-struct GPUMaterial *EEVEE_material_mesh_get(struct Scene *scene, Material *ma)
+struct GPUMaterial *EEVEE_material_mesh_get(
+ struct Scene *scene, Material *ma,
+ bool use_ao, bool use_bent_normals)
{
- return GPU_material_from_nodetree(
+ struct GPUMaterial *mat;
+
+ int options = VAR_MAT_MESH;
+
+ if (use_ao) options |= VAR_MAT_AO;
+ if (use_bent_normals) options |= VAR_MAT_BENT;
+
+ char *defines = eevee_get_defines(options);
+
+ mat = GPU_material_from_nodetree(
scene, ma->nodetree, &ma->gpumaterial, &DRW_engine_viewport_eevee_type,
- VAR_MAT_MESH,
+ options,
datatoc_lit_surface_vert_glsl, NULL, e_data.frag_shader_lib,
- SHADER_DEFINES
-#if defined(IRRADIANCE_SH_L2)
- "#define IRRADIANCE_SH_L2\n"
-#elif defined(IRRADIANCE_CUBEMAP)
- "#define IRRADIANCE_CUBEMAP\n"
-#elif defined(IRRADIANCE_HL2)
- "#define IRRADIANCE_HL2\n"
-#endif
- "#define MESH_SHADER\n");
+ defines);
+
+ MEM_freeN(defines);
+
+ return mat;
}
-struct GPUMaterial *EEVEE_material_hair_get(struct Scene *scene, Material *ma)
+struct GPUMaterial *EEVEE_material_hair_get(
+ struct Scene *scene, Material *ma,
+ bool use_ao, bool use_bent_normals)
{
- return GPU_material_from_nodetree(
+ struct GPUMaterial *mat;
+
+ int options = VAR_MAT_MESH | VAR_MAT_HAIR;
+
+ if (use_ao) options |= VAR_MAT_AO;
+ if (use_bent_normals) options |= VAR_MAT_BENT;
+
+ char *defines = eevee_get_defines(options);
+
+ mat = GPU_material_from_nodetree(
scene, ma->nodetree, &ma->gpumaterial, &DRW_engine_viewport_eevee_type,
- VAR_MAT_HAIR,
+ options,
datatoc_lit_surface_vert_glsl, NULL, e_data.frag_shader_lib,
- SHADER_DEFINES "#define MESH_SHADER\n" "#define HAIR_SHADER\n");
+ defines);
+
+ MEM_freeN(defines);
+
+ return mat;
}
-static void add_standard_uniforms(DRWShadingGroup *shgrp, EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata)
+static struct DRWShadingGroup *EEVEE_default_shading_group_get(
+ EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata,
+ bool is_hair, bool is_flat_normal, bool use_ao, bool use_bent_normals)
{
- DRW_shgroup_uniform_block(shgrp, "probe_block", sldata->probe_ubo);
- DRW_shgroup_uniform_block(shgrp, "grid_block", sldata->grid_ubo);
- DRW_shgroup_uniform_block(shgrp, "planar_block", sldata->planar_ubo);
- DRW_shgroup_uniform_block(shgrp, "light_block", sldata->light_ubo);
- DRW_shgroup_uniform_block(shgrp, "shadow_block", sldata->shadow_ubo);
- DRW_shgroup_uniform_int(shgrp, "light_count", &sldata->lamps->num_light, 1);
- DRW_shgroup_uniform_int(shgrp, "probe_count", &sldata->probes->num_render_cube, 1);
- DRW_shgroup_uniform_int(shgrp, "grid_count", &sldata->probes->num_render_grid, 1);
- DRW_shgroup_uniform_int(shgrp, "planar_count", &sldata->probes->num_planar, 1);
- DRW_shgroup_uniform_bool(shgrp, "specToggle", &sldata->probes->specular_toggle, 1);
- DRW_shgroup_uniform_float(shgrp, "lodMax", &sldata->probes->lodmax, 1);
- DRW_shgroup_uniform_texture(shgrp, "utilTex", e_data.util_tex);
- DRW_shgroup_uniform_buffer(shgrp, "probeCubes", &sldata->probe_pool);
- DRW_shgroup_uniform_buffer(shgrp, "probePlanars", &vedata->txl->planar_pool);
- DRW_shgroup_uniform_buffer(shgrp, "irradianceGrid", &sldata->irradiance_pool);
- DRW_shgroup_uniform_buffer(shgrp, "shadowCubes", &sldata->shadow_depth_cube_pool);
- DRW_shgroup_uniform_buffer(shgrp, "shadowCascades", &sldata->shadow_depth_cascade_pool);
+ int options = VAR_MAT_MESH;
+
+ if (is_hair) options |= VAR_MAT_HAIR;
+ if (use_ao) options |= VAR_MAT_AO;
+ if (use_bent_normals) options |= VAR_MAT_BENT;
+ if (is_flat_normal) options |= VAR_MAT_FLAT;
+
+ if (e_data.default_lit[options] == NULL) {
+ create_default_shader(options);
+ }
+
+ if (vedata->psl->default_pass[options] == NULL) {
+ DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL | DRW_STATE_WIRE;
+ vedata->psl->default_pass[options] = DRW_pass_create("Default Lit Pass", state);
+
+ DRWShadingGroup *shgrp = DRW_shgroup_create(e_data.default_lit[options], vedata->psl->default_pass[options]);
+ add_standard_uniforms(shgrp, sldata, vedata);
+ }
+
+ return DRW_shgroup_create(e_data.default_lit[options], vedata->psl->default_pass[options]);
}
void EEVEE_materials_cache_init(EEVEE_Data *vedata)
{
EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl;
EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl;
- EEVEE_SceneLayerData *sldata = EEVEE_scene_layer_data_get();
+
+ {
+ /* Global AO Switch*/
+ const DRWContextState *draw_ctx = DRW_context_state_get();
+ SceneLayer *scene_layer = draw_ctx->sl;
+ IDProperty *props = BKE_scene_layer_engine_evaluated_get(scene_layer, COLLECTION_MODE_NONE, RE_engine_id_BLENDER_EEVEE);
+ stl->effects->use_ao = BKE_collection_engine_property_value_get_bool(props, "gtao_enable");
+ stl->effects->use_bent_normals = BKE_collection_engine_property_value_get_bool(props, "gtao_use_bent_normals");
+ }
/* Create Material Ghash */
{
@@ -397,21 +467,6 @@ void EEVEE_materials_cache_init(EEVEE_Data *vedata)
{
DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL | DRW_STATE_WIRE;
- psl->default_pass = DRW_pass_create("Default Lit Pass", state);
- DRWShadingGroup *shgrp = DRW_shgroup_create(e_data.default_lit, psl->default_pass);
- add_standard_uniforms(shgrp, sldata, vedata);
-
- psl->default_flat_pass = DRW_pass_create("Default Flat Lit Pass", state);
- shgrp = DRW_shgroup_create(e_data.default_lit_flat, psl->default_flat_pass);
- add_standard_uniforms(shgrp, sldata, vedata);
-
- psl->default_hair_pass = DRW_pass_create("Default Hair Lit Pass", state);
- shgrp = DRW_shgroup_create(e_data.default_lit_hair, psl->default_hair_pass);
- add_standard_uniforms(shgrp, sldata, vedata);
- }
-
- {
- DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL | DRW_STATE_WIRE;
psl->material_pass = DRW_pass_create("Material Shader Pass", state);
}
}
@@ -447,13 +502,11 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_SceneLayerData *sl
/* Get per-material split surface */
struct Gwn_Batch **mat_geom = DRW_cache_object_surface_material_get(ob);
if (mat_geom) {
- struct GPUShader *default_shader = e_data.default_lit;
- struct DRWPass *default_pass = psl->default_pass;
+ bool use_flat_nor = false;
if (is_default_mode_shader) {
if (is_sculpt_mode) {
- bool use_flat = DRW_object_is_flat_normal(ob);
- default_shader = use_flat ? e_data.default_lit_flat : e_data.default_lit;
+ use_flat_nor = DRW_object_is_flat_normal(ob);
}
}
@@ -477,7 +530,8 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_SceneLayerData *sl
if (ma->use_nodes && ma->nodetree) {
Scene *scene = draw_ctx->scene;
- struct GPUMaterial *gpumat = EEVEE_material_mesh_get(scene, ma);
+ struct GPUMaterial *gpumat = EEVEE_material_mesh_get(scene, ma,
+ stl->effects->use_ao, stl->effects->use_bent_normals);
shgrp = DRW_shgroup_material_create(gpumat, psl->material_pass);
if (shgrp) {
@@ -499,7 +553,8 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_SceneLayerData *sl
/* Fallback to default shader */
if (shgrp == NULL) {
- shgrp = DRW_shgroup_create(default_shader, default_pass);
+ shgrp = EEVEE_default_shading_group_get(sldata, vedata, false, use_flat_nor,
+ stl->effects->use_ao, stl->effects->use_bent_normals);
DRW_shgroup_uniform_vec3(shgrp, "basecol", color_p, 1);
DRW_shgroup_uniform_float(shgrp, "metallic", metal_p, 1);
DRW_shgroup_uniform_float(shgrp, "specular", spec_p, 1);
@@ -549,7 +604,8 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_SceneLayerData *sl
else {
if (ma->use_nodes && ma->nodetree) {
Scene *scene = draw_ctx->scene;
- struct GPUMaterial *gpumat = EEVEE_material_hair_get(scene, ma);
+ struct GPUMaterial *gpumat = EEVEE_material_hair_get(scene, ma,
+ stl->effects->use_ao, stl->effects->use_bent_normals);
shgrp = DRW_shgroup_material_create(gpumat, psl->material_pass);
if (shgrp) {
@@ -571,7 +627,8 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_SceneLayerData *sl
/* Fallback to default shader */
if (shgrp == NULL) {
- shgrp = DRW_shgroup_create(e_data.default_lit_hair, psl->default_hair_pass);
+ shgrp = EEVEE_default_shading_group_get(sldata, vedata, true, false,
+ stl->effects->use_ao, stl->effects->use_bent_normals);
DRW_shgroup_uniform_vec3(shgrp, "basecol", color_p, 1);
DRW_shgroup_uniform_float(shgrp, "metallic", metal_p, 1);
DRW_shgroup_uniform_float(shgrp, "specular", spec_p, 1);
@@ -599,12 +656,21 @@ void EEVEE_materials_cache_finish(EEVEE_Data *vedata)
void EEVEE_materials_free(void)
{
+ for (int i = 0; i < VAR_MAT_MAX; ++i) {
+ DRW_SHADER_FREE_SAFE(e_data.default_lit[i]);
+ }
MEM_SAFE_FREE(e_data.frag_shader_lib);
DRW_SHADER_FREE_SAFE(e_data.default_prepass_sh);
DRW_SHADER_FREE_SAFE(e_data.default_prepass_clip_sh);
- DRW_SHADER_FREE_SAFE(e_data.default_lit);
- DRW_SHADER_FREE_SAFE(e_data.default_lit_flat);
- DRW_SHADER_FREE_SAFE(e_data.default_lit_hair);
DRW_SHADER_FREE_SAFE(e_data.default_background);
DRW_TEXTURE_FREE_SAFE(e_data.util_tex);
}
+
+void EEVEE_draw_default_passes(EEVEE_PassList *psl)
+{
+ for (int i = 0; i < VAR_MAT_MAX; ++i) {
+ if (psl->default_pass[i]) {
+ DRW_draw_pass(psl->default_pass[i]);
+ }
+ }
+}
diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index ea63919b23d..bd9e1bf9e89 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -46,6 +46,26 @@ extern struct DrawEngineType draw_engine_eevee_type;
// #define IRRADIANCE_CUBEMAP
#define IRRADIANCE_HL2
+/* World shader variations */
+enum {
+ VAR_WORLD_BACKGROUND,
+ VAR_WORLD_PROBE,
+};
+
+/* Material shader variations */
+enum {
+ VAR_MAT_MESH = (1 << 0),
+ VAR_MAT_PROBE = (1 << 1),
+ VAR_MAT_HAIR = (1 << 2),
+ VAR_MAT_AO = (1 << 3),
+ VAR_MAT_FLAT = (1 << 4),
+ VAR_MAT_BENT = (1 << 5),
+ /* Max number of variation */
+ /* IMPORTANT : Leave it last and set
+ * it's value accordingly. */
+ VAR_MAT_MAX = (1 << 6)
+};
+
typedef struct EEVEE_PassList {
/* Shadows */
struct DRWPass *shadow_pass;
@@ -77,9 +97,7 @@ typedef struct EEVEE_PassList {
struct DRWPass *depth_pass_cull;
struct DRWPass *depth_pass_clip;
struct DRWPass *depth_pass_clip_cull;
- struct DRWPass *default_pass;
- struct DRWPass *default_flat_pass;
- struct DRWPass *default_hair_pass;
+ struct DRWPass *default_pass[VAR_MAT_MAX];
struct DRWPass *material_pass;
struct DRWPass *background_pass;
} EEVEE_PassList;
@@ -393,9 +411,10 @@ void EEVEE_materials_cache_finish(EEVEE_Data *vedata);
struct GPUMaterial *EEVEE_material_world_lightprobe_get(struct Scene *scene, struct World *wo);
struct GPUMaterial *EEVEE_material_world_background_get(struct Scene *scene, struct World *wo);
struct GPUMaterial *EEVEE_material_mesh_lightprobe_get(struct Scene *scene, Material *ma);
-struct GPUMaterial *EEVEE_material_mesh_get(struct Scene *scene, Material *ma);
-struct GPUMaterial *EEVEE_material_hair_get(struct Scene *scene, Material *ma);
+struct GPUMaterial *EEVEE_material_mesh_get(struct Scene *scene, Material *ma, bool use_ao, bool use_bent_normals);
+struct GPUMaterial *EEVEE_material_hair_get(struct Scene *scene, Material *ma, bool use_ao, bool use_bent_normals);
void EEVEE_materials_free(void);
+void EEVEE_draw_default_passes(EEVEE_PassList *psl);
/* eevee_lights.c */
void EEVEE_lights_init(EEVEE_SceneLayerData *sldata);