From b4e08245d4bd920d4d308682055b3ab140f0a93d Mon Sep 17 00:00:00 2001 From: Stefan Suhren Date: Mon, 11 Jan 2016 12:46:28 +0100 Subject: Make the tokens movable --- src/gldisc.cpp | 34 ++++++++++++++++++++++++++-------- src/gldisc.h | 5 ++++- src/mmscene.cpp | 2 +- 3 files changed, 31 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/gldisc.cpp b/src/gldisc.cpp index 85dd6d4..9315e4c 100644 --- a/src/gldisc.cpp +++ b/src/gldisc.cpp @@ -1,6 +1,6 @@ #include "gldisc.h" -GLDisc::GLDisc(double radius, double height, int sides, GLColorRgba color, +GLDisc::GLDisc(double radius, double height, QVector3D lowerMiddlePoint, int sides, GLColorRgba color, QString textureFile) : GLBody(sqrt(pow(radius, 2) + pow(0.5 * height, 2)), color, textureFile) { @@ -10,6 +10,8 @@ GLDisc::GLDisc(double radius, double height, int sides, GLColorRgba color, m_center = v_Z * 0.5 * m_height; m_circleRadius = radius; + + m_lowerMiddlePoint = lowerMiddlePoint; } void GLDisc::makeSurface(QVector *pointContainer, @@ -82,15 +84,19 @@ void GLDisc::makeSurface(QVector *pointContainer, bool GLDisc::isHit(QVector3D p1, QVector3D p2) { - if (!GLBody::isHit(p1, p2)) + + QVector3D p1New = p1 - m_lowerMiddlePoint; + QVector3D p2New = p2 - m_lowerMiddlePoint; + + if (!GLBody::isHit(p1New, p2New)) { return false; } - QVector3D lineVector = p2 - p1; + QVector3D lineVector = p2New - p1New; // Calculate intersection point with the xy plane - QVector3D vecBottom = p1 + lineVector * (-p1.z() / lineVector.z()); + QVector3D vecBottom = p1New + lineVector * (-p1New.z() / lineVector.z()); if (vecBottom.length() < m_circleRadius) { @@ -99,7 +105,7 @@ bool GLDisc::isHit(QVector3D p1, QVector3D p2) // Calculate intersection point with the xy + m_heigth plane // Then drop z so that we get a projection onto the xy plane - QVector3D vecTop = (p1 + lineVector * ((m_height - p1.z()) / + QVector3D vecTop = (p1New + lineVector * ((m_height - p1New.z()) / lineVector.z())).toVector2D(); if (vecTop.length() < m_circleRadius) @@ -109,7 +115,7 @@ bool GLDisc::isHit(QVector3D p1, QVector3D p2) // Check if the mouse line is hitting the outer disc side QVector2D vecXYProjection = lineVector.toVector2D(); - QVector2D vecXYStart = p1.toVector2D(); + QVector2D vecXYStart = p1New.toVector2D(); // Solved via the "Mitternachtsformel" float a = QVector2D::dotProduct(vecXYProjection, vecXYProjection); @@ -125,7 +131,7 @@ bool GLDisc::isHit(QVector3D p1, QVector3D p2) float lambda1 = (-b - discriminant) / (2*a); - float z1 = (p1 + lambda1 * lineVector).z(); + float z1 = (p1New + lambda1 * lineVector).z(); if(z1 >= 0 && z1 <= m_height) { @@ -134,7 +140,7 @@ bool GLDisc::isHit(QVector3D p1, QVector3D p2) float lambda2 = (-b + discriminant) / (2*a); - float z2 = (p1 + lambda2 * lineVector).z(); + float z2 = (p1New + lambda2 * lineVector).z(); if(z2 >= 0 && z2 <= m_height) { @@ -152,3 +158,15 @@ QVector2D GLDisc::calculatePoint(double sideAngle) return QVector2D(x, y); } + + +void GLDisc::draw(GLESRenderer *renderer) +{ + renderer->pushMvMatrix(); + + renderer->translate(m_lowerMiddlePoint); + + GLBody::draw(renderer); + + renderer->popMvMatrix(); +} diff --git a/src/gldisc.h b/src/gldisc.h index bd9d99d..48ba62b 100644 --- a/src/gldisc.h +++ b/src/gldisc.h @@ -8,9 +8,10 @@ class GLDisc : public GLBody { public: - GLDisc(double radius = 1.0, double height = 2.0, int sides = 10, GLColorRgba color = GLColorRgba::clBlue, QString textureFile = ""); + GLDisc(double radius = 1.0, double height = 2.0, QVector3D lowerMiddlePoint = QVector3D(0.0, 0.0, 0.0), int sides = 10, GLColorRgba color = GLColorRgba::clBlue, QString textureFile = ""); virtual void makeSurface(QVector *pointContainer, QVector *indexContainer); + virtual void draw(GLESRenderer *renderer); virtual bool isHit(QVector3D p1, QVector3D p2); private: @@ -19,6 +20,8 @@ private: double m_height; double m_circleRadius; int m_sides; + + QVector3D m_lowerMiddlePoint; }; #endif // GLDISC_H diff --git a/src/mmscene.cpp b/src/mmscene.cpp index 7078bbb..3063b27 100644 --- a/src/mmscene.cpp +++ b/src/mmscene.cpp @@ -130,7 +130,7 @@ void MMScene::createSphere() void MMScene::createDisc() { - m_disc = new GLDisc(1.0, 0.5, 10, GLColorRgba::clBlue, ":/textures/white_disc.jpg"); + m_disc = new GLDisc(0.5, 0.25, m_chessboard->fieldToPosition(QPoint(7, 7)), 10, GLColorRgba::clBlue, ":/textures/white_disc.jpg"); m_disc->setDrawingMode(GL_TRIANGLES); m_disc->makeSurface(&m_points, &m_indices); -- cgit v1.2.3-70-g09d2