Move EEVEE properties into scene
[blender.git] / source / blender / draw / engines / eevee / eevee_private.h
1 /*
2  * Copyright 2016, Blender Foundation.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * Contributor(s): Blender Institute
19  *
20  */
21
22 /** \file eevee_private.h
23  *  \ingroup DNA
24  */
25
26 #ifndef __EEVEE_PRIVATE_H__
27 #define __EEVEE_PRIVATE_H__
28
29 struct Object;
30 struct EEVEE_BoundSphere;
31 struct EEVEE_ShadowCasterBuffer;
32 struct RenderLayer;
33 struct RenderResult;
34
35 extern struct DrawEngineType draw_engine_eevee_type;
36
37 /* Minimum UBO is 16384 bytes */
38 #define MAX_PROBE 128 /* TODO : find size by dividing UBO max size by probe data size */
39 #define MAX_GRID 64 /* TODO : find size by dividing UBO max size by grid data size */
40 #define MAX_PLANAR 16 /* TODO : find size by dividing UBO max size by grid data size */
41 #define MAX_LIGHT 128 /* TODO : find size by dividing UBO max size by light data size */
42 #define MAX_CASCADE_NUM 4
43 #define MAX_SHADOW 256 /* TODO : Make this depends on GL_MAX_ARRAY_TEXTURE_LAYERS */
44 #define MAX_SHADOW_CASCADE 8
45 #define MAX_SHADOW_CUBE (MAX_SHADOW - MAX_CASCADE_NUM * MAX_SHADOW_CASCADE)
46 #define MAX_BLOOM_STEP 16
47
48 /* Only define one of these. */
49 // #define IRRADIANCE_SH_L2
50 // #define IRRADIANCE_CUBEMAP
51 #define IRRADIANCE_HL2
52
53 #if defined(IRRADIANCE_SH_L2)
54 #  define SHADER_IRRADIANCE "#define IRRADIANCE_SH_L2\n"
55 #elif defined(IRRADIANCE_CUBEMAP)
56 #  define SHADER_IRRADIANCE "#define IRRADIANCE_CUBEMAP\n"
57 #elif defined(IRRADIANCE_HL2)
58 #  define SHADER_IRRADIANCE "#define IRRADIANCE_HL2\n"
59 #endif
60
61 #define SHADER_DEFINES \
62         "#define EEVEE_ENGINE\n" \
63         "#define MAX_PROBE " STRINGIFY(MAX_PROBE) "\n" \
64         "#define MAX_GRID " STRINGIFY(MAX_GRID) "\n" \
65         "#define MAX_PLANAR " STRINGIFY(MAX_PLANAR) "\n" \
66         "#define MAX_LIGHT " STRINGIFY(MAX_LIGHT) "\n" \
67         "#define MAX_SHADOW " STRINGIFY(MAX_SHADOW) "\n" \
68         "#define MAX_SHADOW_CUBE " STRINGIFY(MAX_SHADOW_CUBE) "\n" \
69         "#define MAX_SHADOW_CASCADE " STRINGIFY(MAX_SHADOW_CASCADE) "\n" \
70         "#define MAX_CASCADE_NUM " STRINGIFY(MAX_CASCADE_NUM) "\n" \
71         SHADER_IRRADIANCE
72
73 #define SWAP_DOUBLE_BUFFERS() {                                       \
74         if (effects->swap_double_buffer) {                                \
75                 SWAP(struct GPUFrameBuffer *, fbl->main_fb, fbl->double_buffer_fb); \
76                 SWAP(struct GPUFrameBuffer *, fbl->main_color_fb, fbl->double_buffer_color_fb); \
77                 SWAP(GPUTexture *, txl->color, txl->color_double_buffer);     \
78                 effects->swap_double_buffer = false;                          \
79         }                                                                 \
80 } ((void)0)
81
82 #define SWAP_BUFFERS() {                           \
83         if (effects->target_buffer == fbl->effect_color_fb) { \
84                 SWAP_DOUBLE_BUFFERS();                     \
85                 effects->source_buffer = txl->color_post;  \
86                 effects->target_buffer = fbl->main_color_fb;  \
87         }                                              \
88         else {                                         \
89                 SWAP_DOUBLE_BUFFERS();                     \
90                 effects->source_buffer = txl->color;       \
91                 effects->target_buffer = fbl->effect_color_fb; \
92         }                                              \
93 } ((void)0)
94
95 /* World shader variations */
96 enum {
97         VAR_WORLD_BACKGROUND    = 0,
98         VAR_WORLD_PROBE         = 1,
99         VAR_WORLD_VOLUME        = 2,
100 };
101
102 /* Material shader variations */
103 enum {
104         VAR_MAT_MESH     = (1 << 0),
105         VAR_MAT_PROBE    = (1 << 1),
106         VAR_MAT_HAIR     = (1 << 2),
107         VAR_MAT_FLAT     = (1 << 3),
108         VAR_MAT_BLEND    = (1 << 4),
109         VAR_MAT_VSM      = (1 << 5),
110         VAR_MAT_ESM      = (1 << 6),
111         VAR_MAT_VOLUME   = (1 << 7),
112         /* Max number of variation */
113         /* IMPORTANT : Leave it last and set
114          * it's value accordingly. */
115         VAR_MAT_MAX      = (1 << 8),
116         /* These are options that are not counted in VAR_MAT_MAX
117          * because they are not cumulative with the others above. */
118         VAR_MAT_CLIP     = (1 << 9),
119         VAR_MAT_HASH     = (1 << 10),
120         VAR_MAT_MULT     = (1 << 11),
121         VAR_MAT_SHADOW   = (1 << 12),
122         VAR_MAT_REFRACT  = (1 << 13),
123         VAR_MAT_SSS      = (1 << 14),
124         VAR_MAT_TRANSLUC = (1 << 15),
125         VAR_MAT_SSSALBED = (1 << 16),
126 };
127
128 typedef struct EEVEE_BoundSphere {
129         float center[3], radius;
130 } EEVEE_BoundSphere;
131
132 typedef struct EEVEE_BoundBox {
133         float center[3], halfdim[3];
134 } EEVEE_BoundBox;
135
136 typedef struct EEVEE_PassList {
137         /* Shadows */
138         struct DRWPass *shadow_pass;
139         struct DRWPass *shadow_cube_copy_pass;
140         struct DRWPass *shadow_cube_store_pass;
141         struct DRWPass *shadow_cascade_copy_pass;
142         struct DRWPass *shadow_cascade_store_pass;
143
144         /* Probes */
145         struct DRWPass *probe_background;
146         struct DRWPass *probe_glossy_compute;
147         struct DRWPass *probe_diffuse_compute;
148         struct DRWPass *probe_visibility_compute;
149         struct DRWPass *probe_grid_fill;
150         struct DRWPass *probe_display;
151         struct DRWPass *probe_planar_downsample_ps;
152
153         /* Effects */
154         struct DRWPass *ao_horizon_search;
155         struct DRWPass *ao_horizon_search_layer;
156         struct DRWPass *ao_horizon_debug;
157         struct DRWPass *ao_accum_ps;
158         struct DRWPass *mist_accum_ps;
159         struct DRWPass *motion_blur;
160         struct DRWPass *bloom_blit;
161         struct DRWPass *bloom_downsample_first;
162         struct DRWPass *bloom_downsample;
163         struct DRWPass *bloom_upsample;
164         struct DRWPass *bloom_resolve;
165         struct DRWPass *dof_down;
166         struct DRWPass *dof_scatter;
167         struct DRWPass *dof_resolve;
168         struct DRWPass *volumetric_world_ps;
169         struct DRWPass *volumetric_objects_ps;
170         struct DRWPass *volumetric_scatter_ps;
171         struct DRWPass *volumetric_integration_ps;
172         struct DRWPass *volumetric_resolve_ps;
173         struct DRWPass *ssr_raytrace;
174         struct DRWPass *ssr_resolve;
175         struct DRWPass *sss_blur_ps;
176         struct DRWPass *sss_resolve_ps;
177         struct DRWPass *sss_accum_ps;
178         struct DRWPass *color_downsample_ps;
179         struct DRWPass *color_downsample_cube_ps;
180         struct DRWPass *velocity_resolve;
181         struct DRWPass *taa_resolve;
182
183         /* HiZ */
184         struct DRWPass *minz_downlevel_ps;
185         struct DRWPass *maxz_downlevel_ps;
186         struct DRWPass *minz_downdepth_ps;
187         struct DRWPass *maxz_downdepth_ps;
188         struct DRWPass *minz_downdepth_layer_ps;
189         struct DRWPass *maxz_downdepth_layer_ps;
190         struct DRWPass *minz_copydepth_ps;
191         struct DRWPass *maxz_copydepth_ps;
192
193         struct DRWPass *depth_pass;
194         struct DRWPass *depth_pass_cull;
195         struct DRWPass *depth_pass_clip;
196         struct DRWPass *depth_pass_clip_cull;
197         struct DRWPass *refract_depth_pass;
198         struct DRWPass *refract_depth_pass_cull;
199         struct DRWPass *refract_depth_pass_clip;
200         struct DRWPass *refract_depth_pass_clip_cull;
201         struct DRWPass *default_pass[VAR_MAT_MAX];
202         struct DRWPass *sss_pass;
203         struct DRWPass *material_pass;
204         struct DRWPass *refract_pass;
205         struct DRWPass *transparent_pass;
206         struct DRWPass *background_pass;
207         struct DRWPass *update_noise_pass;
208 } EEVEE_PassList;
209
210 typedef struct EEVEE_FramebufferList {
211         /* Effects */
212         struct GPUFrameBuffer *gtao_fb;
213         struct GPUFrameBuffer *gtao_debug_fb;
214         struct GPUFrameBuffer *downsample_fb;
215         struct GPUFrameBuffer *bloom_blit_fb;
216         struct GPUFrameBuffer *bloom_down_fb[MAX_BLOOM_STEP];
217         struct GPUFrameBuffer *bloom_accum_fb[MAX_BLOOM_STEP - 1];
218         struct GPUFrameBuffer *sss_blur_fb;
219         struct GPUFrameBuffer *sss_resolve_fb;
220         struct GPUFrameBuffer *sss_clear_fb;
221         struct GPUFrameBuffer *sss_accum_fb;
222         struct GPUFrameBuffer *dof_down_fb;
223         struct GPUFrameBuffer *dof_scatter_fb;
224         struct GPUFrameBuffer *volumetric_fb;
225         struct GPUFrameBuffer *volumetric_scat_fb;
226         struct GPUFrameBuffer *volumetric_integ_fb;
227         struct GPUFrameBuffer *screen_tracing_fb;
228         struct GPUFrameBuffer *refract_fb;
229         struct GPUFrameBuffer *mist_accum_fb;
230         struct GPUFrameBuffer *ao_accum_fb;
231         struct GPUFrameBuffer *velocity_resolve_fb;
232
233         struct GPUFrameBuffer *update_noise_fb;
234
235         struct GPUFrameBuffer *planarref_fb;
236         struct GPUFrameBuffer *planar_downsample_fb;
237
238         struct GPUFrameBuffer *main_fb;
239         struct GPUFrameBuffer *main_color_fb;
240         struct GPUFrameBuffer *effect_fb;
241         struct GPUFrameBuffer *effect_color_fb;
242         struct GPUFrameBuffer *double_buffer_fb;
243         struct GPUFrameBuffer *double_buffer_color_fb;
244         struct GPUFrameBuffer *double_buffer_depth_fb;
245 } EEVEE_FramebufferList;
246
247 typedef struct EEVEE_TextureList {
248         /* Effects */
249         struct GPUTexture *color_post; /* R16_G16_B16 */
250         struct GPUTexture *mist_accum;
251         struct GPUTexture *ao_accum;
252         struct GPUTexture *sss_dir_accum;
253         struct GPUTexture *sss_col_accum;
254         struct GPUTexture *refract_color;
255
256         struct GPUTexture *volume_prop_scattering;
257         struct GPUTexture *volume_prop_extinction;
258         struct GPUTexture *volume_prop_emission;
259         struct GPUTexture *volume_prop_phase;
260         struct GPUTexture *volume_scatter;
261         struct GPUTexture *volume_transmittance;
262         struct GPUTexture *volume_scatter_history;
263         struct GPUTexture *volume_transmittance_history;
264
265         struct GPUTexture *planar_pool;
266         struct GPUTexture *planar_depth;
267
268         struct GPUTexture *maxzbuffer;
269
270         struct GPUTexture *color; /* R16_G16_B16 */
271         struct GPUTexture *color_double_buffer;
272         struct GPUTexture *depth_double_buffer;
273 } EEVEE_TextureList;
274
275 typedef struct EEVEE_StorageList {
276         /* Effects */
277         struct EEVEE_EffectsInfo *effects;
278
279         struct EEVEE_PrivateData *g_data;
280 } EEVEE_StorageList;
281
282 /* ************ LIGHT UBO ************* */
283 typedef struct EEVEE_Light {
284         float position[3], dist;
285         float color[3], spec;
286         float spotsize, spotblend, radius, shadowid;
287         float rightvec[3], sizex;
288         float upvec[3], sizey;
289         float forwardvec[3], lamptype;
290 } EEVEE_Light;
291
292 typedef struct EEVEE_Shadow {
293         float near, far, bias, exp;
294         float shadow_start, data_start, multi_shadow_count, shadow_blur;
295         float contact_dist, contact_bias, contact_spread, contact_thickness;
296 } EEVEE_Shadow;
297
298 typedef struct EEVEE_ShadowCube {
299         float position[3], pad;
300 } EEVEE_ShadowCube;
301
302 typedef struct EEVEE_ShadowCascade {
303         float shadowmat[MAX_CASCADE_NUM][4][4]; /* World->Lamp->NDC->Tex : used for sampling the shadow map. */
304         float split_start[4];
305         float split_end[4];
306 } EEVEE_ShadowCascade;
307
308 typedef struct EEVEE_ShadowRender {
309         float position[3], pad;
310         float cube_texel_size;
311         float stored_texel_size;
312         float clip_near;
313         float clip_far;
314         int shadow_samples_ct;
315         float shadow_inv_samples_ct;
316 } EEVEE_ShadowRender;
317
318 /* This is just a really long bitflag with special function to access it. */
319 #define MAX_LIGHTBITS_FIELDS (MAX_LIGHT / 8)
320 typedef struct EEVEE_LightBits {
321         unsigned char fields[MAX_LIGHTBITS_FIELDS];
322 } EEVEE_LightBits;
323
324 typedef struct EEVEE_ShadowCaster {
325         struct EEVEE_LightBits bits;
326         struct EEVEE_BoundBox bbox;
327 } EEVEE_ShadowCaster;
328
329 typedef struct EEVEE_ShadowCasterBuffer {
330         struct EEVEE_ShadowCaster *shadow_casters;
331         char *flags;
332         uint alloc_count;
333         uint count;
334 } EEVEE_ShadowCasterBuffer;
335
336 /* ************ LIGHT DATA ************* */
337 typedef struct EEVEE_LampsInfo {
338         int num_light, cache_num_light;
339         int num_cube_layer, cache_num_cube_layer;
340         int num_cascade_layer, cache_num_cascade_layer;
341         int gpu_cube_ct, gpu_cascade_ct, gpu_shadow_ct;
342         int cpu_cube_ct, cpu_cascade_ct;
343         int update_flag;
344         int shadow_cube_size, shadow_cascade_size, shadow_method;
345         bool shadow_high_bitdepth;
346         int shadow_cube_store_size;
347         int current_shadow_cascade;
348         int current_shadow_face;
349         uint shadow_instance_count;
350         float filter_size;
351         /* List of lights in the scene. */
352         /* XXX This is fragile, can get out of sync quickly. */
353         struct Object *light_ref[MAX_LIGHT];
354         struct Object *shadow_cube_ref[MAX_SHADOW_CUBE];
355         struct Object *shadow_cascade_ref[MAX_SHADOW_CASCADE];
356         /* UBO Storage : data used by UBO */
357         struct EEVEE_Light         light_data[MAX_LIGHT];
358         struct EEVEE_ShadowRender  shadow_render_data;
359         struct EEVEE_Shadow        shadow_data[MAX_SHADOW];
360         struct EEVEE_ShadowCube    shadow_cube_data[MAX_SHADOW_CUBE];
361         struct EEVEE_ShadowCascade shadow_cascade_data[MAX_SHADOW_CASCADE];
362         /* Lights tracking */
363         int new_shadow_id[MAX_LIGHT]; /* To be able to convert old bitfield to new bitfield */
364         struct EEVEE_BoundSphere shadow_bounds[MAX_LIGHT]; /* Tighly packed light bounds  */
365         /* Pointers only. */
366         struct EEVEE_ShadowCasterBuffer *shcaster_frontbuffer;
367         struct EEVEE_ShadowCasterBuffer *shcaster_backbuffer;
368 } EEVEE_LampsInfo;
369
370 /* EEVEE_LampsInfo->shadow_casters_flag */
371 enum {
372         SHADOW_CASTER_PRUNED = (1 << 0),
373         SHADOW_CASTER_UPDATED = (1 << 1),
374 };
375
376 /* EEVEE_LampsInfo->update_flag */
377 enum {
378         LIGHT_UPDATE_SHADOW_CUBE = (1 << 0),
379 };
380
381 /* ************ PROBE UBO ************* */
382 typedef struct EEVEE_LightProbe {
383         float position[3], parallax_type;
384         float attenuation_fac;
385         float attenuation_type;
386         float pad3[2];
387         float attenuationmat[4][4];
388         float parallaxmat[4][4];
389 } EEVEE_LightProbe;
390
391 typedef struct EEVEE_LightGrid {
392         float mat[4][4];
393         int resolution[3], offset;
394         float corner[3], attenuation_scale;
395         float increment_x[3], attenuation_bias; /* world space vector between 2 opposite cells */
396         float increment_y[3], level_bias;
397         float increment_z[3], pad4;
398         float visibility_bias, visibility_bleed, visibility_range, pad5;
399 } EEVEE_LightGrid;
400
401 typedef struct EEVEE_PlanarReflection {
402         float plane_equation[4];
403         float clip_vec_x[3], attenuation_scale;
404         float clip_vec_y[3], attenuation_bias;
405         float clip_edge_x_pos, clip_edge_x_neg;
406         float clip_edge_y_pos, clip_edge_y_neg;
407         float facing_scale, facing_bias, pad[2];
408         float reflectionmat[4][4];
409 } EEVEE_PlanarReflection;
410
411 /* ************ PROBE DATA ************* */
412
413 typedef struct EEVEE_LightProbeVisTest {
414         bool invert;
415         bool cached; /* Reuse last test results */
416         struct Group *group; /* Skip test if NULL */
417 } EEVEE_LightProbeVisTest;
418
419 typedef struct EEVEE_LightProbesInfo {
420         int num_cube, cache_num_cube;
421         int num_grid, cache_num_grid;
422         int num_planar, cache_num_planar;
423         int total_irradiance_samples; /* Total for all grids */
424         int cache_irradiance_size[3];
425         int update_flag;
426         int updated_bounce;
427         int num_bounce;
428         int cubemap_res;
429         int target_size;
430         int grid_initialized;
431         struct World *prev_world;
432         int update_world;
433         bool prev_wo_sh_compiled;
434         bool do_cube_update;
435         bool all_materials_updated;
436         /* For rendering probes */
437         float probemat[6][4][4];
438         int layer;
439         float texel_size;
440         float padding_size;
441         float samples_ct;
442         float invsamples_ct;
443         float near_clip;
444         float far_clip;
445         float roughness;
446         float lodfactor;
447         float lod_rt_max, lod_cube_max, lod_planar_max;
448         float visibility_range;
449         float visibility_blur;
450         float intensity_fac;
451         int shres;
452         /* List of probes in the scene. */
453         /* XXX This is fragile, can get out of sync quickly. */
454         struct Object *probes_cube_ref[MAX_PROBE];
455         struct Object *probes_grid_ref[MAX_GRID];
456         struct Object *probes_planar_ref[MAX_PLANAR];
457         /* UBO Storage : data used by UBO */
458         struct EEVEE_LightProbe probe_data[MAX_PROBE];
459         struct EEVEE_LightGrid grid_data[MAX_GRID];
460         struct EEVEE_PlanarReflection planar_data[MAX_PLANAR];
461         /* Probe Visibility Group */
462         EEVEE_LightProbeVisTest vis_data;
463 } EEVEE_LightProbesInfo;
464
465 /* EEVEE_LightProbesInfo->update_flag */
466 enum {
467         PROBE_UPDATE_CUBE = (1 << 0),
468         PROBE_UPDATE_GRID = (1 << 1),
469         PROBE_UPDATE_ALL  = 0xFFFFFF,
470 };
471
472 /* ************ EFFECTS DATA ************* */
473
474 typedef enum EEVEE_EffectsFlag {
475         EFFECT_MOTION_BLUR         = (1 << 0),
476         EFFECT_BLOOM               = (1 << 1),
477         EFFECT_DOF                 = (1 << 2),
478         EFFECT_VOLUMETRIC          = (1 << 3),
479         EFFECT_SSR                 = (1 << 4),
480         EFFECT_DOUBLE_BUFFER       = (1 << 5), /* Not really an effect but a feature */
481         EFFECT_REFRACT             = (1 << 6),
482         EFFECT_GTAO                = (1 << 7),
483         EFFECT_TAA                 = (1 << 8),
484         EFFECT_POST_BUFFER         = (1 << 9), /* Not really an effect but a feature */
485         EFFECT_NORMAL_BUFFER       = (1 << 10), /* Not really an effect but a feature */
486         EFFECT_SSS                 = (1 << 11),
487         EFFECT_VELOCITY_BUFFER     = (1 << 12), /* Not really an effect but a feature */
488         EFFECT_TAA_REPROJECT       = (1 << 13), /* should be mutually exclusive with EFFECT_TAA */
489         EFFECT_DEPTH_DOUBLE_BUFFER = (1 << 14), /* Not really an effect but a feature */
490 } EEVEE_EffectsFlag;
491
492 typedef struct EEVEE_EffectsInfo {
493         EEVEE_EffectsFlag enabled_effects;
494         bool swap_double_buffer;
495         /* SSSS */
496         int sss_sample_count;
497         bool sss_separate_albedo;
498         struct GPUTexture *sss_data; /* Textures from pool */
499         struct GPUTexture *sss_albedo;
500         struct GPUTexture *sss_blur;
501         struct GPUTexture *sss_stencil;
502         /* Volumetrics */
503         int volume_current_sample;
504         /* SSR */
505         bool reflection_trace_full;
506         int ssr_neighbor_ofs;
507         int ssr_halfres_ofs[2];
508         struct GPUTexture *ssr_normal_input; /* Textures from pool */
509         struct GPUTexture *ssr_specrough_input;
510         struct GPUTexture *ssr_hit_output;
511         struct GPUTexture *ssr_pdf_output;
512         /* Temporal Anti Aliasing */
513         int taa_reproject_sample;
514         int taa_current_sample;
515         int taa_render_sample;
516         int taa_total_sample;
517         float taa_alpha;
518         bool prev_drw_support;
519         float prev_drw_persmat[4][4];
520         float overide_persmat[4][4];
521         float overide_persinv[4][4];
522         float overide_winmat[4][4];
523         float overide_wininv[4][4];
524         /* Ambient Occlusion */
525         int ao_depth_layer;
526         struct GPUTexture *ao_src_depth; /* pointer copy */
527         struct GPUTexture *gtao_horizons; /* Textures from pool */
528         struct GPUTexture *gtao_horizons_debug;
529         /* Motion Blur */
530         float current_ndc_to_world[4][4];
531         float past_world_to_ndc[4][4];
532         int motion_blur_samples;
533         /* Velocity Pass */
534         float velocity_curr_persinv[4][4];
535         float velocity_past_persmat[4][4];
536         struct GPUTexture *velocity_tx; /* Texture from pool */
537         /* Depth Of Field */
538         float dof_near_far[2];
539         float dof_params[3];
540         float dof_bokeh[4];
541         float dof_bokeh_sides[4];
542         int dof_target_size[2];
543         struct GPUTexture *dof_down_near; /* Textures from pool */
544         struct GPUTexture *dof_down_far;
545         struct GPUTexture *dof_coc;
546         struct GPUTexture *dof_blur;
547         /* Other */
548         float prev_persmat[4][4];
549         /* Bloom */
550         int bloom_iteration_ct;
551         float source_texel_size[2];
552         float blit_texel_size[2];
553         float downsamp_texel_size[MAX_BLOOM_STEP][2];
554         float bloom_color[3];
555         float bloom_clamp;
556         float bloom_sample_scale;
557         float bloom_curve_threshold[4];
558         float unf_source_texel_size[2];
559         struct GPUTexture *bloom_blit; /* Textures from pool */
560         struct GPUTexture *bloom_downsample[MAX_BLOOM_STEP];
561         struct GPUTexture *bloom_upsample[MAX_BLOOM_STEP - 1];
562         struct GPUTexture *unf_source_buffer; /* pointer copy */
563         struct GPUTexture *unf_base_buffer; /* pointer copy */
564         /* Not alloced, just a copy of a *GPUtexture in EEVEE_TextureList. */
565         struct GPUTexture *source_buffer;       /* latest updated texture */
566         struct GPUFrameBuffer *target_buffer;   /* next target to render to */
567         struct GPUTexture *final_tx;            /* Final color to transform to display color space. */
568         struct GPUFrameBuffer *final_fb;        /* Framebuffer with final_tx as attachement. */
569 } EEVEE_EffectsInfo;
570
571 /* ***************** COMMON DATA **************** */
572
573 /* Common uniform buffer containing all "constant" data over the whole drawing pipeline. */
574 /* !! CAUTION !!
575  * - [i]vec3 need to be paded to [i]vec4 (even in ubo declaration).
576  * - Make sure that [i]vec4 start at a multiple of 16 bytes.
577  * - Arrays of vec2/vec3 are padded as arrays of vec4.
578  * - sizeof(bool) == sizeof(int) in GLSL so use int in C */
579 typedef struct EEVEE_CommonUniformBuffer {
580         float prev_persmat[4][4]; /* mat4 */
581         float view_vecs[2][4]; /* vec4[2] */
582         float mip_ratio[10][4]; /* vec2[10] */
583         /* Ambient Occlusion */
584         /* -- 16 byte aligned -- */
585         float ao_dist, pad1, ao_factor, pad2; /* vec4 */
586         float ao_offset, ao_bounce_fac, ao_quality, ao_settings; /* vec4 */
587         /* Volumetric */
588         /* -- 16 byte aligned -- */
589         int vol_tex_size[3], pad3; /* ivec3 */
590         float vol_depth_param[3], pad4; /* vec3 */
591         float vol_inv_tex_size[3], pad5; /* vec3 */
592         float vol_jitter[3], pad6; /* vec3 */
593         float vol_coord_scale[2], pad7[2]; /* vec2 */
594         /* -- 16 byte aligned -- */
595         float vol_history_alpha; /* float */
596         float vol_light_clamp; /* float */
597         float vol_shadow_steps; /* float */
598         int vol_use_lights; /* bool */
599         /* Screen Space Reflections */
600         /* -- 16 byte aligned -- */
601         float ssr_quality, ssr_thickness, ssr_pixelsize[2]; /* vec4 */
602         float ssr_border_fac; /* float */
603         float ssr_max_roughness; /* float */
604         float ssr_firefly_fac; /* float */
605         float ssr_brdf_bias; /* float */
606         int ssr_toggle; /* bool */
607         /* SubSurface Scattering */
608         float sss_jitter_threshold; /* float */
609         int sss_toggle; /* bool */
610         /* Specular */
611         int spec_toggle; /* bool */
612         /* Lamps */
613         int la_num_light; /* int */
614         /* Probes */
615         int prb_num_planar; /* int */
616         int prb_num_render_cube; /* int */
617         int prb_num_render_grid; /* int */
618         int prb_irradiance_vis_size; /* int */
619         float prb_lod_cube_max; /* float */
620         float prb_lod_planar_max; /* float */
621 } EEVEE_CommonUniformBuffer;
622
623 /* ***************** CLIP PLANES DATA **************** */
624
625 typedef struct EEVEE_ClipPlanesUniformBuffer {
626         float clip_planes[1][4]; /* must be less than MAX_CLIP_PLANES */
627 } EEVEE_ClipPlanesUniformBuffer;
628
629 /* ************** SCENE LAYER DATA ************** */
630 typedef struct EEVEE_ViewLayerData {
631         /* Lamps */
632         struct EEVEE_LampsInfo *lamps;
633
634         struct GPUUniformBuffer *light_ubo;
635         struct GPUUniformBuffer *shadow_ubo;
636         struct GPUUniformBuffer *shadow_render_ubo;
637         struct GPUUniformBuffer *shadow_samples_ubo;
638
639         struct GPUFrameBuffer *shadow_cube_target_fb;
640         struct GPUFrameBuffer *shadow_cube_store_fb;
641         struct GPUFrameBuffer *shadow_cascade_target_fb;
642         struct GPUFrameBuffer *shadow_cascade_store_fb;
643
644         struct GPUTexture *shadow_cube_target;
645         struct GPUTexture *shadow_cube_blur;
646         struct GPUTexture *shadow_cascade_target;
647         struct GPUTexture *shadow_cascade_blur;
648         struct GPUTexture *shadow_cube_pool;
649         struct GPUTexture *shadow_cascade_pool;
650
651         struct EEVEE_ShadowCasterBuffer shcasters_buffers[2];
652
653         /* Probes */
654         struct EEVEE_LightProbesInfo *probes;
655
656         struct GPUUniformBuffer *probe_ubo;
657         struct GPUUniformBuffer *grid_ubo;
658         struct GPUUniformBuffer *planar_ubo;
659
660         struct GPUFrameBuffer *probe_filter_fb;
661         struct GPUFrameBuffer *probe_face_fb[6];
662
663         struct GPUTexture *probe_rt;
664         struct GPUTexture *probe_depth_rt;
665         struct GPUTexture *probe_pool;
666         struct GPUTexture *irradiance_pool;
667         struct GPUTexture *irradiance_rt;
668
669         /* Common Uniform Buffer */
670         struct EEVEE_CommonUniformBuffer common_data;
671         struct GPUUniformBuffer *common_ubo;
672
673         struct EEVEE_ClipPlanesUniformBuffer clip_data;
674         struct GPUUniformBuffer *clip_ubo;
675 } EEVEE_ViewLayerData;
676
677 /* ************ OBJECT DATA ************ */
678 typedef struct EEVEE_LightData {
679         short light_id, shadow_id;
680 } EEVEE_LightData;
681
682 typedef struct EEVEE_ShadowCubeData {
683         short light_id, shadow_id, cube_id, layer_id;
684 } EEVEE_ShadowCubeData;
685
686 typedef struct EEVEE_ShadowCascadeData {
687         short light_id, shadow_id, cascade_id, layer_id;
688         float viewprojmat[MAX_CASCADE_NUM][4][4]; /* World->Lamp->NDC : used for rendering the shadow map. */
689         float projmat[MAX_CASCADE_NUM][4][4];
690         float viewmat[4][4], viewinv[4][4];
691         float radius[MAX_CASCADE_NUM];
692 } EEVEE_ShadowCascadeData;
693
694 /* Theses are the structs stored inside Objects.
695  * It works with even if the object is in multiple layers
696  * because we don't get the same "Object *" for each layer. */
697 typedef struct EEVEE_LampEngineData {
698         ObjectEngineData engine_data;
699
700         bool need_update;
701         /* This needs to be out of the union to avoid undefined behaviour. */
702         short prev_cube_shadow_id;
703         union {
704                 struct EEVEE_LightData ld;
705                 struct EEVEE_ShadowCubeData scd;
706                 struct EEVEE_ShadowCascadeData scad;
707         } data;
708 } EEVEE_LampEngineData;
709
710 typedef struct EEVEE_LightProbeEngineData {
711         ObjectEngineData engine_data;
712
713         /* NOTE: need_full_update is set by dependency graph when the probe or it's
714          * object is updated. This triggers full probe update, including it's
715          * "progressive" GI refresh.
716          *
717          * need_update is always set to truth when need_full_update is tagged, but
718          * might also be forced to be kept truth during GI refresh stages.
719          *
720          * TODO(sergey): Is there a way to avoid two flags here, or at least make
721          * it more clear what's going on here?
722          */
723         bool need_full_update;
724         bool need_update;
725
726         bool ready_to_shade;
727         int updated_cells;
728         int updated_lvl;
729         int num_cell;
730         int max_lvl;
731         int probe_id; /* Only used for display data */
732         float probe_size; /* Only used for display data */
733         DRWMatrixState mats; /* For planar probes */
734         float planer_eq_offset[4];
735         struct ListBase captured_object_list;
736 } EEVEE_LightProbeEngineData;
737
738 typedef struct EEVEE_ObjectEngineData {
739         ObjectEngineData engine_data;
740
741         Object *ob; /* self reference */
742         EEVEE_LightProbeVisTest *test_data;
743         bool ob_vis, ob_vis_dirty;
744
745         bool need_update;
746         uint shadow_caster_id;
747 } EEVEE_ObjectEngineData;
748
749 /* *********************************** */
750
751 typedef struct EEVEE_Data {
752         void *engine_type;
753         EEVEE_FramebufferList *fbl;
754         EEVEE_TextureList *txl;
755         EEVEE_PassList *psl;
756         EEVEE_StorageList *stl;
757 } EEVEE_Data;
758
759 typedef struct EEVEE_PrivateData {
760         struct DRWShadingGroup *shadow_shgrp;
761         struct DRWShadingGroup *depth_shgrp;
762         struct DRWShadingGroup *depth_shgrp_cull;
763         struct DRWShadingGroup *depth_shgrp_clip;
764         struct DRWShadingGroup *depth_shgrp_clip_cull;
765         struct DRWShadingGroup *refract_depth_shgrp;
766         struct DRWShadingGroup *refract_depth_shgrp_cull;
767         struct DRWShadingGroup *refract_depth_shgrp_clip;
768         struct DRWShadingGroup *refract_depth_shgrp_clip_cull;
769         struct DRWShadingGroup *cube_display_shgrp;
770         struct DRWShadingGroup *planar_display_shgrp;
771         struct GHash *material_hash;
772         struct GHash *hair_material_hash;
773         float background_alpha; /* TODO find a better place for this. */
774         /* For planar probes */
775         float planar_texel_size[2];
776         /* For double buffering */
777         bool view_updated;
778         bool valid_double_buffer;
779         /* Render Matrices */
780         float persmat[4][4], persinv[4][4];
781         float viewmat[4][4], viewinv[4][4];
782         float winmat[4][4], wininv[4][4];
783         /* Mist Settings */
784         float mist_start, mist_inv_dist, mist_falloff;
785 } EEVEE_PrivateData; /* Transient data */
786
787 /* eevee_data.c */
788 EEVEE_ViewLayerData *EEVEE_view_layer_data_get(void);
789 EEVEE_ViewLayerData *EEVEE_view_layer_data_ensure(void);
790 EEVEE_ObjectEngineData *EEVEE_object_data_get(Object *ob);
791 EEVEE_ObjectEngineData *EEVEE_object_data_ensure(Object *ob);
792 EEVEE_LightProbeEngineData *EEVEE_lightprobe_data_get(Object *ob);
793 EEVEE_LightProbeEngineData *EEVEE_lightprobe_data_ensure(Object *ob);
794 EEVEE_LampEngineData *EEVEE_lamp_data_get(Object *ob);
795 EEVEE_LampEngineData *EEVEE_lamp_data_ensure(Object *ob);
796
797 /* eevee_materials.c */
798 struct GPUTexture *EEVEE_materials_get_util_tex(void); /* XXX */
799 void EEVEE_materials_init(EEVEE_ViewLayerData *sldata, EEVEE_StorageList *stl, EEVEE_FramebufferList *fbl);
800 void EEVEE_materials_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
801 void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_ViewLayerData *sldata, Object *ob, bool *cast_shadow);
802 void EEVEE_materials_cache_finish(EEVEE_Data *vedata);
803 struct GPUMaterial *EEVEE_material_world_lightprobe_get(struct Scene *scene, struct World *wo);
804 struct GPUMaterial *EEVEE_material_world_background_get(struct Scene *scene, struct World *wo);
805 struct GPUMaterial *EEVEE_material_world_volume_get(struct Scene *scene, struct World *wo);
806 struct GPUMaterial *EEVEE_material_mesh_get(
807         struct Scene *scene, Material *ma, EEVEE_Data *vedata,
808         bool use_blend, bool use_multiply, bool use_refract, bool use_sss, bool use_translucency, int shadow_method);
809 struct GPUMaterial *EEVEE_material_mesh_volume_get(struct Scene *scene, Material *ma);
810 struct GPUMaterial *EEVEE_material_mesh_depth_get(struct Scene *scene, Material *ma, bool use_hashed_alpha, bool is_shadow);
811 struct GPUMaterial *EEVEE_material_hair_get(struct Scene *scene, Material *ma, int shadow_method);
812 void EEVEE_materials_free(void);
813 void EEVEE_draw_default_passes(EEVEE_PassList *psl);
814 void EEVEE_update_noise(EEVEE_PassList *psl, EEVEE_FramebufferList *fbl, const double offsets[3]);
815
816 /* eevee_lights.c */
817 void EEVEE_lights_init(EEVEE_ViewLayerData *sldata);
818 void EEVEE_lights_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
819 void EEVEE_lights_cache_add(EEVEE_ViewLayerData *sldata, struct Object *ob);
820 void EEVEE_lights_cache_shcaster_add(
821         EEVEE_ViewLayerData *sldata, EEVEE_StorageList *stl, struct Gwn_Batch *geom, Object *ob);
822 void EEVEE_lights_cache_shcaster_material_add(
823         EEVEE_ViewLayerData *sldata, EEVEE_PassList *psl,
824         struct GPUMaterial *gpumat, struct Gwn_Batch *geom, struct Object *ob,
825         float *alpha_threshold);
826 void EEVEE_lights_cache_shcaster_object_add(EEVEE_ViewLayerData *sldata, struct Object *ob);
827 void EEVEE_lights_cache_finish(EEVEE_ViewLayerData *sldata);
828 void EEVEE_lights_update(EEVEE_ViewLayerData *sldata);
829 void EEVEE_draw_shadows(EEVEE_ViewLayerData *sldata, EEVEE_PassList *psl);
830 void EEVEE_lights_free(void);
831
832 /* eevee_lightprobes.c */
833 bool EEVEE_lightprobes_obj_visibility_cb(bool vis_in, void *user_data);
834 bool EEVEE_lightprobes_all_probes_ready(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
835 void EEVEE_lightprobes_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
836 void EEVEE_lightprobes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
837 void EEVEE_lightprobes_cache_add(EEVEE_ViewLayerData *sldata, Object *ob);
838 void EEVEE_lightprobes_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
839 void EEVEE_lightprobes_refresh(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
840 void EEVEE_lightprobes_refresh_planar(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
841 void EEVEE_lightprobes_free(void);
842
843 /* eevee_depth_of_field.c */
844 int EEVEE_depth_of_field_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Object *camera);
845 void EEVEE_depth_of_field_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
846 void EEVEE_depth_of_field_draw(EEVEE_Data *vedata);
847 void EEVEE_depth_of_field_free(void);
848
849 /* eevee_bloom.c */
850 int EEVEE_bloom_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
851 void EEVEE_bloom_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
852 void EEVEE_bloom_draw(EEVEE_Data *vedata);
853 void EEVEE_bloom_free(void);
854
855 /* eevee_occlusion.c */
856 int EEVEE_occlusion_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
857 void EEVEE_occlusion_output_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
858 void EEVEE_occlusion_output_accumulate(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
859 void EEVEE_occlusion_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
860 void EEVEE_occlusion_compute(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, struct GPUTexture *depth_src, int layer);
861 void EEVEE_occlusion_draw_debug(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
862 void EEVEE_occlusion_free(void);
863
864 /* eevee_screen_raytrace.c */
865 int EEVEE_screen_raytrace_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
866 void EEVEE_screen_raytrace_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
867 void EEVEE_refraction_compute(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
868 void EEVEE_reflection_compute(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
869 void EEVEE_screen_raytrace_free(void);
870
871 /* eevee_subsurface.c */
872 int EEVEE_subsurface_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
873 void EEVEE_subsurface_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
874 void EEVEE_subsurface_output_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
875 void EEVEE_subsurface_add_pass(
876         EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, uint sss_id, struct GPUUniformBuffer *sss_profile);
877 void EEVEE_subsurface_data_render(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
878 void EEVEE_subsurface_compute(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
879 void EEVEE_subsurface_output_accumulate(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
880 void EEVEE_subsurface_free(void);
881
882 /* eevee_motion_blur.c */
883 int EEVEE_motion_blur_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Object *camera);
884 void EEVEE_motion_blur_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
885 void EEVEE_motion_blur_draw(EEVEE_Data *vedata);
886 void EEVEE_motion_blur_free(void);
887
888 /* eevee_mist.c */
889 void EEVEE_mist_output_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
890 void EEVEE_mist_output_accumulate(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);;
891 void EEVEE_mist_free(void);
892
893 /* eevee_temporal_sampling.c */
894 int EEVEE_temporal_sampling_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
895 void EEVEE_temporal_sampling_matrices_calc(
896         EEVEE_EffectsInfo *effects, float viewmat[4][4], float persmat[4][4], const double ht_point[2]);
897 void EEVEE_temporal_sampling_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
898 void EEVEE_temporal_sampling_draw(EEVEE_Data *vedata);
899 void EEVEE_temporal_sampling_free(void);
900
901 /* eevee_volumes.c */
902 int EEVEE_volumes_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
903 void EEVEE_volumes_set_jitter(EEVEE_ViewLayerData *sldata, uint current_sample);
904 void EEVEE_volumes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
905 void EEVEE_volumes_cache_object_add(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, struct Scene *scene, Object *ob);
906 void EEVEE_volumes_compute(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
907 void EEVEE_volumes_resolve(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
908 void EEVEE_volumes_free_smoke_textures(void);
909 void EEVEE_volumes_free(void);
910
911 /* eevee_effects.c */
912 void EEVEE_effects_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Object *camera);
913 void EEVEE_effects_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
914 void EEVEE_create_minmax_buffer(EEVEE_Data *vedata, struct GPUTexture *depth_src, int layer);
915 void EEVEE_downsample_buffer(EEVEE_Data *vedata, struct GPUTexture *texture_src, int level);
916 void EEVEE_downsample_cube_buffer(EEVEE_Data *vedata, struct GPUTexture *texture_src, int level);
917 void EEVEE_effects_do_gtao(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
918 void EEVEE_draw_effects(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
919 void EEVEE_effects_free(void);
920
921 /* eevee_render.c */
922 void EEVEE_render_init(EEVEE_Data *vedata, struct RenderEngine *engine, struct Depsgraph *depsgraph);
923 void EEVEE_render_cache(void *vedata, struct Object *ob, struct RenderEngine *engine, struct Depsgraph *depsgraph);
924 void EEVEE_render_draw(EEVEE_Data *vedata, struct RenderEngine *engine, struct RenderLayer *render_layer, const struct rcti *rect);
925 void EEVEE_render_update_passes(struct RenderEngine *engine, struct Scene *scene, struct ViewLayer *view_layer);
926
927 /* Shadow Matrix */
928 static const float texcomat[4][4] = { /* From NDC to TexCo */
929         {0.5f, 0.0f, 0.0f, 0.0f},
930         {0.0f, 0.5f, 0.0f, 0.0f},
931         {0.0f, 0.0f, 0.5f, 0.0f},
932         {0.5f, 0.5f, 0.5f, 1.0f}
933 };
934
935 /* Cubemap Matrices */
936 static const float cubefacemat[6][4][4] = {
937         /* Pos X */
938         {{0.0f, 0.0f, -1.0f, 0.0f},
939          {0.0f, -1.0f, 0.0f, 0.0f},
940          {-1.0f, 0.0f, 0.0f, 0.0f},
941          {0.0f, 0.0f, 0.0f, 1.0f}},
942         /* Neg X */
943         {{0.0f, 0.0f, 1.0f, 0.0f},
944          {0.0f, -1.0f, 0.0f, 0.0f},
945          {1.0f, 0.0f, 0.0f, 0.0f},
946          {0.0f, 0.0f, 0.0f, 1.0f}},
947         /* Pos Y */
948         {{1.0f, 0.0f, 0.0f, 0.0f},
949          {0.0f, 0.0f, -1.0f, 0.0f},
950          {0.0f, 1.0f, 0.0f, 0.0f},
951          {0.0f, 0.0f, 0.0f, 1.0f}},
952         /* Neg Y */
953         {{1.0f, 0.0f, 0.0f, 0.0f},
954          {0.0f, 0.0f, 1.0f, 0.0f},
955          {0.0f, -1.0f, 0.0f, 0.0f},
956          {0.0f, 0.0f, 0.0f, 1.0f}},
957         /* Pos Z */
958         {{1.0f, 0.0f, 0.0f, 0.0f},
959          {0.0f, -1.0f, 0.0f, 0.0f},
960          {0.0f, 0.0f, -1.0f, 0.0f},
961          {0.0f, 0.0f, 0.0f, 1.0f}},
962         /* Neg Z */
963         {{-1.0f, 0.0f, 0.0f, 0.0f},
964          {0.0f, -1.0f, 0.0f, 0.0f},
965          {0.0f, 0.0f, 1.0f, 0.0f},
966          {0.0f, 0.0f, 0.0f, 1.0f}},
967 };
968
969 #endif /* __EEVEE_PRIVATE_H__ */