- float phase_x = (s.x - phase * model_width / ( 2 * PI)) % model_width;
- float d = sqrt(pow(p.x - phase_x, 2) + pow(p.y - s.y, 2) + pow(p.z - s.z, 2));
- float r = (s.radius);
- float value = max(0, 1 - max(0, d - r) / 10);
-
- c = blendColor(c, color(hue_color + 180 % 360, 70, min(1, value) * 100), ADD);
+ float phase_x = (s.x - phase / (2 * PI) * modelWidth) % modelWidth;
+ float x_dist = LXUtils.wrapdistf(p.x, phase_x, modelWidth);
+
+ float sphere_z = (s == spheres[0]) ? (s.z + sphere1Z.getValuef()) : (s.z - sphere2Z.getValuef());
+
+
+ float d = sqrt(pow(x_dist, 2) + pow(p.y - s.y, 2) + pow(p.z - sphere_z, 2));
+
+ float distance_from_beat = (beat % 2 == 1) ? 1 - ramp : ramp;
+
+ min(ramp, 1-ramp);
+
+ float r = 40 - pow(distance_from_beat, 0.75) * 20;
+
+ float distance_value = max(0, 1 - max(0, d - r) / 10);
+ float beat_value = 1.0;
+
+ float value = min(beat_value, distance_value);
+
+ float sphere_color = (lx.getBaseHuef() - (1 - hueScale.getValuef()) * d/r * 45) % 360;
+
+ c = blendColor(c, lx.hsb((sphere_color + 270) % 360, 60, min(1, value) * 100), ADD);