[Particle] Fix gradient evaluation error when after load.

This commit is contained in:
Tanasart 2024-09-08 09:41:43 +07:00
parent 8e2f4b8071
commit 4468f26107
2 changed files with 33 additions and 34 deletions

View file

@ -165,19 +165,6 @@
var b = min(b1 * b2 / 255, 255); var b = min(b1 * b2 / 255, 255);
return (a << 24) | (r << 16) | (g << 8) | b; return (a << 24) | (r << 16) | (g << 8) | b;
// var r1 = _color_get_red(c1);
// var g1 = _color_get_green(c1);
// var b1 = _color_get_blue(c1);
// var a1 = _color_get_alpha(c1);
// var r2 = _color_get_red(c2);
// var g2 = _color_get_green(c2);
// var b2 = _color_get_blue(c2);
// var a2 = _color_get_alpha(c2);
// if(is_real(c1)) return make_color_rgb((r1 * r2) * 255, (g1 * g2) * 255, (b1 * b2) * 255);
// return make_color_rgba((r1 * r2) * 255, (g1 * g2) * 255, (b1 * b2) * 255, (a1 * a2) * 255);
} }
function colorAdd(c1, c2) { function colorAdd(c1, c2) {
@ -227,42 +214,54 @@ function color_diff(c1, c2) {
#region merge #region merge
#macro merge_color merge_color_ext #macro merge_color merge_color_ext
#macro __merge_color merge_color #macro __merge_color merge_color
//!#mfunc __clamp255 {"args":["v"],"order":[0]}
#macro __clamp255_mf0 clamp(round(
#macro __clamp255_mf1 ), 0, 255)
function merge_color_ext(c0, c1, t) { function merge_color_ext(c0, c1, t) {
INLINE INLINE
if(is_real(c0) && is_real(c1)) return __merge_color(c0, c1, t); if(is_real(c0) && is_real(c1)) return __merge_color(c0, c1, t);
return make_color_rgba( return make_color_rgba(
clamp(round(lerp(color_get_red(c0), color_get_red(c1), t)), 0, 255), __clamp255_mf0 lerp(color_get_red(c0), color_get_red(c1), t) __clamp255_mf1,
clamp(round(lerp(color_get_green(c0), color_get_green(c1), t)), 0, 255), __clamp255_mf0 lerp(color_get_green(c0), color_get_green(c1), t) __clamp255_mf1,
clamp(round(lerp(color_get_blue(c0), color_get_blue(c1), t)), 0, 255), __clamp255_mf0 lerp(color_get_blue(c0), color_get_blue(c1), t) __clamp255_mf1,
clamp(round(lerp(color_get_alpha(c0), color_get_alpha(c1), t)), 0, 255), __clamp255_mf0 lerp(color_get_alpha(c0), color_get_alpha(c1), t) __clamp255_mf1,
); );
} }
function merge_color_a(c0, c1, t) { function merge_color_rgba(c0, c1, t) {
INLINE INLINE
return make_color_rgba( return make_color_rgba(
clamp(round(lerp(color_get_red(c0), color_get_red(c1), t)), 0, 255), __clamp255_mf0 lerp(color_get_red(c0), color_get_red(c1), t) __clamp255_mf1,
clamp(round(lerp(color_get_green(c0), color_get_green(c1), t)), 0, 255), __clamp255_mf0 lerp(color_get_green(c0), color_get_green(c1), t) __clamp255_mf1,
clamp(round(lerp(color_get_blue(c0), color_get_blue(c1), t)), 0, 255), __clamp255_mf0 lerp(color_get_blue(c0), color_get_blue(c1), t) __clamp255_mf1,
clamp(round(lerp(color_get_alpha(c0), color_get_alpha(c1), t)), 0, 255), __clamp255_mf0 lerp(color_get_alpha(c0), color_get_alpha(c1), t) __clamp255_mf1,
);
}
function merge_color_hsva(c0, c1, t) {
return make_color_hsva(
__clamp255_mf0 lerp(color_get_hue(c0), color_get_hue(c1), t) __clamp255_mf1,
__clamp255_mf0 lerp(color_get_saturation(c0), color_get_saturation(c1), t) __clamp255_mf1,
__clamp255_mf0 lerp(color_get_value(c0), color_get_value(c1), t) __clamp255_mf1,
__clamp255_mf0 lerp(color_get_alpha(c0), color_get_alpha(c1), t) __clamp255_mf1,
); );
} }
function merge_color_hsv(c0, c1, t) { function merge_color_hsv(c0, c1, t) {
INLINE INLINE
if(is_real(c0)) return make_color_hsv( if(is_real(c0)) return make_color_hsv(
clamp(round(lerp(color_get_hue(c0), color_get_hue(c1), t)), 0, 255), __clamp255_mf0 lerp(color_get_hue(c0), color_get_hue(c1), t) __clamp255_mf1,
clamp(round(lerp(color_get_saturation(c0), color_get_saturation(c1), t)), 0, 255), __clamp255_mf0 lerp(color_get_saturation(c0), color_get_saturation(c1), t) __clamp255_mf1,
clamp(round(lerp(color_get_value(c0), color_get_value(c1), t)), 0, 255), __clamp255_mf0 lerp(color_get_value(c0), color_get_value(c1), t) __clamp255_mf1,
); );
return make_color_hsva( return make_color_hsva(
clamp(round(lerp(color_get_hue(c0), color_get_hue(c1), t)), 0, 255), __clamp255_mf0 lerp(color_get_hue(c0), color_get_hue(c1), t) __clamp255_mf1,
clamp(round(lerp(color_get_saturation(c0), color_get_saturation(c1), t)), 0, 255), __clamp255_mf0 lerp(color_get_saturation(c0), color_get_saturation(c1), t) __clamp255_mf1,
clamp(round(lerp(color_get_value(c0), color_get_value(c1), t)), 0, 255), __clamp255_mf0 lerp(color_get_value(c0), color_get_value(c1), t) __clamp255_mf1,
clamp(round(lerp(color_get_alpha(c0), color_get_alpha(c1), t)), 0, 255), __clamp255_mf0 lerp(color_get_alpha(c0), color_get_alpha(c1), t) __clamp255_mf1,
); );
} }
@ -278,7 +277,7 @@ function color_diff(c1, c2) {
lerp(ok0[2], ok1[2], t), lerp(ok0[2], ok1[2], t),
]; ];
var a = is_real(c0)? 255 : clamp(round(lerp(color_get_alpha(c0), color_get_alpha(c1), t)), 0, 255); var a = __clamp255_mf0 lerp(color_get_alpha(c0), color_get_alpha(c1), t) __clamp255_mf1;
return make_color_oklab(ok, a); return make_color_oklab(ok, a);
} }
@ -295,7 +294,7 @@ function color_diff(c1, c2) {
lerp(sr0[2], sr1[2], t), lerp(sr0[2], sr1[2], t),
]; ];
var a = is_real(c0)? 255 : clamp(round(lerp(color_get_alpha(c0), color_get_alpha(c1), t)), 0, 255); var a = __clamp255_mf0 lerp(color_get_alpha(c0), color_get_alpha(c1), t) __clamp255_mf1;
return make_color_srgba(sr, a); return make_color_srgba(sr, a);
} }

