Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[FEATURE][3D] Billboard Rendering for Points (#31308)
* Add button to change billboard symbol. * Add shaders for billboards. * Add billboard material class. * Add sample billboard image. * Add dummy handler for billboard. * Add billboard geometry class. * First working version of 3D point as billboard. * Make selected feature bigger. * Use default symbol preview as billboard. * Update billboard when changes the viewport size. * Use QgsTerrainTextureImage for adding image to texture. * Show better quality of billboard default symbol. * Promote QgsSymbolButton not working. * Add QgsSymbolButton properly. * Add seTexture2DFromSymbol. * Use default symbol * [On Progress] Get symbol from the QgsSymbolButton. * [On progress] failed to change the symbol * Fix billboard fragment shader for macOS * Better transparency handling. * Use size from the symbol. * Add set layer for 3d billboard symbol. * Set billboard size from the symbol pixel size * 20 * Use size from the image. * [Debug] set white symbol to success kid, it work when previous billboard is success kid. * Use store and restore symbol from Nyall. * Remove unrelated code. * Apply random extent to fix the bug, from Martin. * Remove add mesh entities for billboard. * Hide material and transformation widget for billboard. * Remove add scene entities for billboard. * Add selected as parameter in drawPreviewIcon. * Add QgsMarkerSymbol to store the symbol in billboard * Put billboard symbol in point3dsymbol serialization. * Add billboard height in the UI. * Set height for billboard. * Store billboard height separately. Perhaps better to use existing transform. * Set height of billboard to TY. * Flipped image for billboard symbol. * Add helper function to set billboard function. * Generate billboard transform from general transform. * Use static dpi for context size. * Remove debug message. * Use Qgs3DRenderContext for selection color and dpi from QgsApplication. * Remove unnecessary file and code. * Remove commented iut code. * Add documentation of new classes. * Fix banned keywords. * Add missing parameter's documentation. * Address PR review. * Use context from readXML. * Remove one line function. * Fix billboard size. * Make some functions private, remove unused function. * Use unique_ptr for the ownership. * Use unique_ptr for default symbol to avoid memory leak. * Add parent to texture2D. * Fix documentation. * Add copy constructor. * Fix documentation. * Remove documentation warning. * Fix sip error. * Add unit test for billboard rendering. * Set ambient to not transparent for measurement line. * Add dpi in the Qgs3DMapSetting * Update billboard rendering unit test. * Remove layer from 3d point widget since it's not supported yet. * Addressing PR review from Martin. * Attach dom directly for the billboard symbol. * Remove unused constructor for point3dsymbol. * Use stroke width ratio for solving big stroke width. * Update unit test for rendering with some stroke color. * Fix typo.
- Loading branch information
1 parent
6567e3e
commit b9978d5
Showing
28 changed files
with
986 additions
and
186 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
#version 150 core | ||
|
||
uniform sampler2D tex0; | ||
|
||
in vec2 UV; | ||
out vec4 fragColor; | ||
|
||
void main(void) | ||
{ | ||
|
||
fragColor = texture(tex0, UV); | ||
|
||
if (fragColor.a < 0.5) | ||
discard; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
#version 150 | ||
|
||
// input | ||
layout (points) in; | ||
// output | ||
layout (triangle_strip, max_vertices = 4) out; | ||
|
||
uniform mat4 modelViewProjection; | ||
|
||
uniform vec2 BB_SIZE; // billboard size in pixels | ||
uniform vec2 WIN_SCALE; // the size of the viewport in pixels | ||
|
||
out vec2 UV; | ||
// glsl | ||
|
||
void main (void) | ||
{ | ||
|
||
vec4 P = gl_in[0].gl_Position; | ||
P /= P.w; | ||
|
||
vec2 size = BB_SIZE / WIN_SCALE; | ||
|
||
gl_Position = P; | ||
gl_Position.xy += vec2(-0.5,-0.5) * size; | ||
UV = vec2(0,0); | ||
EmitVertex(); | ||
|
||
gl_Position = P; | ||
gl_Position.xy += vec2(0.5,-0.5) * size; | ||
UV = vec2(1,0); | ||
EmitVertex(); | ||
|
||
gl_Position = P; | ||
gl_Position.xy += vec2(-0.5,+0.5) * size; | ||
UV = vec2(0,1); | ||
EmitVertex(); | ||
|
||
gl_Position = P; | ||
gl_Position.xy += vec2(+0.5,+0.5) * size; | ||
UV = vec2(1,1); | ||
EmitVertex(); | ||
|
||
EndPrimitive(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
#version 150 | ||
|
||
uniform mat4 modelViewProjection; | ||
|
||
in vec3 vertexPosition; | ||
|
||
void main(void) | ||
{ | ||
gl_Position = modelViewProjection * vec4(vertexPosition, 1); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
/*************************************************************************** | ||
qgsbillboardgeometry.cpp | ||
-------------------------------------- | ||
Date : Jul 2019 | ||
Copyright : (C) 2019 by Ismail Sunni | ||
Email : imajimatika at gmail dot com | ||
*************************************************************************** | ||
* * | ||
* This program is free software; you can redistribute it and/or modify * | ||
* it under the terms of the GNU General Public License as published by * | ||
* the Free Software Foundation; either version 2 of the License, or * | ||
* (at your option) any later version. * | ||
* * | ||
***************************************************************************/ | ||
|
||
#include <QVector3D> | ||
|
||
#include "qgsbillboardgeometry.h" | ||
|
||
QgsBillboardGeometry::QgsBillboardGeometry( Qt3DCore::QNode *parent ) | ||
: Qt3DRender::QGeometry( parent ) | ||
, mPositionAttribute( new Qt3DRender::QAttribute( this ) ) | ||
, mVertexBuffer( new Qt3DRender::QBuffer( Qt3DRender::QBuffer::VertexBuffer, this ) ) | ||
{ | ||
|
||
mPositionAttribute->setAttributeType( Qt3DRender::QAttribute::VertexAttribute ); | ||
mPositionAttribute->setBuffer( mVertexBuffer ); | ||
mPositionAttribute->setVertexBaseType( Qt3DRender::QAttribute::Float ); | ||
mPositionAttribute->setVertexSize( 3 ); | ||
mPositionAttribute->setName( Qt3DRender::QAttribute::defaultPositionAttributeName() ); | ||
|
||
addAttribute( mPositionAttribute ); | ||
|
||
} | ||
|
||
void QgsBillboardGeometry::setPoints( const QVector<QVector3D> &vertices ) | ||
{ | ||
QByteArray vertexBufferData; | ||
vertexBufferData.resize( vertices.size() * 3 * sizeof( float ) ); | ||
float *rawVertexArray = reinterpret_cast<float *>( vertexBufferData.data() ); | ||
int idx = 0; | ||
for ( const auto &v : vertices ) | ||
{ | ||
rawVertexArray[idx++] = v.x(); | ||
rawVertexArray[idx++] = v.y(); | ||
rawVertexArray[idx++] = v.z(); | ||
} | ||
|
||
mVertexCount = vertices.count(); | ||
mVertexBuffer->setData( vertexBufferData ); | ||
|
||
emit countChanged( mVertexCount ); | ||
|
||
} | ||
|
||
int QgsBillboardGeometry::count() const | ||
{ | ||
return mVertexCount; | ||
} | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
/*************************************************************************** | ||
qgsbillboardgeometry.h | ||
-------------------------------------- | ||
Date : Jul 2019 | ||
Copyright : (C) 2019 by Ismail Sunni | ||
Email : imajimatika at gmail dot com | ||
*************************************************************************** | ||
* * | ||
* This program is free software; you can redistribute it and/or modify * | ||
* it under the terms of the GNU General Public License as published by * | ||
* the Free Software Foundation; either version 2 of the License, or * | ||
* (at your option) any later version. * | ||
* * | ||
***************************************************************************/ | ||
|
||
#ifndef QGSBILLBOARDGEOMETRY_H | ||
#define QGSBILLBOARDGEOMETRY_H | ||
|
||
#include <QObject> | ||
#include <Qt3DRender/QGeometry> | ||
#include <Qt3DRender/QBuffer> | ||
#include <Qt3DRender/QAttribute> | ||
|
||
|
||
/** | ||
* \ingroup 3d | ||
* Geometry of the billboard rendering for points in 3D map view. | ||
* | ||
* \since QGIS 3.10 | ||
*/ | ||
class QgsBillboardGeometry : public Qt3DRender::QGeometry | ||
{ | ||
Q_OBJECT | ||
|
||
Q_PROPERTY( int count READ count NOTIFY countChanged ) | ||
public: | ||
//! Constructor of QgsBillboardGeometry. | ||
QgsBillboardGeometry( Qt3DCore::QNode *parent = nullptr ); | ||
|
||
//! Set the points for the billboard with \a vertices. | ||
void setPoints( const QVector<QVector3D> &vertices ); | ||
|
||
//! Returns the number of points. | ||
int count() const; | ||
|
||
signals: | ||
//! Signal when the number of points changed. | ||
void countChanged( int count ); | ||
|
||
private: | ||
Qt3DRender::QAttribute *mPositionAttribute = nullptr; | ||
Qt3DRender::QBuffer *mVertexBuffer = nullptr; | ||
int mVertexCount = 0; | ||
}; | ||
|
||
#endif // QGSBILLBOARDGEOMETRY_H |
Oops, something went wrong.