diff options
author | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2020-03-16 12:18:35 +0200 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2020-03-16 13:37:49 +0000 |
commit | 2c3f31bc93e7d6bb27eac73264d0940f16012d41 (patch) | |
tree | 1d07f0b8b49d7a0a28a36d7579ac2fadffcde7b8 | |
parent | e857b02579801c8654922188842a60f3d6481f19 (diff) |
QmlDesigner: Add a simple wireframe cone model for edit 3d spotlight
Change-Id: I013e4fc2d77b49694d887e8cadc05584a904ed62
Fixes: QDS-1819
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
-rw-r--r-- | share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/lightgeometry.cpp | 45 |
1 files changed, 24 insertions, 21 deletions
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/lightgeometry.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/lightgeometry.cpp index 58d1dc40f2..6c2c2c28e7 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/lightgeometry.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/lightgeometry.cpp @@ -99,7 +99,9 @@ void LightGeometry::fillVertexData(QByteArray &vertexData, QByteArray &indexData { int vertexSize = 0; int indexSize = 0; - const int dirSegments = 12; + const int dirSegments = 12; // Segment lines in directional light circle + const int spotArc = 6; // Segment lines per cone line in spotlight arc + const int spotCone = 4; // Lines in spotlight cone const int pointLightDensity = 5; if (qobject_cast<QQuick3DAreaLight *>(m_light)) { @@ -117,9 +119,8 @@ void LightGeometry::fillVertexData(QByteArray &vertexData, QByteArray &indexData vertexSize = int(sizeof(float)) * 3 * pointLightDensity * pointLightDensity * 4; indexSize = int(sizeof(quint16)) * pointLightDensity * pointLightDensity * 4; } else if (qobject_cast<QQuick3DSpotLight *>(m_light)) { - // TODO: Spot light model, for now use area light model - vertexSize = int(sizeof(float)) * 3 * dirSegments * 2; - indexSize = int(sizeof(quint16)) * dirSegments * 2 * 2; + vertexSize = int(sizeof(float)) * 3 * (spotArc * spotCone + 1); + indexSize = int(sizeof(quint16)) * (spotArc + 1) * spotCone * 2; } vertexData.resize(vertexSize); indexData.resize(indexSize); @@ -189,26 +190,28 @@ void LightGeometry::fillVertexData(QByteArray &vertexData, QByteArray &indexData vertexData.resize(vertexSize); indexData.resize(indexSize); } else if (qobject_cast<QQuick3DSpotLight *>(m_light)) { - // TODO: Spot light model, for now use area light model - *dataPtr++ = -1.f; *dataPtr++ = 1.f; *dataPtr++ = 0.f; - *dataPtr++ = -1.f; *dataPtr++ = -1.f; *dataPtr++ = 0.f; - *dataPtr++ = 1.f; *dataPtr++ = -1.f; *dataPtr++ = 0.f; - *dataPtr++ = 1.f; *dataPtr++ = 1.f; *dataPtr++ = 0.f; + const quint16 segments = spotArc * spotCone; + const double segment = M_PI * 2. / double(segments); - *dataPtr++ = -1.f; *dataPtr++ = 1.f; *dataPtr++ = -1.f; - *dataPtr++ = -1.f; *dataPtr++ = -1.f; *dataPtr++ = -1.f; - *dataPtr++ = 1.f; *dataPtr++ = -1.f; *dataPtr++ = -1.f; - *dataPtr++ = 1.f; *dataPtr++ = 1.f; *dataPtr++ = -1.f; + // Circle + for (quint16 i = 0; i < segments; ++i) { + float x = float(qCos(i * segment)); + float y = float(qSin(i * segment)); + *dataPtr++ = x; *dataPtr++ = y; *dataPtr++ = -2.f; + *indexPtr++ = i; *indexPtr++ = i + 1; + } + // Adjust the final index to complete the circle + *(indexPtr - 1) = 0; - *indexPtr++ = 0; *indexPtr++ = 1; - *indexPtr++ = 1; *indexPtr++ = 2; - *indexPtr++ = 2; *indexPtr++ = 3; - *indexPtr++ = 3; *indexPtr++ = 0; + // Cone tip + *dataPtr++ = 0.f; *dataPtr++ = 0.f; *dataPtr++ = 0.f; + quint16 tipIndex = segments; - *indexPtr++ = 0; *indexPtr++ = 4; - *indexPtr++ = 1; *indexPtr++ = 5; - *indexPtr++ = 2; *indexPtr++ = 6; - *indexPtr++ = 3; *indexPtr++ = 7; + // Cone lines + for (quint16 i = 0; i < spotCone; ++i) { + *indexPtr++ = tipIndex; + *indexPtr++ = i * spotArc; + } } static const float floatMin = std::numeric_limits<float>::lowest(); |