Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/engines/workbench/workbench_deferred.c
| Show First 20 Lines • Show All 203 Lines • ▼ Show 20 Lines | if (*sh == NULL) { | ||||
| char *cavity_frag = workbench_build_cavity_frag(cavity, curvature, high_dpi); | char *cavity_frag = workbench_build_cavity_frag(cavity, curvature, high_dpi); | ||||
| *sh = DRW_shader_create_fullscreen(cavity_frag, NULL); | *sh = DRW_shader_create_fullscreen(cavity_frag, NULL); | ||||
| MEM_freeN(cavity_frag); | MEM_freeN(cavity_frag); | ||||
| } | } | ||||
| return *sh; | return *sh; | ||||
| } | } | ||||
| static GPUShader *ensure_deferred_prepass_shader(WORKBENCH_PrivateData *wpd, | static GPUShader *ensure_deferred_prepass_shader(WORKBENCH_PrivateData *wpd, | ||||
| bool use_textures, | bool is_uniform_color, | ||||
fclem: I find the name `is_primary_shader` really confusing. Took me a really long time to understand… | |||||
| bool is_hair, | bool is_hair, | ||||
| eGPUShaderConfig sh_cfg) | eGPUShaderConfig sh_cfg) | ||||
| { | { | ||||
| WORKBENCH_DEFERRED_Shaders *sh_data = &e_data.sh_data[sh_cfg]; | WORKBENCH_DEFERRED_Shaders *sh_data = &e_data.sh_data[sh_cfg]; | ||||
| int index = workbench_material_get_prepass_shader_index(wpd, use_textures, is_hair); | int index = workbench_material_get_prepass_shader_index(wpd, is_uniform_color, is_hair); | ||||
| if (sh_data->prepass_sh_cache[index] == NULL) { | if (sh_data->prepass_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_uniform_color, is_hair); | ||||
| char *prepass_vert = workbench_build_prepass_vert(is_hair); | char *prepass_vert = workbench_build_prepass_vert(is_hair); | ||||
| char *prepass_frag = workbench_build_prepass_frag(); | char *prepass_frag = workbench_build_prepass_frag(); | ||||
| sh_data->prepass_sh_cache[index] = GPU_shader_create_from_arrays({ | sh_data->prepass_sh_cache[index] = GPU_shader_create_from_arrays({ | ||||
| .vert = (const char *[]){sh_cfg_data->lib, prepass_vert, NULL}, | .vert = (const char *[]){sh_cfg_data->lib, prepass_vert, NULL}, | ||||
| .frag = (const char *[]){prepass_frag, NULL}, | .frag = (const char *[]){prepass_frag, NULL}, | ||||
| .defs = (const char *[]){sh_cfg_data->def, defines, NULL}, | .defs = (const char *[]){sh_cfg_data->def, defines, NULL}, | ||||
| }); | }); | ||||
| MEM_freeN(prepass_vert); | MEM_freeN(prepass_vert); | ||||
| Show All 29 Lines | if (e_data.background_sh[index] == NULL) { | ||||
| e_data.background_sh[index] = DRW_shader_create_fullscreen(frag, defines); | e_data.background_sh[index] = DRW_shader_create_fullscreen(frag, defines); | ||||
| MEM_freeN(frag); | MEM_freeN(frag); | ||||
| } | } | ||||
| return e_data.background_sh[index]; | return e_data.background_sh[index]; | ||||
| } | } | ||||
| static void select_deferred_shaders(WORKBENCH_PrivateData *wpd, eGPUShaderConfig sh_cfg) | static void select_deferred_shaders(WORKBENCH_PrivateData *wpd, eGPUShaderConfig sh_cfg) | ||||
| { | { | ||||
| wpd->prepass_solid_sh = ensure_deferred_prepass_shader(wpd, false, false, sh_cfg); | wpd->prepass_sh = ensure_deferred_prepass_shader(wpd, false, false, sh_cfg); | ||||
| wpd->prepass_solid_hair_sh = ensure_deferred_prepass_shader(wpd, false, true, sh_cfg); | wpd->prepass_hair_sh = ensure_deferred_prepass_shader(wpd, false, true, sh_cfg); | ||||
| wpd->prepass_texture_sh = ensure_deferred_prepass_shader(wpd, true, false, sh_cfg); | wpd->prepass_uniform_sh = ensure_deferred_prepass_shader(wpd, true, false, sh_cfg); | ||||
| wpd->prepass_texture_hair_sh = ensure_deferred_prepass_shader(wpd, true, true, sh_cfg); | wpd->prepass_uniform_hair_sh = ensure_deferred_prepass_shader(wpd, true, true, sh_cfg); | ||||
| wpd->composite_sh = ensure_deferred_composite_shader(wpd); | wpd->composite_sh = ensure_deferred_composite_shader(wpd); | ||||
| wpd->background_sh = ensure_background_shader(wpd); | wpd->background_sh = ensure_background_shader(wpd); | ||||
| } | } | ||||
| /* Using Hammersley distribution */ | /* Using Hammersley distribution */ | ||||
| static float *create_disk_samples(int num_samples, int num_iterations) | static float *create_disk_samples(int num_samples, int num_iterations) | ||||
| { | { | ||||
| /* vec4 to ensure memory alignment. */ | /* vec4 to ensure memory alignment. */ | ||||
| ▲ Show 20 Lines • Show All 563 Lines • ▼ Show 20 Lines | static WORKBENCH_MaterialData *get_or_create_material_data(WORKBENCH_Data *vedata, | ||||
| material_template.iuser = iuser; | material_template.iuser = iuser; | ||||
| material_template.interp = interp; | material_template.interp = interp; | ||||
| uint hash = workbench_material_get_hash(&material_template, is_ghost); | uint hash = workbench_material_get_hash(&material_template, is_ghost); | ||||
| material = BLI_ghash_lookup(wpd->material_hash, POINTER_FROM_UINT(hash)); | material = BLI_ghash_lookup(wpd->material_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__); | ||||
| material->shgrp = DRW_shgroup_create( | material->shgrp = DRW_shgroup_create( | ||||
| (color_type == V3D_SHADING_TEXTURE_COLOR) ? wpd->prepass_texture_sh : | (wpd->shading.color_type == color_type) ? wpd->prepass_sh : wpd->prepass_uniform_sh, | ||||
| wpd->prepass_solid_sh, | |||||
| (ob->dtx & OB_DRAWXRAY) ? psl->ghost_prepass_pass : psl->prepass_pass); | (ob->dtx & OB_DRAWXRAY) ? psl->ghost_prepass_pass : psl->prepass_pass); | ||||
| workbench_material_copy(material, &material_template); | workbench_material_copy(material, &material_template); | ||||
| DRW_shgroup_stencil_mask(material->shgrp, (ob->dtx & OB_DRAWXRAY) ? 0x00 : 0xFF); | DRW_shgroup_stencil_mask(material->shgrp, (ob->dtx & OB_DRAWXRAY) ? 0x00 : 0xFF); | ||||
| DRW_shgroup_uniform_int(material->shgrp, "object_id", &material->object_id, 1); | DRW_shgroup_uniform_int(material->shgrp, "object_id", &material->object_id, 1); | ||||
| workbench_material_shgroup_uniform(wpd, material->shgrp, material, ob, true, true, interp); | workbench_material_shgroup_uniform(wpd, material->shgrp, material, ob, true, true, interp); | ||||
| BLI_ghash_insert(wpd->material_hash, POINTER_FROM_UINT(hash), material); | BLI_ghash_insert(wpd->material_hash, POINTER_FROM_UINT(hash), material); | ||||
| } | } | ||||
| return material; | return material; | ||||
| Show All 17 Lines | for (ModifierData *md = ob->modifiers.first; md; md = md->next) { | ||||
| const int draw_as = (part->draw_as == PART_DRAW_REND) ? part->ren_as : part->draw_as; | const int draw_as = (part->draw_as == PART_DRAW_REND) ? part->ren_as : part->draw_as; | ||||
| if (draw_as == PART_DRAW_PATH) { | if (draw_as == PART_DRAW_PATH) { | ||||
| Material *mat; | Material *mat; | ||||
| 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, false); | ||||
| WORKBENCH_MaterialData *material = get_or_create_material_data( | WORKBENCH_MaterialData *material = 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->prepass_solid_hair_sh : | wpd->prepass_hair_sh : | ||||
| wpd->prepass_texture_hair_sh; | wpd->prepass_uniform_hair_sh; | ||||
| DRWShadingGroup *shgrp = DRW_shgroup_hair_create( | DRWShadingGroup *shgrp = DRW_shgroup_hair_create( | ||||
| ob, | ob, | ||||
| psys, | psys, | ||||
| md, | md, | ||||
| (ob->dtx & OB_DRAWXRAY) ? psl->ghost_prepass_hair_pass : psl->prepass_hair_pass, | (ob->dtx & OB_DRAWXRAY) ? psl->ghost_prepass_hair_pass : psl->prepass_hair_pass, | ||||
| shader); | shader); | ||||
| DRW_shgroup_stencil_mask(shgrp, (ob->dtx & OB_DRAWXRAY) ? 0x00 : 0xFF); | DRW_shgroup_stencil_mask(shgrp, (ob->dtx & OB_DRAWXRAY) ? 0x00 : 0xFF); | ||||
| DRW_shgroup_uniform_int(shgrp, "object_id", &material->object_id, 1); | DRW_shgroup_uniform_int(shgrp, "object_id", &material->object_id, 1); | ||||
| ▲ Show 20 Lines • Show All 48 Lines • ▼ Show 20 Lines | if (!is_sculpt_mode && me && me->mloopuv && TEXTURE_DRAWING_ENABLED(wpd)) { | ||||
| struct GPUBatch **geom_array = DRW_cache_mesh_surface_texpaint_get(ob); | struct GPUBatch **geom_array = DRW_cache_mesh_surface_texpaint_get(ob); | ||||
| for (int i = 0; i < materials_len; i++) { | for (int i = 0; i < materials_len; i++) { | ||||
| if (geom_array != NULL && geom_array[i] != NULL) { | if (geom_array != NULL && geom_array[i] != NULL) { | ||||
| Material *mat; | Material *mat; | ||||
| Image *image; | Image *image; | ||||
| ImageUser *iuser; | ImageUser *iuser; | ||||
| int interp; | int interp; | ||||
| workbench_material_get_image_and_mat(ob, i + 1, &image, &iuser, &interp, &mat); | workbench_material_get_image_and_mat(ob, i + 1, &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, is_sculpt_mode); | ||||
| if (color_type == V3D_SHADING_MATERIAL_COLOR && mat && mat->a < 1.0) { | if (color_type == V3D_SHADING_MATERIAL_COLOR && mat && mat->a < 1.0) { | ||||
| material = workbench_forward_get_or_create_material_data( | material = workbench_forward_get_or_create_material_data( | ||||
| vedata, ob, mat, image, iuser, color_type, 0); | vedata, ob, mat, image, iuser, color_type, 0, is_sculpt_mode); | ||||
| has_transp_mat = true; | has_transp_mat = true; | ||||
| } | } | ||||
| else { | else { | ||||
| material = get_or_create_material_data( | material = get_or_create_material_data( | ||||
| vedata, ob, mat, image, iuser, color_type, interp); | vedata, ob, mat, image, iuser, color_type, interp); | ||||
| } | } | ||||
| DRW_shgroup_call_object_add(material->shgrp, geom_array[i], ob); | DRW_shgroup_call_object_add(material->shgrp, geom_array[i], ob); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| else if (ELEM(wpd->shading.color_type, | else 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, | ||||
| if ((ob->color[3] < 1.0f) && (wpd->shading.color_type == V3D_SHADING_OBJECT_COLOR)) { | V3D_SHADING_VERTEX_COLOR)) { | ||||
| int color_type = workbench_material_determine_color_type(wpd, NULL, ob, is_sculpt_mode); | |||||
| if ((ob->color[3] < 1.0f) && (color_type == V3D_SHADING_OBJECT_COLOR)) { | |||||
| /* Hack */ | /* Hack */ | ||||
| wpd->shading.xray_alpha = ob->color[3]; | wpd->shading.xray_alpha = ob->color[3]; | ||||
| 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, is_sculpt_mode); | ||||
| has_transp_mat = true; | has_transp_mat = true; | ||||
| } | } | ||||
| else { | else { | ||||
| /* Draw solid color */ | /* Draw solid color */ | ||||
| material = get_or_create_material_data( | material = get_or_create_material_data(vedata, ob, NULL, NULL, NULL, color_type, 0); | ||||
| vedata, ob, NULL, NULL, NULL, wpd->shading.color_type, 0); | |||||
| } | } | ||||
| if (is_sculpt_mode) { | if (is_sculpt_mode) { | ||||
| DRW_shgroup_call_sculpt_add(material->shgrp, ob, ob->obmat); | DRW_shgroup_call_sculpt_add(material->shgrp, ob, ob->obmat); | ||||
| } | } | ||||
| else { | else { | ||||
| struct GPUBatch *geom = DRW_cache_object_surface_get(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) { | ||||
| DRW_shgroup_call_object_add(material->shgrp, geom, ob); | DRW_shgroup_call_object_add(material->shgrp, geom, ob); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| else { | else { | ||||
| /* Draw material color */ | /* Draw material color */ | ||||
| if (is_sculpt_mode) { | if (is_sculpt_mode) { | ||||
| Show All 12 Lines | else { | ||||
| ob, gpumat_array, materials_len, NULL, NULL, NULL); | ob, gpumat_array, materials_len, NULL, NULL, NULL); | ||||
| for (int i = 0; i < materials_len; ++i) { | for (int i = 0; i < materials_len; ++i) { | ||||
| if (geoms != NULL && geoms[i] != NULL) { | if (geoms != NULL && geoms[i] != NULL) { | ||||
| Material *mat = give_current_material(ob, i + 1); | Material *mat = give_current_material(ob, i + 1); | ||||
| if (mat != NULL && mat->a < 1.0f) { | if (mat != NULL && mat->a < 1.0f) { | ||||
| /* Hack */ | /* Hack */ | ||||
| wpd->shading.xray_alpha = mat->a; | wpd->shading.xray_alpha = mat->a; | ||||
| material = workbench_forward_get_or_create_material_data( | material = workbench_forward_get_or_create_material_data( | ||||
| vedata, ob, mat, NULL, NULL, V3D_SHADING_MATERIAL_COLOR, 0); | vedata, ob, mat, NULL, NULL, V3D_SHADING_MATERIAL_COLOR, 0, is_sculpt_mode); | ||||
| has_transp_mat = true; | has_transp_mat = true; | ||||
| } | } | ||||
| else { | else { | ||||
| material = get_or_create_material_data( | material = get_or_create_material_data( | ||||
| vedata, ob, mat, NULL, NULL, V3D_SHADING_MATERIAL_COLOR, 0); | vedata, ob, mat, NULL, NULL, V3D_SHADING_MATERIAL_COLOR, 0); | ||||
| } | } | ||||
| DRW_shgroup_call_object_add(material->shgrp, geoms[i], ob); | DRW_shgroup_call_object_add(material->shgrp, geoms[i], ob); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 237 Lines • Show Last 20 Lines | |||||
I find the name is_primary_shader really confusing. Took me a really long time to understand what it meant. I think is_const_color or is_uniform_color is better and revert its value back to what it was (when it was use_textures).