16#ifndef QGSPOINTCLOUD3DSYMBOL_P_H
17#define QGSPOINTCLOUD3DSYMBOL_P_H
23#include <QFutureWatcher>
25#include <Qt3DCore/QBuffer>
26#include <Qt3DCore/QGeometry>
33class QgsPointCloud3DSymbolHandler
36 QgsPointCloud3DSymbolHandler();
38 virtual ~QgsPointCloud3DSymbolHandler() =
default;
42 virtual bool prepare(
const QgsPointCloud3DRenderContext &context ) = 0;
43 virtual void processNode( QgsPointCloudIndex &pc,
const QgsPointCloudNodeId &n,
const QgsPointCloud3DRenderContext &context, PointData *output =
nullptr ) = 0;
44 virtual void finalize( Qt3DCore::QEntity *parent,
const QgsPointCloud3DRenderContext &context ) = 0;
46 void triangulate( QgsPointCloudIndex &pc,
const QgsPointCloudNodeId &n,
const QgsPointCloud3DRenderContext &context,
const QgsBox3D &box3D );
48 float zMinimum()
const {
return mZMin; }
49 float zMaximum()
const {
return mZMax; }
54 QgsVector3D positionsOrigin;
55 QVector<QVector3D> positions;
56 QVector<float> parameter;
57 QVector<float> pointSizes;
58 QVector<QVector3D> colors;
64 float mZMin = std::numeric_limits<float>::max();
65 float mZMax = std::numeric_limits<float>::lowest();
67 void makeEntity( Qt3DCore::QEntity *parent,
const QgsPointCloud3DRenderContext &context,
const PointData &out,
bool selected );
69 virtual Qt3DCore::QGeometry *makeGeometry( Qt3DCore::QNode *parent,
const QgsPointCloud3DSymbolHandler::PointData &data,
unsigned int byteStride ) = 0;
71 std::unique_ptr<QgsPointCloudBlock> pointCloudBlock( QgsPointCloudIndex &pc,
const QgsPointCloudNodeId &node,
const QgsPointCloudRequest &request,
const QgsPointCloud3DRenderContext &context );
78 std::vector<double> getVertices( QgsPointCloudIndex &pc,
const QgsPointCloudNodeId &n,
const QgsPointCloud3DRenderContext &context,
const QgsBox3D &box3D );
81 void calculateNormals(
const std::vector<size_t> &triangles );
91 void filterTriangles(
const std::vector<size_t> &triangleIndexes,
const QgsPointCloud3DRenderContext &context,
const QgsBox3D &box3D );
94class QgsSingleColorPointCloud3DSymbolHandler :
public QgsPointCloud3DSymbolHandler
97 QgsSingleColorPointCloud3DSymbolHandler();
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;
104 Qt3DCore::QGeometry *makeGeometry( Qt3DCore::QNode *parent,
const QgsPointCloud3DSymbolHandler::PointData &data,
unsigned int byteStride )
override;
107class QgsColorRampPointCloud3DSymbolHandler :
public QgsPointCloud3DSymbolHandler
110 QgsColorRampPointCloud3DSymbolHandler();
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;
117 Qt3DCore::QGeometry *makeGeometry( Qt3DCore::QNode *parent,
const QgsPointCloud3DSymbolHandler::PointData &data,
unsigned int byteStride )
override;
120class QgsRGBPointCloud3DSymbolHandler :
public QgsPointCloud3DSymbolHandler
123 QgsRGBPointCloud3DSymbolHandler();
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 Qt3DCore::QGeometry *makeGeometry( Qt3DCore::QNode *parent,
const QgsPointCloud3DSymbolHandler::PointData &data,
unsigned int byteStride )
override;
133class QgsClassificationPointCloud3DSymbolHandler :
public QgsPointCloud3DSymbolHandler
136 QgsClassificationPointCloud3DSymbolHandler();
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;
143 Qt3DCore::QGeometry *makeGeometry( Qt3DCore::QNode *parent,
const QgsPointCloud3DSymbolHandler::PointData &data,
unsigned int byteStride )
override;
146class QgsPointCloud3DGeometry :
public Qt3DCore::QGeometry
151 QgsPointCloud3DGeometry( Qt3DCore::QNode *parent,
const QgsPointCloud3DSymbolHandler::PointData &data,
unsigned int byteStride );
154 virtual void makeVertexBuffer(
const QgsPointCloud3DSymbolHandler::PointData &data ) = 0;
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;
166 int mVertexCount = 0;
168 unsigned int mByteStride = 16;
171class QgsSingleColorPointCloud3DGeometry :
public QgsPointCloud3DGeometry
176 QgsSingleColorPointCloud3DGeometry( Qt3DCore::QNode *parent,
const QgsPointCloud3DSymbolHandler::PointData &data,
unsigned int byteStride );
179 void makeVertexBuffer(
const QgsPointCloud3DSymbolHandler::PointData &data )
override;
182class QgsColorRampPointCloud3DGeometry :
public QgsPointCloud3DGeometry
187 QgsColorRampPointCloud3DGeometry( Qt3DCore::QNode *parent,
const QgsPointCloud3DSymbolHandler::PointData &data,
unsigned int byteStride );
190 void makeVertexBuffer(
const QgsPointCloud3DSymbolHandler::PointData &data )
override;
193class QgsRGBPointCloud3DGeometry :
public QgsPointCloud3DGeometry
198 QgsRGBPointCloud3DGeometry( Qt3DCore::QNode *parent,
const QgsPointCloud3DSymbolHandler::PointData &data,
unsigned int byteStride );
201 void makeVertexBuffer(
const QgsPointCloud3DSymbolHandler::PointData &data )
override;
204class QgsClassificationPointCloud3DGeometry :
public QgsPointCloud3DGeometry
209 QgsClassificationPointCloud3DGeometry( Qt3DCore::QNode *parent,
const QgsPointCloud3DSymbolHandler::PointData &data,
unsigned int byteStride );
212 void makeVertexBuffer(
const QgsPointCloud3DSymbolHandler::PointData &data )
override;
Axis-aligned bounding box - in world coords.
Represents an indexed point cloud node's position in octree.