void Renderer::on_surface_changed(int width, int height, bool is_tablet) { DLOG(INFO) << "Surface changed: " << width << "x" << height << ", tablet: " << std::boolalpha << is_tablet; invalidate(); // Устанавливаем вьюпорт принудительно, так как gl-контекст между сменами поверхности мог быть разрушен gl::set_viewport(rectangle_t(0, 0, width, height), true); // Запоминаем размеры экрана. Если размеры поверхности не изменились, матрицы не изменяем if (!gl::set_screen_size(dimension_t(width, height))) return; // Строим исходную матрицу проекции, от которой будут отталкиваться координаты объектов matrix().reset(); /* // Аспект - отношение ширины вьюпорта к его высоте float aspect = (float)width / (float)height; // Перспектива: ближняя и дальняя плоскости отсечения всегда положительные, ось Z направлена из глубины в // сторону экрана, позиция камеры в нулевой точке мировых координат, смотрит в глубину экрана, расположена // в горизонтальной плоскости осей X и Z. matrix().perspective(45.0f, aspect, 0.0001f, 100.0f); // Камеру разворачиваем вокруг оси Z в обратную сторону, чтобы смотрела по направлению оси Z. Таким образом // добиваемся того, что ось Z направлена от экрана в глубину, а не наоборот. matrix().look_at(position_t(0.0f, 0.0f, 0.0f), position_t(0.0f, 0.0f, 1.0f), position_t(0.0f, 1.0f, 0.0f)); */ matrix().ortho(0.0f, static_cast<GLfloat>(width), static_cast<GLfloat>(height), 0.0f, -100.0f, 100.0f); }
void CamWnd::draw() { m_drawing = true; gtkutil::GLWidgetSentry sentry(m_gl_widget); if (GlobalMap().isValid() && ScreenUpdates_Enabled()) { Cam_Draw(); m_XORRectangle.set(rectangle_t()); } m_drawing = false; }