v4.0.0
4.0.0 (2026-01-06)
🚀 Features
- bump three 0.174 (605816e1)
- cannon: bump ng 20 (273adf00)
- cannon: bump three 178 (d41a6791)
- cannon: bump three (c3feaad4)
- cannon: bump three179 (1d29682a)
- cannon: min ng20 (6c92aedc)
- cannon: bump three 182 (5920c4e6)
- cannon: allow Angular v21 as peer dependency (67f27003)
- core: new renderer (c7bec7eb)
- core: support pierced property (e5a7285b)
- core: add change as THREE native events (e44c2b8a)
- core: allow injectBeforeRender to accept priority as signal (5aad08bc)
- core: expose NgtPortal as module with portal and portalContent grouped (919a1a8f)
- core: expose meshes on loaded object graph (9a0ee1db)
- core: allow provideNgtRenderer to accept options (2bca496b)
- core: remove unused code, expose resolveInstanceKey in applyProps (0bdd9a7f)
- core: rename injectObjectEvents to objectEvents (5a707562)
- core: rename injectBeforeRender to beforeRender (5ab9a3e7)
- core: fill catalogue with symbols from THREE automatically (3ce752cf)
- core: add fn to remove keys from catalogue; extend returns a clean up fn (651cfe2b)
- core: bump three version (e7d2f1d0)
- core: configurable max notification skip count (2554a59e)
- core: bump ng 20 (fca5b470)
- core: bump three 178 (83384cdd)
- core: bump three (9f0e80da)
- core: bump three179 (c6f6e090)
- core: add elementEvents for NGT events and THREE native events (ede5c0b7)
- core: min ng20 (677c1b6e)
- core: bump three 182 (ffc690d6)
- core: allow Angular v21 as peer dependency (0cb56440)
- core: new generate json script (cb3a6834)
- core,soba/loaders,soba/staging: implement resources (79184dce)
- core/dom: expose NgtCanvas as a module with canvas and canvasContent grouped (bb0a9491)
- core/dom: expose host element from NgtCanvasContent (fc0a6a74)
- core/dom: expose HTMLCanvasElement and host element through template context (c56de317)
- plugin: add angular-three-plugin (394b95c5)
- plugin: prep gltf generator (8e79050a)
- plugin: prep (8e750b19)
- plugin: add aux generator (384f95e7)
- plugin: add tweakpane as an aux generator option (78a04ea2)
- plugin: add tweakpane to migration group (3dee9634)
- plugin: add theatre to update groups (1b5c0559)
- plugin: bump @rosskevin/gltfjsx 7.1.5 to 7.2.0, node-three-gltf 2.0.2 to 2.1.0 (f9b055f5)
- plugin: update versions for v4 release (422b902d)
- plugin: add angular-three-theatre to aux generator (e79608bd)
- postprocessing: selective bloom effect (dc6b7d1a)
- postprocessing: bump ng 20 (37c2bb1c)
- postprocessing: bump three 178 (f40f3045)
- postprocessing: bump three (d0434edc)
- postprocessing: bump three179 (1d5c771a)
- postprocessing: min ng20 (fb2c8c75)
- postprocessing: bump three 182 (c84c13d8)
- postprocessing: bump postprocessing from 6.37.7 to 6.38.2 (72abdfec)
- postprocessing: expose effect instances publicly (f821f977)
- postprocessing: allow Angular v21 as peer dependency (d58d8b93)
- rapier: allow data to be a function (0dc863fe)
⚠️ rapier: make the colliders' args the colliders name themselves (f6149ca8)- rapier: add interaction groups and physics step support (8ba12fe6)
- rapier: update peer deps on rapier3d-compat (b42e76c6)
- rapier: rename joints to remove inject prefix (739041a2)
- rapier: bump ng 20 (28ce3ab2)
- rapier: bump three 178 (b72e9b3c)
- rapier: bump three and rapier3d (aebd8046)
- rapier: bump three179 (1ab14daa)
- rapier: min ng20 (9faa258d)
- rapier: bump three 182 (9dae6348)
⚠️ rapier: remove numAdditionalFrictionIterations and bump @dimforge/rapier3d-compat (f3b6f81b)- rapier: add filterContactPair and filterIntersectionPair hooks (216f9a93)
⚠️ rapier: add alias 'attractor' to NgtrAttractor options input (787baf12)- rapier: allow Angular v21 as peer dependency (f3debc55)
- rapier/addons: add attractor in addons secondary entry point (c7e6e451)
- repo: migrate 21.2 with angular 20 (6eee3eb9)
- soba: bump ng 20 (6d3fcd44)
- soba: pointerlockcontrols (98d085a9)
- soba: use CameraShake from pmndrs vanilla (38dee637)
- soba: bump three 178 (975ca265)
- soba: bump three (29d263c5)
- soba: bump three179 (672bee60)
- soba: bump vanilla (380ded6b)
- soba: add clouds (f1974875)
- soba: perspective-camera uses ElementEvents (de7184d3)
- soba: min ng20 (263d53dc)
- soba: add sparkles (da57c2f6)
- soba: allow custom object for center box3d (da5a7621)
- soba: bump three 182 (68706420)
- soba: bump three-mesh-bvh from 0.9.1 to 0.9.4 (c52e0478)
- soba: bump three-custom-shader-material from 6.3.7 to 6.4.0 (d7f9a30a)
- soba: bump @monogrid/gainmap-js from 3.1.0 to 3.4.0 (a359b8b3)
- soba: bump @pmndrs/vanilla from 1.24.1 to 1.25.0 (1a760f02)
- soba: export Fisheye from @pmndrs/vanilla (c29786fe)
- soba: bump stats-gl from 3.6.0 to 3.8.0 (b3383f98)
- soba: allow Angular v21 as peer dependency (cbdcec20)
- soba/abstractions: add ngts-text-3D as a selector to text3d (f048731d)
- soba/abstractions: expose NgtObjectEvents on Text (ed877f20)
- soba/abstractions: rename injectHelper to helper (bcfefe0a)
⚠️ soba/cameras: updateinjectFBOusage (efb60cd4)- soba/cameras: rename injectCubeCamera t cubeCamera (e14e1dd1)
- soba/controls: add TrackballControls (30ebfb70)
- soba/controls: remove unused events input from camera controls (459fd1b0)
- soba/gizmos: expose NgtsGizmoHelper as module (a85cf9a9)
- soba/loaders: rename injectProgress to progress (e2b05920)
- soba/misc: expose NgtsHTML as module (60df7770)
⚠️ soba/misc: injectFBO no longer recreates the RenderTarget in a computed (12262c78)⚠️ soba/misc:injectDepthBufferreturnsDepthTextureinstead of Signal (53f515dd)- soba/misc: rename inject* to just function name (450a8c7b)
- soba/misc: rename injectIntersect to intersect (d18fa11d)
- soba/performances: add bvh (89c1e5ab)
- soba/staging: expose NgtsRenderTexture as module (c76f4f7f)
- soba/staging: rename injectMatcapTexture to matcapTextureResource; and injectNormalTexture (5e4b6f67)
- theatre: add theatrejs integration (87be9501)
- theatre: change sheet to a Directive (99625b16)
- theatre: bump ng 20 (79195669)
- theatre: bump three 178 (e68b66ed)
- theatre: bump three (1fdc4879)
- theatre: bump three179 (8d7bcaab)
- theatre: min ng20 (1f8777ce)
- theatre: bump three 182 (ba8a94fa)
- theatre: allow Angular v21 as peer dependency (9eebc8a8)
- tweakpane: tweakpane v1 (54f2a3ef)
- tweakpane: accept optional container (2422bfc7)
- tweakpane: rename tweakpane (54926538)
- tweakpane: bump ng 20 (e996bbcd)
- tweakpane: min ng20 (c209bdff)
- tweakpane: add tweaks() function for declarative control creation (ec3d7e23)
- tweakpane: allow Angular v21 as peer dependency (c01cde83)
🩹 Fixes
- use as const array instead of module (7cbcd9b3)
- core: adjust portals with new renderer (f0243b93)
- core: adjust portals with new renderer (2) (b62b21d3)
- core: html now works (6db540b9)
- core: adjust a lot in renderer (6869f226)
- core: pivot controls work (43c431e6)
- core: update testing lib (2110ec66)
- core: adjust tests in soba (5a18452c)
- core: assign attach directly on instance state (554dc48b)
- core: injectObjectEvents check for NgtInstanceNode (d92164e1)
- core: applyProps assign geometry directly instead of copying (68da7aa8)
- core: run invalidate on canvasOtions changes (e64eccfc)
- core: adjust after attach type (c0197de1)
- core: use resolveRef in NgtParent (b2fc55bd)
- core: pass through defaultGLOptions instead of just canvas for NgtGLOptions (d67e2a75)
- core: bubble up events from primitive children (fb1f73ab)
- core: track the three child on platform parent before passing off to the ancestor (18094f29)
- core: adjust applyProps to match r3f (0ea7a285)
- core: rename selection apis (52fe3404)
- core: adjust NgtRendererLike to also have an optional dispose (cdd34ed5)
- core: add
createdevent (b9cd35aa) - core: add ngt-scene to three elements collection (4bdd2801)
- core: add missing geometry three elements (0f3eb989)
- core: generate rawValue binding (b22e0d70)
- core: make sure NgtThreeElements contain correct types for non-mutable props (1948b34b)
- core: make ngt_args optional (73bd8cbb)
- core: check against ngt-primitive type to prepare ngt-primitive (0bfaab68)
- core: check for handlers before trying to remove event from it (a5dfa497)
- core: add missing skinned-mesh and bone to three types (e04fc3d5)
- core: forgot to update generation (eb09c7c5)
- core: ignore keys.indexOf in loader (need to revisit why) (f560747a)
- core: set check when resolve pierced props (5d89ae1c)
- core: bump threejs 177 (b2151d77)
- core: ng20 resource (3ba5a737)
- core: allow using dotted path for attach array (483fd97d)
- core: support attach in parameters input binding (2654840b)
- core: call compute before early return in event management (90e0b259)
- core: rename ngtObjectEvents/ngtElementEvents to objectEvents/elementEvents (14dec47f)
- core/testing: remove extend(THREE) from testing (de0e0db0)
- plugin: use next version for ngt (f33aa1b2)
- plugin: use tree.write instead because save() ain't enough (17c56f73)
- plugin: look for decorators as descendants (dfd893bd)
- plugin: get template metadata via descendant (44de9464)
- plugin: write template properly (329bde6f)
- plugin: maintain format of template literal (3f3e5fa8)
- plugin: use descendant again instead of child (a14ac5ab)
- plugin: get literal value of templateUrl if available (b5bd817c)
- plugin: expose initGenerator (25865c20)
- plugin: use options modelPath (399fa40e)
- plugin: use let for nodes/materials; call generate; adjust node name (78af9872)
- plugin: adjust generate (8a42b403)
- plugin: add keep names and keep groups options (485657eb)
- plugin: let's see if it works (6c84dc2f)
- plugin: adjust (c7025c51)
- plugin: adjust one more time (9fde6590)
- plugin: gltfPath (9617006c)
- plugin: more gltfPath (f9cbb3e2)
- plugin: handle draco; clean up (801a8619)
- plugin: load draco based on transform (863d7db7)
- plugin: draco is optional instead of default to false (f9063a82)
- plugin: default draco to null? (a345eee1)
- plugin: use string for draco (d008d2dd)
- plugin: adjust draco schema again (ed44f610)
- plugin: adjust migration group (32992318)
- plugin: bump nx 21 (459feceb)
- plugin: update gltf and init generator (79a73ea7)
- plugin: skill issue (2e034320)
- plugin/gltf: use new symbols for gltf generator (16492ac5)
- postprocessing: expose effectComposer (726dfdbe)
- postprocessing: use injectBeforeRender with priority signal (16307f30)
- postprocessing: use renamed selection api (281931d2)
- rapier: compute rotation and quaternion properly (cfd3ea56)
- rapier: use boolean coercion (6308326a)
- rapier: adjust rigidbody and collider input types (35c25040)
- rapier: more inputs adjustments (757fa4c4)
- rapier: make sure args and shape colliders are in sync (0bedb235)
- rapier: convexHull collider should set shape as convexHull (9a82fcc9)
- rapier: debug geometry works with webgpu (9ef1a1f5)
- rapier: bump dimforge (02bb4189)
- soba: adjust html with new renderer (86ff1a7d)
- soba: null check for onBeforeRender in intersect (d8aa85df)
- soba: update peer deps (ae568890)
- soba: fix billboard rotation (66eb44f9)
- soba: gizmo rotation should respect camera up (9e92d423)
- soba: use booleanAttribute for adaptive dpr pixelated input (dfb76f8b)
- soba: use injectBeforeRender with priority signal (c5d6e3dc)
- soba: adjust orbit controls options (60b7d645)
- soba: use elapsedTime instead of getElapsedTime() (08c8491c)
- soba: ng20 resource (7906a906)
- soba: add granular camrea controls outputs (fc58e479)
- soba: update decal (72f9c1da)
- soba: PixelFormat for fbo (d376f54a)
- soba: expose NgtsCameraShakeOptions (16f85abd)
- soba: adjust setUpdateRange to use start instead of offset (63c4cf8e)
- soba: adjust fbo types (3f2d5758)
- soba: pass renderOrder properly to pivotcontrols component (fd7de0a8)
- soba,core: controls now work (96892ad1)
- soba/abstractions: use boolean coercion (a8c842c5)
- soba/abstractions: edges should be segmented (064944c7)
- soba/abstractions: set ngtObjectEvents for Text in effect (55f2a2de)
- soba/abstractions: use viewChild on Text to set NgtObjectEvents (d8780af3)
- soba/abstractions: add ngts-text-3D as selector for text3d (c7d7b5c2)
- soba/abstractions: gradienttexture extends canvas-texture instead of pure texture (1641396a)
- soba/cameras: clean up cameras (2f034b73)
- soba/cameras: assign manual on camera instance (898e9f60)
- soba/cameras: adjust NgtsCubeCameraOptions type (3e0899d9)
- soba/cameras: expose fbo.texture as camera content context instead of fbo (5552d810)
- soba/controls: adjust orbit controls (4bf89340)
- soba/gizmos: use boolean coercion (b91128e0)
- soba/materials: adjust MeshTransmissionMaterialOptions type (8073c453)
- soba/materials: add null to meshtransmissionmaterial background option (d377bc80)
- soba/materials: update
injectFBOusages (c972993e) - soba/materials: granularity with blur signals (f9726701)
- soba/misc: remove deprecated TextureEncoding (cb9b676d)
- soba/performances: adjust tracking logic in bvh effect (883e0f27)
- soba/performances: hide bvh group when retrying setting up geometries (bc28579d)
- soba/staging: use boolean coercions (852b7761)
- soba/staging: dispose texture on destroy (050aee53)
- soba/staging: adjust lightSource type for caustic (efe1e8ab)
- soba/staging: when temporal is false, set a timeout for PLM update in accumulative shadows (e7b47551)
- soba/staging: remove encoding option in injectEnvironment (f3205dd6)
- soba/staging: update
injectFBOusages (6aa59172) - soba/staging: soba build (920f7566)
- theatre: use studio to initialize (1b517a30)
- theatre: fix studio import (2cb857bf)
- theatre: exportAs; expose sheetObject on transform and sync; (ac14210e)
- tweakpane: expose hostDirectives as public API (c0aac2fa)
- tweakpane: append pane as canvas child (4220b907)
- tweakpane: use default tweakpane parent element (2d7120f8)
- tweakpane: use any for binding value instead (5a09ecab)
- tweakpane: adjust how custom container works (85a767ff)
- tweakpane: add tweakpane/core to peer dep (0411bcfc)
💅 Refactors
- cannon: update cannon with new renderer (b73211db)
- core: clean up renderer (04b39d4c)
- core: clean up renderer (8c1ae6c2)
- core: make renderer not aware of store internally (18cafe1e)
- core: refactor more with no-store renderer (c56b03e9)
- core: update object events (6cf56c30)
- core: clean up more renderer code (698e2752)
- core: rename (2045bd31)
- core: remove unnecessary portal injectors handling (79970722)
- core: clean up (e60aa62c)
- core: clean up (e42b7273)
- core: some perf improvements (154e9b97)
- core: perf improvement to events (a0330e22)
- core: do not repeat the same obj in portal (fb2016c1)
- core: merge setPointerEvent to defineProperties in instance (af71414f)
- core: rewrite web-types and metadata generators (dd82e329)
- examples: rename (371eb49b)
- plugin: move generate-util outside (a378788e)
- postprocessing: update postprocessing with new renderer (bfb3dbb5)
- rapier: update rapier with new renderer (25f8ac31)
- soba: clean up abstractions (5f40d894)
- soba: update cameras with new renderer (cb9d2069)
- soba: update abstractions with new renderer (441a5f0b)
- soba: update controls with new renderer (b16d477e)
- soba: update gizmos with new renderer (b41f1d64)
- soba: adjust html with new renderer (155a68d2)
- soba: adjust performances with new renderer (a83ba07c)
- soba: adjust shaders with new renderer (d9bcca60)
- soba: adjust staging with new renderer (d43bd2c7)
- soba: adjust stats and vanilla exports with new renderer (41ca5f5b)
- soba: adjust misc with new renderer (df00fb76)
- soba: clean up (13815128)
- soba/abstractions: use pierced props for extensions derivatives on grid (14a89040)
- soba/cameras: adjust perspective camera code (41b94287)
- soba/cameras: bring makeDefault effect on top for orthographic (52a24031)
- soba/gizmos: use injectObjectEvents for all events for optimizing CDR (for now) (7dc8b027)
- soba/loaders: use fontResource in injectFont (48ba0c7a)
- soba/loaders: use fbxResource in injectFbx (5a0ddd41)
- soba/misc: use onCleanup to clean up fbo embedded view (771d55f2)
- soba/misc: use computed for animations API instead of effect (3d937816)
- soba/misc: use deeply nested signal on htmlContent (d200e3eb)
- soba/staging: use protected (efaba5b2)
- soba/staging: use pierced props for sky (c2ad7a69)
- soba/staging: use pierced props for spot light volumetric mesh (d03e5cdd)
- soba/staging: rename injectSpotLightCommon to spotLightCommon (905dd333)
- soba/staging: use environmentResource in injectEnvironment (eadbf535)
- theatre: use injectObjectEvents for transform events (ebcb6f7c)
- tweakpane: use computed for a lot of bindings stuff instead of set signal (5d77340b)
- tweakpane: rename startChangeEffect to sync (659ff189)
⚠️ Breaking Changes
- rapier: add alias 'attractor' to NgtrAttractor options input (787baf12)
NgtrAttractor now uses [attractor] instead of [options]
Before:
<ngt-object3D attractor [options]="{ strength: 10 }" />
After:
<ngt-object3D [attractor]="{ strength: 10 }" />
- rapier: remove numAdditionalFrictionIterations and bump @dimforge/rapier3d-compat (f3b6f81b)
removenumAdditionalFrictionIterationsinput due to
Rapier library dropping the property altogether - soba/cameras: update
injectFBOusage (efb60cd4)
NgtsCameraContentlet-texturetemplate variable is
aTextureinstead ofSignal<Texture> - soba/misc:
injectDepthBufferreturnsDepthTextureinstead of Signal (53f515dd)
injectDepthBufferreturnsDepthTexture | null
instead ofSignal<DepthTexture | null>. Consumers should update
accordingly - soba/misc: injectFBO no longer recreates the RenderTarget in a computed (12262c78)
injectFBOnow returns aWebGLRenderTargetinstead
ofSignal<WebGLRenderTarget>. All consumers should changeinjectFBO
usage// before fbo = injectFBO(); this.fbo(); // after fbo = injectFBO(); this.fbo; - rapier: make the colliders' args the colliders name themselves (f6149ca8)
this moves the[args]binding to colliders name
before:cuboidCollider [args]="[...]"
after:[cuboidCollider]="[...]"
❤️ Thank You
- Chau @nartc
- nartc