46 #define WORKBENCH_ENGINE "BLENDER_WORKBENCH"
62 const float fpixel[4] = {1.0f, 0.0f, 1.0f, 1.0f};
102 memset(gpumat_array, 0,
sizeof(*gpumat_array) * materials_len);
114 if (use_single_drawcall) {
121 for (
int i = 0; i < materials_len; i++) {
146 if (use_single_drawcall) {
161 for (
int i = 0; i < materials_len; i++) {
162 if (geoms[i] ==
NULL) {
179 const bool use_single_drawcall = !
ELEM(
182 if (use_single_drawcall) {
189 if (
U.experimental.use_sculpt_vertex_colors) {
211 for (
int i = 0; i < materials_len; i++) {
212 if (geoms[i] ==
NULL) {
227 bool use_texpaint_mode,
251 bool *r_texpaint_mode,
258 const bool is_active = (ob == draw_ctx->obact);
275 if (
U.experimental.use_sculpt_vertex_colors) {
288 *r_sculpt_pbvh = is_sculpt_pbvh;
290 if (r_texpaint_mode) {
291 *r_texpaint_mode =
false;
294 if (!is_sculpt_pbvh && !is_render) {
296 if (is_texpaint_mode && me && me->
mloopuv) {
298 if (r_texpaint_mode) {
299 *r_texpaint_mode =
true;
302 else if (is_vertpaint_mode && me && me->
mloopcol) {
317 if (is_sculpt_pbvh) {
318 *r_draw_shadow =
false;
322 *r_draw_shadow =
false;
340 bool use_texpaint_mode;
356 wpd, ob, psys, md, color_type, use_texpaint_mode, part->
omat);
383 bool use_sculpt_pbvh, use_texpaint_mode, draw_shadow, has_transp_mat =
false;
385 wpd, ob, &use_sculpt_pbvh, &use_texpaint_mode, &draw_shadow);
387 if (use_sculpt_pbvh) {
390 else if (use_texpaint_mode) {
430 GPU_ATTACHMENT_TEXTURE(dtxl->depth_in_front),
431 GPU_ATTACHMENT_TEXTURE(dtxl->color),
436 GPU_ATTACHMENT_TEXTURE(dtxl->depth_in_front),
437 GPU_ATTACHMENT_TEXTURE(wpd->material_buffer_tx),
438 GPU_ATTACHMENT_TEXTURE(wpd->normal_buffer_tx),
439 GPU_ATTACHMENT_TEXTURE(wpd->object_id_tx),
444 GPU_ATTACHMENT_TEXTURE(dtxl->depth_in_front),
445 GPU_ATTACHMENT_TEXTURE(wpd->accum_buffer_tx),
446 GPU_ATTACHMENT_TEXTURE(wpd->reveal_buffer_tx),
454 GPU_ATTACHMENT_TEXTURE(wpd->object_id_tx),
464 for (
int i = 0; i < 2; i++) {
465 for (
int j = 0; j < 2; j++) {
485 const float clear_col[4] = {0.0f, 0.0f, 0.0f, 0.0f};
486 const float clear_col_with_alpha[4] = {0.0f, 0.0f, 0.0f, 1.0f};
497 GPU_framebuffer_clear_depth(dfbl->
in_front_fb, 1.0f);
506 GPU_framebuffer_clear_color(fbl->
id_clear_fb, clear_col);
509 if (do_opaque_pass) {
518 if (do_opaque_infront_pass) {
537 if (xray_is_visible) {
538 if (do_transparent_pass) {
540 GPU_framebuffer_clear_color(fbl->
transp_accum_fb, clear_col_with_alpha);
548 if (do_transparent_infront_pass) {
659 #undef WORKBENCH_ENGINE
bool CustomData_has_layer(const struct CustomData *data, int type)
bool BKE_modifier_is_enabled(const struct Scene *scene, struct ModifierData *md, int required_mode)
struct ModifierData * BKE_modifiers_findby_type(const struct Object *ob, ModifierType type)
General operations, lookup, etc. for blender objects.
bool BKE_sculptsession_use_pbvh_draw(const struct Object *ob, const struct View3D *v3d)
#define BLI_array_alloca(arr, realsize)
void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
#define LISTBASE_FOREACH(type, var, list)
MINLINE int max_ii(int a, int b)
#define SET_FLAG_FROM_TEST(value, test, flag)
@ eModifierType_ParticleSystem
@ IMAGEPAINT_INTERP_LINEAR
@ V3D_SHADING_TEXTURE_COLOR
@ V3D_SHADING_VERTEX_COLOR
@ V3D_SHADING_MATERIAL_COLOR
@ V3D_SHADING_OBJECT_COLOR
@ V3D_SHADING_SINGLE_COLOR
#define DRW_VIEWPORT_DATA_SIZE(ty)
#define DRW_shgroup_call(shgroup, geom, ob)
#define GPU_FRAMEBUFFER_FREE_SAFE(fb)
void GPU_framebuffer_bind(GPUFrameBuffer *fb)
#define RE_USE_STEREO_VIEWPORT
#define RE_USE_GPU_CONTEXT
GPUBatch * DRW_cache_mesh_surface_sculptcolors_get(Object *ob)
GPUBatch * DRW_cache_mesh_surface_texpaint_single_get(Object *ob)
GPUBatch ** DRW_cache_object_surface_material_get(struct Object *ob, struct GPUMaterial **gpumat_array, uint gpumat_array_len)
GPUBatch * DRW_cache_mesh_surface_vertpaint_get(Object *ob)
GPUBatch ** DRW_cache_mesh_surface_texpaint_get(Object *ob)
int DRW_cache_object_material_count_get(struct Object *ob)
GPUBatch * DRW_cache_object_surface_get(Object *ob)
struct DRWShadingGroup * DRW_shgroup_hair_create_sub(struct Object *object, struct ParticleSystem *psys, struct ModifierData *md, struct DRWShadingGroup *shgrp)
bool DRW_state_is_opengl_render(void)
DefaultFramebufferList * DRW_viewport_framebuffer_list_get(void)
bool DRW_object_is_renderable(const Object *ob)
int DRW_object_visibility_in_active_context(const Object *ob)
bool DRW_object_is_visible_psys_in_active_context(const Object *object, const ParticleSystem *psys)
const DRWContextState * DRW_context_state_get(void)
void DRW_render_to_image(RenderEngine *engine, struct Depsgraph *depsgraph)
DrawData * DRW_drawdata_get(ID *id, DrawEngineType *engine_type)
bool DRW_object_use_hide_faces(const struct Object *ob)
bool DRW_state_is_image_render(void)
bool DRW_state_is_scene_render(void)
DefaultTextureList * DRW_viewport_texture_list_get(void)
void DRW_shgroup_call_instance_range(DRWShadingGroup *shgroup, Object *ob, struct GPUBatch *geom, uint i_sta, uint i_ct)
bool DRW_pass_is_empty(DRWPass *pass)
void DRW_shgroup_call_sculpt(DRWShadingGroup *shgroup, Object *ob, bool use_wire, bool use_mask)
void DRW_shgroup_call_sculpt_with_materials(DRWShadingGroup **shgroups, int num_shgroups, Object *ob)
void DRW_view_set_active(DRWView *view)
void DRW_draw_pass(DRWPass *pass)
void DRW_texture_ensure_fullscreen_2d(GPUTexture **tex, eGPUTextureFormat format, DRWTextureFlag flags)
GPUTexture * DRW_texture_pool_query_fullscreen(eGPUTextureFormat format, DrawEngineType *engine_type)
GPUTexture * DRW_texture_create_2d(int w, int h, eGPUTextureFormat format, DRWTextureFlag flags, const float *fpixels)
struct GPUFrameBuffer * in_front_fb
struct GPUFrameBuffer * default_fb
struct GPUFrameBuffer * color_only_fb
struct GPUTexture * depth_in_front
struct FluidDomainSettings * domain
struct CustomData pdata ldata
struct MLoopCol * mloopcol
struct ToolSettings * toolsettings
WORKBENCH_FramebufferList * fbl
WORKBENCH_StorageList * stl
WORKBENCH_TextureList * txl
struct GPUFrameBuffer * opaque_fb
struct GPUFrameBuffer * transp_accum_fb
struct GPUFrameBuffer * opaque_infront_fb
struct GPUFrameBuffer * id_clear_fb
struct GPUFrameBuffer * transp_accum_infront_fb
struct DRWPass * composite_ps
struct DRWPass * opaque_infront_ps
struct DRWPass * transp_accum_ps
struct DRWPass * shadow_ps[2]
struct DRWPass * merge_infront_ps
struct DRWPass * outline_ps
struct DRWPass * opaque_ps
struct DRWPass * transp_resolve_ps
struct DRWPass * transp_accum_infront_ps
struct DRWPass * cavity_ps
struct GHash * material_hash
struct GPUTexture * object_id_tx
eContextObjectMode ctx_mode
struct GPUTexture * dummy_image_tx
WORKBENCH_Prepass prepass[2][2][WORKBENCH_DATATYPE_MAX]
float background_color[4]
struct WORKBENCH_PrivateData * wpd
struct GPUTexture * dummy_image_tx
void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
void workbench_private_data_alloc(WORKBENCH_StorageList *stl)
void workbench_update_world_ubo(WORKBENCH_PrivateData *wpd)
void workbench_update_material_ubos(WORKBENCH_PrivateData *UNUSED(wpd))
void workbench_antialiasing_engine_init(WORKBENCH_Data *vedata)
bool workbench_antialiasing_setup(WORKBENCH_Data *vedata)
void workbench_antialiasing_draw_pass(WORKBENCH_Data *vedata)
void workbench_antialiasing_cache_init(WORKBENCH_Data *vedata)
void workbench_antialiasing_view_updated(WORKBENCH_Data *vedata)
void workbench_cavity_cache_init(WORKBENCH_Data *data)
void workbench_dof_cache_init(WORKBENCH_Data *vedata)
void workbench_dof_draw_pass(WORKBENCH_Data *vedata)
void workbench_dof_engine_init(WORKBENCH_Data *vedata)
void workbench_outline_cache_init(WORKBENCH_Data *data)
static eV3DShadingColorType workbench_color_type_get(WORKBENCH_PrivateData *wpd, Object *ob, bool *r_sculpt_pbvh, bool *r_texpaint_mode, bool *r_draw_shadow)
static void workbench_cache_texpaint_populate(WORKBENCH_PrivateData *wpd, Object *ob)
static void workbench_draw_scene(void *ved)
static struct GPUBatch ** workbench_object_surface_material_get(Object *ob)
DrawEngineType draw_engine_workbench
static void workbench_engine_free(void)
void workbench_cache_populate(void *ved, Object *ob)
static void workbench_cache_sculpt_populate(WORKBENCH_PrivateData *wpd, Object *ob, eV3DShadingColorType color_type)
RenderEngineType DRW_engine_viewport_workbench_type
void workbench_cache_init(void *ved)
static void workbench_id_update(void *UNUSED(vedata), struct ID *id)
void workbench_engine_init(void *ved)
BLI_INLINE void workbench_object_drawcall(DRWShadingGroup *grp, struct GPUBatch *geom, Object *ob)
static void workbench_view_update(void *vedata)
static void workbench_cache_hair_populate(WORKBENCH_PrivateData *wpd, Object *ob, ParticleSystem *psys, ModifierData *md, eV3DShadingColorType color_type, bool use_texpaint_mode, const int matnr)
static void workbench_cache_common_populate(WORKBENCH_PrivateData *wpd, Object *ob, eV3DShadingColorType color_type, bool *r_transp)
void workbench_cache_finish(void *ved)
void workbench_draw_sample(void *ved)
void workbench_draw_finish(void *ved)
static const DrawEngineDataSize workbench_data_size
void workbench_opaque_cache_init(WORKBENCH_Data *vedata)
void workbench_opaque_engine_init(WORKBENCH_Data *data)
void workbench_shader_library_ensure(void)
void workbench_transparent_engine_init(WORKBENCH_Data *data)
void workbench_volume_cache_init(WORKBENCH_Data *vedata)
void workbench_volume_draw_pass(WORKBENCH_Data *vedata)
void workbench_shader_free(void)
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_transparent_cache_init(WORKBENCH_Data *data)
#define workbench_material_setup(wpd, ob, mat_nr, color_type, r_transp)
#define workbench_image_hair_setup(wpd, ob, mat_nr, ima, iuser, interp)
#define workbench_material_hair_setup(wpd, ob, mat_nr, color_type)
void workbench_volume_engine_init(WORKBENCH_Data *vedata)
void workbench_render_update_passes(struct RenderEngine *engine, struct Scene *scene, struct ViewLayer *view_layer)
#define workbench_image_setup(wpd, ob, mat_nr, ima, iuser, interp)
void workbench_shadow_cache_init(WORKBENCH_Data *data)
#define OBJECT_ID_PASS_ENABLED(wpd)
void workbench_render(void *ved, struct RenderEngine *engine, struct RenderLayer *render_layer, const struct rcti *rect)
#define SHADOW_ENABLED(wpd)
void workbench_transparent_draw_depth_pass(WORKBENCH_Data *data)
void workbench_volume_cache_populate(WORKBENCH_Data *vedata, struct Scene *scene, struct Object *ob, struct ModifierData *md, eV3DShadingColorType color_type)