Initial import from qtquick2.
[profile/ivi/qtdeclarative.git] / src / declarative / scenegraph / coreapi / qsgmaterial.h
1 /****************************************************************************
2 **
3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
6 **
7 ** This file is part of the QtDeclarative module of the Qt Toolkit.
8 **
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** No Commercial Usage
11 ** This file contains pre-release code and may not be distributed.
12 ** You may use this file in accordance with the terms and conditions
13 ** contained in the Technology Preview License Agreement accompanying
14 ** this package.
15 **
16 ** GNU Lesser General Public License Usage
17 ** Alternatively, this file may be used under the terms of the GNU Lesser
18 ** General Public License version 2.1 as published by the Free Software
19 ** Foundation and appearing in the file LICENSE.LGPL included in the
20 ** packaging of this file.  Please review the following information to
21 ** ensure the GNU Lesser General Public License version 2.1 requirements
22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23 **
24 ** In addition, as a special exception, Nokia gives you certain additional
25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27 **
28 ** If you have questions regarding the use of this file, please contact
29 ** Nokia at qt-info@nokia.com.
30 **
31 **
32 **
33 **
34 **
35 **
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 #ifndef MATERIAL_H
43 #define MATERIAL_H
44
45 #include <qglshaderprogram.h>
46
47 QT_BEGIN_HEADER
48
49 QT_BEGIN_NAMESPACE
50
51 QT_MODULE(Declarative)
52
53 class QSGMaterial;
54
55 class Q_DECLARATIVE_EXPORT QSGMaterialShader
56 {
57 public:
58     class Q_DECLARATIVE_EXPORT RenderState {
59     public:
60         enum DirtyState
61         {
62             DirtyMatrix         = 0x0001,
63             DirtyOpacity        = 0x0002
64         };
65         Q_DECLARE_FLAGS(DirtyStates, DirtyState)
66
67         inline DirtyStates dirtyState() const { return m_dirty; }
68
69         inline bool isMatrixDirty() const { return m_dirty & DirtyMatrix; }
70         inline bool isOpacityDirty() const { return m_dirty & DirtyOpacity; }
71
72         float opacity() const;
73         QMatrix4x4 combinedMatrix() const;
74         QMatrix4x4 modelViewMatrix() const;
75         QRect viewportRect() const;
76         QRect deviceRect() const;
77
78         const QGLContext *context() const;
79
80     private:
81         friend class QSGRenderer;
82         DirtyStates m_dirty;
83         const void *m_data;
84     };
85
86     QSGMaterialShader();
87
88     virtual void activate();
89     virtual void deactivate();
90     // First time a material is used, oldMaterial is null.
91     virtual void updateState(const RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial);
92     virtual char const *const *attributeNames() const = 0; // Array must end with null.
93
94 protected:
95     void compile();
96     virtual void initialize() { }
97
98     virtual const char *vertexShader() const = 0;
99     virtual const char *fragmentShader() const = 0;
100
101     QGLShaderProgram m_program;
102     bool m_compiled;
103     void *m_reserved;
104 };
105
106 struct QSGMaterialType { };
107
108 class Q_DECLARATIVE_EXPORT QSGMaterial
109 {
110 public:
111     enum Flag {
112         Blending = 0x0001
113     };
114     Q_DECLARE_FLAGS(Flags, Flag)
115
116     QSGMaterial();
117     virtual ~QSGMaterial();
118
119     virtual QSGMaterialType *type() const = 0;
120     virtual QSGMaterialShader *createShader() const = 0;
121     virtual int compare(const QSGMaterial *other) const;
122
123     QSGMaterial::Flags flags() const { return m_flags; }
124
125 protected:
126     void setFlag(Flags flags, bool set);
127
128 private:
129     Flags m_flags;
130     void *m_reserved;
131     Q_DISABLE_COPY(QSGMaterial)
132 };
133
134 Q_DECLARE_OPERATORS_FOR_FLAGS(QSGMaterial::Flags)
135 Q_DECLARE_OPERATORS_FOR_FLAGS(QSGMaterialShader::RenderState::DirtyStates)
136
137 QT_END_NAMESPACE
138
139 QT_END_HEADER
140
141 #endif