Fix assert drawing the knife tool points with the Vulkan backend

Using the knife tool with Vulkan failed because using
GPU_PRIM_POINTS isn't supported with the GPU_SHADER_3D_UNIFORM_COLOR
shader.

Resolve using a shader intended for drawing points.

Ref !136109
This commit is contained in:
Campbell Barton
2025-03-18 14:33:16 +11:00
parent c3320a1082
commit 5fc3303a35

View File

@@ -837,6 +837,87 @@ static void knifetool_draw(const bContext * /*C*/, ARegion * /*region*/, void *a
GPUVertFormat *format = immVertexFormat();
uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
/* Draw points. */
GPU_program_point_size(true);
immBindBuiltinProgram(GPU_SHADER_3D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_AA);
/* Needed for AA points. */
GPU_blend(GPU_BLEND_ALPHA);
if (kcd->prev.vert) {
immUniformColor3ubv(kcd->colors.point);
immUniform1f("size", 11 * UI_SCALE_FAC);
immBegin(GPU_PRIM_POINTS, 1);
immVertex3fv(pos, kcd->prev.cage);
immEnd();
}
if (kcd->prev.bmface || kcd->prev.edge) {
immUniformColor3ubv(kcd->colors.curpoint);
immUniform1f("size", 9 * UI_SCALE_FAC);
immBegin(GPU_PRIM_POINTS, 1);
immVertex3fv(pos, kcd->prev.cage);
immEnd();
}
if (kcd->curr.vert) {
immUniformColor3ubv(kcd->colors.point);
immUniform1f("size", 11 * UI_SCALE_FAC);
immBegin(GPU_PRIM_POINTS, 1);
immVertex3fv(pos, kcd->curr.cage);
immEnd();
}
else if (kcd->curr.edge) {
/* Lines (handled below.) */
}
if (kcd->curr.bmface || kcd->curr.edge) {
immUniformColor3ubv(kcd->colors.curpoint);
immUniform1f("size", 9 * UI_SCALE_FAC);
immBegin(GPU_PRIM_POINTS, 1);
immVertex3fv(pos, kcd->curr.cage);
immEnd();
}
if (kcd->depth_test) {
GPU_depth_test(GPU_DEPTH_LESS_EQUAL);
}
if (kcd->totkvert > 0) {
BLI_mempool_iter iter;
KnifeVert *kfv;
immUniformColor3ubv(kcd->colors.point);
immUniform1f("size", 5.0 * UI_SCALE_FAC);
gpu::Batch *batch = immBeginBatchAtMost(GPU_PRIM_POINTS, BLI_mempool_len(kcd->kverts));
BLI_mempool_iternew(kcd->kverts, &iter);
for (kfv = static_cast<KnifeVert *>(BLI_mempool_iterstep(&iter)); kfv;
kfv = static_cast<KnifeVert *>(BLI_mempool_iterstep(&iter)))
{
if (!kfv->is_cut || kfv->is_invalid) {
continue;
}
immVertex3fv(pos, kfv->cageco);
}
immEnd();
GPU_batch_draw(batch);
GPU_batch_discard(batch);
}
GPU_blend(GPU_BLEND_NONE);
immUnbindProgram();
/* Draw lines. */
immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
if (kcd->mode == MODE_DRAGGING) {
@@ -849,31 +930,8 @@ static void knifetool_draw(const bContext * /*C*/, ARegion * /*region*/, void *a
immEnd();
}
if (kcd->prev.vert) {
immUniformColor3ubv(kcd->colors.point);
GPU_point_size(11 * UI_SCALE_FAC);
immBegin(GPU_PRIM_POINTS, 1);
immVertex3fv(pos, kcd->prev.cage);
immEnd();
}
if (kcd->prev.bmface || kcd->prev.edge) {
immUniformColor3ubv(kcd->colors.curpoint);
GPU_point_size(9 * UI_SCALE_FAC);
immBegin(GPU_PRIM_POINTS, 1);
immVertex3fv(pos, kcd->prev.cage);
immEnd();
}
if (kcd->curr.vert) {
immUniformColor3ubv(kcd->colors.point);
GPU_point_size(11 * UI_SCALE_FAC);
immBegin(GPU_PRIM_POINTS, 1);
immVertex3fv(pos, kcd->curr.cage);
immEnd();
/* Points (handled above). */
}
else if (kcd->curr.edge) {
immUniformColor3ubv(kcd->colors.edge);
@@ -885,19 +943,6 @@ static void knifetool_draw(const bContext * /*C*/, ARegion * /*region*/, void *a
immEnd();
}
if (kcd->curr.bmface || kcd->curr.edge) {
immUniformColor3ubv(kcd->colors.curpoint);
GPU_point_size(9 * UI_SCALE_FAC);
immBegin(GPU_PRIM_POINTS, 1);
immVertex3fv(pos, kcd->curr.cage);
immEnd();
}
if (kcd->depth_test) {
GPU_depth_test(GPU_DEPTH_LESS_EQUAL);
}
if (kcd->totkedge > 0) {
BLI_mempool_iter iter;
KnifeEdge *kfe;
@@ -925,32 +970,6 @@ static void knifetool_draw(const bContext * /*C*/, ARegion * /*region*/, void *a
GPU_batch_discard(batch);
}
if (kcd->totkvert > 0) {
BLI_mempool_iter iter;
KnifeVert *kfv;
immUniformColor3ubv(kcd->colors.point);
GPU_point_size(5.0 * UI_SCALE_FAC);
gpu::Batch *batch = immBeginBatchAtMost(GPU_PRIM_POINTS, BLI_mempool_len(kcd->kverts));
BLI_mempool_iternew(kcd->kverts, &iter);
for (kfv = static_cast<KnifeVert *>(BLI_mempool_iterstep(&iter)); kfv;
kfv = static_cast<KnifeVert *>(BLI_mempool_iterstep(&iter)))
{
if (!kfv->is_cut || kfv->is_invalid) {
continue;
}
immVertex3fv(pos, kfv->cageco);
}
immEnd();
GPU_batch_draw(batch);
GPU_batch_discard(batch);
}
/* Draw relative angle snapping reference edge. */
if (kcd->is_angle_snapping && kcd->angle_snapping_mode == KNF_CONSTRAIN_ANGLE_MODE_RELATIVE) {
immUniformColor3ubv(kcd->colors.edge_extra);
@@ -981,13 +1000,14 @@ static void knifetool_draw(const bContext * /*C*/, ARegion * /*region*/, void *a
}
gpu::Batch *batch = GPU_batch_create_ex(GPU_PRIM_POINTS, vert, nullptr, GPU_BATCH_OWNS_VBO);
GPU_batch_program_set_builtin(batch, GPU_SHADER_3D_UNIFORM_COLOR);
GPU_batch_program_set_builtin(batch, GPU_SHADER_3D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_AA);
/* Draw any snapped verts first. */
float fcol[4];
rgba_uchar_to_float(fcol, kcd->colors.point_a);
GPU_batch_uniform_4fv(batch, "color", fcol);
GPU_point_size(11 * UI_SCALE_FAC);
GPU_batch_uniform_1f(batch, "size", 11 * UI_SCALE_FAC);
if (snapped_verts_count > 0) {
GPU_batch_draw_range(batch, 0, snapped_verts_count);
}
@@ -995,7 +1015,8 @@ static void knifetool_draw(const bContext * /*C*/, ARegion * /*region*/, void *a
/* Now draw the rest. */
rgba_uchar_to_float(fcol, kcd->colors.curpoint_a);
GPU_batch_uniform_4fv(batch, "color", fcol);
GPU_point_size(7 * UI_SCALE_FAC);
GPU_batch_uniform_1f(batch, "size", 7 * UI_SCALE_FAC);
if (other_verts_count > 0) {
GPU_batch_draw_range(batch, snapped_verts_count, other_verts_count);
}