1/****************************************************************************
2**
3** Copyright (C) 2016 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the Qt Data Visualization module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:GPL$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU
19** General Public License version 3 or (at your option) any later version
20** approved by the KDE Free Qt Foundation. The licenses are as published by
21** the Free Software Foundation and appearing in the file LICENSE.GPL3
22** included in the packaging of this file. Please review the following
23** information to ensure the GNU General Public License requirements will
24** be met: https://www.gnu.org/licenses/gpl-3.0.html.
25**
26** $QT_END_LICENSE$
27**
28****************************************************************************/
29
30#include "topographicseries.h"
31
32using namespace QtDataVisualization;
33
34//! [0]
35// Value used to encode height data as RGB value on PNG file
36const float packingFactor = 11983.0f;
37//! [0]
38
39TopographicSeries::TopographicSeries()
40{
41 setDrawMode(QSurface3DSeries::DrawSurface);
42 setFlatShadingEnabled(true);
43 setBaseColor(Qt::white);
44}
45
46TopographicSeries::~TopographicSeries()
47{
48}
49
50void TopographicSeries::setTopographyFile(const QString file, float width, float height)
51{
52//! [1]
53 QImage heightMapImage(file);
54 uchar *bits = heightMapImage.bits();
55 int imageHeight = heightMapImage.height();
56 int imageWidth = heightMapImage.width();
57 int widthBits = imageWidth * 4;
58 float stepX = width / float(imageWidth);
59 float stepZ = height / float(imageHeight);
60
61 QSurfaceDataArray *dataArray = new QSurfaceDataArray;
62 dataArray->reserve(alloc: imageHeight);
63 for (int i = 0; i < imageHeight; i++) {
64 int p = i * widthBits;
65 float z = height - float(i) * stepZ;
66 QSurfaceDataRow *newRow = new QSurfaceDataRow(imageWidth);
67 for (int j = 0; j < imageWidth; j++) {
68 uchar aa = bits[p + 0];
69 uchar rr = bits[p + 1];
70 uchar gg = bits[p + 2];
71 uint color = uint((gg << 16) + (rr << 8) + aa);
72 float y = float(color) / packingFactor;
73 (*newRow)[j].setPosition(QVector3D(float(j) * stepX, y, z));
74 p = p + 4;
75 }
76 *dataArray << newRow;
77 }
78
79 dataProxy()->resetArray(newArray: dataArray);
80//! [1]
81
82 m_sampleCountX = float(imageWidth);
83 m_sampleCountZ = float(imageHeight);
84}
85

source code of qtdatavis3d/examples/datavisualization/texturesurface/topographicseries.cpp