You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-07 12:30:27 +00:00
AnimationTreePlayer: blend value tracks (closes #2299)
Variant:
- zero() sets a Variant to the appropriate type of zero value
- blend() blends part of one Variant on top of another.
(cherry picked from commit 391ce81c5e)
This commit is contained in:
committed by
Rémi Verschelde
parent
459b914d9c
commit
cafcdb015d
@@ -3431,6 +3431,59 @@ Variant Variant::iter_get(const Variant& r_iter,bool &r_valid) const {
|
||||
|
||||
}
|
||||
|
||||
void Variant::blend(const Variant& a, const Variant& b, float c, Variant &r_dst) {
|
||||
if (a.type!=b.type) {
|
||||
if(a.is_num() && b.is_num()) {
|
||||
real_t va=a;
|
||||
real_t vb=b;
|
||||
r_dst=va + vb * c;
|
||||
} else {
|
||||
r_dst=a;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
switch(a.type) {
|
||||
case NIL: { r_dst=Variant(); } return;
|
||||
case INT:{
|
||||
int va=a._data._int;
|
||||
int vb=b._data._int;
|
||||
r_dst=int(va + vb * c + 0.5);
|
||||
} return;
|
||||
case REAL:{
|
||||
double ra=a._data._real;
|
||||
double rb=b._data._real;
|
||||
r_dst=ra + rb * c;
|
||||
} return;
|
||||
case VECTOR2:{ r_dst=*reinterpret_cast<const Vector2*>(a._data._mem)+*reinterpret_cast<const Vector2*>(b._data._mem)*c; } return;
|
||||
case RECT2:{
|
||||
const Rect2 *ra = reinterpret_cast<const Rect2*>(a._data._mem);
|
||||
const Rect2 *rb = reinterpret_cast<const Rect2*>(b._data._mem);
|
||||
r_dst=Rect2(ra->pos + rb->pos * c, ra->size + rb->size * c);
|
||||
} return;
|
||||
case VECTOR3:{ r_dst=*reinterpret_cast<const Vector2*>(a._data._mem)+*reinterpret_cast<const Vector2*>(b._data._mem)*c; } return;
|
||||
case _AABB:{
|
||||
const AABB *ra = reinterpret_cast<const AABB*>(a._data._mem);
|
||||
const AABB *rb = reinterpret_cast<const AABB*>(b._data._mem);
|
||||
r_dst=AABB(ra->pos + rb->pos * c, ra->size + rb->size * c);
|
||||
} return;
|
||||
case COLOR:{
|
||||
const Color *ca = reinterpret_cast<const Color*>(a._data._mem);
|
||||
const Color *cb = reinterpret_cast<const Color*>(b._data._mem);
|
||||
float r = ca->r + cb->r * c;
|
||||
float g = ca->g + cb->g * c;
|
||||
float b = ca->b + cb->b * c;
|
||||
float a = ca->a + cb->a * c;
|
||||
r = r > 1.0 ? 1.0 : r;
|
||||
g = g > 1.0 ? 1.0 : g;
|
||||
b = b > 1.0 ? 1.0 : b;
|
||||
a = a > 1.0 ? 1.0 : a;
|
||||
r_dst=Color(r, g, b, a);
|
||||
} return;
|
||||
default:{ r_dst = c<0.5 ? a : b; } return;
|
||||
}
|
||||
}
|
||||
|
||||
void Variant::interpolate(const Variant& a, const Variant& b, float c,Variant &r_dst) {
|
||||
|
||||
if (a.type!=b.type) {
|
||||
|
||||
Reference in New Issue
Block a user