Estendere UFO@home con moduli
Non c'è un account: un modulo è un file a un tuo indirizzo. L'editor lo carica, le registrazioni che ne hanno bisogno lo citano.
Cosa porta un modulo#
Fonti di dati (immagini aeree, rilievo del suolo, meteo, traffico aereo…) e modelli 3D, ognuno con il credito che la sua licenza chiede. Si aggiungono a quelli di UFO@home: nei selettori dell'editor, dopo di essi, e nella scena ovunque una registrazione citi uno dei suoi modelli.
Il manifesto#
Un file JSON, ufoathome-module.json per convenzione, leggibile da altri siti (CORS). I suoi indirizzi relativi si leggono dal suo.
Il manifesto qui sotto è in sola lettura e conosce il suo formato: metti il cursore dentro un oggetto e premi Ctrl+Spazio (⌥+I su Mac) per elencare tutte le chiavi che potrebbero andarci, con ciò che significa ciascuna.
{
"format": 1,
"id": "acme",
"name": "ACME surveys",
"credit": "© ACME",
"creditUrl": "https://acme.example",
"contributes": {
"imagery": [
{
"id": "acme-ortho",
"name": "ACME ortho",
"credit": "© ACME",
"creditUrl": "https://acme.example/licence",
"tiles": "https://tiles.acme.example/ortho/{z}/{x}/{y}.jpg"
}
],
"elevation": [
{
"id": "acme-relief",
"name": "ACME relief",
"credit": "© ACME",
"creditUrl": "https://acme.example/licence",
"tiles": "relief/{z}/{x}/{y}.png"
}
],
"models": [
{
"id": "acme-weather-balloon",
"kind": "entity",
"name": "Weather balloon",
"file": "models/balloon.glb",
"sizeM": {
"widthM": 2,
"lengthM": 2,
"heightM": 2
},
"credit": {
"title": "Weather balloon",
"author": "ACME",
"license": "CC BY 4.0",
"sourceUrl": "https://acme.example/models"
}
}
]
},
"script": "module.js"
}
imagery: tasselli di immagini comuni, con{z},{x}e{y}nell'indirizzo nell'ordine che il servizio dà loro.elevation: tasselli di rilievo codificati in PNG Terrarium (altezza = R × 256 + G + B / 256 − 32768 m).models: file glTF o GLB, ognuno con il suo tipo (vehicle,aircraft,building,entity…), la sua misura e il suo credito, come nel catalogo di UFO@home.- Un
idche un altro modulo o UFO@home dà già nello stesso punto è rifiutato, per tutto il modulo: dai ai tuoi un prefisso tuo.
Quando serve codice#
Un servizio le cui risposte hanno una forma propria richiede codice: script cita un modulo ES il cui export predefinito restituisce implementazioni delle interfacce di src/modules.
// module.js: its default export returns more implementations, at any point.
export default ({ manifestUrl }) => ({
weather: [{
id: "acme-weather", name: "ACME weather", credit: "© ACME", creditUrl: "https://acme.example",
create: () => ({ /* the methods of WeatherProvider */ })
}]
})
I punti a cui un modulo può aggiungere: weather, place, timeZone, narrative, assessment, lightPollution, aircraft, upperAir, elevation, imagery, surroundings, decorModels, skyEvents, interpretations, perception.
Uno script viene eseguito con tutti i diritti della pagina. Viene eseguito solo per un modulo che la persona ha aggiunto, mai per uno che una registrazione cita.
Simulare un tipo di evento del cielo#
Un tipo di evento del cielo (un fulmine, un razzo, un bengala…) è ciò che una registrazione dichiara sotto skyEvents.<chiave>, disegnato nella scena e modificato in una parte propria del gruppo Cielo. La sua simulation dà alla scena un oggetto three.js e lo colloca a ogni immagine, secondo l'istante e il quadro in cui si trova la scena (dov'è l'occhio, l'aria, il suolo, il vento); non disegna mai da sé. Il quadro dice anche dove si trova davvero il testimone, l'istante reale, la magnitudine più debole visibile, ciò che le nubi e l'aria lasciano passare, e le permette di illuminare il suolo (lightFrom) e di abbagliare l'occhio (glareFrom). Costruiscila con il three che lo script riceve, mai con una copia tua. I lanci, i fasci e i bolidi di UFO@home sono scritti così, in src/modules/sky-events.
// A kind of event of the sky: stated in recordings under skyEvents.ballLightning.
export default ({ three }) => ({
skyEvents: [{
id: "ballLightning", name: "Ball lightning", credit: "© ACME", creditUrl: "https://acme.example",
create: () => ({
key: "ballLightning",
title: { en: "Ball lightning", fr: "Foudre en boule" },
simulation: async () => () => {
const object = new three.Group()
return {
object,
drawnCount: 0,
// Places and lights the events at t (ms), from frame.eye; draws nothing itself.
update(events, t, frame) { /* … */ },
dispose() { object.removeFromParent() }
}
},
// Optional: the part of the Sky group that edits them.
editor: async () => (container, host, language) => ({ sync() {}, refresh() {}, setTime(t) {}, async setLanguage(l) {} })
})
}]
})
Un tipo di interpretazione#
Una lettura di un resoconto che pochi parametri dichiarano, calcolata in corpi quando viene mostrata (lanterne volanti lasciate da un giardino, bengala esca sganciati da un aereo): dichiarata sotto interpretation.<chiave>, data a interpretations con una key, un title, bodiesOf(item) che restituisce i corpi che è, e un editor facoltativo. Non un fatto del cielo: ciò che qualcuno afferma che il resoconto abbia visto.
Aggiungerne uno nell'editor#
Nel gruppo File, la voce Moduli: scrivi l'indirizzo del manifesto e premi Aggiungi. I tuoi moduli sono conservati in questo browser, possono essere disattivati o rimossi, e salvati in un file (Salva i miei moduli) che li carica altrove (Carica moduli).
Una registrazione che ne ha bisogno#
Una registrazione che disegna un modello di un modulo lo cita, perché chi la apre veda la stessa cosa: l'editor scrive il suo indirizzo nel file appena uno dei suoi modelli viene usato, relativo alla registrazione quando entrambi sono sullo stesso sito, e Citato da questa registrazione lo toglie. Un lettore che non ha aggiunto il modulo riceve ciò che il suo manifesto dichiara, senza il suo script.
{
"modules": ["https://acme.example/ufo/ufoathome-module.json"]
}
In UFO@home stesso#
Un'implementazione può anche entrare in UFO@home: ogni tipo ha la sua cartella in src/modules, il cui README dice cosa scrivere e dove registrarlo. Una pull request è benvenuta.