27 #define WORKBENCH_ENGINE "BLENDER_WORKBENCH"
29 #define MAX_MATERIAL (1 << 12)
31 #define DEBUG_SHADOW_VOLUME 0
33 #define STUDIOLIGHT_ENABLED(wpd) (wpd->shading.light == V3D_LIGHTING_STUDIO)
34 #define MATCAP_ENABLED(wpd) (wpd->shading.light == V3D_LIGHTING_MATCAP)
35 #define USE_WORLD_ORIENTATION(wpd) ((wpd->shading.flag & V3D_SHADING_WORLD_ORIENTATION) != 0)
36 #define STUDIOLIGHT_TYPE_WORLD_ENABLED(wpd) \
37 (STUDIOLIGHT_ENABLED(wpd) && (wpd->studio_light->flag & STUDIOLIGHT_TYPE_WORLD))
38 #define STUDIOLIGHT_TYPE_STUDIO_ENABLED(wpd) \
39 (STUDIOLIGHT_ENABLED(wpd) && (wpd->studio_light->flag & STUDIOLIGHT_TYPE_STUDIO))
40 #define STUDIOLIGHT_TYPE_MATCAP_ENABLED(wpd) \
41 (MATCAP_ENABLED(wpd) && (wpd->studio_light->flag & STUDIOLIGHT_TYPE_MATCAP))
42 #define SSAO_ENABLED(wpd) \
43 ((wpd->shading.flag & V3D_SHADING_CAVITY) && \
44 ((wpd->shading.cavity_type == V3D_SHADING_CAVITY_SSAO) || \
45 (wpd->shading.cavity_type == V3D_SHADING_CAVITY_BOTH)))
46 #define CURVATURE_ENABLED(wpd) \
47 ((wpd->shading.flag & V3D_SHADING_CAVITY) && \
48 ((wpd->shading.cavity_type == V3D_SHADING_CAVITY_CURVATURE) || \
49 (wpd->shading.cavity_type == V3D_SHADING_CAVITY_BOTH)))
50 #define CAVITY_ENABLED(wpd) (CURVATURE_ENABLED(wpd) || SSAO_ENABLED(wpd))
51 #define SHADOW_ENABLED(wpd) (wpd->shading.flag & V3D_SHADING_SHADOW)
52 #define CULL_BACKFACE_ENABLED(wpd) ((wpd->shading.flag & V3D_SHADING_BACKFACE_CULLING) != 0)
54 #define OBJECT_OUTLINE_ENABLED(wpd) (wpd->shading.flag & V3D_SHADING_OBJECT_OUTLINE)
55 #define OBJECT_ID_PASS_ENABLED(wpd) (OBJECT_OUTLINE_ENABLED(wpd) || CURVATURE_ENABLED(wpd))
56 #define NORMAL_ENCODING_ENABLED() (true)
501 #define WORKBENCH_OBJECT_DATATYPE(ob) \
502 ((ob->type == OB_POINTCLOUD) ? WORKBENCH_DATATYPE_POINTCLOUD : WORKBENCH_DATATYPE_MESH)
504 #define workbench_material_setup(wpd, ob, mat_nr, color_type, r_transp) \
505 workbench_material_setup_ex(wpd, ob, mat_nr, color_type, WORKBENCH_OBJECT_DATATYPE(ob), r_transp)
506 #define workbench_image_setup(wpd, ob, mat_nr, ima, iuser, interp) \
507 workbench_image_setup_ex(wpd, ob, mat_nr, ima, iuser, interp, WORKBENCH_OBJECT_DATATYPE(ob))
509 #define workbench_material_hair_setup(wpd, ob, mat_nr, color_type) \
510 workbench_material_setup_ex(wpd, ob, mat_nr, color_type, WORKBENCH_DATATYPE_HAIR, 0)
511 #define workbench_image_hair_setup(wpd, ob, mat_nr, ima, iuser, interp) \
512 workbench_image_setup_ex(wpd, ob, mat_nr, ima, iuser, interp, WORKBENCH_DATATYPE_HAIR)
551 const struct rcti *rect);
@ STUDIOLIGHT_SPECULAR_HIGHLIGHT_PASS
#define BLI_STATIC_ASSERT_ALIGN(st, align)
@ V3D_SHADING_SPECULAR_HIGHLIGHT
struct GPUFrameBuffer GPUFrameBuffer
struct GPUShader GPUShader
struct GPUTexture GPUTexture
depth_tx sampler(1, ImageType::FLOAT_2D, "combined_tx") .sampler(2
struct GPUShader * downsample_sh
WORKBENCH_FramebufferList * fbl
WORKBENCH_StorageList * stl
WORKBENCH_TextureList * txl
struct GPUFrameBuffer * smaa_edge_fb
struct GPUFrameBuffer * antialiasing_fb
struct GPUFrameBuffer * opaque_fb
struct GPUFrameBuffer * transp_accum_fb
struct GPUFrameBuffer * opaque_infront_fb
struct GPUFrameBuffer * id_clear_fb
struct GPUFrameBuffer * dof_coc_dilate_fb
struct GPUFrameBuffer * dof_blur1_fb
struct GPUFrameBuffer * dof_coc_tile_h_fb
struct GPUFrameBuffer * dof_downsample_fb
struct GPUFrameBuffer * dof_coc_tile_v_fb
struct GPUFrameBuffer * dof_blur2_fb
struct GPUFrameBuffer * antialiasing_in_front_fb
struct GPUFrameBuffer * smaa_weight_fb
struct GPUFrameBuffer * transp_accum_infront_fb
struct DRWPass * dof_dilate_v_ps
struct DRWPass * transp_depth_infront_ps
struct DRWPass * aa_weight_ps
struct DRWPass * dof_blur1_ps
struct DRWPass * composite_ps
struct DRWPass * opaque_infront_ps
struct DRWPass * transp_accum_ps
struct DRWPass * shadow_ps[2]
struct DRWPass * dof_dilate_h_ps
struct DRWPass * dof_flatten_h_ps
struct DRWPass * merge_infront_ps
struct DRWPass * outline_ps
struct DRWPass * opaque_ps
struct DRWPass * transp_depth_ps
struct DRWPass * aa_accum_ps
struct DRWPass * dof_resolve_ps
struct DRWPass * volume_ps
struct DRWPass * dof_blur2_ps
struct DRWPass * dof_down_ps
struct DRWPass * aa_edge_ps
struct DRWPass * transp_resolve_ps
struct DRWPass * aa_accum_replace_ps
struct DRWPass * dof_flatten_v_ps
struct DRWPass * transp_accum_infront_ps
struct DRWPass * cavity_ps
struct DRWPass * aa_resolve_ps
struct DRWPass * dof_down2_ps
struct DRWShadingGroup * vcol_shgrp
struct DRWShadingGroup * image_tiled_shgrp
struct DRWShadingGroup * common_shgrp
struct GHash * material_hash
struct DRWShadingGroup * image_shgrp
struct GPUUniformBuf * world_ubo
int taa_sample_len_previous
const UserDef * preferences
struct GPUUniformBuf * material_ubo_curr
float shadow_far_plane[4]
struct BLI_memblock * material_ubo_data
struct GPUTexture * object_id_tx
struct BLI_memblock * material_ubo
struct DRWShadingGroup * shadow_fail_caps_grp[2]
eContextObjectMode ctx_mode
struct GPUTexture * dof_blur_tx
struct GPUTexture * composite_buffer_tx
struct Object * cam_original_ob
struct GPUTexture * normal_buffer_tx
struct GPUTexture * coc_tiles_tx[2]
struct WORKBENCH_ViewLayerData * vldata
struct GPUTexture * smaa_edge_tx
struct GPUTexture * dummy_image_tx
struct DRWShadingGroup * shadow_pass_grp[2]
struct GPUTexture * material_buffer_tx
struct GPUTexture * reveal_buffer_tx
float shadow_direction_ws[3]
float shadow_cached_direction[3]
WORKBENCH_UBO_Material * material_ubo_data_curr
float shadow_near_sides[2][4]
struct GPUTexture * smaa_weight_tx
WORKBENCH_Prepass prepass[2][2][WORKBENCH_DATATYPE_MAX]
struct GPUTexture * accum_buffer_tx
StudioLight * studio_light
struct GPUTexture * coc_temp_tx
float background_color[4]
struct DRWShadingGroup * shadow_fail_grp[2]
struct WORKBENCH_PrivateData * wpd
struct GPUTexture * depth_buffer_in_front_tx
struct GPUTexture * dummy_coba_tx
struct GPUTexture * dummy_image_tx
struct GPUTexture * dummy_volume_tx
struct GPUTexture * depth_buffer_tx
struct GPUTexture * dof_source_tx
struct GPUTexture * smaa_search_tx
struct GPUTexture * dummy_shadow_tx
struct GPUTexture * smaa_area_tx
struct GPUTexture * coc_halfres_tx
struct GPUTexture * history_buffer_tx
WORKBENCH_UBO_Light lights[4]
float cavity_jitter_scale
float cavity_valley_factor
float cavity_sample_count_inv
float cavity_ridge_factor
float viewport_size_inv[2]
float object_outline_color[4]
float shadow_direction_vs[4]
struct GPUUniformBuf * world_ubo
struct GPUUniformBuf * cavity_sample_ubo
struct BLI_memblock * material_ubo
struct BLI_memblock * material_ubo_data
struct GPUUniformBuf * dof_sample_ubo
struct GPUTexture * cavity_jitter_tx
struct WORKBENCH_FramebufferList WORKBENCH_FramebufferList
void workbench_dof_cache_init(WORKBENCH_Data *vedata)
void workbench_dof_draw_pass(WORKBENCH_Data *vedata)
void workbench_antialiasing_engine_init(WORKBENCH_Data *vedata)
GPUShader * workbench_shader_transparent_resolve_get(WORKBENCH_PrivateData *wpd)
void workbench_cavity_data_update(WORKBENCH_PrivateData *wpd, WORKBENCH_UBO_World *wd)
GPUShader * workbench_shader_transparent_image_get(WORKBENCH_PrivateData *wpd, eWORKBENCH_DataType data, bool tiled)
DRWShadingGroup * workbench_image_setup_ex(WORKBENCH_PrivateData *wpd, Object *ob, int mat_nr, Image *ima, ImageUser *iuser, eGPUSamplerState sampler, eWORKBENCH_DataType datatype)
void workbench_transparent_engine_init(WORKBENCH_Data *data)
void workbench_shadow_data_update(WORKBENCH_PrivateData *wpd, WORKBENCH_UBO_World *wd)
GPUShader * workbench_shader_shadow_fail_get(bool manifold, bool cap)
void workbench_cavity_samples_ubo_ensure(WORKBENCH_PrivateData *wpd)
struct WORKBENCH_StorageList WORKBENCH_StorageList
eWORKBENCH_VolumeInterpType
@ WORKBENCH_VOLUME_INTERP_CUBIC
@ WORKBENCH_VOLUME_INTERP_LINEAR
@ WORKBENCH_VOLUME_INTERP_CLOSEST
#define STUDIOLIGHT_ENABLED(wpd)
void workbench_volume_cache_init(WORKBENCH_Data *vedata)
GPUShader * workbench_shader_shadow_pass_get(bool manifold)
void workbench_volume_draw_pass(WORKBENCH_Data *vedata)
struct GPUUniformBuf * workbench_material_ubo_alloc(WORKBENCH_PrivateData *wpd)
struct DrawEngineType draw_engine_workbench
void workbench_cache_populate(void *ved, Object *ob)
GPUShader * workbench_shader_composite_get(WORKBENCH_PrivateData *wpd)
GPUShader * workbench_shader_volume_get(bool slice, bool coba, eWORKBENCH_VolumeInterpType interp_type, bool smoke)
void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
GPUShader * workbench_shader_opaque_image_get(WORKBENCH_PrivateData *wpd, eWORKBENCH_DataType data, bool tiled)
bool workbench_antialiasing_setup(WORKBENCH_Data *vedata)
void workbench_antialiasing_draw_pass(WORKBENCH_Data *vedata)
void workbench_shader_free(void)
void workbench_cavity_cache_init(WORKBENCH_Data *data)
void workbench_shadow_cache_populate(WORKBENCH_Data *data, Object *ob, bool has_transp_mat)
void workbench_private_data_alloc(WORKBENCH_StorageList *stl)
struct WORKBENCH_Prepass WORKBENCH_Prepass
void workbench_outline_cache_init(WORKBENCH_Data *data)
struct WORKBENCH_UBO_Material WORKBENCH_UBO_Material
void workbench_transparent_cache_init(WORKBENCH_Data *data)
void workbench_opaque_engine_init(WORKBENCH_Data *data)
void workbench_material_ubo_data(WORKBENCH_PrivateData *wpd, Object *ob, Material *mat, WORKBENCH_UBO_Material *data, eV3DShadingColorType color_type)
struct WORKBENCH_ObjectData WORKBENCH_ObjectData
GPUShader * workbench_shader_antialiasing_get(int stage)
void workbench_cache_init(void *ved)
#define MATCAP_ENABLED(wpd)
GPUShader * workbench_shader_antialiasing_accumulation_get(void)
void workbench_antialiasing_cache_init(WORKBENCH_Data *vedata)
struct WORKBENCH_UBO_Light WORKBENCH_UBO_Light
DRWShadingGroup * workbench_material_setup_ex(WORKBENCH_PrivateData *wpd, Object *ob, int mat_nr, eV3DShadingColorType color_type, eWORKBENCH_DataType datatype, bool *r_transp)
GPUShader * workbench_shader_merge_infront_get(WORKBENCH_PrivateData *wpd)
void workbench_engine_init(void *ved)
void workbench_update_world_ubo(WORKBENCH_PrivateData *wpd)
void workbench_volume_engine_init(WORKBENCH_Data *vedata)
struct WORKBENCH_UBO_World WORKBENCH_UBO_World
GPUShader * workbench_shader_cavity_get(bool cavity, bool curvature)
void workbench_render_update_passes(struct RenderEngine *engine, struct Scene *scene, struct ViewLayer *view_layer)
@ WORKBENCH_DATATYPE_MESH
@ WORKBENCH_DATATYPE_HAIR
@ WORKBENCH_DATATYPE_POINTCLOUD
GPUShader * workbench_shader_opaque_get(WORKBENCH_PrivateData *wpd, eWORKBENCH_DataType data)
void workbench_opaque_cache_init(WORKBENCH_Data *data)
struct WORKBENCH_ViewLayerData WORKBENCH_ViewLayerData
void workbench_shadow_cache_init(WORKBENCH_Data *data)
struct WORKBENCH_TextureList WORKBENCH_TextureList
void workbench_cache_finish(void *ved)
struct WORKBENCH_Data WORKBENCH_Data
void workbench_draw_sample(void *ved)
void workbench_dof_engine_init(WORKBENCH_Data *vedata)
void workbench_draw_finish(void *ved)
void workbench_render(void *ved, struct RenderEngine *engine, struct RenderLayer *render_layer, const struct rcti *rect)
GPUShader * workbench_shader_transparent_get(WORKBENCH_PrivateData *wpd, eWORKBENCH_DataType data)
struct WORKBENCH_PassList WORKBENCH_PassList
void workbench_update_material_ubos(WORKBENCH_PrivateData *wpd)
GPUShader * workbench_shader_outline_get(void)
void workbench_shader_depth_of_field_get(GPUShader **prepare_sh, GPUShader **downsample_sh, GPUShader **blur1_sh, GPUShader **blur2_sh, GPUShader **resolve_sh)
int workbench_antialiasing_sample_count_get(WORKBENCH_PrivateData *wpd)
void workbench_transparent_draw_depth_pass(WORKBENCH_Data *data)
struct WORKBENCH_PrivateData WORKBENCH_PrivateData
BLI_INLINE bool workbench_is_specular_highlight_enabled(WORKBENCH_PrivateData *wpd)
void workbench_antialiasing_view_updated(WORKBENCH_Data *vedata)
void workbench_volume_cache_populate(WORKBENCH_Data *vedata, struct Scene *scene, struct Object *ob, struct ModifierData *md, eV3DShadingColorType color_type)