1// Copyright (C) 2023 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
4#include "scatterinstancing_p.h"
5
6QT_BEGIN_NAMESPACE
7
8ScatterInstancing::ScatterInstancing() {}
9
10QByteArray ScatterInstancing::getInstanceBuffer(int *instanceCount)
11{
12 if (m_dirty) {
13 m_instanceData.resize(size: 0);
14 int instanceNumber = 0;
15
16 for (int i = 0; i < m_dataArray.size(); ++i) {
17 auto item = m_dataArray.at(i);
18 float x = item.position.x();
19 float y = item.position.y();
20 float z = item.position.z();
21 QVector4D customData{};
22 if (m_rangeGradient)
23 customData.setX(m_customData.at(i));
24
25 if (item.hide) {
26 // Setting the scale to zero breaks instanced picking.
27 item.scale = {0.001f, 0.001f, 0.001f};
28 }
29 auto entry = calculateTableEntryFromQuaternion(position: {x, y, z},
30 scale: item.scale,
31 rotation: item.rotation,
32 color: QColor(Qt::white),
33 customData);
34 m_instanceData.append(s: reinterpret_cast<char *>(&entry), len: sizeof(entry));
35 instanceNumber++;
36 }
37 m_instanceCount = instanceNumber;
38 m_dirty = false;
39 }
40
41 if (instanceCount)
42 *instanceCount = m_instanceCount;
43
44 return m_instanceData;
45}
46
47bool ScatterInstancing::rangeGradient() const
48{
49 return m_rangeGradient;
50}
51
52void ScatterInstancing::setRangeGradient(bool newRangeGradient)
53{
54 m_rangeGradient = newRangeGradient;
55}
56
57void ScatterInstancing::setTransparency(bool transparency)
58{
59 setDepthSortingEnabled(transparency);
60}
61
62const QList<float> &ScatterInstancing::customData() const
63{
64 return m_customData;
65}
66
67void ScatterInstancing::setCustomData(const QList<float> &newCustomData)
68{
69 m_customData = newCustomData;
70 markDataDirty();
71}
72
73void ScatterInstancing::markDataDirty()
74{
75 m_dirty = true;
76 markDirty();
77}
78
79const QList<DataItemHolder> &ScatterInstancing::dataArray() const
80{
81 return m_dataArray;
82}
83
84void ScatterInstancing::setDataArray(const QList<DataItemHolder> &newDataArray)
85{
86 m_dataArray = newDataArray;
87 markDataDirty();
88}
89
90void ScatterInstancing::hideDataItem(qsizetype index)
91{
92 unhidePreviousDataItem();
93 Q_ASSERT(index < m_dataArray.size());
94 m_dataArray[index].hide = true;
95 m_previousHideIndex = index;
96}
97
98void ScatterInstancing::unhidePreviousDataItem()
99{
100 if (m_previousHideIndex >= 0) {
101 m_dataArray[m_previousHideIndex].hide = false;
102 markDataDirty();
103 }
104}
105
106void ScatterInstancing::resetVisibilty()
107{
108 for (auto &dih : m_dataArray)
109 dih.hide = false;
110 markDataDirty();
111}
112
113QT_END_NAMESPACE
114

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