mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-11 10:06:47 +00:00
8ab5c31e75
The GL backend is gone (task #53). The wgpu/non-wgpu folder split and the Wgpu* class prefix were both disambiguation artefacts from the overlap period — now pure dead weight. ## Folder + library merge * `src/ifcviewer-wgpu/` → folded into `src/ifcviewer/` (git mv tracks every file as a rename so blame/log history survives). * `src/ifcviewer-wgpu-minimal/` → `src/ifcviewer-minimal/` (the exe was already named `IfcViewerMinimal`; this just brings the folder + CMake target name into line). * `src/ifcviewer-wgpu/tests/test_wgpu_{selection,visibility}.cpp` → `src/ifcviewer/tests/test_{selection,visibility}.cpp`, folded into the existing `add_ifcviewer_unit_test(...)` helper. * The `IfcViewerWgpu` static library is dissolved — its sources become part of the unified `IfcViewer` static library, which now bundles scene/loader + renderer in one target. The pre-merge circular dependency (IfcViewer linking IfcViewerWgpu just to get the ViewportWindow.h include path that SceneLoader.h needs) goes away. * The wgpu-native FetchContent block, the Cocoa/QuartzCore link on Apple, the OBJCXX-enabled `.mm` source, and the wgpu-native runtime install all move into `src/ifcviewer/CMakeLists.txt` unchanged. ## Type renames (Wgpu prefix dropped from every Wgpu* identifier) WgpuAreaMeasurement → AreaMeasurement WgpuBufferPool → BufferPool WgpuLengthMeasurement → LengthMeasurement WgpuMetalSurface → MetalSurface WgpuModelGpuData → ModelGpuData WgpuOverlayFrame → OverlayFrame WgpuOverlayRenderer → OverlayRenderer WgpuSectionPlane → SectionPlane WgpuSelectionState → SelectionState WgpuStreamingLoader → StreamingLoader WgpuStreamingThread → StreamingThread WgpuViewportWindow → ViewportWindow WgpuVisibilityState → VisibilityState CMake target IfcViewerWgpuMinimal → IfcViewerMinimal (exe name was already this since wgpu shipped as default). Deliberately kept: `onWgpuLog` (wgpu-native log callback — names a binding to an external API, not one of *our* types), and the WGPU* enum/struct prefixes from wgpu-native's own headers. `WgpuMemProbe` lives in the separate `src/wgpu-mem-probe/` standalone diagnostic project and isn't touched. ## Include-path updates Every `#include "../ifcviewer-wgpu/Wgpu<X>.h"` → `"../ifcviewer/<X>.h"`, every in-directory `#include "Wgpu<X>.h"` → `"<X>.h"`. Includes from sibling subdirectories (modules/, etc.) are updated to point at `../../../ifcviewer/` instead of `../../../ifcviewer-wgpu/`. ## cmake/CMakeLists.txt simplification The redundant `add_subdirectory(ifcviewer-wgpu)` blocks (one inside the BUILD_BONSAIVIEWER fan-in, one in the BONSAIVIEWER-less standalone block) collapse into a single unconditional `add_subdirectory(../src/ifcviewer ifcviewer)`. The standalone block keeps only `wgpu-mem-probe` (the diagnostic tool, unrelated to the viewer lib). ## Verification * Full build green: `IfcViewer` static lib, `IfcViewerMinimal` exe, `BonsaiViewer` exe, all four pre-existing ifcviewer unit tests, and the two new-location tests (`test_selection`, `test_visibility`). * No stray `Wgpu<X>` identifier remains across `src/ifcviewer/`, `src/bonsaiviewer/`, `src/ifcviewer-minimal/` (verified by grep). * Renames tracked by git as `R` entries — `git log --follow` on ViewportWindow.cpp etc. continues to show history through the move. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
108 lines
5.6 KiB
C++
108 lines
5.6 KiB
C++
/********************************************************************************
|
|
* *
|
|
* This file is part of IfcOpenShell. *
|
|
* *
|
|
* IfcOpenShell is free software: you can redistribute it and/or modify *
|
|
* it under the terms of the Lesser GNU General Public License as published by *
|
|
* the Free Software Foundation, either version 3.0 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
* IfcOpenShell is distributed in the hope that it will be useful, *
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
|
* Lesser GNU General Public License for more details. *
|
|
* *
|
|
* You should have received a copy of the Lesser GNU General Public License *
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
|
|
* *
|
|
********************************************************************************/
|
|
|
|
#ifndef WGPUSTREAMINGLOADER_H
|
|
#define WGPUSTREAMINGLOADER_H
|
|
|
|
#include "SidecarCache.h"
|
|
|
|
#include <cstdint>
|
|
#include <optional>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
// Metadata-only sidecar load — the foundation for streaming. Reads the v13
|
|
// header + mesh dict + instance dict + georef + element table from disk but
|
|
// *skips* the bulky vertex and index byte sections, leaving file offsets +
|
|
// sizes for later random-access reads.
|
|
//
|
|
// On a typical real-scene sidecar this returns in milliseconds even when the
|
|
// full readSidecar would block on hundreds of MB of vertex bytes. Lets the
|
|
// renderer set up cull / instance state immediately and load vertex chunks
|
|
// on demand as they become frustum-visible.
|
|
//
|
|
// Backwards-compatible with v13 sidecars on disk (the format isn't changing
|
|
// in this step — we're just reading less of it). v14 with an explicit
|
|
// per-chunk TOC arrives in a follow-up; this layer abstracts the chunk
|
|
// boundaries so the upgrade is internal.
|
|
struct StreamingSidecar {
|
|
// Everything except vertices + indices — same shape as SidecarData but
|
|
// with empty vertices / indices vectors. The renderer uses meshes /
|
|
// instances / georef / elements immediately.
|
|
SidecarData meta;
|
|
|
|
// Byte offsets in the on-disk file where the vertex and index sections
|
|
// start (after their 4-byte count headers). Pair with vertex_total_bytes
|
|
// / index_total_bytes for the section length; per-chunk reads slice
|
|
// arbitrary ranges within these.
|
|
uint64_t vertex_section_offset = 0;
|
|
uint64_t vertex_total_bytes = 0;
|
|
uint64_t index_section_offset = 0;
|
|
uint64_t index_total_count = 0; // u32 indices, NOT bytes
|
|
|
|
// Resolved on-disk path so subsequent chunk reads can re-open / seek.
|
|
std::string file_path;
|
|
};
|
|
|
|
// Read just the metadata + section offsets. Returns nullopt on any I/O or
|
|
// version error (same failure modes as readSidecar). The file is closed
|
|
// before return — callers re-open for per-chunk reads.
|
|
std::optional<StreamingSidecar> readSidecarMetadataOnly(const std::string& ifc_path);
|
|
|
|
// Read a byte range from a sidecar's vertex section. `chunk_byte_offset` is
|
|
// RELATIVE to vertex_section_offset (i.e. 0 = first vertex byte). Returns
|
|
// false on I/O error or out-of-range request.
|
|
//
|
|
// Synchronous; intended to be called from a worker thread for async
|
|
// streaming or from the main thread for stage-1 on-demand load.
|
|
bool readSidecarVertexChunk(const std::string& ifc_path,
|
|
uint64_t vertex_section_offset,
|
|
uint64_t chunk_byte_offset,
|
|
uint64_t chunk_byte_size,
|
|
std::vector<uint8_t>& out_bytes);
|
|
|
|
// Read a u32-index range. `chunk_first_index` is RELATIVE to the start of
|
|
// the index section (i.e. 0 = first u32 index). `chunk_index_count` is in
|
|
// indices (multiply by 4 internally).
|
|
bool readSidecarIndexChunk(const std::string& ifc_path,
|
|
uint64_t index_section_offset,
|
|
uint64_t chunk_first_index,
|
|
uint64_t chunk_index_count,
|
|
std::vector<uint32_t>& out_indices);
|
|
|
|
// Multi-range vertex read. `ranges` is a list of (section-relative
|
|
// byte_offset, byte_size) tuples; their contents are concatenated into
|
|
// out_bytes in input order. Single fopen across all ranges, so it's
|
|
// far cheaper than calling readSidecarVertexChunk N times when a
|
|
// spatially-grouped chunk needs to scatter-gather meshes that aren't
|
|
// adjacent in the sidecar. out_bytes is resized to the total size.
|
|
bool readSidecarVertexRanges(const std::string& ifc_path,
|
|
uint64_t vertex_section_offset,
|
|
const std::vector<std::pair<uint64_t, uint64_t>>& ranges,
|
|
std::vector<uint8_t>& out_bytes);
|
|
|
|
// Same for the index section. Ranges are (first_u32, count_u32);
|
|
// concatenated into out_indices in input order.
|
|
bool readSidecarIndexRanges(const std::string& ifc_path,
|
|
uint64_t index_section_offset,
|
|
const std::vector<std::pair<uint64_t, uint64_t>>& ranges,
|
|
std::vector<uint32_t>& out_indices);
|
|
|
|
#endif // WGPUSTREAMINGLOADER_H
|