mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-09 21:53:40 +00:00
ifcviewer-web: multi-file loading (federation) via a per-model byte-source
The scene core is already multi-model — models_gpu_ is a map, applyCachedModel APPENDS, and per-model model_id / object_id rebasing / georef+transformation are how the desktop federates today. The only web-specific gap was the byte source: web had ONE global source (__ifcvFile/__ifcvUrl) and reset the scene on every load, so it could show one file at a time. Desktop meanwhile carries a per-model source (streaming_file_path). Mirror that on web: give each model its own web_source_id into a JS source registry (Module.__ifcvSources[id] = a picked File or a sized remote URL). beginWebChunkLoad, the metadata bootstrap, and the on-demand deferred fetch all read from the owning model's source, so several files stream concurrently into one federated scene — reusing all the shared machinery (viewAll, picking, the GUID fetch) untouched. - webReadRangesAsync / ifcvReadRangeInto / ifcvSourceSize take a source id. - loadSidecarMetadataWeb(source_id, …) appends (no resetScene); main_web exposes load_sidecar_from_source_c(id) + clear_scene_c(). - URL size resolution moved to JS (shell.html registers + sizes sources via HEAD/Range), retiring the C-side ifcvBeginUrlSource / ifcv_source_ready dance. - shell.html: source registry + "Open" (replace) / "Add" (append) buttons, multi-file selection; ?model= registers a URL source then loads. Verified: two sidecars from two sources stream into one scene, both fully resident, zero GPU errors. 111/111 unit + 6/6 web smoke pass. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -362,14 +362,12 @@ public:
|
||||
// are read via byte ranges, the streaming model is built, and it is tagged
|
||||
// web-sourced so each chunk's vertex/index ranges are pulled lazily.
|
||||
// Asynchronous — returns immediately and frames the model from the JS
|
||||
// completion callback. resetScene() first to replace.
|
||||
//
|
||||
// - Blob: the picked File on Module.__ifcvFile (Blob.slice).
|
||||
// - URL: a remote sidecar (HTTP Range); resolves total size first, then
|
||||
// runs the shared bootstrap via the ifcv_source_ready callback.
|
||||
void loadSidecarFromBlobWeb();
|
||||
void loadSidecarFromUrlWeb(std::string url);
|
||||
void loadSidecarMetadataWeb(std::string source_label);
|
||||
// completion callback. APPENDS the model (federation); call resetScene()
|
||||
// first to replace. `source_id` indexes the JS byte-source registry
|
||||
// (Module.__ifcvSources[source_id] — a picked File or remote URL, already
|
||||
// sized by shell.html); each federated model streams from its own source.
|
||||
// `source_label` is a log/identity tag.
|
||||
void loadSidecarMetadataWeb(int source_id, std::string source_label);
|
||||
|
||||
// On-demand fetch of the v15 deferred property block (element tree + string
|
||||
// table) for a web-streamed model — what a UI (object tree / selected-name
|
||||
|
||||
Reference in New Issue
Block a user