threedim: new 3D asset, scene-graph and object processes (from #2109 stack)#2122
Open
jcelerier wants to merge 9 commits into
Open
threedim: new 3D asset, scene-graph and object processes (from #2109 stack)#2122jcelerier wants to merge 9 commits into
jcelerier wants to merge 9 commits into
Conversation
jcelerier
force-pushed
the
plane/interop
branch
2 times, most recently
from
July 17, 2026 14:10
07a445e to
bc681f8
Compare
jcelerier
added a commit
that referenced
this pull request
Jul 17, 2026
FIX-GLTF (GltfParser.cpp): validate every accessor's byte range against its bufferView/buffer BEFORE extract_primitive dereferences it — a crafted glTF with an out-of-range accessor offset/count read past the buffer (heap OOB). Adds accessor_within_bounds / range_within_view / buffer_source_byte_size guards + an all-accessors sweep in validate(). Test: test_regression_splat_reload (Splat ports stable across save/reload). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014rZgzE8JjWvHDtaVUhxpLE
jcelerier
added a commit
that referenced
this pull request
Jul 17, 2026
FIX-GLTF (GltfParser.cpp): validate every accessor's byte range against its bufferView/buffer BEFORE extract_primitive dereferences it — a crafted glTF with an out-of-range accessor offset/count read past the buffer (heap OOB). Adds accessor_within_bounds / range_within_view / buffer_source_byte_size guards + an all-accessors sweep in validate(). Test: test_regression_splat_reload (Splat ports stable across save/reload). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014rZgzE8JjWvHDtaVUhxpLE
jcelerier
added a commit
that referenced
this pull request
Jul 17, 2026
FIX-GLTF (GltfParser.cpp): validate every accessor's byte range against its bufferView/buffer BEFORE extract_primitive dereferences it — a crafted glTF with an out-of-range accessor offset/count read past the buffer (heap OOB). Adds accessor_within_bounds / range_within_view / buffer_source_byte_size guards + an all-accessors sweep in validate(). Test: test_regression_splat_reload (Splat ports stable across save/reload). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014rZgzE8JjWvHDtaVUhxpLE
jcelerier
added a commit
that referenced
this pull request
Jul 17, 2026
test_unit_image_loader (22 cases / 881 assertions): score::gfx
decodeImageFrom{Path,Memory} (gfx TextureLoader) + Threedim LDR ImageLoader +
ArrayToTexture, across PNG8/16, JPEG, BMP, TIFF8/16, WebP, GIF, TGA, PPM/PGM,
SVG, ICO — exact dimensions, exact/toleranced pixels, RGBA byte order, straight
alpha, top-left origin, 16-bit precision, and graceful rejection of truncated /
garbage / empty / wrong-MIME inputs (ASAN-clean).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014rZgzE8JjWvHDtaVUhxpLE
jcelerier
force-pushed
the
planf/objects
branch
2 times, most recently
from
July 18, 2026 13:37
7c5c25d to
f79c9cc
Compare
jcelerier
force-pushed
the
planf/objects
branch
2 times, most recently
from
July 18, 2026 20:38
3fe10b1 to
5f1b3e3
Compare
(cherry picked from commit a012d1cbdc702366d16093fda112fb3bba4a78dd)
fastgltf's configure step downloads the simdjson single-header when no simdjson::simdjson target or system package exists; network-isolated builds (Flatpak, Nix) fail there. Vendor the pinned single-header copy (v3.12.3, what fastgltf would download) so the build is self-contained. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014rZgzE8JjWvHDtaVUhxpLE
Adds the new 3D processes that build on the scene pipeline: geometry and asset loaders (glTF/FBX via fastgltf/ufbx, image and buffer helpers), cameras, lights and transforms, the scene-graph family (preprocessor, filters, switch/selector/group, duplicator, from-meshes, inspector), buffer/texture inject and extract, PBR materials and instancing, animation with humanoid retargeting and inverse kinematics, and text-to-mesh/texture. These are cross-coupled (they share loader/scene headers), so they land as one coherent unit. The existing ModelDisplay, RenderPipeline and Splat nodes keep their current scene-aware versions. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014rZgzE8JjWvHDtaVUhxpLE
Brings the new 3D objects up to their final state, folding in the bug fixes made after they were first added: Instancer GPU use-after-free and instance-count bounds, OBJ and glTF index bounds-checks, GPU-resource release on partial-init failure, Camera stale transform-slot, extraction buffer sizing and SRB layout, cubemap face sizing and UBO slots, the spherical and triplanar projection shader fixes, animation speed and skinned-mesh deformation, and the review-round corrections. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014rZgzE8JjWvHDtaVUhxpLE
ObjectGallery --list [filter] : print every registered process (name,
uuid), optionally filtered by name.
ObjectGallery --filter <substr> : open a window, instantiate each matching
[--seconds N] object, route its texture output to the
window and play, so all the texture-
producing objects can be watched at once.
Built on the MinimalGUIApplication + window-device path the gfx testers use,
so it drives the real engine. A handy way to try the whole object catalogue.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014rZgzE8JjWvHDtaVUhxpLE
GltfParser.cpp: validate every accessor's byte range against its bufferView/buffer BEFORE extract_primitive dereferences it — a crafted glTF with an out-of-range accessor offset/count read past the buffer (heap OOB). Adds accessor_within_bounds / range_within_view / buffer_source_byte_size guards + an all-accessors sweep in validate(). Test: test_regression_splat_reload (Splat ports stable across save/reload). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014rZgzE8JjWvHDtaVUhxpLE
test_unit_image_loader (22 cases / 881 assertions): score::gfx
decodeImageFrom{Path,Memory} (gfx TextureLoader) + Threedim LDR ImageLoader +
ArrayToTexture, across PNG8/16, JPEG, BMP, TIFF8/16, WebP, GIF, TGA, PPM/PGM,
SVG, ICO — exact dimensions, exact/toleranced pixels, RGBA byte order, straight
alpha, top-left origin, 16-bit precision, and graceful rejection of truncated /
garbage / empty / wrong-MIME inputs (ASAN-clean).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014rZgzE8JjWvHDtaVUhxpLE
Deduplicates the raw QImage handling and picks up decodeImageFromMemory's RGBA8888 canonicalization and footer-less TGA fallback. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014rZgzE8JjWvHDtaVUhxpLE
On glibc < 2.40 there is no _Float16, so the R16F/RGBA16F case compiled to nothing and the texture was uploaded with uninitialized bytes. Convert with a software IEEE 754 binary16 (round-to-nearest-even) fallback instead. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014rZgzE8JjWvHDtaVUhxpLE
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The first cluster of new 3D objects from
split/threedim, on top of the interop stack (#2121). These processes are cross-coupled (they share loader/scene headers, so intermediate subsets don't build) and therefore land as one coherent unit — the same way the scene rework did.Stacked on #2121; retargets to master as the stack merges.
What it adds
fastgltfandufbxsubmodules), unifiedAssetLoader, image/buffer/texture helpers,ObjLoader→GeometryLoaderrename.Camera,CameraArray,CameraSwitch,Light,Transform3D.PBRMesh,MaterialOverride,ConfigurePrimitive,Instancer, shadow-cascade setup.AnimationPlayer, humanoid retargeting, inverse kinematics.The existing
ModelDisplay,RenderPipelineandSplatnodes keep their current scene-aware versions (the oldSplat/node is intentionally preserved). The point-cloudPrimitiveCloudfamily lands in a follow-up PR (it needs the spz/zstd submodules).Validation
ctest: 17/17.🤖 Generated with Claude Code