Don't try to render line primitives if the renderer won't do anything with them

This commit is contained in:
Nyall Dawson 2023-08-23 14:36:40 +10:00 committed by Martin Dobias
parent fd9f39e0af
commit e4770a18eb
7 changed files with 18 additions and 7 deletions

View File

@ -3807,7 +3807,9 @@ TiledSceneRequestFlags = Qgis # dirty hack since SIP seems to introduce the fla
# monkey patching scoped based enum
Qgis.TiledSceneRendererFlag.RequiresTextures.__doc__ = "Renderer requires textures"
Qgis.TiledSceneRendererFlag.ForceRasterRender.__doc__ = "Layer should always be rendered as a raster image"
Qgis.TiledSceneRendererFlag.__doc__ = "Flags which control how tiled scene 2D renderers behave.\n\n.. versionadded:: 3.34\n\n" + '* ``RequiresTextures``: ' + Qgis.TiledSceneRendererFlag.RequiresTextures.__doc__ + '\n' + '* ``ForceRasterRender``: ' + Qgis.TiledSceneRendererFlag.ForceRasterRender.__doc__
Qgis.TiledSceneRendererFlag.RendersTriangles.__doc__ = "Renderer can render triangle primitives"
Qgis.TiledSceneRendererFlag.RendersLines.__doc__ = "Renderer can render line primitives"
Qgis.TiledSceneRendererFlag.__doc__ = "Flags which control how tiled scene 2D renderers behave.\n\n.. versionadded:: 3.34\n\n" + '* ``RequiresTextures``: ' + Qgis.TiledSceneRendererFlag.RequiresTextures.__doc__ + '\n' + '* ``ForceRasterRender``: ' + Qgis.TiledSceneRendererFlag.ForceRasterRender.__doc__ + '\n' + '* ``RendersTriangles``: ' + Qgis.TiledSceneRendererFlag.RendersTriangles.__doc__ + '\n' + '* ``RendersLines``: ' + Qgis.TiledSceneRendererFlag.RendersLines.__doc__
# --
Qgis.TiledSceneRendererFlag.baseClass = Qgis
Qgis.TiledSceneRendererFlags.baseClass = Qgis

View File

@ -2209,6 +2209,8 @@ The development version
{
RequiresTextures,
ForceRasterRender,
RendersTriangles,
RendersLines,
};
typedef QFlags<Qgis::TiledSceneRendererFlag> TiledSceneRendererFlags;

View File

@ -3878,6 +3878,8 @@ class CORE_EXPORT Qgis
{
RequiresTextures = 1 << 0, //!< Renderer requires textures
ForceRasterRender = 1 << 1, //!< Layer should always be rendered as a raster image
RendersTriangles = 1 << 2, //!< Renderer can render triangle primitives
RendersLines = 1 << 3, //!< Renderer can render line primitives
};
Q_ENUM( TiledSceneRendererFlag )

View File

@ -392,11 +392,13 @@ void QgsTiledSceneLayerRenderer::renderPrimitive( const tinygltf::Model &model,
switch ( primitive.mode )
{
case TINYGLTF_MODE_TRIANGLES:
renderTrianglePrimitive( model, primitive, tile, tileTranslationEcef, gltfLocalTransform, contentUri, context );
if ( mRenderer->flags() & Qgis::TiledSceneRendererFlag::RendersTriangles )
renderTrianglePrimitive( model, primitive, tile, tileTranslationEcef, gltfLocalTransform, contentUri, context );
break;
case TINYGLTF_MODE_LINE:
renderLinePrimitive( model, primitive, tile, tileTranslationEcef, gltfLocalTransform, contentUri, context );
if ( mRenderer->flags() & Qgis::TiledSceneRendererFlag::RendersLines )
renderLinePrimitive( model, primitive, tile, tileTranslationEcef, gltfLocalTransform, contentUri, context );
return;
case TINYGLTF_MODE_POINTS:
@ -695,7 +697,7 @@ void QgsTiledSceneLayerRenderer::renderTrianglePrimitive( const tinygltf::Model
}
}
void QgsTiledSceneLayerRenderer::renderLinePrimitive( const tinygltf::Model &model, const tinygltf::Primitive &primitive, const QgsTiledSceneTile &tile, const QgsVector3D &tileTranslationEcef, const QMatrix4x4 *gltfLocalTransform, const QString &contentUri, QgsTiledSceneRenderContext &context )
void QgsTiledSceneLayerRenderer::renderLinePrimitive( const tinygltf::Model &model, const tinygltf::Primitive &primitive, const QgsTiledSceneTile &tile, const QgsVector3D &tileTranslationEcef, const QMatrix4x4 *gltfLocalTransform, const QString &, QgsTiledSceneRenderContext &context )
{
auto posIt = primitive.attributes.find( "POSITION" );
if ( posIt == primitive.attributes.end() )

View File

@ -69,7 +69,7 @@ void QgsTiledSceneRenderContext::textureCoordinates( float &textureX1, float &te
Qgis::TiledSceneRendererFlags QgsTiledSceneRenderer::flags() const
{
return Qgis::TiledSceneRendererFlags();
return Qgis::TiledSceneRendererFlag::RendersLines | Qgis::TiledSceneRendererFlag::RendersTriangles;
}
QgsTiledSceneRenderer *QgsTiledSceneRenderer::load( QDomElement &element, const QgsReadWriteContext &context )

View File

@ -62,7 +62,9 @@ Qgis::TiledSceneRendererFlags QgsTiledSceneTextureRenderer::flags() const
// force raster rendering for this renderer type -- there's no benefit in exporting these layers as a bunch
// of triangular images which are pieced together, that adds a lot of extra content to the exports and results
// in files which can be extremely slow to open and render in other viewers.
return Qgis::TiledSceneRendererFlag::RequiresTextures | Qgis::TiledSceneRendererFlag::ForceRasterRender;
return Qgis::TiledSceneRendererFlag::RequiresTextures |
Qgis::TiledSceneRendererFlag::ForceRasterRender |
Qgis::TiledSceneRendererFlag::RendersTriangles;
}
void QgsTiledSceneTextureRenderer::renderTriangle( QgsTiledSceneRenderContext &context, const QPolygonF &triangle )

View File

@ -212,7 +212,8 @@ void QgsTiledSceneWireframeRenderer::stopRender( QgsTiledSceneRenderContext &con
Qgis::TiledSceneRendererFlags QgsTiledSceneWireframeRenderer::flags() const
{
Qgis::TiledSceneRendererFlags flags;
Qgis::TiledSceneRendererFlags flags = Qgis::TiledSceneRendererFlag::RendersTriangles |
Qgis::TiledSceneRendererFlag::RendersLines;
if ( mUseTextureColors )
flags |= Qgis::TiledSceneRendererFlag::RequiresTextures;