Change the precision of size and uSize from mediumP to highP
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / visuals / wireframe / wireframe-visual.cpp
index b65f67c..3707465 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
@@ -42,82 +42,163 @@ const char * const INDEX_NAME("indices");
 
 const char* VERTEX_SHADER = DALI_COMPOSE_SHADER(
 attribute mediump vec2  aPosition;\n
-uniform   mediump mat4  uMvpMatrix;\n
-uniform   mediump vec3  uSize;\n
+uniform   highp   mat4  uMvpMatrix;\n
+uniform   highp   vec3  uSize;\n
 \n
+
+//Visual size and offset
+uniform mediump vec2 offset;\n
+uniform highp   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
 \n
 void main()\n
 {\n
-  gl_FragColor = uColor;\n
+  gl_FragColor = uColor * vec4( mixColor, 1.0 );\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, Visual::FittingMode::FILL, actualVisual ? actualVisual->GetType() : Toolkit::Visual::WIREFRAME ),
+  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
+{
+  // Do nothing
+}
+
+void WireframeVisual::DoSetProperties( const Property::Map& propertyMap )
 {
-  // TODO
+  Property::Value* mixValue = propertyMap.Find( Toolkit::Visual::Property::MIX_COLOR, MIX_COLOR );
+  if( mixValue )
+  {
+    Vector4 mixColor;
+    mixValue->Get( mixColor );
+    SetMixColor( mixColor );
+  }
 }
 
-Dali::Property::Value WireframeVisual::DoGetProperty( Dali::Property::Index index )
+void WireframeVisual::DoSetOnScene( 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()
@@ -135,7 +216,7 @@ Geometry WireframeVisual::CreateQuadWireframeGeometry()
 
   Property::Map quadVertexFormat;
   quadVertexFormat[POSITION_ATTRIBUTE_NAME] = Property::VECTOR2;
-  PropertyBuffer quadVertices = PropertyBuffer::New( quadVertexFormat );
+  VertexBuffer quadVertices = VertexBuffer::New( quadVertexFormat );
   quadVertices.SetData( quadVertexData, 4 );
 
   // Create indices
@@ -150,6 +231,25 @@ Geometry WireframeVisual::CreateQuadWireframeGeometry()
   return geometry;
 }
 
+void WireframeVisual::OnSetTransform()
+{
+  if( mImpl->mRenderer )
+  {
+    //Register transform properties
+    mImpl->mTransform.RegisterUniforms( mImpl->mRenderer, Direction::LEFT_TO_RIGHT );
+  }
+}
+
+Visual::Base& WireframeVisual::GetVisualObject()
+{
+  if( mActualVisual )
+  {
+    return *mActualVisual.Get();
+  }
+
+  return *this;
+}
+
 } // namespace Internal
 
 } // namespace Toolkit