Convert more shaders in dali-toolkit and dali-scene-loader to use shader compilation...
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / visuals / animated-gradient / animated-gradient-visual.cpp
index f20286c..9b4bc8c 100755 (executable)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017 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.
 
 //INTERNAL INCLUDES
 #include <dali-toolkit/devel-api/visuals/animated-gradient-visual-properties-devel.h>
+#include <dali-toolkit/public-api/visuals/visual-properties.h>
 #include <dali-toolkit/devel-api/visuals/visual-properties-devel.h>
 #include <dali-toolkit/internal/visuals/visual-factory-impl.h>
 #include <dali-toolkit/internal/visuals/visual-factory-cache.h>
 #include <dali-toolkit/internal/visuals/visual-string-constants.h>
 #include <dali-toolkit/internal/visuals/visual-base-data-impl.h>
+#include <dali-toolkit/internal/graphics/builtin-shader-extern-gen.h>
 
 namespace Dali
 {
@@ -36,37 +38,6 @@ namespace Internal
 
 namespace
 {
-// non-animated property
-const char* const GRADIENT_TYPE_NAME("gradientType");
-const char* const UNIT_TYPE_NAME("unitType");
-const char* const SPREAD_TYPE_NAME("spreadType");
-// animated property
-const char* const START_POSITION_NAME("startPosition");
-const char* const START_COLOR_NAME("startColor");
-const char* const END_POSITION_NAME("endPosition");
-const char* const END_COLOR_NAME("endColor");
-const char* const ROTATE_CENTER_NAME("rotateCenter");
-const char* const ROTATE_AMOUNT_NAME("rotateAmount");
-const char* const OFFSET_NAME("offset");
-// animation parameter property
-const char* const START_VALUE_NAME("startValue");
-const char* const TARGET_VALUE_NAME("targetValue");
-const char* const DIRECTION_TYPE_NAME("directionType");
-const char* const DURATION_NAME("duration");
-const char* const DELAY_NAME("delay");
-const char* const REPEAT_NAME("repeat");
-const char* const REPEAT_DELAY_NAME("repeatDelay");
-const char* const MOTION_TYPE_NAME("motionType");
-const char* const EASING_TYPE_NAME("easingType");
-// common shader property
-const char* const UNIFORM_START_POINT_NAME("start_point");
-const char* const UNIFORM_START_COLOR_NAME("start_color");
-const char* const UNIFORM_END_POINT_NAME("end_point");
-const char* const UNIFORM_END_COLOR_NAME("end_color");
-const char* const UNIFORM_ROTATE_CENTER_NAME("rotate_center");
-const char* const UNIFORM_ROTATE_ANGLE_NAME("rotate_angle");
-const char* const UNIFORM_OFFSET_NAME("gradient_offset");
-
 DALI_ENUM_TO_STRING_TABLE_BEGIN( GRADIENT_TYPE )
 DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::DevelAnimatedGradientVisual::GradientType, LINEAR )
 DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::DevelAnimatedGradientVisual::GradientType, RADIAL )
@@ -123,89 +94,6 @@ const Toolkit::DevelAnimatedGradientVisual::AnimationParameter::DirectionType::T
 const Toolkit::DevelAnimatedGradientVisual::AnimationParameter::MotionType::Type    DEFAULT_ANIMATION_MOTION_TYPE    = Toolkit::DevelAnimatedGradientVisual::AnimationParameter::MotionType::LOOP;
 const Toolkit::DevelAnimatedGradientVisual::AnimationParameter::EasingType::Type    DEFAULT_ANIMATION_EASING_TYPE    = Toolkit::DevelAnimatedGradientVisual::AnimationParameter::EasingType::LINEAR;
 
