Skip to content

AI-generated changelog#33181

Open
sunag wants to merge 22 commits intomrdoob:devfrom
sunag:dev-changelog
Open

AI-generated changelog#33181
sunag wants to merge 22 commits intomrdoob:devfrom
sunag:dev-changelog

Conversation

@sunag
Copy link
Collaborator

@sunag sunag commented Mar 15, 2026

Related
#32781

Description

The work is not complete yet, but so you can follow along, I’m updating the changelog to be generated by AI. It should read the first message of the PR, which is usually the most important one, gather everything into a file, and with a context window generate a summary mentioning the new features and migration tips. I’m also thinking about adding new examples.

I would also like to evolve the functionalities using github labels like highlight to make management easier to AI.

The description turned out fun to read, and even using a free token with the flash version it produced a great result, which you can see below in this release.

It’s also possible to specify a release, which can be useful for LLMs.

node utils/changelog.ai.js

AI Summary (r184)

Core

  • Object3D.pivot support in copy(): The Object3D.copy() method now correctly handles the pivot property. Previously, if the source object had a null pivot, it would fail to reset the target's pivot, leading to potential state inconsistencies during cloning.

  • AnimationAction improvements: Several fixes address long-standing issues in AnimationAction, particularly involving timeScale reversal jumps during looped animations and incorrect interpolant settings when using InterpolateBezier. These changes ensure more robust and predictable playback for complex animation setups.

  • Static initialization blocks: The library has transitioned to using ECMAScript 2022 static initialization blocks for setting internal class flags (e.g., isMatrixN, isVectorN). This optimization prevents unnecessary property re-assignment during constructor calls, improving instantiation performance.

WebGPU

  • Dynamic Lighting: Added DynamicLighting support for WebGPURenderer. This feature allows updating lighting parameters without triggering a full material shader re-compilation, significantly improving performance for dynamic scenes.

  • Non-blocking compileAsync(): compileAsync() now utilizes a new NodeBuilder.buildAsync() method that yields between shader stages. This prevents the main thread from freezing during complex pre-compilation tasks, keeping the application responsive.

  • Capabilities Management: Refactored limits and capabilities management into a dedicated WebGPUCapabilities module. This provides a consistent, standardized way to query hardware limits across the renderer, backends, and node builders.

  • Framebuffer Caching: Improved handling of framebuffer targets, specifically for WebXR layers and multiple canvas setups. By caching depth textures per reference and creating distinct framebuffer targets, the renderer avoids redundant texture re-allocations.

Renderer

  • WebGL NodeMaterial Compatibility: Introduced a major compatibility layer via WebGLNodesHandler. This allows WebGLRenderer to support TSL and NodeMaterials, providing a clear transition path for users moving toward WebGPURenderer without forcing an immediate backend switch.

  • Reverse Depth Buffer: Both WebGLRenderer and WebGPURenderer have improved support for reverse-Z rendering. WebGLRenderer now includes warnings when EXT_clip_control is missing, and WebGPURenderer now defaults to depth32float when reverse-Z is enabled to mitigate z-fighting.

  • Performance Optimizations: Significant effort was put into reducing garbage collection in the hot path of the render loop. Inline functions in rendering methods were removed and material/geometry comparisons were optimized using cached lookups, resulting in noticeable FPS gains.

Materials

  • MeshPhysicalMaterial Anisotropy Fix: Corrected a regression where the removal of saturate() resulted in NaN values, causing black pixels in anisotropic materials. The fix re-introduces a guard to prevent division by zero.

  • Packed Normal Map Support: Added support for packed normal maps (RG format) in WebGLRenderer. This brings the WebGL backend to feature parity with WebGPU for optimized normal map storage and rendering.

Loaders

  • EXRLoader Enhancements: Added support for YCbCr color spaces and B44/A compression formats. Additionally, channel rule matching was corrected to ensure correct parsing of complex multi-channel EXR files.

  • USDLoader Improvements: Significant updates to the USD loader, including handling of geometric primitives (Cube, Sphere, etc.), improved skinning accuracy by using the 4 strongest weight influences, and support for MaterialX UsdPreviewSurface shaders.

  • GLTFLoader Morph Targets: Fixed a bug where morph target tracks were incorrectly duplicated when processing multi-primitive meshes, preventing flickering and animation breakage.

