/**************************************************************************** ** ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the demonstration applications of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 or version 3 as published by the Free ** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** following information to ensure the GNU Lesser General Public License ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include #include #include //! [1] struct State { QColor color; int compare(const State *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, State); //! [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" " gl_FragColor = texCoord.y * texCoord.x * color * qt_Opacity; \n" "}"; } //! [3] //! [4] QList attributes() const { return QList() << "aVertex" << "aTexCoord"; } //! [4] //! [5] void updateState(const State *state, const State *) { program()->setUniformValue(id_color, state->color); } //! [5] //! [6] void resolveUniforms() { id_color = program()->uniformLocation("color"); } private: int id_color; //! [6] }; //! [7] class ColorNode : public QSGGeometryNode { public: ColorNode() : m_geometry(QSGGeometry::defaultAttributes_TexturedPoint2D(), 4) { setGeometry(&m_geometry); QSGSimpleMaterial *material = Shader::createMaterial(); material->setFlag(QSGMaterial::Blending); setMaterial(material); setFlag(OwnsMaterial); } QSGGeometry m_geometry; }; //! [7] //! [8] class Item : public QQuickItem { Q_OBJECT Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged) public: Item() { 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 *) { 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); return n; } }; //! [9] //! [11] int main(int argc, char **argv) { QGuiApplication app(argc, 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(); } #include "simplematerial.moc" //! [11]