Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/engines/eevee/eevee_lightprobes.c
| Show First 20 Lines • Show All 120 Lines • ▼ Show 20 Lines | static void planar_pool_ensure_alloc(EEVEE_Data *vedata, int num_planar_ref) | ||||
| * only alloc them once using the biggest viewport resolution. */ | * only alloc them once using the biggest viewport resolution. */ | ||||
| EEVEE_FramebufferList *fbl = vedata->fbl; | EEVEE_FramebufferList *fbl = vedata->fbl; | ||||
| EEVEE_TextureList *txl = vedata->txl; | EEVEE_TextureList *txl = vedata->txl; | ||||
| const float *viewport_size = DRW_viewport_size_get(); | const float *viewport_size = DRW_viewport_size_get(); | ||||
| /* TODO get screen percentage from layer setting */ | /* TODO get screen percentage from layer setting */ | ||||
| // const DRWContextState *draw_ctx = DRW_context_state_get(); | // const DRWContextState *draw_ctx = DRW_context_state_get(); | ||||
| // SceneLayer *scene_layer = draw_ctx->scene_layer; | // ViewLayer *view_layer = draw_ctx->view_layer; | ||||
| float screen_percentage = 1.0f; | float screen_percentage = 1.0f; | ||||
| int width = (int)(viewport_size[0] * screen_percentage); | int width = (int)(viewport_size[0] * screen_percentage); | ||||
| int height = (int)(viewport_size[1] * screen_percentage); | int height = (int)(viewport_size[1] * screen_percentage); | ||||
| /* We need an Array texture so allocate it ourself */ | /* We need an Array texture so allocate it ourself */ | ||||
| if (!txl->planar_pool) { | if (!txl->planar_pool) { | ||||
| if (num_planar_ref > 0) { | if (num_planar_ref > 0) { | ||||
| Show All 14 Lines | if (num_planar_ref > 0) { | ||||
| * DRW_framebuffer_init binds the whole texture making the framebuffer invalid. | * DRW_framebuffer_init binds the whole texture making the framebuffer invalid. | ||||
| * To overcome this, we bind the planar pool ourselves later */ | * To overcome this, we bind the planar pool ourselves later */ | ||||
| /* XXX Do this one first so it gets it's mipmap done. */ | /* XXX Do this one first so it gets it's mipmap done. */ | ||||
| DRW_framebuffer_init(&fbl->planarref_fb, &draw_engine_eevee_type, 1, 1, NULL, 0); | DRW_framebuffer_init(&fbl->planarref_fb, &draw_engine_eevee_type, 1, 1, NULL, 0); | ||||
| } | } | ||||
| } | } | ||||
| void EEVEE_lightprobes_init(EEVEE_SceneLayerData *sldata, EEVEE_Data *UNUSED(vedata)) | void EEVEE_lightprobes_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *UNUSED(vedata)) | ||||
| { | { | ||||
| const DRWContextState *draw_ctx = DRW_context_state_get(); | const DRWContextState *draw_ctx = DRW_context_state_get(); | ||||
| SceneLayer *scene_layer = draw_ctx->scene_layer; | ViewLayer *view_layer = draw_ctx->view_layer; | ||||
| IDProperty *props = BKE_scene_layer_engine_evaluated_get(scene_layer, COLLECTION_MODE_NONE, RE_engine_id_BLENDER_EEVEE); | IDProperty *props = BKE_view_layer_engine_evaluated_get(view_layer, COLLECTION_MODE_NONE, RE_engine_id_BLENDER_EEVEE); | ||||
| /* Shaders */ | /* Shaders */ | ||||
| if (!e_data.probe_filter_glossy_sh) { | if (!e_data.probe_filter_glossy_sh) { | ||||
| char *shader_str = NULL; | char *shader_str = NULL; | ||||
| DynStr *ds_frag = BLI_dynstr_new(); | DynStr *ds_frag = BLI_dynstr_new(); | ||||
| BLI_dynstr_append(ds_frag, datatoc_bsdf_common_lib_glsl); | BLI_dynstr_append(ds_frag, datatoc_bsdf_common_lib_glsl); | ||||
| BLI_dynstr_append(ds_frag, datatoc_bsdf_sampling_lib_glsl); | BLI_dynstr_append(ds_frag, datatoc_bsdf_sampling_lib_glsl); | ||||
| ▲ Show 20 Lines • Show All 155 Lines • ▼ Show 20 Lines | #endif | ||||
| if (!e_data.depth_placeholder) { | if (!e_data.depth_placeholder) { | ||||
| e_data.depth_placeholder = DRW_texture_create_2D(1, 1, DRW_TEX_DEPTH_24, 0, NULL); | e_data.depth_placeholder = DRW_texture_create_2D(1, 1, DRW_TEX_DEPTH_24, 0, NULL); | ||||
| } | } | ||||
| if (!e_data.depth_array_placeholder) { | if (!e_data.depth_array_placeholder) { | ||||
| e_data.depth_array_placeholder = DRW_texture_create_2D_array(1, 1, 1, DRW_TEX_DEPTH_24, 0, NULL); | e_data.depth_array_placeholder = DRW_texture_create_2D_array(1, 1, 1, DRW_TEX_DEPTH_24, 0, NULL); | ||||
| } | } | ||||
| } | } | ||||
| void EEVEE_lightprobes_cache_init(EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata) | void EEVEE_lightprobes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) | ||||
| { | { | ||||
| EEVEE_TextureList *txl = vedata->txl; | EEVEE_TextureList *txl = vedata->txl; | ||||
| EEVEE_PassList *psl = vedata->psl; | EEVEE_PassList *psl = vedata->psl; | ||||
| EEVEE_StorageList *stl = vedata->stl; | EEVEE_StorageList *stl = vedata->stl; | ||||
| EEVEE_LightProbesInfo *pinfo = sldata->probes; | EEVEE_LightProbesInfo *pinfo = sldata->probes; | ||||
| pinfo->num_cube = 1; /* at least one for the world */ | pinfo->num_cube = 1; /* at least one for the world */ | ||||
| pinfo->num_grid = 1; | pinfo->num_grid = 1; | ||||
| ▲ Show 20 Lines • Show All 122 Lines • ▼ Show 20 Lines | #endif | ||||
| struct Gwn_Batch *geom = DRW_cache_fullscreen_quad_get(); | struct Gwn_Batch *geom = DRW_cache_fullscreen_quad_get(); | ||||
| DRWShadingGroup *grp = stl->g_data->planar_downsample = DRW_shgroup_instance_create(e_data.probe_planar_downsample_sh, psl->probe_planar_downsample_ps, geom); | DRWShadingGroup *grp = stl->g_data->planar_downsample = DRW_shgroup_instance_create(e_data.probe_planar_downsample_sh, psl->probe_planar_downsample_ps, geom); | ||||
| DRW_shgroup_uniform_buffer(grp, "source", &txl->planar_pool); | DRW_shgroup_uniform_buffer(grp, "source", &txl->planar_pool); | ||||
| DRW_shgroup_uniform_float(grp, "fireflyFactor", &stl->effects->ssr_firefly_fac, 1); | DRW_shgroup_uniform_float(grp, "fireflyFactor", &stl->effects->ssr_firefly_fac, 1); | ||||
| } | } | ||||
| } | } | ||||
| void EEVEE_lightprobes_cache_add(EEVEE_SceneLayerData *sldata, Object *ob) | void EEVEE_lightprobes_cache_add(EEVEE_ViewLayerData *sldata, Object *ob) | ||||
| { | { | ||||
| EEVEE_LightProbesInfo *pinfo = sldata->probes; | EEVEE_LightProbesInfo *pinfo = sldata->probes; | ||||
| LightProbe *probe = (LightProbe *)ob->data; | LightProbe *probe = (LightProbe *)ob->data; | ||||
| /* Step 1 find all lamps in the scene and setup them */ | /* Step 1 find all lamps in the scene and setup them */ | ||||
| if ((probe->type == LIGHTPROBE_TYPE_CUBE && pinfo->num_cube >= MAX_PROBE) || | if ((probe->type == LIGHTPROBE_TYPE_CUBE && pinfo->num_cube >= MAX_PROBE) || | ||||
| (probe->type == LIGHTPROBE_TYPE_GRID && pinfo->num_grid >= MAX_PROBE)) | (probe->type == LIGHTPROBE_TYPE_GRID && pinfo->num_grid >= MAX_PROBE)) | ||||
| { | { | ||||
| Show All 40 Lines | |||||
| /* TODO find a nice name to push it to math_matrix.c */ | /* TODO find a nice name to push it to math_matrix.c */ | ||||
| static void scale_m4_v3(float R[4][4], float v[3]) | static void scale_m4_v3(float R[4][4], float v[3]) | ||||
| { | { | ||||
| for (int i = 0; i < 4; ++i) | for (int i = 0; i < 4; ++i) | ||||
| mul_v3_v3(R[i], v); | mul_v3_v3(R[i], v); | ||||
| } | } | ||||
| static void EEVEE_planar_reflections_updates(EEVEE_SceneLayerData *sldata, EEVEE_StorageList *stl) | static void EEVEE_planar_reflections_updates(EEVEE_ViewLayerData *sldata, EEVEE_StorageList *stl) | ||||
| { | { | ||||
| EEVEE_LightProbesInfo *pinfo = sldata->probes; | EEVEE_LightProbesInfo *pinfo = sldata->probes; | ||||
| Object *ob; | Object *ob; | ||||
| float mtx[4][4], normat[4][4], imat[4][4], rangemat[4][4]; | float mtx[4][4], normat[4][4], imat[4][4], rangemat[4][4]; | ||||
| float viewmat[4][4], winmat[4][4]; | float viewmat[4][4], winmat[4][4]; | ||||
| DRW_viewport_matrix_get(viewmat, DRW_MAT_VIEW); | DRW_viewport_matrix_get(viewmat, DRW_MAT_VIEW); | ||||
| DRW_viewport_matrix_get(winmat, DRW_MAT_WIN); | DRW_viewport_matrix_get(winmat, DRW_MAT_WIN); | ||||
| ▲ Show 20 Lines • Show All 88 Lines • ▼ Show 20 Lines | if (BKE_object_is_visible(ob) && | ||||
| DRW_state_draw_support() && | DRW_state_draw_support() && | ||||
| (probe->flag & LIGHTPROBE_FLAG_SHOW_DATA)) | (probe->flag & LIGHTPROBE_FLAG_SHOW_DATA)) | ||||
| { | { | ||||
| DRW_shgroup_call_dynamic_add(stl->g_data->planar_display_shgrp, &ped->probe_id, ob->obmat); | DRW_shgroup_call_dynamic_add(stl->g_data->planar_display_shgrp, &ped->probe_id, ob->obmat); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| static void EEVEE_lightprobes_updates(EEVEE_SceneLayerData *sldata, EEVEE_PassList *psl, EEVEE_StorageList *stl) | static void EEVEE_lightprobes_updates(EEVEE_ViewLayerData *sldata, EEVEE_PassList *psl, EEVEE_StorageList *stl) | ||||
| { | { | ||||
| EEVEE_LightProbesInfo *pinfo = sldata->probes; | EEVEE_LightProbesInfo *pinfo = sldata->probes; | ||||
| Object *ob; | Object *ob; | ||||
| /* CUBE REFLECTION */ | /* CUBE REFLECTION */ | ||||
| for (int i = 1; (ob = pinfo->probes_cube_ref[i]) && (i < MAX_PROBE); i++) { | for (int i = 1; (ob = pinfo->probes_cube_ref[i]) && (i < MAX_PROBE); i++) { | ||||
| LightProbe *probe = (LightProbe *)ob->data; | LightProbe *probe = (LightProbe *)ob->data; | ||||
| EEVEE_LightProbe *eprobe = &pinfo->probe_data[i]; | EEVEE_LightProbe *eprobe = &pinfo->probe_data[i]; | ||||
| ▲ Show 20 Lines • Show All 110 Lines • ▼ Show 20 Lines | if (BKE_object_is_visible(ob) && | ||||
| DRW_shgroup_uniform_vec3(grp, "increment_y", egrid->increment_y, 1); | DRW_shgroup_uniform_vec3(grp, "increment_y", egrid->increment_y, 1); | ||||
| DRW_shgroup_uniform_vec3(grp, "increment_z", egrid->increment_z, 1); | DRW_shgroup_uniform_vec3(grp, "increment_z", egrid->increment_z, 1); | ||||
| DRW_shgroup_uniform_buffer(grp, "irradianceGrid", &sldata->irradiance_pool); | DRW_shgroup_uniform_buffer(grp, "irradianceGrid", &sldata->irradiance_pool); | ||||
| DRW_shgroup_uniform_float(grp, "sphere_size", &probe->data_draw_size, 1); | DRW_shgroup_uniform_float(grp, "sphere_size", &probe->data_draw_size, 1); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| void EEVEE_lightprobes_cache_finish(EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata) | void EEVEE_lightprobes_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) | ||||
| { | { | ||||
| EEVEE_StorageList *stl = vedata->stl; | EEVEE_StorageList *stl = vedata->stl; | ||||
| EEVEE_LightProbesInfo *pinfo = sldata->probes; | EEVEE_LightProbesInfo *pinfo = sldata->probes; | ||||
| Object *ob; | Object *ob; | ||||
| /* Setup enough layers. */ | /* Setup enough layers. */ | ||||
| /* Free textures if number mismatch. */ | /* Free textures if number mismatch. */ | ||||
| if (pinfo->num_cube != pinfo->cache_num_cube) { | if (pinfo->num_cube != pinfo->cache_num_cube) { | ||||
| ▲ Show 20 Lines • Show All 92 Lines • ▼ Show 20 Lines | for (int i = 0; i < level - 1; ++i) { | ||||
| min_ff(floorf(stl->g_data->texel_size[1]), 1.0f); | min_ff(floorf(stl->g_data->texel_size[1]), 1.0f); | ||||
| } | } | ||||
| invert_v2(stl->g_data->texel_size); | invert_v2(stl->g_data->texel_size); | ||||
| DRW_draw_pass(psl->probe_planar_downsample_ps); | DRW_draw_pass(psl->probe_planar_downsample_ps); | ||||
| } | } | ||||
| /* Glossy filter probe_rt to probe_pool at index probe_idx */ | /* Glossy filter probe_rt to probe_pool at index probe_idx */ | ||||
| static void glossy_filter_probe(EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata, EEVEE_PassList *psl, int probe_idx) | static void glossy_filter_probe(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, EEVEE_PassList *psl, int probe_idx) | ||||
| { | { | ||||
| EEVEE_LightProbesInfo *pinfo = sldata->probes; | EEVEE_LightProbesInfo *pinfo = sldata->probes; | ||||
| /* Max lod used from the render target probe */ | /* Max lod used from the render target probe */ | ||||
| pinfo->lod_rt_max = floorf(log2f(pinfo->target_size)) - 2.0f; | pinfo->lod_rt_max = floorf(log2f(pinfo->target_size)) - 2.0f; | ||||
| /* 2 - Let gpu create Mipmaps for Filtered Importance Sampling. */ | /* 2 - Let gpu create Mipmaps for Filtered Importance Sampling. */ | ||||
| /* Bind next framebuffer to be able to gen. mips for probe_rt. */ | /* Bind next framebuffer to be able to gen. mips for probe_rt. */ | ||||
| ▲ Show 20 Lines • Show All 56 Lines • ▼ Show 20 Lines | #endif | ||||
| /* For shading, save max level of the octahedron map */ | /* For shading, save max level of the octahedron map */ | ||||
| pinfo->lod_cube_max = (float)(maxlevel - min_lod_level) - 1.0f; | pinfo->lod_cube_max = (float)(maxlevel - min_lod_level) - 1.0f; | ||||
| /* reattach to have a valid framebuffer. */ | /* reattach to have a valid framebuffer. */ | ||||
| DRW_framebuffer_texture_attach(sldata->probe_filter_fb, sldata->probe_pool, 0, 0); | DRW_framebuffer_texture_attach(sldata->probe_filter_fb, sldata->probe_pool, 0, 0); | ||||
| } | } | ||||
| /* Diffuse filter probe_rt to irradiance_pool at index probe_idx */ | /* Diffuse filter probe_rt to irradiance_pool at index probe_idx */ | ||||
| static void diffuse_filter_probe(EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata, EEVEE_PassList *psl, int offset) | static void diffuse_filter_probe(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, EEVEE_PassList *psl, int offset) | ||||
| { | { | ||||
| EEVEE_LightProbesInfo *pinfo = sldata->probes; | EEVEE_LightProbesInfo *pinfo = sldata->probes; | ||||
| /* find cell position on the virtual 3D texture */ | /* find cell position on the virtual 3D texture */ | ||||
| /* NOTE : Keep in sync with load_irradiance_cell() */ | /* NOTE : Keep in sync with load_irradiance_cell() */ | ||||
| #if defined(IRRADIANCE_SH_L2) | #if defined(IRRADIANCE_SH_L2) | ||||
| int size[2] = {3, 3}; | int size[2] = {3, 3}; | ||||
| #elif defined(IRRADIANCE_CUBEMAP) | #elif defined(IRRADIANCE_CUBEMAP) | ||||
| Show All 31 Lines | #endif | ||||
| /* reattach to have a valid framebuffer. */ | /* reattach to have a valid framebuffer. */ | ||||
| DRW_framebuffer_texture_detach(sldata->irradiance_rt); | DRW_framebuffer_texture_detach(sldata->irradiance_rt); | ||||
| DRW_framebuffer_texture_attach(sldata->probe_filter_fb, sldata->probe_pool, 0, 0); | DRW_framebuffer_texture_attach(sldata->probe_filter_fb, sldata->probe_pool, 0, 0); | ||||
| } | } | ||||
| /* Render the scene to the probe_rt texture. */ | /* Render the scene to the probe_rt texture. */ | ||||
| static void render_scene_to_probe( | static void render_scene_to_probe( | ||||
| EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata, | EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, | ||||
| const float pos[3], float clipsta, float clipend) | const float pos[3], float clipsta, float clipend) | ||||
| { | { | ||||
| EEVEE_TextureList *txl = vedata->txl; | EEVEE_TextureList *txl = vedata->txl; | ||||
| EEVEE_PassList *psl = vedata->psl; | EEVEE_PassList *psl = vedata->psl; | ||||
| EEVEE_StorageList *stl = vedata->stl; | EEVEE_StorageList *stl = vedata->stl; | ||||
| EEVEE_LightProbesInfo *pinfo = sldata->probes; | EEVEE_LightProbesInfo *pinfo = sldata->probes; | ||||
| float winmat[4][4], wininv[4][4], posmat[4][4], tmp_ao_dist, tmp_ao_samples, tmp_ao_settings; | float winmat[4][4], wininv[4][4], posmat[4][4], tmp_ao_dist, tmp_ao_samples, tmp_ao_settings; | ||||
| ▲ Show 20 Lines • Show All 93 Lines • ▼ Show 20 Lines | static void render_scene_to_probe( | ||||
| stl->g_data->minzbuffer = tmp_minz; | stl->g_data->minzbuffer = tmp_minz; | ||||
| txl->maxzbuffer = tmp_maxz; | txl->maxzbuffer = tmp_maxz; | ||||
| stl->effects->ao_dist = tmp_ao_dist; | stl->effects->ao_dist = tmp_ao_dist; | ||||
| stl->effects->ao_samples = tmp_ao_samples; | stl->effects->ao_samples = tmp_ao_samples; | ||||
| stl->effects->ao_settings = tmp_ao_settings; | stl->effects->ao_settings = tmp_ao_settings; | ||||
| } | } | ||||
| static void render_scene_to_planar( | static void render_scene_to_planar( | ||||
| EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata, int layer, | EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, int layer, | ||||
| float (*viewmat)[4], float (*persmat)[4], | float (*viewmat)[4], float (*persmat)[4], | ||||
| float clip_plane[4]) | float clip_plane[4]) | ||||
| { | { | ||||
| EEVEE_FramebufferList *fbl = vedata->fbl; | EEVEE_FramebufferList *fbl = vedata->fbl; | ||||
| EEVEE_TextureList *txl = vedata->txl; | EEVEE_TextureList *txl = vedata->txl; | ||||
| EEVEE_PassList *psl = vedata->psl; | EEVEE_PassList *psl = vedata->psl; | ||||
| float viewinv[4][4]; | float viewinv[4][4]; | ||||
| ▲ Show 20 Lines • Show All 65 Lines • ▼ Show 20 Lines | static void render_scene_to_planar( | ||||
| DRW_viewport_matrix_override_unset(DRW_MAT_PERSINV); | DRW_viewport_matrix_override_unset(DRW_MAT_PERSINV); | ||||
| DRW_viewport_matrix_override_unset(DRW_MAT_VIEW); | DRW_viewport_matrix_override_unset(DRW_MAT_VIEW); | ||||
| DRW_viewport_matrix_override_unset(DRW_MAT_VIEWINV); | DRW_viewport_matrix_override_unset(DRW_MAT_VIEWINV); | ||||
| DRW_framebuffer_texture_detach(txl->planar_pool); | DRW_framebuffer_texture_detach(txl->planar_pool); | ||||
| DRW_framebuffer_texture_detach(txl->planar_depth); | DRW_framebuffer_texture_detach(txl->planar_depth); | ||||
| } | } | ||||
| static void render_world_to_probe(EEVEE_SceneLayerData *sldata, EEVEE_PassList *psl) | static void render_world_to_probe(EEVEE_ViewLayerData *sldata, EEVEE_PassList *psl) | ||||
| { | { | ||||
| EEVEE_LightProbesInfo *pinfo = sldata->probes; | EEVEE_LightProbesInfo *pinfo = sldata->probes; | ||||
| float winmat[4][4], wininv[4][4]; | float winmat[4][4], wininv[4][4]; | ||||
| /* 1 - Render to cubemap target using geometry shader. */ | /* 1 - Render to cubemap target using geometry shader. */ | ||||
| /* For world probe, we don't need to clear since we render the background directly. */ | /* For world probe, we don't need to clear since we render the background directly. */ | ||||
| pinfo->layer = 0; | pinfo->layer = 0; | ||||
| ▲ Show 20 Lines • Show All 53 Lines • ▼ Show 20 Lines | static void lightprobe_cell_world_location_get(EEVEE_LightGrid *egrid, float local_cell[3], float r_pos[3]) | ||||
| mul_v3_v3fl(tmp, egrid->increment_x, local_cell[0]); | mul_v3_v3fl(tmp, egrid->increment_x, local_cell[0]); | ||||
| add_v3_v3(r_pos, tmp); | add_v3_v3(r_pos, tmp); | ||||
| mul_v3_v3fl(tmp, egrid->increment_y, local_cell[1]); | mul_v3_v3fl(tmp, egrid->increment_y, local_cell[1]); | ||||
| add_v3_v3(r_pos, tmp); | add_v3_v3(r_pos, tmp); | ||||
| mul_v3_v3fl(tmp, egrid->increment_z, local_cell[2]); | mul_v3_v3fl(tmp, egrid->increment_z, local_cell[2]); | ||||
| add_v3_v3(r_pos, tmp); | add_v3_v3(r_pos, tmp); | ||||
| } | } | ||||
| void EEVEE_lightprobes_refresh(EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata) | void EEVEE_lightprobes_refresh(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) | ||||
| { | { | ||||
| EEVEE_TextureList *txl = vedata->txl; | EEVEE_TextureList *txl = vedata->txl; | ||||
| EEVEE_PassList *psl = vedata->psl; | EEVEE_PassList *psl = vedata->psl; | ||||
| EEVEE_StorageList *stl = vedata->stl; | EEVEE_StorageList *stl = vedata->stl; | ||||
| EEVEE_LightProbesInfo *pinfo = sldata->probes; | EEVEE_LightProbesInfo *pinfo = sldata->probes; | ||||
| Object *ob; | Object *ob; | ||||
| const DRWContextState *draw_ctx = DRW_context_state_get(); | const DRWContextState *draw_ctx = DRW_context_state_get(); | ||||
| RegionView3D *rv3d = draw_ctx->rv3d; | RegionView3D *rv3d = draw_ctx->rv3d; | ||||
| ▲ Show 20 Lines • Show All 265 Lines • Show Last 20 Lines | |||||