mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-11 18:16:40 +00:00
ifcviewer: rename sidecar transfer/record types; drop unused element hierarchy (sidecar v17)
Rename the streamer/sidecar transfer and record types to describe what they are rather than how they move: MeshChunk -> StreamedMesh InstanceChunk -> StreamedInstance InstanceCpu -> InstanceInfo PackedElementInfo -> ElementTableRecord uploadMeshChunk -> uploadStreamedMesh uploadInstanceChunk -> uploadStreamedInstance buildMeshChunk -> buildStreamedMesh and the two post-index sidecar metadata blocks: "critical" metadata -> "geometry" metadata (meshes/instances/georef/TOC) "deferred" metadata -> "element" metadata (elements + string table) parseSidecarCritical -> parseSidecarGeometryMetadata parseSidecarDeferred -> parseSidecarElementMetadata The one behavioural change: the element hierarchy (parent_id) was carried through ElementInfo, ElementTableRecord, and the sidecar element table but never consumed, so drop it and bump SIDECAR_VERSION 16 -> 17. No back-compat: regenerate sidecars. sample.ifcview is regenerated at v17. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -25,9 +25,9 @@
|
||||
// uint32 num_indices
|
||||
// uint32[num_indices] index data <-- streaming skips
|
||||
// uint32 num_meshes + MeshInfo[] <-- streaming reads
|
||||
// uint32 num_instances + InstanceCpu[] <-- streaming reads
|
||||
// uint32 num_instances + InstanceInfo[] <-- streaming reads
|
||||
// uint32 has_coord_op + double[16] + 2× double <-- streaming reads
|
||||
// uint32 num_elements + PackedElementInfo[] <-- streaming reads
|
||||
// uint32 num_elements + ElementTableRecord[] <-- streaming reads
|
||||
// uint32 string_table_bytes + char[] <-- streaming reads
|
||||
//
|
||||
// Streaming reader returns offsets to the two skipped sections so chunks
|
||||
@@ -100,8 +100,8 @@ bool parseSidecarHead(const uint8_t* data, size_t n, uint64_t& out_geom_bytes) {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool parseSidecarCritical(const uint8_t* data, size_t n, SidecarData& out) {
|
||||
// v15 render-critical block: meshes, instances, georef, chunk TOC.
|
||||
bool parseSidecarGeometryMetadata(const uint8_t* data, size_t n, SidecarData& out) {
|
||||
// v15 geometry metadata block: meshes, instances, georef, chunk TOC.
|
||||
BufCursor c{data, n};
|
||||
if (!c.takeVec(out.meshes)) return false;
|
||||
if (!c.takeVec(out.instances)) return false;
|
||||
@@ -113,8 +113,8 @@ bool parseSidecarCritical(const uint8_t* data, size_t n, SidecarData& out) {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool parseSidecarDeferred(const uint8_t* data, size_t n, SidecarData& out) {
|
||||
// v15 deferred block: element tree + string table (UI/picking, not rendered).
|
||||
bool parseSidecarElementMetadata(const uint8_t* data, size_t n, SidecarData& out) {
|
||||
// v15+ element metadata block: elements + string table (UI/picking, not rendered).
|
||||
BufCursor c{data, n};
|
||||
if (!c.takeVec(out.elements)) return false;
|
||||
uint32_t stbl_len = 0;
|
||||
@@ -166,16 +166,18 @@ std::optional<StreamingSidecar> readSidecarMetadataOnly(const std::string& ifc_p
|
||||
return SidecarCompress::decompress(z.data(), z.size(), raw.data(), raw.size());
|
||||
};
|
||||
|
||||
std::vector<uint8_t> crit, def;
|
||||
if (!readBlock(crit)) return fail();
|
||||
if (!readBlock(def, &out.deferred_comp_offset, &out.deferred_comp_size,
|
||||
&out.deferred_raw_size)) return fail();
|
||||
std::vector<uint8_t> geometry_metadata, element_metadata;
|
||||
if (!readBlock(geometry_metadata)) return fail();
|
||||
if (!readBlock(element_metadata, &out.element_metadata_comp_offset, &out.element_metadata_comp_size,
|
||||
&out.element_metadata_raw_size)) return fail();
|
||||
std::fclose(f);
|
||||
|
||||
// Desktop reads both blocks up front; the web path reads only critical
|
||||
// before painting and fetches the deferred block on demand.
|
||||
if (!parseSidecarCritical(crit.data(), crit.size(), out.meta)) return std::nullopt;
|
||||
if (!parseSidecarDeferred(def.data(), def.size(), out.meta)) return std::nullopt;
|
||||
// Desktop reads both blocks up front; the web path reads only geometry
|
||||
// metadata before painting and fetches the element metadata block on demand.
|
||||
if (!parseSidecarGeometryMetadata(geometry_metadata.data(), geometry_metadata.size(), out.meta))
|
||||
return std::nullopt;
|
||||
if (!parseSidecarElementMetadata(element_metadata.data(), element_metadata.size(), out.meta))
|
||||
return std::nullopt;
|
||||
return out;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user