blob: e454c0aedddb7dd0bdb02aebecf680fc86825694 [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2019 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Quick 3D.
**
** $QT_BEGIN_LICENSE:GPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 or (at your option) any later version
** approved by the KDE Free Qt Foundation. The licenses are as published by
** the Free Software Foundation and appearing in the file LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "gridgeometry_p.h"
#include <QtQuick3DRuntimeRender/private/qssgrendergeometry_p.h>
/*!
\qmltype GridGeometry
\inqmlmodule QtQuick3D.Helpers
\inherits Geometry
\brief Visual helper for showing grid in a scene.
This helper implements grid geometry, which allows showing a grid in a scene.
*/
/*! \qmlproperty int GridGeometry::horizontalLines
Specifies the number of horizontal lines in a grid.
*/
/*! \qmlproperty int GridGeometry::verticalLines
Specifies the number of vertical lines in a grid.
*/
/*! \qmlproperty real GridGeometry::horizontalStep
Specifies the spacing between horizontal lines.
*/
/*! \qmlproperty real GridGeometry::verticalStep
Specifies the spacing between vertical lines.
*/
GridGeometry::GridGeometry()
: QQuick3DGeometry()
{
}
GridGeometry::~GridGeometry()
{
}
int GridGeometry::horizontalLines() const
{
return m_horLines;
}
int GridGeometry::verticalLines() const
{
return m_vertLines;
}
float GridGeometry::horizontalStep() const
{
return m_horStep;
}
float GridGeometry::verticalStep() const
{
return m_vertStep;
}
void GridGeometry::setHorizontalLines(int count)
{
count = qMax(count, 1);
if (m_horLines == count)
return;
m_horLines = qMax(count, 1);
emit horizontalLinesChanged();
update();
}
void GridGeometry::setVerticalLines(int count)
{
count = qMax(count, 1);
if (m_vertLines == count)
return;
m_vertLines = qMax(count, 1);
emit verticalLinesChanged();
update();
}
void GridGeometry::setHorizontalStep(float step)
{
step = qMax(step, 0.0f);
if (qFuzzyCompare(m_horStep, step))
return;
m_horStep = step;
emit horizontalStepChanged();
update();
}
void GridGeometry::setVerticalStep(float step)
{
step = qMax(step, 0.0f);
if (qFuzzyCompare(m_vertStep, step))
return;
m_vertStep = step;
emit verticalStepChanged();
update();
}
static void fillVertexData(QByteArray &vertexData, int horLines, float horStep,
int vertLines, float vertStep)
{
const int size = (horLines + vertLines) * sizeof(float) * 8 * 2;
vertexData.resize(size);
float *dataPtr = reinterpret_cast<float *>(vertexData.data());
float y0 = -float(horLines - 1) * horStep * .5f;
float x0 = -float(vertLines - 1) * vertStep * .5f;
float y1 = -y0;
float x1 = -x0;
for (int i = 0; i < horLines; ++i) {
// start position
dataPtr[0] = x0;
dataPtr[1] = y0 + i * horStep;
dataPtr[2] = .0f;
dataPtr[3] = 1.f;
dataPtr[4] = 0;
dataPtr[5] = 0;
dataPtr[6] = 1.f;
dataPtr[7] = 0;
dataPtr += 8;
// end position
dataPtr[0] = x1;
dataPtr[1] = y0 + i * horStep;
dataPtr[2] = .0f;
dataPtr[3] = 1.f;
dataPtr[4] = 0;
dataPtr[5] = 0;
dataPtr[6] = 1.f;
dataPtr[7] = 0;
dataPtr += 8;
}
for (int i = 0; i < vertLines; ++i) {
// start position
dataPtr[0] = x0 + i * vertStep;
dataPtr[1] = y0;
dataPtr[2] = .0f;
dataPtr[3] = 1.f;
dataPtr[4] = 0;
dataPtr[5] = 0;
dataPtr[6] = 1.f;
dataPtr[7] = 0;
dataPtr += 8;
// end position
dataPtr[0] = x0 + i * vertStep;
dataPtr[1] = y1;
dataPtr[2] = .0f;
dataPtr[3] = 1.f;
dataPtr[4] = 0;
dataPtr[5] = 0;
dataPtr[6] = 1.f;
dataPtr[7] = 0;
dataPtr += 8;
}
}
QSSGRenderGraphObject *GridGeometry::updateSpatialNode(QSSGRenderGraphObject *node)
{
node = QQuick3DGeometry::updateSpatialNode(node);
QSSGRenderGeometry *geometry = static_cast<QSSGRenderGeometry *>(node);
geometry->clear(); // clear removes the name so reset it
QByteArray vertexData;
fillVertexData(vertexData, m_horLines, m_horStep, m_vertLines, m_vertStep);
geometry->addAttribute(QSSGRenderGeometry::Attribute::PositionSemantic, 0,
QSSGRenderGeometry::Attribute::ComponentType::F32Type);
geometry->addAttribute(QSSGRenderGeometry::Attribute::NormalSemantic, 16,
QSSGRenderGeometry::Attribute::ComponentType::F32Type);
geometry->setStride(32);
geometry->setVertexData(vertexData);
geometry->setPrimitiveType(QSSGRenderGeometry::Lines);
geometry->setBounds(QVector3D(-m_vertLines/2, -m_horLines/2, 0.0) * m_horStep,
QVector3D(m_vertLines/2, m_horLines/2, 0.0) * m_vertStep);
return node;
}