Blender  V3.3
workbench_private.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2016 Blender Foundation. */
3 
8 #pragma once
9 
10 #include "BKE_studiolight.h"
11 
12 #include "DNA_image_types.h"
13 #include "DNA_userdef_types.h"
14 #include "DNA_view3d_types.h"
15 #include "DNA_world_types.h"
16 
17 #include "DRW_render.h"
18 
19 #include "workbench_engine.h"
20 
21 #ifdef __cplusplus
22 extern "C" {
23 #endif
24 
26 
27 #define WORKBENCH_ENGINE "BLENDER_WORKBENCH"
28 
29 #define MAX_MATERIAL (1 << 12)
30 
31 #define DEBUG_SHADOW_VOLUME 0
32 
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)
53 
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)
57 
58 struct Object;
59 struct RenderEngine;
60 struct RenderLayer;
61 struct rcti;
62 
63 typedef enum eWORKBENCH_DataType {
67 
70 
71 /* Types of volume display interpolation. */
77 
78 typedef struct WORKBENCH_FramebufferList {
81 
84 
86 
93 
99 
100 typedef struct WORKBENCH_TextureList {
113 
114 typedef struct WORKBENCH_StorageList {
116  float *dof_ubo_data;
118 
119 typedef struct WORKBENCH_PassList {
122 
126 
129 
130  struct DRWPass *shadow_ps[2];
131 
133 
136 
138 
148 
150 
157 
158 typedef struct WORKBENCH_Data {
159  void *engine_type;
165 
166 typedef struct WORKBENCH_UBO_Light {
167  float light_direction[4];
168  float specular_color[3], pad;
171 
172 typedef struct WORKBENCH_UBO_Material {
173  float base_color[3];
174  /* Packed data into a int. Decoded in the shader. */
177 
178 typedef struct WORKBENCH_UBO_World {
184  float ambient_color[4];
185 
190 
195 
198  float ui_scale;
199  float _pad0;
200 
202  int use_specular; /* Bools are 32bit ints in GLSL. */
203  int _pad1;
204  int _pad2;
206 
210 
211 typedef struct WORKBENCH_Prepass {
223 
224 typedef struct WORKBENCH_PrivateData {
236  struct Scene *scene;
245 
246  /* Shadow */
252  float shadow_mat[4][4];
253  float shadow_inv[4][4];
257  float shadow_near_min[3];
258  float shadow_near_max[3];
260  float shadow_near_sides[2][4];
261  /* Shadow shading groups. First array elem is for non-manifold geom and second for manifold. */
267 
268  /* Temporal Antialiasing */
278  float taa_weights[9];
286  struct DRWView *view;
288  float last_mat[4][4];
289 
290  /* Smart Morphological Anti-Aliasing */
296 
306 
309 
310  /* Materials */
326 
327  /* Depth of Field */
336  float dof_near_far[2];
337  float dof_blades;
339  float dof_ratio;
340 
341  /* Camera override for rendering. */
343 
351 } WORKBENCH_PrivateData; /* Transient data */
352 
353 typedef struct WORKBENCH_ObjectData {
355 
356  /* Shadow direction in local object space. */
358  /* Min, max in shadow space */
359  float shadow_min[3], shadow_max[3];
363 
364 typedef struct WORKBENCH_ViewLayerData {
379 
380 /* inline helper functions */
382 {
384  if (STUDIOLIGHT_ENABLED(wpd) || MATCAP_ENABLED(wpd)) {
386  }
387  }
388  return false;
389 }
390 
391 /* workbench_opaque.c */
392 
395 
396 /* workbench_transparent.c */
397 
405 
406 /* workbench_shadow.c */
407 
410 void workbench_shadow_cache_populate(WORKBENCH_Data *data, Object *ob, bool has_transp_mat);
411 
412 /* workbench_shader.c */
413 
417  bool tiled);
420 
424  bool tiled);
426 
428 GPUShader *workbench_shader_shadow_fail_get(bool manifold, bool cap);
429 
430 GPUShader *workbench_shader_cavity_get(bool cavity, bool curvature);
432 
435 
437  bool coba,
438  eWORKBENCH_VolumeInterpType interp_type,
439  bool smoke);
440 
443  GPUShader **blur1_sh,
444  GPUShader **blur2_sh,
445  GPUShader **resolve_sh);
446 
447 void workbench_shader_free(void);
448 
449 /* workbench_effect_antialiasing.c */
450 
460 
461 /* workbench_effect_cavity.c */
462 
466 
467 /* workbench_effect_outline.c */
468 
470 /* workbench_effect_dof.c */
471 
475 
476 /* workbench_materials.c */
477 
479  Object *ob,
480  Material *mat,
482  eV3DShadingColorType color_type);
483 
485  Object *ob,
486  int mat_nr,
487  eV3DShadingColorType color_type,
488  eWORKBENCH_DataType datatype,
489  bool *r_transp);
494  Object *ob,
495  int mat_nr,
496  Image *ima,
497  ImageUser *iuser,
499  eWORKBENCH_DataType datatype);
500 
501 #define WORKBENCH_OBJECT_DATATYPE(ob) \
502  ((ob->type == OB_POINTCLOUD) ? WORKBENCH_DATATYPE_POINTCLOUD : WORKBENCH_DATATYPE_MESH)
503 
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))
508 
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)
513 
514 /* workbench_data.c */
515 
521 
522 /* workbench_volume.c */
523 
527  struct Scene *scene,
528  struct Object *ob,
529  struct ModifierData *md,
530  eV3DShadingColorType color_type);
532 
533 /* workbench_engine.c */
534 
535 void workbench_engine_init(void *ved);
536 void workbench_cache_init(void *ved);
537 void workbench_cache_populate(void *ved, Object *ob);
538 void workbench_cache_finish(void *ved);
543 void workbench_draw_sample(void *ved);
544 void workbench_draw_finish(void *ved);
545 
546 /* workbench_render.c */
547 
548 void workbench_render(void *ved,
549  struct RenderEngine *engine,
550  struct RenderLayer *render_layer,
551  const struct rcti *rect);
552 void workbench_render_update_passes(struct RenderEngine *engine,
553  struct Scene *scene,
554  struct ViewLayer *view_layer);
555 #ifdef __cplusplus
556 }
557 #endif
eContextObjectMode
Definition: BKE_context.h:103
@ STUDIOLIGHT_SPECULAR_HIGHLIGHT_PASS
#define BLI_STATIC_ASSERT_ALIGN(st, align)
Definition: BLI_assert.h:86
#define BLI_INLINE
eV3DShadingColorType
@ V3D_SHADING_SPECULAR_HIGHLIGHT
DRWState
Definition: DRW_render.h:298
struct GPUFrameBuffer GPUFrameBuffer
struct GPUShader GPUShader
Definition: GPU_shader.h:20
eGPUShaderConfig
Definition: GPU_shader.h:364
eGPUSamplerState
Definition: GPU_texture.h:25
struct GPUTexture GPUTexture
Definition: GPU_texture.h:17
struct GPUUniformBuf GPUUniformBuf
EvaluationStage stage
Definition: deg_eval.cc:89
Scene scene
depth_tx sampler(1, ImageType::FLOAT_2D, "combined_tx") .sampler(2
struct GPUShader * downsample_sh
Definition: eevee_shaders.c:93
unsigned int uint32_t
Definition: stdint.h:80
WORKBENCH_FramebufferList * fbl
WORKBENCH_PassList * psl
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
const UserDef * preferences
struct GPUUniformBuf * material_ubo_curr
struct BLI_memblock * material_ubo_data
struct GPUTexture * object_id_tx
struct BLI_memblock * material_ubo
struct DRWShadingGroup * shadow_fail_caps_grp[2]
eGPUShaderConfig sh_cfg
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
WORKBENCH_UBO_Material * material_ubo_data_curr
struct GPUTexture * smaa_weight_tx
WORKBENCH_Prepass prepass[2][2][WORKBENCH_DATATYPE_MAX]
struct GPUTexture * accum_buffer_tx
struct GPUTexture * coc_temp_tx
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]
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)
eWORKBENCH_DataType
@ WORKBENCH_DATATYPE_MESH
@ WORKBENCH_DATATYPE_MAX
@ 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)