Add accelerated sky preview
This commit is contained in:
parent
c9aca2ed50
commit
b659ae09ab
2 changed files with 57 additions and 2 deletions
|
|
@ -1262,6 +1262,33 @@ const HORIZON_F = 0.585; // fração da altura da tela até o horizonte
|
||||||
const TWINKLE_MAG = 4.0; // até esta magnitude a estrela cintila; acima é estática
|
const TWINKLE_MAG = 4.0; // até esta magnitude a estrela cintila; acima é estática
|
||||||
const DEG = Math.PI / 180;
|
const DEG = Math.PI / 180;
|
||||||
window.__skyTimeOffset = 0; // debug: ms somados ao relógio p/ testar a rotação
|
window.__skyTimeOffset = 0; // debug: ms somados ao relógio p/ testar a rotação
|
||||||
|
let skyTimeScale = 1;
|
||||||
|
let skyClockRealMs = Date.now();
|
||||||
|
let skyClockSimMs = skyClockRealMs;
|
||||||
|
|
||||||
|
function skyNowMs() {
|
||||||
|
const realNow = Date.now();
|
||||||
|
return skyClockSimMs + (realNow - skyClockRealMs) * skyTimeScale +
|
||||||
|
window.__skyTimeOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
function setSkyTimeScale(scale) {
|
||||||
|
const realNow = Date.now();
|
||||||
|
scale = Number(scale);
|
||||||
|
if (!Number.isFinite(scale) || scale < 1) scale = 1;
|
||||||
|
if (scale === skyTimeScale) return;
|
||||||
|
if (scale === 1 || skyTimeScale === 1) {
|
||||||
|
/* Entrar e sair da prévia sempre parte do instante real, sem deixar o
|
||||||
|
wallpaper preso no futuro simulado. */
|
||||||
|
skyClockSimMs = realNow;
|
||||||
|
} else {
|
||||||
|
skyClockSimMs += (realNow - skyClockRealMs) * skyTimeScale;
|
||||||
|
}
|
||||||
|
skyClockRealMs = realNow;
|
||||||
|
skyTimeScale = scale;
|
||||||
|
lastProjMs = -Infinity;
|
||||||
|
projectSky();
|
||||||
|
}
|
||||||
|
|
||||||
/* Tempo sideral local em graus (GMST + longitude leste) */
|
/* Tempo sideral local em graus (GMST + longitude leste) */
|
||||||
function localSiderealDeg(ms) {
|
function localSiderealDeg(ms) {
|
||||||
|
|
@ -1598,7 +1625,7 @@ function projectSky() {
|
||||||
}
|
}
|
||||||
const bctx = renderCanvas.getContext('2d');
|
const bctx = renderCanvas.getContext('2d');
|
||||||
bctx.clearRect(0, 0, W, bufferH);
|
bctx.clearRect(0, 0, W, bufferH);
|
||||||
const lst = localSiderealDeg(Date.now() + window.__skyTimeOffset);
|
const lst = localSiderealDeg(skyNowMs());
|
||||||
const glareOn = !document.body.classList.contains('balada') &&
|
const glareOn = !document.body.classList.contains('balada') &&
|
||||||
!document.body.classList.contains('chuva');
|
!document.body.classList.contains('chuva');
|
||||||
const nextTwinkList = [];
|
const nextTwinkList = [];
|
||||||
|
|
@ -1684,7 +1711,8 @@ function resizeCanvas() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function drawStars(ts) {
|
function drawStars(ts) {
|
||||||
if (ts - lastProjMs > 30000) { lastProjMs = ts; projectSky(); }
|
const projectionInterval = skyTimeScale > 1 ? 4000 : 30000;
|
||||||
|
if (ts - lastProjMs > projectionInterval) { lastProjMs = ts; projectSky(); }
|
||||||
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
||||||
const transition = Math.max(0, Math.min(1,
|
const transition = Math.max(0, Math.min(1,
|
||||||
(ts - skyTransitionStart) / SKY_TRANSITION_MS));
|
(ts - skyTransitionStart) / SKY_TRANSITION_MS));
|
||||||
|
|
@ -1714,6 +1742,22 @@ function drawStars(ts) {
|
||||||
|
|
||||||
window.addEventListener('resize', resizeCanvas);
|
window.addEventListener('resize', resizeCanvas);
|
||||||
|
|
||||||
|
/* Prévia temporal controlada por toggle-sky-timelapse.sh. Em 360x, uma hora
|
||||||
|
sideral passa em dez segundos e o ciclo diário leva quatro minutos. */
|
||||||
|
let skyTimeScaleFileVal = null;
|
||||||
|
(function pollSkyTimeScaleFile() {
|
||||||
|
fetch('file:///tmp/skeledance-sky-timescale?t=' + Date.now())
|
||||||
|
.then(r => r.text())
|
||||||
|
.then(t => {
|
||||||
|
const v = t.trim();
|
||||||
|
if (v === skyTimeScaleFileVal) return;
|
||||||
|
skyTimeScaleFileVal = v;
|
||||||
|
setSkyTimeScale(v);
|
||||||
|
})
|
||||||
|
.catch(() => {})
|
||||||
|
.finally(() => setTimeout(pollSkyTimeScaleFile, 800));
|
||||||
|
})();
|
||||||
|
|
||||||
/* ============================================================
|
/* ============================================================
|
||||||
FLOOR CANVAS — perspective grid with true vanishing point
|
FLOOR CANVAS — perspective grid with true vanishing point
|
||||||
============================================================ */
|
============================================================ */
|
||||||
|
|
|
||||||
11
toggle-sky-timelapse.sh
Executable file
11
toggle-sky-timelapse.sh
Executable file
|
|
@ -0,0 +1,11 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
STATE_FILE=/tmp/skeledance-sky-timescale
|
||||||
|
|
||||||
|
if [ "$(cat "$STATE_FILE" 2>/dev/null)" = "360" ]; then
|
||||||
|
printf '1\n' > "$STATE_FILE"
|
||||||
|
printf 'Céu em tempo real\n'
|
||||||
|
else
|
||||||
|
printf '360\n' > "$STATE_FILE"
|
||||||
|
printf 'Céu acelerado 360x (1 hora a cada 10 segundos)\n'
|
||||||
|
fi
|
||||||
Loading…
Add table
Add a link
Reference in a new issue