From 5c7225572746201cc60496530f410178cdb4283b Mon Sep 17 00:00:00 2001 From: Sean Harmer Date: Mon, 15 Apr 2013 11:52:24 +0100 Subject: Add a way of transforming texture coordinates of a simple textured quad This commit introduces the enum TextureCoordinatesTransformFlag and corresponding QFlags OR combination TextureCoordinatesTransformMode. This enum is used to control the orientation of texture coordinates relative to window/item coordinates. The common use case addressed by this commit is when rendering to a texture via an FBO using some 3rd party OpenGL library. Some libraries do not offer a way to orient the rendered output which results in the texture being displayed upside down when used in conjunction with QSGSimpleTextureNode. There are a number of possible solutions to this: 1 Mirror the item by scaling by -1 in the y-direction in QML document 2 Use a custom material (shader) that transforms texture coordinates in GLSL 3 Generate texture coordinates differently This commit opts for approach 3. Approach 1 is ugly and visible to the end user and also causes more work when other transformations interact with the necessary scaling. Approach 2 has a performance cost in both switching material (shader) and also in additional per-vertex or per- fragment operations. The chosen approach hides it from the end user and has zero runtime cost delta compared to any other textured quad. Change-Id: I95870da50a09d113aeff2681bfd458669ec7a5a4 Reviewed-by: Gunnar Sletta --- src/quick/scenegraph/util/qsgsimpletexturenode.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'src/quick/scenegraph/util/qsgsimpletexturenode.h') diff --git a/src/quick/scenegraph/util/qsgsimpletexturenode.h b/src/quick/scenegraph/util/qsgsimpletexturenode.h index ffd10210ae..f5ab7fb3bb 100644 --- a/src/quick/scenegraph/util/qsgsimpletexturenode.h +++ b/src/quick/scenegraph/util/qsgsimpletexturenode.h @@ -48,6 +48,8 @@ QT_BEGIN_NAMESPACE +class QSGSimpleTextureNodePrivate; + class Q_QUICK_EXPORT QSGSimpleTextureNode : public QSGGeometryNode { public: @@ -63,14 +65,28 @@ public: void setFiltering(QSGTexture::Filtering filtering); QSGTexture::Filtering filtering() const; + enum TextureCoordinatesTransformFlag { + NoTransform = 0x00, + MirrorHorizontally = 0x01, + MirrorVertically = 0x02 + }; + Q_DECLARE_FLAGS(TextureCoordinatesTransformMode, TextureCoordinatesTransformFlag) + + void setTextureCoordinatesTransform(TextureCoordinatesTransformMode mode); + TextureCoordinatesTransformMode textureCoordinatesTransform() const; + private: QSGGeometry m_geometry; QSGOpaqueTextureMaterial m_opaque_material; QSGTextureMaterial m_material; QRectF m_rect; + + Q_DECLARE_PRIVATE(QSGSimpleTextureNode) }; +Q_DECLARE_OPERATORS_FOR_FLAGS(QSGSimpleTextureNode::TextureCoordinatesTransformMode) + QT_END_NAMESPACE #endif // QSGSIMPLETEXTURENODE_H -- cgit v1.2.3