Revert "[Tizen] Move DevelHandle::GetCurrentProperty to public"
[platform/core/uifw/dali-core.git] / automated-tests / src / dali / utc-Dali-Shader.cpp
index dc82a47..dacfd96 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015 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.
@@ -19,7 +19,9 @@
 
 #include <stdlib.h>
 #include <dali/public-api/dali-core.h>
+#include <dali/devel-api/object/handle-devel.h>
 #include <dali-test-suite-utils.h>
+#include <mesh-builder.h>
 
 using namespace Dali;
 
@@ -44,6 +46,13 @@ static const char* FragmentSource =
 "This is a custom fragment shader\n"
 "made on purpose to look nothing like a normal fragment shader inside dali\n";
 
+
+void TestConstraintNoBlue( Vector4& current, const PropertyInputContainer& inputs )
+{
+  current.b = 0.0f;
+}
+
+
 } // anon namespace
 
 
@@ -65,6 +74,27 @@ int UtcDaliShaderMethodNew02(void)
   END_TEST;
 }
 
+int UtcDaliShaderAssignmentOperator(void)
+{
+  TestApplication application;
+
+  Shader shader1 = Shader::New(VertexSource, FragmentSource);
+
+  Shader shader2;
+
+  DALI_TEST_CHECK(!(shader1 == shader2));
+
+  shader2 = shader1;
+
+  DALI_TEST_CHECK(shader1 == shader2);
+
+  shader2 = Shader::New(VertexSource, FragmentSource);;
+
+  DALI_TEST_CHECK(!(shader1 == shader2));
+
+  END_TEST;
+}
+
 int UtcDaliShaderDownCast01(void)
 {
   TestApplication application;
@@ -86,3 +116,262 @@ int UtcDaliShaderDownCast02(void)
   DALI_TEST_EQUALS( (bool)shader, false, TEST_LOCATION );
   END_TEST;
 }
