add fit to widget option to camera view (#22056)

* add fit to widget option to camera view

* add clicked signal

* cleanup

* use release for driverview

Co-authored-by: Comma Device <device@comma.ai>
old-commit-hash: 86a73497de
commatwo_master
Adeeb Shihadeh 4 years ago committed by GitHub
parent ea344bb52f
commit 8cbf48b550
  1. 4
      selfdrive/ui/qt/offroad/driverview.cc
  2. 2
      selfdrive/ui/qt/offroad/driverview.h
  3. 63
      selfdrive/ui/qt/widgets/cameraview.cc
  4. 8
      selfdrive/ui/qt/widgets/cameraview.h

@ -12,7 +12,7 @@ DriverViewWindow::DriverViewWindow(QWidget* parent) : QWidget(parent) {
layout = new QStackedLayout(this);
layout->setStackingMode(QStackedLayout::StackAll);
cameraView = new CameraViewWidget(VISION_STREAM_RGB_FRONT, this);
cameraView = new CameraViewWidget(VISION_STREAM_RGB_FRONT, true, this);
layout->addWidget(cameraView);
scene = new DriverViewScene(this);
@ -21,7 +21,7 @@ DriverViewWindow::DriverViewWindow(QWidget* parent) : QWidget(parent) {
layout->setCurrentWidget(scene);
}
void DriverViewWindow::mousePressEvent(QMouseEvent* e) {
void DriverViewWindow::mouseReleaseEvent(QMouseEvent* e) {
emit done();
}

@ -39,7 +39,7 @@ signals:
void done();
protected:
void mousePressEvent(QMouseEvent* e) override;
void mouseReleaseEvent(QMouseEvent* e) override;
private:
CameraViewWidget *cameraView;

@ -1,8 +1,8 @@
#include "selfdrive/ui/qt/widgets/cameraview.h"
#include "selfdrive/ui/qt/qt_window.h"
#include "selfdrive/ui/qt/widgets/cameraview.h"
namespace {
const char frame_vertex_shader[] =
#ifdef NANOVG_GL3_IMPLEMENTATION
"#version 150 core\n"
@ -73,9 +73,27 @@ mat4 get_driver_view_transform() {
return transform;
}
mat4 get_fit_view_transform(float widget_aspect_ratio, float frame_aspect_ratio) {
float zx = 1, zy = 1;
if (frame_aspect_ratio > widget_aspect_ratio) {
zy = widget_aspect_ratio / frame_aspect_ratio;
} else {
zx = frame_aspect_ratio / widget_aspect_ratio;
}
const mat4 frame_transform = {{
zx, 0.0, 0.0, 0.0,
0.0, zy, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0,
}};
return frame_transform;
}
} // namespace
CameraViewWidget::CameraViewWidget(VisionStreamType stream_type, QWidget* parent) : stream_type(stream_type), QOpenGLWidget(parent) {
CameraViewWidget::CameraViewWidget(VisionStreamType stream_type, bool zoom, QWidget* parent) :
stream_type(stream_type), zoomed_view(zoom), QOpenGLWidget(parent) {
setAttribute(Qt::WA_OpaquePaintEvent);
timer = new QTimer(this);
@ -125,6 +143,29 @@ void CameraViewWidget::initializeGL() {
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
vipc_client = std::make_unique<VisionIpcClient>("camerad", stream_type, true);
}
void CameraViewWidget::showEvent(QShowEvent *event) {
timer->start(0);
}
void CameraViewWidget::hideEvent(QHideEvent *event) {
timer->stop();
vipc_client->connected = false;
latest_frame = nullptr;
}
void CameraViewWidget::mouseReleaseEvent(QMouseEvent *event) {
emit clicked();
}
void CameraViewWidget::resizeGL(int w, int h) {
if (!vipc_client->connected) {
return;
}
if (zoomed_view) {
if (stream_type == VISION_STREAM_RGB_FRONT) {
frame_mat = matmul(device_transform, get_driver_view_transform());
} else {
@ -144,17 +185,12 @@ void CameraViewWidget::initializeGL() {
}};
frame_mat = matmul(device_transform, frame_transform);
}
vipc_client = std::make_unique<VisionIpcClient>("camerad", stream_type, true);
}
void CameraViewWidget::showEvent(QShowEvent *event) {
timer->start(0);
} else {
// fit frame to widget size
float w = (float)width() / height();
float f = (float)vipc_client->buffers[0].width / vipc_client->buffers[0].height;
frame_mat = matmul(device_transform, get_fit_view_transform(w, f));
}
void CameraViewWidget::hideEvent(QHideEvent *event) {
timer->stop();
vipc_client->connected = false;
latest_frame = nullptr;
}
void CameraViewWidget::paintGL() {
@ -204,6 +240,7 @@ void CameraViewWidget::updateFrame() {
assert(glGetError() == GL_NO_ERROR);
}
latest_frame = nullptr;
resizeGL(width(), height());
}
if (vipc_client->connected) {

@ -16,22 +16,26 @@ Q_OBJECT
public:
using QOpenGLWidget::QOpenGLWidget;
explicit CameraViewWidget(VisionStreamType stream_type, QWidget* parent = nullptr);
explicit CameraViewWidget(VisionStreamType stream_type, bool zoom, QWidget* parent = nullptr);
~CameraViewWidget();
signals:
void clicked();
void frameUpdated();
protected:
void paintGL() override;
void resizeGL(int w, int h) override;
void initializeGL() override;
void showEvent(QShowEvent *event) override;
void hideEvent(QHideEvent *event) override;
void mouseReleaseEvent(QMouseEvent *event) override;
protected slots:
void updateFrame();
private:
bool zoomed_view;
VisionBuf *latest_frame = nullptr;
GLuint frame_vao, frame_vbo, frame_ibo;
mat4 frame_mat;
@ -39,6 +43,6 @@ private:
std::unique_ptr<EGLImageTexture> texture[UI_BUF_COUNT];
std::unique_ptr<GLShader> gl_shader;
VisionStreamType stream_type;
QTimer* timer;
VisionStreamType stream_type;
};

Loading…
Cancel
Save