X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Fpublic-api%2Fshader-effects%2Fshader-effect.h;h=ed0d44f1ddef097ba2071f576842efcac3a58d3f;hb=refs%2Fchanges%2F12%2F57712%2F4;hp=d84bfff6934c1fe6bfd75899b716af4dd6686ce3;hpb=961d9deaed9265389c6ff5fa86c5b4df2bb06a98;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/public-api/shader-effects/shader-effect.h b/dali/public-api/shader-effects/shader-effect.h index d84bfff..ed0d44f 100644 --- a/dali/public-api/shader-effects/shader-effect.h +++ b/dali/public-api/shader-effects/shader-effect.h @@ -2,7 +2,7 @@ #define __DALI_SHADER_EFFECT_H__ /* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * Copyright (c) 2015 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,11 +19,15 @@ */ // INTERNAL INCLUDES -#include -#include +#include +#include namespace Dali { +/** + * @addtogroup dali_core_shader_effects + * @{ + */ /** * @brief DALI_COMPOSE_SHADER macro provides a convenient way to write shader source code. @@ -43,14 +47,14 @@ namespace Dali * const string VERTEX_SHADER_SOURCE = DALI_COMPOSE_SHADER ( * void main() * { - * gl_Position = uProjection * uModelView * vec4(aPosition, 1.0); - * vTexCoord = aTexCoord; + * gl_Position = uMvpMatrix * vec4(aPosition*uSize.xy, 0.0, 1.0); + * vTexCoord = mix( uTextureRect.xy, uTextureRect.zw, aPosition + vec2(0.5) ); * } * ); + * @SINCE_1_0.0 */ #define DALI_COMPOSE_SHADER(STR) #STR -class Constraint; class Image; struct Vector2; struct Vector3; @@ -62,18 +66,9 @@ class ShaderEffect; } /** - * @brief GeometryType determines how geometry is shaped. - */ -enum GeometryType -{ - GEOMETRY_TYPE_IMAGE = 0x01, ///< image, with flat color or texture - GEOMETRY_TYPE_UNTEXTURED_MESH = 0x02,///< Complex meshes, with flat color - GEOMETRY_TYPE_TEXTURED_MESH = 0x04, ///< Complex meshes, with texture - GEOMETRY_TYPE_LAST = 0x08 -}; - -/** - * @brief Shader effects provide a visual effect for actors. + * @DEPRECATED_1_0.47 + * + * @brief Shader effects provide a visual effect for image actors. * * For a Custom shader you can provide the vertex and fragment shader code as strings. * These shader snippets get concatenated with the default attributes and uniforms. @@ -96,8 +91,8 @@ enum GeometryType *
  * void main()
  * {
- *   gl_Position = uProjection * uModelView * vec4(aPosition, 1.0);
- *   vTexCoord = aTexCoord;
+ *     gl_Position = uMvpMatrix * vec4(aPosition*uSize.xy, 0.0, 1.0);
+ *     vTexCoord = mix( uTextureRect.xy, uTextureRect.zw, aPosition + vec2(0.5) );
  * }
  * 
