Files
MapLibreParticleLab/packages/maplibre-particle-rn
OpenAI Codex a0aa367f30
Some checks failed
validate-scripts / validate-scripts (push) Has been cancelled
fix: close V3-08 Android validation
2026-09-11 18:10:33 +08:00
..

@navsea/maplibre-particle-rn

13.4.1-particle.3 提供 React Native 的纯 Field Renderer 接口。它只接收宿主已经准备好的 canonical field 元数据与本地二进制文件,并控制既有 Native/Core 渲染器;不提供地图组件、底图、数据集、provider、HTTP、缓存或业务策略。

Map 与 Camera 必须由 Consumer 直接从 @maplibre/maplibre-react-native@11.3.6 导入。本包将该库声明为 peer dependency,不再转导出 MapLibre React Native。

版本关系

  • RN/TS 包:13.4.1-particle.3
  • Android Native artifact(V3-08 目标):cc.navsea.maplibre:android-sdk-particle-opengl:13.4.1-particle.2

.2 是 STEP-069 v2 multi-plane(shared validity 加可选 scalar/vector)的新 Native artifact 坐标,不能复用或覆盖旧 .1。本次只完成坐标准备;用户尚未手工构建、发布或验收 Android AAR,Expo plugin 现指向目标 .2,不得将其表述为已发布或已通过。

最小接入

import { Camera, Map } from "@maplibre/maplibre-react-native";
import {
  FieldRuntime,
  createParticleFieldStyleFragment,
  type FieldColorStop,
} from "@navsea/maplibre-particle-rn";

const renderer = createParticleFieldStyleFragment();
const mapStyle = JSON.stringify({
  version: 8,
  sources: { ...renderer.sources },
  layers: [...renderer.layers],
});

宿主在样式加载并取得 reactTag 后调用 FieldRuntime.attach(reactTag)。准备 canonical payload 的方式由宿主决定,再按时间顺序调用:

await FieldRuntime.clearFields(reactTag);
await FieldRuntime.submitField(reactTag, metadataJson, {
  validityFileUri: "file:///absolute/path/validity.u8",
  scalarFileUri: "file:///absolute/path/scalar.f32", // 可选
  vectorFileUri: "file:///absolute/path/vector-uv.f32", // 可选;至少 scalar/vector 之一
});
await FieldRuntime.setFieldColorStops(reactTag, [
  { value: 0, red: 0.08, green: 0.2, blue: 0.8, alpha: 0.72 },
  { value: 30, red: 0.9, green: 0.08, blue: 0.08, alpha: 0.72 },
]);

createParticleFieldStyleFragment() 只返回 renderer source、field layer 与 particle layer;不含底图或业务数据。particleFieldIds 可供宿主引用相同的 source/layer ID。

FieldRuntime

全部方法均以 reactTag 为首参并返回既有桥接命令结果:

  • 生命周期:attach、detach、getState
  • 数据:clearFields、submitField(v2 FieldPayloadRefs)
  • renderer 配置:setFieldValueSource("SCALAR" | "VECTOR_MAGNITUDE")、setParticleAdvectionScale(scale)
  • 显示与播放:setEnabled、setFieldVisible、setParticleVisible、setTargetFps、setTargetTime、setPlaybackState、setPlaybackSpeed
  • 色彩:setFieldColorStops、setParticleColor、setTrailColor
  • 粒子视觉参数:setParticleCount、setParticleLineWidth、setParticleLength、setParticleOpacity、setTrailOpacity、setTrailFade、setFieldOpacity

FieldColorStop 使用无业务含义的 value 字段;色阶继续遵循既有 Native 契约,至少提供 2 个且 value 严格递增。包在非原生环境可安全导入;实际调用 FieldRuntime 而 Native bridge 不存在时会给出稳定、明确的错误。

submitField 的 v2 payloadRefs 必须有 validityFileUri,并且必须有 scalarFileUri 或 vectorFileUri。每个引用只能是 file:// URI 或绝对本地路径;桥接层会在读入前检查全部文件、非空性和合计 64 MiB 上限。它不接受 JS number array、Base64 或大 JSON payload。Core 继续按 metadata 精确校验各 plane 的长度、encoding、layout 和 validity。

旧 Native .1 的 submitWindField(metadataJson, byte[]) 是单一 v1 vector ABI。.3 不再以该模糊形状作为主入口;确有旧 native seam 的 Consumer 可显式调用 submitLegacyVectorField,它仅转发冻结的 v1 ABI。新代码应使用目标 Native .2 提供的 v2 submitField。

安装与发布

正式包仍以 HTTPS tarball 交付:

https://pbf.jpcn.ccwu.cc/npm/navsea-maplibre-particle-rn-13.4.1-particle.3.tgz

Consumer 只依赖发布 tarball,不依赖本仓库源码路径。发布前通过 npm pack 检查 tarball 内容;本包不包含 AAR、APK、fixture 或凭证。