У меня есть эта функция, которая говорит, когда я нажимаю a
Я переключаюсь между GL_LINE
а также GL_FILL
, когда я запускаю программу, она начинается с GL_FILL
и когда я нажимаю a
он переключается на GL_LINE
, Однако я хочу, чтобы он продолжал переключаться между a
нажата.
может кто-нибудь сказать мне, где я иду не так.
void keyPressed (unsigned char key, int x, int y) {
switch (key){
case 'a':
bool f = false;
if(!f){
glPolygonMode(GL_FRONT,GL_LINE);
glPolygonMode(GL_BACK, GL_LINE);
}else{
//bOutline=false;
glPolygonMode(GL_FRONT,GL_FILL);
glPolygonMode(GL_BACK, GL_FILL);
}
f=!f;
break;
}
}
я думаю, что вы должны переключаться между двумя состояниями, которые обрабатываются с помощью f, поэтому вам нужно определить f во внешней области видимости или определить его как статическую переменную, как это
static bool f = false;
Вы должны определить f как статическую переменную, чтобы поддерживать ее значение между вызовами функций.
статическое bool f = false;
или просто сделать его глобальной переменной
вы определяете бул f
внутри функции каждый раз, когда она вызывается, поэтому вы должны либо определить ее как глобальную переменную, я не рекомендую, либо как статическую переменную:
static bool f = false;
Вы также можете использовать glGet
с аргументом GL_POLYGON_MODE
чтобы найти текущий режим для передней и задней граней, например:
GLint polyMode[2];
//returns front and back modes
glGetIntegerv(GL_POLYGON_MODE, polyMode);
switch(polyMode[0]) {
case GL_LINE:
//add code
break;
case GL_FILL:
//add code
break;
case GL_POINTS:
//add code
break;
}
Вы действительно нуждаетесь f
? Мне кажется, вы хотите переключиться между двумя значениями, так почему бы не что-то вроде этого:
GLint previous[2];
glGetIntegerv( GL_POLYGON_MODE, previous );
glPolygonMode( GL_FRONT, previous[0] == GL_LINE ? GL_FILL : GL_LINE);
glPolygonMode( GL_BACK, previous[1] == GL_LINE ? GL_FILL : GL_LINE);