My janky code:
Object root that generates the sprite objects (created)
for(var i = 0; i < 400; i++) {
var inst = instance_create_layer(0, 0, layer, o3DSpinner);
inst.spinner_index = i;
}
The sprite object code (step)
function rotateXY(x, y, ang) {
var c = cos(ang);
var s = sin(ang);
return [ x * c - y * s, x * s + y * c ];
}
function map(n, a, b, c, d) {
return (n - a) * (d - c) / (b - a) + c;
}
function easeOutQuad(t = 0.5, b = 0, c = 1, d = 1) {
t /= d;
return -c * t * (t - 2) + b;
}
function _merge_color() {
var colors = argument_count-1;
var amount = clamp(argument[colors], 0, 1);
var n = amount * (colors-1);
var col1 = floor(n);
var col2 = col1 + 1;
return merge_color(argument[col1], argument[col2], frac(n));
}
var time = current_time * 0.0001;
var _t = spinner_index / instance_number(o3DSpinner);
var t = time + (_t * pi * 2);
x = cos(t * 3) * 200;
y = sin(t * 5) * 200;
var z = sin(t * 7) * 200;
var rotZX = rotateXY(z, x, time * 2);
z = rotZX[0];
x = rotZX[1];
var zD = (z + 1000) * 0.001;
x *= zD;
y *= zD;
var _scl = map(z, -200, 200, 0, 1);
var scl = map(_scl, 0, 1, 2 / 3, 3 / 2);
image_xscale = scl;
image_yscale = scl;
x += 500;
y += 400;
depth = -z - 300;
var col = _merge_color($FF0000, $FFFF00, $00FF00, $00FFFF, $0000FF, $FF00FF, $FF0000, _t);
image_blend = merge_color($000000, col, easeOutQuad(clamp(_scl, 0.1, 1)));