Blender  V2.93
workbench_private.h
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * Copyright 2016, Blender Foundation.
17  */
18 
23 #pragma once
24 
25 #include "BKE_studiolight.h"
26 
27 #include "DNA_image_types.h"
28 #include "DNA_userdef_types.h"
29 #include "DNA_view3d_types.h"
30 #include "DNA_world_types.h"
31 
32 #include "DRW_render.h"
33 
34 #include "workbench_engine.h"
35 
36 #ifdef __cplusplus
37 extern "C" {
38 #endif
39 
41 
42 #define WORKBENCH_ENGINE "BLENDER_WORKBENCH"
43 
44 #define MAX_MATERIAL (1 << 12)
45 
46 #define DEBUG_SHADOW_VOLUME 0
47 
48 #define STUDIOLIGHT_ENABLED(wpd) (wpd->shading.light == V3D_LIGHTING_STUDIO)
49 #define MATCAP_ENABLED(wpd) (wpd->shading.light == V3D_LIGHTING_MATCAP)
50 #define USE_WORLD_ORIENTATION(wpd) ((wpd->shading.flag & V3D_SHADING_WORLD_ORIENTATION) != 0)
51 #define STUDIOLIGHT_TYPE_WORLD_ENABLED(wpd) \
52  (STUDIOLIGHT_ENABLED(wpd) && (wpd->studio_light->flag & STUDIOLIGHT_TYPE_WORLD))
53 #define STUDIOLIGHT_TYPE_STUDIO_ENABLED(wpd) \
54  (STUDIOLIGHT_ENABLED(wpd) && (wpd->studio_light->flag & STUDIOLIGHT_TYPE_STUDIO))
55 #define STUDIOLIGHT_TYPE_MATCAP_ENABLED(wpd) \
56  (MATCAP_ENABLED(wpd) && (wpd->studio_light->flag & STUDIOLIGHT_TYPE_MATCAP))
57 #define SSAO_ENABLED(wpd) \
58  ((wpd->shading.flag & V3D_SHADING_CAVITY) && \
59  ((wpd->shading.cavity_type == V3D_SHADING_CAVITY_SSAO) || \
60  (wpd->shading.cavity_type == V3D_SHADING_CAVITY_BOTH)))
61 #define CURVATURE_ENABLED(wpd) \
62  ((wpd->shading.flag & V3D_SHADING_CAVITY) && \
63  ((wpd->shading.cavity_type == V3D_SHADING_CAVITY_CURVATURE) || \
64  (wpd->shading.cavity_type == V3D_SHADING_CAVITY_BOTH)))
65 #define CAVITY_ENABLED(wpd) (CURVATURE_ENABLED(wpd) || SSAO_ENABLED(wpd))
66 #define SHADOW_ENABLED(wpd) (wpd->shading.flag & V3D_SHADING_SHADOW)
67 #define CULL_BACKFACE_ENABLED(wpd) ((wpd->shading.flag & V3D_SHADING_BACKFACE_CULLING) != 0)
68 
69 #define OBJECT_OUTLINE_ENABLED(wpd) (wpd->shading.flag & V3D_SHADING_OBJECT_OUTLINE)
70 #define OBJECT_ID_PASS_ENABLED(wpd) (OBJECT_OUTLINE_ENABLED(wpd) || CURVATURE_ENABLED(wpd))
71 #define NORMAL_ENCODING_ENABLED() (true)
72 
73 struct Object;
74 struct RenderEngine;
75 struct RenderLayer;
76 struct rcti;
77 
78 typedef enum eWORKBENCH_DataType {
82 
85 
86 /* Types of volume display interpolation. */
92 
93 typedef struct WORKBENCH_FramebufferList {
96 
99 
101 
108 
114 
115 typedef struct WORKBENCH_TextureList {
128 
129 typedef struct WORKBENCH_StorageList {
131  float *dof_ubo_data;
133 
134 typedef struct WORKBENCH_PassList {
137 
141 
144 
145  struct DRWPass *shadow_ps[2];
146 
148 
151 
153 
163 
165 
172 
173 typedef struct WORKBENCH_Data {
174  void *engine_type;
180 
181 typedef struct WORKBENCH_UBO_Light {
182  float light_direction[4];
183  float specular_color[3], pad;
186 
187 typedef struct WORKBENCH_UBO_Material {
188  float base_color[3];
189  /* Packed data into a int. Decoded in the shader. */
192 
193 typedef struct WORKBENCH_UBO_World {
199  float ambient_color[4];
200 
205 
210 
213  float ui_scale;
214  float _pad0;
215 
217  int use_specular; /* Bools are 32bit ints in GLSL. */
218  int _pad1;
219  int _pad2;
221 
225 
226 typedef struct WORKBENCH_Prepass {
238 
239 typedef struct WORKBENCH_PrivateData {
251  struct Scene *scene;
260 
261  /* Shadow */
267  float shadow_mat[4][4];
268  float shadow_inv[4][4];
272  float shadow_near_min[3];
273  float shadow_near_max[3];
275  float shadow_near_sides[2][4];
276  /* Shadow shading groups. First array elem is for non-manifold geom and second for manifold. */
282 
283  /* Temporal Antialiasing */
293  float taa_weights[9];
301  struct DRWView *view;
303  float last_mat[4][4];
304 
305  /* Smart Morphological Anti-Aliasing */
311 
321 
324 
325  /* Materials */
341 
342  /* Volumes */
345 
346  /* Depth of Field */
355  float dof_near_far[2];
356  float dof_blades;
358  float dof_ratio;
359 
360  /* Camera override for rendering. */
362 
370 } WORKBENCH_PrivateData; /* Transient data */
371 
372 typedef struct WORKBENCH_ObjectData {
374 
375  /* Shadow direction in local object space. */
377  /* Min, max in shadow space */
378  float shadow_min[3], shadow_max[3];
382 
383 typedef struct WORKBENCH_ViewLayerData {
398 
399 /* inline helper functions */
401 {
403  if (STUDIOLIGHT_ENABLED(wpd) || MATCAP_ENABLED(wpd)) {
405  }
406  }
407  return false;
408 }
409 
410 /* workbench_opaque.c */
413 
414 /* workbench_transparent.c */
418 
419 /* workbench_shadow.c */
422 void workbench_shadow_cache_populate(WORKBENCH_Data *data, Object *ob, const bool has_transp_mat);
423 
424 /* workbench_shader.c */
428  bool tiled);
431 
435  bool tiled);
437 
439 GPUShader *workbench_shader_shadow_fail_get(bool manifold, bool cap);
440 
441 GPUShader *workbench_shader_cavity_get(bool cavity, bool curvature);
443 
446 
448  bool coba,
449  eWORKBENCH_VolumeInterpType interp_type,
450  bool smoke);
451 
454  GPUShader **blur1_sh,
455  GPUShader **blur2_sh,
456  GPUShader **resolve_sh);
457 
459 void workbench_shader_free(void);
460 
461 /* workbench_effect_antialiasing.c */
468 
469 /* workbench_effect_cavity.c */
473 
474 /* workbench_effect_outline.c */
476 /* workbench_effect_dof.c */
480 
481 /* workbench_materials.c */
483  Object *ob,
484  Material *mat,
486  eV3DShadingColorType color_type);
487 
489  Object *ob,
490  int mat_nr,
491  eV3DShadingColorType color_type,
492  eWORKBENCH_DataType datatype,
493  bool *r_transp);
495  Object *ob,
496  int mat_nr,
497  Image *ima,
498  ImageUser *iuser,
499  eGPUSamplerState sampler,
500  eWORKBENCH_DataType datatype);
501 
502 #define WORKBENCH_OBJECT_DATATYPE(ob) \
503  ((ob->type == OB_POINTCLOUD) ? WORKBENCH_DATATYPE_POINTCLOUD : WORKBENCH_DATATYPE_MESH)
504 
505 #define workbench_material_setup(wpd, ob, mat_nr, color_type, r_transp) \
506  workbench_material_setup_ex(wpd, ob, mat_nr, color_type, WORKBENCH_OBJECT_DATATYPE(ob), r_transp)
507 #define workbench_image_setup(wpd, ob, mat_nr, ima, iuser, interp) \
508  workbench_image_setup_ex(wpd, ob, mat_nr, ima, iuser, interp, WORKBENCH_OBJECT_DATATYPE(ob))
509 
510 #define workbench_material_hair_setup(wpd, ob, mat_nr, color_type) \
511  workbench_material_setup_ex(wpd, ob, mat_nr, color_type, WORKBENCH_DATATYPE_HAIR, 0)
512 #define workbench_image_hair_setup(wpd, ob, mat_nr, ima, iuser, interp) \
513  workbench_image_setup_ex(wpd, ob, mat_nr, ima, iuser, interp, WORKBENCH_DATATYPE_HAIR)
514 
515 /* workbench_data.c */
521 
522 /* workbench_volume.c */
526  struct Scene *scene,
527  struct Object *ob,
528  struct ModifierData *md,
529  eV3DShadingColorType color_type);
532 
533 /* workbench_engine.c */
534 void workbench_engine_init(void *ved);
535 void workbench_cache_init(void *ved);
536 void workbench_cache_populate(void *ved, Object *ob);
537 void workbench_cache_finish(void *ved);
538 void workbench_draw_sample(void *ved);
539 void workbench_draw_finish(void *ved);
540 
541 /* workbench_render.c */
542 void workbench_render(void *ved,
543  struct RenderEngine *engine,
544  struct RenderLayer *render_layer,
545  const struct rcti *rect);
546 void workbench_render_update_passes(struct RenderEngine *engine,
547  struct Scene *scene,
548  struct ViewLayer *view_layer);
549 #ifdef __cplusplus
550 }
551 #endif
eContextObjectMode
Definition: BKE_context.h:114
@ STUDIOLIGHT_SPECULAR_HIGHLIGHT_PASS
#define BLI_STATIC_ASSERT_ALIGN(st, align)
Definition: BLI_assert.h:89
#define BLI_INLINE
eV3DShadingColorType
@ V3D_SHADING_SPECULAR_HIGHLIGHT
DRWState
Definition: DRW_render.h:312
struct GPUFrameBuffer GPUFrameBuffer
struct GPUShader GPUShader
Definition: GPU_shader.h:33
eGPUShaderConfig
Definition: GPU_shader.h:391
eGPUSamplerState
Definition: GPU_texture.h:40
struct GPUTexture GPUTexture
Definition: GPU_texture.h:33
struct GPUUniformBuf GPUUniformBuf
EvaluationStage stage
Definition: deg_eval.cc:96
Scene scene
struct GPUShader * downsample_sh
unsigned int uint32_t
Definition: stdint.h:83
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_shader_library_ensure(void)
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_private_data_alloc(WORKBENCH_StorageList *stl)
struct WORKBENCH_Prepass WORKBENCH_Prepass
void workbench_shadow_cache_populate(WORKBENCH_Data *data, Object *ob, const bool has_transp_mat)
void workbench_volume_draw_finish(WORKBENCH_Data *vedata)
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)