Nodes

  • TSL Graph Integration: The Inspector now supports TSL Graph extensions, allowing developers to visually manipulate nodes and materials. This includes a new TSLGraphEditor and improved integration via extension.json.

  • StorageTextureNode Fixes: Addressed two critical issues in StorageTextureNode related to incorrect arguments in generateTextureStore and improper return values during node generation, which previously caused shader compilation failures.

Inspector

  • Timeline and Memory Analysis: Added a new Timeline tab to record and detail backend calls (draws, buffer updates, etc.) and a Memory tab to monitor resource usage. These tools provide deep insight into WebGPU backend state and performance bottlenecks.

  • Extension Support: The Inspector now allows the loading of external extensions, enabling custom GUI panels for specialized debugging workflows.

Examples

Migration Tips

  • NodeMaterial in WebGL: If you are using WebGLRenderer and wish to use TSL/NodeMaterials, you must explicitly initialize the compatibility layer:
    const renderer = new THREE.WebGLRenderer();
    renderer.setNodesHandler( new THREE.WebGLNodesHandler() );
  • FirstPersonControls: The interaction model has been updated. The activeLook property has been removed, and handleResize() is now a deprecated stub. Ensure your implementation relies on drag-based input from the press point.
  • AudioListener: References to THREE.Clock in AudioListener have been replaced by THREE.Timer. Update any custom extensions or listener setups that depended on Clock.
  • Sky Implementation: For best visual quality, ensure your Sky instance is added directly to the Scene rather than solely relying on the environment map. If using the sky for environment lighting, you may want to set showSunDisc = false to avoid sun artifacts.

Generated by gemini-3.1-flash-lite-preview

@github-actions
Copy link

github-actions bot commented Mar 15, 2026

📦 Bundle size

Full ESM build, minified and gzipped.

Before After Diff
WebGL 359.97
85.54
359.97
85.54
+0 B
+0 B
WebGPU 631.8
175.3
631.8
175.3
+0 B
+0 B
WebGPU Nodes 629.92
175.01
629.92
175.01
+0 B
+0 B

🌳 Bundle size after tree-shaking

Minimal build including a renderer, camera, empty scene, and dependencies.

Before After Diff
WebGL 492.17
120.12
492.17
120.12
+0 B
+0 B
WebGPU 704.24
190.16
704.24
190.16
+0 B
+0 B
WebGPU Nodes 653.46
177.53
653.46
177.53
+0 B
+0 B

@sunag sunag changed the title AI-assisted changelog AI-generated changelog Mar 15, 2026
@danrossi
Copy link
Contributor

That is really good. i will make sure to add better descriptive titles if needed. I already use the format WebXRController:description etc.

The tokens might need to come from environment variables. And the model selector could be a config rather than dynamic maybe. So you post to the google api the prompt with the collated commits.

@sunag
Copy link
Collaborator Author

sunag commented Mar 15, 2026

That is really good. i will make sure to add better descriptive titles if needed. I already use the format WebXRController:description etc.

Yeah, I also need to make a validator for the title format.

The tokens might need to come from environment variables. And the model selector could be a config rather than dynamic maybe. So you post to the google api the prompt with the collated commits.

This is just a perspective between defining the configuration dynamically or statically; there is no need to store tokens in environment variables since we are working with direct access to memory.

To be honest, we’re going to use it once a month/release, and I think defining it dynamically is more fun. We can have both if we consider it necessary.

@mrdoob
Copy link
Owner

mrdoob commented Mar 20, 2026

Should we call it changelog.summary.js and make changelog.js call it when running node changelog.js?

I'll have to figure out a way to use my Claude subscription when generating this.
Using the Claude via API key is too expensive.

@sunag sunag marked this pull request as ready for review March 20, 2026 06:29
@sunag
Copy link
Collaborator Author

sunag commented Mar 20, 2026

I'll have to figure out a way to use my Claude subscription when generating this.
Using the Claude via API key is too expensive.

I had created an option to generate a file with the PR descriptions and AI context so that some other LLM can create the summary(copying and pasting); I can add it again if you find it interesting.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants