В OpenGL обычный подход - перерисовывать всю сцену всякий раз, когда какая-то ее часть изменяется.В вашем случае изменение контрольных точек B-сплайна должно вызвать повторное отображение сцены вместо выполнения операций рисования в функции обработчика щелчка мышью.
OpenGL не имеет постоянства геометрии, он просто рисует примитивы в пиксельном кадровом буфере,И как таковой вы должны использовать его.
Чтобы уточнить, некоторые псевдокод:
BSpline *b_spline;
void on_mouseclick(int x, int y)
{
float x_, y_;
transform_screen_to_scene(x,y, &x_, &y_);
bspline_add_control_point(b_spline, x_, y_);
trigger_redisplay();
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
setup_viewport_and_projection();
bspline_draw(b_spline);
swap_buffers();
}