-const char* const BASIC_VERTEX_SHADER = DALI_COMPOSE_SHADER(
-  attribute mediump vec2 aPosition;
-  uniform mediump mat4 uMvpMatrix;
-  uniform mediump vec3 uSize;
-
-  uniform mediump vec2 start_point;
-  uniform mediump vec2 end_point;
-  uniform mediump vec2 rotate_center;
-  uniform mediump float rotate_angle;
-
-  varying mediump vec2 vTexCoord;
-  varying mediump vec2 vStart;
-  varying mediump vec2 vEnd;
-
-  vec2 rotate(vec2 x, vec2 c, float a)
-  {
-    vec2 d = x - c;
-    vec2 r = vec2(d.x * cos(a) - d.y * sin(a), d.x * sin(a) + d.y * cos(a));
-
-\n  #ifdef UNIT_TYPE_BOUNDING_BOX \n return r + c;             \n #endif \n /* UnitType::OBJECT_BOUNDING_BOX */
-\n  #ifdef UNIT_TYPE_USER         \n return (r + c) / uSize.x; \n #endif \n /* UnitType::USER_SPACE          */
-  }
-
-  //Visual size and offset
-  uniform mediump vec2 offset;
-  uniform mediump vec2 size;
-  uniform mediump vec4 offsetSizeMode;
-  uniform mediump vec2 origin;
-  uniform mediump vec2 anchorPoint;
-
-  vec4 ComputeVertexPosition()
-  {
-    vec2 visualSize = mix( uSize.xy*size, size, offsetSizeMode.zw );
-    vec2 visualOffset = mix( offset, offset/uSize.xy, offsetSizeMode.xy );
-    return vec4( (aPosition + anchorPoint)*visualSize + (visualOffset + origin)*uSize.xy, 0.0, 1.0 );
-  }
-
-  void main()
-  {
-    vStart = rotate( start_point, rotate_center, rotate_angle );
-    vEnd = rotate( end_point, rotate_center, rotate_angle );
-    gl_Position = uMvpMatrix * ComputeVertexPosition();
-
-\n  #ifdef UNIT_TYPE_BOUNDING_BOX \n vTexCoord = vec2(aPosition.x, -aPosition.y);                     \n #endif \n /* UnitType::OBJECT_BOUNDING_BOX */
-\n  #ifdef UNIT_TYPE_USER         \n vTexCoord = vec2(aPosition.x, -aPosition.y * uSize.y / uSize.x); \n #endif \n /* UnitType::USER_SPACE          */
-  }
-);
-
-const char* const BASIC_FRAGMENT_SHADER = DALI_COMPOSE_SHADER(
-  precision mediump float;
-
-  uniform mediump vec4 start_color;
-  uniform mediump vec4 end_color;
-  uniform mediump float gradient_offset;
-
-  varying mediump vec2 vTexCoord;
-  varying mediump vec2 vStart;
-  varying mediump vec2 vEnd;
-
-  float get_position(vec2 x, vec2 s, vec2 e)
-  {
-    vec2 df = e - s;
-    vec2 dx = x - s;
-
-\n  #ifdef GRADIENT_TYPE_LINEAR \n return dot(dx,df)/dot(df,df);       \n #endif \n /* GradientType::LINEAR */
-\n  #ifdef GRADIENT_TYPE_RADIAL \n return sqrt(dot(dx,dx)/dot(df,df)); \n #endif \n /* GradientType::RADIAL */
-  }
-  float recalculate(float r)
-  {
-\n  #ifdef SPREAD_TYPE_REFLECT \n return 1.0 - abs(mod(r, 2.0) - 1.0); \n #endif \n /* SpreadType::REFLECT */
-\n  #ifdef SPREAD_TYPE_REPEAT  \n return fract(r);                     \n #endif \n /* SpreadType::REPEAT  */
-\n  #ifdef SPREAD_TYPE_CLAMP   \n return clamp(r, 0.0, 1.0);           \n #endif \n /* SpreadType::CLAMP   */
-  }
-
-  void main()
-  {
-    float r = get_position( vTexCoord, vStart, vEnd );
-    r = recalculate( r + gradient_offset );
-    vec4 color = mix( start_color, end_color, r );
-    gl_FragColor = color;
-  }
-);
-
 Property::Value GetStartValue( const Property::Map& map, Property::Index index, const char* const name )
 {
   // Get start value of animation parameter
@@ -245,7 +133,8 @@ AnimatedGradientVisualPtr AnimatedGradientVisual::New( VisualFactoryCache& facto
   return animatedGradientVisualPtr;
 }
 
-AnimatedGradientVisual::AnimatedGradientVisual( VisualFactoryCache& factoryCache ) : Visual::Base( factoryCache )
+AnimatedGradientVisual::AnimatedGradientVisual( VisualFactoryCache& factoryCache )
+: Visual::Base( factoryCache, Visual::FittingMode::FILL, static_cast<Toolkit::Visual::Type>( Toolkit::DevelVisual::ANIMATED_GRADIENT ) )
 {
   SetupDefaultValue();
 }
@@ -583,7 +472,7 @@ void AnimatedGradientVisual::OnSetTransform()
   }
 }
 
-void AnimatedGradientVisual::DoSetOnStage( Actor& actor )
+void AnimatedGradientVisual::DoSetOnScene( Actor& actor )
 {
   InitializeRenderer();
   actor.AddRenderer( mImpl->mRenderer );
@@ -593,7 +482,7 @@ void AnimatedGradientVisual::DoSetOnStage( Actor& actor )
   ResourceReady( Toolkit::Visual::ResourceStatus::READY );
 }
 
-void AnimatedGradientVisual::DoSetOffStage( Actor& actor )
+void AnimatedGradientVisual::DoSetOffScene( Actor& actor )
 {
   DALI_ASSERT_DEBUG( (bool)mImpl->mRenderer && "There should always be a renderer whilst on stage");
 
@@ -766,10 +655,10 @@ Shader AnimatedGradientVisual::CreateShader()
   std::string frag;
 
   vert = "#define " + tagUnit + "\n"
-       + BASIC_VERTEX_SHADER;
+       + SHADER_ANIMATED_GRADIENT_VISUAL_SHADER_VERT.data();
   frag = "#define " + tagGrad + "\n"
        + "#define " + tagSpread + "\n"
-       + BASIC_FRAGMENT_SHADER;
+       + SHADER_ANIMATED_GRADIENT_VISUAL_SHADER_FRAG.data();
 
   shader = Shader::New( vert, frag );
   return shader;