* For fragment shader the default part for images contains the following code: @@ -113,33 +108,16 @@ enum GeometryType * Note: In order for fade and color animations to work, the fragment shader needs to multiply the fragment color * with the uniform color "uColor" of the node * + * @SINCE_1_0.0 */ -class DALI_IMPORT_API ShaderEffect : public Constrainable +class DALI_IMPORT_API ShaderEffect : public Handle { public: - /** - * @brief The Extension class is a base class for objects that can be attached to the - * ShaderEffects as extensions. - * - * Extensions are useful to create pimpled implementations of custom shaders. - * The shader effect will hold an intrusive pointer to the extension. - */ - class Extension : public RefObject - { - protected: - /** - * @brief Disable default constructor. This a base class is not meant to be initialised on its own. - */ - Extension(); - - /** - * @brief Virtual destructor. - */ - virtual ~Extension(); - }; // Default Properties - /* Grid Density defines the spacing of vertex coordinates in world units. + /** + * @brief An enumeration of properties belonging to the ShaderEffect class. + * Grid Density defines the spacing of vertex coordinates in world units. * ie a larger actor will have more grids at the same spacing. * * +---+---+ +---+---+---+ @@ -149,26 +127,34 @@ public: * +---+---+ +---+---+---+ * | | | | * +---+---+---+ + * @SINCE_1_0.0 */ - static const Property::Index GRID_DENSITY; ///< name "grid-density", type FLOAT - static const Property::Index IMAGE; ///< name "image", type MAP; {"filename":"", "load-policy":...} - static const Property::Index PROGRAM; ///< name "program", type MAP; {"vertex-prefix":"","fragment-prefix":"","vertex":"","fragment":""} - static const Property::Index GEOMETRY_HINTS; ///< name "geometry-hints", type INT (bitfield) values from enum GeometryHints + struct Property + { + enum + { + GRID_DENSITY = DEFAULT_ACTOR_PROPERTY_START_INDEX, ///< name "gridDensity", type float @SINCE_1_0.0 + IMAGE, ///< name "image", type Map {"filename":"", "loadPolicy":...} @SINCE_1_0.0 + PROGRAM, ///< name "program", type Map {"vertexPrefix":"","fragmentPrefix":"","vertex":"","fragment":""} @SINCE_1_0.0 + GEOMETRY_HINTS ///< name "geometryHints", type int (bitfield) values from enum GeometryHints @SINCE_1_0.0 + }; + }; - static const float DEFAULT_GRID_DENSITY; ///< The default density is 40 pixels + static const float DEFAULT_GRID_DENSITY; ///< The default density is 40 pixels /** * @brief Hints for rendering/subdividing geometry. + * @SINCE_1_0.0 */ enum GeometryHints { - HINT_NONE = 0x00, ///< no hints - HINT_GRID_X = 0x01, ///< Geometry must be subdivided in X - HINT_GRID_Y = 0x02, ///< Geometry must be subdivided in Y + HINT_NONE = 0x00, ///< no hints @SINCE_1_0.0 + HINT_GRID_X = 0x01, ///< Geometry must be subdivided in X @SINCE_1_0.0 + HINT_GRID_Y = 0x02, ///< Geometry must be subdivided in Y @SINCE_1_0.0 HINT_GRID = (HINT_GRID_X | HINT_GRID_Y), - HINT_DEPTH_BUFFER = 0x04, ///< Needs depth buffering turned on - HINT_BLENDING = 0x08, ///< Notifies the actor to use blending even if it's fully opaque. Needs actor's blending set to BlendingMode::AUTO - HINT_DOESNT_MODIFY_GEOMETRY = 0x10 ///< Notifies that the vertex shader will not change geometry (enables bounding box culling) + HINT_DEPTH_BUFFER = 0x04, ///< Needs depth buffering turned on @SINCE_1_0.0 + 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 + HINT_DOESNT_MODIFY_GEOMETRY = 0x10 ///< Notifies that the vertex shader will not change geometry (enables bounding box culling) @SINCE_1_0.0 }; /** @@ -178,42 +164,43 @@ public: * Use this coordinate type if your are doing a transformation in view space. * The texture coordinate type converts a value in actor local space to texture coodinates. * This is useful for pixel shaders and accounts for texture atlas. + * @SINCE_1_0.0 */ enum UniformCoordinateType { - COORDINATE_TYPE_DEFAULT, ///< Default, No transformation to be applied - COORDINATE_TYPE_VIEWPORT_POSITION, ///< The uniform is a position vector in viewport coordinates that needs to be converted to GL view space coordinates. - COORDINATE_TYPE_VIEWPORT_DIRECTION ///< The uniform is a directional vector in viewport coordinates that needs to be converted to GL view space coordinates. + COORDINATE_TYPE_DEFAULT, ///< @brief Default, No transformation to be applied @SINCE_1_0.0 + 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 + 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 }; /** * @brief Create an empty ShaderEffect. * * This can be initialised with ShaderEffect::New(...) + * @SINCE_1_0.0 */ ShaderEffect(); /** * @brief Create ShaderEffect. * + * @SINCE_1_0.0 * @param vertexShader code for the effect. If you pass in an empty string, the default version will be used * @param fragmentShader code for the effect. If you pass in an empty string, the default version will be used - * @param type GeometryType to define the shape of the geometry * @param hints GeometryHints to define the geometry of the rendered object * @return A handle to a shader effect */ static ShaderEffect New( const std::string& vertexShader, const std::string& fragmentShader, - GeometryType type = GeometryType(GEOMETRY_TYPE_IMAGE), GeometryHints hints = GeometryHints(HINT_NONE) ); /** * @brief Create ShaderEffect. + * @SINCE_1_0.0 * @param vertexShaderPrefix code for the effect. It will be inserted before the default uniforms (ideal for \#defines) * @param vertexShader code for the effect. If you pass in an empty string, the default version will be used * @param fragmentShaderPrefix code for the effect. It will be inserted before the default uniforms (ideal for \#defines) * @param fragmentShader code for the effect. If you pass in an empty string, the default version will be used - * @param type GeometryType to define the shape of the geometry * @param hints GeometryHints to define the geometry of the rendered object * @return A handle to a shader effect */ @@ -221,7 +208,6 @@ public: const std::string& vertexShader, const std::string& fragmentShaderPrefix, const std::string& fragmentShader, - GeometryType type = GeometryType(GEOMETRY_TYPE_IMAGE), GeometryHints hints = GeometryHints(HINT_NONE) ); /** @@ -230,6 +216,7 @@ public: * If handle points to a ShaderEffect the downcast produces valid * handle. If not the returned handle is left uninitialized. * + * @SINCE_1_0.0 * @param[in] handle to An object * @return handle to a ShaderEffect object or an uninitialized handle */ @@ -239,12 +226,14 @@ public: * @brief Destructor * * This is non-virtual since derived Handle types must not contain data or virtual methods. + * @SINCE_1_0.0 */ ~ShaderEffect(); /** * @brief Copy constructor * + * @SINCE_1_0.0 * @param object A reference to a ShaderEffect object */ ShaderEffect(const ShaderEffect& object); @@ -252,6 +241,7 @@ public: /** * @brief This assignment operator is required for (smart) pointer semantics. * + * @SINCE_1_0.0 * @param [in] rhs A reference to the copied handle * @return A reference to this */ @@ -263,6 +253,7 @@ public: * This image texture will be bound to the "sEffect" sampler * so it can be used in fragment shader for effects * + * @SINCE_1_0.0 * @param[in] image to use as effect texture */ void SetEffectImage( Image image ); @@ -271,10 +262,11 @@ public: * @brief Set a uniform value. * This will register a property of type Property::FLOAT; see Object::RegisterProperty() for more details. * If name matches a uniform in the shader source, this value will be uploaded when rendering. - * @pre Either the property name is not in use, or a property exists with the correct name & type. + * @SINCE_1_0.0 * @param name The name of the uniform. * @param value The value to to set. * @param uniformCoordinateType The coordinate type of the uniform. + * @pre Either the property name is not in use, or a property exists with the correct name & type. */ void SetUniform( const std::string& name, float value, @@ -285,10 +277,11 @@ public: * * This will register a property of type Property::VECTOR2; see Object::RegisterProperty() for more details. * If name matches a uniform in the shader source, this value will be uploaded when rendering. - * @pre Either the property name is not in use, or a property exists with the correct name & type. + * @SINCE_1_0.0 * @param name The name of the uniform. * @param value The value to to set. * @param uniformCoordinateType The coordinate type of the uniform. + * @pre Either the property name is not in use, or a property exists with the correct name & type. */ void SetUniform( const std::string& name, Vector2 value, @@ -299,10 +292,11 @@ public: * * This will register a property of type Property::VECTOR3; see Object::RegisterProperty() for more details. * If name matches a uniform in the shader source, this value will be uploaded when rendering. - * @pre Either the property name is not in use, or a property exists with the correct name & type. + * @SINCE_1_0.0 * @param name The name of the uniform. * @param value The value to to set. * @param uniformCoordinateType The coordinate type of the uniform. + * @pre Either the property name is not in use, or a property exists with the correct name & type. */ void SetUniform( const std::string& name, Vector3 value, @@ -313,10 +307,11 @@ public: * * This will register a property of type Property::VECTOR4; see Object::RegisterProperty() for more details. * If name matches a uniform in the shader source, this value will be uploaded when rendering. - * @pre Either the property name is not in use, or a property exists with the correct name & type. + * @SINCE_1_0.0 * @param name The name of the uniform. * @param value The value to to set. * @param uniformCoordinateType The coordinate type of the uniform. + * @pre Either the property name is not in use, or a property exists with the correct name & type. */ void SetUniform( const std::string& name, Vector4 value, @@ -327,10 +322,11 @@ public: * * This will register a property of type Property::MATRIX; see Object::RegisterProperty() for more details. * If name matches a uniform in the shader source, this value will be uploaded when rendering. - * @pre Either the property name is not in use, or a property exists with the correct name & type. + * @SINCE_1_0.0 * @param name The name of the uniform. * @param value The value to to set. * @param uniformCoordinateType The coordinate type of the uniform. + * @pre Either the property name is not in use, or a property exists with the correct name & type. */ void SetUniform( const std::string& name, const Matrix& value, @@ -341,53 +337,29 @@ public: * * This will register a property of type Property::MATRIX3; see Object::RegisterProperty() for more details. * If name matches a uniform in the shader source, this value will be uploaded when rendering. - * @pre Either the property name is not in use, or a property exists with the correct name & type. + * @SINCE_1_0.0 * @param name The name of the uniform. * @param value The value to to set. * @param uniformCoordinateType The coordinate type of the uniform. + * @pre Either the property name is not in use, or a property exists with the correct name & type. */ void SetUniform( const std::string& name, const Matrix3& value, UniformCoordinateType uniformCoordinateType = UniformCoordinateType(COORDINATE_TYPE_DEFAULT) ); - /** - * @brief Attach an extension object. - * - * This object is reference counted and will be automatically deleted. - * This object can be retrieved back with the GetExtension function. - * @param object Pointer to a Extension. - * @pre extension is not NULL - */ - void AttachExtension( Extension *object ); - - /** - * @brief Retrieve the attached extension object. - * - * This object can be set with the AttachExtension function. - * @return implementation Pointer to a Extension. - * @pre An extension needs to be attached previously. - */ - Extension& GetExtension(); - - /** - * @brief Retrieve the attached extension object. - * - * This object can be set with the AttachExtension function. - * @return implementation Pointer to a Extension. - * @pre An extension needs to be attached previously. - */ - const Extension& GetExtension() const; - - public: // Not intended for application developers /** * @brief This constructor is used by Dali New() methods. + * @SINCE_1_0.0 * @param [in] effect A pointer to a newly allocated Dali resource. */ explicit DALI_INTERNAL ShaderEffect(Internal::ShaderEffect* effect); }; +/** + * @} + */ } // namespace Dali #endif // __DALI_SHADER_EFFECT_H__