QGIS API Documentation  3.2.0-Bonn (bc43194)
qgstessellatedpolygongeometry.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgstessellatedpolygongeometry.cpp
3  --------------------------------------
4  Date : July 2017
5  Copyright : (C) 2017 by Martin Dobias
6  Email : wonder dot sk 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 
17 
18 #include <Qt3DRender/QAttribute>
19 #include <Qt3DRender/QBuffer>
20 #include <Qt3DRender/QBufferDataGenerator>
21 
22 #include "qgstessellator.h"
23 
24 #include "qgspoint.h"
25 #include "qgspolygon.h"
26 
27 
29  : Qt3DRender::QGeometry( parent )
30 {
31  mVertexBuffer = new Qt3DRender::QBuffer( Qt3DRender::QBuffer::VertexBuffer, this );
32 
33  QgsTessellator tmpTess( 0, 0, mWithNormals );
34  const int stride = tmpTess.stride();
35 
36  mPositionAttribute = new Qt3DRender::QAttribute( this );
37  mPositionAttribute->setName( Qt3DRender::QAttribute::defaultPositionAttributeName() );
38  mPositionAttribute->setVertexBaseType( Qt3DRender::QAttribute::Float );
39  mPositionAttribute->setVertexSize( 3 );
40  mPositionAttribute->setAttributeType( Qt3DRender::QAttribute::VertexAttribute );
41  mPositionAttribute->setBuffer( mVertexBuffer );
42  mPositionAttribute->setByteStride( stride );
43  addAttribute( mPositionAttribute );
44 
45  if ( mWithNormals )
46  {
47  mNormalAttribute = new Qt3DRender::QAttribute( this );
48  mNormalAttribute->setName( Qt3DRender::QAttribute::defaultNormalAttributeName() );
49  mNormalAttribute->setVertexBaseType( Qt3DRender::QAttribute::Float );
50  mNormalAttribute->setVertexSize( 3 );
51  mNormalAttribute->setAttributeType( Qt3DRender::QAttribute::VertexAttribute );
52  mNormalAttribute->setBuffer( mVertexBuffer );
53  mNormalAttribute->setByteStride( stride );
54  mNormalAttribute->setByteOffset( 3 * sizeof( float ) );
55  addAttribute( mNormalAttribute );
56  }
57 }
58 
59 void QgsTessellatedPolygonGeometry::setPolygons( const QList<QgsPolygon *> &polygons, const QgsPointXY &origin, float extrusionHeight, const QList<float> &extrusionHeightPerPolygon )
60 {
61  QgsTessellator tessellator( origin.x(), origin.y(), mWithNormals, mInvertNormals, mAddBackFaces );
62  for ( int i = 0; i < polygons.count(); ++i )
63  {
64  QgsPolygon *polygon = polygons.at( i );
65  float extr = extrusionHeightPerPolygon.isEmpty() ? extrusionHeight : extrusionHeightPerPolygon.at( i );
66  tessellator.addPolygon( *polygon, extr );
67  }
68 
69  qDeleteAll( polygons );
70 
71  QByteArray data( ( const char * )tessellator.data().constData(), tessellator.data().count() * sizeof( float ) );
72  int nVerts = data.count() / tessellator.stride();
73 
74  mVertexBuffer->setData( data );
75  mPositionAttribute->setCount( nVerts );
76  if ( mNormalAttribute )
77  mNormalAttribute->setCount( nVerts );
78 }
double y
Definition: qgspointxy.h:48
A class to represent a 2D point.
Definition: qgspointxy.h:43
int stride() const
Returns size of one vertex entry in bytes.
3 Class that takes care of tessellation of polygons into triangles.
void setPolygons(const QList< QgsPolygon *> &polygons, const QgsPointXY &origin, float extrusionHeight, const QList< float > &extrusionHeightPerPolygon=QList< float >())
Initializes vertex buffer from given polygons. Takes ownership of passed polygon geometries.
double x
Definition: qgspointxy.h:47
Polygon geometry type.
Definition: qgspolygon.h:31
QgsTessellatedPolygonGeometry(QNode *parent=nullptr)
Constructor.
bool isEmpty() const override
Returns true if the geometry is empty.