Skip to content

Commit 76f4f69

Browse files
committed
Base class for 3D renderers + a bit of code shuffling
1 parent 3d9d455 commit 76f4f69

14 files changed

+532
-450
lines changed

src/3d/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22
# sources
33

44
SET(QGIS_3D_SRCS
5+
abstract3drenderer.cpp
56
cameracontroller.cpp
67
lineentity.cpp
78
map3d.cpp
9+
phongmaterialsettings.cpp
810
pointentity.cpp
911
polygonentity.cpp
1012
polygongeometry.cpp
@@ -60,9 +62,11 @@ QT5_ADD_RESOURCES(QGIS_3D_RCC_SRCS shaders.qrc)
6062

6163
SET(QGIS_3D_HDRS
6264
aabb.h
65+
abstract3drenderer.h
6366
cameracontroller.h
6467
lineentity.h
6568
map3d.h
69+
phongmaterialsettings.h
6670
pointentity.h
6771
polygonentity.h
6872
polygongeometry.h

src/3d/abstract3drenderer.cpp

Lines changed: 213 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,213 @@
1+
#include "abstract3drenderer.h"
2+
3+
#include "lineentity.h"
4+
#include "pointentity.h"
5+
#include "polygonentity.h"
6+
7+
#include "qgsvectorlayer.h"
8+
#include "qgsxmlutils.h"
9+
10+
11+
// ---------------
12+
13+
PolygonRenderer::PolygonRenderer()
14+
: altClamping( AltClampRelative )
15+
, altBinding( AltBindCentroid )
16+
, height( 0 )
17+
, extrusionHeight( 0 )
18+
{
19+
}
20+
21+
void PolygonRenderer::setLayer( QgsVectorLayer *layer )
22+
{
23+
layerRef = QgsMapLayerRef( layer );
24+
}
25+
26+
QgsVectorLayer *PolygonRenderer::layer() const
27+
{
28+
return qobject_cast<QgsVectorLayer *>( layerRef.layer );
29+
}
30+
31+
Abstract3DRenderer *PolygonRenderer::clone() const
32+
{
33+
return new PolygonRenderer( *this );
34+
}
35+
36+
Qt3DCore::QEntity *PolygonRenderer::createEntity( const Map3D &map ) const
37+
{
38+
return new PolygonEntity( map, *this );
39+
}
40+
41+
void PolygonRenderer::writeXml( QDomElement &elem ) const
42+
{
43+
QDomDocument doc = elem.ownerDocument();
44+
45+
QDomElement elemDataProperties = doc.createElement( "data" );
46+
elemDataProperties.setAttribute( "layer", layerRef.layerId );
47+
elemDataProperties.setAttribute( "alt-clamping", Utils::altClampingToString( altClamping ) );
48+
elemDataProperties.setAttribute( "alt-binding", Utils::altBindingToString( altBinding ) );
49+
elemDataProperties.setAttribute( "height", height );
50+
elemDataProperties.setAttribute( "extrusion-height", extrusionHeight );
51+
elem.appendChild( elemDataProperties );
52+
53+
QDomElement elemMaterial = doc.createElement( "material" );
54+
material.writeXml( elemMaterial );
55+
elem.appendChild( elemMaterial );
56+
}
57+
58+
void PolygonRenderer::readXml( const QDomElement &elem )
59+
{
60+
QDomElement elemDataProperties = elem.firstChildElement( "data" );
61+
layerRef = QgsMapLayerRef( elemDataProperties.attribute( "layer" ) );
62+
altClamping = Utils::altClampingFromString( elemDataProperties.attribute( "alt-clamping" ) );
63+
altBinding = Utils::altBindingFromString( elemDataProperties.attribute( "alt-binding" ) );
64+
height = elemDataProperties.attribute( "height" ).toFloat();
65+
extrusionHeight = elemDataProperties.attribute( "extrusion-height" ).toFloat();
66+
67+
QDomElement elemMaterial = elem.firstChildElement( "material" );
68+
material.readXml( elemMaterial );
69+
}
70+
71+
void PolygonRenderer::resolveReferences( const QgsProject &project )
72+
{
73+
layerRef.setLayer( project.mapLayer( layerRef.layerId ) );
74+
}
75+
76+
// ---------------
77+
78+
PointRenderer::PointRenderer()
79+
: height( 0 )
80+
{
81+
}
82+
83+
void PointRenderer::setLayer( QgsVectorLayer *layer )
84+
{
85+
layerRef = QgsMapLayerRef( layer );
86+
}
87+
88+
QgsVectorLayer *PointRenderer::layer() const
89+
{
90+
return qobject_cast<QgsVectorLayer *>( layerRef.layer );
91+
}
92+
93+
Abstract3DRenderer *PointRenderer::clone() const
94+
{
95+
return new PointRenderer( *this );
96+
}
97+
98+
Qt3DCore::QEntity *PointRenderer::createEntity( const Map3D &map ) const
99+
{
100+
return new PointEntity( map, *this );
101+
}
102+
103+
void PointRenderer::writeXml( QDomElement &elem ) const
104+
{
105+
QDomDocument doc = elem.ownerDocument();
106+
107+
QDomElement elemDataProperties = doc.createElement( "data" );
108+
elemDataProperties.setAttribute( "layer", layerRef.layerId );
109+
elemDataProperties.setAttribute( "height", height );
110+
elem.appendChild( elemDataProperties );
111+
112+
QDomElement elemMaterial = doc.createElement( "material" );
113+
material.writeXml( elemMaterial );
114+
elem.appendChild( elemMaterial );
115+
116+
QDomElement elemShapeProperties = doc.createElement( "shape-properties" );
117+
elemShapeProperties.appendChild( QgsXmlUtils::writeVariant( shapeProperties, doc ) );
118+
elem.appendChild( elemShapeProperties );
119+
120+
QDomElement elemTransform = doc.createElement( "transform" );
121+
elemTransform.setAttribute( "matrix", Utils::matrix4x4toString( transform ) );
122+
elem.appendChild( elemTransform );
123+
}
124+
125+
void PointRenderer::readXml( const QDomElement &elem )
126+
{
127+
QDomElement elemDataProperties = elem.firstChildElement( "data" );
128+
layerRef = QgsMapLayerRef( elemDataProperties.attribute( "layer" ) );
129+
height = elemDataProperties.attribute( "height" ).toFloat();
130+
131+
QDomElement elemMaterial = elem.firstChildElement( "material" );
132+
material.readXml( elemMaterial );
133+
134+
QDomElement elemShapeProperties = elem.firstChildElement( "shape-properties" );
135+
shapeProperties = QgsXmlUtils::readVariant( elemShapeProperties.firstChildElement() ).toMap();
136+
137+
QDomElement elemTransform = elem.firstChildElement( "transform" );
138+
transform = Utils::stringToMatrix4x4( elemTransform.attribute( "matrix" ) );
139+
}
140+
141+
void PointRenderer::resolveReferences( const QgsProject &project )
142+
{
143+
layerRef.setLayer( project.mapLayer( layerRef.layerId ) );
144+
}
145+
146+
// ---------------
147+
148+
LineRenderer::LineRenderer()
149+
: altClamping( AltClampRelative )
150+
, altBinding( AltBindCentroid )
151+
, height( 0 )
152+
, extrusionHeight( 0 )
153+
, distance( 1 )
154+
{
155+
156+
}
157+
158+
void LineRenderer::setLayer( QgsVectorLayer *layer )
159+
{
160+
layerRef = QgsMapLayerRef( layer );
161+
}
162+
163+
QgsVectorLayer *LineRenderer::layer() const
164+
{
165+
return qobject_cast<QgsVectorLayer *>( layerRef.layer );
166+
}
167+
168+
Abstract3DRenderer *LineRenderer::clone() const
169+
{
170+
return new LineRenderer( *this );
171+
}
172+
173+
Qt3DCore::QEntity *LineRenderer::createEntity( const Map3D &map ) const
174+
{
175+
return new LineEntity( map, *this );
176+
}
177+
178+
void LineRenderer::writeXml( QDomElement &elem ) const
179+
{
180+
QDomDocument doc = elem.ownerDocument();
181+
182+
QDomElement elemDataProperties = doc.createElement( "data" );
183+
elemDataProperties.setAttribute( "layer", layerRef.layerId );
184+
elemDataProperties.setAttribute( "alt-clamping", Utils::altClampingToString( altClamping ) );
185+
elemDataProperties.setAttribute( "alt-binding", Utils::altBindingToString( altBinding ) );
186+
elemDataProperties.setAttribute( "height", height );
187+
elemDataProperties.setAttribute( "extrusion-height", extrusionHeight );
188+
elemDataProperties.setAttribute( "distance", distance );
189+
elem.appendChild( elemDataProperties );
190+
191+
QDomElement elemMaterial = doc.createElement( "material" );
192+
material.writeXml( elemMaterial );
193+
elem.appendChild( elemMaterial );
194+
}
195+
196+
void LineRenderer::readXml( const QDomElement &elem )
197+
{
198+
QDomElement elemDataProperties = elem.firstChildElement( "data" );
199+
layerRef = QgsMapLayerRef( elemDataProperties.attribute( "layer" ) );
200+
altClamping = Utils::altClampingFromString( elemDataProperties.attribute( "alt-clamping" ) );
201+
altBinding = Utils::altBindingFromString( elemDataProperties.attribute( "alt-binding" ) );
202+
height = elemDataProperties.attribute( "height" ).toFloat();
203+
extrusionHeight = elemDataProperties.attribute( "extrusion-height" ).toFloat();
204+
distance = elemDataProperties.attribute( "distance" ).toFloat();
205+
206+
QDomElement elemMaterial = elem.firstChildElement( "material" );
207+
material.readXml( elemMaterial );
208+
}
209+
210+
void LineRenderer::resolveReferences( const QgsProject &project )
211+
{
212+
layerRef.setLayer( project.mapLayer( layerRef.layerId ) );
213+
}

src/3d/abstract3drenderer.h

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
#ifndef ABSTRACT3DRENDERER_H
2+
#define ABSTRACT3DRENDERER_H
3+
4+
#include "qgis_3d.h"
5+
6+
#include "phongmaterialsettings.h"
7+
#include "utils.h"
8+
9+
#include "qgsmaplayerref.h"
10+
11+
#include <QObject>
12+
13+
class QgsVectorLayer;
14+
15+
class Map3D;
16+
17+
18+
namespace Qt3DCore
19+
{
20+
class QEntity;
21+
}
22+
23+
class Abstract3DRenderer //: public QObject
24+
{
25+
//Q_OBJECT
26+
public:
27+
virtual ~Abstract3DRenderer() {}
28+
29+
virtual QString type() const = 0;
30+
virtual Abstract3DRenderer *clone() const = 0;
31+
virtual Qt3DCore::QEntity *createEntity( const Map3D &map ) const = 0;
32+
33+
virtual void writeXml( QDomElement &elem ) const = 0;
34+
virtual void readXml( const QDomElement &elem ) = 0;
35+
virtual void resolveReferences( const QgsProject &project ) { Q_UNUSED( project ); }
36+
};
37+
38+
39+
class _3D_EXPORT PolygonRenderer : public Abstract3DRenderer
40+
{
41+
public:
42+
PolygonRenderer();
43+
44+
void setLayer( QgsVectorLayer *layer );
45+
QgsVectorLayer *layer() const;
46+
47+
QString type() const override { return "polygon"; }
48+
Abstract3DRenderer *clone() const override;
49+
Qt3DCore::QEntity *createEntity( const Map3D &map ) const override;
50+
51+
void writeXml( QDomElement &elem ) const override;
52+
void readXml( const QDomElement &elem ) override;
53+
void resolveReferences( const QgsProject &project ) override;
54+
55+
AltitudeClamping altClamping; //! how to handle altitude of vector features
56+
AltitudeBinding altBinding; //! how to handle clamping of vertices of individual features
57+
58+
float height; //!< Base height of polygons
59+
float extrusionHeight; //!< How much to extrude (0 means no walls)
60+
PhongMaterialSettings material; //!< Defines appearance of objects
61+
62+
private:
63+
QgsMapLayerRef layerRef; //!< Layer used to extract polygons from
64+
};
65+
66+
class _3D_EXPORT PointRenderer : public Abstract3DRenderer
67+
{
68+
public:
69+
PointRenderer();
70+
71+
void setLayer( QgsVectorLayer *layer );
72+
QgsVectorLayer *layer() const;
73+
74+
QString type() const override { return "point"; }
75+
Abstract3DRenderer *clone() const override;
76+
Qt3DCore::QEntity *createEntity( const Map3D &map ) const override;
77+
78+
void writeXml( QDomElement &elem ) const override;
79+
void readXml( const QDomElement &elem ) override;
80+
void resolveReferences( const QgsProject &project ) override;
81+
82+
float height;
83+
PhongMaterialSettings material; //!< Defines appearance of objects
84+
QVariantMap shapeProperties; //!< What kind of shape to use and what
85+
QMatrix4x4 transform; //!< Transform of individual instanced models
86+
87+
private:
88+
QgsMapLayerRef layerRef; //!< Layer used to extract points from
89+
};
90+
91+
class _3D_EXPORT LineRenderer : public Abstract3DRenderer
92+
{
93+
public:
94+
LineRenderer();
95+
96+
void setLayer( QgsVectorLayer *layer );
97+
QgsVectorLayer *layer() const;
98+
99+
QString type() const override { return "line"; }
100+
Abstract3DRenderer *clone() const override;
101+
Qt3DCore::QEntity *createEntity( const Map3D &map ) const override;
102+
103+
void writeXml( QDomElement &elem ) const override;
104+
void readXml( const QDomElement &elem ) override;
105+
void resolveReferences( const QgsProject &project ) override;
106+
107+
AltitudeClamping altClamping; //! how to handle altitude of vector features
108+
AltitudeBinding altBinding; //! how to handle clamping of vertices of individual features
109+
110+
float height; //!< Base height of polygons
111+
float extrusionHeight; //!< How much to extrude (0 means no walls)
112+
PhongMaterialSettings material; //!< Defines appearance of objects
113+
114+
float distance; //!< Distance of buffer of lines
115+
116+
private:
117+
QgsMapLayerRef layerRef; //!< Layer used to extract points from
118+
};
119+
120+
#endif // ABSTRACT3DRENDERER_H

src/3d/lineentity.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "lineentity.h"
22

3+
#include "abstract3drenderer.h"
34
#include "polygongeometry.h"
45
#include "map3d.h"
56
#include "terraingenerator.h"

0 commit comments

Comments
 (0)