This commit makes operator[] on Vector const and adds a write proxy to it. From
now on writes to Vectors need to happen through the .write proxy. So for
instance:
Vector<int> vec;
vec.push_back(10);
std::cout << vec[0] << std::endl;
vec.write[0] = 20;
Failing to use the .write proxy will cause a compilation error.
In addition COWable datatypes can now embed a CowData pointer to their data.
This means that String, CharString, and VMap no longer use or derive from
Vector.
_ALWAYS_INLINE_ and _FORCE_INLINE_ are now equivalent for debug and non-debug
builds. This is a lot faster for Vector in the editor and while running tests.
The reason why this difference used to exist is because force-inlined methods
used to give a bad debugging experience. After extensive testing with modern
compilers this is no longer the case.
My first attepmt I added a second loop to check if processing should
stop. This attempts to optimize by using the original loop (one loop).
Also resets `elapsed` time on finish of tween which fixes `tell()`.
I've made the following changes:
- make `is_active` the main way of keeping track of tween
processing/activity, meaning that `is_active` will now return
`false` if all tween actions have finished or if it isn't started
or if it was stopped via `set_active(false)` or any other mode
- removed is_stopped because is redundand now
The above meant that we don't have to keep track of yet another variable
`available` since everything is based on `*processing_internal` so I
removed it, likewise it's own local `processing` variable was removed,
as well as the "double" `_set_process` which it feels more like a hack.
What wasn't changed:
- `tell()` still returns max value (i.e. `== get_runtime()` when all
tweens `finish`)
*More testing is needed*. So far I've tested repeat on/off, delay,
`is_active()` working corretly, `set_active(true), set_active(false)`,
but probably more tests are necessary, all the resets, stops, resume
etc.
Fixes most current reports on Coverity Scan of uninitialized scalar
variable (CWE-457): https://cwe.mitre.org/data/definitions/457.html
These happen most of the time (in our code) when instanciating structs
without a constructor (or with an incomplete one), and later returning
the instance. This is sometimes intended though, as some parameters are
only used in some situations and should not be double-initialized for
performance reasons (e.g. `constant` in ShaderLanguage::Token).
Also ensure that get_scale doesn't arbitrarlity change the signs of scales, ensuring that the combination of get_rotation and get_scale gives the correct basis.
Added various missing functions and constructors.
Should close#17968.
fixes#17325.
The bone pose transform was created by setting the rotation and
**then** scaling the transform. This leads to object "deformation"
that's not intended.
playing speed of the animation being played.
As stated in #16550, there is no way to get the playing speed of an
animation. The `playback_speed` property is for the whole AnimationPlayer
node, and the argument passed to `play` method is another scale applied
in top of the AnimationPlayer properties.
Thus, the actual playing speed is AnimationPlayer.speed_scale *
AnimationPlayer.playback.current.speed_scale. If it is not playing, the
method returns 0.