- From: Brian Birtles <bbirtles@mozilla.com>
- Date: Tue, 14 May 2013 13:32:01 +0900
- To: "public-fx@w3.org" <public-fx@w3.org>
Web Animations minutes, 13 / 14 May 2013
Etherpad: https://etherpad.mozilla.org/ep/pad/view/ro.J2MLqh336pT/latest
Present: Doug, Shane, Steve, Brian
Agenda:
1. Status update
2. Fill modes
3. Timing function chaining
4. Effect composition rework
5. Event model
1. STATUS UPDATE
================
Brian
- Made composition operation per-keyframe (not per-value)
- Updated KeyframeShortcut to allow specifying offset and composition
operation
- Minor tweaks and corrections
Doug
- Implementing timing calculations.
Steve
- Wrote up media integration
Shane
- Sick :(
2. FILL MODES: The refillening
==============================
End-point exlusivity has an impact here.
What should be result be here?
new ParGroup([new Animation(..., {fillMode: 'none', duration: 2})],
{fillMode: 'forward', duration: 1});
Currently, the normative part of the spec says the child animation will
continue to apply its mid-point value indefinitely after the parent
reaches the 1s mark.
Shane's suggestion is that the active interval is clipped by parent
groups, and that fill mode applies outside the active interval. So in
the case above the animation wouldn't apply after 1 second.
ACTION: Shane, Brian to make use cases and ensure that this is a better
approach.
3. TIMING FUNCTION CHAINING
============================
(Sydney team)
We had another think about how best to represent chained timing
functions and stil prefer the idea of splitting the input time fraction
into ranges, and specifying a timing function to cover that range.
"ease-in 0.4 0.4, cubic-bezier(1, 0, 1, 0) 0.7 0.7, ease-out"
This has several nice properties ...
- It allows chaining of arbitrary types of timing function
- It allows specification of discontinuous timing functions
- Each timing function can be parameterised independently of the range
it spans. For example, in the above, the arguments to cubic-bezier()
specify the shape of the curve, which is unchanged if the size or
position of its range is changed.
- It matches the keySplines / keyTimes feature of SVG exactly
To simplify the common-case of chained beziers where c1 continuity is
required, we propose adding a 'smooth' option. Specifying this option
means that the direction of the vector representing the starting control
point of the bezier is ignored, and only its magnitude is used. Instead
its direction is set to be equal to that of the tangent at the end of
the previous segment (ie the negative of the vector representing the end
control point in the case of a bezier). If the smooth option is
specified on the first segement, a direction of (1, 0) (i.e. horizontal)
is used. For example ...
"ease-in 0.4 0.4, smooth cubic-bezier(1, 0, 1, 0) 0.7 0.7, smooth
cubic-bezier(0, 1, 0, 1)"
Here the direction of the start control point of the first bezier is
ignored, and set to match the end of the ease-in segment. Similarly, the
direction of the start control point of the second bezier is ignored,
and set to match the end control point of the first bezier.
As a further simplification, we propose that if the coordinates
specifying the end of the range are ommitted for some segment, the
ranges of any underspecified segments are set so as to evenly distribute
the available space (both in x and y). For example ...
"ease-in 0.2 0.2, ease-in, ease-in"
is equivalent to ...
"ease-in 0.2 0.2, ease-in 0.6 0.6, ease-in"
Furthermore, if only one such coordinate is omitted, it is used for both
the x and y compoenents. For example ...
"ease-in 0.2, ease-in, ease-in"
is equivalent to ...
"ease-in 0.2 0.2, ease-in 0.6 0.6, ease-in"
Discussion:
Discussion about when the positions of timing functions are unspecified,
whether they are evenly distributed or distributed such that they line
up with keyframes.
In general, we try to maintain a distinction between timing and
animation. However, we note that it can be convenient to have timing
functions line up with keyframes (cf. SVG).
For now, we think it is less surprising to have timing functions be
independent of animation. This also makes more sense when the timing
function is applied to a timing group or an animation with an animation
effect other than a keyframe animation effect.
If we want to add the convenience later of lining up with keyframes we
can introduce explicit notation to indicate the dependence on keyframes.
(Until then, this is pretty easy to polyfill.)
Also raised the question of whether the list of timing functions and
their positions (x and y) should be separated into parallel lists. We
note that this may make it impossible to have 'holes' in the list of
positions--not sure how critical this is.
Shane thinks keeping them together is slightly easier to deal with, and
that there aren't strong reasons to separate them (e.g. we're not going
to animate them).
ACTION: Brian to review with Mozilla workgroup next week.
4. EFFECT COMPOSITION REWORK
============================
(Sydney team)
While writing section 21 we realized that we would need to define how
the simple animation value of the path animation effect is composited
with the underlying value. It seems like it would be cleaner and we
would have less redundant text in the spec if we described composition
separately. Compositing could be a separate step in the model that
combined animation values (perhaps with separate "add" and "set"
components) in the stack. This seems simpler and is more likely to match
the way the model is implemented.
ACTION: Sydney team to draft the rework.
Doug: I'd also prefer we didn't call this "compositing", but rather
something like "combining values in animation stacks".
> Discussed that this is really only a concern for implementors and we
expect 'composite' is clear for authors. On the other hand, 'combine:
replace' seems odd.
RESOLUTION: Leave the name as compositing. The property shall be
'composite'.
5. EVENT MODEL
==============
(Sydney team)
Our primary concern is that the event model shouldn't prevent animations
from playing smoothly. The spec currently uses synchronous events, which
means that from the prespective of JavaScript, we must halt the
animation while invoking the event listener. Given the timing gurantees
of the model, this means that the animation may have to jump forwards
when the listener completes and we resume playing the animation. (Note
that the is independent of whether or not animations are displayed on a
separate thread. In this case, while the animation could continue to
update while the model is halted on the JavaScript thread, this risks
the animation 'overshooting' if the event handler modifies the animation.)
The use of async events would avoid this. In this case, the event is
triggered as usual, but is delivered to the target as some future point,
while the animation is allowed to continue. Obviosuly this means that
there's no way to gurantee that an event listener runs before any given
point in the animation.
In addition, we think that the timingpause and timingseek events should
be moved from TimedItem to Player.
Given the two above points, perhaps it's best to drop all events from
TimedItem for v1? An async event on a TimedItem can be synthesised using
a custom effect (Though you'd need to manually implement event
propagation if desired, and we should guarantee that zero-width custom
effects are sampled at least once, even when seeking past).
> Further discussion about these points. Firstly, the reference to
synchronous dispatch was confusing and wrong. This has been fixed.
Events are put on the queue in a defined order and dispatched
asynchronously.
Discussed concern about events being heavyweight due to the propagation
involved. It also makes handling events more cumbersome because if you
register on a parent you have to detect if the event was for you or your
child.
Decided that the use cases we are aware of really don't require propagation.
ACTION: Brian to make events not propagate.
ACTION: Sydney peeps to review rest of events section
Also discussed the idea of a Trigger which is like a zero-duration
TimedItem with a CustomEffect but which is guaranteed to be called only
once when the time it is registered against is passed (in either direction).
Decided this can be easily realised using events if they don't
propagate. So for now we will just do events.
Next meeting: Thurs May 16 18:00 PDT / Fri 17 May 11:00 AEST / Fri 17
May 10:00 JST @ https://etherpad.mozilla.org/bFKmqxgfow
Past meetings: http://www.w3.org/Graphics/fx/wiki/Web_Animations/Meetings
Received on Tuesday, 14 May 2013 04:33:34 UTC