diff --git a/.rive_head b/.rive_head index b5177a62..ea5fdcd5 100644 --- a/.rive_head +++ b/.rive_head @@ -1 +1 @@ -85b2b6ed1965d66f5f268993e54f5f89f30a2e29 +0dcbdade49885fcae4de304972ae37f6283f19d1 diff --git a/include/rive/shapes/shape_paint_container.hpp b/include/rive/shapes/shape_paint_container.hpp index f5200fa7..ceccbf4e 100644 --- a/include/rive/shapes/shape_paint_container.hpp +++ b/include/rive/shapes/shape_paint_container.hpp @@ -38,6 +38,10 @@ class ShapePaintContainer std::unique_ptr makeCommandPath(PathSpace space); void propagateOpacity(float opacity); + + #ifdef TESTING + const std::vector& shapePaints() const { return m_ShapePaints; } + #endif }; } // namespace rive diff --git a/src/artboard.cpp b/src/artboard.cpp index 4f09ab02..8b372155 100644 --- a/src/artboard.cpp +++ b/src/artboard.cpp @@ -427,6 +427,10 @@ void Artboard::update(ComponentDirt value) m_ClipPath = factory()->makeRenderPath(clip); m_BackgroundPath = factory()->makeRenderPath(bg); } + if (hasDirt(value, ComponentDirt::RenderOpacity)) + { + propagateOpacity(childOpacity()); + } } bool Artboard::updateComponents() diff --git a/test/assets/nested_artboard_opacity.riv b/test/assets/nested_artboard_opacity.riv new file mode 100644 index 00000000..128cc95c Binary files /dev/null and b/test/assets/nested_artboard_opacity.riv differ diff --git a/test/nested_artboard_opacity_test.cpp b/test/nested_artboard_opacity_test.cpp new file mode 100644 index 00000000..e3c2b73b --- /dev/null +++ b/test/nested_artboard_opacity_test.cpp @@ -0,0 +1,26 @@ +#include +#include +#include +#include +#include "rive_file_reader.hpp" + +TEST_CASE("Nested artboard background renders with opacity", "[file]") +{ + auto file = ReadRiveFile("../../test/assets/nested_artboard_opacity.riv"); + + auto mainArtboard = file->artboard()->instance(); + REQUIRE(mainArtboard->find("Parent Artboard") != nullptr); + auto artboard = mainArtboard->find("Parent Artboard"); + artboard->updateComponents(); + REQUIRE(artboard->is()); + REQUIRE(artboard->find("Nested artboard container") != nullptr); + auto nestedArtboardContainer = artboard->find("Nested artboard container"); + REQUIRE(nestedArtboardContainer->artboard() != nullptr); + auto nestedArtboard = nestedArtboardContainer->artboard(); + nestedArtboard->updateComponents(); + auto paints = nestedArtboard->shapePaints(); + REQUIRE(paints.size() == 1); + auto paint = paints[0]; + REQUIRE(paint->is()); + REQUIRE(paint->renderOpacity() == 0.3275f); +}