diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2017-07-05 19:28:48 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2017-07-05 19:28:48 +0300 |
commit | 291b365e26525493fa0be61c858440ce62868559 (patch) | |
tree | 7e8f916409e4f5e7bf6f5fb065eff25b2ad36917 /source/blender/draw/engines/eevee/eevee_materials.c | |
parent | 8b78a8d9bcb4398873c83cd5f73a4a67f067395d (diff) |
Eevee: Volumetrics: Add settings.
Diffstat (limited to 'source/blender/draw/engines/eevee/eevee_materials.c')
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_materials.c | 50 |
1 files changed, 46 insertions, 4 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c index c0ddd977bbc..4cc8b5ed93c 100644 --- a/source/blender/draw/engines/eevee/eevee_materials.c +++ b/source/blender/draw/engines/eevee/eevee_materials.c @@ -209,6 +209,35 @@ static char *eevee_get_defines(int options) return str; } +static char *eevee_get_volume_defines(int options) +{ + char *str = NULL; + + BLI_assert(options < VAR_MAT_MAX); + + DynStr *ds = BLI_dynstr_new(); + BLI_dynstr_appendf(ds, SHADER_DEFINES); + BLI_dynstr_appendf(ds, "#define VOLUMETRICS\n"); + + if ((options & VAR_VOLUME_SHADOW) != 0) { + BLI_dynstr_appendf(ds, "#define VOLUME_SHADOW\n"); + } + if ((options & VAR_VOLUME_HOMO) != 0) { + BLI_dynstr_appendf(ds, "#define VOLUME_HOMOGENEOUS\n"); + } + if ((options & VAR_VOLUME_LIGHT) != 0) { + BLI_dynstr_appendf(ds, "#define VOLUME_LIGHTING\n"); + } + if ((options & VAR_VOLUME_COLOR) != 0) { + BLI_dynstr_appendf(ds, "#define COLOR_TRANSMITTANCE\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); @@ -406,20 +435,33 @@ struct GPUMaterial *EEVEE_material_world_background_get(struct Scene *scene, Wor SHADER_DEFINES "#define WORLD_BACKGROUND\n"); } -struct GPUMaterial *EEVEE_material_world_volume_get(struct Scene *scene, World *wo) +struct GPUMaterial *EEVEE_material_world_volume_get( + struct Scene *scene, World *wo, + bool use_lights, bool use_volume_shadows, bool is_homogeneous, bool use_color_transmit) { const void *engine = &DRW_engine_viewport_eevee_type; int options = VAR_WORLD_VOLUME; + if (use_lights) options |= VAR_VOLUME_LIGHT; + if (is_homogeneous) options |= VAR_VOLUME_HOMO; + if (use_volume_shadows) options |= VAR_VOLUME_SHADOW; + if (use_color_transmit) options |= VAR_VOLUME_COLOR; + GPUMaterial *mat = GPU_material_from_nodetree_find(&wo->gpumaterial, engine, options); if (mat != NULL) { return mat; } - return GPU_material_from_nodetree( + + char *defines = eevee_get_volume_defines(options); + + mat = GPU_material_from_nodetree( scene, wo->nodetree, &wo->gpumaterial, engine, options, datatoc_background_vert_glsl, NULL, e_data.volume_shader_lib, - SHADER_DEFINES "#define VOLUMETRICS\n" - "#define COLOR_TRANSMITTANCE\n"); + defines); + + MEM_freeN(defines); + + return mat; } struct GPUMaterial *EEVEE_material_mesh_get( |