Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/engines/workbench/workbench_forward.c
| Show First 20 Lines • Show All 162 Lines • ▼ Show 20 Lines | WORKBENCH_MaterialData *workbench_forward_get_or_create_material_data(WORKBENCH_Data *vedata, | ||||
| material_template.interp = interp; | material_template.interp = interp; | ||||
| uint hash = workbench_material_get_hash(&material_template, false); | uint hash = workbench_material_get_hash(&material_template, false); | ||||
| material = BLI_ghash_lookup(wpd->material_transp_hash, POINTER_FROM_UINT(hash)); | material = BLI_ghash_lookup(wpd->material_transp_hash, POINTER_FROM_UINT(hash)); | ||||
| if (material == NULL) { | if (material == NULL) { | ||||
| material = MEM_mallocN(sizeof(WORKBENCH_MaterialData), __func__); | material = MEM_mallocN(sizeof(WORKBENCH_MaterialData), __func__); | ||||
| /* transparent accum */ | /* transparent accum */ | ||||
| grp = DRW_shgroup_create(color_type == V3D_SHADING_TEXTURE_COLOR ? | grp = DRW_shgroup_create(wpd->shading.color_type == color_type ? | ||||
| wpd->transparent_accum_texture_sh : | wpd->transparent_accum_primary_sh : | ||||
| wpd->transparent_accum_sh, | wpd->transparent_accum_fallback_sh, | ||||
| psl->transparent_accum_pass); | psl->transparent_accum_pass); | ||||
| DRW_shgroup_uniform_block(grp, "world_block", wpd->world_ubo); | DRW_shgroup_uniform_block(grp, "world_block", wpd->world_ubo); | ||||
| DRW_shgroup_uniform_float_copy(grp, "alpha", wpd->shading.xray_alpha); | DRW_shgroup_uniform_float_copy(grp, "alpha", wpd->shading.xray_alpha); | ||||
| DRW_shgroup_uniform_vec4(grp, "viewvecs[0]", (float *)wpd->viewvecs, 3); | DRW_shgroup_uniform_vec4(grp, "viewvecs[0]", (float *)wpd->viewvecs, 3); | ||||
| workbench_material_copy(material, &material_template); | workbench_material_copy(material, &material_template); | ||||
| if (STUDIOLIGHT_TYPE_MATCAP_ENABLED(wpd)) { | if (STUDIOLIGHT_TYPE_MATCAP_ENABLED(wpd)) { | ||||
| BKE_studiolight_ensure_flag(wpd->studio_light, STUDIOLIGHT_EQUIRECT_RADIANCE_GPUTEXTURE); | BKE_studiolight_ensure_flag(wpd->studio_light, STUDIOLIGHT_EQUIRECT_RADIANCE_GPUTEXTURE); | ||||
| DRW_shgroup_uniform_texture( | DRW_shgroup_uniform_texture( | ||||
| Show All 30 Lines | if (draw_ctx->sh_cfg == GPU_SHADER_CFG_CLIPPED) { | ||||
| DRW_shgroup_world_clip_planes_from_rv3d(material->shgrp_object_outline, draw_ctx->rv3d); | DRW_shgroup_world_clip_planes_from_rv3d(material->shgrp_object_outline, draw_ctx->rv3d); | ||||
| } | } | ||||
| BLI_ghash_insert(wpd->material_transp_hash, POINTER_FROM_UINT(hash), material); | BLI_ghash_insert(wpd->material_transp_hash, POINTER_FROM_UINT(hash), material); | ||||
| } | } | ||||
| return material; | return material; | ||||
| } | } | ||||
| static GPUShader *ensure_forward_accum_shaders(WORKBENCH_PrivateData *wpd, | static GPUShader *ensure_forward_accum_shaders(WORKBENCH_PrivateData *wpd, | ||||
| bool use_textures, | bool is_primary_shader, | ||||
| bool is_hair, | bool is_hair, | ||||
| eGPUShaderConfig sh_cfg) | eGPUShaderConfig sh_cfg) | ||||
| { | { | ||||
| WORKBENCH_FORWARD_Shaders *sh_data = &e_data.sh_data[sh_cfg]; | WORKBENCH_FORWARD_Shaders *sh_data = &e_data.sh_data[sh_cfg]; | ||||
| int index = workbench_material_get_accum_shader_index(wpd, use_textures, is_hair); | int index = workbench_material_get_accum_shader_index(wpd, is_primary_shader, is_hair); | ||||
| if (sh_data->transparent_accum_sh_cache[index] == NULL) { | if (sh_data->transparent_accum_sh_cache[index] == NULL) { | ||||
| const GPUShaderConfigData *sh_cfg_data = &GPU_shader_cfg_data[sh_cfg]; | const GPUShaderConfigData *sh_cfg_data = &GPU_shader_cfg_data[sh_cfg]; | ||||
| char *defines = workbench_material_build_defines(wpd, use_textures, is_hair); | char *defines = workbench_material_build_defines(wpd, is_primary_shader, is_hair); | ||||
| char *transparent_accum_vert = workbench_build_forward_vert(is_hair); | char *transparent_accum_vert = workbench_build_forward_vert(is_hair); | ||||
| char *transparent_accum_frag = workbench_build_forward_transparent_accum_frag(); | char *transparent_accum_frag = workbench_build_forward_transparent_accum_frag(); | ||||
| sh_data->transparent_accum_sh_cache[index] = GPU_shader_create_from_arrays({ | sh_data->transparent_accum_sh_cache[index] = GPU_shader_create_from_arrays({ | ||||
| .vert = (const char *[]){sh_cfg_data->lib, transparent_accum_vert, NULL}, | .vert = (const char *[]){sh_cfg_data->lib, transparent_accum_vert, NULL}, | ||||
| .frag = (const char *[]){transparent_accum_frag, NULL}, | .frag = (const char *[]){transparent_accum_frag, NULL}, | ||||
| .defs = (const char *[]){sh_cfg_data->def, defines, NULL}, | .defs = (const char *[]){sh_cfg_data->def, defines, NULL}, | ||||
| }); | }); | ||||
| MEM_freeN(transparent_accum_vert); | MEM_freeN(transparent_accum_vert); | ||||
| Show All 14 Lines | if (e_data.composite_sh_cache[index] == NULL) { | ||||
| MEM_freeN(defines); | MEM_freeN(defines); | ||||
| } | } | ||||
| return e_data.composite_sh_cache[index]; | return e_data.composite_sh_cache[index]; | ||||
| } | } | ||||
| void workbench_forward_choose_shaders(WORKBENCH_PrivateData *wpd, eGPUShaderConfig sh_cfg) | void workbench_forward_choose_shaders(WORKBENCH_PrivateData *wpd, eGPUShaderConfig sh_cfg) | ||||
| { | { | ||||
| wpd->composite_sh = ensure_forward_composite_shaders(wpd); | wpd->composite_sh = ensure_forward_composite_shaders(wpd); | ||||
| wpd->transparent_accum_sh = ensure_forward_accum_shaders(wpd, false, false, sh_cfg); | wpd->transparent_accum_primary_sh = ensure_forward_accum_shaders(wpd, true, false, sh_cfg); | ||||
| wpd->transparent_accum_hair_sh = ensure_forward_accum_shaders(wpd, false, true, sh_cfg); | wpd->transparent_accum_primary_hair_sh = ensure_forward_accum_shaders(wpd, true, true, sh_cfg); | ||||
| wpd->transparent_accum_texture_sh = ensure_forward_accum_shaders(wpd, true, false, sh_cfg); | wpd->transparent_accum_fallback_sh = ensure_forward_accum_shaders(wpd, false, false, sh_cfg); | ||||
| wpd->transparent_accum_texture_hair_sh = ensure_forward_accum_shaders(wpd, true, true, sh_cfg); | wpd->transparent_accum_fallback_hair_sh = ensure_forward_accum_shaders(wpd, false, true, sh_cfg); | ||||
| } | } | ||||
| void workbench_forward_outline_shaders_ensure(WORKBENCH_PrivateData *wpd, eGPUShaderConfig sh_cfg) | void workbench_forward_outline_shaders_ensure(WORKBENCH_PrivateData *wpd, eGPUShaderConfig sh_cfg) | ||||
| { | { | ||||
| WORKBENCH_FORWARD_Shaders *sh_data = &e_data.sh_data[sh_cfg]; | WORKBENCH_FORWARD_Shaders *sh_data = &e_data.sh_data[sh_cfg]; | ||||
| if (sh_data->object_outline_sh == NULL) { | if (sh_data->object_outline_sh == NULL) { | ||||
| const GPUShaderConfigData *sh_cfg_data = &GPU_shader_cfg_data[sh_cfg]; | const GPUShaderConfigData *sh_cfg_data = &GPU_shader_cfg_data[sh_cfg]; | ||||
| ▲ Show 20 Lines • Show All 225 Lines • ▼ Show 20 Lines | if (draw_as == PART_DRAW_PATH) { | ||||
| Image *image; | Image *image; | ||||
| ImageUser *iuser; | ImageUser *iuser; | ||||
| int interp; | int interp; | ||||
| workbench_material_get_image_and_mat(ob, part->omat, &image, &iuser, &interp, &mat); | workbench_material_get_image_and_mat(ob, part->omat, &image, &iuser, &interp, &mat); | ||||
| int color_type = workbench_material_determine_color_type(wpd, image, ob); | int color_type = workbench_material_determine_color_type(wpd, image, ob); | ||||
| WORKBENCH_MaterialData *material = workbench_forward_get_or_create_material_data( | WORKBENCH_MaterialData *material = workbench_forward_get_or_create_material_data( | ||||
| vedata, ob, mat, image, iuser, color_type, interp); | vedata, ob, mat, image, iuser, color_type, interp); | ||||
| struct GPUShader *shader = (color_type != V3D_SHADING_TEXTURE_COLOR) ? | struct GPUShader *shader = (wpd->shading.color_type == color_type) ? | ||||
| wpd->transparent_accum_hair_sh : | wpd->transparent_accum_primary_hair_sh : | ||||
| wpd->transparent_accum_texture_hair_sh; | wpd->transparent_accum_fallback_hair_sh; | ||||
| DRWShadingGroup *shgrp = DRW_shgroup_hair_create( | DRWShadingGroup *shgrp = DRW_shgroup_hair_create( | ||||
| ob, psys, md, psl->transparent_accum_pass, shader); | ob, psys, md, psl->transparent_accum_pass, shader); | ||||
| DRW_shgroup_uniform_block(shgrp, "world_block", wpd->world_ubo); | DRW_shgroup_uniform_block(shgrp, "world_block", wpd->world_ubo); | ||||
| workbench_material_shgroup_uniform(wpd, shgrp, material, ob, false, false, interp); | workbench_material_shgroup_uniform(wpd, shgrp, material, ob, false, false, interp); | ||||
| DRW_shgroup_uniform_vec4(shgrp, "viewvecs[0]", (float *)wpd->viewvecs, 3); | DRW_shgroup_uniform_vec4(shgrp, "viewvecs[0]", (float *)wpd->viewvecs, 3); | ||||
| /* Hairs have lots of layer and can rapidly become the most prominent surface. | /* Hairs have lots of layer and can rapidly become the most prominent surface. | ||||
| * So lower their alpha artificially. */ | * So lower their alpha artificially. */ | ||||
| float hair_alpha = XRAY_ALPHA(wpd) * 0.33f; | float hair_alpha = XRAY_ALPHA(wpd) * 0.33f; | ||||
| ▲ Show 20 Lines • Show All 74 Lines • ▼ Show 20 Lines | if (!is_sculpt_mode && TEXTURE_DRAWING_ENABLED(wpd) && ELEM(ob->type, OB_MESH)) { | ||||
| } | } | ||||
| } | } | ||||
| /* Fallback from not drawn OB_TEXTURE mode or just OB_SOLID mode */ | /* Fallback from not drawn OB_TEXTURE mode or just OB_SOLID mode */ | ||||
| if (!is_drawn) { | if (!is_drawn) { | ||||
| if (ELEM(wpd->shading.color_type, | if (ELEM(wpd->shading.color_type, | ||||
| V3D_SHADING_SINGLE_COLOR, | V3D_SHADING_SINGLE_COLOR, | ||||
| V3D_SHADING_OBJECT_COLOR, | V3D_SHADING_OBJECT_COLOR, | ||||
| V3D_SHADING_RANDOM_COLOR)) { | V3D_SHADING_RANDOM_COLOR, | ||||
| V3D_SHADING_VERTEX_COLOR)) { | |||||
| /* No material split needed */ | /* No material split needed */ | ||||
| struct GPUBatch *geom = DRW_cache_object_surface_get(ob); | int color_type = workbench_material_determine_color_type(wpd, NULL, ob); | ||||
| struct GPUBatch *geom; | |||||
| if (color_type == V3D_SHADING_VERTEX_COLOR) { | |||||
| geom = DRW_cache_mesh_surface_vertpaint_get(ob); | |||||
| } | |||||
| else { | |||||
| geom = DRW_cache_object_surface_get(ob); | |||||
| } | |||||
| if (geom) { | if (geom) { | ||||
| material = workbench_forward_get_or_create_material_data( | material = workbench_forward_get_or_create_material_data( | ||||
| vedata, ob, NULL, NULL, NULL, wpd->shading.color_type, 0); | vedata, ob, NULL, NULL, NULL, color_type, 0); | ||||
| if (is_sculpt_mode) { | if (is_sculpt_mode) { | ||||
| DRW_shgroup_call_sculpt_add(material->shgrp_object_outline, ob, ob->obmat); | DRW_shgroup_call_sculpt_add(material->shgrp_object_outline, ob, ob->obmat); | ||||
| if (!is_wire) { | if (!is_wire) { | ||||
| DRW_shgroup_call_sculpt_add(material->shgrp, ob, ob->obmat); | DRW_shgroup_call_sculpt_add(material->shgrp, ob, ob->obmat); | ||||
| } | } | ||||
| } | } | ||||
| else { | else { | ||||
| DRW_shgroup_call_object_add(material->shgrp_object_outline, geom, ob); | DRW_shgroup_call_object_add(material->shgrp_object_outline, geom, ob); | ||||
| ▲ Show 20 Lines • Show All 115 Lines • Show Last 20 Lines | |||||