66e37c5cde1520bbab5f10ab7691ee76164fc57d
[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 dirtyStates() 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     inline QGLShaderProgram *program() { return &m_program; }
95
96 protected:
97
98     friend class QSGContext;
99
100     virtual void compile();
101     virtual void initialize() { }
102
103     virtual const char *vertexShader() const = 0;
104     virtual const char *fragmentShader() const = 0;
105
106 private:
107     QGLShaderProgram m_program;
108     void *m_reserved;
109 };
110
111 struct QSGMaterialType { };
112
113 class Q_DECLARATIVE_EXPORT QSGMaterial
114 {
115 public:
116     enum Flag {
117         Blending = 0x0001
118     };
119     Q_DECLARE_FLAGS(Flags, Flag)
120
121     QSGMaterial();
122     virtual ~QSGMaterial();
123
124     virtual QSGMaterialType *type() const = 0;
125     virtual QSGMaterialShader *createShader() const = 0;
126     virtual int compare(const QSGMaterial *other) const;
127
128     QSGMaterial::Flags flags() const { return m_flags; }
129     void setFlag(Flags flags, bool on = true);
130
131 private:
132     Flags m_flags;
133     void *m_reserved;
134     Q_DISABLE_COPY(QSGMaterial)
135 };
136
137 Q_DECLARE_OPERATORS_FOR_FLAGS(QSGMaterial::Flags)
138 Q_DECLARE_OPERATORS_FOR_FLAGS(QSGMaterialShader::RenderState::DirtyStates)
139
140 QT_END_NAMESPACE
141
142 QT_END_HEADER
143
144 #endif