+
+int UtcDaliShaderConstraint01(void)
+{
+  TestApplication application;
+
+  tet_infoline("Test that a non-uniform shader property can be constrained");
+
+  Shader shader = Shader::New(VertexSource, FragmentSource);
+  Geometry geometry = CreateQuadGeometry();
+  Renderer renderer = Renderer::New( geometry, shader );
+
+  Actor actor = Actor::New();
+  actor.AddRenderer(renderer);
+  actor.SetSize(400, 400);
+  Stage::GetCurrent().Add(actor);
+
+  Vector4 initialColor = Color::WHITE;
+  Property::Index colorIndex = shader.RegisterProperty( "uFadeColor", initialColor );
+
+  application.SendNotification();
+  application.Render(0);
+  DALI_TEST_EQUALS( shader.GetProperty<Vector4>(colorIndex), initialColor, TEST_LOCATION );
+
+  // Apply constraint
+  Constraint constraint = Constraint::New<Vector4>( shader, colorIndex, TestConstraintNoBlue );
+  constraint.Apply();
+  application.SendNotification();
+  application.Render(0);
+
+  // Expect no blue component in either buffer - yellow
+  DALI_TEST_EQUALS( DevelHandle::GetCurrentProperty< Vector4 >( shader, colorIndex ), Color::YELLOW, TEST_LOCATION );
+  application.Render(0);
+  DALI_TEST_EQUALS( DevelHandle::GetCurrentProperty< Vector4 >( shader, colorIndex ), Color::YELLOW, TEST_LOCATION );
+
+  shader.RemoveConstraints();
+  shader.SetProperty(colorIndex, Color::WHITE );
+  application.SendNotification();
+  application.Render(0);
+  DALI_TEST_EQUALS( DevelHandle::GetCurrentProperty< Vector4 >( shader, colorIndex ), Color::WHITE, TEST_LOCATION );
+
+  END_TEST;
+}
+
+int UtcDaliShaderConstraint02(void)
+{
+  TestApplication application;
+
+  tet_infoline("Test that a uniform map shader property can be constrained");
+
+  Shader shader = Shader::New(VertexSource, FragmentSource);
+  Geometry geometry = CreateQuadGeometry();
+  Renderer renderer = Renderer::New( geometry, shader );
+
+  Actor actor = Actor::New();
+  actor.AddRenderer(renderer);
+  actor.SetSize(400, 400);
+  Stage::GetCurrent().Add(actor);
+  application.SendNotification();
+  application.Render(0);
+
+  Vector4 initialColor = Color::WHITE;
+  Property::Index colorIndex = shader.RegisterProperty( "uFadeColor", initialColor );
+
+  TestGlAbstraction& gl = application.GetGlAbstraction();
+
+  application.SendNotification();
+  application.Render(0);
+
+  Vector4 actualValue(Vector4::ZERO);
+  DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "uFadeColor", actualValue ) );
+  DALI_TEST_EQUALS( actualValue, initialColor, TEST_LOCATION );
+
+  // Apply constraint
+  Constraint constraint = Constraint::New<Vector4>( shader, colorIndex, TestConstraintNoBlue );
+  constraint.Apply();
+  application.SendNotification();
+  application.Render(0);
+
+   // Expect no blue component in either buffer - yellow
+  DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "uFadeColor", actualValue ) );
+  DALI_TEST_EQUALS( actualValue, Color::YELLOW, TEST_LOCATION );
+
+  application.Render(0);
+  DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "uFadeColor", actualValue ) );
+  DALI_TEST_EQUALS( actualValue, Color::YELLOW, TEST_LOCATION );
+
+  shader.RemoveConstraints();
+  shader.SetProperty(colorIndex, Color::WHITE );
+  application.SendNotification();
+  application.Render(0);
+
+  DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "uFadeColor", actualValue ) );
+  DALI_TEST_EQUALS( actualValue, Color::WHITE, TEST_LOCATION );
+
+  END_TEST;
+}
+
+int UtcDaliShaderAnimatedProperty01(void)
+{
+  TestApplication application;
+
+  tet_infoline("Test that a non-uniform shader property can be animated");
+
+  Shader shader = Shader::New(VertexSource, FragmentSource);
+  Geometry geometry = CreateQuadGeometry();
+  Renderer renderer = Renderer::New( geometry, shader );
+
+  Actor actor = Actor::New();
+  actor.AddRenderer(renderer);
+  actor.SetSize(400, 400);
+  Stage::GetCurrent().Add(actor);
+
+  Vector4 initialColor = Color::WHITE;
+  Property::Index colorIndex = shader.RegisterProperty( "uFadeColor", initialColor );
+
+  application.SendNotification();
+  application.Render(0);
+  DALI_TEST_EQUALS( shader.GetProperty<Vector4>(colorIndex), initialColor, TEST_LOCATION );
+
+  Animation  animation = Animation::New(1.0f);
+  KeyFrames keyFrames = KeyFrames::New();
+  keyFrames.Add(0.0f, initialColor);
+  keyFrames.Add(1.0f, Color::TRANSPARENT);
+  animation.AnimateBetween( Property( shader, colorIndex ), keyFrames );
+  animation.Play();
+
+  application.SendNotification();
+  application.Render(500);
+
+  DALI_TEST_EQUALS( DevelHandle::GetCurrentProperty< Vector4 >( shader, colorIndex ), Color::WHITE * 0.5f, TEST_LOCATION );
+
+  application.Render(500);
+
+  DALI_TEST_EQUALS( DevelHandle::GetCurrentProperty< Vector4 >( shader, colorIndex ), Color::TRANSPARENT, TEST_LOCATION );
+
+  END_TEST;
+}
+
+int UtcDaliShaderAnimatedProperty02(void)
+{
+  TestApplication application;
+
+  tet_infoline("Test that a uniform map shader property can be animated");
+
+  Shader shader = Shader::New(VertexSource, FragmentSource);
+  Geometry geometry = CreateQuadGeometry();
+  Renderer renderer = Renderer::New( geometry, shader );
+
+  Actor actor = Actor::New();
+  actor.AddRenderer(renderer);
+  actor.SetSize(400, 400);
+  Stage::GetCurrent().Add(actor);
+  application.SendNotification();
+  application.Render(0);
+
+  Vector4 initialColor = Color::WHITE;
+  Property::Index colorIndex = shader.RegisterProperty( "uFadeColor", initialColor );
+
+  TestGlAbstraction& gl = application.GetGlAbstraction();
+
+  application.SendNotification();
+  application.Render(0);
+
+  Vector4 actualValue(Vector4::ZERO);
+  DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "uFadeColor", actualValue ) );
+  DALI_TEST_EQUALS( actualValue, initialColor, TEST_LOCATION );
+
+  Animation  animation = Animation::New(1.0f);
+  KeyFrames keyFrames = KeyFrames::New();
+  keyFrames.Add(0.0f, initialColor);
+  keyFrames.Add(1.0f, Color::TRANSPARENT);
+  animation.AnimateBetween( Property( shader, colorIndex ), keyFrames );
+  animation.Play();
+
+  application.SendNotification();
+  application.Render(500);
+
+  DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "uFadeColor", actualValue ) );
+  DALI_TEST_EQUALS( actualValue, Color::WHITE * 0.5f, TEST_LOCATION );
+
+  application.Render(500);
+  DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "uFadeColor", actualValue ) );
+  DALI_TEST_EQUALS( actualValue, Color::TRANSPARENT, TEST_LOCATION );
+
+  END_TEST;
+}
+
+int UtcDaliShaderProgramProperty(void)
+{
+  TestApplication application;
+
+  tet_infoline("Test get/set progam property");
+
+  Shader shader = Shader::New("", "");
+  std::string hintSet = "MODIFIES_GEOMETRY";
+
+  Property::Map map;
+  map["vertex"] = VertexSource;
+  map["fragment"] = FragmentSource;
+  map["hints"] = hintSet;
+
+  shader.SetProperty( Shader::Property::PROGRAM, Property::Value(map) );
+
+  Property::Value value = shader.GetProperty(Shader::Property::PROGRAM);
+  DALI_TEST_CHECK( value.GetType() == Property::MAP);
+  const Property::Map* outMap = value.GetMap();
+
+  std::string v = (*outMap)["vertex"].Get<std::string>();
+  std::string f = (*outMap)["fragment"].Get<std::string>();
+  std::string h = (*outMap)["hints"].Get<std::string>();
+
+  DALI_TEST_CHECK( v == VertexSource );
+  DALI_TEST_CHECK( f == FragmentSource );
+  DALI_TEST_CHECK( h == hintSet );
+
+  value = DevelHandle::GetCurrentProperty( shader, Shader::Property::PROGRAM );
+  DALI_TEST_CHECK( value.GetType() == Property::MAP);
+  outMap = value.GetMap();
+
+  v = (*outMap)["vertex"].Get<std::string>();
+  f = (*outMap)["fragment"].Get<std::string>();
+  h = (*outMap)["hints"].Get<std::string>();
+
+  DALI_TEST_CHECK( v == VertexSource );
+  DALI_TEST_CHECK( f == FragmentSource );
+  DALI_TEST_CHECK( h == hintSet );
+
+  std::string hintGot;
+
+  hintSet = "OUTPUT_IS_TRANSPARENT,MODIFIES_GEOMETRY";
+  map["hints"] = hintSet;
+  shader.SetProperty( Shader::Property::PROGRAM, Property::Value(map) );
+  value = shader.GetProperty(Shader::Property::PROGRAM);
+  hintGot = (*value.GetMap())["hints"].Get<std::string>();
+  DALI_TEST_CHECK( hintGot == hintSet );
+
+  hintSet = "OUTPUT_IS_TRANSPARENT";
+  map["hints"] = hintSet;
+  shader.SetProperty( Shader::Property::PROGRAM, Property::Value(map) );
+  value = shader.GetProperty(Shader::Property::PROGRAM);
+  hintGot = (*value.GetMap())["hints"].Get<std::string>();
+  DALI_TEST_CHECK( hintGot == hintSet );
+
+  hintSet = "NONE";
+  map["hints"] = hintSet;
+  shader.SetProperty( Shader::Property::PROGRAM, Property::Value(map) );
+  value = shader.GetProperty(Shader::Property::PROGRAM);
+  hintGot = (*value.GetMap())["hints"].Get<std::string>();
+  DALI_TEST_CHECK( hintGot == hintSet );
+
+  hintSet = "";
+  map["hints"] = hintSet;
+  shader.SetProperty( Shader::Property::PROGRAM, Property::Value(map) );
+  value = shader.GetProperty(Shader::Property::PROGRAM);
+  hintGot = (*value.GetMap())["hints"].Get<std::string>();
+  DALI_TEST_CHECK( hintGot == "NONE" );
+
+  END_TEST;
+}