50 lines
5.6 KiB
TypeScript
50 lines
5.6 KiB
TypeScript
import { Asset } from "expo-asset";
|
||
import type { FieldPayloadRefs } from "@navsea/maplibre-particle-rn";
|
||
|
||
export type V3Frame = Readonly<{ label: "T0" | "T1"; metadataJson: string; validTime: number; generation: number; validityModule: number; scalarModule?: number; vectorModule?: number }>;
|
||
export type V3Dataset = Readonly<{ id: string; title: string; fieldValueSource: "SCALAR" | "VECTOR_MAGNITUDE"; particle: boolean; advectionScale: number; frames: readonly V3Frame[] }>;
|
||
|
||
type Metadata = Readonly<{ validTime: number; generation: number }>;
|
||
// Static requires keep all binary planes outside JS memory and materialize cache-local file:// URIs only.
|
||
function frame(label: "T0" | "T1", metadata: Metadata, validityModule: number, scalarModule?: number, vectorModule?: number): V3Frame {
|
||
return { label, metadataJson: JSON.stringify(metadata), validTime: metadata.validTime, generation: metadata.generation, validityModule, scalarModule, vectorModule };
|
||
}
|
||
function two(id: string, title: string, fieldValueSource: V3Dataset["fieldValueSource"], particle: boolean, advectionScale: number, t0: Omit<V3Frame, "label">, t1: Omit<V3Frame, "label">): V3Dataset {
|
||
return { id, title, fieldValueSource, particle, advectionScale, frames: [{ label: "T0", ...t0 }, { label: "T1", ...t1 }] };
|
||
}
|
||
export const fieldDatasets: readonly V3Dataset[] = [
|
||
two("wind-real", "Wind(本地真实 canonical)", "VECTOR_MAGNITUDE", true, 1,
|
||
frame("T0", require("../../particle-v3-fields/wind-real/2026080700/metadata.json") as Metadata, require("../../particle-v3-fields/wind-real/2026080700/validity.u8"), undefined, require("../../particle-v3-fields/wind-real/2026080700/vector.f32")),
|
||
frame("T1", require("../../particle-v3-fields/wind-real/2026080706/metadata.json") as Metadata, require("../../particle-v3-fields/wind-real/2026080706/validity.u8"), undefined, require("../../particle-v3-fields/wind-real/2026080706/vector.f32"))),
|
||
two("rain-decoder-fixture", "Rain(decoder fallback)", "SCALAR", false, 1,
|
||
frame("T0", require("../../particle-v3-fields/rain-decoder-fixture/2026090912/metadata.json") as Metadata, require("../../particle-v3-fields/rain-decoder-fixture/2026090912/validity.u8"), require("../../particle-v3-fields/rain-decoder-fixture/2026090912/scalar.f32")),
|
||
frame("T1", require("../../particle-v3-fields/rain-decoder-fixture/2026090918/metadata.json") as Metadata, require("../../particle-v3-fields/rain-decoder-fixture/2026090918/validity.u8"), require("../../particle-v3-fields/rain-decoder-fixture/2026090918/scalar.f32"))),
|
||
two("wave-real", "Wave(本地真实 WAVEBIN1)", "SCALAR", true, 1.75,
|
||
frame("T0", require("../../particle-v3-fields/wave-real/2026090918/metadata.json") as Metadata, require("../../particle-v3-fields/wave-real/2026090918/validity.u8"), require("../../particle-v3-fields/wave-real/2026090918/scalar.f32"), require("../../particle-v3-fields/wave-real/2026090918/vector.f32")),
|
||
frame("T1", require("../../particle-v3-fields/wave-real/2026090919/metadata.json") as Metadata, require("../../particle-v3-fields/wave-real/2026090919/validity.u8"), require("../../particle-v3-fields/wave-real/2026090919/scalar.f32"), require("../../particle-v3-fields/wave-real/2026090919/vector.f32"))),
|
||
two("tide-real", "Tide/Current(本地真实 BIN)", "VECTOR_MAGNITUDE", true, 1,
|
||
frame("T0", require("../../particle-v3-fields/tide-real/2026090901/metadata.json") as Metadata, require("../../particle-v3-fields/tide-real/2026090901/validity.u8"), undefined, require("../../particle-v3-fields/tide-real/2026090901/vector.f32")),
|
||
frame("T1", require("../../particle-v3-fields/tide-real/2026090902/metadata.json") as Metadata, require("../../particle-v3-fields/tide-real/2026090902/validity.u8"), undefined, require("../../particle-v3-fields/tide-real/2026090902/vector.f32"))),
|
||
two("wave-synthetic-independence", "Wave synthetic independence", "SCALAR", true, 2.5,
|
||
frame("T0", require("../../particle-v3-fields/wave-synthetic-independence/2026010100/metadata.json") as Metadata, require("../../particle-v3-fields/wave-synthetic-independence/2026010100/validity.u8"), require("../../particle-v3-fields/wave-synthetic-independence/2026010100/scalar.f32"), require("../../particle-v3-fields/wave-synthetic-independence/2026010100/vector.f32")),
|
||
frame("T1", require("../../particle-v3-fields/wave-synthetic-independence/2026010106/metadata.json") as Metadata, require("../../particle-v3-fields/wave-synthetic-independence/2026010106/validity.u8"), require("../../particle-v3-fields/wave-synthetic-independence/2026010106/scalar.f32"), require("../../particle-v3-fields/wave-synthetic-independence/2026010106/vector.f32"))),
|
||
];
|
||
|
||
async function uri(module: number, label: string): Promise<string> {
|
||
const asset = Asset.fromModule(module);
|
||
await asset.downloadAsync();
|
||
if (!asset.localUri?.startsWith("file://")) throw new Error(label + " did not materialize a local file:// URI");
|
||
return asset.localUri;
|
||
}
|
||
|
||
export async function materializeV3Frame(frame: V3Frame): Promise<V3Frame & { payloadRefs: FieldPayloadRefs }> {
|
||
const [validityFileUri, scalarFileUri, vectorFileUri] = await Promise.all([
|
||
uri(frame.validityModule, frame.label + " validity"),
|
||
frame.scalarModule ? uri(frame.scalarModule, frame.label + " scalar") : Promise.resolve(undefined),
|
||
frame.vectorModule ? uri(frame.vectorModule, frame.label + " vector") : Promise.resolve(undefined),
|
||
]);
|
||
if (scalarFileUri) return { ...frame, payloadRefs: vectorFileUri ? { validityFileUri, scalarFileUri, vectorFileUri } : { validityFileUri, scalarFileUri } };
|
||
if (vectorFileUri) return { ...frame, payloadRefs: { validityFileUri, vectorFileUri } };
|
||
throw new Error(frame.label + " has neither scalar nor vector plane");
|
||
}
|