Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/engines/workbench/workbench_forward.c
| Show First 20 Lines • Show All 220 Lines • ▼ Show 20 Lines | if (material == NULL) { | ||||
| 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 is_uniform_color, | bool is_uniform_color, | ||||
| bool is_hair, | bool is_hair, | ||||
| bool is_texture_painting, | WORKBENCH_ObjectColorOverride color_override, | ||||
| 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( | int index = workbench_material_get_accum_shader_index( | ||||
| wpd, is_uniform_color, is_hair, is_texture_painting); | wpd, is_uniform_color, is_hair, color_override); | ||||
| 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( | char *defines = workbench_material_build_defines( | ||||
| wpd, is_uniform_color, is_hair, is_texture_painting); | wpd, is_uniform_color, is_hair, color_override); | ||||
| 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); | ||||
| MEM_freeN(transparent_accum_frag); | MEM_freeN(transparent_accum_frag); | ||||
| MEM_freeN(defines); | MEM_freeN(defines); | ||||
| } | } | ||||
| return sh_data->transparent_accum_sh_cache[index]; | return sh_data->transparent_accum_sh_cache[index]; | ||||
| } | } | ||||
| static GPUShader *ensure_forward_composite_shaders(WORKBENCH_PrivateData *wpd) | static GPUShader *ensure_forward_composite_shaders(WORKBENCH_PrivateData *wpd) | ||||
| { | { | ||||
| int index = OBJECT_OUTLINE_ENABLED(wpd) ? 1 : 0; | int index = OBJECT_OUTLINE_ENABLED(wpd) ? 1 : 0; | ||||
| if (e_data.composite_sh_cache[index] == NULL) { | if (e_data.composite_sh_cache[index] == NULL) { | ||||
| char *defines = workbench_material_build_defines(wpd, false, false, false); | char *defines = workbench_material_build_defines( | ||||
| wpd, false, false, WORKBENCH_COLOR_OVERRIDE_OFF); | |||||
| char *composite_frag = workbench_build_forward_composite_frag(); | char *composite_frag = workbench_build_forward_composite_frag(); | ||||
| e_data.composite_sh_cache[index] = DRW_shader_create_fullscreen(composite_frag, defines); | e_data.composite_sh_cache[index] = DRW_shader_create_fullscreen(composite_frag, defines); | ||||
| MEM_freeN(composite_frag); | MEM_freeN(composite_frag); | ||||
| 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, false, sh_cfg); | wpd->transparent_accum_sh = ensure_forward_accum_shaders( | ||||
| wpd->transparent_accum_hair_sh = ensure_forward_accum_shaders(wpd, false, true, false, sh_cfg); | wpd, false, false, WORKBENCH_COLOR_OVERRIDE_OFF, sh_cfg); | ||||
| wpd->transparent_accum_hair_sh = ensure_forward_accum_shaders( | |||||
| wpd, false, true, WORKBENCH_COLOR_OVERRIDE_OFF, sh_cfg); | |||||
| wpd->transparent_accum_uniform_sh = ensure_forward_accum_shaders( | wpd->transparent_accum_uniform_sh = ensure_forward_accum_shaders( | ||||
| wpd, true, false, false, sh_cfg); | wpd, true, false, WORKBENCH_COLOR_OVERRIDE_OFF, sh_cfg); | ||||
| wpd->transparent_accum_uniform_hair_sh = ensure_forward_accum_shaders( | wpd->transparent_accum_uniform_hair_sh = ensure_forward_accum_shaders( | ||||
| wpd, true, true, false, sh_cfg); | wpd, true, true, WORKBENCH_COLOR_OVERRIDE_OFF, sh_cfg); | ||||
| wpd->transparent_accum_textured_sh = ensure_forward_accum_shaders( | wpd->transparent_accum_textured_sh = ensure_forward_accum_shaders( | ||||
| wpd, false, false, true, sh_cfg); | wpd, false, false, WORKBENCH_COLOR_OVERRIDE_TEXTURE, sh_cfg); | ||||
| wpd->transparent_accum_vertex_sh = ensure_forward_accum_shaders( | |||||
| wpd, false, false, WORKBENCH_COLOR_OVERRIDE_VERTEX, 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]; | ||||
| char *defines = workbench_material_build_defines(wpd, false, false, false); | char *defines = workbench_material_build_defines( | ||||
| char *defines_texture = workbench_material_build_defines(wpd, true, false, false); | wpd, false, false, WORKBENCH_COLOR_OVERRIDE_OFF); | ||||
| char *defines_hair = workbench_material_build_defines(wpd, false, true, false); | char *defines_texture = workbench_material_build_defines( | ||||
| wpd, true, false, WORKBENCH_COLOR_OVERRIDE_OFF); | |||||
| char *defines_hair = workbench_material_build_defines( | |||||
| wpd, false, true, WORKBENCH_COLOR_OVERRIDE_OFF); | |||||
| char *forward_vert = workbench_build_forward_vert(false); | char *forward_vert = workbench_build_forward_vert(false); | ||||
| char *forward_frag = workbench_build_forward_outline_frag(); | char *forward_frag = workbench_build_forward_outline_frag(); | ||||
| char *forward_hair_vert = workbench_build_forward_vert(true); | char *forward_hair_vert = workbench_build_forward_vert(true); | ||||
| const char *define_id_pass = "#define OBJECT_ID_PASS_ENABLED\n"; | const char *define_id_pass = "#define OBJECT_ID_PASS_ENABLED\n"; | ||||
| sh_data->object_outline_sh = GPU_shader_create_from_arrays({ | sh_data->object_outline_sh = GPU_shader_create_from_arrays({ | ||||
| .vert = (const char *[]){sh_cfg_data->lib, forward_vert, NULL}, | .vert = (const char *[]){sh_cfg_data->lib, forward_vert, NULL}, | ||||
| ▲ Show 20 Lines • Show All 299 Lines • ▼ Show 20 Lines | for (int i = 0; i < materials_len; i++) { | ||||
| vedata, ob, mat, image, iuser, color_type, interp); | vedata, ob, mat, image, iuser, color_type, interp); | ||||
| DRW_shgroup_call(material->shgrp, geom_array[i], ob); | DRW_shgroup_call(material->shgrp, geom_array[i], ob); | ||||
| DRW_shgroup_call(material->shgrp_object_outline, geom_array[i], ob); | DRW_shgroup_call(material->shgrp_object_outline, geom_array[i], ob); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| static void workbench_forward_cache_populate_vertex_paint_mode(WORKBENCH_Data *vedata, Object *ob) | |||||
| { | |||||
| WORKBENCH_StorageList *stl = vedata->stl; | |||||
| WORKBENCH_PrivateData *wpd = stl->g_data; | |||||
| const DRWContextState *draw_ctx = DRW_context_state_get(); | |||||
| const bool use_sculpt_pbvh = BKE_sculptsession_use_pbvh_draw(ob, draw_ctx->v3d) && | |||||
| !DRW_state_is_image_render(); | |||||
| WORKBENCH_MaterialData *material; | |||||
| int color_type = workbench_material_determine_color_type(wpd, NULL, ob, use_sculpt_pbvh); | |||||
| struct GPUBatch *geom = DRW_cache_mesh_surface_vertpaint_get(ob); | |||||
| material = workbench_forward_get_or_create_material_data( | |||||
| vedata, ob, NULL, NULL, NULL, color_type, false); | |||||
| DRW_shgroup_call(material->shgrp, geom, ob); | |||||
| DRW_shgroup_call(material->shgrp_object_outline, geom, ob); | |||||
| } | |||||
| void workbench_forward_cache_populate(WORKBENCH_Data *vedata, Object *ob) | void workbench_forward_cache_populate(WORKBENCH_Data *vedata, Object *ob) | ||||
| { | { | ||||
| WORKBENCH_StorageList *stl = vedata->stl; | WORKBENCH_StorageList *stl = vedata->stl; | ||||
| WORKBENCH_PrivateData *wpd = stl->g_data; | WORKBENCH_PrivateData *wpd = stl->g_data; | ||||
| const DRWContextState *draw_ctx = DRW_context_state_get(); | const DRWContextState *draw_ctx = DRW_context_state_get(); | ||||
| Scene *scene = draw_ctx->scene; | Scene *scene = draw_ctx->scene; | ||||
| const bool is_wire = (ob->dt == OB_WIRE); | const bool is_wire = (ob->dt == OB_WIRE); | ||||
| Show All 24 Lines | void workbench_forward_cache_populate(WORKBENCH_Data *vedata, Object *ob) | ||||
| } | } | ||||
| WORKBENCH_MaterialData *material; | WORKBENCH_MaterialData *material; | ||||
| if (ELEM(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL)) { | if (ELEM(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL)) { | ||||
| const bool use_sculpt_pbvh = BKE_sculptsession_use_pbvh_draw(ob, draw_ctx->v3d) && | const bool use_sculpt_pbvh = BKE_sculptsession_use_pbvh_draw(ob, draw_ctx->v3d) && | ||||
| !DRW_state_is_image_render(); | !DRW_state_is_image_render(); | ||||
| const int materials_len = MAX2(1, ob->totcol); | const int materials_len = MAX2(1, ob->totcol); | ||||
| const Mesh *me = (ob->type == OB_MESH) ? ob->data : NULL; | const Mesh *me = (ob->type == OB_MESH) ? ob->data : NULL; | ||||
| const WORKBENCH_ObjectColorOverride color_override = workbench_object_color_override_get(ob); | |||||
| const bool use_texture_paint_drawing = !(DRW_state_is_image_render() && | const bool use_texture_paint_drawing = !(DRW_state_is_image_render() && | ||||
| draw_ctx->v3d == NULL) && | draw_ctx->v3d == NULL) && | ||||
| workbench_is_object_in_texture_paint_mode(ob) && me && | (color_override == WORKBENCH_COLOR_OVERRIDE_TEXTURE) && | ||||
| me->mloopuv; | me && me->mloopuv; | ||||
| const bool use_vertex_paint_drawing = !(DRW_state_is_image_render() && | |||||
| draw_ctx->v3d == NULL) && | |||||
| (color_override == WORKBENCH_COLOR_OVERRIDE_VERTEX) && | |||||
| me && me->mloopcol; | |||||
| if (use_texture_paint_drawing) { | if (use_texture_paint_drawing) { | ||||
| workbench_forward_cache_populate_texture_paint_mode(vedata, ob); | workbench_forward_cache_populate_texture_paint_mode(vedata, ob); | ||||
| } | } | ||||
| else if (use_vertex_paint_drawing) { | |||||
| workbench_forward_cache_populate_vertex_paint_mode(vedata, ob); | |||||
| } | |||||
| else if (!use_sculpt_pbvh && TEXTURE_DRAWING_ENABLED(wpd) && me && me->mloopuv) { | else if (!use_sculpt_pbvh && TEXTURE_DRAWING_ENABLED(wpd) && me && me->mloopuv) { | ||||
| 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++) { | ||||
| 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); | ||||
| ▲ Show 20 Lines • Show All 156 Lines • Show Last 20 Lines | |||||