mirror of https://github.com/KLayout/klayout.git
Implementation starts to make sense. TODO: major refactoring, a lot of utility functions like fit, ...
This commit is contained in:
parent
9c00568301
commit
2ec712b104
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue