15#include <Qt3DRender/QParameter> 
   16#include <Qt3DRender/QShaderProgram> 
   17#include <Qt3DRender/QRenderPass> 
   18#include <Qt3DRender/QTechnique> 
   19#include <Qt3DRender/QGraphicsApiFilter> 
   20#include <Qt3DRender/QEffect> 
   21#include <Qt3DRender/QBlendEquationArguments> 
   22#include <Qt3DRender/QBlendEquation> 
   23#include <Qt3DRender/QNoDepthMask> 
   27#include "moc_qgspoint3dbillboardmaterial.cpp" 
   34  : mSize( new 
Qt3DRender::QParameter( 
"BB_SIZE", QSizeF( 100, 100 ), this ) )
 
   35  , mViewportSize( new 
Qt3DRender::QParameter( 
"WIN_SCALE", QSizeF( 800, 600 ), this ) )
 
   37  addParameter( mSize );
 
   38  addParameter( mViewportSize );
 
   41  mTexture2D = 
new Qt3DRender::QParameter( 
"tex0", QVariant(), 
this );
 
   42  addParameter( mTexture2D );
 
   45  Qt3DRender::QBlendEquationArguments *blendState = 
new Qt3DRender::QBlendEquationArguments;
 
   46  blendState->setSourceRgb( Qt3DRender::QBlendEquationArguments::SourceAlpha );
 
   47  blendState->setDestinationRgb( Qt3DRender::QBlendEquationArguments::OneMinusSourceAlpha );
 
   49  Qt3DRender::QBlendEquation *blendEquation = 
new Qt3DRender::QBlendEquation;
 
   50  blendEquation->setBlendFunction( Qt3DRender::QBlendEquation::Add );
 
   53  Qt3DRender::QShaderProgram *shaderProgram = 
new Qt3DRender::QShaderProgram( 
this );
 
   54  shaderProgram->setVertexShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( QStringLiteral( 
"qrc:/shaders/billboards.vert" ) ) ) );
 
   55  shaderProgram->setFragmentShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( QStringLiteral( 
"qrc:/shaders/billboards.frag" ) ) ) );
 
   56  shaderProgram->setGeometryShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( QStringLiteral( 
"qrc:/shaders/billboards.geom" ) ) ) );
 
   59  Qt3DRender::QRenderPass *renderPass = 
new Qt3DRender::QRenderPass( 
this );
 
   60  renderPass->setShaderProgram( shaderProgram );
 
   61  renderPass->addRenderState( blendState );
 
   62  renderPass->addRenderState( blendEquation );
 
   65  Qt3DRender::QFilterKey *filterKey = 
new Qt3DRender::QFilterKey;
 
   66  filterKey->setName( QStringLiteral( 
"renderingStyle" ) );
 
   67  filterKey->setValue( 
"forward" );
 
   70  Qt3DRender::QTechnique *technique = 
new Qt3DRender::QTechnique;
 
   71  technique->addRenderPass( renderPass );
 
   72  technique->addFilterKey( filterKey );
 
   73  technique->graphicsApiFilter()->setApi( Qt3DRender::QGraphicsApiFilter::OpenGL );
 
   74  technique->graphicsApiFilter()->setProfile( Qt3DRender::QGraphicsApiFilter::CoreProfile );
 
   75  technique->graphicsApiFilter()->setMajorVersion( 3 );
 
   76  technique->graphicsApiFilter()->setMinorVersion( 1 );
 
   79  Qt3DRender::QEffect *effect = 
new Qt3DRender::QEffect( 
this );
 
   80  effect->addTechnique( technique );
 
 
   89  mSize->setValue( 
size );
 
 
   94  return mSize->value().value<QSizeF>();
 
 
   99  mViewportSize->setValue( 
size );
 
 
  104  return mViewportSize->value().value<QSizeF>();
 
 
  107void QgsPoint3DBillboardMaterial::setTexture2DFromImage( QImage image, 
double size )
 
  111  QgsTerrainTextureImage *billboardTextureImage = 
