QGIS API Documentation 3.99.0-Master (09f76ad7019)
Loading...
Searching...
No Matches
qgspointcloud3dsymbol_p.h
Go to the documentation of this file.
1/***************************************************************************
2 qgspointcloud3dsymbol_p.h
3 ------------------------------
4 Date : December 2020
5 Copyright : (C) 2020 by Nedjima Belgacem
6 Email : belgacem dot nedjima at gmail dot com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
16#ifndef QGSPOINTCLOUD3DSYMBOL_P_H
17#define QGSPOINTCLOUD3DSYMBOL_P_H
18
20
22
23#include <QFutureWatcher>
24#include <QVector3D>
25#include <Qt3DCore/QBuffer>
26#include <Qt3DCore/QGeometry>
27
28#define SIP_NO_FILE
29
31class QgsAABB;
32
33class QgsPointCloud3DSymbolHandler
34{
35 public:
36 QgsPointCloud3DSymbolHandler();
37
38 virtual ~QgsPointCloud3DSymbolHandler() = default;
39
40 struct PointData;
41
42 virtual bool prepare( const QgsPointCloud3DRenderContext &context ) = 0; // override;
43 virtual void processNode( QgsPointCloudIndex &pc, const QgsPointCloudNodeId &n, const QgsPointCloud3DRenderContext &context, PointData *output = nullptr ) = 0; // override;
44 virtual void finalize( Qt3DCore::QEntity *parent, const QgsPointCloud3DRenderContext &context ) = 0; // override;
45
46 void triangulate( QgsPointCloudIndex &pc, const QgsPointCloudNodeId &n, const QgsPointCloud3DRenderContext &context, const QgsBox3D &box3D );
47
48 float zMinimum() const { return mZMin; }
49 float zMaximum() const { return mZMax; }
50
52 struct PointData
53 {
54 QgsVector3D positionsOrigin; // All "positions" are relative to this point, defined in map coordinates (with double precision)
55 QVector<QVector3D> positions; // Contains triplets of float x,y,z for each point. These are in map coordinates, relative to "positionsOrigin"
56 QVector<float> parameter;
57 QVector<float> pointSizes; // Contains point sizes, in case they are overridden for classification renderer
58 QVector<QVector3D> colors;
59 QByteArray triangles; // In case of points triangulation, contains index of point in the array positions
60 QByteArray normals; // In case of points triangulation, contains the normals of the solid surface on each vertex
61 };
62
63 protected:
64 float mZMin = std::numeric_limits<float>::max();
65 float mZMax = std::numeric_limits<float>::lowest();
66
67 void makeEntity( Qt3DCore::QEntity *parent, const QgsPointCloud3DRenderContext &context, const PointData &out, bool selected );
68
69 virtual Qt3DCore::QGeometry *makeGeometry( Qt3DCore::QNode *parent, const QgsPointCloud3DSymbolHandler::PointData &data, unsigned int byteStride ) = 0;
70
71 std::unique_ptr<QgsPointCloudBlock> pointCloudBlock( QgsPointCloudIndex &pc, const QgsPointCloudNodeId &node, const QgsPointCloudRequest &request, const QgsPointCloud3DRenderContext &context );
72
73 // outputs
74 PointData outNormal;
75
76 private:
78 std::vector<double> getVertices( QgsPointCloudIndex &pc, const QgsPointCloudNodeId &n, const QgsPointCloud3DRenderContext &context, const QgsBox3D &box3D );
79
81 void calculateNormals( const std::vector<size_t> &triangles );
82
91 void filterTriangles( const std::vector<size_t> &triangleIndexes, const QgsPointCloud3DRenderContext &context, const QgsBox3D &box3D );
92};
93
94class QgsSingleColorPointCloud3DSymbolHandler : public QgsPointCloud3DSymbolHandler
95{
96 public:
97 QgsSingleColorPointCloud3DSymbolHandler();
98
99 bool prepare( const QgsPointCloud3DRenderContext &context ) override;
100 void processNode( QgsPointCloudIndex &pc, const QgsPointCloudNodeId &n, const QgsPointCloud3DRenderContext &context, PointData *output = nullptr ) override;
101 void finalize( Qt3DCore::QEntity *parent, const QgsPointCloud3DRenderContext &context ) override;
102
103 private:
104 Qt3DCore::QGeometry *makeGeometry( Qt3DCore::QNode *parent, const QgsPointCloud3DSymbolHandler::PointData &data, unsigned int byteStride ) override;
105};
106
107class QgsColorRampPointCloud3DSymbolHandler : public QgsPointCloud3DSymbolHandler
108{
109 public:
110 QgsColorRampPointCloud3DSymbolHandler();
111
112 bool prepare( const QgsPointCloud3DRenderContext &context ) override;
113 void processNode( QgsPointCloudIndex &pc, const QgsPointCloudNodeId &n, const QgsPointCloud3DRenderContext &context, PointData *output = nullptr ) override;
114 void finalize( Qt3DCore::QEntity *parent, const QgsPointCloud3DRenderContext &context ) override;
115
116 private:
117 Qt3DCore::QGeometry *makeGeometry( Qt3DCore::QNode *parent, const QgsPointCloud3DSymbolHandler::PointData &data, unsigned int byteStride ) override;
118};
119
120class QgsRGBPointCloud3DSymbolHandler : public QgsPointCloud3DSymbolHandler
121{
122 public:
123 QgsRGBPointCloud3DSymbolHandler();
124
125 bool prepare( const QgsPointCloud3DRenderContext &context ) override;
126 void processNode( QgsPointCloudIndex &pc, const QgsPointCloudNodeId &n, const QgsPointCloud3DRenderContext &context, PointData *output = nullptr ) override;
127 void finalize( Qt3DCore::QEntity *parent, const QgsPointCloud3DRenderContext &context ) override;
128
129 private:
130 Qt3DCore::QGeometry *makeGeometry( Qt3DCore::QNode *parent, const QgsPointCloud3DSymbolHandler::PointData &data, unsigned int byteStride ) override;
131};
132
133class QgsClassificationPointCloud3DSymbolHandler : public QgsPointCloud3DSymbolHandler
134{
135 public:
136 QgsClassificationPointCloud3DSymbolHandler();
137
138 bool prepare( const QgsPointCloud3DRenderContext &context ) override;
139 void processNode( QgsPointCloudIndex &pc, const QgsPointCloudNodeId &n, const QgsPointCloud3DRenderContext &context, PointData *output = nullptr ) override;
140 void finalize( Qt3DCore::QEntity *parent, const QgsPointCloud3DRenderContext &context ) override;
141
142 private:
143 Qt3DCore::QGeometry *makeGeometry( Qt3DCore::QNode *parent, const QgsPointCloud3DSymbolHandler::PointData &data, unsigned int byteStride ) override;
144};
145
146class QgsPointCloud3DGeometry : public Qt3DCore::QGeometry
147{
148 Q_OBJECT
149
150 public:
151 QgsPointCloud3DGeometry( Qt3DCore::QNode *parent, const QgsPointCloud3DSymbolHandler::PointData &data, unsigned int byteStride );
152
153 protected:
154 virtual void makeVertexBuffer( const QgsPointCloud3DSymbolHandler::PointData &data ) = 0;
155
156 Qt3DCore::QAttribute *mPositionAttribute = nullptr;
157 Qt3DCore::QAttribute *mParameterAttribute = nullptr;
158 Qt3DCore::QAttribute *mPointSizeAttribute = nullptr;
159 Qt3DCore::QAttribute *mColorAttribute = nullptr;
160 Qt3DCore::QAttribute *mTriangleIndexAttribute = nullptr;
161 Qt3DCore::QAttribute *mNormalsAttribute = nullptr;
162 Qt3DCore::QBuffer *mVertexBuffer = nullptr;
163 Qt3DCore::QBuffer *mTriangleBuffer = nullptr;
164 Qt3DCore::QBuffer *mNormalsBuffer = nullptr;
165
166 int mVertexCount = 0;
167
168 unsigned int mByteStride = 16;
169};
170
171class QgsSingleColorPointCloud3DGeometry : public QgsPointCloud3DGeometry
172{
173 Q_OBJECT
174
175 public:
176 QgsSingleColorPointCloud3DGeometry( Qt3DCore::QNode *parent, const QgsPointCloud3DSymbolHandler::PointData &data, unsigned int byteStride );
177
178 private:
179 void makeVertexBuffer( const QgsPointCloud3DSymbolHandler::PointData &data ) override;
180};
181
182class QgsColorRampPointCloud3DGeometry : public QgsPointCloud3DGeometry
183{
184 Q_OBJECT
185
186 public:
187 QgsColorRampPointCloud3DGeometry( Qt3DCore::QNode *parent, const QgsPointCloud3DSymbolHandler::PointData &data, unsigned int byteStride );
188
189 private:
190 void makeVertexBuffer( const QgsPointCloud3DSymbolHandler::PointData &data ) override;
191};
192
193class QgsRGBPointCloud3DGeometry : public QgsPointCloud3DGeometry
194{
195 Q_OBJECT
196
197 public:
198 QgsRGBPointCloud3DGeometry( Qt3DCore::QNode *parent, const QgsPointCloud3DSymbolHandler::PointData &data, unsigned int byteStride );
199
200 private:
201 void makeVertexBuffer( const QgsPointCloud3DSymbolHandler::PointData &data ) override;
202};
203
204class QgsClassificationPointCloud3DGeometry : public QgsPointCloud3DGeometry
205{
206 Q_OBJECT
207
208 public:
209 QgsClassificationPointCloud3DGeometry( Qt3DCore::QNode *parent, const QgsPointCloud3DSymbolHandler::PointData &data, unsigned int byteStride );
210
211 private:
212 void makeVertexBuffer( const QgsPointCloud3DSymbolHandler::PointData &data ) override;
213};
215
216#endif // QGSPOINTCLOUD3DSYMBOL_P_H
Axis-aligned bounding box - in world coords.
Definition qgsaabb.h:35
Represents an indexed point cloud node's position in octree.