2 * Copyright (c) 2016 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 #include "color-visual.h"
22 #include <dali/integration-api/debug.h>
25 #include <dali-toolkit/public-api/visuals/color-visual-properties.h>
26 #include <dali-toolkit/devel-api/visual-factory/devel-visual-properties.h>
27 #include <dali-toolkit/internal/visuals/visual-factory-impl.h>
28 #include <dali-toolkit/internal/visuals/visual-factory-cache.h>
29 #include <dali-toolkit/internal/visuals/visual-string-constants.h>
30 #include <dali-toolkit/internal/visuals/visual-base-data-impl.h>
43 const char * const COLOR_NAME("mixColor");
45 const char* VERTEX_SHADER = DALI_COMPOSE_SHADER(
46 attribute mediump vec2 aPosition;\n
47 uniform mediump mat4 uMvpMatrix;\n
48 uniform mediump vec3 uSize;\n
51 //Visual size and offset
52 uniform mediump vec2 offset;\n
53 uniform mediump vec2 size;\n
54 uniform mediump vec4 offsetSizeMode;\n
55 uniform mediump vec2 origin;\n
56 uniform mediump vec2 anchorPoint;\n
58 vec4 ComputeVertexPosition()\n
60 vec2 visualSize = mix(uSize.xy*size, size, offsetSizeMode.zw );\n
61 vec2 visualOffset = mix( offset, offset/uSize.xy, offsetSizeMode.xy);\n
62 return vec4( (aPosition + anchorPoint)*visualSize + (visualOffset + origin)*uSize.xy, 0.0, 1.0 );\n
67 gl_Position = uMvpMatrix * ComputeVertexPosition();\n
71 const char* FRAGMENT_SHADER = DALI_COMPOSE_SHADER(
72 uniform lowp vec4 uColor;\n
73 uniform lowp vec4 mixColor;\n
77 gl_FragColor = mixColor*uColor;\n
82 ColorVisualPtr ColorVisual::New( VisualFactoryCache& factoryCache )
84 return new ColorVisual( factoryCache );
87 ColorVisual::ColorVisual( VisualFactoryCache& factoryCache )
88 : Visual::Base( factoryCache ),
89 mMixColorIndex( Property::INVALID_INDEX )
93 ColorVisual::~ColorVisual()
97 void ColorVisual::DoSetProperties( const Property::Map& propertyMap )
99 Property::Value* color = propertyMap.Find( Toolkit::ColorVisual::Property::MIX_COLOR, COLOR_NAME );
100 if( !( color && color->Get(mMixColor) ) )
102 DALI_LOG_ERROR( "Fail to provide a color to the ColorVisual object\n" );
106 void ColorVisual::DoSetOnStage( Actor& actor )
108 InitializeRenderer();
110 actor.AddRenderer( mImpl->mRenderer );
113 void ColorVisual::DoCreatePropertyMap( Property::Map& map ) const
116 map.Insert( Toolkit::VisualProperty::TYPE, Toolkit::Visual::COLOR );
117 map.Insert( Toolkit::ColorVisual::Property::MIX_COLOR, mMixColor );
120 void ColorVisual::DoSetProperty( Dali::Property::Index index, const Dali::Property::Value& propertyValue )
123 /* David Steele comented :
125 Some things to bear in mind:
127 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.
129 The user can get the renderer and animate the mixColor property (it's registered, so is automatically a scene-graph property).
131 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.
135 Dali::Property::Value ColorVisual::DoGetProperty( Dali::Property::Index index )
138 return Dali::Property::Value();
141 void ColorVisual::OnSetTransform()
143 if( mImpl->mRenderer )
145 mImpl->mTransform.RegisterUniforms( mImpl->mRenderer, Direction::LEFT_TO_RIGHT );
149 void ColorVisual::InitializeRenderer()
151 Geometry geometry = mFactoryCache.GetGeometry( VisualFactoryCache::QUAD_GEOMETRY );
154 geometry = VisualFactoryCache::CreateQuadGeometry();
155 mFactoryCache.SaveGeometry( VisualFactoryCache::QUAD_GEOMETRY, geometry );
158 Shader shader = mFactoryCache.GetShader( VisualFactoryCache::COLOR_SHADER );
161 shader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER );
162 mFactoryCache.SaveShader( VisualFactoryCache::COLOR_SHADER, shader );
165 mImpl->mRenderer = Renderer::New( geometry, shader );
167 mMixColorIndex = mImpl->mRenderer.RegisterProperty( Toolkit::ColorVisual::Property::MIX_COLOR, COLOR_NAME, mMixColor );
168 if( mMixColor.a < 1.f )
170 mImpl->mRenderer.SetProperty( Renderer::Property::BLEND_MODE, BlendMode::ON );
173 //Register transform properties
174 mImpl->mTransform.RegisterUniforms( mImpl->mRenderer, Direction::LEFT_TO_RIGHT );
177 void ColorVisual::SetColor(const Vector4& color)
181 if( mImpl->mRenderer )
183 (mImpl->mRenderer).SetProperty( mMixColorIndex, color );
186 mImpl->mRenderer.SetProperty( Renderer::Property::BLEND_MODE, BlendMode::ON );
191 } // namespace Internal
193 } // namespace Toolkit