41 #if defined(IRRADIANCE_SH_L2)
42 # define IRRADIANCE_SAMPLE_SIZE_X 4
43 # define IRRADIANCE_SAMPLE_SIZE_Y 4
44 #elif defined(IRRADIANCE_HL2)
45 # define IRRADIANCE_SAMPLE_SIZE_X 4
46 # define IRRADIANCE_SAMPLE_SIZE_Y 2
49 #ifdef IRRADIANCE_SH_L2
51 # define IRRADIANCE_FORMAT GPU_RGBA16F
53 # define IRRADIANCE_FORMAT GPU_RGBA8
57 #define IRRADIANCE_MAX_POOL_LAYER 256
58 #define IRRADIANCE_MAX_POOL_SIZE 1024
59 #define MAX_IRRADIANCE_SAMPLES \
60 (IRRADIANCE_MAX_POOL_SIZE / IRRADIANCE_SAMPLE_SIZE_X) * \
61 (IRRADIANCE_MAX_POOL_SIZE / IRRADIANCE_SAMPLE_SIZE_Y)
177 for (
int mip = 0; mip < lcache->
mips_len; mip++) {
186 switch (lcache->
type) {
211 int total_irr_samples = 0;
213 for (
int i = 1; i < lcache->
grid_len; i++) {
217 return total_irr_samples;
224 if (lcache !=
NULL) {
227 TIP_(
"Incompatible Light cache version, please bake again"),
234 TIP_(
"Error: Light cache is too big for the GPU to be loaded"),
241 TIP_(
"Error: Light cache dimensions not supported by the GPU"),
254 TIP_(
"Error: LightCache is too large and will not be saved to disk"),
259 char formatted_mem[15];
266 TIP_(
"%d Ref. Cubemaps, %d Irr. Samples (%s in memory)"),
273 TIP_(
"No light cache in this scene"),
287 int texel_count = (int)
ceilf((
float)total_samples / (
float)(layer_count - 1));
288 r_size[0] = visibility_size *
290 r_size[1] = visibility_size *
292 r_size[2] = layer_count;
299 const int irr_size[3])
301 if (light_cache ==
NULL) {
316 (cube_len == light_cache->
cube_len) && (mip_len == light_cache->
mips_len)) {
328 const int irr_size[3])
361 light_cache->
vis_res = vis_size;
362 light_cache->
ref_res = cube_size;
365 "LightCacheTexture");
374 for (
int mip = 0; mip < light_cache->
mips_len; mip++) {
431 for (
int mip = 0; mip <= lcache->
mips_len; mip++) {
442 if (lcache ==
NULL) {
454 switch (lcache->
type) {
477 for (
int mip = 0; mip < lcache->
mips_len; mip++) {
496 for (
int i = 0; i < lcache->
mips_len; i++) {
510 size_t data_size =
tex->components *
tex->tex_size[0] *
tex->tex_size[1] *
tex->tex_size[2];
512 data_size *=
sizeof(
float);
515 data_size *=
sizeof(
uint);
520 if (data_size < INT_MAX) {
533 for (
int i = 0; i < cache->
mips_len; i++) {
574 for (
int i = 0; i < cache->
mips_len; i++) {
667 for (
int i = 0; i < 6; i++) {
668 GPU_framebuffer_ensure_config(&lbake->
rt_fb[i],
669 {GPU_ATTACHMENT_TEXTURE_CUBEFACE(lbake->rt_depth, i),
670 GPU_ATTACHMENT_TEXTURE_CUBEFACE(lbake->rt_color, i)});
673 GPU_framebuffer_ensure_config(&lbake->
store_fb, {GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_NONE});
762 lbake->
bmain = bmain;
766 lbake->
delay = delay;
767 lbake->
frame = frame;
775 *old_lbake->
stop = 1;
781 lbake->
delay = delay;
806 lbake->
bmain = bmain;
811 lbake->
frame = frame;
861 GPU_FRAMEBUFFER_FREE_SAFE(lbake->
store_fb);
862 for (
int i = 0; i < 6; i++) {
863 GPU_FRAMEBUFFER_FREE_SAFE(lbake->
rt_fb[i]);
912 float winmat[4][4], viewmat[4][4];
923 const int viewport_size[2] = {
1025 GPU_framebuffer_clear_color(lbake->
store_fb, ((
float[4]){1.0f, 1.0f, 1.0f, 1.0f}));
1044 r_local_cell[2] = cell_idx % egrid->
resolution[2];
1053 int r_local_cell[3],
1060 int max_lvl = (int)
floorf(log2f(
1063 int visited_cells = 0;
1066 r_local_cell[0] = r_local_cell[1] = r_local_cell[2] = 0;
1067 for (
int lvl = max_lvl; lvl >= 0; lvl--) {
1068 *r_stride = 1 << lvl;
1069 int prev_stride = *r_stride << 1;
1070 for (
int i = 0; i < cell_count; i++) {
1073 if (((r_local_cell[0] % *r_stride) == 0) && ((r_local_cell[1] % *r_stride) == 0) &&
1074 ((r_local_cell[2] % *r_stride) == 0)) {
1075 if (!(((r_local_cell[0] % prev_stride) == 0) && ((r_local_cell[1] % prev_stride) == 0) &&
1076 ((r_local_cell[2] % prev_stride) == 0)) ||
1077 ((i == 0) && (lvl == max_lvl))) {
1078 if (visited_cells == cell_idx) {
1109 int grid_loc[3], sample_id, sample_offset,
stride;
1126 sample_offset = egrid->
offset + sample_id;
1165 if (is_last_bounce_sample) {
1173 if (is_last_bounce_sample) {
1243 return (vol_a < vol_b);
1250 return (vol_a < vol_b);
1253 #define SORT_PROBE(elems_type, prbs, elems, elems_len, comp_fn) \
1255 bool sorted = false; \
1258 for (int i = 0; i < (elems_len)-1; i++) { \
1259 if ((comp_fn)((elems) + i, (elems) + i + 1)) { \
1260 SWAP(elems_type, (elems)[i], (elems)[i + 1]); \
1261 SWAP(LightProbe *, (prbs)[i], (prbs)[i + 1]); \
1278 int total_irr_samples = 1;
1340 void (*render_callback)(
void *ved,
void *
user_data))
1342 if (
G.is_break ==
true || *lbake->
stop) {
typedef float(TangentPoint)[2]
General operations, lookup, etc. for blender objects.
int BKE_object_visibility(const struct Object *ob, int dag_eval_mode)
void BLI_endian_switch_float_array(float *val, int size) ATTR_NONNULL(1)
void BLI_endian_switch_uint32_array(unsigned int *val, int size) ATTR_NONNULL(1)
MINLINE int min_ii(int a, int b)
MINLINE int max_ii(int a, int b)
MINLINE unsigned int log2_floor_u(unsigned int x)
void unit_m4(float m[4][4])
float mat4_to_scale(const float M[4][4])
MINLINE void madd_v3_v3fl(float r[3], const float a[3], float f)
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void zero_v3_int(int r[3])
MINLINE void negate_v3(float r[3])
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t maxncpy) ATTR_NONNULL()
size_t BLI_snprintf(char *__restrict dst, size_t maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
void BLI_str_format_byte_unit(char dst[15], long long int bytes, bool base_10) ATTR_NONNULL()
void BLI_mutex_free(ThreadMutex *mutex)
ThreadMutex * BLI_mutex_alloc(void)
int BLI_thread_is_main(void)
void BLI_mutex_lock(ThreadMutex *mutex)
void BLI_mutex_unlock(ThreadMutex *mutex)
pthread_mutex_t ThreadMutex
#define BLO_read_data_address(reader, ptr_p)
#define BLO_write_struct_array(writer, struct_name, array_size, data_ptr)
bool BLO_read_requires_endian_switch(BlendDataReader *reader)
void BLO_write_raw(BlendWriter *writer, size_t size_in_bytes, const void *data_ptr)
Depsgraph * DEG_graph_new(struct Main *bmain, struct Scene *scene, struct ViewLayer *view_layer, eEvaluationMode mode)
struct Depsgraph Depsgraph
void DEG_graph_free(Depsgraph *graph)
void DEG_evaluate_on_framechange(Depsgraph *graph, float frame)
void DEG_id_tag_update(struct ID *id, int flag)
void DEG_graph_relations_update(struct Depsgraph *graph)
#define DEG_OBJECT_ITER_FOR_RENDER_ENGINE_BEGIN(graph_, instance_)
struct ViewLayer * DEG_get_evaluated_view_layer(const struct Depsgraph *graph)
#define DEG_OBJECT_ITER_FOR_RENDER_ENGINE_END
struct Scene * DEG_get_evaluated_scene(const struct Depsgraph *graph)
@ ID_RECALC_COPY_ON_WRITE
Object groups, one object can be in many groups at once.
@ LIGHTCACHE_UPDATE_WORLD
#define LIGHTCACHE_STATIC_VERSION
@ LIGHTPROBE_FLAG_INVERT_GROUP
@ SCE_EEVEE_SHADOW_HIGH_BITDEPTH
#define DRW_TEXTURE_FREE_SAFE(tex)
int GPU_max_texture_layers(void)
bool GPU_use_main_context_workaround(void)
void GPU_context_main_lock(void)
void GPU_context_discard(GPUContext *)
GPUContext * GPU_context_create(void *ghost_window)
void GPU_context_main_unlock(void)
struct GPUFrameBuffer GPUFrameBuffer
void GPU_framebuffer_bind(GPUFrameBuffer *fb)
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei stride
GPUTexture * GPU_texture_create_2d_array(const char *name, int w, int h, int d, int mip_len, eGPUTextureFormat format, const float *data)
void GPU_texture_update_mipmap(GPUTexture *tex, int miplvl, eGPUDataFormat gpu_data_format, const void *pixels)
int GPU_texture_height(const GPUTexture *tex)
struct GPUTexture GPUTexture
void GPU_texture_mipmap_mode(GPUTexture *tex, bool use_mipmap, bool use_filter)
int GPU_texture_width(const GPUTexture *tex)
void * GPU_texture_read(GPUTexture *tex, eGPUDataFormat data_format, int miplvl)
void GPU_texture_get_mipmap_size(GPUTexture *tex, int lvl, int *size)
void GPU_texture_update(GPUTexture *tex, eGPUDataFormat data_format, const void *data)
void GPU_texture_filter_mode(GPUTexture *tex, bool use_filter)
GPUTexture * GPU_texture_create_cube_array(const char *name, int w, int d, int mip_len, eGPUTextureFormat format, const float *data)
Platform independent time functions.
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
const Depsgraph * depsgraph
void DRW_curves_update(void)
void DRW_render_viewport_size_set(const int size[2])
void DRW_render_instance_buffer_finish(void)
void DRW_custom_pipeline(DrawEngineType *draw_engine_type, struct Depsgraph *depsgraph, void(*callback)(void *vedata, void *user_data), void *user_data)
void DRW_render_object_iter(void *vedata, RenderEngine *engine, struct Depsgraph *depsgraph, void(*callback)(void *vedata, Object *ob, RenderEngine *engine, struct Depsgraph *depsgraph))
const DRWView * DRW_view_default_get(void)
DRWView * DRW_view_create(const float viewmat[4][4], const float winmat[4][4], const float(*culling_viewmat)[4], const float(*culling_winmat)[4], DRWCallVisibilityFn *visibility_fn)
void DRW_view_default_set(const DRWView *view)
void DRW_draw_pass(DRWPass *pass)
void DRW_view_set_active(const DRWView *view)
GPUTexture * DRW_texture_create_cube_array(int w, int d, eGPUTextureFormat format, DRWTextureFlag flags, const float *fpixels)
GPUTexture * DRW_texture_create_cube(int w, eGPUTextureFormat format, DRWTextureFlag flags, const float *fpixels)
GPUTexture * DRW_texture_create_2d_array(int w, int h, int d, eGPUTextureFormat format, DRWTextureFlag flags, const float *fpixels)
EEVEE_ViewLayerData * EEVEE_view_layer_data_ensure(void)
void EEVEE_view_layer_data_free(void *storage)
void EEVEE_effects_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
void EEVEE_effects_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Object *camera, const bool minimal)
void EEVEE_effects_draw_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata)
DrawEngineType draw_engine_eevee_type
depth_tx normal_tx diffuse_light_tx specular_light_tx volume_light_tx environment_tx ambient_occlusion_tx aov_value_tx in_weight_img GPU_RGBA16F
void * EEVEE_lightbake_job_data_alloc(struct Main *bmain, struct ViewLayer *view_layer, struct Scene *scene, bool run_as_job, int frame)
static void eevee_lightbake_create_resources(EEVEE_LightBake *lbake)
#define IRRADIANCE_MAX_POOL_LAYER
static void eevee_lightbake_create_render_target(EEVEE_LightBake *lbake, int rt_res)
#define IRRADIANCE_SAMPLE_SIZE_X
void DRW_gpu_render_context_enable(void *re_gpu_context)
static float eevee_lightbake_grid_influence_volume(EEVEE_LightGrid *grid)
static void eevee_lightbake_readback_reflections(LightCache *lcache)
static void eevee_lightbake_render_world_sample(void *ved, void *user_data)
void DRW_opengl_context_enable(void)
static bool eevee_lightbake_cube_comp(EEVEE_LightProbe *prb_a, EEVEE_LightProbe *prb_b)
LightCache * EEVEE_lightcache_create(const int grid_len, const int cube_len, const int cube_size, const int vis_size, const int irr_size[3])
bool EEVEE_lightcache_load(LightCache *lcache)
static void eevee_lightbake_readback_irradiance(LightCache *lcache)
static bool lightbake_do_sample(EEVEE_LightBake *lbake, void(*render_callback)(void *ved, void *user_data))
static bool eevee_lightcache_static_load(LightCache *lcache)
static void eevee_lightbake_context_disable(EEVEE_LightBake *lbake)
static void compute_cell_id(EEVEE_LightGrid *egrid, LightProbe *probe, int cell_idx, int *r_final_idx, int r_local_cell[3], int *r_stride)
static void eevee_lightbake_copy_irradiance(EEVEE_LightBake *lbake, LightCache *lcache)
void EEVEE_lightbake_job(void *custom_data, short *stop, short *do_update, float *progress)
void DRW_opengl_render_context_disable(void *re_gl_context)
void EEVEE_lightcache_blend_read_data(BlendDataReader *reader, LightCache *cache)
#define IRRADIANCE_SAMPLE_SIZE_Y
void DRW_gpu_render_context_disable(void *re_gpu_context)
static void eevee_lightbake_cache_create(EEVEE_Data *vedata, EEVEE_LightBake *lbake)
void EEVEE_lightcache_blend_write(BlendWriter *writer, LightCache *cache)
static bool eevee_lightcache_can_be_saved(LightCache *lcache)
static uint eevee_lightcache_memsize_get(LightCache *lcache)
static void eevee_lightbake_render_grid_sample(void *ved, void *user_data)
wmJob * EEVEE_lightbake_job_create(struct wmWindowManager *wm, struct wmWindow *win, struct Main *bmain, struct ViewLayer *view_layer, struct Scene *scene, int delay, int frame)
#define IRRADIANCE_MAX_POOL_SIZE
static bool EEVEE_lightcache_validate(const LightCache *light_cache, const int cube_len, const int cube_res, const int grid_len, const int irr_size[3])
#define IRRADIANCE_FORMAT
static void eevee_lightbake_context_enable(EEVEE_LightBake *lbake)
static bool eevee_lightbake_grid_comp(EEVEE_LightGrid *grid_a, EEVEE_LightGrid *grid_b)
static void direct_link_lightcache_texture(BlendDataReader *reader, LightCacheTexture *lctex)
void DRW_opengl_render_context_enable(void *re_gl_context)
static void cell_id_to_grid_loc(EEVEE_LightGrid *egrid, int cell_idx, int r_local_cell[3])
void EEVEE_lightbake_job_data_free(void *custom_data)
static bool eevee_lightcache_version_check(const LightCache *lcache)
struct EEVEE_LightBake EEVEE_LightBake
static void eevee_lightbake_count_probes(EEVEE_LightBake *lbake)
static void eevee_lightbake_gather_probes(EEVEE_LightBake *lbake)
static void grid_loc_to_world_loc(EEVEE_LightGrid *egrid, const int local_cell[3], float r_pos[3])
static void eevee_lightbake_delete_resources(EEVEE_LightBake *lbake)
void DRW_opengl_context_disable(void)
static int eevee_lightcache_irradiance_sample_count(LightCache *lcache)
void EEVEE_lightcache_free(LightCache *lcache)
void EEVEE_lightcache_info_update(SceneEEVEE *eevee)
static float eevee_lightbake_cube_influence_volume(EEVEE_LightProbe *eprb)
static void irradiance_pool_size_get(int visibility_size, int total_samples, int r_size[3])
void EEVEE_lightbake_update(void *custom_data)
static void eevee_lightbake_render_probe_sample(void *ved, void *user_data)
void EEVEE_lightbake_update_world_quick(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, const Scene *scene)
#define SORT_PROBE(elems_type, prbs, elems, elems_len, comp_fn)
static void write_lightcache_texture(BlendWriter *writer, LightCacheTexture *tex)
void EEVEE_lightprobes_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
void EEVEE_lightbake_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, GPUTexture *rt_color, GPUTexture *rt_depth)
void EEVEE_lightprobes_cube_data_from_object(Object *ob, EEVEE_LightProbe *eprobe)
void EEVEE_lightbake_render_world(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata, struct GPUFrameBuffer *face_fb[6])
void EEVEE_lightprobes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
void EEVEE_lightprobes_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
void EEVEE_lightprobes_grid_data_from_object(Object *ob, EEVEE_LightGrid *egrid, int *offset)
void EEVEE_lightbake_render_scene(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, struct GPUFrameBuffer *face_fb[6], const float pos[3], float near_clip, float far_clip)
void EEVEE_lightbake_filter_diffuse(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, struct GPUTexture *rt_color, struct GPUFrameBuffer *fb, int grid_offset, float intensity)
void EEVEE_lightbake_filter_visibility(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, struct GPUTexture *UNUSED(rt_depth), struct GPUFrameBuffer *fb, int grid_offset, float clipsta, float clipend, float vis_range, float vis_blur, int vis_size)
void EEVEE_lightbake_filter_glossy(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, struct GPUTexture *rt_color, struct GPUFrameBuffer *fb, int probe_idx, float intensity, int maxlevel, float filter_quality, float firefly_fac)
void EEVEE_lights_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
void EEVEE_lights_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
void EEVEE_materials_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
void EEVEE_materials_cache_finish(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata)
void EEVEE_materials_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, EEVEE_StorageList *stl, EEVEE_FramebufferList *fbl)
void EEVEE_volumes_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
void EEVEE_shadows_update(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
#define MIN_CUBE_LOD_LEVEL
void EEVEE_volumes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
void EEVEE_render_cache(void *vedata, struct Object *ob, struct RenderEngine *engine, struct Depsgraph *depsgraph)
void EEVEE_subsurface_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
#define EEVEE_RAY_DIFFUSE
void EEVEE_shadows_init(EEVEE_ViewLayerData *sldata)
void EEVEE_subsurface_draw_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
void EEVEE_volumes_draw_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
void GPU_framebuffer_texture_attach(GPUFrameBuffer *fb, GPUTexture *tex, int slot, int mip)
void(* MEM_freeN)(void *vmemh)
size_t(* MEM_allocN_len)(const void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
T clamp(const T &a, const T &min, const T &max)
EEVEE_FramebufferList * fbl
EEVEE_EffectsFlag enabled_effects
ViewLayer * view_layer_input
struct GPUTexture * dummy_color
GPUFrameBuffer * rt_fb[6]
struct GPUTexture * dummy_depth
GPUFrameBuffer * store_fb
EEVEE_ViewLayerData * sldata
struct GPUTexture * dummy_layer_color
struct Collection * collection
EEVEE_LightProbeVisTest vis_data
struct DRWPass * probe_grid_fill
struct LightCache * light_cache
struct EEVEE_PrivateData * g_data
struct EEVEE_EffectsInfo * effects
struct GPUTexture * color
struct EEVEE_CommonUniformBuffer common_data
struct GPUUniformBuf * common_ubo
struct EEVEE_LightProbesInfo * probes
LightGridCache * grid_data
LightProbeCache * cube_data
LightCacheTexture grid_tx
LightCacheTexture * cube_mips
LightCacheTexture cube_tx
float attenuationmat[4][4]
struct Collection * visibility_grp
float gi_irradiance_smoothing
struct LightCache * light_cache_data
int gi_visibility_resolution
char light_cache_info[64]
int gi_cubemap_resolution
void PIL_sleep_ms(int ms)
void WM_jobs_callbacks(wmJob *wm_job, wm_jobs_start_callback startjob, void(*initjob)(void *), void(*update)(void *), void(*endjob)(void *))
void * WM_jobs_customdata_get(wmJob *wm_job)
bool WM_jobs_test(const wmWindowManager *wm, const void *owner, int job_type)
void WM_jobs_customdata_set(wmJob *wm_job, void *customdata, void(*free)(void *))
void WM_jobs_timer(wmJob *wm_job, double timestep, unsigned int note, unsigned int endnote)
wmJob * WM_jobs_get(wmWindowManager *wm, wmWindow *win, const void *owner, const char *name, int flag, int job_type)
void * WM_opengl_context_create(void)
void wm_window_reset_drawable(void)
void WM_opengl_context_dispose(void *context)