Files
MapLibreParticleLab/integration/react-native/MapLibreParticleRNTestHost/src/fieldDatasets.ts
OpenAI Codex 8588e6fcb8
Some checks failed
validate-scripts / validate-scripts (push) Has been cancelled
feat: add V3 field fixtures and RN regression host
2026-09-11 09:56:53 +08:00

50 lines
5.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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");
}