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:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user