C++, OpenGL и объекты

Компьютеры windows Программирование OpenGL

Всем доброго времени суток. Недавно начал осваивать 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% не приближается к тем проектам, с которыми мне приходилось иметь дело.
Ответы:
АФФИИИИИГГГЕЕЕЕЕТТТЬЬЬ)).......так пойдет??
Первое. Вы извращенец батенька. Второе, при таком уровне "инкапсуляции" я вообще удивлюсь если у Вас сцена не разбредется по кускам в бесконечность (курим доки по стекам ОГЛы и прочего). Сделайте как нормальный человек ))) Ну или почитайте, что нить на эту тему. Если уж хотите именно обьектным методом. То желательно, что бы рендер как таковой происходил в определенном цикле. Просчет - в другом. Тогда не надо будет болеть голове, почему вдруг сцену развернуло и отзеркалило. А на следующей итерации и вовсе "уплыла" с экрана.


13 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.