[3.0] Add missed doxygen documentation
[platform/core/uifw/dali-core.git] / dali / public-api / rendering / shader.h
1 #ifndef DALI_SHADER_H
2 #define DALI_SHADER_H
3
4 /*
5  * Copyright (c) 2016 Samsung Electronics Co., Ltd.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  */
20
21 // EXTERNAL INCLUDES
22 #include <string> // std::string
23
24 // INTERNAL INCLUDES
25 #include <dali/public-api/object/handle.h>                // Dali::Handle
26 #include <dali/public-api/object/property-index-ranges.h> // DEFAULT_DERIVED_HANDLE_PROPERTY_START_INDEX
27
28 /**
29  * @brief DALI_COMPOSE_SHADER macro provides a convenient way to write shader source code.
30  *
31  * We normally use double quotation marks to write a string such as "Hello World".
32  * However many symbols are needed to add multiple lines of string.
33  * We don't need to write quotation marks using this macro at every line.
34  *
35  * [An example of double quotation marks usage]
36  * <pre>
37  * const string FRAGMENT_SHADER_SOURCE = \
38  * "  void main()\n"
39  * "  {\n"
40  * "    gl_FragColor = texture2D( sTexture, vTexCoord ) * uColor;\n"
41  * "  }\n";
42  * </pre><br/>
43  * [An example of DALI_COMPOSE_SHADER usage]
44  * <pre>
45  * const string VERTEX_SHADER_SOURCE = DALI_COMPOSE_SHADER (
46  *   void main()
47  *   {
48  *     gl_Position = uProjection * uModelView * vec4(aPosition, 1.0);
49  *     vTexCoord = aTexCoord;
50  *   }
51  * );
52  * </pre>
53  *
54  * @SINCE_1_1.43
55  */
56 #define DALI_COMPOSE_SHADER(STR) #STR
57
58 namespace Dali
59 {
60
61 namespace Internal DALI_INTERNAL
62 {
63 class Shader;
64 }
65
66 /**
67  * @brief Shaders allows custom vertex and color transformations in the GPU.
68  *
69  * @SINCE_1_1.43
70  */
71 class DALI_IMPORT_API Shader : public Handle
72 {
73 public:
74
75   /**
76    * @brief Hints for rendering.
77    * @SINCE_1_1.45
78    */
79   struct Hint
80   {
81     /**
82      * @brief Hint value
83      * @SINCE_1_1.45
84      */
85     enum Value
86     {
87       NONE                     = 0x00, ///< No hints                                                                          @SINCE_1_1.45
88       OUTPUT_IS_TRANSPARENT    = 0x01, ///< Might generate transparent alpha from opaque inputs                               @SINCE_1_1.45
89       MODIFIES_GEOMETRY        = 0x02, ///< Might change position of vertices, this option disables any culling optimizations @SINCE_1_1.45
90     };
91   };
92
93   /**
94    * @brief An enumeration of properties belonging to the Shader class.
95    * @SINCE_1_1.43
96    */
97   struct Property
98   {
99     enum
100     {
101       /**
102        * @brief Name: "program", Type: MAP
103        * @note  The default value is empty
104        * @note  Format: {"vertex":"","fragment":"",hints:"","vertexPrefix":"","fragmentPrefix":""}
105        * @SINCE_1_1.43
106        */
107       PROGRAM = DEFAULT_OBJECT_PROPERTY_START_INDEX
108     };
109   };
110
111   /**
112    * @brief Create Shader.
113    *
114    * @SINCE_1_1.43
115    * @param[in] vertexShader Vertex shader code for the effect. If you pass in an empty string, the default version will be used
116    * @param[in] fragmentShader fragment shader code for the effect. If you pass in an empty string, the default version will be used
117    * @param[in] hints GeometryHints to define the geometry of the rendered object
118    * @return A handle to a shader effect
119    */
120   static Shader New( const std::string& vertexShader,
121                      const std::string& fragmentShader,
122                      Hint::Value hints = Hint::NONE );
123
124   /**
125    * @brief Default constructor, creates an empty handle
126    *
127    * @SINCE_1_1.43
128    */
129   Shader();
130
131   /**
132    * @brief Destructor
133    * This is non-virtual since derived Handle types must not contain data or virtual methods.
134    *
135    * @SINCE_1_1.43
136    */
137   ~Shader();
138
139   /**
140    * @brief Copy constructor
141    *
142    * @SINCE_1_1.43
143    * @param[in] handle A handle to a Shader object
144    */
145   Shader( const Shader& handle );
146
147   /**
148    * @brief Downcast to a shader handle.
149    * If not a shader the returned shader handle is left uninitialized.
150    *
151    * @SINCE_1_1.43
152    * @param[in] handle Handle to an object
153    * @return Shader handle or an uninitialized handle
154    */
155   static Shader DownCast( BaseHandle handle );
156
157   /**
158    * @brief Assignment operator, changes this handle to point at the same object
159    *
160    * @SINCE_1_1.43
161    * @param[in] handle Handle to an object
162    * @return Reference to the assigned object
163    */
164   Shader& operator=( const Shader& handle );
165
166 public:
167
168   /**
169    * @brief This constructor is used by Dali New() methods.
170    * @note  Not intended for application developers.
171    * @SINCE_1_1.43
172    * @param[in] effect A pointer to a newly allocated Dali resource.
173    */
174   explicit DALI_INTERNAL Shader( Internal::Shader* effect );
175 };
176
177 } // namespace Dali
178
179 #endif // DALI_SHADER_H