summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2019-07-11 16:19:28 +0200
committerPaul Lemire <paul.lemire@kdab.com>2019-07-15 12:11:43 +0200
commitc9eb1f347a501c6915595bfb705af3aecc2fbadd (patch)
tree65330563084c5818cd2c342e06f089285c4104af
parent69f112354dc09645a21db75f0630140c4480d809 (diff)
QRay3D: normalize the direction vector internally
It can be created with a non normalized dir vector but we should always perform the computations with a normalized dir vector for correct results. Change-Id: Ie9108de7ed2092f6b979a70ad9391267fe6c4696 Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r--src/render/raycasting/qray3d.cpp8
-rw-r--r--tests/auto/render/qray3d/tst_qray3d.cpp36
2 files changed, 22 insertions, 22 deletions
diff --git a/src/render/raycasting/qray3d.cpp b/src/render/raycasting/qray3d.cpp
index d8ad25b50..18dd9a40a 100644
--- a/src/render/raycasting/qray3d.cpp
+++ b/src/render/raycasting/qray3d.cpp
@@ -101,7 +101,7 @@ QRay3D::QRay3D()
*/
QRay3D::QRay3D(const Vector3D &origin, const Vector3D &direction, float distance)
: m_origin(origin)
- , m_direction(direction)
+ , m_direction(direction.normalized())
, m_distance(distance)
{}
@@ -157,7 +157,7 @@ void QRay3D::setDirection(const Vector3D &value)
if (value.isNull())
return;
- m_direction = value;
+ m_direction = value.normalized();
}
float QRay3D::distance() const
@@ -178,14 +178,14 @@ Vector3D QRay3D::point(float t) const
QRay3D &QRay3D::transform(const Matrix4x4 &matrix)
{
m_origin = matrix * m_origin;
- m_direction = matrix.mapVector(m_direction);
+ m_direction = matrix.mapVector(m_direction).normalized();
return *this;
}
QRay3D QRay3D::transformed(const Matrix4x4 &matrix) const
{
- return QRay3D(matrix * m_origin, matrix.mapVector(m_direction));
+ return QRay3D(matrix * m_origin, matrix.mapVector(m_direction).normalized());
}
bool QRay3D::operator==(const QRay3D &other) const
diff --git a/tests/auto/render/qray3d/tst_qray3d.cpp b/tests/auto/render/qray3d/tst_qray3d.cpp
index e9d4d3033..008b89aca 100644
--- a/tests/auto/render/qray3d/tst_qray3d.cpp
+++ b/tests/auto/render/qray3d/tst_qray3d.cpp
@@ -108,23 +108,23 @@ void tst_QRay3D::create_data()
// non-normalized direction vectors
QTest::newRow("line on x-axis from origin - B")
<< Vector3D()
- << Vector3D(2.0f, 0.0f, 0.0f);
+ << Vector3D(2.0f, 0.0f, 0.0f).normalized();
QTest::newRow("line parallel -z-axis from 3,3,3 - B")
<< Vector3D(3.0f, 3.0f, 3.0f)
- << Vector3D(0.0f, 0.0f, -0.7f);
+ << Vector3D(0.0f, 0.0f, -0.7f).normalized();
QTest::newRow("vertical line (parallel to y-axis) - B")
<< Vector3D(0.5f, 0.0f, 0.5f)
- << Vector3D(0.0f, 5.3f, 0.0f);
+ << Vector3D(0.0f, 5.3f, 0.0f).normalized();
QTest::newRow("equidistant from all 3 axes - B")
<< Vector3D(0.5f, 0.0f, 0.5f)
- << Vector3D(1.0f, 1.0f, 1.0f);
+ << Vector3D(1.0f, 1.0f, 1.0f).normalized();
QTest::newRow("negative direction")
<< Vector3D(-3.0f, -3.0f, -3.0f)
- << Vector3D(-1.2f, -1.8f, -2.4f);
+ << Vector3D(-1.2f, -1.8f, -2.4f).normalized();
}
void tst_QRay3D::create()
@@ -203,32 +203,32 @@ void tst_QRay3D::point_data()
QTest::newRow("line on x-axis from origin")
<< Vector3D()
<< Vector3D(2.0f, 0.0f, 0.0f)
- << Vector3D(1.2f, 0.0f, 0.0f)
- << Vector3D(-14.4f, 0.0f, 0.0f);
+ << Vector3D(0.6f, 0.0f, 0.0f)
+ << Vector3D(-7.2f, 0.0f, 0.0f);
QTest::newRow("line parallel -z-axis from 3,3,3")
<< Vector3D(3.0f, 3.0f, 3.0f)
<< Vector3D(0.0f, 0.0f, -0.7f)
- << Vector3D(3.0f, 3.0f, 2.58f)
- << Vector3D(3.0f, 3.0f, 8.04f);
+ << Vector3D(3.0f, 3.0f, 2.4f)
+ << Vector3D(3.0f, 3.0f, 10.2f);
QTest::newRow("vertical line (parallel to y-axis)")
<< Vector3D(0.5f, 0.0f, 0.5f)
<< Vector3D(0.0f, 5.3f, 0.0f)
- << Vector3D(0.5f, 3.18f, 0.5f)
- << Vector3D(0.5f, -38.16f, 0.5f);
+ << Vector3D(0.5f, 0.6f, 0.5f)
+ << Vector3D(0.5f, -7.2f, 0.5f);
QTest::newRow("equidistant from all 3 axes")
<< Vector3D(0.5f, 0.0f, 0.5f)
<< Vector3D(1.0f, 1.0f, 1.0f)
- << Vector3D(1.1f, 0.6f, 1.1f)
- << Vector3D(-6.7f, -7.2f, -6.7f);
+ << Vector3D(0.84641f, 0.34641f, 0.84641f)
+ << Vector3D(-3.65692f, -4.15692f, -3.65692f);
QTest::newRow("negative direction")
<< Vector3D(-3.0f, -3.0f, -3.0f)
<< Vector3D(-1.2f, -1.8f, -2.4f)
- << Vector3D(-3.72f, -4.08f, -4.44f)
- << Vector3D(5.64f, 9.96f, 14.28f);
+ << Vector3D(-3.22283f, -3.33425f, -3.44567f)
+ << Vector3D(-0.325987f, 1.01102f, 2.34803f);
}
void tst_QRay3D::point()
@@ -475,7 +475,7 @@ void tst_QRay3D::transform()
QVERIFY(fuzzyCompare(ray1.direction(), ray3.direction()));
QVERIFY(fuzzyCompare(ray1.origin(), m * point));
- QVERIFY(fuzzyCompare(ray1.direction(), m.mapVector(direction)));
+ QVERIFY(fuzzyCompare(ray1.direction(), m.mapVector(direction).normalized()));
}
class tst_QRay3DProperties : public QObject
@@ -503,7 +503,7 @@ void tst_QRay3D::properties()
Qt3DRender::RayCasting::QRay3D r = qvariant_cast<Qt3DRender::RayCasting::QRay3D>(obj.property("ray"));
QCOMPARE(r.origin(), Vector3D(1, 2, 3));
- QCOMPARE(r.direction(), Vector3D(4, 5, 6));
+ QCOMPARE(r.direction(), Vector3D(4, 5, 6).normalized());
obj.setProperty("ray",
qVariantFromValue
@@ -511,7 +511,7 @@ void tst_QRay3D::properties()
r = qvariant_cast<Qt3DRender::RayCasting::QRay3D>(obj.property("ray"));
QCOMPARE(r.origin(), Vector3D(-1, -2, -3));
- QCOMPARE(r.direction(), Vector3D(-4, -5, -6));
+ QCOMPARE(r.direction(), Vector3D(-4, -5, -6).normalized());
}
void tst_QRay3D::metaTypes()