diff --git a/qglengine/core/gltypes.cpp b/qglengine/core/gltypes.cpp index 2d03b41..bd588d7 100644 --- a/qglengine/core/gltypes.cpp +++ b/qglengine/core/gltypes.cpp @@ -187,7 +187,7 @@ void createGLTexture(QOpenGLExtraFunctions * f, GLuint & tex, const QImage & ima } -QMatrix4x4 glMatrixPerspective(float angle, float aspect, float near_, float far_) { +QMatrix4x4 glMatrixPerspective(float angle, float aspect, float near_) { QMatrix4x4 ret; float t = 1.f / (tanf(angle * deg2rad / 2.f)), e = 2.4e-7f; if (aspect >= 1.) { diff --git a/qglengine/core/gltypes.h b/qglengine/core/gltypes.h index 14c8f9a..2877e2d 100644 --- a/qglengine/core/gltypes.h +++ b/qglengine/core/gltypes.h @@ -157,7 +157,7 @@ void glClearFramebuffer(const QColor & color = Qt::black, bool depth = true); void glDrawQuad(QOpenGLShaderProgram * prog = nullptr, QVector4D * corner_dirs = nullptr, GLfloat x = -1.f, GLfloat y = -1.f, GLfloat w = 2.f, GLfloat h = 2.f); void createGLTexture(QOpenGLExtraFunctions * f, GLuint & tex, int width, int height, const GLenum & format = GL_RGBA, const GLenum & target = GL_TEXTURE_2D); void createGLTexture(QOpenGLExtraFunctions * f, GLuint & tex, const QImage & image, const GLenum & format = GL_RGBA, const GLenum & target = GL_TEXTURE_2D); -QMatrix4x4 glMatrixPerspective(float angle, float aspect, float near_, float far_); +QMatrix4x4 glMatrixPerspective(float angle, float aspect, float near_); QImage rotateQImageLeft(const QImage & im); QImage rotateQImageRight(const QImage & im); inline QImage rotateQImage180(const QImage & im) {return im.mirrored(true, true);} diff --git a/qglengine/glcamera.cpp b/qglengine/glcamera.cpp index 2112527..e316885 100644 --- a/qglengine/glcamera.cpp +++ b/qglengine/glcamera.cpp @@ -23,23 +23,12 @@ Camera::Camera() { type_ = glCamera; fov_ = 60.; - angle_limit_lower_xy = 0.f; - angle_limit_upper_xy = 360.f; //setRotationX(90.f); depth_start = 0.1f; - depth_end = 1000.f; mirror_x = mirror_y = false; } -void Camera::anglesFromPoints() { - //QVector3D dv = aim_ - pos_, tv; - //tv = QVector3D(dv.x(), dv.y(), 0.); - //angles_.setZ(atan2f(tv.x(), tv.y()) * rad2deg); - //angles_.setY(piClamp(atan2f(tv.length(), dv.z()) * rad2deg, angle_limit_lower_xy, angle_limit_upper_xy) + 180.f); -} - - QMatrix4x4 Camera::offsetMatrix() const { QMatrix4x4 ret; ret.translate(parent_ ? -offset_ : -aim()); @@ -65,12 +54,9 @@ void Camera::assign(const Camera & c) { trans = c.trans; aim_dist = c.aim_dist; fov_ = c.fov_; - angle_limit_lower_xy = c.angle_limit_lower_xy; - angle_limit_upper_xy = c.angle_limit_upper_xy; mirror_x = c.mirror_x; mirror_y = c.mirror_y; depth_start = c.depth_start; - depth_end = c.depth_end; buildTransform(); } @@ -89,12 +75,9 @@ ObjectBase * Camera::clone(bool withChildren) { o->trans = trans; o->aim_dist = aim_dist; o->fov_ = fov_; - o->angle_limit_lower_xy = angle_limit_lower_xy; - o->angle_limit_upper_xy = angle_limit_upper_xy; o->mirror_x = mirror_x; o->mirror_y = mirror_y; o->depth_start = depth_start; - o->depth_end = depth_end; o->meta = meta; return o; } @@ -121,175 +104,5 @@ QMatrix4x4 Camera::viewMatrix() const { QMatrix4x4 Camera::projectionMatrix(double aspect) const { - return glMatrixPerspective(fov_, aspect, depth_start, depth_end); + return glMatrixPerspective(fov_, aspect, depth_start); } - - -void Camera::panZ(const float & a) { - /*QVector3D dv = aim_ - pos_; - float tl = QVector2D(dv.x(), dv.y()).length(); - angles_.setZ(angles_.z() + a); - dv = QVector3D(sinf(angles_.z() * deg2rad) * tl, cosf(angles_.z() * deg2rad) * tl, dv.z()); - aim_ = pos_ + dv; - buildTransform();*/ -} - - -void Camera::panXY(const float & a) { - /*QVector3D dv = aim_ - pos_; - float tl = dv.length(), tc; - angles_.setY(angles_.y() + a); - angles_.setY(piClamp(angles_.y(), angle_limit_lower_xy, angle_limit_upper_xy)); - tc = -sinf(angles_.y() * deg2rad); - dv = QVector3D(sinf(angles_.z() * deg2rad) * tc, cosf(angles_.z() * deg2rad) * tc, -cosf(angles_.y() * deg2rad)); - aim_ = pos_ + dv * tl; - buildTransform();*/ -} - - -void Camera::rotateZ(const float & a) { - /*QVector3D dv = aim_ - pos_; - float tl = QVector2D(dv.x(), dv.y()).length(); - angles_.setZ(angles_.z() + a); - dv = QVector3D(sinf(angles_.z() * deg2rad) * tl, cosf(angles_.z() * deg2rad) * tl, dv.z()); - aim_ = pos_ + dv; - buildTransform();*/ -} - - -void Camera::rotateXY(const float & a) { - /*QVector3D dv = aim_ - pos_; - float tl = dv.length(), tc; - angles_.setY(angles_.y() + a); - angles_.setY(piClamp(angles_.y(), angle_limit_lower_xy, angle_limit_upper_xy)); - tc = -sinf(angles_.y() * deg2rad); - dv = QVector3D(sinf(angles_.z() * deg2rad) * tc, cosf(angles_.z() * deg2rad) * tc, -cosf(angles_.y() * deg2rad)); - aim_ = pos_ + dv * tl; - buildTransform();*/ -} - - -void Camera::orbitZ(const float & a) { - //qDebug() << rotation() << Transform::fromDirection(direction()); - QVector3D pa = aim(); - //trans.rotationRef() *= QQuaternion::fromEulerAngles(0, a, 0); - ObjectBase::rotateZ(-a); - move(pa - aim()); - /*QVector3D dv = aim_ - pos_; - float tl = QVector2D(dv.x(), dv.y()).length(); - angles_.setZ(angles_.z() + a); - dv = QVector3D(sinf(angles_.z() * deg2rad) * tl, cosf(angles_.z() * deg2rad) * tl, dv.z()); - pos_ = aim_ - dv; - buildTransform();*/ -} - - -void Camera::orbitXY(const float & a) { - QVector3D pa = aim(); - //trans.rotationRef() *= QQuaternion::fromEulerAngles(a, 0, 0); - ObjectBase::rotateX(-a); - move(pa - aim()); - - //qDebug() << pos() << aim(); - /*QVector3D dv = aim_ - pos_; - float tl = dv.length(), tc; - angles_.setY(angles_.y() + a); - angles_.setY(piClamp(angles_.y(), angle_limit_lower_xy, angle_limit_upper_xy)); - tc = -sinf(angles_.y() * deg2rad); - dv = QVector3D(sinf(angles_.z() * deg2rad) * tc, cosf(angles_.z() * deg2rad) * tc, -cosf(angles_.y() * deg2rad)); - pos_ = aim_ - dv * tl; - buildTransform();*/ -} - - -void Camera::setAngleZ(const float & a) { - /*QVector3D dv = aim_ - pos_; - float tl = QVector2D(dv.x(), dv.y()).length(); - angles_.setZ(a); - dv = QVector3D(sinf(angles_.z() * deg2rad) * tl, cosf(angles_.z() * deg2rad) * tl, dv.z()); - aim_ = pos_ + dv; - buildTransform();*/ -} - - -void Camera::setAngleXY(const float & a) { - /*QVector3D dv = aim_ - pos_; - float tl = dv.length(), tc; - angles_.setY(a); - tc = -sinf(angles_.y() * deg2rad); - dv = QVector3D(sinf(angles_.z() * deg2rad) * tc, cosf(angles_.z() * deg2rad) * tc, -cosf(angles_.y() * deg2rad)); - //pos_ = aim_ - dv; - aim_ = pos_ + dv * tl; - buildTransform();*/ - //anglesFromPoints(); -} - - -void Camera::moveForward(const float & x, bool withZ) { - /*Vector3D dv;// = aim_ - pos_; - float tc = -sinf(angles_.y() * deg2rad); - dv = QVector3D(sinf(angles_.z() * deg2rad) * tc, cosf(angles_.z() * deg2rad) * tc, 0.); - if (withZ) dv.setZ(-cosf(angles_.y() * deg2rad)); - dv.normalize(); - dv *= x; - pos_ += dv; - aim_ += dv; - buildTransform();*/ -} - - -void Camera::moveLeft(const float & x, bool withZ) { - /*QVector3D dv;// = aim_ - pos_; - float tc = -sinf(angles_.y() * deg2rad); - dv = QVector3D(sinf(angles_.z() * deg2rad - float(M_PI_2)) * tc, cosf(angles_.z() * deg2rad - float(M_PI_2)) * tc, 0.f); - if (withZ) dv.setZ(-sinf(angles_.x() * deg2rad)); - dv.normalize(); - dv *= x; - pos_ += dv; - aim_ += dv; - buildTransform();*/ -} - - -void Camera::moveUp(const float & x, bool onlyZ) { - /*QVector3D dv; - if (onlyZ) - dv = QVector3D(0., 0., x); - else { - float tc = cosf(angles_.y() * deg2rad); - dv = QVector3D(sinf(angles_.z() * deg2rad) * tc, cosf(angles_.z() * deg2rad) * tc, -sinf(angles_.y() * deg2rad)); - dv.normalize(); - dv *= x; - } - pos_ += dv; - aim_ += dv; - buildTransform();*/ -} - -/* -void Camera::flyCloser(const float & s) { - QVector3D dv = aim_ - pos_; - float tl = dv.length() / (1.f + s), tc = -sinf(angles_.y() * deg2rad); - dv = QVector3D(sinf(angles_.z() * deg2rad) * tc, cosf(angles_.z() * deg2rad) * tc, -cosf(angles_.y() * deg2rad)); - pos_ = aim_ - dv * tl; - buildTransform(); -} - - -void Camera::flyFarer(const float & s) { - QVector3D dv = aim_ - pos_; - float tl = dv.length() * (1.f + s), tc = -sinf(angles_.y() * deg2rad); - dv = QVector3D(sinf(angles_.z() * deg2rad) * tc, cosf(angles_.z() * deg2rad) * tc, -cosf(angles_.y() * deg2rad)); - pos_ = aim_ - dv * tl; - buildTransform(); -} - - -void Camera::flyToDistance(const float & d) { - QVector3D dv = aim_ - pos_; - float tc = -sinf(angles_.y() * deg2rad); - dv = QVector3D(sinf(angles_.z() * deg2rad) * tc, cosf(angles_.z() * deg2rad) * tc, -cosf(angles_.y() * deg2rad)); - pos_ = aim_ - dv * d; - buildTransform(); -} -*/ diff --git a/qglengine/glcamera.h b/qglengine/glcamera.h index a6e9d98..120515d 100644 --- a/qglengine/glcamera.h +++ b/qglengine/glcamera.h @@ -33,29 +33,12 @@ class Camera: public AimedObject public: Camera(); - void moveForward(const float & x, bool withZ = true); - void moveBackward(const float & x, bool withZ = true) {moveForward(-x, withZ);} - void moveLeft(const float & x, bool withZ = true); - void moveRight(const float & x, bool withZ = true) {moveLeft(-x, withZ);} - void moveUp(const float & x, bool onlyZ = false); - void moveDown(const float & x, bool onlyZ = false) {moveUp(-x, onlyZ);} - void rotateZ(const float & a); - void rotateXY(const float & a); - void rotateRoll(const float & a) {rotateX(a);} - void orbitZ(const float & a); - void orbitXY(const float & a); - void panZ(const float & a); - void panXY(const float & a); void setFOV(const float & f) {fov_ = f;} void setAngles(const QVector3D & a) {setRotation(a);} - void setAngleZ(const float & a); - void setAngleXY(const float & a); - void setAngleRoll(const float & a) {setRotationX(a);} - void setAngleLowerLimitXY(const float & a) {angle_limit_lower_xy = a; buildTransform();} - void setAngleUpperLimitXY(const float & a) {angle_limit_upper_xy = a; buildTransform();} - void setAngleLimitsXY(const float & lower, const float & upper) {angle_limit_lower_xy = lower; angle_limit_upper_xy = upper; buildTransform();} + void setAngleZ(const float & a) {setRotationZ(a);} + void setAngleXY(const float & a) {setRotationX(a);} + void setAngleRoll(const float & a) {setRotationY(a);} void setDepthStart(const float & d) {depth_start = d;} - void setDepthEnd(const float & d) {depth_end = d;} void setMirrorX(bool yes) {mirror_x = yes;} void setMirrorY(bool yes) {mirror_y = yes;} @@ -63,16 +46,11 @@ public: float angleZ() const {return rotationZ();} float angleXY() const {return rotationY();} float angleRoll() const {return rotationZ();} - float angleLowerLimitXY() const {return angle_limit_lower_xy;} - float angleUpperLimitXY() const {return angle_limit_upper_xy;} float depthStart() const {return depth_start;} - float depthEnd() const {return depth_end;} bool isMirrorX() const {return mirror_x;} bool isMirrorY() const {return mirror_y;} - void anglesFromPoints(); void assign(const Camera & c); - virtual ObjectBase * clone(bool withChildren = true); QMatrix4x4 viewMatrix() const; QMatrix4x4 projectionMatrix(double aspect) const; @@ -84,9 +62,6 @@ private: mutable QVector3D offset_; GLfloat fov_; GLfloat depth_start; - GLfloat depth_end; - GLfloat angle_limit_lower_xy; - GLfloat angle_limit_upper_xy; bool mirror_x; bool mirror_y; diff --git a/qglengine/globject.cpp b/qglengine/globject.cpp index 0593938..c833535 100644 --- a/qglengine/globject.cpp +++ b/qglengine/globject.cpp @@ -495,6 +495,41 @@ void AimedObject::flyToDistance(double d) { } +void AimedObject::moveForward(const float & x, bool withZ) { + QVector3D dv = itransform_.mapVector(QVector3D(0, 0, -x)); + if (!withZ) dv[2] = 0.; + move(dv); +} + + +void AimedObject::moveLeft(const float & x, bool withZ) { + QVector3D dv = itransform_.mapVector(QVector3D(-x, 0, 0)); + if (!withZ) dv[2] = 0.; + move(dv); +} + + +void AimedObject::moveUp(const float & x, bool onlyZ) { + QVector3D dv = itransform_.mapVector(QVector3D(0, x, 0)); + if (onlyZ) dv[0] = dv[1] = 0.; + move(dv); +} + + +void AimedObject::orbitZ(const float & a) { + QVector3D pa = aim(); + rotateZ(-a); + move(pa - aim()); +} + + +void AimedObject::orbitXY(const float & a) { + QVector3D pa = aim(); + rotateX(-a); + move(pa - aim()); +} + + void AimedObject::transformChanged() { } @@ -561,23 +596,23 @@ QDataStream & operator <<(QDataStream & s, const ObjectBase * p) { ChunkStream cs; //qDebug() << "place" << p->name() << "..."; cs.add(1, int(p->type_)).add(2, p->accept_light).add(3, p->accept_fog).add(4, p->visible_) - .add(5, p->cast_shadow).add(6, p->rec_shadow).add(7, p->raw_matrix).add(8, p->line_width) - .add(9, int(p->render_mode)).add(14, p->mat_).add(16, p->children_.size()) - .add(17, p->name_).add(18, p->meta).add(19, p->color_).add(20, p->trans); + .add(5, p->cast_shadow).add(6, p->rec_shadow).add(7, p->raw_matrix).add(8, p->line_width) + .add(9, int(p->render_mode)).add(14, p->mat_).add(16, p->children_.size()) + .add(17, p->name_).add(18, p->meta).add(19, p->color_).add(20, p->trans); //qDebug() << "place self done"; if (p->type_ == ObjectBase::glLight) { //qDebug() << "place light ..."; const Light * l = (const Light*)p; - cs.add(100, l->aim()).add(101, l->angle_start).add(102, l->angle_end).add(103, l->intensity) - .add(104, l->decay_const).add(105, l->decay_linear).add(106, l->decay_quadratic) - .add(107, l->decay_start).add(108, l->decay_end).add(109, int(l->light_type)); + cs.add(101, l->angle_start).add(102, l->angle_end).add(103, l->intensity) + .add(104, l->decay_const).add(105, l->decay_linear).add(106, l->decay_quadratic) + .add(107, l->decay_start).add(108, l->decay_end).add(109, int(l->light_type)) + .add(111, l->distance()); } if (p->type_ == ObjectBase::glCamera) { //qDebug() << "place camera ..."; const Camera * c = (const Camera*)p; - cs.add(200, c->aim()).add(201, c->fov_).add(202, c->depth_start).add(203, c->depth_end) - .add(204, c->angle_limit_lower_xy).add(205, c->angle_limit_upper_xy) - .add(206, c->mirror_x).add(207, c->mirror_y); + cs.add(200, c->aim()).add(201, c->fov_).add(202, c->depth_start) + .add(206, c->mirror_x).add(207, c->mirror_y).add(208, c->distance()); } //qDebug() << "place" << p->name() << cs.data().size() << s.device()->size(); s << cs.data(); @@ -591,7 +626,6 @@ QDataStream & operator >>(QDataStream & s, ObjectBase *& p) { int ccnt = 0; Light * l = nullptr; Camera * c = nullptr; - QVector3D cam_angles; //qDebug() << "read obj ..."; while (!cs.atEnd()) { switch (cs.read()) { @@ -613,18 +647,7 @@ QDataStream & operator >>(QDataStream & s, ObjectBase *& p) { case 7: if (p) p->raw_matrix = cs.getData(); break; case 8: if (p) p->line_width = cs.getData(); break; case 9: if (p) p->render_mode = (ObjectBase::RenderMode)cs.getData(); break; - //case 10: if (p) p->material_ = cs.getData(); break; - //case 11: if (p) p->pos_ = cs.getData(); break; - //case 12: - // if (p) p->angles_ = cs.getData(); - // if (c) { - // c->setAngles(cs.getData()); - // cam_angles = c->angles(); - // } - //break; - //case 13: if (p) p->scale_ = cs.getData(); break; case 14: if (p) p->mat_ = cs.getData(); break; - //case 15: if (p) p->vbo = cs.getData(); break; case 16: if (p) ccnt = cs.getData(); break; case 17: if (p) p->name_ = cs.getData(); break; case 18: if (p) p->meta = cs.getData(); break; @@ -640,17 +663,15 @@ QDataStream & operator >>(QDataStream & s, ObjectBase *& p) { case 107: if (l) l->decay_start = cs.getData(); break; case 108: if (l) l->decay_end = cs.getData(); break; case 109: if (l) l->light_type = (Light::Type)cs.getData(); break; + case 111: if (l) l->setDistance(cs.getData()); break; case 200: if (c) c->setAim(cs.getData()); break; case 201: if (c) c->setFOV(cs.getData()); break; case 202: if (c) c->setDepthStart(cs.getData()); break; - case 203: if (c) c->setDepthEnd(cs.getData()); break; - case 204: if (c) c->setAngleLowerLimitXY(cs.getData()); break; - case 205: if (c) c->setAngleUpperLimitXY(cs.getData()); break; case 206: if (c) c->mirror_x = cs.getData(); break; case 207: if (c) c->mirror_y = cs.getData(); break; + case 208: if (c) c->setDistance(cs.getData()); break; } } - //if (c) c->setAngles(cam_angles); //qDebug() << p->name() << ccnt; for (int i = 0; i < ccnt; ++i) { ObjectBase * c = nullptr; diff --git a/qglengine/globject.h b/qglengine/globject.h index cd5fce8..7ad84b8 100644 --- a/qglengine/globject.h +++ b/qglengine/globject.h @@ -247,11 +247,24 @@ public: QVector3D worldDirection() const {return (itransform_ * QVector4D(QVector3D(0,0,-1), 0.)).toVector3D().normalized();} void setDirection(const QVector3D & d); void setDirection(double x, double y, double z) {setDirection(QVector3D(x, y, z));} + double distance() const {return aim_dist;} void setDistance(double d) {aim_dist = d;} void flyCloser(double s); void flyFarer(double s); void flyToDistance(double d); + + void moveForward(const float & x, bool withZ = true); + void moveBackward(const float & x, bool withZ = true) {moveForward(-x, withZ);} + void moveLeft(const float & x, bool withZ = true); + void moveRight(const float & x, bool withZ = true) {moveLeft(-x, withZ);} + void moveUp(const float & x, bool onlyZ = false); + void moveDown(const float & x, bool onlyZ = false) {moveUp(-x, onlyZ);} + + void rotateRoll(const float & a) {rotateY(a);} + void orbitZ(const float & a); + void orbitXY(const float & a); + protected: void transformChanged() override; double aim_dist; diff --git a/qglengine/glrendererbase.cpp b/qglengine/glrendererbase.cpp index c7904ad..3c75192 100644 --- a/qglengine/glrendererbase.cpp +++ b/qglengine/glrendererbase.cpp @@ -211,7 +211,6 @@ void GLRendererBase::renderShadow(Light * l, QOpenGLShaderProgram * prog, QMatri cam.setPos(wp); cam.setAim(wp + (l->worldTransform() * QVector4D(l->direction())).toVector3D()); cam.setDepthStart(view->camera()->depthStart()); - cam.setDepthEnd(view->camera()->depthEnd()); cam.setFOV(l->angle_end); //cam.apply(1.); /*cam.rotateXY(l->angle_end); diff --git a/qglengine/glwidget.cpp b/qglengine/glwidget.cpp index 44f6f1a..c850db1 100644 --- a/qglengine/glwidget.cpp +++ b/qglengine/glwidget.cpp @@ -37,11 +37,6 @@ qreal GLWidget::depthStart() const { } -qreal GLWidget::depthEnd() const { - return view_->depthEnd(); -} - - QColor GLWidget::ambientColor() const { return view_->ambientColor(); } @@ -153,11 +148,6 @@ void GLWidget::setDepthStart(const qreal & arg) { } -void GLWidget::setDepthEnd(const qreal & arg) { - view_->setDepthEnd(arg); -} - - void GLWidget::setAmbientColor(const QColor & arg) { view_->setAmbientColor(arg); } diff --git a/qglengine/glwidget.h b/qglengine/glwidget.h index e88180a..b101fce 100644 --- a/qglengine/glwidget.h +++ b/qglengine/glwidget.h @@ -15,7 +15,6 @@ class GLWidget : public QWidget Q_PROPERTY (qreal lineWidth READ lineWidth WRITE setLineWidth) Q_PROPERTY (qreal FOV READ FOV WRITE setFOV) Q_PROPERTY (qreal depthStart READ depthStart WRITE setDepthStart) - Q_PROPERTY (qreal depthEnd READ depthEnd WRITE setDepthEnd) Q_PROPERTY (QColor ambientColor READ ambientColor WRITE setAmbientColor) Q_PROPERTY (bool grabMouse READ isGrabMouseEnabled WRITE setGrabMouseEnabled) Q_PROPERTY (bool mouseRotate READ isMouseRotateEnabled WRITE setMouseRotateEnabled) @@ -35,7 +34,6 @@ public: qreal lineWidth() const; qreal FOV() const; qreal depthStart() const; - qreal depthEnd() const; QColor ambientColor() const; bool isLightEnabled() const; bool isGrabMouseEnabled() const; @@ -61,7 +59,6 @@ public slots: void setLineWidth(const qreal & arg); void setFOV(const qreal & arg); void setDepthStart(const qreal & arg); - void setDepthEnd(const qreal & arg); void setAmbientColor(const QColor & arg); void setLightEnabled(const bool & arg); void setGrabMouseEnabled(const bool & arg); diff --git a/qglengine/icons/dialog-cancel.png b/qglengine/icons/dialog-cancel.png new file mode 100644 index 0000000..ace88ab Binary files /dev/null and b/qglengine/icons/dialog-cancel.png differ diff --git a/qglengine/mouse_controller.cpp b/qglengine/mouse_controller.cpp index 4303d96..406f66d 100644 --- a/qglengine/mouse_controller.cpp +++ b/qglengine/mouse_controller.cpp @@ -199,17 +199,17 @@ void MouseController::mouseMoveEvent(QMouseEvent * e) { float dy = e->y() - lastPos.y(); if (e->buttons().testFlag(Qt::MidButton)) { if (cameraOrbit_) { - view->camera()->orbitZ(dx / 4.f); + view->camera()->orbitZ (dx / 4.f); view->camera()->orbitXY(dy / 4.f); } else { view->camera()->rotateZ(dx / 4.f); - view->camera()->rotateXY(dy / 4.f); + view->camera()->rotateX(dy / 4.f); } emit view->cameraPosChanged(view->camera()->pos()); } else if (e->buttons().testFlag(Qt::RightButton)) { float ad = view->camera()->distance(); view->camera()->moveLeft(dx / 1000.f * ad); - view->camera()->moveUp(dy / 1000.f * ad); + view->camera()->moveUp (dy / 1000.f * ad); emit view->cameraPosChanged(view->camera()->pos()); } } diff --git a/qglengine/qglview.h b/qglengine/qglview.h index 1be8c78..e2604de 100644 --- a/qglengine/qglview.h +++ b/qglengine/qglview.h @@ -47,7 +47,6 @@ class QGLView: public OpenGLWindow Q_PROPERTY (float lineWidth READ lineWidth WRITE setLineWidth) Q_PROPERTY (float FOV READ FOV WRITE setFOV) Q_PROPERTY (float depthStart READ depthStart WRITE setDepthStart) - Q_PROPERTY (float depthEnd READ depthEnd WRITE setDepthEnd) Q_PROPERTY (QColor ambientColor READ ambientColor WRITE setAmbientColor) Q_PROPERTY (QColor fogColor READ fogColor WRITE setFogColor) Q_PROPERTY (bool fogEnabled READ isFogEnabled WRITE setFogEnabled) @@ -108,7 +107,6 @@ public: float lineWidth() const {return lineWidth_;} float FOV() const {return camera()->fov_;} float depthStart() const {return camera()->depth_start;} - float depthEnd() const {return camera()->depth_end;} float currentFPS() const {return fps_;} int maxAnisotropicLevel() const {return max_anisotropic;} @@ -228,7 +226,6 @@ public slots: void setLineWidth(const float & arg) {lineWidth_ = arg;} void setFOV(const float & arg) {camera()->fov_ = arg;} void setDepthStart(const float & arg) {camera()->depth_start = arg;} - void setDepthEnd(const float & arg) {camera()->depth_end = arg;} void setAmbientColor(const QColor & arg) {ambientColor_ = arg;} void setFogColor(const QColor & arg) {fogColor_ = arg;} void setFogDensity(const float & arg) {fogDensity_ = arg;} diff --git a/qglengine/qglview_test/qglview_window.cpp b/qglengine/qglview_test/qglview_window.cpp index a784b3e..fec35e1 100644 --- a/qglengine/qglview_test/qglview_window.cpp +++ b/qglengine/qglview_test/qglview_window.cpp @@ -45,7 +45,6 @@ QGLViewWindow::QGLViewWindow(QWidget * parent): QMainWindow(parent), Ui::QGLView spinFOV->setValue(view->view()->FOV()); spinDepthStart->setValue(view->view()->depthStart()); - spinDepthEnd->setValue(view->view()->depthEnd()); groupHoverHalo->setChecked(view->view()->isHoverHaloEnabled()); groupSelectionHalo->setChecked(view->view()->isSelectionHaloEnabled()); spinHoverHaloFill->setValue(view->view()->hoverHaloFillAlpha()); diff --git a/qglengine/qglview_test/qglview_window.h b/qglengine/qglview_test/qglview_window.h index 15ef1e8..d9b2737 100644 --- a/qglengine/qglview_test/qglview_window.h +++ b/qglengine/qglview_test/qglview_window.h @@ -63,7 +63,6 @@ private: private slots: void on_spinFOV_valueChanged(double val) {view->view()->setFOV(val);} void on_spinDepthStart_valueChanged(double val) {view->view()->setDepthStart(val);} - void on_spinDepthEnd_valueChanged(double val) {view->view()->setDepthEnd(val);} void on_comboViewRenderMode_currentIndexChanged(int val) {static int modes[] = {GL_POINT, GL_LINE, GL_FILL}; view->view()->setRenderMode((ObjectBase::RenderMode)modes[val]);} void on_groupHoverHalo_clicked(bool val) {view->view()->setHoverHaloEnabled(val);} void on_groupSelectionHalo_clicked(bool val) {view->view()->setSelectionHaloEnabled(val);} diff --git a/qglengine/widgets/materials_editor.cpp b/qglengine/widgets/materials_editor.cpp index 0b96b98..ae29604 100644 --- a/qglengine/widgets/materials_editor.cpp +++ b/qglengine/widgets/materials_editor.cpp @@ -51,6 +51,7 @@ bool MaterialsEditor::event(QEvent * e) { ui->buttonAdd ->setIconSize(sz); ui->buttonDelete->setIconSize(sz); ui->buttonAssign->setIconSize(sz); + ui->buttonUnset ->setIconSize(sz); } return QWidget::event(e); } @@ -175,3 +176,11 @@ void MaterialsEditor::on_buttonAssign_clicked() { foreach (ObjectBase * o, ol) o->setMaterial(m, true); } + + +void MaterialsEditor::on_buttonUnset_clicked() { + if (!view) return; + QList ol = view->selectedObjects(); + foreach (ObjectBase * o, ol) + o->setMaterial(0, true); +} diff --git a/qglengine/widgets/materials_editor.h b/qglengine/widgets/materials_editor.h index 60b9ad3..2bbc8be 100644 --- a/qglengine/widgets/materials_editor.h +++ b/qglengine/widgets/materials_editor.h @@ -55,6 +55,7 @@ private slots: void on_buttonAdd_clicked(); void on_buttonDelete_clicked(); void on_buttonAssign_clicked(); + void on_buttonUnset_clicked(); signals: void changed(); diff --git a/qglengine/widgets/materials_editor.ui b/qglengine/widgets/materials_editor.ui index 7e1dbc1..e81227f 100644 --- a/qglengine/widgets/materials_editor.ui +++ b/qglengine/widgets/materials_editor.ui @@ -6,11 +6,23 @@ 0 0 - 542 - 492 + 386 + 520 - + + + 0 + + + 0 + + + 0 + + + 0 + @@ -27,63 +39,122 @@ - - - Rename ... - - - - :/icons/edit-rename.png:/icons/edit-rename.png - - - - - - - Add - - - - :/icons/list-add.png:/icons/list-add.png - - - - - - - Delete - - - - :/icons/edit-delete.png:/icons/edit-delete.png - - - - - - - Qt::Horizontal - - - QSizePolicy::Preferred - - - - 20 - 20 - - - - - - - - Assign - - - - :/icons/go-jump.png:/icons/go-jump.png - + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::Vertical + + + + 20 + 1 + + + + + + + + + + Rename ... + + + + :/icons/edit-rename.png:/icons/edit-rename.png + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 40 + 10 + + + + + + + + Unset + + + + :/icons/dialog-cancel.png:/icons/dialog-cancel.png + + + + + + + Add + + + + :/icons/list-add.png:/icons/list-add.png + + + + + + + Delete + + + + :/icons/edit-delete.png:/icons/edit-delete.png + + + + + + + Assign + + + + :/icons/go-jump.png:/icons/go-jump.png + + + + + + + + + Qt::Vertical + + + + 20 + 1 + + + + + @@ -104,12 +175,12 @@ 0 0 - 522 - 440 + 386 + 434 - false + true @@ -160,6 +231,8 @@ + + diff --git a/qglengine/widgets/object_editor.cpp b/qglengine/widgets/object_editor.cpp index dd7a33f..c3a4a46 100644 --- a/qglengine/widgets/object_editor.cpp +++ b/qglengine/widgets/object_editor.cpp @@ -28,6 +28,7 @@ ObjectEditor::ObjectEditor(QWidget * parent): QWidget(parent) { ui->setupUi(this); view = 0; active = true; + ignore_next = false; on_comboLightType_currentIndexChanged(0); ui->widgetMain->setEnabled(false); ui->labelAimDist->hide(); @@ -84,6 +85,10 @@ void ObjectEditor::changeEvent(QEvent * e) { void ObjectEditor::selectionChanged() { + if (ignore_next) { + ignore_next = false; + return; + } ui->widgetMain->setEnabled(false); if (!view) return; QList sol = view->selectedObjects(true); @@ -207,6 +212,7 @@ void ObjectEditor::spinChanged(double v) { if (s == ui->spinScaleY ) o->setScaleY (v); if (s == ui->spinScaleZ ) o->setScaleZ (v); } + ignore_next = true; } @@ -224,6 +230,7 @@ void ObjectEditor::spinLightChanged(double v) { if (s == ui->spinAimDist ) o->setDistance(v); o->apply(); } + ignore_next = true; } @@ -236,6 +243,7 @@ void ObjectEditor::spinCameraChanged(double v) { if (s == ui->spinCameraDepthStart) o->setDepthStart(v); if (s == ui->spinAimDist ) o->setDistance(v); } + ignore_next = true; } diff --git a/qglengine/widgets/object_editor.h b/qglengine/widgets/object_editor.h index 2933152..da81394 100644 --- a/qglengine/widgets/object_editor.h +++ b/qglengine/widgets/object_editor.h @@ -40,7 +40,7 @@ protected: Ui::ObjectEditor * ui; QGLView * view; - bool active; + bool active, ignore_next; private slots: void selectionChanged(); diff --git a/qglengine/widgets/widgets.qrc b/qglengine/widgets/widgets.qrc index db6b102..c83819f 100644 --- a/qglengine/widgets/widgets.qrc +++ b/qglengine/widgets/widgets.qrc @@ -2,6 +2,7 @@ ../icons/go-jump.png ../icons/dialog-close.png + ../icons/dialog-cancel.png ../icons/edit-clear.png ../icons/configure.png ../icons/document-save.png