1// Copyright (C) 2023 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
4#include "barinstancing_p.h"
5
6QT_BEGIN_NAMESPACE
7
8BarInstancing::BarInstancing() {}
9
10BarInstancing::~BarInstancing()
11{
12 clearDataArray();
13}
14
15QByteArray BarInstancing::getInstanceBuffer(int *instanceCount)
16{
17 if (m_dirty) {
18 m_instanceData.resize(size: 0);
19 int instanceNumber = 0;
20
21 for (int i = 0; i < m_dataArray.size(); ++i) {
22 auto item = m_dataArray.at(i);
23
24 if ((item->color.alphaF() < 1.0) || transparency())
25 setDepthSortingEnabled(true);
26 else
27 setDepthSortingEnabled(false);
28
29 QVector4D customData{};
30 customData.setX(item->heightValue);
31 if (!item->selectedBar) {
32 auto entry = calculateTableEntryFromQuaternion(position: item->position,
33 scale: item->scale,
34 rotation: item->rotation,
35 color: item->color,
36 customData);
37 m_instanceData.append(s: reinterpret_cast<char *>(&entry), len: sizeof(entry));
38 } else {
39 // Even selected bars need to be drawn in a very small scale.
40 // If this is not done, the program can't find the selected bars in the
41 // graph and detects the wrong bars as selected ones.
42 auto entry = calculateTableEntryFromQuaternion(position: item->position,
43 scale: QVector3D{.001f, .001f, .001f},
44 rotation: item->rotation,
45 color: QColor(Qt::white));
46 m_instanceData.append(s: reinterpret_cast<char *>(&entry), len: sizeof(entry));
47 }
48 instanceNumber++;
49 }
50 m_instanceCount = instanceNumber;
51 m_dirty = false;
52 }
53
54 if (instanceCount)
55 *instanceCount = m_instanceCount;
56
57 return m_instanceData;
58}
59
60bool BarInstancing::transparency() const
61{
62 return m_transparency;
63}
64
65void BarInstancing::setTransparency(bool newTransparencyValue)
66{
67 m_transparency = newTransparencyValue;
68}
69
70void BarInstancing::clearDataArray()
71{
72 m_dataArray.clear();
73 m_instanceData.clear();
74}
75
76void BarInstancing::markDataDirty()
77{
78 m_dirty = true;
79 markDirty();
80}
81
82QList<BarItemHolder *> BarInstancing::dataArray() const
83{
84 return m_dataArray;
85}
86
87void BarInstancing::setDataArray(const QList<BarItemHolder *> &newDataArray)
88{
89 m_dataArray = newDataArray;
90 markDataDirty();
91}
92
93QT_END_NAMESPACE
94

source code of qtgraphs/src/graphs3d/engine/barinstancing.cpp