*/
// INTERNAL INCLUDES
-#include <dali/public-api/object/ref-object.h>
-#include <dali/public-api/shader-effects/shader-effect.h>
+#include <dali/public-api/images/image.h>
+#include <dali/devel-api/shader-effects/shader-effect.h>
+#include <dali/internal/event/actors/actor-impl.h>
#include <dali/internal/event/effects/shader-declarations.h>
-#include <dali/internal/event/common/proxy-object.h>
-#include <dali/internal/render/shaders/uniform-meta.h>
-#include <dali/internal/event/resources/resource-ticket.h>
-#include <dali/internal/render/shaders/shader.h>
-
+#include <dali/internal/event/common/object-impl.h>
+#include <dali/internal/event/rendering/shader-impl.h>
namespace Dali
{
namespace Internal
{
-class ShaderFactory;
-
-namespace SceneGraph
-{
-class UpdateManager;
-}
-
/**
- * An abstract base class for a shader effect proxy.
+ * An abstract base class for a shader effect object.
* The corresponding scene-graph object is a collection of shader programs,
* which can apply the same effect to different geometry types.
*/
-class ShaderEffect : public ProxyObject
+class ShaderEffect : public Object
{
public:
-
typedef Dali::ShaderEffect::UniformCoordinateType UniformCoordinateType;
/**
* @param hints GeometryHints to define the geometry of the rendered object
* @return A smart-pointer to a newly allocated shader effect.
*/
- static ShaderEffectPtr New(Dali::ShaderEffect::GeometryHints hints = Dali::ShaderEffect::HINT_NONE);
+ static ShaderEffectPtr New( Dali::ShaderEffect::GeometryHints hints = Dali::ShaderEffect::HINT_NONE );
/**
- * Create a new ShaderEffect
- * @param vertexShader code for the effect. If empty, the default version will be used
- * @param fragmentShader code for the effect. If empty, the default version will be used
- * @param type GeometryType
- * @param hints GeometryHints to define the geometry of the rendered object
- * @return A smart-pointer to a newly allocated shader effect.
+ * @copydoc Dali::ShaderEffect::SetEffectImage
*/
- static ShaderEffectPtr New( const std::string& vertexShader,
- const std::string& fragmentShader,
- GeometryType type,
- Dali::ShaderEffect::GeometryHints hints );
- /**
- * Create a new ShaderEffect
- * @param vertexShaderPrefix code for the effect. It will be inserted before the default uniforms.
- * @param vertexShader code for the effect. If empty, the default version will be used
- * @param fragmentShaderPrefix code for the effect. It will be inserted before the default uniforms.
- * @param fragmentShader code for the effect. If empty, the default version will be used
- * @param type GeometryType
- * @param hints GeometryHints to define the geometry of the rendered object
- * @return A smart-pointer to a newly allocated shader effect.
+ void SetEffectImage( Dali::Image image );
+
+ /**
+ * @copydoc Dali::ShaderEffect::SetUniform( const std::string& name, Property::Value value, UniformCoordinateType uniformCoordinateType )
*/
- static ShaderEffectPtr NewWithPrefix( const std::string& vertexShaderPrefix,
- const std::string& vertexShader,
- const std::string& fragmentShaderPrefix,
- const std::string& fragmentShader,
- GeometryType type,
- Dali::ShaderEffect::GeometryHints hints );
-
- /**
- * Create a new ShaderEffect.
- * If you pass in an empty string in the following arguments, the default version will be used instead.
- * @param imageVertexShader code for the effect.
- * @param imageFragmentShader code for the effect.
- * @param textVertexShader code for the effect.
- * @param textFragmentShader code for the effect.
- * @param texturedMeshVertexShader code for the effect.
- * @param texturedMeshFragmentShader code for the effect.
- * @param meshVertexShader code for the effect.
- * @param meshFragmentShader code for the effect.
- * @param hints GeometryHints to define the geometry of the rendered object
- * @return A handle to a shader effect
+ void SetUniform( const std::string& name,
+ Property::Value value,
+ UniformCoordinateType uniformCoordinateType );
+
+ /**
+ * Add a GeometryType specific default program to this ShaderEffect
+ * @param[in] geometryType The GeometryType rendered by the shader program
+ * @param[in] vertexSource The source code for the vertex shader
+ * @param[in] fragmentSource The source code for the fragment shader
*/
- static ShaderEffectPtr New( const std::string& imageVertexShader,
- const std::string& imageFragmentShader,
- const std::string& textVertexShader,
- const std::string& textFragmentShader,
- const std::string& texturedMeshVertexShader,
- const std::string& texturedMeshFragmentShader,
- const std::string& meshVertexShader,
- const std::string& meshFragmentShader,
- Dali::ShaderEffect::GeometryHints hints );
+ void SetPrograms( const std::string& vertexSource, const std::string& fragmentSource );
/**
- * Creates object with data from the property value map
- * @param [in] map The property value map with fields such as 'vertex-filename' '..'
- * @return a pointer to a newly created object.
+ * Add a default program to this ShaderEffect.
+ * This overload allows the optional prefixing for both the vertex and fragment shader.
+ * A useful prefix may be shader \#defines for conditional compilation.
+ * @param[in] vertexPrefix The prefix source code for the vertex shader
+ * @param[in] fragmentPrefix The prefix source code for the fragment shader
+ * @param[in] vertexSource The source code for the vertex shader
+ * @param[in] fragmentSource The source code for the fragment shader
*/
- static ShaderEffectPtr New( const Property::Value& map );
+ void SetPrograms( const std::string& vertexPrefix, const std::string& fragmentPrefix,
+ const std::string& vertexSource, const std::string& fragmentSource );
/**
- * @copydoc Dali::ShaderEffect::SetEffectImage
+ * @brief Notify ShaderEffect that it's being used by an Actor.
+ *
+ * @param[in] actor The Actor that is connecting to this ShaderEffect
*/
- void SetEffectImage( Dali::Image image );
+ void Connect( ActorPtr actor );
/**
- * @copydoc Dali::ShaderEffect::SetUniform( const std::string& name, Property::Value value, UniformCoordinateType uniformCoordinateType )
+ * @brief Notify ShaderEffect that an Actor is no longer using it.
+ *
+ * @param[in] actor The Actor that is disconnecting from this ShaderEffect
*/
- void SetUniform( const std::string& name,
- Property::Value value,
- UniformCoordinateType uniformCoordinateType );
+ void Disconnect( ActorPtr actor );
+
+public:
/**
- * @copydoc Dali::ShaderEffect::AttachExtension()
+ * Returns the shader for this ShaderEffect
+ *
+ * @return Returns the shader for this ShaderEffect
*/
- void AttachExtension( Dali::ShaderEffect::Extension *object );
+ ShaderPtr GetShader() const { return mShader; }
/**
- * @copydoc Dali::ShaderEffect::GetExtension()
+ * Returns the geometry grid size.
+ *
+ * @param[in] size The pixel area size.
+ * @return Returns the geometry grid size
*/
- Dali::ShaderEffect::Extension& GetExtension();
+ Vector2 GetGridSize( const Vector2& size );
/**
- * @copydoc Dali::ShaderEffect::GetExtension() const
+ * Returns the effect image for this ShaderEffect
+ *
+ * @return Returns the effect image for this ShaderEffect
*/
- const Dali::ShaderEffect::Extension& GetExtension() const;
+ Dali::Image GetEffectImage() const { return mEffectImage; }
- enum FixedVertexShader
- {
- FLEXIBLE,
- FIXED,
- };
+public: // override property functions from Object
/**
- * Add a GeometryType specific default program to this ShaderEffect
- * @param[in] geometryType The GeometryType rendered by the shader program
- * @param[in] subType The subtype, one of ShaderSubTypes.
- * @param[in] vertexSource The source code for the vertex shader
- * @param[in] fragmentSource The source code for the fragment shader
+ * @copydoc Dali::Handle::GetPropertyCount()
*/
- void SetProgram( GeometryType geometryType, ShaderSubTypes subType,
- const std::string& vertexSource, const std::string& fragmentSource,
- FixedVertexShader fixedVertexShader=FLEXIBLE);
+ virtual unsigned int GetPropertyCount() const;
/**
- * Add a GeometryType specific default program to this ShaderEffect.
- * This overload allows the optional prefixing for both the vertex and fragment shader.
- * A useful prefix may be shader \#defines for conditional compilation.
- * @param[in] geometryType The GeometryType rendered by the shader program
- * @param[in] subType The subtype, one of ShaderSubTypes.
- * @param[in] vertexPrefix The prefix source code for the vertex shader
- * @param[in] fragmentPrefix The prefix source code for the fragment shader
- * @param[in] vertexSource The source code for the vertex shader
- * @param[in] fragmentSource The source code for the fragment shader
- * @param[in] fixedVertexShader True if this shader doesn't change the vertices
+ * @copydoc Dali::Handle::GetPropertyName()
*/
- void SetProgram( GeometryType geometryType, ShaderSubTypes subType,
- const std::string& vertexPrefix, const std::string& fragmentPrefix,
- const std::string& vertexSource, const std::string& fragmentSource,
- FixedVertexShader fixedVertexShader=FLEXIBLE);
+ virtual std::string GetPropertyName( Property::Index index ) const;
/**
- * Notify ShaderEffect that it's being used by an Actor.
+ * @copydoc Dali::Handle::GetPropertyIndex()
*/
- void Connect();
+ virtual Property::Index GetPropertyIndex( const std::string& name ) const;
/**
- * Notify ShaderEffect that an Actor is no longer using it.
+ * @copydoc Dali::Handle::IsPropertyWritable()
*/
- void Disconnect();
+ virtual bool IsPropertyWritable( Property::Index index ) const;
-public: // Default property extensions from ProxyObject
+ /**
+ * @copydoc Dali::Handle::IsPropertyAnimatable()
+ */
+ virtual bool IsPropertyAnimatable( Property::Index index ) const;
/**
- * @copydoc Dali::Internal::ProxyObject::IsSceneObjectRemovable()
+ * @copydoc Dali::Handle::IsPropertyAConstraintInput()
*/
- virtual bool IsSceneObjectRemovable() const;
+ virtual bool IsPropertyAConstraintInput( Property::Index index ) const;
/**
- * @copydoc Dali::Internal::ProxyObject::GetDefaultPropertyCount()
+ * @copydoc Dali::Handle::GetPropertyType()
+ */
+ virtual Property::Type GetPropertyType( Property::Index index ) const;
+
+ /**
+ * @copydoc Dali::Handle::SetProperty()
+ */
+ virtual void SetProperty( Property::Index index, const Property::Value& propertyValue );
+
+ /**
+ * @copydoc Dali::Handle::GetProperty()
+ */
+ virtual Property::Value GetProperty( Property::Index index ) const;
+
+ /**
+ * @copydoc Dali::Handle::GetPropertyIndices()
+ */
+ virtual void GetPropertyIndices( Property::IndexContainer& indices ) const;
+
+ /**
+ * @copydoc Dali::Handle::RegisterProperty()
+ */
+ virtual Property::Index RegisterProperty( const std::string& name, const Property::Value& propertyValue );
+
+ /**
+ * @copydoc Dali::Handle::RegisterProperty(std::string name, Property::Value propertyValue, Property::AccessMode accessMode)
+ */
+ virtual Property::Index RegisterProperty( const std::string& name, const Property::Value& propertyValue, Property::AccessMode accessMode );
+
+ /**
+ * @copydoc Dali::Handle::AddPropertyNotification()
+ */
+ virtual Dali::PropertyNotification AddPropertyNotification( Property::Index index,
+ int componentIndex,
+ const Dali::PropertyCondition& condition );
+
+ /**
+ * @copydoc Dali::Handle::RemovePropertyNotification()
+ */
+ virtual void RemovePropertyNotification( Dali::PropertyNotification propertyNotification );
+
+ /**
+ * @copydoc Dali::Handle::RemovePropertyNotifications()
+ */
+ virtual void RemovePropertyNotifications();
+
+public: // Default property extensions from Object
+ /**
+ * @copydoc Dali::Internal::Object::GetDefaultPropertyCount()
*/
virtual unsigned int GetDefaultPropertyCount() const;
/**
- * @copydoc Dali::Internal::ProxyObject::GetDefaultPropertyIndices()
+ * @copydoc Dali::Internal::Object::GetDefaultPropertyIndices()
*/
virtual void GetDefaultPropertyIndices( Property::IndexContainer& indices ) const;
/**
- * @copydoc Dali::Internal::ProxyObject::GetDefaultPropertyName()
+ * @copydoc Dali::Internal::Object::GetDefaultPropertyName()
*/
- virtual const std::string& GetDefaultPropertyName( Property::Index index ) const;
+ virtual const char* GetDefaultPropertyName( Property::Index index ) const;
/**
- * @copydoc Dali::Internal::ProxyObject::GetDefaultPropertyIndex()
+ * @copydoc Dali::Internal::Object::GetDefaultPropertyIndex()
*/
virtual Property::Index GetDefaultPropertyIndex( const std::string& name ) const;
/**
- * @copydoc Dali::Internal::ProxyObject::IsDefaultPropertyWritable()
+ * @copydoc Dali::Internal::Object::IsDefaultPropertyWritable()
*/
virtual bool IsDefaultPropertyWritable( Property::Index index ) const;
/**
- * @copydoc Dali::Internal::ProxyObject::IsDefaultPropertyAnimatable()
+ * @copydoc Dali::Internal::Object::IsDefaultPropertyAnimatable()
*/
virtual bool IsDefaultPropertyAnimatable( Property::Index index ) const;
/**
- * @copydoc Dali::Internal::ProxyObject::IsDefaultPropertyAConstraintInput()
+ * @copydoc Dali::Internal::Object::IsDefaultPropertyAConstraintInput()
*/
virtual bool IsDefaultPropertyAConstraintInput( Property::Index index ) const;
/**
- * @copydoc Dali::Internal::ProxyObject::GetDefaultPropertyType()
+ * @copydoc Dali::Internal::Object::GetDefaultPropertyType()
*/
virtual Property::Type GetDefaultPropertyType( Property::Index index ) const;
/**
- * @copydoc Dali::Internal::ProxyObject::SetDefaultProperty()
+ * @copydoc Dali::Internal::Object::SetDefaultProperty()
*/
virtual void SetDefaultProperty( Property::Index index, const Property::Value& propertyValue );
/**
- * @copydoc Dali::Internal::ProxyObject::GetDefaultProperty()
+ * @copydoc Dali::Internal::Object::GetDefaultProperty()
*/
virtual Property::Value GetDefaultProperty( Property::Index index ) const;
/**
- * @copydoc Dali::Internal::ProxyObject::InstallSceneObjectProperty()
- */
- virtual void InstallSceneObjectProperty( SceneGraph::PropertyBase& newProperty, const std::string& name, unsigned int index );
-
- /**
- * @copydoc Dali::Internal::ProxyObject::GetSceneObject()
+ * @copydoc Dali::Internal::Object::GetSceneObject()
*/
virtual const SceneGraph::PropertyOwner* GetSceneObject() const;
/**
- * @copydoc Dali::Internal::ProxyObject::GetSceneObjectAnimatableProperty()
+ * @copydoc Dali::Internal::Object::GetSceneObjectAnimatableProperty()
*/
virtual const SceneGraph::PropertyBase* GetSceneObjectAnimatableProperty( Property::Index index ) const;
/**
- * @copydoc Dali::Internal::ProxyObject::GetSceneObjectInputProperty()
+ * @copydoc Dali::Internal::Object::GetSceneObjectInputProperty()
*/
virtual const PropertyInputImpl* GetSceneObjectInputProperty( Property::Index index ) const;
+ /**
+ * @copydoc Dali::Internal::Object::GetPropertyComponentIndex()
+ */
+ virtual int GetPropertyComponentIndex( Property::Index index ) const;
+
protected:
/**
* Protected constructor.
+ * @param[in] hints Geometry hints
*/
- ShaderEffect( SceneGraph::UpdateManager& updateManager, ShaderFactory& shaderFactory, SceneGraph::Shader& sceneObject );
+ ShaderEffect( Dali::ShaderEffect::GeometryHints hints );
/**
* A reference counted object may only be deleted by calling Unreference()
ShaderEffect( const ShaderEffect& );
ShaderEffect& operator=( const ShaderEffect& rhs );
- /**
- * Set the given program for all shader types set in the geometryType bitfield.
- * @param[in] geometryType A GeometryType bitfield
- * @param[in] vertexShaderPrefix The prefix source code for the vertex shader
- * @param[in] vertexShader The source code for the vertex shader
- * @param[in] fragmentShaderPrefix The prefix source code for the fragment shader
- * @param[in] fragmentShader The source code for the fragment shader
- */
- void SetPrograms( GeometryType geometryTypes,
- const std::string& vertexShaderPrefix,
- const std::string& vertexShader,
- const std::string& fragmentShaderPrefix,
- const std::string& fragmentShader );
-
- /**
- * Wrap the given prefix and body code around the predefined prefix source for the
- * given geometry type. Specifying an empty string for the body code means that the
- * predefined body code is used instead.
- *
- * @param[in] geometryType The GeometryType rendered by the shader program
- * @param[in] subType The subtype, one of ShaderSubTypes.
- * @param[in] vertexPrefix The prefix source code for the vertex shader
- * @param[in] fragmentPrefix The prefix source code for the fragment shader
- * @param[in] vertexSource The source code for the vertex shader
- * @param[in] fragmentSource The source code for the fragment shader
- */
- void SetWrappedProgram( GeometryType geometryType, ShaderSubTypes subType,
- const std::string& vertexPrefix, const std::string& fragmentPrefix,
- const std::string& vertexSource, const std::string& fragmentSource );
-
- /**
- * Send shader program to scene-graph object.
- * Uses the shader hints to determine whether the vertices are fixed.
- * @param[in] geometryType The GeometryType rendered by the shader program
- * @param[in] subType The subtype, one of ShaderSubTypes.
- * @param[in] vertexSource The source code for the vertex shader
- * @param[in] fragmentSource The source code for the fragment shader
- * @param[in] fixedVertexShader True if this shader doesn't change the vertices
- */
- void SetProgramImpl( GeometryType geometryType, ShaderSubTypes subType,
- const std::string& vertexSource, const std::string& fragmentSource,
- FixedVertexShader fixedVertexShader );
-
private: // Data
+ std::vector< ActorPtr > mConnectedActors; ///< The array of actors that are currently connected to this ShaderEffect
+ ShaderPtr mShader; ///< The shader pointer
+ Dali::Image mEffectImage; ///< The Client-side handle to the effect image
+ float mGridDensity; ///< The grid denisty
+ Dali::ShaderEffect::GeometryHints mGeometryHints; ///< shader geometry hints for building the geometry
- SceneGraph::UpdateManager& mUpdateManager; ///< reference to the update manager
- ShaderFactory& mShaderFactory; ///< reference to the shader factory
-
- SceneGraph::Shader* mSceneObject; ///< pointer to the scene shader, should not be changed on this thread
-
- Dali::Image mImage; ///< Client-side handle for the effect image
-
- CustomUniformMetaLookup mCustomMetadata; ///< Used for accessing metadata for custom Shader properties
-
- IntrusivePtr<Dali::ShaderEffect::Extension> mExtension;
-
- std::vector<ResourceTicketPtr> mTickets; ///< Collection of shader program tickets
-
- unsigned int mConnectionCount; ///< number of on-stage ImageActors using this shader effect
-
- // Default properties
- typedef std::map<std::string, Property::Index> DefaultPropertyLookup;
- static DefaultPropertyLookup* mDefaultPropertyLookup;
};
} // namespace Internal