Implementation starts to make sense. TODO: major refactoring, a lot of utility functions like fit, ...

This commit is contained in:
Matthias Koefferlein 2020-04-13 22:18:52 +02:00
parent 9c00568301
commit 2ec712b104
1 changed files with 34 additions and 44 deletions

View File

@ -75,7 +75,7 @@ D25ViewWidget::reset ()
{ {
m_scale_factor = 1.0; m_scale_factor = 1.0;
m_focus_dist = 0.0; m_focus_dist = 0.0;
m_fov = 60.0; m_fov = 90.0;
m_cam_azimuth = m_cam_elevation = 0.0; m_cam_azimuth = m_cam_elevation = 0.0;
m_top_view = false; m_top_view = false;
m_dragging = m_rotating = false; m_dragging = m_rotating = false;
@ -138,6 +138,8 @@ D25ViewWidget::keyPressEvent (QKeyEvent *event)
{ {
if (event->key () == Qt::Key_Shift) { if (event->key () == Qt::Key_Shift) {
m_top_view = true; m_top_view = true;
m_dragging = false;
m_rotating = false;
refresh (); refresh ();
} }
} }
@ -147,6 +149,8 @@ D25ViewWidget::keyReleaseEvent (QKeyEvent *event)
{ {
if (event->key () == Qt::Key_Shift) { if (event->key () == Qt::Key_Shift) {
m_top_view = false; m_top_view = false;
m_dragging = false;
m_rotating = false;
refresh (); refresh ();
} }
} }
@ -195,7 +199,7 @@ D25ViewWidget::mousePressEvent (QMouseEvent *event)
// by definition the ray goes through the camera position // by definition the ray goes through the camera position
QVector3D hp = hit_point_with_scene (cam_direction ()); QVector3D hp = hit_point_with_scene (cam_direction ());
m_focus_dist = std::max (m_focus_dist, double ((cam_position () - hp).length ())); m_focus_dist = (cam_position () - hp).length ();
m_hit_point = cam_position () + cam_direction () * m_focus_dist; m_hit_point = cam_position () + cam_direction () * m_focus_dist;
} else if (m_rotating) { } else if (m_rotating) {
@ -219,6 +223,7 @@ void
D25ViewWidget::mouseReleaseEvent (QMouseEvent * /*event*/) D25ViewWidget::mouseReleaseEvent (QMouseEvent * /*event*/)
{ {
m_dragging = false; m_dragging = false;
m_rotating = false;
} }
void void
@ -244,46 +249,39 @@ D25ViewWidget::mouseMoveEvent (QMouseEvent *event)
} else { } else {
double focus_dist = 2.0;
QPoint d = event->pos () - m_start_pos;
double f = tan ((cam_fov () / 2) / 180.0 * M_PI) * focus_dist * 2.0 / double (height ());
double dx = d.x () * f;
double dy = -d.y () * f;
if (! m_top_view) { if (! m_top_view) {
// fixed focus point for rotation
double focus_dist = 2.0;
QPoint d = event->pos () - m_start_pos;
double f = tan ((cam_fov () / 2) / 180.0 * M_PI) * focus_dist * 2.0 / double (height ());
double dx = d.x () * f;
double dy = -d.y () * f;
double da = dx / (cam_dist () - focus_dist) * 180.0 / M_PI; double da = dx / (cam_dist () - focus_dist) * 180.0 / M_PI;
m_cam_azimuth = m_start_cam_azimuth + da; m_cam_azimuth = m_start_cam_azimuth + da;
double de = dy / (cam_dist () - focus_dist) * 180.0 / M_PI; double de = dy / (cam_dist () - focus_dist) * 180.0 / M_PI;
m_cam_elevation = m_start_cam_elevation + de; m_cam_elevation = m_start_cam_elevation + de;
printf("@@@ -> dy=%g de=%g focus_dist=%g\n", dy, de, focus_dist); fflush(stdout); } else {
// simple change of azimuth only - with center in the middle
QPoint m = event->pos () - m_start_pos;
QVector3D p (m_start_pos.x () - width () / 2, -m_start_pos.y () + height () / 2, 0);
QVector3D d (m.x (), -m.y (), 0);
double cp = QVector3D::crossProduct (p, p + d).z () / p.length () / (p + d).length ();
cp = std::max (-1.0, std::min (1.0, cp));
double da = asin (cp) * 180.0 / M_PI;
m_cam_azimuth += da;
m_start_pos = event->pos ();
} }
#if 0
if (m_hit_point.x () * dx < 0 && (dx + 2.0 * m_hit_point.x ()) * m_hit_point.x () > 0) {
double da = asin (dx / m_hit_point.x () - 1.0) * 180.0 / M_PI;
// @@@ printf("@@@ hp=%g,%g,%g drag=%g,%g -> da=%g\n", m_hit_point.x(), m_hit_point.y(), m_hit_point.z(), drag.x(), drag.z(), da); fflush(stdout);
m_cam_azimuth = m_start_cam_azimuth + da;
}
#endif
#if 0
// elevation change
if (! m_top_view) {
dp = m_hit_point + QVector3D (0.0, float (drag.y ()), 0.0);
double de = QVector3D::crossProduct (dp, m_hit_point).length () * (drag.y () > 0 ? 1.0 : -1.0) / (dp.length () * m_hit_point.length ()) * 180.0 / M_PI;
m_cam_elevation = m_start_cam_elevation + de;
}
#endif
} }
refresh (); refresh ();
@ -715,19 +713,6 @@ D25ViewWidget::initializeGL ()
"layout (location = 0) in vec4 posAttr;\n" "layout (location = 0) in vec4 posAttr;\n"
"uniform mat4 matrix;\n" "uniform mat4 matrix;\n"
"\n" "\n"
"vec4 color_by_z(vec4 face_color, highp float z) {\n"
" vec4 mist_color = vec4(1.0, 1.0, 1.0, 1.0);\n"
" highp float d = -2.309;\n" // tan(camera_fov/2)*camera_dist
" highp float dd = 0.0;\n"
" highp float f = 1.0;\n"
" if (z < d - dd) {\n"
" f = 0.0;\n"
" } else if (z < d + dd) {\n"
" f = (z - (d - dd)) / (2.0 * dd);\n"
" }\n"
" return (1.0 - f) * mist_color + f * face_color;\n"
"};\n"
"\n"
"void main() {\n" "void main() {\n"
" gl_Position = matrix * posAttr;\n" " gl_Position = matrix * posAttr;\n"
"}\n"; "}\n";
@ -945,6 +930,11 @@ D25ViewWidget::paintGL ()
} }
l = m_bbox.left ();
r = m_bbox.right ();
b = m_bbox.bottom ();
t = m_bbox.top ();
GLfloat plane_vertices[] = { GLfloat plane_vertices[] = {
float (l), 0.0f, float (b), float (l), 0.0f, float (t), float (r), 0.0f, float (t), float (l), 0.0f, float (b), float (l), 0.0f, float (t), float (r), 0.0f, float (t),
float (l), 0.0f, float (b), float (r), 0.0f, float (t), float (r), 0.0f, float (b) float (l), 0.0f, float (b), float (r), 0.0f, float (t), float (r), 0.0f, float (b)