From 077ad5f30446f6b3ccc38cb7f05897566f8e5eb7 Mon Sep 17 00:00:00 2001 From: Gunnar Sletta Date: Wed, 12 Dec 2012 20:11:12 +0100 Subject: [PATCH] Documentation for scene graph examples. Change-Id: Idb39fc0b6d5e538b90ae8a0b98d9f4d77e1fb617 Reviewed-by: Yoann Lopes --- .../quick/doc/images/custom-geometry-example.png | Bin 27636 -> 0 bytes .../doc/images/custom-geometry-example.png | Bin 0 -> 18006 bytes .../customgeometry/doc/src/customgeometry.qdoc | 33 +++-- examples/quick/scenegraph/customgeometry/main.cpp | 3 + .../doc/images/openglunderqml-example.jpg | Bin 0 -> 20640 bytes .../openglunderqml/doc/src/openglunderqml.qdoc | 168 ++++++++++++++++++ .../quick/scenegraph/openglunderqml/squircle.cpp | 20 ++- .../quick/scenegraph/openglunderqml/squircle.h | 2 + .../doc/images/simplematerial-example.jpg | Bin 0 -> 10744 bytes .../simplematerial/doc/src/simplematerial.qdoc | 180 ++++++++++++++++++++ examples/quick/scenegraph/simplematerial/main.qml | 38 +++-- .../scenegraph/simplematerial/simplematerial.cpp | 85 ++++++---- src/quick/scenegraph/util/qsgsimplematerial.cpp | 23 +++ 13 files changed, 484 insertions(+), 68 deletions(-) delete mode 100644 examples/quick/doc/images/custom-geometry-example.png create mode 100644 examples/quick/scenegraph/customgeometry/doc/images/custom-geometry-example.png create mode 100644 examples/quick/scenegraph/openglunderqml/doc/images/openglunderqml-example.jpg create mode 100644 examples/quick/scenegraph/openglunderqml/doc/src/openglunderqml.qdoc create mode 100644 examples/quick/scenegraph/simplematerial/doc/images/simplematerial-example.jpg create mode 100644 examples/quick/scenegraph/simplematerial/doc/src/simplematerial.qdoc diff --git a/examples/quick/doc/images/custom-geometry-example.png b/examples/quick/doc/images/custom-geometry-example.png deleted file mode 100644 index 33739f78b8cde4a330c7b3c51e978618e74905f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27636 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 diff --git a/examples/quick/scenegraph/customgeometry/doc/images/custom-geometry-example.png b/examples/quick/scenegraph/customgeometry/doc/images/custom-geometry-example.png new file mode 100644 index 0000000000000000000000000000000000000000..4ed20d348566f2ffc4aef1a168b1f8e06a7bc933 GIT binary patch literal 18006 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 L`njxgN@xNAQa7La literal 0 HcmV?d00001 diff --git a/examples/quick/scenegraph/customgeometry/doc/src/customgeometry.qdoc b/examples/quick/scenegraph/customgeometry/doc/src/customgeometry.qdoc index c226634..7127fd0 100644 --- a/examples/quick/scenegraph/customgeometry/doc/src/customgeometry.qdoc +++ b/examples/quick/scenegraph/customgeometry/doc/src/customgeometry.qdoc @@ -28,7 +28,8 @@ /*! \example quick/scenegraph/customgeometry \title Custom Geometry Example - \ingroup examples + \ingroup qtquickexamples + \brief Shows how to implement a custom geometry in the Qt Quick Scene Graph. \brief The custom geometry example shows how to create a QQuickItem which uses the scene graph API to build a custom geometry for the scene @@ -58,11 +59,11 @@ QQuickItem::updatePaintNode() which all items with custom scene graph logic must implement. - \e { The scene graph will on many hardware configurations be + \note The scene graph will on many hardware configurations be rendering on a separate thread. It is therefore crucial that - interaction with the scene graph happens in a controlled - manner, first and foremost through the \l - QQuickItem::updatePaintNode() function. } + interaction with the scene graph happens in a controlled manner, + first and foremost through the \l QQuickItem::updatePaintNode() + function. \section1 BezierCurve Implementation @@ -122,17 +123,17 @@ set which has two floats, one for x coordinates and one for y coordinates. The second argument is the vertex count. - \e {Custom attribute sets can also created, but that is not - covered in this example}. + Custom attribute sets can also created, but that is not + covered in this example. Since we do not have any special needs for memory managing the geometry, we specify that the QSGGeometryNode should own the geometry. - \e {To minimize allocations, reduce memory fragmentation and + To minimize allocations, reduce memory fragmentation and improve performance, it would also be possible to make the geometry a member of a QSGGeometryNode subclass, in which case, we - would not have set the QSGGeometryNode::OwnsGeometry flag}. + would not have set the QSGGeometryNode::OwnsGeometry flag. \snippet quick/scenegraph/customgeometry/beziercurve.cpp 6 @@ -174,26 +175,32 @@ BezierCurve and make it part of the \c {CustomGeometry 1.0} module. + As the bezier curve is drawn using GL_LINE_STRIP, we specify that + the view should be multisampled to get antialiasing. This is not + required, but it will make the item look a bit nicer on hardware + that supports it. Multisampling is not enabled by default because + it often results in higher memory usage. + \section1 Using the Item - \snippet quick/scenegraph/customgeometry/LineTester.qml 1 + \snippet quick/scenegraph/customgeometry/main.qml 1 Our .qml file imports the \c {QtQuick 2.0} module to get the standard elements and also our own \c {CustomGeometry 1.0} module which contains our newly created BezierCurve element. - \snippet quick/scenegraph/customgeometry/LineTester.qml 2 + \snippet quick/scenegraph/customgeometry/main.qml 2 Then we create the our root item and an instance of the BezierCurve which we anchor to fill the root. - \snippet quick/scenegraph/customgeometry/LineTester.qml 3 + \snippet quick/scenegraph/customgeometry/main.qml 3 To make the example a bit more interesting we add an animation to change the two control points in the curve. The end points stay unchanged. - \snippet quick/scenegraph/customgeometry/LineTester.qml 4 + \snippet quick/scenegraph/customgeometry/main.qml 4 Finally we overlay a short text outlining what the example shows. diff --git a/examples/quick/scenegraph/customgeometry/main.cpp b/examples/quick/scenegraph/customgeometry/main.cpp index ea699c1..f2ec27d 100644 --- a/examples/quick/scenegraph/customgeometry/main.cpp +++ b/examples/quick/scenegraph/customgeometry/main.cpp @@ -52,6 +52,9 @@ int main(int argc, char **argv) qmlRegisterType("CustomGeometry", 1, 0, "BezierCurve"); QQuickView view; + QSurfaceFormat format; + format.setSamples(16); + view.setFormat(format); view.setSource(QUrl("qrc:///scenegraph/customgeometry/main.qml")); view.show(); diff --git a/examples/quick/scenegraph/openglunderqml/doc/images/openglunderqml-example.jpg b/examples/quick/scenegraph/openglunderqml/doc/images/openglunderqml-example.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69ee04d2ea188c17148bf98b255e81ded5619d6b GIT binary patch literal 20640 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 + win->setClearBeforeRendering(false); } } + //! [3] //! [4] void Squircle::paint() { @@ -128,7 +132,7 @@ void Squircle::paint() 1, 1 }; m_program->setAttributeArray(0, GL_FLOAT, values, 2); - m_program->setUniformValue("t", (float) m_t); + m_program->setUniformValue("t", (float) m_thread_t); glViewport(0, 0, window()->width(), window()->height()); @@ -157,4 +161,10 @@ void Squircle::cleanup() } //! [6] +//! [9] +void Squircle::sync() +{ + m_thread_t = m_t; +} +//! [9] diff --git a/examples/quick/scenegraph/openglunderqml/squircle.h b/examples/quick/scenegraph/openglunderqml/squircle.h index 3d0a46e..85e6187 100644 --- a/examples/quick/scenegraph/openglunderqml/squircle.h +++ b/examples/quick/scenegraph/openglunderqml/squircle.h @@ -67,11 +67,13 @@ protected: public slots: void paint(); void cleanup(); + void sync(); private: QOpenGLShaderProgram *m_program; qreal m_t; + qreal m_thread_t; }; //! [1] diff --git a/examples/quick/scenegraph/simplematerial/doc/images/simplematerial-example.jpg b/examples/quick/scenegraph/simplematerial/doc/images/simplematerial-example.jpg new file mode 100644 index 0000000000000000000000000000000000000000..08db8dee4e31f245c1f1e3ce63b7da0940779c0f GIT binary patch literal 10744 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 M;rpSn+{wuQ0cmf9lmGw# literal 0 HcmV?d00001 diff --git a/examples/quick/scenegraph/simplematerial/doc/src/simplematerial.qdoc b/examples/quick/scenegraph/simplematerial/doc/src/simplematerial.qdoc new file mode 100644 index 0000000..20d244f --- /dev/null +++ b/examples/quick/scenegraph/simplematerial/doc/src/simplematerial.qdoc @@ -0,0 +1,180 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: http://www.gnu.org/copyleft/fdl.html. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \example quick/scenegraph/simplematerial + \title Simple Material Example + \ingroup qtquickexamples + \brief Shows how to define a scene graph material to fill a shape. + + \image simplematerial-example.jpg + + In this example, we will make use of the \l + QSGSimpleMaterialShader class to fill a shape in the scene + graph. This is a convenience class intended to avoid a lot of the + boilerplate code required when creating materials with the \l + QSGMaterial, \l QSGMaterialShader and \l QSGMaterialType classes + directly. + + A simple material consists of two parts, the material state and + the material shader. The material shader has one instance per + scene graph and contains the actual OpenGL shader program and + information about which attributes and uniforms it uses. The + material state is what we assign to each individual node, in this + case to give them different colors. + + \snippet quick/scenegraph/simplematerial/simplematerial.cpp 1 + + The first thing we do when creating custom materials with the + simplified scheme is to create a state class. In this case the + state class contains only one member, a QColor. It also defines a + compare function which the scene graph can use to reorder the node + rendering. + + \snippet quick/scenegraph/simplematerial/simplematerial.cpp 2 + + Next we define the material shader, by subclassing a template + instantiation of \l QSGSimpleMaterialShader with our \c State. + + Then we use the macro \l QSG_DECLARE_SIMPLE_COMPARABLE_SHADER() + which will generate some boilerplate code for us. Since our \c + State class has a compare function, we declare that the states can + be compared. It would have been possible to remove the \c + State::compare() function and instead declare the shader with \l + QSG_DECLARE_SIMPLE_SHADER(), but this could then reduce performance + in certain usecases. + + The state struct is used as a template parameter to + automatically generate a \l QSGMaterialType for us, so it is + crucial that the pair of shader and state are made up of unique + classes. Using the same \c State class in multiple shaders will + will lead to undefined behavior. + + \snippet quick/scenegraph/simplematerial/simplematerial.cpp 3 + + Next comes the declaration of the shader source code, where we + define a vertex and fragment shader. The simple material assumes + the presence of \c qt_Matrix in the vertex shader and \c + qt_Opacity in the fragment shader. + + \snippet quick/scenegraph/simplematerial/simplematerial.cpp 4 + + We reimplement the \c attributes function to return the name of + the \c aVertex and \c aTexCoord attribute names. These attributes + will be mapped to attribute indices 0 and 1 in the node's + geometry. + + \snippet quick/scenegraph/simplematerial/simplematerial.cpp 6 + + Uniforms can be accessed either by name or by index, where index + is faster than name, so we reimplement the \c resolveUniforms() + function to find the index of the \c color uniform. We do not have + to worry about resolving \c qt_Opacity or \c qt_Matrix as these + are handled by the baseclass. + + \snippet quick/scenegraph/simplematerial/simplematerial.cpp 5 + + The \c updateState() function is called once for every unique + state and we use it to update the shader program with the current + color. The previous state is passed in as a second parameter so + that the user can update only that which has changed. In our + usecase, where all the colors are different, the updateState will + be called once for every node. + + \snippet quick/scenegraph/simplematerial/simplematerial.cpp 7 + + The \c ColorNode class is supposed to draw something, so it needs + to be a subclass of \l QSGGeometryNode. + + Since our shader expects both a position and a texture coordinate, + we use the default attribute set \l + QSGGeometry::defaultAttributes_TexturedPoint2D() and define that + the geometry consists of a total of four vertices. To avoid the + allocation, we make the QSGGeometry a member of the + QSGGeometryNode. + + When used the macro \l QSG_DECLARE_SIMPLE_COMPARABLE_SHADER() above, + it defined the \c createMaterial() function which we use to + instantiate materials for our \c State struct. + + As we will be making use of opacity in our custom material, we + need to set the \l QSGMaterial::Blending flag. The scene graph may + use this flag to either disable or enable \c GL_BLEND when drawing + the node or to reorder the drawing of the node. + + Finally, we tell the node to take ownership of the material, so we + do not have to explicitly memorymanage it. + + \snippet quick/scenegraph/simplematerial/simplematerial.cpp 8 + + Since the Item is providing its own graphics to the scene graph, + we set the flag \l QQuickItem::ItemHasContents. + + \snippet quick/scenegraph/simplematerial/simplematerial.cpp 9 + + Whenever the Item has changed graphically, the \l + QQuickItem::updatePaintNode() function is called. + + \note The scene graph may be rendered in a different thread than the + GUI thread and \l QQuickItem::updatePaintNode() is one of the few + places where it is safe to access properties of the QML + object. Any interaction with the scene graph from a custom \l + QQuickItem should be contained to this function. The function is + called on the rendering thread while the GUI thread is blocked. + + The first time this function is called for an \c Item instance, + the node will be 0 and we create a new one. For every consecutive + call, the node will be what we returned previously. There are + scenarios where the scene graph will be removed and rebuilt from + scratch however, so one should always check the node and recreate + it if required. + + Once we have a \c ColorNode, we update its geometry and material + state. Finally, we notify the scene graph that the node has + undergone changes to its geometry and material. + + \snippet quick/scenegraph/simplematerial/simplematerial.cpp 11 + + The \c main() function of the application adds the custom QML type + using \l qmlRegisterType() and opens up a \l QQuickView with our + QML file. + + \snippet quick/scenegraph/simplematerial/main.qml 1 + + In the QML file, we import our custom type so we can instantiate + it. + + \snippet quick/scenegraph/simplematerial/main.qml 2 + + Then we create a column of three instances of our custom item, + each with a different color. + + \snippet quick/scenegraph/simplematerial/main.qml 3 + + And finally we overlay a short descriptive text. + + */ diff --git a/examples/quick/scenegraph/simplematerial/main.qml b/examples/quick/scenegraph/simplematerial/main.qml index 70771a7..b90afdd 100644 --- a/examples/quick/scenegraph/simplematerial/main.qml +++ b/examples/quick/scenegraph/simplematerial/main.qml @@ -44,30 +44,40 @@ import QtQuick 2.0 import SimpleMaterial 1.0 Rectangle { - width: 640 - height: 360 - - gradient: Gradient { - GradientStop { position: 0; color: "#00ffff" } - GradientStop { position: 1; color: "#00ff00" } - } + width: 320 + height: 480 + color: "black" //! [1] //! [2] - SimpleMaterialItem { + Column { anchors.fill: parent - SequentialAnimation on scale { - NumberAnimation { to: 100; duration: 60000; easing.type: Easing.InCubic } - NumberAnimation { to: 1; duration: 60000; easing.type: Easing.OutCubic } - loops: Animation.Infinite + + SimpleMaterialItem { + width: parent.width; + height: parent.height / 3; + color: "steelblue" + } + + SimpleMaterialItem { + width: parent.width; + height: parent.height / 3; + color: "darkorchid" } - rotation: scale * 10 - 10 + SimpleMaterialItem { + width: parent.width; + height: parent.height / 3; + color: "springgreen" + } } + + //! [2] //! [3] Rectangle { color: Qt.rgba(0, 0, 0, 0.8) radius: 10 + antialiasing: true border.width: 1 border.color: "black" anchors.fill: label @@ -78,7 +88,7 @@ Rectangle { id: label color: "white" wrapMode: Text.WordWrap - text: "The background here is implemented as one QSGGeometryNode node which uses QSGSimpleMaterial to implement a mandlebrot fractal fill" + text: "These three gradient boxes are colorized using a custom material." anchors.right: parent.right anchors.left: parent.left anchors.bottom: parent.bottom diff --git a/examples/quick/scenegraph/simplematerial/simplematerial.cpp b/examples/quick/scenegraph/simplematerial/simplematerial.cpp index b7bea08..0b4759a 100644 --- a/examples/quick/scenegraph/simplematerial/simplematerial.cpp +++ b/examples/quick/scenegraph/simplematerial/simplematerial.cpp @@ -52,11 +52,11 @@ #include //! [1] -struct Color +struct State { QColor color; - int compare(const Color *other) const { + int compare(const State *other) const { uint rgb = color.rgba(); uint otherRgb = other->color.rgba(); @@ -72,9 +72,9 @@ struct Color //! [1] //! [2] -class Shader : public QSGSimpleMaterialShader +class Shader : public QSGSimpleMaterialShader { - QSG_DECLARE_SIMPLE_COMPARABLE_SHADER(Shader, Color); + QSG_DECLARE_SIMPLE_COMPARABLE_SHADER(Shader, State); //! [2] //! [3] public: @@ -97,18 +97,8 @@ public: "varying highp vec2 texCoord; \n" "void main () \n" "{ \n" - " highp vec2 z = texCoord; \n" - " gl_FragColor = vec4(0); \n" - " const highp float maxIterations = 100.; \n" - " for (float i = 0.; i < maxIterations; i += 1.0) { \n" - " z = vec2(z.x*z.x - z.y*z.y, 2.0*z.x*z.y) + texCoord; \n" - " if (dot(z, z) > 4.0) { \n" - " float col = pow(1. - i / maxIterations, sqrt(maxIterations / 10.)); \n" - " gl_FragColor = color * col * qt_Opacity; \n" - " break; \n" - " } \n" - " } \n" - "} \n"; + " gl_FragColor = texCoord.y * texCoord.x * color * qt_Opacity; \n" + "}"; } //! [3] //! [4] QList attributes() const @@ -116,9 +106,9 @@ public: return QList() << "aVertex" << "aTexCoord"; } //! [4] //! [5] - void updateState(const Color *color, const Color *) + void updateState(const State *state, const State *) { - program()->setUniformValue(id_color, color->color); + program()->setUniformValue(id_color, state->color); } //! [5] //! [6] void resolveUniforms() @@ -128,38 +118,37 @@ public: private: int id_color; -}; //! [6] +}; //! [7] -class TestNode : public QSGGeometryNode +class ColorNode : public QSGGeometryNode { public: - TestNode(const QRectF &bounds) + ColorNode() : m_geometry(QSGGeometry::defaultAttributes_TexturedPoint2D(), 4) { - QSGGeometry::updateTexturedRectGeometry(&m_geometry, bounds, QRectF(-0.60, -0.66, 0.08, 0.04)); setGeometry(&m_geometry); -//! [7] //! [8] - QSGSimpleMaterial *material = Shader::createMaterial(); - material->state()->color = Qt::blue; + QSGSimpleMaterial *material = Shader::createMaterial(); material->setFlag(QSGMaterial::Blending); - setMaterial(material); setFlag(OwnsMaterial); } -//! [8] //! [9] + QSGGeometry m_geometry; }; -//! [9] +//! [7] -//! [10] +//! [8] class Item : public QQuickItem { Q_OBJECT + + Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged) + public: Item() @@ -167,17 +156,40 @@ public: setFlag(ItemHasContents, true); } + void setColor(const QColor &color) { + if (m_color != color) { + m_color = color; + emit colorChanged(); + update(); + } + } + QColor color() const { + return m_color; + } + +signals: + void colorChanged(); + +private: + QColor m_color; + +//! [8] //! [9] +public: QSGNode *updatePaintNode(QSGNode *node, UpdatePaintNodeData *) { - delete node; - return new TestNode(boundingRect()); - } -}; -//! [10] + ColorNode *n = static_cast(node); + if (!node) + n = new ColorNode(); + QSGGeometry::updateTexturedRectGeometry(n->geometry(), boundingRect(), QRectF(0, 0, 1, 1)); + static_cast*>(n->material())->state()->color = m_color; + n->markDirty(QSGNode::DirtyGeometry | QSGNode::DirtyMaterial); -//! [11] + return n; + } +}; +//! [9] //! [11] int main(int argc, char **argv) { QGuiApplication app(argc, argv); @@ -185,11 +197,12 @@ int main(int argc, char **argv) qmlRegisterType("SimpleMaterial", 1, 0, "SimpleMaterialItem"); QQuickView view; + view.setResizeMode(QQuickView::SizeRootObjectToView); view.setSource(QUrl("qrc:///scenegraph/simplematerial/main.qml")); view.show(); return app.exec(); } -//! [11] #include "simplematerial.moc" +//! [11] diff --git a/src/quick/scenegraph/util/qsgsimplematerial.cpp b/src/quick/scenegraph/util/qsgsimplematerial.cpp index 6267d3f..f91c85a 100644 --- a/src/quick/scenegraph/util/qsgsimplematerial.cpp +++ b/src/quick/scenegraph/util/qsgsimplematerial.cpp @@ -145,6 +145,29 @@ */ /*! + \macro QSG_DECLARE_SIMPLE_SHADER(Shader, State) + \relates QSGSimpleMaterialShader + + This macro is used to declare a QSGMaterialType and a \c + createMaterial() function for \a Shader with the given \a State. + */ + +/*! + \macro QSG_DECLARE_SIMPLE_COMPARABLE_SHADER(Shader, State) + \relates QSGSimpleMaterialShader + + This macro is used to declare a QSGMaterialType and a \c + createMaterial() function for \a Shader with the given \a State, + where the \a State class must define a compare function on the + form: + + \code + int compare(const State *other) const; + \endcode +*/ + + +/*! \fn char const *const *QSGSimpleMaterialShader::attributeNames() const \internal */ -- 1.7.2.5