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

Provided by KDAB

Privacy Policy
Learn Advanced QML with KDAB
Find out more

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