Добрый день. Решил поделиться наблюдением и заодно спросить у экспертов.
Имеется класс для виджета c OpenGL, вот кусок кода из его хедер-файла:
class editorScene : public QGLWidget {
...
GLuint current_texture[0]; // Да-да, именно 0, читайте ниже...
QPoint ptr_mouse_position;
...
}
В файле с реализацией методов помимо всех есть реализация наследованного метода для курсора мыши:
void editorScene::mouseMoveEvent(QMouseEvent* pe) {
x_translate += (pe->x() - ptr_mouse_position.x()) / (200 * zoom);
y_translate -= (pe->y() - ptr_mouse_position.y()) / (200 * zoom);
ptr_mouse_position = pe->pos();
updateGL();
}
И так же есть метод загрузки текущий для загрузки текущей текстуры (можно было сделать конечно как дружественную хелпер-функцию, но не суть):
void editorScene::LoadGLTextures(const QString &filename) {
QImage img;
img.load(filename);
if (!img.load(filename)) {
std::cerr << "Cannot read texture file\n";
return;
}
QImage GL_formatted_image;
GL_formatted_image = QGLWidget::convertToGLFormat(img);
if(GL_formatted_image.isNull()) {
std::cerr << "GL_formatted_image empty\n";
return;
}
glGenTextures(1, current_texture);
glBindTexture(GL_TEXTURE_2D, current_texture[0]);
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
GL_formatted_image.width(), GL_formatted_image.height(),
0, GL_RGBA, GL_UNSIGNED_BYTE, GL_formatted_image.bits());
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}
Немсотря на то, что у нас current_texture это массив из 0 эллементов, все компилируется (qt 4.7.4 (qtCreator 2.3, g++ 4.2) / macOs 10.6).
Причем все еще при этом рисуется! Но координаты мыши по оси Oy в итоге считаются совершенно фантастическим образом. При замене в объявлении current_texture[0] на current_texture[1] все работает как часы. Точно не уверен, но видимо при компиляции все же под массив выделяется
почти достаточно памяти для текстуры одной, но часть еще дописывается куда-то в ptr_mouse_position.