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 "vertexindexer_p.h"
31
32#include <QtCore/qmath.h>
33
34QT_BEGIN_NAMESPACE_DATAVISUALIZATION
35
36int unique_vertices = 0;
37
38bool VertexIndexer::getSimilarVertexIndex_fast(const PackedVertex &packed,
39 QMap<PackedVertex, GLuint> &VertexToOutIndex,
40 GLuint &result)
41{
42 QMap<PackedVertex, GLuint>::iterator it = VertexToOutIndex.find(akey: packed);
43 if (it == VertexToOutIndex.end()) {
44 return false;
45 } else {
46 result = it.value();
47 return true;
48 }
49}
50
51void VertexIndexer::indexVBO(const QVector<QVector3D> &in_vertices,
52 const QVector<QVector2D> &in_uvs,
53 const QVector<QVector3D> &in_normals,
54 QVector<GLuint> &out_indices,
55 QVector<QVector3D> &out_vertices,
56 QVector<QVector2D> &out_uvs,
57 QVector<QVector3D> &out_normals)
58{
59 unique_vertices = 0;
60 QMap<PackedVertex, GLuint> VertexToOutIndex;
61
62 // For each input vertex
63 for (int i = 0; i < in_vertices.size(); i++) {
64 PackedVertex packed = {.position: in_vertices[i], .uv: in_uvs[i], .normal: in_normals[i]};
65
66 // Try to find a similar vertex in out_XXXX
67 GLuint index;
68 bool found = getSimilarVertexIndex_fast(packed, VertexToOutIndex, result&: index);
69
70 if (found) {
71 out_indices.append(t: index);
72 } else {
73 unique_vertices++;
74 out_vertices.append(t: in_vertices[i]);
75 out_uvs.append(t: in_uvs[i]);
76 out_normals.append(t: in_normals[i]);
77 GLuint newindex = (GLuint)out_vertices.size() - 1;
78 out_indices.append(t: newindex);
79 VertexToOutIndex[packed] = newindex;
80 }
81 }
82}
83
84QT_END_NAMESPACE_DATAVISUALIZATION
85

source code of qtdatavis3d/src/datavisualization/utils/vertexindexer.cpp