2022-01-13 05:24:03 +01:00
|
|
|
enum GRADIENT_INTER {
|
|
|
|
smooth,
|
2022-11-14 03:16:15 +01:00
|
|
|
none,
|
|
|
|
hue
|
2022-01-13 05:24:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
function draw_gradient(_x, _y, _w, _h, _grad, _int = GRADIENT_INTER.smooth) {
|
|
|
|
static RES = 48;
|
|
|
|
var _step = _w / RES;
|
|
|
|
var _ox, _oc;
|
|
|
|
|
2022-11-14 03:16:15 +01:00
|
|
|
var uniform_grad_blend = shader_get_uniform(sh_gradient_display, "gradient_blend");
|
|
|
|
var uniform_grad = shader_get_uniform(sh_gradient_display, "gradient_color");
|
|
|
|
var uniform_grad_time = shader_get_uniform(sh_gradient_display, "gradient_time");
|
|
|
|
var uniform_grad_key = shader_get_uniform(sh_gradient_display, "gradient_keys");
|
|
|
|
|
|
|
|
var _grad_color = [];
|
|
|
|
var _grad_time = [];
|
2022-01-13 05:24:03 +01:00
|
|
|
|
2022-11-14 03:16:15 +01:00
|
|
|
for(var i = 0; i < ds_list_size(_grad); i++) {
|
|
|
|
_grad_color[i * 4 + 0] = color_get_red(_grad[| i].value) / 255;
|
|
|
|
_grad_color[i * 4 + 1] = color_get_green(_grad[| i].value) / 255;
|
|
|
|
_grad_color[i * 4 + 2] = color_get_blue(_grad[| i].value) / 255;
|
|
|
|
_grad_color[i * 4 + 3] = 1;
|
|
|
|
_grad_time[i] = _grad[| i].time;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(ds_list_empty(_grad)) {
|
|
|
|
draw_sprite_stretched(s_fx_pixel, 0, _x, _y, _w, _h)
|
|
|
|
} else {
|
|
|
|
shader_set(sh_gradient_display);
|
|
|
|
shader_set_uniform_i(uniform_grad_blend, _int);
|
|
|
|
shader_set_uniform_f_array(uniform_grad, _grad_color);
|
|
|
|
shader_set_uniform_f_array(uniform_grad_time, _grad_time);
|
|
|
|
shader_set_uniform_i(uniform_grad_key, ds_list_size(_grad));
|
|
|
|
|
|
|
|
draw_sprite_stretched(s_fx_pixel, 0, _x, _y, _w, _h)
|
|
|
|
shader_reset();
|
2022-01-13 05:24:03 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function gradient_eval(_gradient, _time, _int = GRADIENT_INTER.smooth) {
|
|
|
|
if(ds_list_size(_gradient) == 0) return c_white;
|
|
|
|
if(ds_list_size(_gradient) == 1) return _gradient[| 0].value;
|
|
|
|
|
|
|
|
for(var i = 0; i < ds_list_size(_gradient); i++) {
|
|
|
|
var _key = _gradient[| i];
|
|
|
|
if(_key.time >= _time) {
|
|
|
|
if(i == 0)
|
|
|
|
return _gradient[| 0].value;
|
|
|
|
else {
|
|
|
|
var c0 = _gradient[| i - 1].value;
|
|
|
|
if(_int == GRADIENT_INTER.smooth) {
|
|
|
|
var rat = (_time - _gradient[| i - 1].time) / (_gradient[| i].time - _gradient[| i - 1].time);
|
|
|
|
var c1 = _gradient[| i].value;
|
|
|
|
return merge_color(c0, c1, rat);
|
|
|
|
} else if(_int == GRADIENT_INTER.none) {
|
|
|
|
return c0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return _gradient[| ds_list_size(_gradient) - 1].value;
|
|
|
|
}
|
|
|
|
|
|
|
|
function gradient_add(_gradient, _addkey, _deleteDup) {
|
|
|
|
if(ds_list_size(_gradient) == 0) {
|
|
|
|
ds_list_add(_gradient, _addkey);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
for(var i = 0; i < ds_list_size(_gradient); i++) {
|
|
|
|
var _key = _gradient[| i];
|
|
|
|
if(_key.time == _addkey.time) {
|
|
|
|
if(_deleteDup)
|
|
|
|
_key.value = _addkey.value;
|
|
|
|
return;
|
|
|
|
} else if(_key.time > _addkey.time) {
|
|
|
|
ds_list_insert(_gradient, i, _addkey);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ds_list_add(_gradient, _addkey);
|
|
|
|
}
|