Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qssgrenderparticles.cpp
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
4#include <QtQuick3DRuntimeRender/private/qssgrenderparticles_p.h>
5#include <cmath>
6
8
9static int divisibleBy(int a, int b)
10{
11 return (a % b) ? a + b - (a % b) : a;
12}
13static int ceilDivide(int a, int b)
14{
15 int x = a / b;
16 int y = (a % b) ? 1 : 0;
17 return x + y;
18}
19
20void QSSGParticleBuffer::resize(int particleCount, int particleSize)
21{
22 if (particleCount == 0) {
23 m_particlesPerSlice = 0;
24 m_particleCount = 0;
25 m_sliceStride = 0;
26 m_size = QSize();
27 m_particleBuffer.resize(0);
28 return;
29 }
30 int vec4PerParticle = ceilDivide(particleSize, 16);
31 int vec4s = particleCount * vec4PerParticle;
32 int width = divisibleBy(std::sqrt(vec4s), vec4PerParticle);
33 int height = ceilDivide(vec4s, width);
34 m_particlesPerSlice = width / vec4PerParticle;
35 m_particleCount = particleCount;
36 width = divisibleBy(width, 4);
37 height = divisibleBy(height, 4);
38 m_sliceStride = width * 16;
39 m_size = QSize(width, height);
40 m_particleBuffer.resize(m_sliceStride * height);
41}
42
43void QSSGParticleBuffer::resizeLine(int particleCount, int segmentCount)
44{
45 m_segments = segmentCount;
46 resize(particleCount * segmentCount, sizeof(QSSGLineParticle));
47}
48
49void QSSGParticleBuffer::setBounds(const QSSGBounds3& bounds)
50{
51 m_bounds = bounds;
52 m_serial++;
53}
54
55char *QSSGParticleBuffer::pointer()
56{
57 return m_particleBuffer.data();
58}
59
60const char *QSSGParticleBuffer::pointer() const
61{
62 return m_particleBuffer.constData();
63}
64
65int QSSGParticleBuffer::particlesPerSlice() const
66{
67 return m_particlesPerSlice;
68}
69
70int QSSGParticleBuffer::sliceStride() const
71{
72 return m_sliceStride;
73}
74
75int QSSGParticleBuffer::particleCount() const
76{
77 return m_particleCount;
78}
79
80QSize QSSGParticleBuffer::size() const
81{
82 return m_size;
83}
84
85int QSSGParticleBuffer::sliceCount() const
86{
87 return m_size.height();
88}
89
90QByteArray QSSGParticleBuffer::data() const
91{
92 return m_particleBuffer;
93}
94
95int QSSGParticleBuffer::bufferSize() const
96{
97 return m_particleBuffer.size();
98}
99
100int QSSGParticleBuffer::serial() const
101{
102 return m_serial;
103}
104
105int QSSGParticleBuffer::segments() const
106{
107 return m_segments;
108}
109
110QSSGBounds3 QSSGParticleBuffer::bounds() const
111{
112 return m_bounds;
113}
114
115QSSGRenderParticles::QSSGRenderParticles()
116 : QSSGRenderNode(QSSGRenderGraphObject::Type::Particles)
117{
118
119}
120
121QT_END_NAMESPACE
static int ceilDivide(int a, int b)
static QT_BEGIN_NAMESPACE int divisibleBy(int a, int b)