Add Default Uniform : uActorColor 70/264570/2
authorEunki, Hong <eunkiki.hong@samsung.com>
Fri, 24 Sep 2021 11:26:14 +0000 (20:26 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Fri, 24 Sep 2021 12:30:45 +0000 (21:30 +0900)
Previously, DevelRenderer always merged into uColor.a value.
When we use Borderline feature, it will occure some problems.

This patch add one more default uniform : named "uActorColor"
So now we can split MIX_COLOR.a and Actor::COLOR.a

Change-Id: Ib74731fab0bca87fd3970abb8e4f290a09c45e88
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
automated-tests/src/dali/dali-test-suite-utils/test-gl-abstraction.cpp
automated-tests/src/dali/dali-test-suite-utils/test-graphics-reflection.cpp
automated-tests/src/dali/utc-Dali-Renderer.cpp
automated-tests/src/dali/utc-Dali-VertexBuffer.cpp
dali/internal/render/renderers/render-renderer.cpp
dali/internal/render/shaders/program.cpp
dali/internal/render/shaders/program.h

index b85cf4d..e99de5c 100644 (file)
@@ -130,6 +130,7 @@ void TestGlAbstraction::Initialize()
     {"sTextureRect", GL_SAMPLER_2D, 1},
     {"sGloss", GL_SAMPLER_2D, 1},
     {"uColor", GL_FLOAT_VEC4, 1},
+    {"uActorColor", GL_FLOAT_VEC4, 1},
     {"uModelMatrix", GL_FLOAT_MAT4, 1},
     {"uModelView", GL_FLOAT_MAT4, 1},
     {"uMvpMatrix", GL_FLOAT_MAT4, 1},
index 8493992..25c09b5 100644 (file)
@@ -40,6 +40,7 @@ static const std::vector<UniformData> UNIFORMS =
     UniformData("sTextureRect", Property::Type::FLOAT),
     UniformData("sGloss", Property::Type::FLOAT),
     UniformData("uColor", Property::Type::VECTOR4),
+    UniformData("uActorColor", Property::Type::VECTOR4),
     UniformData("uModelMatrix", Property::Type::MATRIX),
     UniformData("uModelView", Property::Type::MATRIX),
     UniformData("uMvpMatrix", Property::Type::MATRIX),
index 3a94cce..208e9d8 100644 (file)
@@ -1411,9 +1411,12 @@ int UtcDaliRendererPreMultipledAlpha(void)
   application.Render();
 
   Vector4            actualValue(Vector4::ZERO);
+  Vector4            actualActorColor(Vector4::ZERO);
   TestGlAbstraction& gl = application.GetGlAbstraction();
   DALI_TEST_CHECK(gl.GetUniformValue<Vector4>("uColor", actualValue));
   DALI_TEST_EQUALS(actualValue, Vector4(1.0f, 0.0f, 1.0f, 0.5f), TEST_LOCATION);
+  DALI_TEST_CHECK(gl.GetUniformValue<Vector4>("uActorColor", actualActorColor));
+  DALI_TEST_EQUALS(actualActorColor, Vector4(1.0f, 0.0f, 1.0f, 0.5f), TEST_LOCATION);
 
   // Enable pre-multiplied alpha
   renderer.SetProperty(Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA, true);
@@ -1441,6 +1444,9 @@ int UtcDaliRendererPreMultipledAlpha(void)
 
   DALI_TEST_CHECK(gl.GetUniformValue<Vector4>("uColor", actualValue));
   DALI_TEST_EQUALS(actualValue, Vector4(0.5f, 0.0f, 0.5f, 0.5f), TEST_LOCATION);
+  // Note : uActorColor doesn't premultiplied.
+  DALI_TEST_CHECK(gl.GetUniformValue<Vector4>("uActorColor", actualActorColor));
+  DALI_TEST_EQUALS(actualActorColor, Vector4(1.0f, 0.0f, 1.0f, 0.5f), TEST_LOCATION);
 
   // Disable pre-multiplied alpha again
   renderer.SetProperty(Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA, false);
@@ -1468,6 +1474,8 @@ int UtcDaliRendererPreMultipledAlpha(void)
 
   DALI_TEST_CHECK(gl.GetUniformValue<Vector4>("uColor", actualValue));
   DALI_TEST_EQUALS(actualValue, Vector4(1.0f, 0.0f, 1.0f, 0.5f), TEST_LOCATION);
+  DALI_TEST_CHECK(gl.GetUniformValue<Vector4>("uActorColor", actualActorColor));
+  DALI_TEST_EQUALS(actualActorColor, Vector4(1.0f, 0.0f, 1.0f, 0.5f), TEST_LOCATION);
 
   END_TEST;
 }
