summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gldisc.cpp34
-rw-r--r--src/gldisc.h5
-rw-r--r--src/mmscene.cpp2
3 files changed, 31 insertions, 10 deletions
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<GLPoint> *pointContainer,
@@ -82,15 +84,19 @@ void GLDisc::makeSurface(QVector<GLPoint> *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<GLPoint> *pointContainer, QVector<GLshort> *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);