1
0
mirror of https://github.com/rive-app/rive-flutter.git synced 2025-07-24 16:55:47 +08:00

Nested artboard playback fixes.

This commit is contained in:
Luigi Rosso
2021-10-05 14:44:27 -07:00
committed by Luigi Rosso
parent 3a84f6ae89
commit 365910c4a0
5 changed files with 43 additions and 10 deletions

@ -469,17 +469,15 @@ class Artboard extends ArtboardBase with ShapePaintContainer {
@override @override
void clipChanged(bool from, bool to) => addDirt(ComponentDirt.paint); void clipChanged(bool from, bool to) => addDirt(ComponentDirt.paint);
@override
void opacityChanged(double from, double to) => markWorldTransformDirty;
@override @override
bool import(ImportStack stack) { bool import(ImportStack stack) {
var backboardImporter = var backboardImporter =
stack.latest<BackboardImporter>(BackboardBase.typeKey); stack.latest<BackboardImporter>(BackboardBase.typeKey);
if (backboardImporter == null) { if (backboardImporter != null) {
return false; // Backboard isn't strictly required (editor doesn't always export a
} // backboard when serializing for the clipboard, for example).
backboardImporter.addArtboard(this); backboardImporter.addArtboard(this);
}
return super.import(stack); return super.import(stack);
} }

@ -20,6 +20,8 @@ abstract class MountedArtboard {
Mat2D get worldTransform; Mat2D get worldTransform;
set worldTransform(Mat2D value); set worldTransform(Mat2D value);
AABB get bounds; AABB get bounds;
double get renderOpacity;
set renderOpacity(double value);
} }
class NestedArtboard extends NestedArtboardBase { class NestedArtboard extends NestedArtboardBase {
@ -35,6 +37,7 @@ class NestedArtboard extends NestedArtboardBase {
} }
_mountedArtboard = value; _mountedArtboard = value;
_mountedArtboard?.worldTransform = worldTransform; _mountedArtboard?.worldTransform = worldTransform;
_mountedArtboard?.renderOpacity = renderOpacity;
addDirt(ComponentDirt.paint); addDirt(ComponentDirt.paint);
} }
@ -83,16 +86,33 @@ class NestedArtboard extends NestedArtboardBase {
} }
@override @override
void draw(Canvas canvas) => mountedArtboard?.draw(canvas); void update(int dirt) {
super.update(dirt);
// RenderOpacity gets updated with the worldTransform (accumulates through
// hierarchy), so if we see worldTransform is dirty, update our internal
// render opacities.
if (dirt & ComponentDirt.worldTransform != 0) {
mountedArtboard?.renderOpacity = renderOpacity;
}
}
@override
void draw(Canvas canvas) {
bool clipped = clip(canvas);
mountedArtboard?.draw(canvas);
if (clipped) {
canvas.restore();
}
}
@override @override
bool import(ImportStack stack) { bool import(ImportStack stack) {
var backboardImporter = var backboardImporter =
stack.latest<BackboardImporter>(BackboardBase.typeKey); stack.latest<BackboardImporter>(BackboardBase.typeKey);
if (backboardImporter == null) { if (backboardImporter != null) {
return false;
}
backboardImporter.addNestedArtboard(this); backboardImporter.addNestedArtboard(this);
}
return super.import(stack); return super.import(stack);
} }

@ -145,6 +145,8 @@ abstract class TransformComponent extends TransformComponentBase {
@override @override
void opacityChanged(double from, double to) { void opacityChanged(double from, double to) {
// Intentionally doesn't call super as this will call
// markWorldTransformDirty if necessary.
markTransformDirty(); markTransformDirty();
} }

@ -11,4 +11,9 @@ abstract class WorldTransformComponent extends WorldTransformComponentBase {
void markWorldTransformDirty() => void markWorldTransformDirty() =>
addDirt(ComponentDirt.worldTransform, recurse: true); addDirt(ComponentDirt.worldTransform, recurse: true);
@override
void opacityChanged(double from, double to) {
markWorldTransformDirty();
}
} }

@ -108,4 +108,12 @@ class RuntimeMountedArtboard extends MountedArtboard {
var y = -artboardInstance.originY * height; var y = -artboardInstance.originY * height;
return AABB.fromValues(x, y, x + width, y + height); return AABB.fromValues(x, y, x + width, y + height);
} }
@override
double get renderOpacity => artboardInstance.opacity;
@override
set renderOpacity(double value) {
artboardInstance.opacity = value;
}
} }