Всем доброго времени суток. Недавно начал осваивать OpenGL и писать небольшой фреймворк для дальнейшего использования в своих целях. В процессе работы наткнулся на грабли, от которых просто вылетел в нирвану. Суть вопроса вот в чем.
Есть два класса: один для обслуживания событий, второй для работы с OpenGL. Класс обработки событий выглядит следующим образом:
----------------------------------------------------------------------------------------------------
enum aMode {AP_PRELOAD, AP_LOGIN, AP_INIT, AP_PLAY, AP_EXCEPTION};
class aController {
public:
aController ();
virtual ~aController();
bool run (MSG);
aMode mode;
private:
bool actionPreload (MSG);
bool actionLogin (MSG);
xModel test;
xHelper helper;
};
/**
* Контроллер цикла обработки управление передается извне...
*
* @param MSG message Сообщение от обработчика событий приложения
* @return bool
*/
bool aController::run (MSG message) {
switch (this->mode) {
case AP_PRELOAD:
this->actionPreload (message);
break;
case AP_LOGIN:
// --- Mark.1
this->helper.render(this->test);
this->actionLogin (message);
break;
case AP_INIT:
case AP_PLAY:
case AP_EXCEPTION:
break;
}
...
return true;
}
bool aController::actionPreload (MSG message) {
// --- переключение на следующий этап
this->mode = AP_LOGIN;
// --- загрузка 3D модели(формат - самопал)
this->test = this->helper.load(TEXT("media/models/loginform/planet.exmf"));
...
return true;
}
bool aController::actionLogin (MSG message) {
// --- Mark.2
//this->helper.render(this->test);
// --- Mark.3
//this->test.rotation.x += 0.1f;
//this->test.rotation.y += 0.06f;
//this->test.rotation.z += 0.04f;
...
return true;
}
----------------------------------------------------------------------------------------------------
Особый интерес вызвали строки, отмеченные в тексте как Mark.1 и Mark.2. Метод
this->helper.render(this->test) - служит для рендеринга модели, предварительно сохраненной в this->test. Так вот, злая шутка заключается в том, что этот метод прекрасно работает внутри свича(switch). Но, если закомментировать вызов этого метода в Mark.1 и убрать комментирование в Mark.2 - рендеринг модели прекращается. Ну и, чтобы уже окончательно себя поставить в тупик - я добавил вращение модели внутри вызываемого свичкейсом метода: Mark.3. Модель нормально отображается, при чем вращается, если рендер прописан внутри свичкейса. А вот, если прописать рендер внутри метода actionLogin(Mark.2) - модель тупо не отображается.
Кто-нибудь сталкивался с подобным?
Примечание:
В результате целой кучи всяких экспериментов в стиле "методом научного тыка" - определил еще один нюанс, который меня поверг в депрессию. Если после шапки метода bool aController::run (MSG message) добавить декларацию любой переменной, абсолютно пофиг какой, хоть даже "int i;" - все начинает нормально работать. И что-то мне подсказывает, что вряд-ли найдется человек, способен это прокомментировать... :)
Примечание:
@Игнис Господи, а при чем тут инкапсуляция??? Я работаю недавно с OpenGL, но с С и подобными компиляторами работаю около 15 лет. Рендер в цикле??? Флаг Вам в руки и барабан на шею. Я понимаю, что когда человек привык писать структурами и ему просто лень выучить ООП, то он так и будет грешить на инкапсуляции а не на кривые руки. Поверьте, по уровню инкапсуляции этот проект даже на 5% не приближается к тем проектам, с которыми мне приходилось иметь дело.
RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.
Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.
Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.