- 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>
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>
- mtlx-normalmap-plane.usda: Changed faceVertexIndices from [0,1,2,3] to [0,3,2,1]
- mtlx-normalmap-multi.usda: Fixed plane meshes winding order (cubes were already correct)
The CCW winding [0,3,2,1] produces face normals pointing UP (+Y) matching
the declared vertex normals, ensuring correct front-face rendering.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add DEBUG flag (default false) and debugLog() wrapper function
- Convert ~50+ console.log debug statements to use debugLog()
- Keep console.warn/error for important messages
- Remove unused RectAreaLightHelper import
Set DEBUG = true to re-enable debug output.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fix duplicate CustomToneMapping function definition error by stripping
existing definition from original shader chunk before appending
- Replace broken CAM-based Hellwig 2022 implementation with simpler
working approximation using ACES filmic curve with luminance-based
blending for hue preservation and highlight desaturation
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace polling with lightweight event-driven mechanisms:
- bpy.msgbus subscriptions for material/light property changes
- depsgraph_update_post handler for transform changes
- Timer only for viewport camera (100ms, unavoidable)
Add remote Blender support via HTTP endpoints:
- GET /blender/bridge.py - Full Python script
- GET /blender/bootstrap - Auto-connect one-liner
Remote Blender can now connect with single command:
import urllib.request; exec(urllib.request.urlopen("http://SERVER:8090/blender/bootstrap").read().decode())
Files:
- blender/bridge_simple.py - Standalone script (MCP compatible)
- blender/bridge_addon.py - Full Blender addon with UI panel
- server.js - Added HTTP endpoints for script serving
- SETUP.md - Updated with event architecture and remote setup
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
WebSocket-based bridge for streaming USD scenes from Blender to a
Three.js browser viewer with live parameter synchronization.
Features:
- WebSocket server (port 8090) for Blender-to-browser communication
- Scene upload with binary USDZ payload support
- Real-time parameter updates (materials, lights, camera, transforms)
- Blender viewport camera sync to browser
- Fit to Scene button in viewer UI
- TinyUSDZ WASM integration for USD parsing in browser
- Delta detection to minimize network traffic
Components:
- server.js: WebSocket server with session management
- lib/: Message protocol, connection manager, scene state
- client/: Browser WebSocket client and parameter sync
- viewer/: Three.js viewer with TinyUSDZ integration
- send-camera.js: Helper to send Blender camera to browser
- test-client.js: Test client for debugging
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>