a736103a0b917b57fb170b6ae0eedaf3bc316bfd
[platform/core/uifw/dali-core.git] / dali / internal / event / rendering / shader-impl.h
1 #ifndef DALI_INTERNAL_SHADER_H
2 #define DALI_INTERNAL_SHADER_H
3
4 /*
5  * Copyright (c) 2017 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/common/dali-common.h> // DALI_ASSERT_ALWAYS
23 #include <dali/public-api/common/intrusive-ptr.h> // Dali::IntrusivePtr
24 #include <dali/public-api/rendering/shader.h> // Dali::Shader
25 #include <dali/internal/event/common/object-connector.h> // Dali::Internal::ObjectConnector
26 #include <dali/internal/event/common/object-impl.h> // Dali::Internal::Object
27 #include <dali/internal/common/shader-data.h> // ShaderPtr
28
29 namespace Dali
30 {
31 namespace Internal
32 {
33 namespace SceneGraph
34 {
35 class Shader;
36 }
37
38 class Shader;
39 typedef IntrusivePtr<Shader> ShaderPtr;
40
41 /**
42  * Shader is an object that contains an array of structures of values that
43  * can be accessed as properties.
44  */
45 class Shader : public Object
46 {
47 public:
48
49   /**
50    * @copydoc Dali::Shader::New()
51    */
52   static ShaderPtr New( const std::string& vertexShader,
53                         const std::string& fragmentShader,
54                         Dali::Shader::Hint::Value hints );
55
56   /**
57    * @brief Get the shader scene object
58    *
59    * @return the shader scene object
60    */
61   const SceneGraph::Shader* GetShaderSceneObject() const;
62
63   /**
64    * Retrieve the scene-graph shader added by this object.
65    * @return A pointer to the shader.
66    */
67   SceneGraph::Shader* GetShaderSceneObject();
68
69 public: // Default property extensions from Object
70
71   /**
72    * @copydoc Dali::Internal::Object::GetDefaultPropertyCount()
73    */
74   virtual unsigned int GetDefaultPropertyCount() const;
75
76   /**
77    * @copydoc Dali::Internal::Object::GetDefaultPropertyIndices()
78    */
79   virtual void GetDefaultPropertyIndices( Property::IndexContainer& indices ) const;
80
81   /**
82    * @copydoc Dali::Internal::Object::GetDefaultPropertyName()
83    */
84   virtual const char* GetDefaultPropertyName(Property::Index index) const;
85
86   /**
87    * @copydoc Dali::Internal::Object::GetDefaultPropertyIndex()
88    */
89   virtual Property::Index GetDefaultPropertyIndex(const std::string& name) const;
90
91   /**
92    * @copydoc Dali::Internal::Object::IsDefaultPropertyWritable()
93    */
94   virtual bool IsDefaultPropertyWritable(Property::Index index) const;
95
96   /**
97    * @copydoc Dali::Internal::Object::IsDefaultPropertyAnimatable()
98    */
99   virtual bool IsDefaultPropertyAnimatable(Property::Index index) const;
100
101   /**
102    * @copydoc Dali::Internal::Object::IsDefaultPropertyAConstraintInput()
103    */
104   virtual bool IsDefaultPropertyAConstraintInput( Property::Index index ) const;
105
106   /**
107    * @copydoc Dali::Internal::Object::GetDefaultPropertyType()
108    */
109   virtual Property::Type GetDefaultPropertyType(Property::Index index) const;
110
111   /**
112    * @copydoc Dali::Internal::Object::SetDefaultProperty()
113    */
114   virtual void SetDefaultProperty(Property::Index index, const Property::Value& propertyValue);
115
116   /**
117    * @copydoc Dali::Internal::Object::SetSceneGraphProperty()
118    */
119   virtual void SetSceneGraphProperty( Property::Index index, const PropertyMetadata& entry, const Property::Value& value );
120
121   /**
122    * @copydoc Dali::Internal::Object::GetDefaultProperty()
123    */
124   virtual Property::Value GetDefaultProperty( Property::Index index ) const;
125
126   /**
127    * @copydoc Dali::Internal::Object::GetDefaultPropertyCurrentValue()
128    */
129   virtual Property::Value GetDefaultPropertyCurrentValue( Property::Index index ) const;
130
131   /**
132    * @copydoc Dali::Internal::Object::GetPropertyOwner()
133    */
134   virtual const SceneGraph::PropertyOwner* GetPropertyOwner() const;
135
136   /**
137    * @copydoc Dali::Internal::Object::GetSceneObject()
138    */
139   virtual const SceneGraph::PropertyOwner* GetSceneObject() const;
140
141   /**
142    * @copydoc Dali::Internal::Object::GetSceneObjectAnimatableProperty()
143    */
144   virtual const SceneGraph::PropertyBase* GetSceneObjectAnimatableProperty( Property::Index index ) const;
145
146   /**
147    * @copydoc Dali::Internal::Object::GetSceneObjectInputProperty()
148    */
149   virtual const PropertyInputImpl* GetSceneObjectInputProperty( Property::Index index ) const;
150
151   /**
152    * @copydoc Dali::Internal::Object::GetPropertyComponentIndex()
153    */
154   virtual int GetPropertyComponentIndex( Property::Index index ) const;
155
156 private: // implementation
157   Shader();
158
159   /**
160    * Second stage initialization
161    */
162   void Initialize( const std::string& vertexShader, const std::string& fragmentShader, Dali::Shader::Hint::Value hints );
163
164 protected:
165   /**
166    * A reference counted object may only be deleted by calling Unreference()
167    */
168   virtual ~Shader();
169
170 private: // unimplemented methods
171   Shader( const Shader& );
172   Shader& operator=( const Shader& );
173
174 private:
175   SceneGraph::Shader* mSceneObject;
176   Internal::ShaderDataPtr mShaderData;
177 };
178
179 } // namespace Internal
180
181 // Helpers for public-api forwarding methods
182 inline Internal::Shader& GetImplementation( Dali::Shader& handle )
183 {
184   DALI_ASSERT_ALWAYS(handle && "Shader handle is empty");
185
186   BaseObject& object = handle.GetBaseObject();
187
188   return static_cast<Internal::Shader&>(object);
189 }
190
191 inline const Internal::Shader& GetImplementation( const Dali::Shader& handle )
192 {
193   DALI_ASSERT_ALWAYS(handle && "Shader handle is empty");
194
195   const BaseObject& object = handle.GetBaseObject();
196
197   return static_cast<const Internal::Shader&>(object);
198 }
199
200 } // namespace Dali
201
202 #endif // DALI_INTERNAL_SHADER_H