From 4468f2610744ab9ed7e45d074e4ca6f0b3939202 Mon Sep 17 00:00:00 2001 From: Tanasart Date: Sun, 8 Sep 2024 09:41:43 +0700 Subject: [PATCH] [Particle] Fix gradient evaluation error when after load. --- scripts/color_function/color_function.gml | 61 +++++++++---------- .../gradients_function/gradients_function.gml | 6 +- 2 files changed, 33 insertions(+), 34 deletions(-) diff --git a/scripts/color_function/color_function.gml b/scripts/color_function/color_function.gml index 2b43e1cf7..393af4ff2 100644 --- a/scripts/color_function/color_function.gml +++ b/scripts/color_function/color_function.gml @@ -165,19 +165,6 @@ var b = min(b1 * b2 / 255, 255); 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) { @@ -227,42 +214,54 @@ function color_diff(c1, c2) { #region merge #macro merge_color merge_color_ext #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) { INLINE if(is_real(c0) && is_real(c1)) return __merge_color(c0, c1, t); return make_color_rgba( - clamp(round(lerp(color_get_red(c0), color_get_red(c1), t)), 0, 255), - clamp(round(lerp(color_get_green(c0), color_get_green(c1), t)), 0, 255), - clamp(round(lerp(color_get_blue(c0), color_get_blue(c1), t)), 0, 255), - clamp(round(lerp(color_get_alpha(c0), color_get_alpha(c1), t)), 0, 255), + __clamp255_mf0 lerp(color_get_red(c0), color_get_red(c1), t) __clamp255_mf1, + __clamp255_mf0 lerp(color_get_green(c0), color_get_green(c1), t) __clamp255_mf1, + __clamp255_mf0 lerp(color_get_blue(c0), color_get_blue(c1), t) __clamp255_mf1, + __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 return make_color_rgba( - clamp(round(lerp(color_get_red(c0), color_get_red(c1), t)), 0, 255), - clamp(round(lerp(color_get_green(c0), color_get_green(c1), t)), 0, 255), - clamp(round(lerp(color_get_blue(c0), color_get_blue(c1), t)), 0, 255), - clamp(round(lerp(color_get_alpha(c0), color_get_alpha(c1), t)), 0, 255), + __clamp255_mf0 lerp(color_get_red(c0), color_get_red(c1), t) __clamp255_mf1, + __clamp255_mf0 lerp(color_get_green(c0), color_get_green(c1), t) __clamp255_mf1, + __clamp255_mf0 lerp(color_get_blue(c0), color_get_blue(c1), t) __clamp255_mf1, + __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) { INLINE if(is_real(c0)) return make_color_hsv( - clamp(round(lerp(color_get_hue(c0), color_get_hue(c1), t)), 0, 255), - clamp(round(lerp(color_get_saturation(c0), color_get_saturation(c1), t)), 0, 255), - clamp(round(lerp(color_get_value(c0), color_get_value(c1), t)), 0, 255), + __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, ); return make_color_hsva( - clamp(round(lerp(color_get_hue(c0), color_get_hue(c1), t)), 0, 255), - clamp(round(lerp(color_get_saturation(c0), color_get_saturation(c1), t)), 0, 255), - clamp(round(lerp(color_get_value(c0), color_get_value(c1), t)), 0, 255), - clamp(round(lerp(color_get_alpha(c0), color_get_alpha(c1), t)), 0, 255), + __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, ); } @@ -278,7 +277,7 @@ function color_diff(c1, c2) { 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); } @@ -295,7 +294,7 @@ function color_diff(c1, c2) { 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); } diff --git a/scripts/gradients_function/gradients_function.gml b/scripts/gradients_function/gradients_function.gml index ede45823a..3f8446ea7 100644 --- a/scripts/gradients_function/gradients_function.gml +++ b/scripts/gradients_function/gradients_function.gml @@ -92,15 +92,15 @@ function gradientObject(color = c_black) constructor { var rat = (position - _pkey.time) / (_key.time - _pkey.time); switch(type) { - case GRADIENT_INTER.smooth : return merge_color_a (_pkey.value, _key.value, rat); - case GRADIENT_INTER.hue : return merge_color_hsv (_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_hsva (_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.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) {