跳到主要内容

VfpPackageReader:URI、预览与缩略图

这一组 API 服务于文件选择、作品列表和外部 GLB 预览。它们不会自动把 PRVW 交给 VoxelViewerVoxelViewer 的 VFP 路径优先使用自身预览缓存。

URI 读取

readUri()

async readUri(uri: string): Promise<ArrayBuffer>

打开只读 URI,检查非空与 64 MiB 上限,完整读取后关闭文件句柄。返回缓冲归调用方所有。权限被回收、URI 不存在、文件大于 64 MiB 或读取长度不足均会拒绝 Promise。

parseUri()validateUri()

async parseUri(uri: string): Promise<VfpDocument>
async validateUri(uri: string): Promise<VfpDocument>

两者均先读取 URI;前者只解析目录,后者还验证所有载荷 CRC。需要权威数据时,按 readUri → validateAuthoritative 显式执行,避免误把容器校验当作体素完整性校验。

async function listSections(uri: string): Promise<Array<string>> {
const reader = VoxelKit.createVfpReader();
const document = await reader.parseUri(uri);
return document.sectionTags();
}

PRVW:extractPreviewGlb()

extractPreviewGlb(bytes: ArrayBuffer): ArrayBuffer

提取 PRVW 后验证其为 GLB 2.0:魔数 glTF、版本 2、声明总长度和实际长度一致。没有 PRVW、CRC 错误或载荷不是有效 GLB 时会抛错。

const glbBytes = reader.extractPreviewGlb(vfpBytes);
console.info('GLB bytes: ' + glbBytes.byteLength);

该方法不保证 GLB 的材质、节点、纹理语义正确;它只做容器级 GLB 结构检查。

THMB:extractThumbnail()

extractThumbnail(bytes: ArrayBuffer): VfpThumbnail
async extractThumbnailUri(uri: string): Promise<VfpThumbnail>

VFP 1.3 的 THMB 是可选的、全局 RAW PNG。Reader 校验目录、区段 CRC、PNG 签名和 IHDR 宽高,返回:

VfpThumbnail 字段类型
mimeTypestring固定为 image/png
widthnumberPNG IHDR 宽度。
heightnumberPNG IHDR 高度。
bytesArrayBuffer与源文件断开的 PNG 副本。

透明底由 PNG alpha 通道表达,Reader 不合成背景色,因此可以直接交由 ArkUI Image 或缓存层决定如何显示。

async function thumbnailSize(uri: string): Promise<string> {
const reader = VoxelKit.createVfpReader();
const thumbnail = await reader.extractThumbnailUri(uri);
return thumbnail.width + ' × ' + thumbnail.height + ' (' + thumbnail.mimeType + ')';
}

缺少 THMB 是正常情况。作品列表应捕获“VFP 不包含 THMB 缩略图”并显示占位图,而不是将它作为导入失败处理。