18 #include <Qt3DRender/QAttribute> 
   19 #include <Qt3DRender/QBuffer> 
   20 #include <Qt3DRender/QGeometry> 
   29 QgsLineVertexData::QgsLineVertexData()
 
   32   vertices << QVector3D();
 
   37   altClamping = clamping;
 
   43 QByteArray QgsLineVertexData::createVertexBuffer()
 
   45   QByteArray vertexBufferData;
 
   46   vertexBufferData.resize( vertices.size() * 3 * 
sizeof( 
float ) );
 
   47   float *rawVertexArray = 
reinterpret_cast<float *
>( vertexBufferData.data() );
 
   49   for ( 
const auto &v : std::as_const( vertices ) )
 
   51     rawVertexArray[idx++] = v.x();
 
   52     rawVertexArray[idx++] = v.y();
 
   53     rawVertexArray[idx++] = v.z();
 
   55   return vertexBufferData;
 
   58 QByteArray QgsLineVertexData::createIndexBuffer()
 
   60   QByteArray indexBufferData;
 
   61   indexBufferData.resize( indexes.size() * 
sizeof( 
int ) );
 
   62   unsigned int *rawIndexArray = 
reinterpret_cast<unsigned int *
>( indexBufferData.data() );
 
   64   for ( 
unsigned int indexVal : std::as_const( indexes ) )
 
   66     rawIndexArray[idx++] = indexVal;
 
   68   return indexBufferData;
 
   71 Qt3DRender::QGeometry *QgsLineVertexData::createGeometry( Qt3DCore::QNode *parent )
 
   73   Qt3DRender::QBuffer *vertexBuffer = 
new Qt3DRender::QBuffer( parent );
 
   74   vertexBuffer->setData( createVertexBuffer() );
 
   76   Qt3DRender::QBuffer *indexBuffer = 
new Qt3DRender::QBuffer( parent );
 
   77   indexBuffer->setData( createIndexBuffer() );
 
   79   QgsDebugMsgLevel( QString( 
"vertex buffer %1 MB  index buffer %2 MB " ).arg( vertexBuffer->data().count() / 1024. / 1024. ).arg( indexBuffer->data().count() / 1024. / 1024. ), 2 );
 
   81   Qt3DRender::QAttribute *positionAttribute = 
new Qt3DRender::QAttribute( parent );
 
   82   positionAttribute->setAttributeType( Qt3DRender::QAttribute::VertexAttribute );
 
   83   positionAttribute->setBuffer( vertexBuffer );
 
   84   positionAttribute->setVertexBaseType( Qt3DRender::QAttribute::Float );
 
   85   positionAttribute->setVertexSize( 3 );
 
   86   positionAttribute->setByteStride( 3 * 
sizeof( 
float ) );
 
   87   positionAttribute->setByteOffset( 0 );
 
   88   positionAttribute->setName( Qt3DRender::QAttribute::defaultPositionAttributeName() );
 
   90   Qt3DRender::QAttribute *indexAttribute = 
new Qt3DRender::QAttribute( parent );
 
   91   indexAttribute->setAttributeType( Qt3DRender::QAttribute::IndexAttribute );
 
   92   indexAttribute->setBuffer( indexBuffer );
 
   93   indexAttribute->setByteOffset( 0 );
 
   94   indexAttribute->setByteStride( 
sizeof( uint ) );
 
   95   indexAttribute->setVertexBaseType( Qt3DRender::QAttribute::UnsignedInt );
 
   97   Qt3DRender::QGeometry *geom = 
new Qt3DRender::QGeometry;
 
   98   geom->addAttribute( positionAttribute );
 
   99   geom->addAttribute( indexAttribute );
 
  104 void QgsLineVertexData::addLineString( 
const QgsLineString &lineString, 
float extraHeightOffset )
 
  107     indexes << vertices.count();  
 
  113   for ( 
int i = 0; i < lineString.
vertexCount(); ++i )
 
  116     float z = 
Qgs3DUtils::clampAltitude( p, altClamping, altBinding, baseHeight + extraHeightOffset, centroid, *mapSettings );
 
  118     vertices << QVector3D( p.
x() - mapSettings->origin().x(), z, -( p.
y() - mapSettings->origin().y() ) );
 
  119     indexes << vertices.count() - 1;
 
  123     indexes << vertices.count() - 1;  
 
  128 void QgsLineVertexData::addVerticalLines( 
const QgsLineString &lineString, 
float verticalLength, 
float extraHeightOffset )
 
  134   for ( 
int i = 0; i < lineString.
vertexCount(); ++i )
 
  137     float z = 
Qgs3DUtils::clampAltitude( p, altClamping, altBinding, baseHeight + extraHeightOffset, centroid, *mapSettings );
 
  138     float z2 = z + verticalLength;
 
  141       indexes << vertices.count();  
 
  143     vertices << QVector3D( p.
x() - mapSettings->origin().x(), z, -( p.
y() - mapSettings->origin().y() ) );
 
  144     indexes << vertices.count() - 1;
 
  145     vertices << QVector3D( p.
x() - mapSettings->origin().x(), z2, -( p.
y() - mapSettings->origin().y() ) );
 
  146     indexes << vertices.count() - 1;
 
  149       indexes << vertices.count() - 1;  
 
AltitudeClamping
how to handle altitude of vector features
AltitudeBinding
how to handle clamping of vertices of individual features
@ AltBindCentroid
Clamp just centroid of feature.
static float clampAltitude(const QgsPoint &p, Qgs3DTypes::AltitudeClamping altClamp, Qgs3DTypes::AltitudeBinding altBind, float height, const QgsPoint ¢roid, const Qgs3DMapSettings &map)
Clamps altitude of a vertex according to the settings, returns Z value.
int vertexCount(int part=0, int ring=0) const override
Returns the number of vertices of which this geometry is built.
Line string geometry type, with support for z-dimension and m-values.
QgsPoint pointN(int i) const
Returns the specified point from inside the line string.
QgsPoint centroid() const override
Returns the centroid of the geometry.
Point geometry type, with support for z-dimension and m-values.
#define QgsDebugMsgLevel(str, level)