Merge "Update the refined dali c# application to support more argument options" into...
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / visuals / color / color-visual.cpp
1 /*
2  * Copyright (c) 2016 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 // CLASS HEADER
19 #include "color-visual.h"
20
21 // EXTERNAL INCLUDES
22 #include <dali/integration-api/debug.h>
23
24 //INTERNAL INCLUDES
25 #include <dali-toolkit/public-api/visuals/color-visual-properties.h>
26 #include <dali-toolkit/internal/visuals/visual-factory-impl.h>
27 #include <dali-toolkit/internal/visuals/visual-factory-cache.h>
28 #include <dali-toolkit/internal/visuals/visual-string-constants.h>
29 #include <dali-toolkit/internal/visuals/visual-base-data-impl.h>
30
31 namespace Dali
32 {
33
34 namespace Toolkit
35 {
36
37 namespace Internal
38 {
39
40 namespace
41 {
42 const char * const COLOR_NAME("mixColor");
43
44 const char* VERTEX_SHADER = DALI_COMPOSE_SHADER(
45   attribute mediump vec2 aPosition;\n
46   uniform mediump mat4 uMvpMatrix;\n
47   uniform mediump vec3 uSize;\n
48   \n
49   void main()\n
50   {\n
51     mediump vec4 vertexPosition = vec4(aPosition, 0.0, 1.0);\n
52     vertexPosition.xyz *= uSize;\n
53     gl_Position = uMvpMatrix * vertexPosition;\n
54   }\n
55 );
56
57 const char* FRAGMENT_SHADER = DALI_COMPOSE_SHADER(
58   uniform lowp vec4 uColor;\n
59   uniform lowp vec4 mixColor;\n
60   \n
61   void main()\n
62   {\n
63     gl_FragColor = mixColor*uColor;\n
64   }\n
65 );
66 }
67
68 ColorVisualPtr ColorVisual::New( VisualFactoryCache& factoryCache )
69 {
70   return new ColorVisual( factoryCache );
71 }
72
73 ColorVisual::ColorVisual( VisualFactoryCache& factoryCache )
74 : Visual::Base( factoryCache ),
75   mMixColorIndex( Property::INVALID_INDEX )
76 {
77 }
78
79 ColorVisual::~ColorVisual()
80 {
81 }
82
83 void ColorVisual::DoSetProperties( const Property::Map& propertyMap )
84 {
85   Property::Value* color = propertyMap.Find( Toolkit::ColorVisual::Property::MIX_COLOR, COLOR_NAME );
86   if( !( color && color->Get(mMixColor) ) )
87   {
88     DALI_LOG_ERROR( "Fail to provide a color to the ColorVisual object\n" );
89   }
90 }
91
92 void ColorVisual::SetSize( const Vector2& size )
93 {
94   Visual::Base::SetSize( size );
95
96   // ToDo: renderer responds to the size change
97 }
98
99 void ColorVisual::DoSetOnStage( Actor& actor )
100 {
101   InitializeRenderer();
102
103   actor.AddRenderer( mImpl->mRenderer );
104 }
105
106 void ColorVisual::DoCreatePropertyMap( Property::Map& map ) const
107 {
108   map.Clear();
109   map.Insert( Toolkit::Visual::Property::TYPE, Toolkit::Visual::COLOR );
110   map.Insert( Toolkit::ColorVisual::Property::MIX_COLOR, mMixColor );
111 }
112
113 void ColorVisual::DoSetProperty( Dali::Property::Index index, const Dali::Property::Value& propertyValue )
114 {
115   // TODO
116   /* David Steele comented :
117
118      Some things to bear in mind:
119
120      We currently keep a copy of the mix color in the ColorVisual object, which is then used to instantiate the registered property on the renderer.
121
122      The user can get the renderer and animate the mixColor property (it's registered, so is automatically a scene-graph property).
123
124      The GetProperty method will have to read from the renderer, or from the cached value in the Visual, and the SetProperty will have to write to cache and to the renderer if present.
125   */
126 }
127
128 Dali::Property::Value ColorVisual::DoGetProperty( Dali::Property::Index index )
129 {
130   // TODO
131   return Dali::Property::Value();
132 }
133
134 void ColorVisual::InitializeRenderer()
135 {
136   Geometry geometry = mFactoryCache.GetGeometry( VisualFactoryCache::QUAD_GEOMETRY );
137   if( !geometry )
138   {
139     geometry =  VisualFactoryCache::CreateQuadGeometry();
140     mFactoryCache.SaveGeometry( VisualFactoryCache::QUAD_GEOMETRY, geometry );
141   }
142
143   Shader shader = mFactoryCache.GetShader( VisualFactoryCache::COLOR_SHADER );
144   if( !shader )
145   {
146     shader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER );
147     mFactoryCache.SaveShader( VisualFactoryCache::COLOR_SHADER, shader );
148   }
149
150   mImpl->mRenderer = Renderer::New( geometry, shader );
151
152   mMixColorIndex = mImpl->mRenderer.RegisterProperty( Toolkit::ColorVisual::Property::MIX_COLOR, COLOR_NAME, mMixColor );
153   if( mMixColor.a < 1.f )
154   {
155     mImpl->mRenderer.SetProperty( Renderer::Property::BLEND_MODE, BlendMode::ON );
156   }
157 }
158
159 void ColorVisual::SetColor(const Vector4& color)
160 {
161   mMixColor = color;
162
163   if( mImpl->mRenderer )
164   {
165     (mImpl->mRenderer).SetProperty( mMixColorIndex, color );
166     if( color.a < 1.f )
167     {
168       mImpl->mRenderer.SetProperty( Renderer::Property::BLEND_MODE, BlendMode::ON );
169     }
170   }
171 }
172
173 } // namespace Internal
174
175 } // namespace Toolkit
176
177 } // namespace Dali