Add explicit tusdcat tests for USDC timesamples files that have shown
parsing issues on ARM64 runners. Also upload ARM64 tusdcat binaries as
artifacts for testing in other environments (e.g., QEMU).
Run order: artifact upload -> tusdcat tests -> ctest, so that artifacts
are available even if subsequent tests fail.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Update ARM64 runners from ubuntu-22.04-arm to ubuntu-24.04-arm
- Update LLVM apt repository from jammy to noble for Ubuntu 24.04
- Remove clang default from bootstrap-cmake-linux.sh; now uses
system default compiler unless CC/CXX are explicitly set
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The script was hardcoding CXX=clang++ CC=clang, ignoring any
user-provided environment variables. Now uses shell parameter
expansion to default to clang only if CC/CXX are not already set.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Split build-arm64 into build-arm64-gcc and build-arm64-clang
- build-arm64-gcc: Uses system GCC on Ubuntu 22.04 ARM
- build-arm64-clang: Installs Clang 21 from LLVM apt repository
(previously used system Clang 14 which is outdated)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fix move constructor/assignment operator to transfer value array storage
fields (_value_array_storage, _value_array_refs, _use_value_array)
- Fix copy constructor/assignment operator for value array storage fields
- Add bounds checking for blocked[] and offsets[] array access in pprint
- Strip TYPE_ID_1D_ARRAY_BIT before type lookup in print_pod_value_dispatch
and get_pod_type_size to handle array element types correctly
- Add handler for value array storage path in get_samples()
- Set _use_pod=false when using value array storage
This fixes the "Unknown type_id: 1048618" error when printing array-typed
timeSamples (e.g., color3f[]) and prevents heap-buffer-overflow when
printing timeSamples with None values.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- CMakeLists.txt: Skip libatomic linking on MSVC (atomics built into runtime)
- crate-reader.cc: Use std::transform with explicit cast to fix C4244 warning
- pprinter.cc: Remove duplicate to_string(DomeLight::TextureFormat) to fix LNK4006
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add -Wunknown-warning-option suppression before -Wdeprecated-literal-operator
to prevent build errors on clang versions that don't recognize the latter.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Update all CMakeLists.txt, Makefiles, meson.build, setup.py,
and documentation files to use C++17 standard.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- task-queue.hh: Use mutex fallback on MSVC (no GCC __atomic_* builtins)
- shape-to-mesh.hh: Use kPI/kPI_2 constants instead of M_PI/M_PI_2
- tinyexr_c_impl.c: Use Windows Interlocked functions for MSVC C mode
- unit-task-queue.cc: Fix lambda capture for MSVC
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Update _POSIX_C_SOURCE from 199309L to 200112L for vsnprintf/snprintf
- Silence unused parameter warning in serializePreviewSurfaceToJson
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Remove debug console.log statements from coroutine helpers
- Split Tydra conversion into multiple phases with yields:
- detecting: Format detection
- parsing: USD parsing
- setup: Converter environment setup
- assets: Asset resolution setup
- meshes: Tydra mesh conversion
- complete: Done
- Each phase yields to event loop, allowing browser repaints
- Update progress-demo.js phase mapping with descriptive messages
- The Tydra ConvertToRenderScene call is still blocking, but yields
occur before and after it
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add console.log debug prints at yield points in binding.cc:
- Log when yielding to event loop
- Log when resuming from yield (rAF or setTimeout)
- Log phase name and progress percentage
- Add hasAsyncSupport() method to TinyUSDZLoader.js:
- Checks if loadFromBinaryAsync is available
- Returns true if WASM was built with TINYUSDZ_WASM_COROUTINE=ON
- Update progress-demo.js to use coroutine async when available:
- Check hasAsyncSupport() before loading
- Use parseAsync() for file and URL loading when available
- Fall back to standard Promise-based loading if not
- Map coroutine phases to progress UI stages
- Manual fetch with progress for URL loading in async mode
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add yieldToEventLoop() helper using EM_JS that returns a Promise for requestAnimationFrame
- Implement loadFromBinaryAsync() coroutine that yields between processing phases:
- detecting: format detection
- parsing: USD parsing
- converting: Tydra conversion
- complete: done
- Add reportAsyncPhaseStart() EM_JS callback for JS progress tracking
- Add parseAsync() and loadAsync() methods to TinyUSDZLoader.js
- Parameters passed by value (not reference) to survive co_await suspension points
- No ASYNCIFY required - uses native LLVM coroutine transform
This allows the browser to repaint between processing phases, improving
perceived loading performance for large USD files.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add TextureLoadingManager class for queuing and progressive texture loading
- Add texture progress bar UI (bottom overlay with green theme)
- Modify buildSceneWithProgress to use delayed texture mode
- Scene renders immediately without textures, then textures load in background
- Support textureLoadingManager option in material conversion functions
- Update TinyUSDZMaterialX.js to support delayed loading for OpenPBR materials
- Textures load with concurrency control (2 at a time) and browser yields
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fix lights disappearing from HDRI on refresh in envmap mode by using
lightData.enabled (user's intention) instead of threeLights.visible
(rendering state) for HDRI projection filtering
- Update toggleLight() to respect envmap mode - keep lights hidden for
rendering while still allowing on/off toggling for HDRI purposes
- Fix setLightingMode() to restore lights based on user's enabled state
when switching back to lights mode
- Fix SpotLight rotation gizmo position by resetting light.position to
(0,0,0) after creation (Three.js r146+ defaults to (0,1,0))
- Add getAttachTargetForLight() for proper transform control attachment
based on mode (translate/rotate/scale -> group, target -> target object)
- Add minHdriRadius (0.3) for HDRI projection to ensure lights are visible
- Improve light picking to skip disabled/invisible helpers
- Add drag state management to prevent picking different object after drag
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add envIntensityController to guiState for GUI updates
- Update Env Intensity display when loading DomeLight from USD
- Update Env Intensity display when switching to usd_dome environment
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Export normalTextureId, occlusionTextureId, displacementTextureId in
material-serializer.cc for UsdPreviewSurface materials
- Fix TinyUSDZLoaderUtils.js to properly extract surfaceShader from
nested JSON structure
- Add Normal Mode selector (geometry/mapped) to Show Normals feature
- Add createViewNormalMaterial() shader for view-space normals with
normal map support
- Add extractNormalMapFromMaterial() to extract normal maps from both
OpenPBR/MaterialX and UsdPreviewSurface materials
- Make Env Color and Env Colorspace controls disabled when Environment
is not constant_color
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add EM_JS functions in binding.cc for direct C++ to JS progress reporting
- reportTydraProgress: mesh conversion progress (current/total, stage, name)
- reportTydraStage: conversion stage changes
- reportTydraComplete: conversion completion with counts
- Update TinyUSDZLoader.js with callback options:
- onTydraProgress, onTydraStage, onTydraComplete
- setTydraProgressCallback/setTydraStageCallback/setTydraCompleteCallback methods
- Integrate callbacks in progress-demo.js for real-time UI updates
- Add design document for JS/WASM synchronous event update patterns
This enables real-time progress updates during Tydra scene conversion
without requiring ASYNCIFY, using Emscripten's EM_JS for synchronous
JavaScript calls from C++.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add DetailedProgressInfo struct with mesh/material counts and stage tracking
- Add printf progress logging during Tydra mesh conversion (visible in console)
- Count GeomMesh, GeomCube, and GeomSphere for accurate total mesh count
- Add cleanupScene() function to free Three.js and WASM memory before loading
- Add Fit to Scene button for camera adjustment
- Add multi-mesh test model for progress testing
Console output shows real-time progress:
[Tydra] Found N meshes (X mesh, Y cube, Z sphere), M materials
[Tydra] Mesh 1/N: /path/to/mesh
[Tydra] Conversion complete: N meshes, M materials, T textures
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Core image-loader:
- Add DecodeImageHDR using stbi_loadf_from_memory for float32 RGBA output
- Add IsHDRFromMemory and GetImageInfoHDR functions
- HDR detection runs before STB fallback to ensure float output
WASM binding:
- Update decodeHDR to use stbi_loadf_from_memory instead of image-loader
- Default output format changed to float16 (Uint16Array) for memory savings
- Add TINYUSDZ_WITH_EXR compile definition to binding target
Benchmark (web/js/benchmark-exr.js):
- Compare TinyUSDZ vs Three.js HDRLoader/EXRLoader performance
- Support float32 and float16 output formats
- JSON output mode for automation
- TinyUSDZ is 2.7-3x faster than Three.js for HDR decoding
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add IEEE 754 half-precision float conversion utilities (float32ToFloat16, float16ToFloat32)
- Update decodeEXR/decodeHDR/decodeImage to accept outputFormat parameter ("float32", "float16", "auto")
- Add convertFloat32ToFloat16Array and convertFloat16ToFloat32Array utility functions
- Enable WebAssembly SIMD (-msimd128) by default for better performance
- Add optional Relaxed SIMD support via TINYUSDZ_WASM_RELAXED_SIMD flag
- FP16 output returns Uint16Array for direct WebGL HALF_FLOAT texture upload
- 50% memory savings when using FP16 format for HDR/EXR textures
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Copy TinyEXR v3 source files from upstream tinyexr repository
- Add new CMake option TINYUSDZ_USE_TINYEXR_V3 (default ON)
- V3 provides modern C17/C++17 API with Vulkan-style interface
- V1 API functions remain available for backward compatibility
- Backup original v1 header as tinyexr_v1.h
New files:
- tinyexr_c.h, tinyexr_c_impl.c: Pure C API
- tinyexr_v3.hh: C++17 RAII wrapper
- tinyexr_v2.hh, tinyexr_v2_impl.hh: V2 implementation
- tinyexr_huffman.hh, tinyexr_piz.hh: Compression codecs
- tinyexr_simd*.{hh,h,cc}: SIMD optimizations
- exr_reader.hh, streamreader.hh, streamwriter.hh: Utilities
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Test result files should not be tracked in version control
as they are generated output.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Update title to include WebGL2
- Add comprehensive Quick Start table comparing WebGPU vs WebGL2
- Add WebGL2 with Hardware GPU example (NVIDIA/Vulkan)
- Add WebGL2 with SwiftShader example (software, no GPU)
- Add WebGL2 vs WebGPU comparison table
- Add WebGL2 renderer detection utility function
- Add --use-angle=swiftshader flag to reference table
Key findings:
- WebGL2 works on any origin (no HTTPS requirement unlike WebGPU)
- WebGL2 still requires xvfb (true headless mode doesn't work)
- SwiftShader WebGL2 uses Vulkan 1.3.0 backend
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add headless-chrome-setup.md with comprehensive guide for:
- Hardware GPU acceleration with NVIDIA/Vulkan
- Software rendering with SwiftShader (no GPU required)
- Docker/CI environment setup examples
- Troubleshooting common issues
- Add test.js for WebGPU verification with Puppeteer
- Requires xvfb-run for X11 display
- NVIDIA env vars to select real GPU over llvmpipe
- HTTPS origin required for secure context
Key findings:
- ANGLE Vulkan requires X11 (xcb_connect), solved with xvfb
- True --headless=new mode doesn't work for WebGPU
- SwiftShader works but still needs xvfb
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
JS changes:
- dump-materialx-cli.js: Add --mesh option for dumping vertex data with
winding order analysis (faceVertexIndices, computed face normals)
- materialx.js: Various MaterialX demo improvements
- OpenPBRMaterial.js: OpenPBR material refinements
- TinyUSDZMaterialX.js: MaterialX parsing enhancements
C++ changes:
- render-data.cc/hh: Add MaterialX config and UV handling improvements
- material-serializer.cc: Material serialization updates
- render-scene-dump.cc: Scene dump enhancements
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>