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:
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user