diff --git a/CLAUDE.md b/CLAUDE.md
index 64b7e4c..83c978d 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -200,7 +200,11 @@ supplies:
- **The globe** (`wwwroot/js/globe.js`, an ES module imported by `GlobePanel`) runs on globe.gl, vendored in
`wwwroot/vendor/globe/` with its textures (`SOURCES.md` has versions, licences and hashes; the service worker never
precaches it). It looks at the spherical mean of the located posts in view, pulses and draws an arc to a hovered
- post, follows the theme (day/night texture), honours `prefers-reduced-motion` and pauses while hidden. CDN-fronted
+ post, follows the theme (day/night texture), honours `prefers-reduced-motion`, and draws only while something moves
+ (idle, it costs no GPU time; `wake()` before anything that animates). Each pixel computes its own map coordinates
+ from its point on the sphere (`sharpen`), so the poles don't pinch; the map wraps horizontally and gets 8×
+ anisotropic filtering (`keepSharp`). The day texture is NASA's, its seam repaired by
+ `tools/globe/prepare-day-texture.py` (dev-only, needs Pillow). CDN-fronted
posts are labels per CDN on a ring at 68°N, never a place; hovering one draws its arc there and a ring where the server
was before the CDN. The posts'
places reach it in one call per feed change; cards are matched by `data-post-id`.
diff --git a/Components/Feed/GlobePanel.razor b/Components/Feed/GlobePanel.razor
index cd7e578..59c4f0c 100644
--- a/Components/Feed/GlobePanel.razor
+++ b/Components/Feed/GlobePanel.razor
@@ -12,7 +12,7 @@
@if (stats is { Error: null } live)
{
- @Fixed(live.Latitude), @Fixed(live.Longitude) · @Fixed(live.Altitude) · @live.Fps fps
+ @Fixed(live.Latitude), @Fixed(live.Longitude) · @Fixed(live.Altitude) · @(live.Idle ? Localizer["idle"] : $"{live.Fps} fps")
}
else if (stats?.Error is { Length: > 0 })
{
@@ -129,9 +129,9 @@
yield return NerdRow.Of(Localizer["points"], $"{stats.Points} ({stats.Posts} {Localizer["posts"]}, {stats.Servers} {Localizer["servers"]})");
yield return NerdRow.Of(Localizer["CDN groups"], stats.CdnGroups > 0 ? stats.CdnGroups : null);
yield return NerdRow.Of(Localizer["hovered"], stats.Hovered is { } hovered ? $"{hovered} ({stats.Arcs} {Localizer["arcs"]}, {stats.Rings} {Localizer["rings"]})" : null);
- yield return NerdRow.Of("fps", stats.Paused ? Localizer["paused"] : stats.Fps.ToString());
+ yield return NerdRow.Of("fps", stats.Paused ? Localizer["paused"] : stats.Idle ? Localizer["idle: nothing moves, nothing is drawn"] : stats.Fps.ToString());
yield return NerdRow.Of(Localizer["auto-rotate"], stats.AutoRotate);
- yield return NerdRow.Of(Localizer["texture"], stats.Texture is { } texture ? $"{texture} 4096×2048" : null);
+ yield return NerdRow.Of(Localizer["texture"], stats.Texture is { } texture ? $"{texture} 4096×2048, {stats.Anisotropy}× anisotropic" : null);
yield return NerdRow.Of("WebGL", stats.Renderer);
yield return NerdRow.Of(Localizer["error"], stats.Error);
}
@@ -179,8 +179,10 @@
public int Fps { get; set; }
public string Renderer { get; set; }
public string Texture { get; set; }
+ public int Anisotropy { get; set; }
public bool AutoRotate { get; set; }
public bool Paused { get; set; }
+ public bool Idle { get; set; }
public string Hovered { get; set; }
public int Arcs { get; set; }
public int Rings { get; set; }
diff --git a/Resources/AllStrings.it.resx b/Resources/AllStrings.it.resx
index 80d3a8a..1c9669b 100644
--- a/Resources/AllStrings.it.resx
+++ b/Resources/AllStrings.it.resx
@@ -680,4 +680,10 @@
gruppi CDN
+
+ fermo
+
+
+ fermo: nulla si muove, nulla viene disegnato
+
diff --git a/Resources/AllStrings.resx b/Resources/AllStrings.resx
index 0b3ef28..520e4b1 100644
--- a/Resources/AllStrings.resx
+++ b/Resources/AllStrings.resx
@@ -680,4 +680,10 @@
CDN groups
+
+ idle
+
+
+ idle: nothing moves, nothing is drawn
+
diff --git a/tools/globe/prepare-day-texture.py b/tools/globe/prepare-day-texture.py
new file mode 100755
index 0000000..4980848
--- /dev/null
+++ b/tools/globe/prepare-day-texture.py
@@ -0,0 +1,61 @@
+#!/usr/bin/env python3
+# Builds wwwroot/vendor/globe/earth-blue-marble.jpg from NASA's Blue Marble Next Generation (topography and bathymetry,
+# December 2004, public domain), downloaded once:
+# https://eoimages.gsfc.nasa.gov/images/imagerecords/73000/73909/world.topo.bathy.200412.3x5400x2700.jpg
+# usage: tools/globe/prepare-day-texture.py