QGIS API Documentation 3.99.0-Master (18a1e75d814)
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
21#include "qgsvector3d.h"
22
23#include <QVector3D>
24#include <Qt3DCore/QGeometry>
25
26#define SIP_NO_FILE
27
28namespace Qt3DCore
29{
30 class QBuffer;
31 class QEntity;
32} //namespace Qt3DCore
33
34class QgsBox3D;
40
41class QgsPointCloud3DSymbolHandler
42{
43 public:
44 QgsPointCloud3DSymbolHandler();
45
46 virtual ~QgsPointCloud3DSymbolHandler() = default;
47
48 struct PointData;
49
50 virtual bool prepare( const QgsPointCloud3DRenderContext &context ) = 0; // override;
51 virtual void processNode( QgsPointCloudIndex &pc, const QgsPointCloudNodeId &n, const QgsPointCloud3DRenderContext &context, PointData *output = nullptr ) = 0; // override;
52 virtual void finalize( Qt3DCore::QEntity *parent, const QgsPointCloud3DRenderContext &context ) = 0; // override;
53
54 void triangulate( QgsPointCloudIndex &pc, const QgsPointCloudNodeId &n, const QgsPointCloud3DRenderContext &context, const QgsBox3D &box3D );
55
56 float zMinimum() const { return mZMin; }
57 float zMaximum() const { return mZMax; }
58
60 struct PointData
61 {
62 QgsVector3D positionsOrigin; // All "positions" are relative to this point, defined in map coordinates (with double precision)
63 QVector<QVector3D> positions; // Contains triplets of float x,y,z for each point. These are in map coordinates, relative to "positionsOrigin"
64 QVector<float> parameter;
65 QVector<float> pointSizes; // Contains point sizes, in case they are overridden for classification renderer
66 QVector<QVector3D> colors;
67 QByteArray triangles; // In case of points triangulation, contains index of point in the array positions
68 QByteArray normals; // In case of points triangulation, contains the normals of the solid surface on each vertex
69 };
70
71 protected:
72 float mZMin = std::numeric_limits<float>::max();
73 float mZMax = std::numeric_limits<float>::lowest();
74
75 void makeEntity( Qt3DCore::QEntity *parent, const QgsPointCloud3DRenderContext &context, const PointData &out, bool selected );
76
77 virtual Qt3DCore::QGeometry *makeGeometry( Qt3DCore::QNode *parent, const QgsPointCloud3DSymbolHandler::PointData &data, unsigned int byteStride ) = 0;
78
79 std::unique_ptr<QgsPointCloudBlock> pointCloudBlock( QgsPointCloudIndex &pc, const QgsPointCloudNodeId &node, const QgsPointCloudRequest &request, const QgsPointCloud3DRenderContext &context );
80
81 // outputs
82 PointData outNormal;
83
84 private:
86 std::vector<double> getVertices( QgsPointCloudIndex &pc, const QgsPointCloudNodeId &n, const QgsPointCloud3DRenderContext &context, const QgsBox3D &box3D );
87
89 void calculateNormals( const std::vector<size_t> &triangles );
90
99 void filterTriangles( const std::vector<size_t> &triangleIndexes, const QgsPointCloud3DRenderContext &context, const QgsBox3D &box3D );
100};
101
102class QgsSingleColorPointCloud3DSymbolHandler : public QgsPointCloud3DSymbolHandler
103{
104 public:
105 QgsSingleColorPointCloud3DSymbolHandler();
106
107 bool prepare( const QgsPointCloud3DRenderContext &context ) override;
108 void processNode( QgsPointCloudIndex &pc, const QgsPointCloudNodeId &n, const QgsPointCloud3DRenderContext &context, PointData *output = nullptr ) override;
109 void finalize( Qt3DCore::QEntity *parent, const QgsPointCloud3DRenderContext &context ) override;
110
111 private:
112 Qt3DCore::QGeometry *makeGeometry( Qt3DCore::QNode *parent, const QgsPointCloud3DSymbolHandler::PointData &data, unsigned int byteStride ) override;
113};
114
115class QgsColorRampPointCloud3DSymbolHandler : public QgsPointCloud3DSymbolHandler
116{
117 public:
118 QgsColorRampPointCloud3DSymbolHandler();
119
120 bool prepare( const QgsPointCloud3DRenderContext &context ) override;
121 void processNode( QgsPointCloudIndex &pc, const QgsPointCloudNodeId &n, const QgsPointCloud3DRenderContext &context, PointData *output = nullptr ) override;
122 void finalize( Qt3DCore::QEntity *parent, const QgsPointCloud3DRenderContext &context ) override;
123
124 private:
125 Qt3DCore::QGeometry *makeGeometry( Qt3DCore::QNode *parent, const QgsPointCloud3DSymbolHandler::PointData &data, unsigned int byteStride ) override;
126};
127
128class QgsRGBPointCloud3DSymbolHandler : public QgsPointCloud3DSymbolHandler
129{
130 public:
131 QgsRGBPointCloud3DSymbolHandler();
132
133 bool prepare( const QgsPointCloud3DRenderContext &context ) override;
134 void processNode( QgsPointCloudIndex &pc, const QgsPointCloudNodeId &n, const QgsPointCloud3DRenderContext &context, PointData *output = nullptr ) override;
135 void finalize( Qt3DCore::QEntity *parent, const QgsPointCloud3DRenderContext &context ) override;
136
137 private:
138 Qt3DCore::QGeometry *makeGeometry( Qt3DCore::QNode *parent, const QgsPointCloud3DSymbolHandler::PointData &data, unsigned int byteStride ) override;
139};
140
141class QgsClassificationPointCloud3DSymbolHandler : public QgsPointCloud3DSymbolHandler
142{
143 public:
144 QgsClassificationPointCloud3DSymbolHandler();
145
146 bool prepare( const QgsPointCloud3DRenderContext &context ) override;
147 void processNode( QgsPointCloudIndex &pc, const QgsPointCloudNodeId &n, const QgsPointCloud3DRenderContext &context, PointData *output = nullptr ) override;
148 void finalize( Qt3DCore::QEntity *parent, const QgsPointCloud3DRenderContext &context ) override;
149
150 private:
151 Qt3DCore::QGeometry *makeGeometry( Qt3DCore::QNode *parent, const QgsPointCloud3DSymbolHandler::PointData &data, unsigned int byteStride ) override;
152};
153
154class QgsPointCloud3DGeometry : public Qt3DCore::QGeometry
155{
156 Q_OBJECT
157
158 public:
159 QgsPointCloud3DGeometry( Qt3DCore::QNode *parent, const QgsPointCloud3DSymbolHandler::PointData &data, unsigned int byteStride );
160
161 protected:
162 virtual void makeVertexBuffer( const QgsPointCloud3DSymbolHandler::PointData &data ) = 0;
163
164 Qt3DCore::QAttribute *mPositionAttribute = nullptr;
165 Qt3DCore::QAttribute *mParameterAttribute = nullptr;
166 Qt3DCore::QAttribute *mPointSizeAttribute = nullptr;
167 Qt3DCore::QAttribute *mColorAttribute = nullptr;
168 Qt3DCore::QAttribute *mTriangleIndexAttribute = nullptr;
169 Qt3DCore::QAttribute *mNormalsAttribute = nullptr;
170 Qt3DCore::QBuffer *mVertexBuffer = nullptr;
171 Qt3DCore::QBuffer *mTriangleBuffer = nullptr;
172 Qt3DCore::QBuffer *mNormalsBuffer = nullptr;
173
174 int mVertexCount = 0;
175
176 unsigned int mByteStride = 16;
177};
178
179class QgsSingleColorPointCloud3DGeometry : public QgsPointCloud3DGeometry
180{
181 Q_OBJECT
182
183 public:
184 QgsSingleColorPointCloud3DGeometry( Qt3DCore::QNode *parent, const QgsPointCloud3DSymbolHandler::PointData &data, unsigned int byteStride );
185
186 private:
187 void makeVertexBuffer( const QgsPointCloud3DSymbolHandler::PointData &data ) override;
188};
189
190class QgsColorRampPointCloud3DGeometry : public QgsPointCloud3DGeometry
191{
192 Q_OBJECT
193
194 public:
195 QgsColorRampPointCloud3DGeometry( Qt3DCore::QNode *parent, const QgsPointCloud3DSymbolHandler::PointData &data, unsigned int byteStride );
196
197 private:
198 void makeVertexBuffer( const QgsPointCloud3DSymbolHandler::PointData &data ) override;
199};
200
201class QgsRGBPointCloud3DGeometry : public QgsPointCloud3DGeometry
202{
203 Q_OBJECT
204
205 public:
206 QgsRGBPointCloud3DGeometry( Qt3DCore::QNode *parent, const QgsPointCloud3DSymbolHandler::PointData &data, unsigned int byteStride );
207
208 private:
209 void makeVertexBuffer( const QgsPointCloud3DSymbolHandler::PointData &data ) override;
210};
211
212class QgsClassificationPointCloud3DGeometry : public QgsPointCloud3DGeometry
213{
214 Q_OBJECT
215
216 public:
217 QgsClassificationPointCloud3DGeometry( Qt3DCore::QNode *parent, const QgsPointCloud3DSymbolHandler::PointData &data, unsigned int byteStride );
218
219 private:
220 void makeVertexBuffer( const QgsPointCloud3DSymbolHandler::PointData &data ) override;
221};
223
224#endif // QGSPOINTCLOUD3DSYMBOL_P_H
A 3-dimensional box composed of x, y, z coordinates.
Definition qgsbox3d.h:45
Encapsulates the render context for a 3D point cloud rendering operation.
Base class for storing raw data from point cloud nodes.
Smart pointer for QgsAbstractPointCloudIndex.
Represents an indexed point cloud node's position in octree.
Point cloud data request.