/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2017 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.
uniform mediump mat4 uMvpMatrix;\n
uniform mediump vec3 uSize;\n
\n
+
+//Visual size and offset
+uniform mediump vec2 offset;\n
+uniform mediump vec2 size;\n
+uniform mediump vec4 offsetSizeMode;\n
+uniform mediump vec2 origin;\n
+uniform mediump vec2 anchorPoint;\n
+
+vec4 ComputeVertexPosition()\n
+{\n
+ vec2 visualSize = mix(uSize.xy*size, size, offsetSizeMode.zw );\n
+ vec2 visualOffset = mix( offset, offset/uSize.xy, offsetSizeMode.xy);\n
+ return vec4( (aPosition + anchorPoint)*visualSize + (visualOffset + origin)*uSize.xy, 0.0, 1.0 );\n
+}\n
+
void main()\n
{\n
- mediump vec4 vertexPosition = vec4(aPosition, 0.0, 1.0);\n
- vertexPosition.xyz *= uSize;\n
- gl_Position = uMvpMatrix * vertexPosition;\n
+ gl_Position = uMvpMatrix * ComputeVertexPosition();\n
}\n
);
const char* FRAGMENT_SHADER = DALI_COMPOSE_SHADER(\n
-uniform lowp vec4 uColor;\n
+ uniform lowp vec4 uColor;\n
+ uniform lowp vec3 mixColor;\n
+ uniform lowp float opacity;\n
\n
void main()\n
{\n
- gl_FragColor = uColor;\n
+ gl_FragColor = uColor * vec4( mixColor, opacity );\n
}\n
);
}
-WireframeVisualPtr WireframeVisual::New( VisualFactoryCache& factoryCache )
+WireframeVisualPtr WireframeVisual::New( VisualFactoryCache& factoryCache, const Property::Map& properties )
{
- return new WireframeVisual( factoryCache );
+ Visual::BasePtr emtptyVisual;
+
+ return New(factoryCache, emtptyVisual, properties);
}
-WireframeVisual::WireframeVisual( VisualFactoryCache& factoryCache )
-: Visual::Base( factoryCache )
+WireframeVisualPtr WireframeVisual::New( VisualFactoryCache& factoryCache, Visual::BasePtr actualVisual )
{
+ return new WireframeVisual( factoryCache, actualVisual );
}
-WireframeVisual::~WireframeVisual()
+WireframeVisualPtr WireframeVisual::New( VisualFactoryCache& factoryCache, Visual::BasePtr actualVisual, const Property::Map& properties )
{
+ WireframeVisualPtr wireframeVisual( new WireframeVisual( factoryCache, actualVisual ) );
+
+ // Instead of calling SetProperties, looking for the only valid property 'transform'
+ Property::Value* transformValue = properties.Find( Toolkit::Visual::Property::TRANSFORM, TRANSFORM );
+ Property::Map transformMap;
+ if( transformValue && transformValue->Get( transformMap ) )
+ {
+ wireframeVisual->SetTransformAndSize( transformMap, Vector2::ZERO );
+ }
+
+ return wireframeVisual;
}
-void WireframeVisual::DoSetProperties( const Property::Map& propertyMap )
+WireframeVisual::WireframeVisual( VisualFactoryCache& factoryCache, Visual::BasePtr actualVisual )
+: Visual::Base( factoryCache ),
+ mActualVisual( actualVisual )
{
- // no properties supported at the moment
}
-void WireframeVisual::DoSetOnStage( Actor& actor )
+WireframeVisual::~WireframeVisual()
{
- InitializeRenderer();
+}
- actor.AddRenderer( mImpl->mRenderer );
+float WireframeVisual::GetHeightForWidth( float width )
+{
+ if( mActualVisual )
+ {
+ return mActualVisual->GetHeightForWidth( width );
+ }
+ else
+ {
+ return Visual::Base::GetHeightForWidth( width );
+ }
+}
+
+void WireframeVisual::GetNaturalSize( Vector2& naturalSize )
+{
+ if( mActualVisual )
+ {
+ mActualVisual->GetNaturalSize( naturalSize );
+ }
+ else
+ {
+ Visual::Base::GetNaturalSize( naturalSize );
+ }
}
void WireframeVisual::DoCreatePropertyMap( Property::Map& map ) const
{
- map.Clear();
- map.Insert( Toolkit::Visual::Property::TYPE, Toolkit::Visual::WIREFRAME );
+ if( mActualVisual )
+ {
+ mActualVisual->CreatePropertyMap( map );
+ }
+ else
+ {
+ map.Clear();
+ map.Insert( Toolkit::Visual::Property::TYPE, Toolkit::Visual::WIREFRAME );
+ }
}
-void WireframeVisual::DoSetProperty( Dali::Property::Index index, const Dali::Property::Value& propertyValue )
+void WireframeVisual::DoCreateInstancePropertyMap( Property::Map& map ) const
{
- // TODO
+ // Do nothing
}
-Dali::Property::Value WireframeVisual::DoGetProperty( Dali::Property::Index index )
+void WireframeVisual::DoSetProperties( const Property::Map& propertyMap )
+{
+ Property::Value* mixValue = propertyMap.Find( Toolkit::Visual::Property::MIX_COLOR, MIX_COLOR );
+ if( mixValue )
+ {
+ Vector4 mixColor;
+ mixValue->Get( mixColor );
+ SetMixColor( mixColor );
+ }
+}
+
+void WireframeVisual::DoSetOnStage( Actor& actor )
{
- // TODO
- return Dali::Property::Value();
+ InitializeRenderer();
+
+ actor.AddRenderer( mImpl->mRenderer );
+
+ // Wireframe generated and ready to display
+ ResourceReady( Toolkit::Visual::ResourceStatus::READY );
}
void WireframeVisual::InitializeRenderer()
{
- mImpl->mRenderer = mFactoryCache.GetWireframeRenderer();
- if( !mImpl->mRenderer )
+ Shader shader = mFactoryCache.GetShader( VisualFactoryCache::WIREFRAME_SHADER );
+ if( !shader )
{
- Geometry geometry = CreateQuadWireframeGeometry();
- Shader shader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER );
+ shader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER );
+ mFactoryCache.SaveShader( VisualFactoryCache::WIREFRAME_SHADER, shader );
+ }
- mImpl->mRenderer = Renderer::New( geometry, shader);
- mFactoryCache.CacheWireframeRenderer( mImpl->mRenderer );
+ Geometry geometry = mFactoryCache.GetGeometry( VisualFactoryCache::WIREFRAME_GEOMETRY );
+ if( !geometry )
+ {
+ geometry = CreateQuadWireframeGeometry();
+ mFactoryCache.SaveGeometry( VisualFactoryCache::WIREFRAME_GEOMETRY, geometry );
}
+
+ //Create the renderer
+ mImpl->mRenderer = Renderer::New( geometry, shader);
+
+ //Register transform properties
+ mImpl->mTransform.RegisterUniforms( mImpl->mRenderer, Direction::LEFT_TO_RIGHT );
}
Geometry WireframeVisual::CreateQuadWireframeGeometry()
return geometry;
}
+void WireframeVisual::OnSetTransform()
+{
+ if( mImpl->mRenderer )
+ {
+ //Register transform properties
+ mImpl->mTransform.RegisterUniforms( mImpl->mRenderer, Direction::LEFT_TO_RIGHT );
+ }
+}
+
} // namespace Internal
} // namespace Toolkit