Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/modes/paint_vertex_mode.c
| Show First 20 Lines • Show All 72 Lines • ▼ Show 20 Lines | typedef struct PAINT_VERTEX_Data { | ||||
| DRWViewportEmptyList *fbl; | DRWViewportEmptyList *fbl; | ||||
| DRWViewportEmptyList *txl; | DRWViewportEmptyList *txl; | ||||
| PAINT_VERTEX_PassList *psl; | PAINT_VERTEX_PassList *psl; | ||||
| PAINT_VERTEX_StorageList *stl; | PAINT_VERTEX_StorageList *stl; | ||||
| } PAINT_VERTEX_Data; | } PAINT_VERTEX_Data; | ||||
| typedef struct PAINT_VERTEX_Shaders { | typedef struct PAINT_VERTEX_Shaders { | ||||
| struct { | struct { | ||||
| struct GPUShader *color_face; | struct GPUShader *color_face_mul_blending; | ||||
| struct GPUShader *color_face_alpha_blending; | |||||
| struct GPUShader *wire_overlay; | struct GPUShader *wire_overlay; | ||||
| struct GPUShader *wire_select_overlay; | struct GPUShader *wire_select_overlay; | ||||
| } by_mode[MODE_LEN]; | } by_mode[MODE_LEN]; | ||||
| struct GPUShader *face_select_overlay; | struct GPUShader *face_select_overlay; | ||||
| struct GPUShader *vert_select_overlay; | struct GPUShader *vert_select_overlay; | ||||
| } PAINT_VERTEX_Shaders; | } PAINT_VERTEX_Shaders; | ||||
| /* *********** STATIC *********** */ | /* *********** STATIC *********** */ | ||||
| Show All 19 Lines | |||||
| { | { | ||||
| PAINT_VERTEX_StorageList *stl = ((PAINT_VERTEX_Data *)vedata)->stl; | PAINT_VERTEX_StorageList *stl = ((PAINT_VERTEX_Data *)vedata)->stl; | ||||
| const DRWContextState *draw_ctx = DRW_context_state_get(); | const DRWContextState *draw_ctx = DRW_context_state_get(); | ||||
| PAINT_VERTEX_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg]; | PAINT_VERTEX_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg]; | ||||
| const GPUShaderConfigData *sh_cfg_data = &GPU_shader_cfg_data[draw_ctx->sh_cfg]; | const GPUShaderConfigData *sh_cfg_data = &GPU_shader_cfg_data[draw_ctx->sh_cfg]; | ||||
| if (!sh_data->face_select_overlay) { | if (!sh_data->face_select_overlay) { | ||||
| sh_data->by_mode[VERTEX_MODE].color_face = GPU_shader_create_from_arrays({ | sh_data->by_mode[VERTEX_MODE].color_face_mul_blending = GPU_shader_create_from_arrays({ | ||||
| .vert = (const char *[]){sh_cfg_data->lib, | .vert = (const char *[]){sh_cfg_data->lib, | ||||
| datatoc_common_view_lib_glsl, | datatoc_common_view_lib_glsl, | ||||
| datatoc_paint_vertex_vert_glsl, | datatoc_paint_vertex_vert_glsl, | ||||
| NULL}, | NULL}, | ||||
| .frag = (const char *[]){datatoc_paint_vertex_frag_glsl, NULL}, | .frag = (const char *[]){datatoc_paint_vertex_frag_glsl, NULL}, | ||||
| .defs = (const char *[]){sh_cfg_data->def, NULL}, | .defs = (const char *[]){sh_cfg_data->def, NULL}, | ||||
| }); | }); | ||||
| sh_data->by_mode[WEIGHT_MODE].color_face = GPU_shader_create_from_arrays({ | sh_data->by_mode[VERTEX_MODE].color_face_alpha_blending = GPU_shader_create_from_arrays({ | ||||
| .vert = (const char *[]){sh_cfg_data->lib, | |||||
| datatoc_common_view_lib_glsl, | |||||
| datatoc_paint_vertex_vert_glsl, | |||||
| NULL}, | |||||
| .frag = (const char *[]){datatoc_paint_vertex_frag_glsl, NULL}, | |||||
| .defs = (const char *[]){sh_cfg_data->def, "#define DRW_STATE_BLEND_ALPHA\n", NULL}, | |||||
| }); | |||||
| sh_data->by_mode[WEIGHT_MODE].color_face_mul_blending = GPU_shader_create_from_arrays({ | |||||
| .vert = (const char *[]){sh_cfg_data->lib, | .vert = (const char *[]){sh_cfg_data->lib, | ||||
| datatoc_common_view_lib_glsl, | datatoc_common_view_lib_glsl, | ||||
| datatoc_common_globals_lib_glsl, | datatoc_common_globals_lib_glsl, | ||||
| datatoc_paint_weight_vert_glsl, | datatoc_paint_weight_vert_glsl, | ||||
| NULL}, | NULL}, | ||||
| .frag = (const char *[]){datatoc_common_globals_lib_glsl, | .frag = (const char *[]){datatoc_common_globals_lib_glsl, | ||||
| datatoc_paint_weight_frag_glsl, | datatoc_paint_weight_frag_glsl, | ||||
| NULL}, | NULL}, | ||||
| .defs = (const char *[]){sh_cfg_data->def, NULL}, | .defs = (const char *[]){sh_cfg_data->def, "#define DRW_STATE_BLEND_MUL\n", NULL}, | ||||
| }); | |||||
| sh_data->by_mode[WEIGHT_MODE].color_face_alpha_blending = GPU_shader_create_from_arrays({ | |||||
| .vert = (const char *[]){sh_cfg_data->lib, | |||||
| datatoc_common_view_lib_glsl, | |||||
| datatoc_common_globals_lib_glsl, | |||||
| datatoc_paint_weight_vert_glsl, | |||||
| NULL}, | |||||
| .frag = (const char *[]){datatoc_common_globals_lib_glsl, | |||||
| datatoc_paint_weight_frag_glsl, | |||||
| NULL}, | |||||
| .defs = (const char *[]){sh_cfg_data->def, "#define DRW_STATE_BLEND_ALPHA\n", NULL}, | |||||
| }); | }); | ||||
| sh_data->face_select_overlay = GPU_shader_create_from_arrays({ | sh_data->face_select_overlay = GPU_shader_create_from_arrays({ | ||||
| .vert = (const char *[]){sh_cfg_data->lib, | .vert = (const char *[]){sh_cfg_data->lib, | ||||
| datatoc_common_view_lib_glsl, | datatoc_common_view_lib_glsl, | ||||
| datatoc_paint_face_selection_vert_glsl, | datatoc_paint_face_selection_vert_glsl, | ||||
| NULL}, | NULL}, | ||||
| .frag = (const char *[]){datatoc_gpu_shader_uniform_color_frag_glsl, NULL}, | .frag = (const char *[]){datatoc_gpu_shader_uniform_color_frag_glsl, NULL}, | ||||
| .defs = (const char *[]){sh_cfg_data->def, NULL}, | .defs = (const char *[]){sh_cfg_data->def, "#define DRW_STATE_BLEND_MUL\n", NULL}, | ||||
| }); | }); | ||||
| sh_data->vert_select_overlay = GPU_shader_create_from_arrays({ | sh_data->vert_select_overlay = GPU_shader_create_from_arrays({ | ||||
| .vert = (const char *[]){sh_cfg_data->lib, | .vert = (const char *[]){sh_cfg_data->lib, | ||||
| datatoc_common_globals_lib_glsl, | datatoc_common_globals_lib_glsl, | ||||
| datatoc_common_view_lib_glsl, | datatoc_common_view_lib_glsl, | ||||
| datatoc_paint_wire_vert_glsl, | datatoc_paint_wire_vert_glsl, | ||||
| NULL}, | NULL}, | ||||
| .frag = (const char *[]){datatoc_paint_vert_frag_glsl, NULL}, | .frag = (const char *[]){datatoc_paint_vert_frag_glsl, NULL}, | ||||
| Show All 29 Lines | static void PAINT_VERTEX_engine_init(void *vedata) | ||||
| if (!stl->g_data) { | if (!stl->g_data) { | ||||
| /* Alloc transient pointers */ | /* Alloc transient pointers */ | ||||
| stl->g_data = MEM_mallocN(sizeof(*stl->g_data), __func__); | stl->g_data = MEM_mallocN(sizeof(*stl->g_data), __func__); | ||||
| } | } | ||||
| stl->g_data->view_wires = DRW_view_create_with_zoffset(draw_ctx->rv3d, 1.0f); | stl->g_data->view_wires = DRW_view_create_with_zoffset(draw_ctx->rv3d, 1.0f); | ||||
| } | } | ||||
| static bool PAINT_VERTEX_use_alpha_blending(void) | |||||
fclem: I don't feel like this need to be a separate function. It's unlikely to be reused. | |||||
| { | |||||
| const DRWContextState *draw_ctx = DRW_context_state_get(); | |||||
| return (draw_ctx->v3d->shading.type == OB_WIRE); | |||||
| } | |||||
| static void PAINT_VERTEX_cache_init(void *vedata) | static void PAINT_VERTEX_cache_init(void *vedata) | ||||
| { | { | ||||
| PAINT_VERTEX_PassList *psl = ((PAINT_VERTEX_Data *)vedata)->psl; | PAINT_VERTEX_PassList *psl = ((PAINT_VERTEX_Data *)vedata)->psl; | ||||
| PAINT_VERTEX_StorageList *stl = ((PAINT_VERTEX_Data *)vedata)->stl; | PAINT_VERTEX_StorageList *stl = ((PAINT_VERTEX_Data *)vedata)->stl; | ||||
| const DRWContextState *draw_ctx = DRW_context_state_get(); | const DRWContextState *draw_ctx = DRW_context_state_get(); | ||||
| const View3D *v3d = draw_ctx->v3d; | const View3D *v3d = draw_ctx->v3d; | ||||
| const RegionView3D *rv3d = draw_ctx->rv3d; | const RegionView3D *rv3d = draw_ctx->rv3d; | ||||
| PAINT_VERTEX_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg]; | PAINT_VERTEX_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg]; | ||||
| const bool use_alpha_blending = PAINT_VERTEX_use_alpha_blending(); | |||||
| DRWState draw_state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL | | |||||
| (use_alpha_blending ? DRW_STATE_BLEND_ALPHA : DRW_STATE_BLEND_MUL); | |||||
| /* Vertex color pass */ | /* Vertex color pass */ | ||||
| { | { | ||||
| DRWPass *pass = DRW_pass_create( | DRWPass *pass = DRW_pass_create("Vert Color Pass", draw_state); | ||||
| "Vert Color Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL | DRW_STATE_BLEND_MUL); | GPUShader *shader = use_alpha_blending ? | ||||
| DRWShadingGroup *shgrp = DRW_shgroup_create(sh_data->by_mode[VERTEX_MODE].color_face, pass); | sh_data->by_mode[VERTEX_MODE].color_face_alpha_blending : | ||||
| DRW_shgroup_uniform_float_copy( | sh_data->by_mode[VERTEX_MODE].color_face_mul_blending; | ||||
| shgrp, "white_factor", 1.0f - v3d->overlay.vertex_paint_mode_opacity); | DRWShadingGroup *shgrp = DRW_shgroup_create(shader, pass); | ||||
| DRW_shgroup_uniform_float(shgrp, "opacity", &v3d->overlay.vertex_paint_mode_opacity, 1); | |||||
| if (rv3d->rflag & RV3D_CLIPPING) { | if (rv3d->rflag & RV3D_CLIPPING) { | ||||
| DRW_shgroup_state_enable(shgrp, DRW_STATE_CLIP_PLANES); | DRW_shgroup_state_enable(shgrp, DRW_STATE_CLIP_PLANES); | ||||
| } | } | ||||
| psl->by_mode[VERTEX_MODE].color_faces = pass; | psl->by_mode[VERTEX_MODE].color_faces = pass; | ||||
| stl->g_data->by_mode[VERTEX_MODE].color_shgrp = shgrp; | stl->g_data->by_mode[VERTEX_MODE].color_shgrp = shgrp; | ||||
| } | } | ||||
| /* Weight color pass */ | /* Weight color pass */ | ||||
| { | { | ||||
| DRWPass *pass = DRW_pass_create( | DRWPass *pass = DRW_pass_create("Weight Pass", draw_state); | ||||
| "Weight Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL | DRW_STATE_BLEND_MUL); | GPUShader *shader = use_alpha_blending ? | ||||
| DRWShadingGroup *shgrp = DRW_shgroup_create(sh_data->by_mode[WEIGHT_MODE].color_face, pass); | sh_data->by_mode[WEIGHT_MODE].color_face_alpha_blending : | ||||
| sh_data->by_mode[WEIGHT_MODE].color_face_mul_blending; | |||||
| DRWShadingGroup *shgrp = DRW_shgroup_create(shader, pass); | |||||
| DRW_shgroup_uniform_bool_copy( | DRW_shgroup_uniform_bool_copy( | ||||
| shgrp, "drawContours", (v3d->overlay.wpaint_flag & V3D_OVERLAY_WPAINT_CONTOURS) != 0); | shgrp, "drawContours", (v3d->overlay.wpaint_flag & V3D_OVERLAY_WPAINT_CONTOURS) != 0); | ||||
| DRW_shgroup_uniform_float(shgrp, "opacity", &v3d->overlay.weight_paint_mode_opacity, 1); | DRW_shgroup_uniform_float(shgrp, "opacity", &v3d->overlay.weight_paint_mode_opacity, 1); | ||||
| DRW_shgroup_uniform_texture(shgrp, "colorramp", G_draw.weight_ramp); | DRW_shgroup_uniform_texture(shgrp, "colorramp", G_draw.weight_ramp); | ||||
| DRW_shgroup_uniform_block(shgrp, "globalsBlock", G_draw.block_ubo); | DRW_shgroup_uniform_block(shgrp, "globalsBlock", G_draw.block_ubo); | ||||
| if (rv3d->rflag & RV3D_CLIPPING) { | if (rv3d->rflag & RV3D_CLIPPING) { | ||||
| DRW_shgroup_state_enable(shgrp, DRW_STATE_CLIP_PLANES); | DRW_shgroup_state_enable(shgrp, DRW_STATE_CLIP_PLANES); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 158 Lines • Show Last 20 Lines | |||||
I don't feel like this need to be a separate function. It's unlikely to be reused.