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
|
|
|
}
|
|
|
|
|
2023-02-14 05:32:32 +01:00
|
|
|
function gradientKey(time, value) constructor {
|
|
|
|
self.time = time;
|
|
|
|
self.value = value;
|
|
|
|
|
|
|
|
static clone = function() { return new gradientKey(time, value); }
|
|
|
|
|
|
|
|
static serialize = function() {
|
|
|
|
var m = ds_map_create();
|
|
|
|
m[? "time"] = time;
|
|
|
|
m[? "value"] = value;
|
|
|
|
return m;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-03-02 07:59:14 +01:00
|
|
|
function gradientObject(color = c_black) constructor {
|
|
|
|
if(is_array(color))
|
|
|
|
keys = [ new gradientKey(0, color[0]), new gradientKey(1, color[1]) ];
|
|
|
|
else
|
|
|
|
keys = [ new gradientKey(0, color) ];
|
|
|
|
type = GRADIENT_INTER.smooth;
|
2022-01-13 05:24:03 +01:00
|
|
|
|
2023-03-02 07:59:14 +01:00
|
|
|
static clone = function() {
|
|
|
|
var g = new gradientObject();
|
|
|
|
for( var i = 0; i < array_length(keys); i++ ) {
|
|
|
|
g.keys[i] = keys[i].clone();
|
|
|
|
}
|
|
|
|
g.type = type;
|
2023-02-23 07:02:19 +01:00
|
|
|
|
2023-03-02 07:59:14 +01:00
|
|
|
return g;
|
2022-11-14 03:16:15 +01:00
|
|
|
}
|
|
|
|
|
2023-03-02 07:59:14 +01:00
|
|
|
static add = function(_addkey, _deleteDup = true) {
|
|
|
|
if(array_length(keys) == 0) {
|
|
|
|
array_push(keys, _addkey);
|
|
|
|
return;
|
|
|
|
}
|
2023-01-17 08:11:55 +01:00
|
|
|
|
2023-03-02 07:59:14 +01:00
|
|
|
for(var i = 0; i < array_length(keys); i++) {
|
|
|
|
var _key = keys[i];
|
2023-01-17 08:11:55 +01:00
|
|
|
|
2023-03-02 07:59:14 +01:00
|
|
|
if(_key.time == _addkey.time) {
|
|
|
|
if(_deleteDup)
|
|
|
|
_key.value = _addkey.value;
|
|
|
|
return;
|
|
|
|
} else if(_key.time > _addkey.time) {
|
|
|
|
array_insert(keys, i, _addkey);
|
|
|
|
return;
|
|
|
|
}
|
2022-01-13 05:24:03 +01:00
|
|
|
}
|
2023-03-02 07:59:14 +01:00
|
|
|
|
|
|
|
array_push(keys, _addkey);
|
2022-01-13 05:24:03 +01:00
|
|
|
}
|
|
|
|
|
2023-03-02 07:59:14 +01:00
|
|
|
static eval = function(position) {
|
|
|
|
if(array_length(keys) == 0) return c_black;
|
|
|
|
if(array_length(keys) == 1) return keys[0].value;
|
|
|
|
|
|
|
|
for(var i = 0; i < array_length(keys); i++) {
|
|
|
|
var _key = keys[i];
|
|
|
|
if(_key.time < position) continue;
|
|
|
|
if(_key.time == position) return keys[i].value;
|
2022-01-13 05:24:03 +01:00
|
|
|
|
2023-03-02 07:59:14 +01:00
|
|
|
if(i == 0) //before first color
|
|
|
|
return keys[0].value;
|
2023-02-14 05:32:32 +01:00
|
|
|
|
2023-03-02 07:59:14 +01:00
|
|
|
var c0 = keys[i - 1].value;
|
|
|
|
if(type == GRADIENT_INTER.smooth) {
|
|
|
|
var rat = (position - keys[i - 1].time) / (keys[i].time - keys[i - 1].time);
|
|
|
|
var c1 = keys[i].value;
|
|
|
|
return merge_color(c0, c1, rat);
|
|
|
|
} else if(type == GRADIENT_INTER.none) {
|
|
|
|
return c0;
|
|
|
|
}
|
2022-01-13 05:24:03 +01:00
|
|
|
}
|
2023-03-02 07:59:14 +01:00
|
|
|
|
|
|
|
return keys[array_length(keys) - 1].value; //after last color
|
2022-01-13 05:24:03 +01:00
|
|
|
}
|
2023-03-02 07:59:14 +01:00
|
|
|
|
|
|
|
static draw = function(_x, _y, _w, _h) {
|
|
|
|
static RES = 48;
|
|
|
|
var _step = _w / RES;
|
|
|
|
var _ox, _oc;
|
|
|
|
|
|
|
|
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 = [];
|
|
|
|
|
|
|
|
for(var i = 0; i < array_length(keys); i++) {
|
|
|
|
if(keys[i].value == undefined) return;
|
2022-01-13 05:24:03 +01:00
|
|
|
|
2023-03-02 07:59:14 +01:00
|
|
|
_grad_color[i * 4 + 0] = color_get_red(keys[i].value) / 255;
|
|
|
|
_grad_color[i * 4 + 1] = color_get_green(keys[i].value) / 255;
|
|
|
|
_grad_color[i * 4 + 2] = color_get_blue(keys[i].value) / 255;
|
|
|
|
_grad_color[i * 4 + 3] = 1;
|
|
|
|
_grad_time[i] = keys[i].time;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(array_length(keys) == 0) {
|
|
|
|
draw_sprite_stretched(s_fx_pixel, 0, _x, _y, _w, _h)
|
|
|
|
} else {
|
|
|
|
shader_set(sh_gradient_display);
|
|
|
|
shader_set_uniform_i(uniform_grad_blend, type);
|
|
|
|
shader_set_uniform_f_array_safe(uniform_grad, _grad_color);
|
|
|
|
shader_set_uniform_f_array_safe(uniform_grad_time, _grad_time);
|
|
|
|
shader_set_uniform_i(uniform_grad_key, array_length(keys));
|
|
|
|
|
|
|
|
draw_sprite_stretched(s_fx_pixel, 0, _x, _y, _w, _h)
|
|
|
|
shader_reset();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static toArray = function() {
|
|
|
|
var _grad_color = [], _grad_time = [];
|
2023-02-14 05:32:32 +01:00
|
|
|
|
2023-03-02 07:59:14 +01:00
|
|
|
for(var i = 0; i < array_length(keys); i++) {
|
|
|
|
if(is_undefined(keys[i].value)) continue;
|
2023-02-23 07:02:19 +01:00
|
|
|
|
2023-03-02 07:59:14 +01:00
|
|
|
_grad_color[i * 4 + 0] = color_get_red(keys[i].value) / 255;
|
|
|
|
_grad_color[i * 4 + 1] = color_get_green(keys[i].value) / 255;
|
|
|
|
_grad_color[i * 4 + 2] = color_get_blue(keys[i].value) / 255;
|
|
|
|
_grad_color[i * 4 + 3] = 1;
|
|
|
|
_grad_time[i] = keys[i].time;
|
|
|
|
}
|
|
|
|
|
|
|
|
return [ _grad_color, _grad_time ];
|
2023-02-14 05:32:32 +01:00
|
|
|
}
|
|
|
|
|
2023-03-02 07:59:14 +01:00
|
|
|
static serialize = function() {
|
|
|
|
return json_stringify(self);
|
|
|
|
}
|
|
|
|
|
|
|
|
static deserialize = function(str) {
|
2023-03-05 07:16:44 +01:00
|
|
|
var s = json_try_parse(str);
|
2023-03-02 07:59:14 +01:00
|
|
|
type = s.type;
|
|
|
|
keys = [];
|
|
|
|
for( var i = 0; i < array_length(s.keys); i++ )
|
|
|
|
keys[i] = new gradientKey(s.keys[i].time, s.keys[i].value);
|
|
|
|
|
|
|
|
return self;
|
|
|
|
}
|
2022-01-13 05:24:03 +01:00
|
|
|
}
|