new QgsTerrainTextureImage( image, randomExtent, QStringLiteral( 
"billboard material." ) );
 
  113  setTexture2DFromTextureImage( billboardTextureImage );
 
  134  const double strokeRatio = 0.5;
 
  138  const double minimumExtraSize = 40;
 
  139  const double extraPixel = minimumExtraSize > pixelSize * strokeRatio ? minimumExtraSize : pixelSize * strokeRatio;
 
  140  const int pixelWithExtra = std::ceil( pixelSize + extraPixel );
 
  142  const QImage symbolImage = symbolPixmap.toImage();
 
  143  const QImage flippedSymbolImage = symbolImage.mirrored();
 
  144  setTexture2DFromImage( flippedSymbolImage, pixelWithExtra );
 
 
  147void QgsPoint3DBillboardMaterial::setTexture2DFromTextureImage( Qt3DRender::QAbstractTextureImage *textureImage )
 
  150  Qt3DRender::QTexture2D *texture2D = 
new Qt3DRender::QTexture2D( 
this );
 
  151  texture2D->setGenerateMipMaps( 
false );
 
  152  texture2D->setMagnificationFilter( Qt3DRender::QTexture2D::Linear );
 
  153  texture2D->setMinificationFilter( Qt3DRender::QTexture2D::Linear );
 
  156  texture2D->addTextureImage( textureImage );
 
  158  mTexture2D->setValue( QVariant::fromValue( texture2D ) );
 
@ Antialiasing
Use antialiasing while drawing.
 
@ HighQualityImageTransforms
Enable high quality image transformations, which results in better appearance of scaled or rotated ra...
 
QColor selectionColor() const
Returns color used for selected features.
 
double outputDpi() const
Returns DPI used for conversion between real world units (e.g.
 
A marker symbol type, for rendering Point and MultiPoint geometries.
 
double size() const
Returns the estimated size for the whole symbol, which is the maximum size of all marker symbol layer...
 
Qgis::RenderUnit sizeUnit() const
Returns the size units for the whole symbol (including all symbol layers).
 
void useDefaultSymbol(const Qgs3DRenderContext &context, bool selected=false)
Set default symbol for the texture with context and selected parameter for rendering.
 
QSizeF windowSize() const
Returns the size of the view port.
 
~QgsPoint3DBillboardMaterial() override
 
void setTexture2DFromSymbol(QgsMarkerSymbol *markerSymbol, const Qgs3DRenderContext &context, bool selected=false)
Set markerSymbol for the texture with context and selected parameter for rendering.
 
QgsPoint3DBillboardMaterial()
 
QSizeF size() const
Returns the billboard size.
 
void setViewportSize(const QSizeF size)
Set the size of the view port.
 
void setSize(const QSizeF size)
Set the billboard size.
 
A rectangle specified with double values.
 
Contains information about the context of a rendering operation.
 
void setScaleFactor(double factor)
Sets the scaling factor for the render to convert painter units to physical sizes.
 
double convertToPainterUnits(double size, Qgis::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale(), Qgis::RenderSubcomponentProperty property=Qgis::RenderSubcomponentProperty::Generic) const
Converts a size from the specified units to painter units (pixels).
 
void setFlag(Qgis::RenderContextFlag flag, bool on=true)
Enable or disable a particular flag (other flags are not affected)
 
void setSelectionColor(const QColor &color)
Sets the color to use when rendering selected features.
 
static QPixmap symbolPreviewPixmap(const QgsSymbol *symbol, QSize size, int padding=0, QgsRenderContext *customContext=nullptr, bool selected=false, const QgsExpressionContext *expressionContext=nullptr, const QgsLegendPatchShape *shape=nullptr, const QgsScreenProperties &screen=QgsScreenProperties())
Returns a pixmap preview for a color ramp.
 
static QgsSymbol * defaultSymbol(Qgis::GeometryType geomType)
Returns a new default symbol for the specified geometry type.