68 const float zero[4] = {0.0f, 0.0f, 0.0f, 0.0f};
71 const float one[4] = {1.0f, 1.0f, 1.0f, 1.0f};
74 const float flame = 0.0f;
80 switch (default_value) {
95 double ht_offset[3] = {0.0, 0.0};
96 const uint ht_primes[3] = {3, 7, 2};
98 BLI_halton_3d(ht_primes, ht_offset, current_sample, ht_point);
123 tex_size[0] = (int)
ceilf(
fmaxf(1.0f, viewport_size[0] / (
float)tile_size));
124 tex_size[1] = (int)
ceilf(
fmaxf(1.0f, viewport_size[1] / (
float)tile_size));
158 uint ht_primes[3] = {3, 7, 2};
159 uint current_sample = 0;
175 const uint max_sample = (ht_primes[0] * ht_primes[1] * ht_primes[2]);
178 if (current_sample != max_sample - 1) {
195 sample_distribution = 4.0f * (
max_ff(1.0f - sample_distribution, 1e-2f));
199 float near = integration_start =
min_ff(-integration_start, clip_start - 1e-4f);
200 float far = integration_end =
min_ff(-integration_end, near - 1e-4f);
202 common_data->
vol_depth_param[0] = (far - near * exp2(1.0f / sample_distribution)) /
210 integration_start =
min_ff(integration_end, clip_start);
211 integration_end =
max_ff(-integration_end, clip_end);
215 common_data->
vol_depth_param[2] = 1.0f / (integration_end - integration_start);
226 if (!
e_data.dummy_scatter) {
227 const float scatter[4] = {0.0f, 0.0f, 0.0f, 0.0f};
228 const float transmit[4] = {1.0f, 1.0f, 1.0f, 1.0f};
332 bool multiple_transforms =
true;
341 if (first_drw_grid ==
NULL) {
342 first_drw_grid = drw_grid;
346 multiple_transforms =
true;
353 if (first_drw_grid ==
NULL) {
359 float bounds_to_object[4][4];
361 if (multiple_transforms) {
404 if (drw_grid && multiple_transforms) {
420 static const float white[3] = {1.0f, 1.0f, 1.0f};
449 if (
STREQ(gpu_grid->name,
"density")) {
453 else if (
STREQ(gpu_grid->name,
"color")) {
457 else if (
STR_ELEM(gpu_grid->name,
"flame",
"temperature")) {
472 grp,
"volumeColor", (use_constant_color) ? fds->
active_color : white, 1);
485 static const float unit_mat[4][4] = {{1.0f, 0.0f, 0.0f, 0.0f},
486 {0.0f, 1.0f, 0.0f, 0.0f},
487 {0.0f, 0.0f, 1.0f, 0.0f},
488 {0.0f, 0.0f, 0.0f, 1.0f}};
489 float *texco_loc, *texco_size;
669 {GPU_ATTACHMENT_NONE,
670 GPU_ATTACHMENT_TEXTURE(txl->volume_prop_scattering),
671 GPU_ATTACHMENT_TEXTURE(txl->volume_prop_extinction),
672 GPU_ATTACHMENT_TEXTURE(txl->volume_prop_emission),
673 GPU_ATTACHMENT_TEXTURE(txl->volume_prop_phase)});
675 {GPU_ATTACHMENT_NONE,
676 GPU_ATTACHMENT_TEXTURE(txl->volume_scatter),
677 GPU_ATTACHMENT_TEXTURE(txl->volume_transmit)});
679 {GPU_ATTACHMENT_NONE,
680 GPU_ATTACHMENT_TEXTURE(txl->volume_scatter_history),
681 GPU_ATTACHMENT_TEXTURE(txl->volume_transmit_history)});
811 {GPU_ATTACHMENT_NONE,
812 GPU_ATTACHMENT_TEXTURE(txl->volume_scatter_accum),
813 GPU_ATTACHMENT_TEXTURE(txl->volume_transmittance_accum)});
846 const float clear[4] = {0.0f, 0.0f, 0.0f, 0.0f};
typedef float(TangentPoint)[2]
struct wmWindowManager * CTX_wm_manager(const bContext *C)
struct Material * BKE_object_material_get(struct Object *ob, short act)
struct Material * BKE_material_default_volume(void)
void BKE_mesh_texspace_get_reference(struct Mesh *me, short **r_texflag, float **r_loc, float **r_size)
bool BKE_modifier_is_enabled(const struct Scene *scene, struct ModifierData *md, int required_mode)
struct ModifierData * BKE_modifiers_findby_type(const struct Object *ob, ModifierType type)
struct BoundBox * BKE_volume_boundbox_get(struct Object *ob)
const VolumeGrid * BKE_volume_grid_find_for_read(const struct Volume *volume, const char *name)
bool BKE_volume_load(const struct Volume *volume, const struct Main *bmain)
Volume data-block rendering and viewport drawing utilities.
float BKE_volume_density_scale(const struct Volume *volume, const float matrix[4][4])
#define LISTBASE_FOREACH(type, var, list)
struct LinkData * BLI_genericNodeN(void *data)
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
MINLINE float max_ff(float a, float b)
MINLINE float min_ff(float a, float b)
MINLINE int max_ii(int a, int b)
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
bool invert_m4_m4(float R[4][4], const float A[4][4])
void size_to_mat4(float R[4][4], const float size[3])
bool equals_m4m4(const float mat1[4][4], const float mat2[4][4])
void mat4_to_size(float size[3], const float M[4][4])
MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void copy_v3_v3_int(int r[3], const int a[3])
void BLI_halton_3d(const unsigned int prime[3], double offset[3], int n, double *r)
float DEG_get_ctime(const Depsgraph *graph)
struct Scene * DEG_get_evaluated_scene(const struct Depsgraph *graph)
@ FLUID_DOMAIN_ACTIVE_COLORS
@ FLUID_DOMAIN_ACTIVE_COLOR_SET
@ SCE_EEVEE_VOLUMETRIC_SHADOWS
@ SCE_EEVEE_VOLUMETRIC_LIGHTS
@ DRW_STATE_BLEND_ADD_FULL
#define DRW_PASS_CREATE(pass, state)
#define DRW_shgroup_call(shgroup, geom, ob)
#define DRW_TEXTURE_FREE_SAFE(tex)
bScreen * ED_screen_animation_no_scrub(const struct wmWindowManager *wm)
struct GPUFrameBuffer GPUFrameBuffer
#define GPU_FRAMEBUFFER_FREE_SAFE(fb)
void GPU_framebuffer_bind(GPUFrameBuffer *fb)
eGPUMaterialStatus GPU_material_status(GPUMaterial *mat)
ListBase GPU_material_volume_grids(GPUMaterial *material)
bool GPU_material_has_volume_output(GPUMaterial *mat)
struct GPUShader GPUShader
void GPU_memory_barrier(eGPUBarrier barrier)
@ GPU_BARRIER_TEXTURE_FETCH
struct GPUTexture GPUTexture
void GPU_texture_compare_mode(GPUTexture *tex, bool use_compare)
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
GPUBatch * DRW_cache_fullscreen_quad_get(void)
DRWVolumeGrid * DRW_volume_batch_cache_get_grid(struct Volume *volume, const struct VolumeGrid *grid)
void DRW_smoke_free(struct FluidModifierData *fmd)
void DRW_smoke_ensure(struct FluidModifierData *fmd, int highres)
const DRWContextState * DRW_context_state_get(void)
const float * DRW_viewport_size_get(void)
bool DRW_state_is_image_render(void)
void DRW_viewport_request_redraw(void)
DefaultTextureList * DRW_viewport_texture_list_get(void)
DRWShadingGroup * DRW_shgroup_material_create(struct GPUMaterial *material, DRWPass *pass)
float DRW_view_near_distance_get(const DRWView *view)
void DRW_shgroup_uniform_float_copy(DRWShadingGroup *shgroup, const char *name, const float value)
void DRW_shgroup_uniform_block(DRWShadingGroup *shgroup, const char *name, const GPUUniformBuf *ubo)
void DRW_shgroup_uniform_texture(DRWShadingGroup *shgroup, const char *name, const GPUTexture *tex)
void DRW_shgroup_uniform_vec3_copy(DRWShadingGroup *shgroup, const char *name, const float *value)
void DRW_shgroup_uniform_vec3(DRWShadingGroup *shgroup, const char *name, const float *value, int arraysize)
bool DRW_view_is_persp_get(const DRWView *view)
void DRW_shgroup_call_procedural_triangles(DRWShadingGroup *shgroup, Object *ob, uint tri_count)
DRWShadingGroup * DRW_shgroup_create(struct GPUShader *shader, DRWPass *pass)
float DRW_view_far_distance_get(const DRWView *view)
void DRW_shgroup_uniform_texture_ref(DRWShadingGroup *shgroup, const char *name, GPUTexture **tex)
void DRW_shgroup_uniform_mat4(DRWShadingGroup *shgroup, const char *name, const float(*value)[4])
void DRW_shgroup_uniform_image_ref(DRWShadingGroup *shgroup, const char *name, GPUTexture **tex)
void DRW_shgroup_uniform_vec2(DRWShadingGroup *shgroup, const char *name, const float *value, int arraysize)
void DRW_draw_pass(DRWPass *pass)
void DRW_stats_group_start(const char *name)
void DRW_stats_group_end(void)
GPUTexture * DRW_texture_create_3d(int w, int h, int d, eGPUTextureFormat format, DRWTextureFlag flags, const float *fpixels)
void DRW_texture_ensure_fullscreen_2d(GPUTexture **tex, eGPUTextureFormat format, DRWTextureFlag flags)
#define LOOK_DEV_STUDIO_LIGHT_ENABLED(v3d)
struct GPUShader * EEVEE_shaders_volumes_scatter_sh_get(void)
struct GPUShader * EEVEE_shaders_volumes_integration_sh_get(void)
struct GPUShader * EEVEE_shaders_volumes_accum_sh_get(void)
struct GPUMaterial * EEVEE_material_get(EEVEE_Data *vedata, struct Scene *scene, Material *ma, World *wo, int options)
struct GPUShader * EEVEE_shaders_volumes_scatter_with_lights_sh_get(void)
struct GPUShader * EEVEE_shaders_volumes_clear_sh_get(void)
struct GPUShader * EEVEE_shaders_volumes_resolve_sh_get(bool accum)
void EEVEE_volumes_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
void EEVEE_volumes_set_jitter(EEVEE_ViewLayerData *sldata, uint current_sample)
static bool eevee_volume_object_mesh_init(Scene *scene, Object *ob, ListBase *gpu_grids, DRWShadingGroup *grp)
void EEVEE_volumes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
void EEVEE_volumes_free(void)
void EEVEE_volumes_compute(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
void EEVEE_volumes_free_smoke_textures(void)
GPUTexture * dummy_scatter
static struct @207 e_data
static void eevee_create_textures_volumes(void)
static GPUTexture * eevee_volume_default_texture(eGPUVolumeDefaultValue default_value)
void EEVEE_volumes_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
static bool eevee_volume_object_grids_init(Object *ob, ListBase *gpu_grids, DRWShadingGroup *grp)
void EEVEE_volumes_output_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, uint tot_samples)
void EEVEE_volumes_resolve(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata)
GPUTexture * dummy_transmit
void EEVEE_volumes_output_accumulate(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata)
void EEVEE_volumes_cache_object_add(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Scene *scene, Object *ob)
void EEVEE_volumes_draw_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
static void clear(Message *msg)
const struct bContext * evil_C
struct Depsgraph * depsgraph
float bounds_to_texture[4][4]
float object_to_bounds[4][4]
struct GPUTexture * texture
float object_to_texture[4][4]
struct GPUTexture * depth
EEVEE_FramebufferList * fbl
struct GPUTexture * volume_transmit
struct GPUTexture * volume_scatter
EEVEE_EffectsFlag enabled_effects
int volume_current_sample
struct GPUFrameBuffer * volumetric_fb
struct GPUFrameBuffer * main_fb
struct GPUFrameBuffer * volumetric_scat_fb
struct GPUFrameBuffer * volumetric_integ_fb
struct GPUFrameBuffer * main_color_fb
struct GPUFrameBuffer * volumetric_accum_fb
struct DRWPass * volumetric_objects_ps
struct DRWPass * volumetric_integration_ps
struct DRWPass * volumetric_world_ps
struct DRWPass * volumetric_scatter_ps
struct DRWPass * volumetric_resolve_ps
struct DRWPass * volumetric_accum_ps
struct LightCache * light_cache
struct EEVEE_PrivateData * g_data
struct EEVEE_EffectsInfo * effects
struct GPUTexture * volume_scatter_history
struct GPUTexture * volume_prop_extinction
struct GPUTexture * volume_scatter_accum
struct GPUTexture * volume_transmittance_accum
struct GPUTexture * volume_prop_emission
struct GPUTexture * volume_transmit
struct GPUTexture * volume_transmit_history
struct GPUTexture * volume_prop_phase
struct GPUTexture * volume_prop_scattering
struct GPUTexture * volume_scatter
struct EEVEE_CommonUniformBuffer common_data
struct GPUTexture * shadow_cube_pool
struct GPUUniformBuf * combined
struct GPUUniformBuf * shadow_ubo
struct GPUUniformBuf * probe_ubo
struct GPUUniformBuf * grid_ubo
struct GPUUniformBuf * planar_ubo
struct EEVEE_ViewLayerData::@202 renderpass_ubo
struct GPUUniformBuf * common_ubo
struct GPUUniformBuf * light_ubo
struct GPUTexture * shadow_cascade_pool
struct GPUTexture * tex_density
struct GPUTexture * tex_color
struct PointCache * point_cache[2]
struct GPUTexture * tex_flame
struct FluidDomainSettings * domain
eGPUMaterialStatus status
LightCacheTexture grid_tx
float volumetric_light_clamp
float volumetric_sample_distribution
int volumetric_shadow_samples
struct bNodeTree * nodetree