fix: treat artboard as layout for hit testing inheritance (#10341) 583274d7b9 * fix: treat artboard as layout for hit testing inheritance Co-authored-by: hernan <hernan@rive.app>
diff --git a/.rive_head b/.rive_head index 4216257..a19b195 100644 --- a/.rive_head +++ b/.rive_head
@@ -1 +1 @@ -cc34f96631a6279e94227c10862cdde8ebf6b478 +583274d7b9361269fb90db7b080c1c3e1d71df44
diff --git a/src/artboard.cpp b/src/artboard.cpp index ffcf2c8..20f13b4 100644 --- a/src/artboard.cpp +++ b/src/artboard.cpp
@@ -1110,7 +1110,7 @@ } } #endif - return Drawable::hitTestPoint(position, skipOnUnclipped); + return LayoutComponent::hitTestPoint(position, skipOnUnclipped); } void Artboard::draw(Renderer* renderer) { draw(renderer, DrawOption::kNormal); }
diff --git a/tests/unit_tests/assets/scroll_test.riv b/tests/unit_tests/assets/scroll_test.riv new file mode 100644 index 0000000..e0ead10 --- /dev/null +++ b/tests/unit_tests/assets/scroll_test.riv Binary files differ
diff --git a/tests/unit_tests/runtime/scroll_test.cpp b/tests/unit_tests/runtime/scroll_test.cpp new file mode 100644 index 0000000..6d720d8 --- /dev/null +++ b/tests/unit_tests/runtime/scroll_test.cpp
@@ -0,0 +1,101 @@ +#include "rive/file.hpp" +#include "rive/animation/linear_animation.hpp" +#include "rive/animation/linear_animation_instance.hpp" +#include "rive/animation/state_machine_instance.hpp" +#include "rive/viewmodel/viewmodel.hpp" +#include "rive/viewmodel/viewmodel_instance_number.hpp" +#include "rive/viewmodel/viewmodel_instance_trigger.hpp" +#include "utils/serializing_factory.hpp" +#include "rive_file_reader.hpp" +#include <catch.hpp> +#include <cstdio> +#include <cstring> + +using namespace rive; + +TEST_CASE("multiple scrolliing artboards", "[silver]") +{ + SerializingFactory silver; + auto file = ReadRiveFile("assets/scroll_test.riv", &silver); + + auto artboard = file->artboardDefault(); + silver.frameSize(artboard->width(), artboard->height()); + + auto stateMachine = artboard->stateMachineAt(0); + stateMachine->advanceAndApply(0.1f); + + auto renderer = silver.makeRenderer(); + artboard->draw(renderer.get()); + + silver.addFrame(); + + // Click in the middle of the state machine. + stateMachine->pointerDown( + rive::Vec2D(artboard->width() / 2.0f, artboard->height() / 2.0f)); + // Advance and apply twice to take the transition and apply the next state. + stateMachine->advanceAndApply(0.1f); + stateMachine->advanceAndApply(1.0f); + + artboard->draw(renderer.get()); + + silver.addFrame(); + + // Start scroll on right element + stateMachine->pointerDown(rive::Vec2D(260.0f, 500.0f)); + // Advance and apply twice to take the transition and apply the next state. + stateMachine->advanceAndApply(0.1f); + stateMachine->advanceAndApply(1.0f); + artboard->draw(renderer.get()); + + float yMovement = 400.0f; + float xMovement = 100.0f; + + int frames = (int)(1.0f / 0.016f); + for (int i = 0; i < frames; i++) + { + silver.addFrame(); + stateMachine->pointerMove( + rive::Vec2D(260.0f - (i * xMovement / frames), + 500.0f - (i * yMovement / frames))); + // Advance and apply twice to take the transition and apply the next + // state. + stateMachine->advanceAndApply(0.1f); + stateMachine->advanceAndApply(0.016f); + artboard->draw(renderer.get()); + } + silver.addFrame(); + stateMachine->pointerUp( + rive::Vec2D(260.0f - xMovement, 500.0f - yMovement)); + stateMachine->advanceAndApply(0.1f); + stateMachine->advanceAndApply(0.016f); + artboard->draw(renderer.get()); + + silver.addFrame(); + + // Start scroll on left element + stateMachine->pointerDown(rive::Vec2D(50.0f, 500.0f)); + // Advance and apply twice to take the transition and apply the next state. + stateMachine->advanceAndApply(0.1f); + stateMachine->advanceAndApply(1.0f); + artboard->draw(renderer.get()); + + for (int i = 0; i < frames; i++) + { + silver.addFrame(); + stateMachine->pointerMove( + rive::Vec2D(50.0f + (i * xMovement / frames), + 500.0f - (i * yMovement / frames))); + // Advance and apply twice to take the transition and apply the next + // state. + stateMachine->advanceAndApply(0.1f); + stateMachine->advanceAndApply(0.016f); + artboard->draw(renderer.get()); + } + silver.addFrame(); + stateMachine->pointerUp(rive::Vec2D(50.0f + xMovement, 500.0f - yMovement)); + stateMachine->advanceAndApply(0.1f); + stateMachine->advanceAndApply(0.016f); + artboard->draw(renderer.get()); + + CHECK(silver.matches("scroll_test")); +}
diff --git a/tests/unit_tests/silvers/scroll_test.sriv b/tests/unit_tests/silvers/scroll_test.sriv new file mode 100644 index 0000000..faac6be --- /dev/null +++ b/tests/unit_tests/silvers/scroll_test.sriv Binary files differ