Apply the new doxygen tagging rule for @DEPRECATED
[platform/core/uifw/dali-core.git] / dali / public-api / shader-effects / shader-effect.h
1 #ifndef __DALI_SHADER_EFFECT_H__
2 #define __DALI_SHADER_EFFECT_H__
3
4 /*
5  * Copyright (c) 2015 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 // INTERNAL INCLUDES
22 #include <dali/public-api/object/handle.h>
23 #include <dali/public-api/object/property-index-ranges.h>
24
25 namespace Dali
26 {
27 /**
28  * @addtogroup dali_core_shader_effects
29  * @{
30  */
31
32 /**
33  * @brief DALI_COMPOSE_SHADER macro provides a convenient way to write shader source code.
34  *
35  * We normally use double quotation marks to write a string such as "Hello World".
36  * However many symbols are needed to add multiple lines of string.
37  * We don't need to write quotation marks using this macro at every line.
38  *
39  * [An example of double quotation marks usage]
40  * const string FRAGMENT_SHADER_SOURCE = \
41  * "  void main()\n"
42  * "  {\n"
43  * "    gl_FragColor = texture2D( sTexture, vTexCoord ) * uColor;\n"
44  * "  }\n";
45  *
46  * [An example of DALI_COMPOSE_SHADER usage]
47  * const string VERTEX_SHADER_SOURCE = DALI_COMPOSE_SHADER (
48  *   void main()
49  *   {
50  *     gl_Position = uMvpMatrix * vec4(aPosition*uSize.xy, 0.0, 1.0);
51  *     vTexCoord = mix( uTextureRect.xy, uTextureRect.zw, aPosition + vec2(0.5) );
52  *   }
53  * );
54  * @SINCE_1_0.0
55  */
56 #define DALI_COMPOSE_SHADER(STR) #STR
57
58 class Image;
59 struct Vector2;
60 struct Vector3;
61 struct Vector4;
62
63 namespace Internal DALI_INTERNAL
64 {
65 class ShaderEffect;
66 }
67
68 /**
69  * @DEPRECATED_1_0.47
70  *
71  * @brief Shader effects provide a visual effect for image actors.
72  *
73  * For a Custom shader you can provide the vertex and fragment shader code as strings.
74  * These shader snippets get concatenated with the default attributes and uniforms.
75  * For a vertex shader this part contains the following code:
76  * <pre>
77  * precision highp float;
78  * attribute vec3  aPosition;
79  * attribute vec2  aTexCoord;
80  * uniform   mat4  uMvpMatrix;
81  * uniform   mat4  uModelMatrix;
82  * uniform   mat4  uViewMatrix;
83  * uniform   mat4  uModelView;
84  * uniform   mat3  uNormalMatrix;
85  * uniform   mat4  uProjection;
86  * uniform   vec4  uColor;
87  * varying   vec2  vTexCoord;
88  * </pre>
89  * The custom shader part is expected to output the vertex position and texture coordinate.
90  * A basic custom vertex shader would contain the following code:
91  * <pre>
92  * void main()
93  * {
94  *     gl_Position = uMvpMatrix * vec4(aPosition*uSize.xy, 0.0, 1.0);
95  *     vTexCoord = mix( uTextureRect.xy, uTextureRect.zw, aPosition + vec2(0.5) );
96  * }
97  * </pre>
98  * For fragment shader the default part for images contains the following code:
99  * <pre>
100  * precision mediump float;
101  * uniform   sampler2D sTexture;
102  * uniform   sampler2D sEffect;
103  * uniform   vec4      uColor;
104  * varying   vec2      vTexCoord;
105  * </pre>
106  * <BR>
107  * <B>
108  * Note: In order for fade and color animations to work, the fragment shader needs to multiply the fragment color
109  * with the uniform color "uColor" of the node
110  * </B>
111  * @SINCE_1_0.0
112  */
113 class DALI_IMPORT_API ShaderEffect : public Handle
114 {
115 public:
116
117   // Default Properties
118   /**
119    * @brief An enumeration of properties belonging to the ShaderEffect class.
120    * Grid Density defines the spacing of vertex coordinates in world units.
121    * ie a larger actor will have more grids at the same spacing.
122    *
123    *  +---+---+         +---+---+---+
124    *  |   |   |         |   |   |   |
125    *  +---+---+         +---+---+---+
126    *  |   |   |         |   |   |   |
127    *  +---+---+         +---+---+---+
128    *                    |   |   |   |
129    *                    +---+---+---+
130    * @SINCE_1_0.0
131    */
132   struct Property
133   {
134     enum
135     {
136       GRID_DENSITY = DEFAULT_ACTOR_PROPERTY_START_INDEX, ///< name "gridDensity",    type float @SINCE_1_0.0
137       IMAGE,                                             ///< name "image",          type Map {"filename":"", "loadPolicy":...} @SINCE_1_0.0
138       PROGRAM,                                           ///< name "program",        type Map {"vertexPrefix":"","fragmentPrefix":"","vertex":"","fragment":""} @SINCE_1_0.0
139       GEOMETRY_HINTS                                     ///< name "geometryHints",  type int (bitfield) values from enum GeometryHints @SINCE_1_0.0
140     };
141   };
142
143   static const float DEFAULT_GRID_DENSITY;              ///< The default density is 40 pixels
144
145   /**
146    * @brief Hints for rendering/subdividing geometry.
147    * @SINCE_1_0.0
148    */
149   enum GeometryHints
150   {
151     HINT_NONE           = 0x00,   ///< no hints @SINCE_1_0.0
152     HINT_GRID_X         = 0x01,   ///< Geometry must be subdivided in X @SINCE_1_0.0
153     HINT_GRID_Y         = 0x02,   ///< Geometry must be subdivided in Y @SINCE_1_0.0
154     HINT_GRID           = (HINT_GRID_X | HINT_GRID_Y),
155     HINT_DEPTH_BUFFER   = 0x04,   ///< Needs depth buffering turned on @SINCE_1_0.0
156     HINT_BLENDING       = 0x08,   ///< Notifies the actor to use blending even if it's fully opaque. Needs actor's blending set to BlendingMode::AUTO @SINCE_1_0.0
157     HINT_DOESNT_MODIFY_GEOMETRY = 0x10 ///< Notifies that the vertex shader will not change geometry (enables bounding box culling) @SINCE_1_0.0
158   };
159
160   /**
161    * @brief Coordinate type of the shader uniform.
162    *
163    * Viewport coordinate types will convert from viewport to view space.
164    * Use this coordinate type if your are doing a transformation in view space.
165    * The texture coordinate type converts a value in actor local space to texture coodinates.
166    * This is useful for pixel shaders and accounts for texture atlas.
167    * @SINCE_1_0.0
168    */
169   enum UniformCoordinateType
170   {
171     COORDINATE_TYPE_DEFAULT,           ///< @brief Default, No transformation to be applied @SINCE_1_0.0
172     COORDINATE_TYPE_VIEWPORT_POSITION, ///< @DEPRECATED_1_1.11 @brief The uniform is a position vector in viewport coordinates that needs to be converted to GL view space coordinates. @SINCE_1_0.0
173     COORDINATE_TYPE_VIEWPORT_DIRECTION ///< @DEPRECATED_1_1.11 @brief The uniform is a directional vector in viewport coordinates that needs to be converted to GL view space coordinates. @SINCE_1_0.0
174   };
175
176   /**
177    * @brief Create an empty ShaderEffect.
178    *
179    * This can be initialised with ShaderEffect::New(...)
180    * @SINCE_1_0.0
181    */
182   ShaderEffect();
183
184   /**
185    * @brief Create ShaderEffect.
186    *
187    * @SINCE_1_0.0
188    * @param vertexShader code for the effect. If you pass in an empty string, the default version will be used
189    * @param fragmentShader code for the effect. If you pass in an empty string, the default version will be used
190    * @param hints GeometryHints to define the geometry of the rendered object
191    * @return A handle to a shader effect
192    */
193   static ShaderEffect New( const std::string& vertexShader,
194                            const std::string& fragmentShader,
195                            GeometryHints hints = GeometryHints(HINT_NONE) );
196
197   /**
198    * @brief Create ShaderEffect.
199    * @SINCE_1_0.0
200    * @param vertexShaderPrefix code for the effect. It will be inserted before the default uniforms (ideal for \#defines)
201    * @param vertexShader code for the effect. If you pass in an empty string, the default version will be used
202    * @param fragmentShaderPrefix code for the effect. It will be inserted before the default uniforms (ideal for \#defines)
203    * @param fragmentShader code for the effect. If you pass in an empty string, the default version will be used
204    * @param hints GeometryHints to define the geometry of the rendered object
205    * @return A handle to a shader effect
206    */
207   static ShaderEffect NewWithPrefix(const std::string& vertexShaderPrefix,
208                                     const std::string& vertexShader,
209                                     const std::string& fragmentShaderPrefix,
210                                     const std::string& fragmentShader,
211                                     GeometryHints hints = GeometryHints(HINT_NONE) );
212
213   /**
214    * @brief Downcast an Object handle to ShaderEffect.
215    *
216    * If handle points to a ShaderEffect the downcast produces valid
217    * handle. If not the returned handle is left uninitialized.
218    *
219    * @SINCE_1_0.0
220    * @param[in] handle to An object
221    * @return handle to a ShaderEffect object or an uninitialized handle
222    */
223   static ShaderEffect DownCast( BaseHandle handle );
224
225   /**
226    * @brief Destructor
227    *
228    * This is non-virtual since derived Handle types must not contain data or virtual methods.
229    * @SINCE_1_0.0
230    */
231   ~ShaderEffect();
232
233   /**
234    * @brief Copy constructor
235    *
236    * @SINCE_1_0.0
237    * @param object A reference to a ShaderEffect object
238    */
239   ShaderEffect(const ShaderEffect& object);
240
241   /**
242    * @brief This assignment operator is required for (smart) pointer semantics.
243    *
244    * @SINCE_1_0.0
245    * @param [in] rhs  A reference to the copied handle
246    * @return A reference to this
247    */
248   ShaderEffect& operator=(const ShaderEffect& rhs);
249
250   /**
251    * @brief Sets image for using as effect texture.
252    *
253    * This image texture will be bound to the "sEffect" sampler
254    * so it can be used in fragment shader for effects
255    *
256    * @SINCE_1_0.0
257    * @param[in] image to use as effect texture
258    */
259   void SetEffectImage( Image image );
260
261   /**
262    * @brief Set a uniform value.
263    * This will register a property of type Property::FLOAT; see Object::RegisterProperty() for more details.
264    * If name matches a uniform in the shader source, this value will be uploaded when rendering.
265    * @SINCE_1_0.0
266    * @param name The name of the uniform.
267    * @param value The value to to set.
268    * @param uniformCoordinateType The coordinate type of the uniform.
269    * @pre Either the property name is not in use, or a property exists with the correct name & type.
270    */
271   void SetUniform( const std::string& name,
272                    float value,
273                    UniformCoordinateType uniformCoordinateType = UniformCoordinateType(COORDINATE_TYPE_DEFAULT) );
274
275   /**
276    * @brief Set a uniform value.
277    *
278    * This will register a property of type Property::VECTOR2; see Object::RegisterProperty() for more details.
279    * If name matches a uniform in the shader source, this value will be uploaded when rendering.
280    * @SINCE_1_0.0
281    * @param name The name of the uniform.
282    * @param value The value to to set.
283    * @param uniformCoordinateType The coordinate type of the uniform.
284    * @pre Either the property name is not in use, or a property exists with the correct name & type.
285    */
286   void SetUniform( const std::string& name,
287                    Vector2 value,
288                    UniformCoordinateType uniformCoordinateType = UniformCoordinateType(COORDINATE_TYPE_DEFAULT) );
289
290   /**
291    * @brief Set a uniform value.
292    *
293    * This will register a property of type Property::VECTOR3; see Object::RegisterProperty() for more details.
294    * If name matches a uniform in the shader source, this value will be uploaded when rendering.
295    * @SINCE_1_0.0
296    * @param name The name of the uniform.
297    * @param value The value to to set.
298    * @param uniformCoordinateType The coordinate type of the uniform.
299    * @pre Either the property name is not in use, or a property exists with the correct name & type.
300    */
301   void SetUniform( const std::string& name,
302                    Vector3 value,
303                    UniformCoordinateType uniformCoordinateType = UniformCoordinateType(COORDINATE_TYPE_DEFAULT) );
304
305   /**
306    * @brief Set a uniform value.
307    *
308    * This will register a property of type Property::VECTOR4; see Object::RegisterProperty() for more details.
309    * If name matches a uniform in the shader source, this value will be uploaded when rendering.
310    * @SINCE_1_0.0
311    * @param name The name of the uniform.
312    * @param value The value to to set.
313    * @param uniformCoordinateType The coordinate type of the uniform.
314    * @pre Either the property name is not in use, or a property exists with the correct name & type.
315    */
316   void SetUniform( const std::string& name,
317                    Vector4 value,
318                    UniformCoordinateType uniformCoordinateType = UniformCoordinateType(COORDINATE_TYPE_DEFAULT) );
319
320   /**
321    * @brief Set a uniform value.
322    *
323    * This will register a property of type Property::MATRIX; see Object::RegisterProperty() for more details.
324    * If name matches a uniform in the shader source, this value will be uploaded when rendering.
325    * @SINCE_1_0.0
326    * @param name The name of the uniform.
327    * @param value The value to to set.
328    * @param uniformCoordinateType The coordinate type of the uniform.
329    * @pre Either the property name is not in use, or a property exists with the correct name & type.
330    */
331   void SetUniform( const std::string& name,
332                    const Matrix& value,
333                    UniformCoordinateType uniformCoordinateType = UniformCoordinateType(COORDINATE_TYPE_DEFAULT) );
334
335   /**
336    * @brief Set a uniform value.
337    *
338    * This will register a property of type Property::MATRIX3; see Object::RegisterProperty() for more details.
339    * If name matches a uniform in the shader source, this value will be uploaded when rendering.
340    * @SINCE_1_0.0
341    * @param name The name of the uniform.
342    * @param value The value to to set.
343    * @param uniformCoordinateType The coordinate type of the uniform.
344    * @pre Either the property name is not in use, or a property exists with the correct name & type.
345    */
346   void SetUniform( const std::string& name,
347                    const Matrix3& value,
348                    UniformCoordinateType uniformCoordinateType = UniformCoordinateType(COORDINATE_TYPE_DEFAULT) );
349
350 public: // Not intended for application developers
351
352   /**
353    * @brief This constructor is used by Dali New() methods.
354    * @SINCE_1_0.0
355    * @param [in] effect A pointer to a newly allocated Dali resource.
356    */
357   explicit DALI_INTERNAL ShaderEffect(Internal::ShaderEffect* effect);
358 };
359
360 /**
361  * @}
362  */
363 } // namespace Dali
364
365 #endif // __DALI_SHADER_EFFECT_H__