View file

@ -92,15 +92,15 @@ function gradientObject(color = c_black) constructor {
var rat = (position - _pkey.time) / (_key.time - _pkey.time); var rat = (position - _pkey.time) / (_key.time - _pkey.time);
switch(type) { switch(type) {
case GRADIENT_INTER.smooth : return merge_color_a (_pkey.value, _key.value, rat); case GRADIENT_INTER.smooth : return merge_color_rgba (_pkey.value, _key.value, rat);
case GRADIENT_INTER.hue : return merge_color_hsv (_pkey.value, _key.value, rat); case GRADIENT_INTER.hue : return merge_color_hsva (_pkey.value, _key.value, rat);
case GRADIENT_INTER.oklab : return merge_color_oklab(_pkey.value, _key.value, rat); case GRADIENT_INTER.oklab : return merge_color_oklab(_pkey.value, _key.value, rat);
case GRADIENT_INTER.srgb : return merge_color_srgb (_pkey.value, _key.value, rat); case GRADIENT_INTER.srgb : return merge_color_srgb (_pkey.value, _key.value, rat);
case GRADIENT_INTER.none : return _pkey.value; case GRADIENT_INTER.none : return _pkey.value;
} }
} }
return keys[array_length(keys) - 1].value; //after last color return keys[_len - 1].value; //after last color
} }
static evalFast = function(position) { static evalFast = function(position) {