From 3ddf7f1cf638091c8c7c7380bf0414dcc1145d2c Mon Sep 17 00:00:00 2001 From: Gunnar Sletta Date: Mon, 30 Jul 2012 11:09:23 +0200 Subject: Three scene graph examples with docs. How to make a custom QSGGeometry, how to use QSGSimpleMaterial and how to use render with raw GL. Change-Id: I3e5a32b6ae12d7d781c11050ed26a54845e92cca Reviewed-by: Gunnar Sletta --- .../scenegraph/simplematerial/simplematerial.cpp | 195 +++++++++++++++++++++ 1 file changed, 195 insertions(+) create mode 100644 examples/quick/scenegraph/simplematerial/simplematerial.cpp (limited to 'examples/quick/scenegraph/simplematerial/simplematerial.cpp') diff --git a/examples/quick/scenegraph/simplematerial/simplematerial.cpp b/examples/quick/scenegraph/simplematerial/simplematerial.cpp new file mode 100644 index 0000000000..a91c3b529f --- /dev/null +++ b/examples/quick/scenegraph/simplematerial/simplematerial.cpp @@ -0,0 +1,195 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/ +** +** This file is part of the demonstration applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include + +#include +#include + +#include +#include + +#include + +#include + +//! [1] +struct Color +{ + QColor color; + + int compare(const Color *other) const { + uint rgb = color.rgba(); + uint otherRgb = other->color.rgba(); + + if (rgb == otherRgb) { + return 0; + } else if (rgb < otherRgb) { + return -1; + } else { + return 1; + } + } +}; +//! [1] + +//! [2] +class Shader : public QSGSimpleMaterialShader +{ + QSG_DECLARE_SIMPLE_COMPARABLE_SHADER(Shader, Color); +//! [2] //! [3] +public: + + const char *vertexShader() const { + return + "attribute highp vec4 aVertex; \n" + "attribute highp vec2 aTexCoord; \n" + "uniform highp mat4 qt_Matrix; \n" + "varying highp vec2 texCoord; \n" + "void main() { \n" + " gl_Position = qt_Matrix * aVertex; \n" + " texCoord = aTexCoord; \n" + "}"; + } + + const char *fragmentShader() const { + return + "uniform lowp float qt_Opacity; \n" + "uniform lowp vec4 color; \n" + "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"; + } +//! [3] //! [4] + QList attributes() const + { + return QList() << "aVertex" << "aTexCoord"; + } +//! [4] //! [5] + void updateState(const Color *color, const Color *) + { + program()->setUniformValue(id_color, color->color); + } +//! [5] //! [6] + void resolveUniforms() + { + id_color = program()->uniformLocation("color"); + } + +private: + int id_color; +}; +//! [6] + + +//! [7] +class TestNode : public QSGGeometryNode +{ +public: + TestNode(const QRectF &bounds) + : 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; + material->setFlag(QSGMaterial::Blending); + + setMaterial(material); + setFlag(OwnsMaterial); + } +//! [8] //! [9] + QSGGeometry m_geometry; +}; +//! [9] + + +//! [10] +class Item : public QQuickItem +{ + Q_OBJECT +public: + + Item() + { + setFlag(ItemHasContents, true); + } + + QSGNode *updatePaintNode(QSGNode *node, UpdatePaintNodeData *) + { + delete node; + return new TestNode(boundingRect()); + } +}; +//! [10] + + + +//! [11] +int main(int argc, char **argv) +{ + QGuiApplication app(argc, argv); + + qmlRegisterType("SimpleMaterial", 1, 0, "SimpleMaterialItem"); + + QQuickView view; + view.setSource(QUrl("main.qml")); + view.show(); + + return app.exec(); +} +//! [11] + +#include "simplematerial.moc" -- cgit v1.2.3