16#ifndef QGSPOINTCLOUD3DSYMBOL_P_H
17#define QGSPOINTCLOUD3DSYMBOL_P_H
23#include <QFutureWatcher>
25#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
26#include <Qt3DRender/QGeometry>
27#include <Qt3DRender/QBuffer>
29#include <Qt3DCore/QGeometry>
30#include <Qt3DCore/QBuffer>
39class QgsPointCloud3DSymbolHandler
42 QgsPointCloud3DSymbolHandler();
44 virtual ~QgsPointCloud3DSymbolHandler() =
default;
48 virtual bool prepare(
const QgsPointCloud3DRenderContext &context ) = 0;
49 virtual void processNode( QgsPointCloudIndex &pc,
const QgsPointCloudNodeId &n,
const QgsPointCloud3DRenderContext &context, PointData *output =
nullptr ) = 0;
50 virtual void finalize( Qt3DCore::QEntity *parent,
const QgsPointCloud3DRenderContext &context ) = 0;
52 void triangulate( QgsPointCloudIndex &pc,
const QgsPointCloudNodeId &n,
const QgsPointCloud3DRenderContext &context,
const QgsBox3D &box3D );
54 float zMinimum()
const {
return mZMin; }
55 float zMaximum()
const {
return mZMax; }
60 QgsVector3D positionsOrigin;
61 QVector<QVector3D> positions;
62 QVector<float> parameter;
63 QVector<float> pointSizes;
64 QVector<QVector3D> colors;
70 float mZMin = std::numeric_limits<float>::max();
71 float mZMax = std::numeric_limits<float>::lowest();
73 void makeEntity( Qt3DCore::QEntity *parent,
const QgsPointCloud3DRenderContext &context,
const PointData &out,
bool selected );
75#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
76 virtual Qt3DRender::QGeometry *makeGeometry( Qt3DCore::QNode *parent,
const QgsPointCloud3DSymbolHandler::PointData &data,
unsigned int byteStride ) = 0;
78 virtual Qt3DCore::QGeometry *makeGeometry( Qt3DCore::QNode *parent,
const QgsPointCloud3DSymbolHandler::PointData &data,
unsigned int byteStride ) = 0;
80 std::unique_ptr<QgsPointCloudBlock> pointCloudBlock( QgsPointCloudIndex &pc,
const QgsPointCloudNodeId &node,
const QgsPointCloudRequest &request,
const QgsPointCloud3DRenderContext &context );
87 std::vector<double> getVertices( QgsPointCloudIndex &pc,
const QgsPointCloudNodeId &n,
const QgsPointCloud3DRenderContext &context,
const QgsBox3D &box3D );
90 void calculateNormals(
const std::vector<size_t> &triangles );
100 void filterTriangles(
const std::vector<size_t> &triangleIndexes,
const QgsPointCloud3DRenderContext &context,
const QgsBox3D &box3D );
103class QgsSingleColorPointCloud3DSymbolHandler :
public QgsPointCloud3DSymbolHandler
106 QgsSingleColorPointCloud3DSymbolHandler();
108 bool prepare(
const QgsPointCloud3DRenderContext &context )
override;
109 void processNode( QgsPointCloudIndex &pc,
const QgsPointCloudNodeId &n,
const QgsPointCloud3DRenderContext &context, PointData *output =
nullptr )
override;
110 void finalize( Qt3DCore::QEntity *parent,
const QgsPointCloud3DRenderContext &context )
override;
113#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
114 Qt3DRender::QGeometry *makeGeometry( Qt3DCore::QNode *parent,
const QgsPointCloud3DSymbolHandler::PointData &data,
unsigned int byteStride )
override;
116 Qt3DCore::QGeometry *makeGeometry( Qt3DCore::QNode *parent,
const QgsPointCloud3DSymbolHandler::PointData &data,
unsigned int byteStride )
override;
120class QgsColorRampPointCloud3DSymbolHandler :
public QgsPointCloud3DSymbolHandler
123 QgsColorRampPointCloud3DSymbolHandler();
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;
130#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
131 Qt3DRender::QGeometry *makeGeometry( Qt3DCore::QNode *parent,
const QgsPointCloud3DSymbolHandler::PointData &data,
unsigned int byteStride )
override;
133 Qt3DCore::QGeometry *makeGeometry( Qt3DCore::QNode *parent,
const QgsPointCloud3DSymbolHandler::PointData &data,
unsigned int byteStride )
override;
137class QgsRGBPointCloud3DSymbolHandler :
public QgsPointCloud3DSymbolHandler
140 QgsRGBPointCloud3DSymbolHandler();
142 bool prepare(
const QgsPointCloud3DRenderContext &context )
override;
143 void processNode( QgsPointCloudIndex &pc,
const QgsPointCloudNodeId &n,
const QgsPointCloud3DRenderContext &context, PointData *output =
nullptr )
override;
144 void finalize( Qt3DCore::QEntity *parent,
const QgsPointCloud3DRenderContext &context )
override;
147#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
148 Qt3DRender::QGeometry *makeGeometry( Qt3DCore::QNode *parent,
const QgsPointCloud3DSymbolHandler::PointData &data,
unsigned int byteStride )
override;
150 Qt3DCore::QGeometry *makeGeometry( Qt3DCore::QNode *parent,
const QgsPointCloud3DSymbolHandler::PointData &data,
unsigned int byteStride )
override;
154class QgsClassificationPointCloud3DSymbolHandler :
public QgsPointCloud3DSymbolHandler
157 QgsClassificationPointCloud3DSymbolHandler();
159 bool prepare(
const QgsPointCloud3DRenderContext &context )
override;
160 void processNode( QgsPointCloudIndex &pc,
const QgsPointCloudNodeId &n,
const QgsPointCloud3DRenderContext &context, PointData *output =
nullptr )
override;
161 void finalize( Qt3DCore::QEntity *parent,
const QgsPointCloud3DRenderContext &context )
override;
164#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
165 Qt3DRender::QGeometry *makeGeometry( Qt3DCore::QNode *parent,
const QgsPointCloud3DSymbolHandler::PointData &data,
unsigned int byteStride )
override;
167 Qt3DCore::QGeometry *makeGeometry( Qt3DCore::QNode *parent,
const QgsPointCloud3DSymbolHandler::PointData &data,
unsigned int byteStride )
override;
171#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
172class QgsPointCloud3DGeometry :
public Qt3DRender::QGeometry
174class QgsPointCloud3DGeometry :
public Qt3DCore::QGeometry
180 QgsPointCloud3DGeometry( Qt3DCore::QNode *parent,
const QgsPointCloud3DSymbolHandler::PointData &data,
unsigned int byteStride );
183 virtual void makeVertexBuffer(
const QgsPointCloud3DSymbolHandler::PointData &data ) = 0;
185#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
186 Qt3DRender::QAttribute *mPositionAttribute =
nullptr;
187 Qt3DRender::QAttribute *mParameterAttribute =
nullptr;
188 Qt3DRender::QAttribute *mPointSizeAttribute =
nullptr;
189 Qt3DRender::QAttribute *mColorAttribute =
nullptr;
190 Qt3DRender::QAttribute *mTriangleIndexAttribute =
nullptr;
191 Qt3DRender::QAttribute *mNormalsAttribute =
nullptr;
192 Qt3DRender::QBuffer *mVertexBuffer =
nullptr;
193 Qt3DRender::QBuffer *mTriangleBuffer =
nullptr;
194 Qt3DRender::QBuffer *mNormalsBuffer =
nullptr;
196 Qt3DCore::QAttribute *mPositionAttribute =
nullptr;
197 Qt3DCore::QAttribute *mParameterAttribute =
nullptr;
198 Qt3DCore::QAttribute *mPointSizeAttribute =
nullptr;
199 Qt3DCore::QAttribute *mColorAttribute =
nullptr;
200 Qt3DCore::QAttribute *mTriangleIndexAttribute =
nullptr;
201 Qt3DCore::QAttribute *mNormalsAttribute =
nullptr;
202 Qt3DCore::QBuffer *mVertexBuffer =
nullptr;
203 Qt3DCore::QBuffer *mTriangleBuffer =
nullptr;
204 Qt3DCore::QBuffer *mNormalsBuffer =
nullptr;
206 int mVertexCount = 0;
208 unsigned int mByteStride = 16;
211class QgsSingleColorPointCloud3DGeometry :
public QgsPointCloud3DGeometry
216 QgsSingleColorPointCloud3DGeometry( Qt3DCore::QNode *parent,
const QgsPointCloud3DSymbolHandler::PointData &data,
unsigned int byteStride );
219 void makeVertexBuffer(
const QgsPointCloud3DSymbolHandler::PointData &data )
override;
222class QgsColorRampPointCloud3DGeometry :
public QgsPointCloud3DGeometry
227 QgsColorRampPointCloud3DGeometry( Qt3DCore::QNode *parent,
const QgsPointCloud3DSymbolHandler::PointData &data,
unsigned int byteStride );
230 void makeVertexBuffer(
const QgsPointCloud3DSymbolHandler::PointData &data )
override;
233class QgsRGBPointCloud3DGeometry :
public QgsPointCloud3DGeometry
238 QgsRGBPointCloud3DGeometry( Qt3DCore::QNode *parent,
const QgsPointCloud3DSymbolHandler::PointData &data,
unsigned int byteStride );
241 void makeVertexBuffer(
const QgsPointCloud3DSymbolHandler::PointData &data )
override;
244class QgsClassificationPointCloud3DGeometry :
public QgsPointCloud3DGeometry
249 QgsClassificationPointCloud3DGeometry( Qt3DCore::QNode *parent,
const QgsPointCloud3DSymbolHandler::PointData &data,
unsigned int byteStride );
252 void makeVertexBuffer(
const QgsPointCloud3DSymbolHandler::PointData &data )
override;
Axis-aligned bounding box - in world coords.
Represents an indexed point cloud node's position in octree.