@@ -3204,9 +3212,12 @@ int UtcDaliRendererOpacity(void)
   application.Render();
 
   Vector4            actualValue;
+  Vector4            actualActorColor;
   TestGlAbstraction& gl = application.GetGlAbstraction();
   DALI_TEST_CHECK(gl.GetUniformValue<Vector4>("uColor", actualValue));
   DALI_TEST_EQUALS(actualValue.a, 1.0f, Dali::Math::MACHINE_EPSILON_1, TEST_LOCATION);
+  DALI_TEST_CHECK(gl.GetUniformValue<Vector4>("uActorColor", actualActorColor));
+  DALI_TEST_EQUALS(actualActorColor.a, 1.0f, Dali::Math::MACHINE_EPSILON_1, TEST_LOCATION);
 
   renderer.SetProperty(DevelRenderer::Property::OPACITY, 0.5f);
 
@@ -3224,6 +3235,10 @@ int UtcDaliRendererOpacity(void)
   DALI_TEST_CHECK(gl.GetUniformValue<Vector4>("uColor", actualValue));
   DALI_TEST_EQUALS(actualValue.a, 0.5f, Dali::Math::MACHINE_EPSILON_1, TEST_LOCATION);
 
+  // Note : Renderer opacity doesn't apply to uActorColor.
+  DALI_TEST_CHECK(gl.GetUniformValue<Vector4>("uActorColor", actualActorColor));
+  DALI_TEST_EQUALS(actualActorColor.a, 1.0f, Dali::Math::MACHINE_EPSILON_1, TEST_LOCATION);
+
   END_TEST;
 }
 
index 346c6b1..abb8154 100644 (file)
@@ -262,8 +262,8 @@ int UtcDaliVertexBufferSetData02(void)
     const TestGlAbstraction::BufferDataCalls& bufferDataCalls =
       application.GetGlAbstraction().GetBufferDataCalls();
 
-    // Should be 15 (using single uniform buffer now)
-    DALI_TEST_EQUALS(bufferSubDataCalls.size(), 15u, TEST_LOCATION);
+    // Should be 17 (using single uniform buffer now)
+    DALI_TEST_EQUALS(bufferSubDataCalls.size(), 17u, TEST_LOCATION);
     DALI_TEST_EQUALS(bufferDataCalls.size(), 3u, TEST_LOCATION);
 
     if(bufferSubDataCalls.size())
index 3150bf4..9c8dd47 100644 (file)
@@ -657,18 +657,19 @@ void Renderer::WriteUniformBuffer(
       WriteDefaultUniform(normalUniformInfo, *uboView, normalMatrix);
     }
 
-    Vector4        finalColor;
-    const Vector4& color = node.GetRenderColor(bufferIndex);
+    Vector4        finalColor;                               ///< Applied renderer's opacity color
+    const Vector4& color = node.GetRenderColor(bufferIndex); ///< Actor's original color
     if(mPremultipliedAlphaEnabled)
     {
-      float alpha = color.a * mRenderDataProvider->GetOpacity(bufferIndex);
-      finalColor  = Vector4(color.r * alpha, color.g * alpha, color.b * alpha, alpha);
+      const float& alpha = color.a * mRenderDataProvider->GetOpacity(bufferIndex);
+      finalColor         = Vector4(color.r * alpha, color.g * alpha, color.b * alpha, alpha);
     }
     else
     {
       finalColor = Vector4(color.r, color.g, color.b, color.a * mRenderDataProvider->GetOpacity(bufferIndex));
     }
     WriteDefaultUniform(program->GetDefaultUniform(Program::DefaultUniformIndex::COLOR), *uboView, finalColor);
+    WriteDefaultUniform(program->GetDefaultUniform(Program::DefaultUniformIndex::ACTOR_COLOR), *uboView, color);
 
     // Write uniforms from the uniform map
     FillUniformBuffer(*program, instruction, *uboView, bindings, uboOffset, bufferIndex);
index 56ba362..fca4972 100644 (file)
@@ -56,7 +56,8 @@ size_t DEFAULT_UNIFORM_HASHTABLE[NUMBER_OF_DEFAULT_UNIFORMS] =
     CalculateHash(std::string("uNormalMatrix")),
     CalculateHash(std::string("uProjection")),
     CalculateHash(std::string("uSize")),
-    CalculateHash(std::string("uColor"))};
+    CalculateHash(std::string("uColor")),
+    CalculateHash(std::string("uActorColor"))};
 
 /**
  * Helper function to calculate the correct alignment of data for uniform buffers
index d6cde0f..a0e2ba9 100644 (file)
@@ -63,6 +63,7 @@ public:
     PROJECTION_MATRIX,
     SIZE,
     COLOR,
+    ACTOR_COLOR,
 
     COUNT
   };