So now it can seek to the actual values at time=length when instructed to seek to time=N*length.
That is, formerly in the editor you had no way of seeing the actual state at time=length other than temporarily disabling looping. Now you can preview both endpoints.
As a side effect, the values at anim time 0 will only be applied when actually seeking to 0, instead of at every time=N*length, as formerly. No issue.
Prior to this, the value assumed for the interval between the start of the track and the first frame would be the one of the first key if
- *seeking/playing a continuous track*;
- *seeking a discrete track*.
And the first key would be ignored until reached -thus not modifying the target property/transform- in the remaining case; namely, *playing a discrete track*.
In other words, the inner workings of the animation system considered the unreached first key for interpolation but not for a query of every key inside a time range.
With this changes, the first key is only considered is the animation is looped and ignored otherwise. That way, in order to have a start value, you'll need an explicit key at the very beginning of the track, while having the flexibility of the animation player not touching the target value until the first key is reached.
This corresponds to the point 1) of #10752.
Rename user facing methods and variables as well as the corresponding
C++ methods according to the folloming changes:
* pos -> position
* rot -> rotation
* loc -> location
C++ variables are left as is.
Currently we rely on some undefined behavior when Object->cast_to() gets
called with a Null pointer. This used to work fine with GCC < 6 but
newer versions of GCC remove all codepaths in which the this pointer is
Null. However, the non-static cast_to() was supposed to be null safe.
This patch makes cast_to() Null safe and removes the now redundant Null
checks where they existed.
It is explained in this article: https://www.viva64.com/en/b/0226/
I can show you the code
Pretty, with proper whitespace
Tell me, coder, now when did
You last write readable code?
I can open your eyes
Make you see your bad indent
Force you to respect the style
The core devs agreed upon
A whole new world
A new fantastic code format
A de facto standard
With some sugar
Enforced with clang-format
A whole new world
A dazzling style we all dreamed of
And when we read it through
It's crystal clear
That now we're in a whole new world of code
Serialize dictionaries adding newlines between key-value pairs
Serialize group lists also with newlines in between
Serialize string properties escaping only " and \ (needed for a good diff experience with built-in scripts and shaders)
Bonus:
Make AnimationPlayer serialize its blend times always sorted so their order is predictable in the .tscn file.
This PR is back-compat; won't break the load of existing files.
-An action being requested to the user in present tense: (ie, draw, gui_input, etc)
-A notification that an action happened, in past tense (ie, area_entered, modal_closed, etc).
- C++ Nodes mostly do an internal process callback, so it does not conflict with users willing to use their own process callbacks
- callbacks such as _input, _process, _fixed_process _unhandled_input, _unhandled_key_input do not requiere calling a function to enable them. They are enabled automatically if found on the script.
That year should bring the long-awaited OpenGL ES 3.0 compatible renderer
with state-of-the-art rendering techniques tuned to work as low as middle
end handheld devices - without compromising with the possibilities given
for higher end desktop games of course. Great times ahead for the Godot
community and the gamers that will play our games!
This reverts commits 8884b8f519bd5c8f2aa0
and 5cb31f6d5b.
<reduz> Akien, I understand the need for the second loop mode, but I think
the current UI is pretty confusing. I think this should be changed for an
enum, both there and in the animation.. otherwise we should revert it
[...]
<reduz> alternatively this could be added per track, which I think should
make it a little less confusing
Reopens #959..
Now the AnimationTreePlayer filters for Blend2 and OneShot nodes
behave as expected, that is the main animation is not affected by
the secondary animation if the track is filterd out for arbitarily
complex trees.
Discrete value tracks don't update every frame (only when a new key is
reached). So we can't use the actual property value as an accumulator:
it will end up being zero most of the time.
The _process_node function (which recurses through the blend tree
generating blend values and the active animation list) had an argument
named `switched` which would loop an animation back to the beginning if
it had reached the end (regardless of whether or not it was supposed to
be a looping animation).
This argument was only used in four places: two of them were overridden
by a seek-to-zero, and I believe the other two are bugs.
In OneShot, it was used to reset the oneshot animation to the beginning
when fired. But this would fail if the oneshot node was fired before it
had completed its previous run. While this *could* be a valid way for
oneshot to work (firing does nothing if it's already running), the code
currently resets the fade-in, so I believe that it is intended to reset.
I replaced this usage with seek-to-0.
In Transition, it was used on the previous (fading out) animation when
seeking the Transition node, which I believe is incorrect: why would you
want to loop a non-looping animation instead of simply fading out from
the end? Also it will never happen unless you seek the Transition node
twice during one cross-fade.
The other two uses are in Transition and _process_animation, where it is
used along with a seek-to-zero which overrides it.