Revision control

Copy as Markdown

// Copyright (C) 2022 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
// Qt-Security score:significant reason:default
#include "infinitegrid_p.h"
#include <QtQuick3D/private/qquick3dviewport_p.h>
QT_BEGIN_NAMESPACE
/*!
\qmltype InfiniteGrid
\inqmlmodule QtQuick3D.Helpers
\since 6.5
\brief Shows an infinite grid.
This helper implements an infinite grid in the horizontal plane.
The grid fades out as the grid lines converge or at the far clip distance,
whichever comes first.
The grid needs to be a child of the \l{SceneEnvironment}.
\qml
View3D {
environment: SceneEnvironment {
backgroundMode: SceneEnvironment.SkyBox
lightProbe: Texture {
textureData: ProceduralSkyTextureData{}
}
InfiniteGrid {
gridInterval: 100
}
}
//...
}
\endqml
*/
/*!
\qmlproperty real InfiniteGrid::gridInterval
This property defines the distance between grid lines. The default value is \c 1.0.
*/
/*!
\qmlproperty bool InfiniteGrid::visible
This property determines whether the grid is shown. The default value is \c true.
*/
/*!
\qmlproperty bool InfiniteGrid::gridAxes
This property determines whether the X and Y axes are marked. If \c true,
the X-axis will be red and the Y-axis green. The default value is \c true.
*/
QQuick3DInfiniteGrid::QQuick3DInfiniteGrid()
{
}
QQuick3DInfiniteGrid::~QQuick3DInfiniteGrid()
{
}
bool QQuick3DInfiniteGrid::visible() const
{
return m_visible;
}
void QQuick3DInfiniteGrid::setVisible(bool newVisible)
{
if (m_visible == newVisible)
return;
m_visible = newVisible;
emit visibleChanged();
if (m_sceneEnv)
m_sceneEnv->setGridEnabled(m_visible);
}
float QQuick3DInfiniteGrid::gridInterval() const
{
return m_gridInterval;
}
void QQuick3DInfiniteGrid::setGridInterval(float newGridInterval)
{
if (qFuzzyCompare(m_gridInterval, newGridInterval))
return;
m_gridInterval = newGridInterval;
emit gridIntervalChanged();
if (m_sceneEnv && !qFuzzyIsNull(m_gridInterval))
m_sceneEnv->setGridScale(0.1 / m_gridInterval);
}
void QQuick3DInfiniteGrid::componentComplete()
{
m_componentComplete = true;
auto *p = parent();
QQuick3DSceneEnvironment *sceneEnv = nullptr;
while (p && !sceneEnv) {
sceneEnv = qobject_cast<QQuick3DSceneEnvironment *>(p);
p = p->parent();
}
if (sceneEnv) {
m_sceneEnv = sceneEnv;
Q_ASSERT(m_sceneEnv);
m_sceneEnv->setGridEnabled(m_visible);
if (!qFuzzyIsNull(m_gridInterval))
m_sceneEnv->setGridScale(0.1 / m_gridInterval);
updateGridFlags();
} else {
qWarning("InfiniteGrid needs to be a child of SceneEnvironment.");
}
}
void QQuick3DInfiniteGrid::classBegin()
{
}
bool QQuick3DInfiniteGrid::gridAxes() const
{
return m_gridAxes;
}
void QQuick3DInfiniteGrid::setGridAxes(bool newGridAxes)
{
if (m_gridAxes == newGridAxes)
return;
m_gridAxes = newGridAxes;
emit gridAxesChanged();
if (m_sceneEnv)
updateGridFlags();
}
void QQuick3DInfiniteGrid::updateGridFlags()
{
enum GridFlags { NoFlag = 0, DrawAxis = 1 };
uint newFlags = m_gridAxes ? DrawAxis : NoFlag;
m_sceneEnv->setGridFlags(newFlags);
}
QT_END_NAMESPACE