diff options
Diffstat (limited to 'source/blender/draw/engines/workbench/workbench_private.h')
-rw-r--r-- | source/blender/draw/engines/workbench/workbench_private.h | 670 |
1 files changed, 301 insertions, 369 deletions
diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h index bb93864966e..a68b66e0f85 100644 --- a/source/blender/draw/engines/workbench/workbench_private.h +++ b/source/blender/draw/engines/workbench/workbench_private.h @@ -34,16 +34,14 @@ #include "workbench_engine.h" +extern struct DrawEngineType draw_engine_workbench; + #define WORKBENCH_ENGINE "BLENDER_WORKBENCH" -#define MAX_COMPOSITE_SHADERS (1 << 7) -#define MAX_PREPASS_SHADERS (1 << 8) -#define MAX_ACCUM_SHADERS (1 << 8) -#define MAX_CAVITY_SHADERS (1 << 3) - -#define TEXTURE_DRAWING_ENABLED(wpd) (wpd->shading.color_type == V3D_SHADING_TEXTURE_COLOR) -#define VERTEX_COLORS_ENABLED(wpd) (wpd->shading.color_type == V3D_SHADING_VERTEX_COLOR) -#define MATERIAL_COLORS_ENABLED(wpd) (wpd->shading.color_type == V3D_SHADING_MATERIAL_COLOR) -#define FLAT_ENABLED(wpd) (wpd->shading.light == V3D_LIGHTING_FLAT) + +#define MAX_MATERIAL (1 << 12) + +#define DEBUG_SHADOW_VOLUME 0 + #define STUDIOLIGHT_ENABLED(wpd) (wpd->shading.light == V3D_LIGHTING_STUDIO) #define MATCAP_ENABLED(wpd) (wpd->shading.light == V3D_LIGHTING_MATCAP) #define USE_WORLD_ORIENTATION(wpd) ((wpd->shading.flag & V3D_SHADING_WORLD_ORIENTATION) != 0) @@ -63,45 +61,24 @@ (wpd->shading.cavity_type == V3D_SHADING_CAVITY_BOTH))) #define CAVITY_ENABLED(wpd) (CURVATURE_ENABLED(wpd) || SSAO_ENABLED(wpd)) #define SHADOW_ENABLED(wpd) (wpd->shading.flag & V3D_SHADING_SHADOW) -#define GHOST_ENABLED(psl) \ - (!DRW_pass_is_empty(psl->ghost_prepass_pass) || !DRW_pass_is_empty(psl->ghost_prepass_hair_pass)) #define CULL_BACKFACE_ENABLED(wpd) ((wpd->shading.flag & V3D_SHADING_BACKFACE_CULLING) != 0) -#define OIT_ENABLED(wpd) \ - (ELEM(wpd->shading.color_type, \ - V3D_SHADING_MATERIAL_COLOR, \ - V3D_SHADING_OBJECT_COLOR, \ - V3D_SHADING_TEXTURE_COLOR, \ - V3D_SHADING_VERTEX_COLOR)) - -#define IS_NAVIGATING(wpd) \ - ((DRW_context_state_get()->rv3d) && \ - (DRW_context_state_get()->rv3d->rflag & (RV3D_NAVIGATING | RV3D_PAINTING))) #define OBJECT_OUTLINE_ENABLED(wpd) (wpd->shading.flag & V3D_SHADING_OBJECT_OUTLINE) #define OBJECT_ID_PASS_ENABLED(wpd) (OBJECT_OUTLINE_ENABLED(wpd) || CURVATURE_ENABLED(wpd)) -#define NORMAL_VIEWPORT_COMP_PASS_ENABLED(wpd) \ - (MATCAP_ENABLED(wpd) || STUDIOLIGHT_ENABLED(wpd) || SHADOW_ENABLED(wpd)) -#define NORMAL_VIEWPORT_PASS_ENABLED(wpd) \ - (NORMAL_VIEWPORT_COMP_PASS_ENABLED(wpd) || SSAO_ENABLED(wpd) || CURVATURE_ENABLED(wpd)) #define NORMAL_ENCODING_ENABLED() (true) -#define WORLD_CLIPPING_ENABLED(wpd) (wpd->world_clip_planes != NULL) struct RenderEngine; struct RenderLayer; struct rcti; typedef struct WORKBENCH_FramebufferList { - /* Deferred render buffers */ - struct GPUFrameBuffer *prepass_fb; - struct GPUFrameBuffer *ghost_prepass_fb; - struct GPUFrameBuffer *cavity_fb; - struct GPUFrameBuffer *composite_fb; - struct GPUFrameBuffer *id_clear_fb; + struct GPUFrameBuffer *opaque_fb; + struct GPUFrameBuffer *opaque_infront_fb; - struct GPUFrameBuffer *effect_fb; - struct GPUFrameBuffer *effect_taa_fb; - struct GPUFrameBuffer *depth_buffer_fb; - struct GPUFrameBuffer *color_only_fb; + struct GPUFrameBuffer *transp_accum_fb; + struct GPUFrameBuffer *transp_accum_infront_fb; + + struct GPUFrameBuffer *id_clear_fb; struct GPUFrameBuffer *dof_downsample_fb; struct GPUFrameBuffer *dof_coc_tile_h_fb; @@ -110,10 +87,9 @@ typedef struct WORKBENCH_FramebufferList { struct GPUFrameBuffer *dof_blur1_fb; struct GPUFrameBuffer *dof_blur2_fb; - /* Forward render buffers */ - struct GPUFrameBuffer *object_outline_fb; - struct GPUFrameBuffer *transparent_accum_fb; - struct GPUFrameBuffer *transparent_revealage_fb; + struct GPUFrameBuffer *antialiasing_fb; + struct GPUFrameBuffer *smaa_edge_fb; + struct GPUFrameBuffer *smaa_weight_fb; } WORKBENCH_FramebufferList; typedef struct WORKBENCH_TextureList { @@ -121,34 +97,35 @@ typedef struct WORKBENCH_TextureList { struct GPUTexture *coc_halfres_tx; struct GPUTexture *history_buffer_tx; struct GPUTexture *depth_buffer_tx; + struct GPUTexture *smaa_search_tx; + struct GPUTexture *smaa_area_tx; + struct GPUTexture *dummy_image_tx; + struct GPUTexture *dummy_volume_tx; + struct GPUTexture *dummy_coba_tx; } WORKBENCH_TextureList; typedef struct WORKBENCH_StorageList { - struct WORKBENCH_PrivateData *g_data; - struct WORKBENCH_EffectInfo *effects; + struct WORKBENCH_PrivateData *wpd; float *dof_ubo_data; } WORKBENCH_StorageList; typedef struct WORKBENCH_PassList { - /* deferred rendering */ - struct DRWPass *prepass_pass; - struct DRWPass *prepass_hair_pass; - struct DRWPass *ghost_prepass_pass; - struct DRWPass *ghost_prepass_hair_pass; - struct DRWPass *cavity_pass; - struct DRWPass *shadow_depth_pass_pass; - struct DRWPass *shadow_depth_pass_mani_pass; - struct DRWPass *shadow_depth_fail_pass; - struct DRWPass *shadow_depth_fail_mani_pass; - struct DRWPass *shadow_depth_fail_caps_pass; - struct DRWPass *shadow_depth_fail_caps_mani_pass; - struct DRWPass *composite_pass; - struct DRWPass *composite_shadow_pass; - struct DRWPass *oit_composite_pass; - struct DRWPass *background_pass; - struct DRWPass *background_pass_clip; - struct DRWPass *ghost_resolve_pass; - struct DRWPass *effect_aa_pass; + struct DRWPass *opaque_ps; + struct DRWPass *opaque_infront_ps; + + struct DRWPass *transp_resolve_ps; + struct DRWPass *transp_accum_ps; + struct DRWPass *transp_accum_infront_ps; + + struct DRWPass *shadow_ps[2]; + + struct DRWPass *merge_infront_ps; + + struct DRWPass *cavity_ps; + struct DRWPass *outline_ps; + + struct DRWPass *composite_ps; + struct DRWPass *dof_down_ps; struct DRWPass *dof_down2_ps; struct DRWPass *dof_flatten_v_ps; @@ -158,12 +135,13 @@ typedef struct WORKBENCH_PassList { struct DRWPass *dof_blur1_ps; struct DRWPass *dof_blur2_ps; struct DRWPass *dof_resolve_ps; - struct DRWPass *volume_pass; - /* forward rendering */ - struct DRWPass *transparent_accum_pass; - struct DRWPass *object_outline_pass; - struct DRWPass *depth_pass; + struct DRWPass *volume_ps; + + struct DRWPass *aa_accum_ps; + struct DRWPass *aa_edge_ps; + struct DRWPass *aa_weight_ps; + struct DRWPass *aa_resolve_ps; } WORKBENCH_PassList; typedef struct WORKBENCH_Data { @@ -180,84 +158,164 @@ typedef struct WORKBENCH_UBO_Light { float diffuse_color[3], wrapped; } WORKBENCH_UBO_Light; +typedef struct WORKBENCH_UBO_Material { + float base_color[3]; + /* Packed data into a int. Decoded in the shader. */ + uint32_t packed_data; +} WORKBENCH_UBO_Material; + typedef struct WORKBENCH_UBO_World { + float viewvecs[3][4]; + float viewport_size[2], viewport_size_inv[2]; float object_outline_color[4]; float shadow_direction_vs[4]; + float shadow_focus, shadow_shift, shadow_mul, shadow_add; WORKBENCH_UBO_Light lights[4]; float ambient_color[4]; - int num_lights; - int matcap_orientation; + + int cavity_sample_start; + int cavity_sample_end; + float cavity_sample_count_inv; + float cavity_jitter_scale; + + float cavity_valley_factor; + float cavity_ridge_factor; + float cavity_attenuation; + float cavity_distance; + float curvature_ridge; float curvature_valley; + float ui_scale; + float _pad0; + + int matcap_orientation; + int use_specular; /* Bools are 32bit ints in GLSL. */ + int _pad1; + int _pad2; } WORKBENCH_UBO_World; + BLI_STATIC_ASSERT_ALIGN(WORKBENCH_UBO_World, 16) +BLI_STATIC_ASSERT_ALIGN(WORKBENCH_UBO_Light, 16) +BLI_STATIC_ASSERT_ALIGN(WORKBENCH_UBO_Material, 16) -typedef struct WORKBENCH_PrivateData { +typedef struct WORKBENCH_Prepass { + /** Hash storing shading group for each Material or GPUTexture to reduce state changes. */ struct GHash *material_hash; - struct GHash *material_transp_hash; - struct GPUShader *prepass_sh; - struct GPUShader *prepass_hair_sh; - struct GPUShader *prepass_uniform_sh; - struct GPUShader *prepass_uniform_hair_sh; - struct GPUShader *prepass_textured_sh; - struct GPUShader *prepass_textured_array_sh; - struct GPUShader *prepass_vertex_sh; - struct GPUShader *composite_sh; - struct GPUShader *background_sh; - struct GPUShader *transparent_accum_sh; - struct GPUShader *transparent_accum_hair_sh; - struct GPUShader *transparent_accum_uniform_sh; - struct GPUShader *transparent_accum_uniform_hair_sh; - struct GPUShader *transparent_accum_textured_sh; - struct GPUShader *transparent_accum_textured_array_sh; - struct GPUShader *transparent_accum_vertex_sh; + /** First common (non-vcol and non-image colored) shading group to created subgroups. */ + struct DRWShadingGroup *common_shgrp; + /** First Vertex Color shading group to created subgroups. */ + struct DRWShadingGroup *vcol_shgrp; + /** First Image shading group to created subgroups. */ + struct DRWShadingGroup *image_shgrp; + /** First UDIM (tiled image) shading group to created subgroups. */ + struct DRWShadingGroup *image_tiled_shgrp; +} WORKBENCH_Prepass; + +typedef struct WORKBENCH_PrivateData { + /** ViewLayerData for faster access. */ + struct WORKBENCH_ViewLayerData *vldata; + /** Copy of draw_ctx->sh_cfg for faster access. */ + eGPUShaderConfig sh_cfg; + /** Global clip and cull states. */ + DRWState clip_state, cull_state; + /** Copy of scene->display.shading or v3d->shading for viewport. */ View3DShading shading; + /** Chosen studiolight or matcap. */ StudioLight *studio_light; + /** Copy of ctx_draw->scene for faster access. */ + struct Scene *scene; + /** Shorthand version of U global for user preferences. */ const UserDef *preferences; - /* Does this instance owns the `world_ubo` field. - * Normally the field is borrowed from `WORKBENCH_WorldData`. In case that - * there is no World attached to the scene the UBO cannot be cached and should - * be freed after using. */ - bool is_world_ubo_owner; + /** Copy of context mode for faster access. */ + eContextObjectMode ctx_mode; + /** Shorthand for wpd->vldata->world_ubo. */ struct GPUUniformBuffer *world_ubo; - struct DRWShadingGroup *shadow_shgrp; - struct DRWShadingGroup *depth_shgrp; - WORKBENCH_UBO_World world_data; - float shadow_multiplier; - float shadow_shift; - float shadow_focus; - float cached_shadow_direction[3]; + /** Background color to clear the color buffer with. */ + float background_color[4]; + + /* Shadow */ + /** Previous shadow direction to test if shadow has changed. */ + float shadow_cached_direction[3]; + /** Current shadow direction in world space. */ + float shadow_direction_ws[3]; + /** Shadow precomputed matrices. */ float shadow_mat[4][4]; float shadow_inv[4][4]; - /* Far plane of the view frustum. */ + /** Far plane of the view frustum. Used for shadow volume extrusion. */ float shadow_far_plane[4]; - /* Near plane corners in shadow space. */ - float shadow_near_corners[4][3]; - /* min and max of shadow_near_corners. allow fast test */ + /** Min and max of shadow_near_corners. Speed up culling test. */ float shadow_near_min[3]; float shadow_near_max[3]; - /* This is a parallelogram, so only 2 normal and distance to the edges. */ + /** This is a parallelogram, so only 2 normal and distance to the edges. */ float shadow_near_sides[2][4]; + /* Shadow shading groups. First array elem is for non-manifold geom and second for manifold. */ + struct DRWShadingGroup *shadow_pass_grp[2]; + struct DRWShadingGroup *shadow_fail_grp[2]; + struct DRWShadingGroup *shadow_fail_caps_grp[2]; + /** If the shadow has changed direction and ob bboxes needs to be updated. */ bool shadow_changed; - bool is_playback; - float (*world_clip_planes)[4]; + /* Temporal Antialiasing */ + /** Total number of samples to after which TAA stops accumulating samples. */ + int taa_sample_len; + /** Current TAA sample index in [0..taa_sample_len[ range. */ + int taa_sample; + /** Inverse of taa_sample to divide the accumulation buffer. */ + float taa_sample_inv; + /** If the view has been updated and TAA needs to be reset. */ + bool view_updated; + /** View */ + struct DRWView *view; + /** Last projection matrix to see if view is still valid. */ + float last_mat[4][4]; + + /* Smart Morphological Anti-Aliasing */ + /** Temp buffers to store edges and weights. */ + struct GPUTexture *smaa_edge_tx; + struct GPUTexture *smaa_weight_tx; + /** Weight of the smaa pass. */ + float smaa_mix_factor; + + /** Opaque pipeline buffers. */ + struct GPUTexture *material_buffer_tx; + struct GPUTexture *composite_buffer_tx; + struct GPUTexture *normal_buffer_tx; + /** Transparent pipeline buffers. */ + struct GPUTexture *accum_buffer_tx; + struct GPUTexture *reveal_buffer_tx; + /** Object IDs buffer for curvature & outline. */ + struct GPUTexture *object_id_tx; + + /** Prepass infos for each draw types [transparent][infront][hair]. */ + WORKBENCH_Prepass prepass[2][2][2]; + + /* Materials */ + /** Copy of vldata->material_ubo for faster access. */ + struct BLI_memblock *material_ubo; + /** Copy of vldata->material_ubo_data for faster access. */ + struct BLI_memblock *material_ubo_data; + /** Current material chunk being filled by workbench_material_setup_ex(). */ + WORKBENCH_UBO_Material *material_ubo_data_curr; + struct GPUUniformBuffer *material_ubo_curr; + /** Copy of txl->dummy_image_tx for faster access. */ + struct GPUTexture *dummy_image_tx; + /** Total number of used material chunk. */ + int material_chunk_count; + /** Index of current material chunk. */ + int material_chunk_curr; + /** Index of current material inside the material chunk. Only for material coloring mode. */ + int material_index; /* Volumes */ - bool volumes_do; + /** List of smoke domain textures to free after drawing. */ ListBase smoke_domains; - /* Ssao */ - float winmat[4][4]; - float viewvecs[3][4]; - float ssao_params[4]; - float ssao_settings[4]; - - /* Dof */ + /* Depth of Field */ + /** Depth of field temp buffers. */ struct GPUTexture *dof_blur_tx; struct GPUTexture *coc_temp_tx; struct GPUTexture *coc_tiles_tx[2]; - struct GPUUniformBuffer *dof_ubo; + /** Depth of field parameters. */ float dof_aperturesize; float dof_distance; float dof_invsensorsize; @@ -265,37 +323,15 @@ typedef struct WORKBENCH_PrivateData { float dof_blades; float dof_rotation; float dof_ratio; - bool dof_enabled; - /* Color Management */ - bool use_color_management; - bool use_color_render_settings; + /** True if any volume needs to be rendered. */ + bool volumes_do; + /** Convenience boolean. */ + bool dof_enabled; + bool is_playback; + bool is_navigating; } WORKBENCH_PrivateData; /* Transient data */ -typedef struct WORKBENCH_EffectInfo { - /** View */ - struct DRWView *view; - /** Last projection matrix to see if view is still valid. */ - float last_mat[4][4]; - int jitter_index; - float taa_mix_factor; - bool view_updated; -} WORKBENCH_EffectInfo; - -typedef struct WORKBENCH_MaterialData { - float base_color[3], metallic; - float roughness, alpha; - eV3DShadingColorType color_type; - int interp; - Image *ima; - ImageUser *iuser; - - /* Linked shgroup for drawing */ - DRWShadingGroup *shgrp; - /* forward rendering */ - DRWShadingGroup *shgrp_object_outline; -} WORKBENCH_MaterialData; - typedef struct WORKBENCH_ObjectData { DrawData dd; @@ -307,20 +343,21 @@ typedef struct WORKBENCH_ObjectData { bool shadow_bbox_dirty; } WORKBENCH_ObjectData; -typedef struct WORKBENCH_WorldData { - DrawData dd; - /* The cached `GPUUniformBuffer`, that is reused between draw calls. */ +typedef struct WORKBENCH_ViewLayerData { + /** Depth of field sample location array.*/ + struct GPUUniformBuffer *dof_sample_ubo; + /** All constant data used for a render loop.*/ struct GPUUniformBuffer *world_ubo; -} WORKBENCH_WorldData; - -/* Enumeration containing override options for base color rendering. - * This is used to during painting to force the base color to show what you are - * painting using the selected lighting model. */ -typedef enum WORKBENCH_ColorOverride { - WORKBENCH_COLOR_OVERRIDE_OFF = 0, - WORKBENCH_COLOR_OVERRIDE_TEXTURE = CTX_MODE_PAINT_TEXTURE, - WORKBENCH_COLOR_OVERRIDE_VERTEX = CTX_MODE_PAINT_VERTEX, -} WORKBENCH_ColorOverride; + /** Cavity sample location array.*/ + struct GPUUniformBuffer *cavity_sample_ubo; + /** Blue noise texture used to randomize the sampling of some effects.*/ + struct GPUTexture *cavity_jitter_tx; + /** Materials ubos allocated in a memblock for easy bookeeping. */ + struct BLI_memblock *material_ubo; + struct BLI_memblock *material_ubo_data; + /** Number of samples for which cavity_sample_ubo is valid. */ + int cavity_sample_count; +} WORKBENCH_ViewLayerData; /* inline helper functions */ BLI_INLINE bool workbench_is_specular_highlight_enabled(WORKBENCH_PrivateData *wpd) @@ -333,234 +370,129 @@ BLI_INLINE bool workbench_is_specular_highlight_enabled(WORKBENCH_PrivateData *w return false; } -BLI_INLINE bool workbench_is_taa_enabled(WORKBENCH_PrivateData *wpd) -{ - if (DRW_state_is_image_render()) { - const DRWContextState *draw_ctx = DRW_context_state_get(); - if (draw_ctx->v3d) { - return draw_ctx->scene->display.viewport_aa > SCE_DISPLAY_AA_FXAA; - } - else { - return draw_ctx->scene->display.render_aa > SCE_DISPLAY_AA_FXAA; - } - } - else { - return !(IS_NAVIGATING(wpd) || wpd->is_playback) && - wpd->preferences->viewport_aa > SCE_DISPLAY_AA_FXAA; - } -} - -BLI_INLINE bool workbench_is_fxaa_enabled(WORKBENCH_PrivateData *wpd) -{ - if (DRW_state_is_image_render()) { - const DRWContextState *draw_ctx = DRW_context_state_get(); - if (draw_ctx->v3d) { - return draw_ctx->scene->display.viewport_aa == SCE_DISPLAY_AA_FXAA; - } - else { - return draw_ctx->scene->display.render_aa == SCE_DISPLAY_AA_FXAA; - } - } - else { - if (wpd->preferences->viewport_aa == SCE_DISPLAY_AA_FXAA) { - return true; - } - - /* when navigating or animation playback use FXAA if scene uses TAA. */ - return (IS_NAVIGATING(wpd) || wpd->is_playback) && - wpd->preferences->viewport_aa > SCE_DISPLAY_AA_FXAA; - } -} - -/** Is texture paint mode enabled (globally) */ -BLI_INLINE bool workbench_is_in_texture_paint_mode(void) -{ - const DRWContextState *draw_ctx = DRW_context_state_get(); - return draw_ctx->object_mode == OB_MODE_TEXTURE_PAINT; -} - -/** Is vertex paint mode enabled (globally) */ -BLI_INLINE bool workbench_is_in_vertex_paint_mode(void) -{ - const DRWContextState *draw_ctx = DRW_context_state_get(); - return draw_ctx->object_mode == OB_MODE_VERTEX_PAINT; -} - -/* Must the `View3DShading.color_type` be overriden for the given object. */ -BLI_INLINE WORKBENCH_ColorOverride workbench_object_color_override_get(Object *ob) -{ - const DRWContextState *draw_ctx = DRW_context_state_get(); - if (ob->type == OB_MESH && (draw_ctx->obact == ob)) { - const enum eContextObjectMode mode = CTX_data_mode_enum_ex( - draw_ctx->object_edit, draw_ctx->obact, draw_ctx->object_mode); - if (mode == CTX_MODE_PAINT_TEXTURE) { - return WORKBENCH_COLOR_OVERRIDE_TEXTURE; - } - else if (mode == CTX_MODE_PAINT_VERTEX) { - return WORKBENCH_COLOR_OVERRIDE_VERTEX; - } - } - - return WORKBENCH_COLOR_OVERRIDE_OFF; -} - -BLI_INLINE bool workbench_is_matdata_pass_enabled(WORKBENCH_PrivateData *wpd) -{ - return (wpd->shading.color_type != V3D_SHADING_SINGLE_COLOR || MATCAP_ENABLED(wpd)) || - workbench_is_in_texture_paint_mode() || workbench_is_in_vertex_paint_mode(); -} - -/** - * Get the default texture format to be used by the color and history buffers. - * - * Use GPU_RGBA16F for final renderings and for drawing textures. This - * allows displaying HDRI textures. Vertex Colors uses GPU_RGBA16 to resolve - * color banding issues (T66100). All other modes use GPU_RGBA8 to reduce - * bandwidth and gpu memory. - */ -BLI_INLINE eGPUTextureFormat workbench_color_texture_format(const WORKBENCH_PrivateData *wpd) -{ - eGPUTextureFormat result; - if (DRW_state_is_image_render() || workbench_is_in_texture_paint_mode() || - TEXTURE_DRAWING_ENABLED(wpd)) { - result = GPU_RGBA16F; - } - else { - result = GPU_RGBA16; - } - return result; -} - -/* workbench_deferred.c */ -void workbench_deferred_engine_init(WORKBENCH_Data *vedata); -void workbench_deferred_engine_free(void); -void workbench_deferred_draw_scene(WORKBENCH_Data *vedata); -void workbench_deferred_draw_finish(WORKBENCH_Data *vedata); -void workbench_deferred_cache_init(WORKBENCH_Data *vedata); -void workbench_deferred_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob); -void workbench_deferred_cache_finish(WORKBENCH_Data *vedata); - -/* workbench_forward.c */ -void workbench_forward_engine_init(WORKBENCH_Data *vedata); -void workbench_forward_engine_free(void); -void workbench_forward_draw_scene(WORKBENCH_Data *vedata); -void workbench_forward_draw_finish(WORKBENCH_Data *vedata); -void workbench_forward_cache_init(WORKBENCH_Data *vedata); -void workbench_forward_cache_populate(WORKBENCH_Data *vedata, Object *ob); -void workbench_forward_cache_finish(WORKBENCH_Data *vedata); - -/* For OIT in deferred */ -void workbench_forward_outline_shaders_ensure(WORKBENCH_PrivateData *wpd, eGPUShaderConfig sh_cfg); -void workbench_forward_choose_shaders(WORKBENCH_PrivateData *wpd, eGPUShaderConfig sh_cfg); -WORKBENCH_MaterialData *workbench_forward_get_or_create_material_data( - WORKBENCH_Data *vedata, - Object *ob, - Material *mat, - Image *ima, - ImageUser *iuser, - eV3DShadingColorType color_type, - int interp); - -/* workbench_effect_aa.c */ -void workbench_aa_create_pass(WORKBENCH_Data *vedata, GPUTexture **tx); -void workbench_aa_draw_pass(WORKBENCH_Data *vedata, GPUTexture *tx); - -/* workbench_effect_fxaa.c */ -void workbench_fxaa_engine_init(void); -void workbench_fxaa_engine_free(void); -DRWPass *workbench_fxaa_create_pass(GPUTexture **color_buffer_tx); - -/* workbench_effect_taa.c */ -void workbench_taa_engine_init(WORKBENCH_Data *vedata); -void workbench_taa_engine_free(void); -DRWPass *workbench_taa_create_pass(WORKBENCH_Data *vedata, GPUTexture **color_buffer_tx); -void workbench_taa_draw_scene_start(WORKBENCH_Data *vedata); -void workbench_taa_draw_scene_end(WORKBENCH_Data *vedata); -void workbench_taa_view_updated(WORKBENCH_Data *vedata); -int workbench_taa_calculate_num_iterations(WORKBENCH_Data *vedata); -int workbench_num_viewport_rendering_iterations(WORKBENCH_Data *vedata); - +/* workbench_opaque.c */ +void workbench_opaque_engine_init(WORKBENCH_Data *data); +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); +void workbench_transparent_draw_depth_pass(WORKBENCH_Data *data); + +/* workbench_shadow.c */ +void workbench_shadow_data_update(WORKBENCH_PrivateData *wpd, WORKBENCH_UBO_World *wd); +void workbench_shadow_cache_init(WORKBENCH_Data *data); +void workbench_shadow_cache_populate(WORKBENCH_Data *data, Object *ob, const bool has_transp_mat); + +/* workbench_shader.c */ +GPUShader *workbench_shader_opaque_get(WORKBENCH_PrivateData *wpd, bool hair); +GPUShader *workbench_shader_opaque_image_get(WORKBENCH_PrivateData *wpd, bool hair, bool tiled); +GPUShader *workbench_shader_composite_get(WORKBENCH_PrivateData *wpd); +GPUShader *workbench_shader_merge_infront_get(WORKBENCH_PrivateData *wpd); + +GPUShader *workbench_shader_transparent_get(WORKBENCH_PrivateData *wpd, bool hair); +GPUShader *workbench_shader_transparent_image_get(WORKBENCH_PrivateData *wpd, + bool hair, + bool tiled); +GPUShader *workbench_shader_transparent_resolve_get(WORKBENCH_PrivateData *wpd); + +GPUShader *workbench_shader_shadow_pass_get(bool manifold); +GPUShader *workbench_shader_shadow_fail_get(bool manifold, bool cap); + +GPUShader *workbench_shader_cavity_get(bool cavity, bool curvature); +GPUShader *workbench_shader_outline_get(void); + +GPUShader *workbench_shader_antialiasing_accumulation_get(void); +GPUShader *workbench_shader_antialiasing_get(int stage); + +GPUShader *workbench_shader_volume_get(bool slice, bool coba, bool cubic); + +void workbench_shader_depth_of_field_get(GPUShader **prepare_sh, + GPUShader **downsample_sh, + GPUShader **blur1_sh, + GPUShader **blur2_sh, + GPUShader **resolve_sh); + +void workbench_shader_library_ensure(void); +void workbench_shader_free(void); + +/* workbench_effect_antialiasing.c */ +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); +bool workbench_antialiasing_setup(WORKBENCH_Data *vedata); +void workbench_antialiasing_draw_pass(WORKBENCH_Data *vedata); + +/* workbench_effect_cavity.c */ +void workbench_cavity_data_update(WORKBENCH_PrivateData *wpd, WORKBENCH_UBO_World *wd); +void workbench_cavity_samples_ubo_ensure(WORKBENCH_PrivateData *wpd); +void workbench_cavity_cache_init(WORKBENCH_Data *data); + +/* workbench_effect_outline.c */ +void workbench_outline_cache_init(WORKBENCH_Data *data); /* workbench_effect_dof.c */ -void workbench_dof_engine_init(WORKBENCH_Data *vedata, Object *camera); -void workbench_dof_engine_free(void); -void workbench_dof_create_pass(WORKBENCH_Data *vedata, - GPUTexture **dof_input, - GPUTexture *noise_tex); +void workbench_dof_engine_init(WORKBENCH_Data *vedata); +void workbench_dof_cache_init(WORKBENCH_Data *vedata); void workbench_dof_draw_pass(WORKBENCH_Data *vedata); /* workbench_materials.c */ -eV3DShadingColorType workbench_material_determine_color_type(WORKBENCH_PrivateData *wpd, - Image *ima, - Object *ob, - bool use_sculpt_pbvh); -void workbench_material_get_image_and_mat( - Object *ob, int mat_nr, Image **r_image, ImageUser **r_iuser, int *r_interp, Material **r_mat); -char *workbench_material_build_defines(WORKBENCH_PrivateData *wpd, - bool is_uniform_color, - bool is_hair, - bool is_tiled, - const WORKBENCH_ColorOverride color_override); -void workbench_material_update_data(WORKBENCH_PrivateData *wpd, - Object *ob, - Material *mat, - WORKBENCH_MaterialData *data, - int color_type); -uint workbench_material_get_hash(WORKBENCH_MaterialData *material_template, bool is_ghost); -int workbench_material_get_composite_shader_index(WORKBENCH_PrivateData *wpd); -int workbench_material_get_prepass_shader_index(WORKBENCH_PrivateData *wpd, - bool is_uniform_color, - bool is_hair, - bool is_tiled, - const WORKBENCH_ColorOverride color_override); -int workbench_material_get_accum_shader_index(WORKBENCH_PrivateData *wpd, - bool is_uniform_color, - bool is_hair, - bool is_tiled, - const WORKBENCH_ColorOverride color_override); -void workbench_material_shgroup_uniform(WORKBENCH_PrivateData *wpd, - DRWShadingGroup *grp, - WORKBENCH_MaterialData *material, - Object *ob, - const bool deferred, - const bool is_tiled, - const int interp); -void workbench_material_copy(WORKBENCH_MaterialData *dest_material, - const WORKBENCH_MaterialData *source_material); - -/* workbench_studiolight.c */ -void studiolight_update_world(WORKBENCH_PrivateData *wpd, - StudioLight *sl, - WORKBENCH_UBO_World *wd); -void studiolight_update_light(WORKBENCH_PrivateData *wpd, const float light_direction[3]); -bool studiolight_object_cast_visible_shadow(WORKBENCH_PrivateData *wpd, - Object *ob, - WORKBENCH_ObjectData *oed); -float studiolight_object_shadow_distance(WORKBENCH_PrivateData *wpd, - Object *ob, - WORKBENCH_ObjectData *oed); -bool studiolight_camera_in_object_shadow(WORKBENCH_PrivateData *wpd, - Object *ob, - WORKBENCH_ObjectData *oed); +void workbench_material_ubo_data(WORKBENCH_PrivateData *wpd, + Object *ob, + Material *mat, + WORKBENCH_UBO_Material *data, + eV3DShadingColorType color_type); + +DRWShadingGroup *workbench_material_setup_ex(WORKBENCH_PrivateData *wpd, + Object *ob, + int mat_nr, + eV3DShadingColorType color_type, + bool hair, + bool *r_transp); +DRWShadingGroup *workbench_image_setup_ex(WORKBENCH_PrivateData *wpd, + Object *ob, + int mat_nr, + Image *ima, + ImageUser *iuser, + int interp, + bool hair); + +#define workbench_material_setup(wpd, ob, mat_nr, color_type, r_transp) \ + workbench_material_setup_ex(wpd, ob, mat_nr, color_type, false, r_transp) +#define workbench_image_setup(wpd, ob, mat_nr, ima, iuser, interp) \ + workbench_image_setup_ex(wpd, ob, mat_nr, ima, iuser, interp, false) + +#define workbench_material_hair_setup(wpd, ob, mat_nr, color_type) \ + workbench_material_setup_ex(wpd, ob, mat_nr, color_type, true, 0) +#define workbench_image_hair_setup(wpd, ob, mat_nr, ima, iuser, interp) \ + workbench_image_setup_ex(wpd, ob, mat_nr, ima, iuser, interp, true) /* workbench_data.c */ -void workbench_effect_info_init(WORKBENCH_EffectInfo *effect_info); void workbench_private_data_init(WORKBENCH_PrivateData *wpd); -void workbench_private_data_free(WORKBENCH_PrivateData *wpd); -void workbench_private_data_get_light_direction(float r_light_direction[3]); -void workbench_clear_color_get(float color[4]); +void workbench_update_world_ubo(WORKBENCH_PrivateData *wpd); +void workbench_update_material_ubos(WORKBENCH_PrivateData *wpd); +struct GPUUniformBuffer *workbench_material_ubo_alloc(WORKBENCH_PrivateData *wpd); /* workbench_volume.c */ -void workbench_volume_engine_init(void); -void workbench_volume_engine_free(void); +void workbench_volume_engine_init(WORKBENCH_Data *vedata); void workbench_volume_cache_init(WORKBENCH_Data *vedata); void workbench_volume_cache_populate(WORKBENCH_Data *vedata, - Scene *scene, - Object *ob, + struct Scene *UNUSED(scene), + struct Object *ob, struct ModifierData *md); -void workbench_volume_smoke_textures_free(WORKBENCH_PrivateData *wpd); +void workbench_volume_draw_pass(WORKBENCH_Data *vedata); +void workbench_volume_draw_finish(WORKBENCH_Data *vedata); + +/* workbench_engine.c */ +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); +void workbench_draw_sample(void *ved); +void workbench_draw_finish(void *ved); /* workbench_render.c */ -void workbench_render(WORKBENCH_Data *vedata, +void workbench_render(void *ved, struct RenderEngine *engine, struct RenderLayer *render_layer, const struct rcti *rect); |