diff options
Diffstat (limited to 'source/blender/draw/engines')
42 files changed, 243 insertions, 111 deletions
diff --git a/source/blender/draw/engines/basic/basic_engine.c b/source/blender/draw/engines/basic/basic_engine.c index 8a825a7c81f..228281af2b0 100644 --- a/source/blender/draw/engines/basic/basic_engine.c +++ b/source/blender/draw/engines/basic/basic_engine.c @@ -265,6 +265,7 @@ DrawEngineType draw_engine_basic_type = { &basic_data_size, NULL, &basic_engine_free, + NULL, /* instance_free */ &basic_cache_init, &basic_cache_populate, &basic_cache_finish, diff --git a/source/blender/draw/engines/eevee/eevee_cryptomatte.c b/source/blender/draw/engines/eevee/eevee_cryptomatte.c index 1b8e967e38f..80207523a65 100644 --- a/source/blender/draw/engines/eevee/eevee_cryptomatte.c +++ b/source/blender/draw/engines/eevee/eevee_cryptomatte.c @@ -435,9 +435,6 @@ void EEVEE_cryptomatte_output_accumulate(EEVEE_ViewLayerData *UNUSED(sldata), EE /** \name Update Render Passes * \{ */ -/* Register the render passes needed for cryptomatte - * normally this is done in `EEVEE_render_update_passes`, but it has been placed here to keep - * related code side-by-side for clarity. */ void EEVEE_cryptomatte_update_passes(RenderEngine *engine, Scene *scene, ViewLayer *view_layer) { char cryptomatte_pass_name[MAX_NAME]; diff --git a/source/blender/draw/engines/eevee/eevee_effects.c b/source/blender/draw/engines/eevee/eevee_effects.c index c2f3e3a6d95..3d32b4acd82 100644 --- a/source/blender/draw/engines/eevee/eevee_effects.c +++ b/source/blender/draw/engines/eevee/eevee_effects.c @@ -411,9 +411,6 @@ static void downsample_radiance_cb(void *vedata, int level) DRW_draw_pass(psl->color_downsample_ps); } -/** - * Simple down-sampling algorithm. Reconstruct mip chain up to mip level. - */ void EEVEE_effects_downsample_radiance_buffer(EEVEE_Data *vedata, GPUTexture *texture_src) { EEVEE_PassList *psl = vedata->psl; @@ -430,9 +427,6 @@ void EEVEE_effects_downsample_radiance_buffer(EEVEE_Data *vedata, GPUTexture *te DRW_stats_group_end(); } -/** - * Simple down-sampling algorithm for cube-map. Reconstruct mip chain up to mip level. - */ void EEVEE_downsample_cube_buffer(EEVEE_Data *vedata, GPUTexture *texture_src, int level) { EEVEE_FramebufferList *fbl = vedata->fbl; diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c index fad9d21b660..fc9b8b0cde4 100644 --- a/source/blender/draw/engines/eevee/eevee_engine.c +++ b/source/blender/draw/engines/eevee/eevee_engine.c @@ -629,6 +629,7 @@ DrawEngineType draw_engine_eevee_type = { &eevee_data_size, &eevee_engine_init, &eevee_engine_free, + NULL, /* instance_free */ &eevee_cache_init, &EEVEE_cache_populate, &eevee_cache_finish, diff --git a/source/blender/draw/engines/eevee/eevee_lightcache.c b/source/blender/draw/engines/eevee/eevee_lightcache.c index 9a85037ac77..bcbe17fdabc 100644 --- a/source/blender/draw/engines/eevee/eevee_lightcache.c +++ b/source/blender/draw/engines/eevee/eevee_lightcache.c @@ -806,7 +806,6 @@ wmJob *EEVEE_lightbake_job_create(struct wmWindowManager *wm, return wm_job; } -/* MUST run on the main thread. */ void *EEVEE_lightbake_job_data_alloc(struct Main *bmain, struct ViewLayer *view_layer, struct Scene *scene, @@ -1484,8 +1483,6 @@ void EEVEE_lightbake_job(void *custom_data, short *stop, short *do_update, float EEVEE_volumes_free_smoke_textures(); } -/* This is to update the world irradiance and reflection contribution from - * within the viewport drawing (does not have the overhead of a full light cache rebuild.) */ void EEVEE_lightbake_update_world_quick(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, const Scene *scene) diff --git a/source/blender/draw/engines/eevee/eevee_lightcache.h b/source/blender/draw/engines/eevee/eevee_lightcache.h index fde0c80ab37..ccd53f6c037 100644 --- a/source/blender/draw/engines/eevee/eevee_lightcache.h +++ b/source/blender/draw/engines/eevee/eevee_lightcache.h @@ -33,7 +33,9 @@ struct Scene; struct SceneEEVEE; struct ViewLayer; -/* Light Bake */ +/** + * Light Bake. + */ struct wmJob *EEVEE_lightbake_job_create(struct wmWindowManager *wm, struct wmWindow *win, struct Main *bmain, @@ -41,6 +43,9 @@ struct wmJob *EEVEE_lightbake_job_create(struct wmWindowManager *wm, struct Scene *scene, int delay, int frame); +/** + * MUST run on the main thread. + */ void *EEVEE_lightbake_job_data_alloc(struct Main *bmain, struct ViewLayer *view_layer, struct Scene *scene, @@ -50,11 +55,17 @@ void EEVEE_lightbake_job_data_free(void *custom_data); void EEVEE_lightbake_update(void *custom_data); void EEVEE_lightbake_job(void *custom_data, short *stop, short *do_update, float *progress); +/** + * This is to update the world irradiance and reflection contribution from + * within the viewport drawing (does not have the overhead of a full light cache rebuild.) + */ void EEVEE_lightbake_update_world_quick(struct EEVEE_ViewLayerData *sldata, struct EEVEE_Data *vedata, const Scene *scene); -/* Light Cache */ +/** + * Light Cache. + */ struct LightCache *EEVEE_lightcache_create(const int grid_len, const int cube_len, const int cube_size, diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.c b/source/blender/draw/engines/eevee/eevee_lightprobes.c index ab083253499..c51fc18a406 100644 --- a/source/blender/draw/engines/eevee/eevee_lightprobes.c +++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c @@ -202,7 +202,6 @@ void EEVEE_lightprobes_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) } } -/* Only init the passes useful for rendering the light cache. */ void EEVEE_lightbake_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, GPUTexture *rt_color, @@ -871,7 +870,6 @@ static void lightbake_render_scene_face(int face, EEVEE_BakeRenderData *user_dat DRW_draw_pass(psl->transparent_pass); } -/* Render the scene to the probe_rt texture. */ void EEVEE_lightbake_render_scene(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, struct GPUFrameBuffer *face_fb[6], @@ -969,13 +967,13 @@ static void eevee_lightbake_render_scene_to_planars(EEVEE_ViewLayerData *sldata, sldata->probes->planar_data, sldata->probes->num_planar); } + /** \} */ /* -------------------------------------------------------------------- */ /** \name Filtering * \{ */ -/* Glossy filter rt_color to light_cache->cube_tx.tex at index probe_idx */ void EEVEE_lightbake_filter_glossy(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, struct GPUTexture *rt_color, @@ -1064,7 +1062,6 @@ void EEVEE_lightbake_filter_glossy(EEVEE_ViewLayerData *sldata, } } -/* Diffuse filter rt_color to light_cache->grid_tx.tex at index grid_offset */ void EEVEE_lightbake_filter_diffuse(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, struct GPUTexture *rt_color, @@ -1117,7 +1114,6 @@ void EEVEE_lightbake_filter_diffuse(EEVEE_ViewLayerData *sldata, GPU_framebuffer_viewport_reset(fb); } -/* Filter rt_depth to light_cache->grid_tx.tex at index grid_offset */ void EEVEE_lightbake_filter_visibility(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, struct GPUTexture *UNUSED(rt_depth), diff --git a/source/blender/draw/engines/eevee/eevee_lights.c b/source/blender/draw/engines/eevee/eevee_lights.c index afaf604322c..4ed968e2935 100644 --- a/source/blender/draw/engines/eevee/eevee_lights.c +++ b/source/blender/draw/engines/eevee/eevee_lights.c @@ -28,7 +28,6 @@ #include "eevee_private.h" -/* Reconstruct local obmat from EEVEE_light. (normalized) */ void eevee_light_matrix_get(const EEVEE_Light *evli, float r_mat[4][4]) { copy_v3_v3(r_mat[0], evli->rightvec); diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c index 582540529a6..a0522ad94d2 100644 --- a/source/blender/draw/engines/eevee/eevee_materials.c +++ b/source/blender/draw/engines/eevee/eevee_materials.c @@ -76,9 +76,6 @@ struct GPUTexture *EEVEE_materials_get_util_tex(void) return e_data.util_tex; } -/** - * ssr_id can be null to disable ssr contribution. - */ void EEVEE_material_bind_resources(DRWShadingGroup *shgrp, GPUMaterial *gpumat, EEVEE_ViewLayerData *sldata, diff --git a/source/blender/draw/engines/eevee/eevee_motion_blur.c b/source/blender/draw/engines/eevee/eevee_motion_blur.c index 1eff2a3af24..703518a32ec 100644 --- a/source/blender/draw/engines/eevee/eevee_motion_blur.c +++ b/source/blender/draw/engines/eevee/eevee_motion_blur.c @@ -29,6 +29,7 @@ #include "BKE_animsys.h" #include "BKE_camera.h" +#include "BKE_duplilist.h" #include "BKE_object.h" #include "BKE_screen.h" @@ -318,6 +319,14 @@ void EEVEE_motion_blur_cache_populate(EEVEE_ViewLayerData *UNUSED(sldata), return; } + const DupliObject *dup = DRW_object_get_dupli(ob); + if (dup != NULL && dup->ob->data != dup->ob_data) { + /* Geometry instances do not support motion blur correctly yet. The #key used in + * #motion_blur_deform_data_get has to take ids of instances (#DupliObject.persistent_id) into + * account. Otherwise it can't find matching geometry instances at different points in time. */ + return; + } + EEVEE_ObjectMotionData *mb_data = EEVEE_motion_blur_object_data_get( &effects->motion_blur, ob, false); diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h index f51b4fa0127..f0d518a58b1 100644 --- a/source/blender/draw/engines/eevee/eevee_private.h +++ b/source/blender/draw/engines/eevee/eevee_private.h @@ -992,6 +992,8 @@ typedef struct EEVEE_Data { EEVEE_TextureList *txl; EEVEE_PassList *psl; EEVEE_StorageList *stl; + void *instance_data; + char info[GPU_INFO_SIZE]; } EEVEE_Data; @@ -1071,6 +1073,7 @@ typedef struct EEVEE_PrivateData { } EEVEE_PrivateData; /* Transient data */ /* eevee_data.c */ + void EEVEE_motion_blur_data_init(EEVEE_MotionBlurData *mb); void EEVEE_motion_blur_data_free(EEVEE_MotionBlurData *mb); void EEVEE_view_layer_data_free(void *storage); @@ -1095,6 +1098,7 @@ EEVEE_WorldEngineData *EEVEE_world_data_ensure(World *wo); void eevee_id_update(void *vedata, ID *id); /* eevee_materials.c */ + struct GPUTexture *EEVEE_materials_get_util_tex(void); /* XXX */ void EEVEE_materials_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, @@ -1119,6 +1123,9 @@ void EEVEE_update_noise(EEVEE_PassList *psl, EEVEE_FramebufferList *fbl, const d void EEVEE_material_renderpasses_init(EEVEE_Data *vedata); void EEVEE_material_output_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, uint tot_samples); void EEVEE_material_output_accumulate(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); +/** + * \param ssr_id: Can be null to disable SSR contribution. + */ void EEVEE_material_bind_resources(DRWShadingGroup *shgrp, struct GPUMaterial *gpumat, EEVEE_ViewLayerData *sldata, @@ -1128,20 +1135,34 @@ void EEVEE_material_bind_resources(DRWShadingGroup *shgrp, bool use_ssrefraction, bool use_alpha_blend); /* eevee_lights.c */ + +/** + * Reconstruct local `obmat` from EEVEE_light. (normalized). + */ void eevee_light_matrix_get(const EEVEE_Light *evli, float r_mat[4][4]); void EEVEE_lights_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); void EEVEE_lights_cache_add(EEVEE_ViewLayerData *sldata, struct Object *ob); void EEVEE_lights_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); /* eevee_shadows.c */ + void eevee_contact_shadow_setup(const Light *la, EEVEE_Shadow *evsh); void EEVEE_shadows_init(EEVEE_ViewLayerData *sldata); void EEVEE_shadows_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); +/** + * Make that object update shadow casting lights inside its influence bounding box. + */ void EEVEE_shadows_caster_register(EEVEE_ViewLayerData *sldata, struct Object *ob); void EEVEE_shadows_update(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); void EEVEE_shadows_cube_add(EEVEE_LightsInfo *linfo, EEVEE_Light *evli, struct Object *ob); +/** + * Return true if sample has changed and light needs to be updated. + */ bool EEVEE_shadows_cube_setup(EEVEE_LightsInfo *linfo, const EEVEE_Light *evli, int sample_ofs); void EEVEE_shadows_cascade_add(EEVEE_LightsInfo *linfo, EEVEE_Light *evli, struct Object *ob); +/** + * This refresh lights shadow buffers. + */ void EEVEE_shadows_draw(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, struct DRWView *view); void EEVEE_shadows_draw_cubemap(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, int cube_index); void EEVEE_shadows_draw_cascades(EEVEE_ViewLayerData *sldata, @@ -1152,6 +1173,13 @@ void EEVEE_shadow_output_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, u void EEVEE_shadow_output_accumulate(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); /* eevee_sampling.c */ + +/** + * Special ball distribution: + * Point are distributed in a way that when they are orthogonally + * projected into any plane, the resulting distribution is (close to) + * a uniform disc distribution. + */ void EEVEE_sample_ball(int sample_ofs, float radius, float rsample[3]); void EEVEE_sample_rectangle(int sample_ofs, const float x_axis[3], @@ -1168,6 +1196,7 @@ void EEVEE_sample_ellipse(int sample_ofs, void EEVEE_random_rotation_m4(int sample_ofs, float scale, float r_mat[4][4]); /* eevee_shaders.c */ + void EEVEE_shaders_material_shaders_init(void); struct DRWShaderLibrary *EEVEE_shader_lib_get(void); struct GPUShader *EEVEE_shaders_bloom_blit_get(bool high_quality); @@ -1234,18 +1263,28 @@ struct GPUShader *EEVEE_shaders_probe_planar_display_sh_get(void); struct GPUShader *EEVEE_shaders_update_noise_sh_get(void); struct GPUShader *EEVEE_shaders_velocity_resolve_sh_get(void); struct GPUShader *EEVEE_shaders_taa_resolve_sh_get(EEVEE_EffectsFlag enabled_effects); +/** + * Configure a default node-tree with the given material. + */ struct bNodeTree *EEVEE_shader_default_surface_nodetree(Material *ma); +/** + * Configure a default node-tree with the given world. + */ struct bNodeTree *EEVEE_shader_default_world_nodetree(World *wo); Material *EEVEE_material_default_diffuse_get(void); Material *EEVEE_material_default_glossy_get(void); Material *EEVEE_material_default_error_get(void); World *EEVEE_world_default_get(void); +/** + * \note Compilation is not deferred. + */ struct GPUMaterial *EEVEE_material_default_get(struct Scene *scene, Material *ma, int options); struct GPUMaterial *EEVEE_material_get( EEVEE_Data *vedata, struct Scene *scene, Material *ma, World *wo, int options); void EEVEE_shaders_free(void); /* eevee_lightprobes.c */ + bool EEVEE_lightprobes_obj_visibility_cb(bool vis_in, void *user_data); void EEVEE_lightprobes_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); void EEVEE_lightprobes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); @@ -1255,6 +1294,9 @@ void EEVEE_lightprobes_refresh(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); void EEVEE_lightprobes_refresh_planar(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); void EEVEE_lightprobes_free(void); +/** + * Only initialize the passes useful for rendering the light cache. + */ void EEVEE_lightbake_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, GPUTexture *rt_color, @@ -1262,12 +1304,18 @@ void EEVEE_lightbake_cache_init(EEVEE_ViewLayerData *sldata, void EEVEE_lightbake_render_world(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, struct GPUFrameBuffer *face_fb[6]); +/** + * Render the scene to the `probe_rt` texture. + */ 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); +/** + * Glossy filter `rt_color` to `light_cache->cube_tx.tex` at index `probe_idx`. + */ void EEVEE_lightbake_filter_glossy(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, struct GPUTexture *rt_color, @@ -1277,12 +1325,18 @@ void EEVEE_lightbake_filter_glossy(EEVEE_ViewLayerData *sldata, int maxlevel, float filter_quality, float firefly_fac); +/** + * Diffuse filter `rt_color` to `light_cache->grid_tx.tex` at index `grid_offset`. + */ void EEVEE_lightbake_filter_diffuse(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, struct GPUTexture *rt_color, struct GPUFrameBuffer *fb, int grid_offset, float intensity); +/** + * Filter `rt_depth` to `light_cache->grid_tx.tex` at index `grid_offset`. + */ void EEVEE_lightbake_filter_visibility(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, struct GPUTexture *rt_depth, @@ -1301,6 +1355,7 @@ void EEVEE_lightprobes_planar_data_from_object(Object *ob, EEVEE_LightProbeVisTest *vis_test); /* eevee_depth_of_field.c */ + int EEVEE_depth_of_field_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Object *camera); void EEVEE_depth_of_field_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); void EEVEE_depth_of_field_draw(EEVEE_Data *vedata); @@ -1312,6 +1367,7 @@ int EEVEE_depth_of_field_sample_count_get(EEVEE_EffectsInfo *effects, int *r_ring_count); /* eevee_bloom.c */ + int EEVEE_bloom_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); void EEVEE_bloom_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); void EEVEE_bloom_draw(EEVEE_Data *vedata); @@ -1319,6 +1375,7 @@ void EEVEE_bloom_output_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, ui void EEVEE_bloom_output_accumulate(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); /* eevee_cryptomatte.c */ + void EEVEE_cryptomatte_renderpasses_init(EEVEE_Data *vedata); void EEVEE_cryptomatte_output_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, @@ -1332,6 +1389,11 @@ void EEVEE_cryptomatte_object_hair_cache_populate(EEVEE_Data *vedata, EEVEE_ViewLayerData *sldata, Object *ob); void EEVEE_cryptomatte_output_accumulate(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); +/** + * Register the render passes needed for cryptomatte + * normally this is done in `EEVEE_render_update_passes`, but it has been placed here to keep + * related code side-by-side for clarity. + */ void EEVEE_cryptomatte_update_passes(struct RenderEngine *engine, struct Scene *scene, struct ViewLayer *view_layer); @@ -1407,6 +1469,17 @@ void EEVEE_renderpasses_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *ve void EEVEE_renderpasses_output_accumulate(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, bool post_effect); +/** + * Post-process data to construct a specific render-pass + * + * This method will create a shading group to perform the post-processing for the given + * `renderpass_type`. The post-processing will be done and the result will be stored in the + * `vedata->txl->renderpass` texture. + * + * Only invoke this function for passes that need post-processing. + * + * After invoking this function the active frame-buffer is set to `vedata->fbl->renderpass_fb`. + */ void EEVEE_renderpasses_postprocess(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, eViewLayerEEVEEPassType renderpass_type, @@ -1414,6 +1487,10 @@ void EEVEE_renderpasses_postprocess(EEVEE_ViewLayerData *sldata, void EEVEE_renderpasses_draw(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); void EEVEE_renderpasses_draw_debug(EEVEE_Data *vedata); bool EEVEE_renderpasses_only_first_sample_pass_active(EEVEE_Data *vedata); +/** + * Calculate the hash for an AOV. The least significant bit is used to store the AOV + * type the rest of the bits are used for the name hash. + */ int EEVEE_renderpasses_aov_hash(const ViewLayerAOV *aov); /* eevee_temporal_sampling.c */ @@ -1425,11 +1502,16 @@ void EEVEE_temporal_sampling_offset_calc(const double ht_point[2], const float filter_size, float r_offset[2]); void EEVEE_temporal_sampling_matrices_calc(EEVEE_EffectsInfo *effects, const double ht_point[2]); +/** + * Update the matrices based on the current sample. + * \note `DRW_MAT_PERS` and `DRW_MAT_VIEW` needs to read the original matrices. + */ void EEVEE_temporal_sampling_update_matrices(EEVEE_Data *vedata); void EEVEE_temporal_sampling_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); void EEVEE_temporal_sampling_draw(EEVEE_Data *vedata); /* eevee_volumes.c */ + void EEVEE_volumes_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); void EEVEE_volumes_set_jitter(EEVEE_ViewLayerData *sldata, uint current_sample); void EEVEE_volumes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); @@ -1447,18 +1529,29 @@ void EEVEE_volumes_free_smoke_textures(void); void EEVEE_volumes_free(void); /* eevee_effects.c */ + void EEVEE_effects_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Object *camera, const bool minimal); void EEVEE_effects_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); void EEVEE_effects_draw_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); +/** + * Simple down-sampling algorithm. Reconstruct mip chain up to mip level. + */ void EEVEE_effects_downsample_radiance_buffer(EEVEE_Data *vedata, struct GPUTexture *texture_src); void EEVEE_create_minmax_buffer(EEVEE_Data *vedata, struct GPUTexture *depth_src, int layer); +/** + * Simple down-sampling algorithm for cube-map. Reconstruct mip chain up to mip level. + */ void EEVEE_downsample_cube_buffer(EEVEE_Data *vedata, struct GPUTexture *texture_src, int level); void EEVEE_draw_effects(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); /* eevee_render.c */ + +/** + * Return true if initialized properly. + */ bool EEVEE_render_init(EEVEE_Data *vedata, struct RenderEngine *engine, struct Depsgraph *depsgraph); @@ -1469,6 +1562,9 @@ void EEVEE_render_modules_init(EEVEE_Data *vedata, struct RenderEngine *engine, struct Depsgraph *depsgraph); void EEVEE_render_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); +/** + * Used by light cache. in this case engine is NULL. + */ void EEVEE_render_cache(void *vedata, struct Object *ob, struct RenderEngine *engine, diff --git a/source/blender/draw/engines/eevee/eevee_render.c b/source/blender/draw/engines/eevee/eevee_render.c index 5db0ca70dc9..9e7a67060da 100644 --- a/source/blender/draw/engines/eevee/eevee_render.c +++ b/source/blender/draw/engines/eevee/eevee_render.c @@ -46,7 +46,6 @@ #include "eevee_private.h" -/* Return true if init properly. */ bool EEVEE_render_init(EEVEE_Data *ved, RenderEngine *engine, struct Depsgraph *depsgraph) { EEVEE_Data *vedata = (EEVEE_Data *)ved; @@ -194,7 +193,6 @@ void EEVEE_render_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) EEVEE_cryptomatte_cache_init(sldata, vedata); } -/* Used by light cache. in this case engine is NULL. */ void EEVEE_render_cache(void *vedata, struct Object *ob, struct RenderEngine *engine, diff --git a/source/blender/draw/engines/eevee/eevee_renderpasses.c b/source/blender/draw/engines/eevee/eevee_renderpasses.c index aa42deb13fa..3ebfc8a8f0f 100644 --- a/source/blender/draw/engines/eevee/eevee_renderpasses.c +++ b/source/blender/draw/engines/eevee/eevee_renderpasses.c @@ -75,8 +75,6 @@ bool EEVEE_renderpasses_only_first_sample_pass_active(EEVEE_Data *vedata) return (g_data->render_passes & ~EEVEE_RENDERPASSES_POST_PROCESS_ON_FIRST_SAMPLE) == 0; } -/* Calculate the hash for an AOV. The least significant bit is used to store the AOV - * type the rest of the bits are used for the name hash. */ int EEVEE_renderpasses_aov_hash(const ViewLayerAOV *aov) { int hash = BLI_hash_string(aov->name) << 1; @@ -257,15 +255,6 @@ void EEVEE_renderpasses_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *ve } } -/* Post-process data to construct a specific render-pass - * - * This method will create a shading group to perform the post-processing for the given - * `renderpass_type`. The post-processing will be done and the result will be stored in the - * `vedata->txl->renderpass` texture. - * - * Only invoke this function for passes that need post-processing. - * - * After invoking this function the active frame-buffer is set to `vedata->fbl->renderpass_fb`. */ void EEVEE_renderpasses_postprocess(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata, eViewLayerEEVEEPassType renderpass_type, diff --git a/source/blender/draw/engines/eevee/eevee_sampling.c b/source/blender/draw/engines/eevee/eevee_sampling.c index da4bd20106c..99d14bd2c82 100644 --- a/source/blender/draw/engines/eevee/eevee_sampling.c +++ b/source/blender/draw/engines/eevee/eevee_sampling.c @@ -24,12 +24,6 @@ #include "BLI_rand.h" -/** - * Special ball distribution: - * Point are distributed in a way that when they are orthogonally - * projected into any plane, the resulting distribution is (close to) - * a uniform disc distribution. - */ void EEVEE_sample_ball(int sample_ofs, float radius, float rsample[3]) { double ht_point[3]; diff --git a/source/blender/draw/engines/eevee/eevee_shaders.c b/source/blender/draw/engines/eevee/eevee_shaders.c index 56ae7185b51..adede7676d5 100644 --- a/source/blender/draw/engines/eevee/eevee_shaders.c +++ b/source/blender/draw/engines/eevee/eevee_shaders.c @@ -830,6 +830,7 @@ struct GPUShader *EEVEE_shaders_subsurface_translucency_sh_get() } /** \} */ + /* -------------------------------------------------------------------- */ /** \name Volumes * \{ */ @@ -1274,7 +1275,6 @@ Material *EEVEE_material_default_error_get(void) return e_data.error_mat; } -/* Configure a default nodetree with the given material. */ struct bNodeTree *EEVEE_shader_default_surface_nodetree(Material *ma) { /* WARNING: This function is not threadsafe. Which is not a problem for the moment. */ @@ -1302,7 +1302,6 @@ struct bNodeTree *EEVEE_shader_default_surface_nodetree(Material *ma) return e_data.surface.ntree; } -/* Configure a default nodetree with the given world. */ struct bNodeTree *EEVEE_shader_default_world_nodetree(World *wo) { /* WARNING: This function is not threadsafe. Which is not a problem for the moment. */ @@ -1493,7 +1492,6 @@ static struct GPUMaterial *eevee_material_get_ex( return mat; } -/* NOTE: Compilation is not deferred. */ struct GPUMaterial *EEVEE_material_default_get(struct Scene *scene, Material *ma, int options) { Material *def_ma = (ma && (options & VAR_MAT_VOLUME)) ? BKE_material_default_volume() : diff --git a/source/blender/draw/engines/eevee/eevee_shadows.c b/source/blender/draw/engines/eevee/eevee_shadows.c index ee1a6652809..d8a40fd13cc 100644 --- a/source/blender/draw/engines/eevee/eevee_shadows.c +++ b/source/blender/draw/engines/eevee/eevee_shadows.c @@ -123,7 +123,6 @@ void EEVEE_shadows_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) } } -/* Make that object update shadow casting lights inside its influence bounding box. */ void EEVEE_shadows_caster_register(EEVEE_ViewLayerData *sldata, Object *ob) { EEVEE_LightsInfo *linfo = sldata->lights; @@ -300,7 +299,6 @@ void EEVEE_shadows_update(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) } } -/* this refresh lights shadow buffers */ void EEVEE_shadows_draw(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, DRWView *view) { EEVEE_LightsInfo *linfo = sldata->lights; diff --git a/source/blender/draw/engines/eevee/eevee_shadows_cube.c b/source/blender/draw/engines/eevee/eevee_shadows_cube.c index 89caa0dd193..ed9f05df13c 100644 --- a/source/blender/draw/engines/eevee/eevee_shadows_cube.c +++ b/source/blender/draw/engines/eevee/eevee_shadows_cube.c @@ -95,7 +95,6 @@ start: add_v3_v3(ws_sample_pos, jitter); } -/* Return true if sample has changed and light needs to be updated. */ bool EEVEE_shadows_cube_setup(EEVEE_LightsInfo *linfo, const EEVEE_Light *evli, int sample_ofs) { EEVEE_Shadow *shdw_data = linfo->shadow_data + (int)evli->shadow_id; diff --git a/source/blender/draw/engines/eevee/eevee_temporal_sampling.c b/source/blender/draw/engines/eevee/eevee_temporal_sampling.c index b03172a1270..361fa2704c9 100644 --- a/source/blender/draw/engines/eevee/eevee_temporal_sampling.c +++ b/source/blender/draw/engines/eevee/eevee_temporal_sampling.c @@ -196,8 +196,6 @@ void EEVEE_temporal_sampling_matrices_calc(EEVEE_EffectsInfo *effects, const dou DRW_view_update_sub(effects->taa_view, viewmat, winmat); } -/* Update the matrices based on the current sample. - * NOTE: `DRW_MAT_PERS` and `DRW_MAT_VIEW` needs to read the original matrices. */ void EEVEE_temporal_sampling_update_matrices(EEVEE_Data *vedata) { EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl; diff --git a/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl b/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl index 41d6db7f726..1061b2f91a2 100644 --- a/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl @@ -283,7 +283,7 @@ void occlusion_eval(OcclusionData data, bent_normal = N; } else { - /* Note: using pow(visibility, 6.0) produces NaN (see T87369). */ + /* NOTE: using pow(visibility, 6.0) produces NaN (see T87369). */ float tmp = saturate(pow6(visibility)); bent_normal = normalize(mix(bent_normal, N, tmp)); } @@ -337,7 +337,7 @@ float diffuse_occlusion( * radius1 : First cap’s radius (arc length in radians) * radius2 : Second caps’ radius (in radians) * dist : Distance between caps (radians between centers of caps) - * Note: Result is divided by pi to save one multiply. + * NOTE: Result is divided by pi to save one multiply. */ float spherical_cap_intersection(float radius1, float radius2, float dist) { diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_bokeh_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_bokeh_frag.glsl index 5fd00986adc..051a08d25e6 100644 --- a/source/blender/draw/engines/eevee/shaders/effect_dof_bokeh_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/effect_dof_bokeh_frag.glsl @@ -50,10 +50,10 @@ float circle_to_polygon_angle(float sides_count, float theta) float ratio = (local_theta - halfside_angle) / halfside_angle; float halfside_len = polygon_sides_length(sides_count) * 0.5; - float oposite = ratio * halfside_len; + float opposite = ratio * halfside_len; /* NOTE: atan(y_over_x) has output range [-M_PI_2..M_PI_2]. */ - float final_local_theta = atan(oposite / adjacent); + float final_local_theta = atan(opposite / adjacent); return side * side_angle + final_local_theta; } diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_gather_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_gather_frag.glsl index c09365cdcb4..db9ae0f7034 100644 --- a/source/blender/draw/engines/eevee/shaders/effect_dof_gather_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/effect_dof_gather_frag.glsl @@ -2,8 +2,8 @@ /** * Gather pass: Convolve foreground and background parts in separate passes. * - * Using the min&max CoC tile buffer, we select the best appropriate method to blur the scene color. - * A fast gather path is taken if there is not many CoC variation inside the tile. + * Using the min&max CoC tile buffer, we select the best appropriate method to blur the scene + * color. A fast gather path is taken if there is not many CoC variation inside the tile. * * We sample using an octaweb sampling pattern. We randomize the kernel center and each ring * rotation to ensure maximum coverage. diff --git a/source/blender/draw/engines/eevee/shaders/effect_temporal_aa.glsl b/source/blender/draw/engines/eevee/shaders/effect_temporal_aa.glsl index 3c49caf11a9..c54621f123d 100644 --- a/source/blender/draw/engines/eevee/shaders/effect_temporal_aa.glsl +++ b/source/blender/draw/engines/eevee/shaders/effect_temporal_aa.glsl @@ -24,7 +24,7 @@ out vec4 FragColor; */ vec3 clip_to_aabb(vec3 color, vec3 minimum, vec3 maximum, vec3 average) { - /* note: only clips towards aabb center (but fast!) */ + /* NOTE: only clips towards aabb center (but fast!) */ vec3 center = 0.5 * (maximum + minimum); vec3 extents = 0.5 * (maximum - minimum); vec3 dist = color - center; diff --git a/source/blender/draw/engines/external/external_engine.c b/source/blender/draw/engines/external/external_engine.c index cc548a53a8e..1d899c3935b 100644 --- a/source/blender/draw/engines/external/external_engine.c +++ b/source/blender/draw/engines/external/external_engine.c @@ -88,6 +88,8 @@ typedef struct EXTERNAL_Data { EXTERNAL_TextureList *txl; EXTERNAL_PassList *psl; EXTERNAL_StorageList *stl; + void *instance_data; + char info[GPU_INFO_SIZE]; } EXTERNAL_Data; @@ -451,6 +453,7 @@ DrawEngineType draw_engine_external_type = { &external_data_size, &external_engine_init, &external_engine_free, + NULL, /* instance_free */ &external_cache_init, &external_cache_populate, &external_cache_finish, diff --git a/source/blender/draw/engines/gpencil/gpencil_draw_data.c b/source/blender/draw/engines/gpencil/gpencil_draw_data.c index 4636b9e949a..8aba1090b58 100644 --- a/source/blender/draw/engines/gpencil/gpencil_draw_data.c +++ b/source/blender/draw/engines/gpencil/gpencil_draw_data.c @@ -176,11 +176,6 @@ static MaterialGPencilStyle *gpencil_viewport_material_overrides( return gp_style; } -/** - * Creates a linked list of material pool containing all materials assigned for a given object. - * We merge the material pools together if object does not contain a huge amount of materials. - * Also return an offset to the first material of the object in the ubo. - */ GPENCIL_MaterialPool *gpencil_material_pool_create(GPENCIL_PrivateData *pd, Object *ob, int *ofs) { GPENCIL_MaterialPool *matpool = pd->last_material_pool; @@ -429,9 +424,6 @@ void gpencil_light_pool_populate(GPENCIL_LightPool *lightpool, Object *ob) } } -/** - * Creates a single pool containing all lights assigned (light linked) for a given object. - */ GPENCIL_LightPool *gpencil_light_pool_create(GPENCIL_PrivateData *pd, Object *UNUSED(ob)) { GPENCIL_LightPool *lightpool = pd->last_light_pool; diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c index 50e32040522..9bc340a2786 100644 --- a/source/blender/draw/engines/gpencil/gpencil_engine.c +++ b/source/blender/draw/engines/gpencil/gpencil_engine.c @@ -990,6 +990,7 @@ DrawEngineType draw_engine_gpencil_type = { &GPENCIL_data_size, &GPENCIL_engine_init, &GPENCIL_engine_free, + NULL, /* instance_free */ &GPENCIL_cache_init, &GPENCIL_cache_populate, &GPENCIL_cache_finish, diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h b/source/blender/draw/engines/gpencil/gpencil_engine.h index 328e60cf60b..29a9c0211be 100644 --- a/source/blender/draw/engines/gpencil/gpencil_engine.h +++ b/source/blender/draw/engines/gpencil/gpencil_engine.h @@ -392,6 +392,11 @@ GPENCIL_tLayer *gpencil_layer_cache_add(GPENCIL_PrivateData *pd, GPENCIL_tObject *tgp_ob); GPENCIL_tLayer *gpencil_layer_cache_get(GPENCIL_tObject *tgp_ob, int number); +/** + * Creates a linked list of material pool containing all materials assigned for a given object. + * We merge the material pools together if object does not contain a huge amount of materials. + * Also return an offset to the first material of the object in the UBO. + */ GPENCIL_MaterialPool *gpencil_material_pool_create(GPENCIL_PrivateData *pd, Object *ob, int *ofs); void gpencil_material_resources_get(GPENCIL_MaterialPool *first_pool, int mat_id, @@ -402,6 +407,9 @@ void gpencil_material_resources_get(GPENCIL_MaterialPool *first_pool, void gpencil_light_ambient_add(GPENCIL_LightPool *lightpool, const float color[3]); void gpencil_light_pool_populate(GPENCIL_LightPool *lightpool, Object *ob); GPENCIL_LightPool *gpencil_light_pool_add(GPENCIL_PrivateData *pd); +/** + * Creates a single pool containing all lights assigned (light linked) for a given object. + */ GPENCIL_LightPool *gpencil_light_pool_create(GPENCIL_PrivateData *pd, Object *ob); /* effects */ @@ -436,6 +444,10 @@ void GPENCIL_cache_finish(void *vedata); void GPENCIL_draw_scene(void *vedata); /* render */ + +/** + * Initialize render data. + */ void GPENCIL_render_init(struct GPENCIL_Data *ved, struct RenderEngine *engine, struct RenderLayer *render_layer, diff --git a/source/blender/draw/engines/gpencil/gpencil_render.c b/source/blender/draw/engines/gpencil/gpencil_render.c index b597a786e86..26a14c433b3 100644 --- a/source/blender/draw/engines/gpencil/gpencil_render.c +++ b/source/blender/draw/engines/gpencil/gpencil_render.c @@ -33,7 +33,6 @@ #include "gpencil_engine.h" -/* init render data */ void GPENCIL_render_init(GPENCIL_Data *vedata, RenderEngine *engine, struct RenderLayer *render_layer, diff --git a/source/blender/draw/engines/image/image_drawing_mode.hh b/source/blender/draw/engines/image/image_drawing_mode_image_space.hh index d81b0971982..26f4bc28106 100644 --- a/source/blender/draw/engines/image/image_drawing_mode.hh +++ b/source/blender/draw/engines/image/image_drawing_mode_image_space.hh @@ -26,7 +26,7 @@ namespace blender::draw::image_engine { -class DefaultDrawingMode : public AbstractDrawingMode { +class ImageSpaceDrawingMode : public AbstractDrawingMode { private: DRWPass *create_image_pass() const { @@ -50,19 +50,13 @@ class DefaultDrawingMode : public AbstractDrawingMode { GPUBatch *geom = DRW_cache_quad_get(); - const bool is_tiled_texture = image && image->source == IMA_SRC_TILED; - if (is_tiled_texture) { - const float translate_x = image_mat[3][0]; - const float translate_y = image_mat[3][1]; - LISTBASE_FOREACH (ImageTile *, tile, &image->tiles) { - const int tile_x = ((tile->tile_number - 1001) % 10); - const int tile_y = ((tile->tile_number - 1001) / 10); - image_mat[3][0] = (float)tile_x + translate_x; - image_mat[3][1] = (float)tile_y + translate_y; - DRW_shgroup_call_obmat(grp, geom, image_mat); - } - } - else { + const float translate_x = image_mat[3][0]; + const float translate_y = image_mat[3][1]; + LISTBASE_FOREACH (ImageTile *, tile, &image->tiles) { + const int tile_x = ((tile->tile_number - 1001) % 10); + const int tile_y = ((tile->tile_number - 1001) / 10); + image_mat[3][0] = (float)tile_x + translate_x; + image_mat[3][1] = (float)tile_y + translate_y; DRW_shgroup_call_obmat(grp, geom, image_mat); } } diff --git a/source/blender/draw/engines/image/image_engine.cc b/source/blender/draw/engines/image/image_engine.cc index 491fbec978b..be5946f34eb 100644 --- a/source/blender/draw/engines/image/image_engine.cc +++ b/source/blender/draw/engines/image/image_engine.cc @@ -41,7 +41,7 @@ #include "GPU_batch.h" -#include "image_drawing_mode.hh" +#include "image_drawing_mode_image_space.hh" #include "image_engine.h" #include "image_private.hh" #include "image_space_image.hh" @@ -63,12 +63,18 @@ static std::unique_ptr<AbstractSpaceAccessor> space_accessor_from_context( return nullptr; } +template< + /** \brief Drawing mode to use. + * + * Useful during development to switch between drawing implementations. + */ + typename DrawingMode = ImageSpaceDrawingMode> class ImageEngine { private: const DRWContextState *draw_ctx; IMAGE_Data *vedata; std::unique_ptr<AbstractSpaceAccessor> space; - DefaultDrawingMode drawing_mode; + DrawingMode drawing_mode; public: ImageEngine(const DRWContextState *draw_ctx, IMAGE_Data *vedata) @@ -185,6 +191,7 @@ DrawEngineType draw_engine_image_type = { &IMAGE_data_size, /* vedata_size */ &IMAGE_engine_init, /* engine_init */ &IMAGE_engine_free, /* engine_free */ + nullptr, /* instance_free */ &IMAGE_cache_init, /* cache_init */ &IMAGE_cache_populate, /* cache_populate */ nullptr, /* cache_finish */ diff --git a/source/blender/draw/engines/overlay/overlay_armature.c b/source/blender/draw/engines/overlay/overlay_armature.c index 1da682ff01b..2345a110134 100644 --- a/source/blender/draw/engines/overlay/overlay_armature.c +++ b/source/blender/draw/engines/overlay/overlay_armature.c @@ -26,6 +26,7 @@ #include "DNA_armature_types.h" #include "DNA_constraint_types.h" +#include "DNA_mesh_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_view3d_types.h" @@ -39,6 +40,7 @@ #include "BKE_armature.h" #include "BKE_deform.h" #include "BKE_modifier.h" +#include "BKE_object.h" #include "DEG_depsgraph_query.h" @@ -52,6 +54,8 @@ #include "overlay_private.h" +#include "draw_cache_impl.h" + #define BONE_VAR(eBone, pchan, var) ((eBone) ? (eBone->var) : (pchan->var)) #define BONE_FLAG(eBone, pchan) ((eBone) ? (eBone->flag) : (pchan->bone->flag)) @@ -100,9 +104,6 @@ typedef struct ArmatureDrawContext { const ThemeWireColor *bcolor; /* pchan color */ } ArmatureDrawContext; -/** - * Return true if armature should be handled by the pose mode engine. - */ bool OVERLAY_armature_is_pose_mode(Object *ob, const DRWContextState *draw_ctx) { Object *active_ob = draw_ctx->obact; @@ -535,13 +536,22 @@ static void drw_shgroup_bone_custom_solid(ArmatureDrawContext *ctx, const float outline_color[4], Object *custom) { + /* The custom object is not an evaluated object, so its object->data field hasn't been replaced + * by #data_eval. This is bad since it gives preference to an object's evaluated mesh over any + * other data type, but supporting all evaluated geometry components would require a much larger + * refactor of this area. */ + Mesh *mesh = BKE_object_get_evaluated_mesh(custom); + if (mesh == NULL) { + return; + } + /* TODO(fclem): arg... less than ideal but we never iter on this object * to assure batch cache is valid. */ - drw_batch_cache_validate(custom); + DRW_mesh_batch_cache_validate(mesh); - struct GPUBatch *surf = DRW_cache_object_surface_get(custom); - struct GPUBatch *edges = DRW_cache_object_edge_detection_get(custom, NULL); - struct GPUBatch *ledges = DRW_cache_object_loose_edges_get(custom); + struct GPUBatch *surf = DRW_mesh_batch_cache_get_surface(mesh); + struct GPUBatch *edges = DRW_mesh_batch_cache_get_edge_detection(mesh, NULL); + struct GPUBatch *ledges = DRW_mesh_batch_cache_get_loose_edges(mesh); BoneInstanceData inst_data; DRWCallBuffer *buf; @@ -578,12 +588,16 @@ static void drw_shgroup_bone_custom_wire(ArmatureDrawContext *ctx, const float color[4], Object *custom) { + /* See comments in #drw_shgroup_bone_custom_solid. */ + Mesh *mesh = BKE_object_get_evaluated_mesh(custom); + if (mesh == NULL) { + return; + } /* TODO(fclem): arg... less than ideal but we never iter on this object * to assure batch cache is valid. */ - drw_batch_cache_validate(custom); - - struct GPUBatch *geom = DRW_cache_object_all_edges_get(custom); + DRW_mesh_batch_cache_validate(mesh); + struct GPUBatch *geom = DRW_mesh_batch_cache_get_all_edges(mesh); if (geom) { DRWCallBuffer *buf = custom_bone_instance_shgroup(ctx, ctx->custom_wire, geom); BoneInstanceData inst_data; @@ -1906,6 +1920,7 @@ static void draw_bone_name(ArmatureDrawContext *ctx, DRW_TEXT_CACHE_GLOBALSPACE | DRW_TEXT_CACHE_STRING_PTR, color); } + /** \} */ /* -------------------------------------------------------------------- */ @@ -2314,3 +2329,5 @@ void OVERLAY_pose_draw(OVERLAY_Data *vedata) DRW_draw_pass(psl->armature_ps[1]); } } + +/** \} */ diff --git a/source/blender/draw/engines/overlay/overlay_engine.c b/source/blender/draw/engines/overlay/overlay_engine.c index 2bdceb5f3db..12db2bd02cf 100644 --- a/source/blender/draw/engines/overlay/overlay_engine.c +++ b/source/blender/draw/engines/overlay/overlay_engine.c @@ -703,6 +703,7 @@ DrawEngineType draw_engine_overlay_type = { &overlay_data_size, &OVERLAY_engine_init, &OVERLAY_engine_free, + NULL, /* instance_free */ &OVERLAY_cache_init, &OVERLAY_cache_populate, &OVERLAY_cache_finish, diff --git a/source/blender/draw/engines/overlay/overlay_image.c b/source/blender/draw/engines/overlay/overlay_image.c index 2e9a9bc5c64..0608725d342 100644 --- a/source/blender/draw/engines/overlay/overlay_image.c +++ b/source/blender/draw/engines/overlay/overlay_image.c @@ -462,8 +462,6 @@ void OVERLAY_image_cache_finish(OVERLAY_Data *vedata) DRW_pass_sort_shgroup_z(psl->image_empties_back_ps); } -/* This function draws images that needs the view transform applied. - * It draws these images directly into the scene color buffer. */ void OVERLAY_image_scene_background_draw(OVERLAY_Data *vedata) { OVERLAY_PassList *psl = vedata->psl; diff --git a/source/blender/draw/engines/overlay/overlay_private.h b/source/blender/draw/engines/overlay/overlay_private.h index def278f98df..8e7c3094062 100644 --- a/source/blender/draw/engines/overlay/overlay_private.h +++ b/source/blender/draw/engines/overlay/overlay_private.h @@ -510,6 +510,9 @@ void OVERLAY_xray_fade_draw(OVERLAY_Data *vedata); void OVERLAY_xray_depth_copy(OVERLAY_Data *vedata); void OVERLAY_xray_depth_infront_copy(OVERLAY_Data *vedata); +/** + * Return true if armature should be handled by the pose mode engine. + */ bool OVERLAY_armature_is_pose_mode(Object *ob, const struct DRWContextState *draw_ctx); void OVERLAY_armature_cache_init(OVERLAY_Data *vedata); void OVERLAY_armature_cache_populate(OVERLAY_Data *vedata, Object *ob); @@ -631,6 +634,10 @@ void OVERLAY_image_empty_cache_populate(OVERLAY_Data *vedata, Object *ob); void OVERLAY_image_cache_finish(OVERLAY_Data *vedata); void OVERLAY_image_draw(OVERLAY_Data *vedata); void OVERLAY_image_background_draw(OVERLAY_Data *vedata); +/** + * This function draws images that needs the view transform applied. + * It draws these images directly into the scene color buffer. + */ void OVERLAY_image_scene_background_draw(OVERLAY_Data *vedata); void OVERLAY_image_in_front_draw(OVERLAY_Data *vedata); diff --git a/source/blender/draw/engines/overlay/overlay_wireframe.c b/source/blender/draw/engines/overlay/overlay_wireframe.c index fde376beeb2..449130c4c5b 100644 --- a/source/blender/draw/engines/overlay/overlay_wireframe.c +++ b/source/blender/draw/engines/overlay/overlay_wireframe.c @@ -237,7 +237,21 @@ void OVERLAY_wireframe_cache_populate(OVERLAY_Data *vedata, if (dupli && !init_dupli) { if (dupli->wire_shgrp && dupli->wire_geom) { if (dupli->base_flag == ob->base_flag) { - DRW_shgroup_call(dupli->wire_shgrp, dupli->wire_geom, ob); + /* Check for the special cases used below, assign specific theme colors to the shaders. */ + OVERLAY_ExtraCallBuffers *cb = OVERLAY_extra_call_buffer_get(vedata, ob); + if (dupli->wire_shgrp == cb->extra_loose_points) { + float *color; + DRW_object_wire_theme_get(ob, draw_ctx->view_layer, &color); + OVERLAY_extra_loose_points(cb, dupli->wire_geom, ob->obmat, color); + } + else if (dupli->wire_shgrp == cb->extra_wire) { + float *color; + DRW_object_wire_theme_get(ob, draw_ctx->view_layer, &color); + OVERLAY_extra_wire(cb, dupli->wire_geom, ob->obmat, color); + } + else { + DRW_shgroup_call(dupli->wire_shgrp, dupli->wire_geom, ob); + } return; } } @@ -268,6 +282,9 @@ void OVERLAY_wireframe_cache_populate(OVERLAY_Data *vedata, } } + DRWShadingGroup *shgrp = NULL; + struct GPUBatch *geom = NULL; + /* Don't do that in edit Mesh mode, unless there is a modifier preview. */ if (use_wire && (!is_mesh || (!is_edit_mode || has_edit_mesh_cage))) { const bool is_sculpt_mode = ((ob->mode & OB_MODE_SCULPT) != 0) && (ob->sculpt != NULL); @@ -275,8 +292,7 @@ void OVERLAY_wireframe_cache_populate(OVERLAY_Data *vedata, !DRW_state_is_image_render(); const bool use_coloring = (use_wire && !is_edit_mode && !is_sculpt_mode && !has_edit_mesh_cage); - DRWShadingGroup *shgrp = NULL; - struct GPUBatch *geom = DRW_cache_object_face_wireframe_get(ob); + geom = DRW_cache_object_face_wireframe_get(ob); if (geom || use_sculpt_pbvh) { if (use_sculpt_pbvh) { @@ -300,11 +316,6 @@ void OVERLAY_wireframe_cache_populate(OVERLAY_Data *vedata, DRW_shgroup_call(shgrp, geom, ob); } } - - if (dupli) { - dupli->wire_shgrp = shgrp; - dupli->wire_geom = geom; - } } else if (is_mesh && (!is_edit_mode || has_edit_mesh_cage)) { OVERLAY_ExtraCallBuffers *cb = OVERLAY_extra_call_buffer_get(vedata, ob); @@ -313,18 +324,25 @@ void OVERLAY_wireframe_cache_populate(OVERLAY_Data *vedata, /* Draw loose geometry. */ if (is_mesh_verts_only) { - struct GPUBatch *geom = DRW_cache_mesh_all_verts_get(ob); + geom = DRW_cache_mesh_all_verts_get(ob); if (geom) { OVERLAY_extra_loose_points(cb, geom, ob->obmat, color); + shgrp = cb->extra_loose_points; } } else { - struct GPUBatch *geom = DRW_cache_mesh_loose_edges_get(ob); + geom = DRW_cache_mesh_loose_edges_get(ob); if (geom) { OVERLAY_extra_wire(cb, geom, ob->obmat, color); + shgrp = cb->extra_wire; } } } + + if (dupli) { + dupli->wire_shgrp = shgrp; + dupli->wire_geom = geom; + } } void OVERLAY_wireframe_draw(OVERLAY_Data *data) diff --git a/source/blender/draw/engines/select/select_debug_engine.c b/source/blender/draw/engines/select/select_debug_engine.c index e9437c5ab92..f66eabdcdcc 100644 --- a/source/blender/draw/engines/select/select_debug_engine.c +++ b/source/blender/draw/engines/select/select_debug_engine.c @@ -120,6 +120,7 @@ DrawEngineType draw_engine_debug_select_type = { &select_debug_data_size, &select_debug_engine_init, &select_debug_engine_free, + NULL, /* instance_free */ NULL, NULL, NULL, diff --git a/source/blender/draw/engines/select/select_engine.c b/source/blender/draw/engines/select/select_engine.c index 20edd78597b..7f9645013ce 100644 --- a/source/blender/draw/engines/select/select_engine.c +++ b/source/blender/draw/engines/select/select_engine.c @@ -363,6 +363,7 @@ DrawEngineType draw_engine_select_type = { &select_data_size, &select_engine_init, &select_engine_free, + NULL, /* instance_free */ &select_cache_init, &select_cache_populate, NULL, diff --git a/source/blender/draw/engines/workbench/shaders/workbench_transparent_accum_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_transparent_accum_frag.glsl index fd4d00d96dd..3f113fd4b2e 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_transparent_accum_frag.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_transparent_accum_frag.glsl @@ -11,7 +11,7 @@ layout(location = 0) out vec4 transparentAccum; layout(location = 1) out vec4 revealageAccum; -/* Note: Blending will be skipped on objectId because output is a non-normalized integer buffer. */ +/* NOTE: Blending will be skipped on objectId because output is a non-normalized integer buffer. */ layout(location = 2) out uint objectId; /* Special function only to be used with calculate_transparent_weight(). */ diff --git a/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c b/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c index 8206add7412..f4014fac41f 100644 --- a/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c +++ b/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c @@ -371,7 +371,6 @@ void workbench_antialiasing_cache_init(WORKBENCH_Data *vedata) } } -/* Return true if render is not cached. */ bool workbench_antialiasing_setup(WORKBENCH_Data *vedata) { WORKBENCH_PrivateData *wpd = vedata->stl->wpd; diff --git a/source/blender/draw/engines/workbench/workbench_engine.c b/source/blender/draw/engines/workbench/workbench_engine.c index 4706aeb4477..5bc2c53e253 100644 --- a/source/blender/draw/engines/workbench/workbench_engine.c +++ b/source/blender/draw/engines/workbench/workbench_engine.c @@ -473,8 +473,6 @@ void workbench_cache_finish(void *ved) } } -/* Used by viewport rendering & final rendering. - * Do one render loop iteration (i.e: One TAA sample). */ void workbench_draw_sample(void *ved) { WORKBENCH_Data *vedata = ved; @@ -629,6 +627,7 @@ DrawEngineType draw_engine_workbench = { &workbench_data_size, &workbench_engine_init, &workbench_engine_free, + NULL, /* instance_free */ &workbench_cache_init, &workbench_cache_populate, &workbench_cache_finish, diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c index aaa1a5a6ff6..d70633eaa85 100644 --- a/source/blender/draw/engines/workbench/workbench_materials.c +++ b/source/blender/draw/engines/workbench/workbench_materials.c @@ -244,7 +244,6 @@ DRWShadingGroup *workbench_material_setup_ex(WORKBENCH_PrivateData *wpd, } } -/* If ima is null, search appropriate image node but will fallback to purple texture otherwise. */ DRWShadingGroup *workbench_image_setup_ex(WORKBENCH_PrivateData *wpd, Object *ob, int mat_nr, diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h index e17bd7d9956..42c873c7691 100644 --- a/source/blender/draw/engines/workbench/workbench_private.h +++ b/source/blender/draw/engines/workbench/workbench_private.h @@ -414,6 +414,10 @@ void workbench_opaque_cache_init(WORKBENCH_Data *data); /* workbench_transparent.c */ void workbench_transparent_engine_init(WORKBENCH_Data *data); void workbench_transparent_cache_init(WORKBENCH_Data *data); +/** + * Redraw the transparent passes but with depth test + * to output correct outline IDs and depth. + */ void workbench_transparent_draw_depth_pass(WORKBENCH_Data *data); /* workbench_shadow.c */ @@ -463,6 +467,9 @@ int workbench_antialiasing_sample_count_get(WORKBENCH_PrivateData *wpd); void workbench_antialiasing_engine_init(WORKBENCH_Data *vedata); void workbench_antialiasing_cache_init(WORKBENCH_Data *vedata); void workbench_antialiasing_view_updated(WORKBENCH_Data *vedata); +/** + * Return true if render is not cached. + */ bool workbench_antialiasing_setup(WORKBENCH_Data *vedata); void workbench_antialiasing_draw_pass(WORKBENCH_Data *vedata); @@ -491,6 +498,9 @@ DRWShadingGroup *workbench_material_setup_ex(WORKBENCH_PrivateData *wpd, eV3DShadingColorType color_type, eWORKBENCH_DataType datatype, bool *r_transp); +/** + * If `ima` is null, search appropriate image node but will fallback to purple texture otherwise. + */ DRWShadingGroup *workbench_image_setup_ex(WORKBENCH_PrivateData *wpd, Object *ob, int mat_nr, @@ -535,6 +545,10 @@ void workbench_engine_init(void *ved); void workbench_cache_init(void *ved); void workbench_cache_populate(void *ved, Object *ob); void workbench_cache_finish(void *ved); +/** + * Used by viewport rendering & final rendering. + * Do one render loop iteration (i.e: One TAA sample). + */ void workbench_draw_sample(void *ved); void workbench_draw_finish(void *ved); diff --git a/source/blender/draw/engines/workbench/workbench_transparent.c b/source/blender/draw/engines/workbench/workbench_transparent.c index ad855cb284c..3be005b43d0 100644 --- a/source/blender/draw/engines/workbench/workbench_transparent.c +++ b/source/blender/draw/engines/workbench/workbench_transparent.c @@ -149,8 +149,6 @@ void workbench_transparent_cache_init(WORKBENCH_Data *vedata) } } -/* Redraw the transparent passes but with depth test - * to output correct outline IDs and depth. */ void workbench_transparent_draw_depth_pass(WORKBENCH_Data *data) { WORKBENCH_PrivateData *wpd = data->stl->wpd; |