Skip to content

v4.0.0

Choose a tag to compare

@nartc nartc released this 06 Jan 06:01

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: update injectFBO usage (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: injectDepthBuffer returns DepthTexture instead 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 created event (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 injectFBO usages (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 injectFBO usages (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)
    remove numAdditionalFrictionIterations input due to
    Rapier library dropping the property altogether
  • soba/cameras: update injectFBO usage (efb60cd4)
    NgtsCameraContent let-texture template variable is
    a Texture instead of Signal<Texture>
  • soba/misc: injectDepthBuffer returns DepthTexture instead of Signal (53f515dd)
    injectDepthBuffer returns DepthTexture | null
    instead of Signal<DepthTexture | null>. Consumers should update
    accordingly
  • soba/misc: injectFBO no longer recreates the RenderTarget in a computed (12262c78)
    injectFBO now returns a WebGLRenderTarget instead
    of Signal<WebGLRenderTarget>. All consumers should change injectFBO
    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