QGIS API Documentation 4.3.0-Master (0cfde48c85b)
Loading...
Searching...
No Matches
qgslinematerial_p.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgslinematerial_p.cpp
3 --------------------------------------
4 Date : Apr 2019
5 Copyright : (C) 2019 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
16#include "qgslinematerial_p.h"
17
18#include "qgs3dutils.h"
19
20#include <QColor>
21#include <QSizeF>
22#include <QString>
23#include <QUrl>
24#include <QVector3D>
25#include <Qt3DRender/QBlendEquation>
26#include <Qt3DRender/QBlendEquationArguments>
27#include <Qt3DRender/QCamera>
28#include <Qt3DRender/QCullFace>
29#include <Qt3DRender/QDepthTest>
30#include <Qt3DRender/QEffect>
31#include <Qt3DRender/QGraphicsApiFilter>
32#include <Qt3DRender/QParameter>
33#include <Qt3DRender/QRenderPass>
34#include <Qt3DRender/QTechnique>
35
36#include "moc_qgslinematerial_p.cpp"
37
38using namespace Qt::StringLiterals;
39
41
42
43QgsLineMaterial::QgsLineMaterial( LinePart part )
44 : mPart( part )
45 , mParameterThickness( new Qt3DRender::QParameter( "THICKNESS", 10, this ) )
46 , mParameterLineColor( new Qt3DRender::QParameter( "lineColor", QVariant(), this ) )
47 , mParameterUseVertexColors( new Qt3DRender::QParameter( "useVertexColors", false, this ) )
48 , mParameterWindowScale( new Qt3DRender::QParameter( "WIN_SCALE", QSizeF(), this ) )
49{
50 addParameter( mParameterThickness );
51 addParameter( mParameterLineColor );
52 addParameter( mParameterUseVertexColors );
53 addParameter( mParameterWindowScale );
54
55 if ( mPart == LinePart::Join )
56 {
57 mParameterMiterLimit = new Qt3DRender::QParameter( "MITER_LIMIT", -1, this ); // previous implementation had this value and this always does a bevel, worth discussing/addressing in the future
58 addParameter( mParameterMiterLimit );
59 }
60
61 setLineColor( QColor( 0, 255, 0 ) );
62
63 Qt3DRender::QShaderProgram *shaderProgram = new Qt3DRender::QShaderProgram( this );
64 shaderProgram->setVertexShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( mPart == LinePart::Join ? u"qrc:/shaders/line_joins.vert"_s : u"qrc:/shaders/line_segments.vert"_s ) ) );
65 shaderProgram->setFragmentShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( u"qrc:/shaders/lines.frag"_s ) ) );
66
67 Qt3DRender::QRenderPass *renderPass = new Qt3DRender::QRenderPass( this );
68 renderPass->setShaderProgram( shaderProgram );
69
70 // without this filter the default forward renderer would not render this
71 Qt3DRender::QFilterKey *filterKey = new Qt3DRender::QFilterKey;
72 filterKey->setName( u"renderingStyle"_s );
73 filterKey->setValue( "forward" );
74
75 Qt3DRender::QTechnique *technique = new Qt3DRender::QTechnique;
76 technique->addFilterKey( filterKey );
77 technique->addRenderPass( renderPass );
78 technique->graphicsApiFilter()->setApi( Qt3DRender::QGraphicsApiFilter::OpenGL );
79 technique->graphicsApiFilter()->setProfile( Qt3DRender::QGraphicsApiFilter::CoreProfile );
80 technique->graphicsApiFilter()->setMajorVersion( 3 );
81 technique->graphicsApiFilter()->setMinorVersion( 3 );
82 Qt3DRender::QEffect *effect = new Qt3DRender::QEffect( this );
83 effect->addTechnique( technique );
84
85 setEffect( effect );
86}
87
88void QgsLineMaterial::copyLineParametersTo( QgsLineMaterial *other ) const
89{
90 other->mParameterThickness->setValue( mParameterThickness->value() );
91 other->mParameterLineColor->setValue( mParameterLineColor->value() );
92 other->mParameterUseVertexColors->setValue( mParameterUseVertexColors->value() );
93 other->mParameterWindowScale->setValue( mParameterWindowScale->value() );
94}
95
96void QgsLineMaterial::setLineColor( const QColor &color )
97{
98 mParameterLineColor->setValue( Qgs3DUtils::srgbToLinear( color ) );
99}
100
101void QgsLineMaterial::setUseVertexColors( bool enabled )
102{
103 mParameterUseVertexColors->setValue( enabled );
104}
105
106void QgsLineMaterial::setLineWidth( float width )
107{
108 mParameterThickness->setValue( width );
109}
110
111void QgsLineMaterial::setViewportSize( const QSizeF &viewportSize )
112{
113 mParameterWindowScale->setValue( viewportSize );
114}
115
static QColor srgbToLinear(const QColor &color)
Converts a SRGB color to a linear color.