Releases: pixijs/pixijs
Release list
v8.20.1
💾 Download
Installation:
npm install pixi.js@8.20.1Development Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.20.1/dist/pixi.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.20.1/dist/pixi.mjs
Production Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.20.1/dist/pixi.min.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.20.1/dist/pixi.min.mjs
Documentation:
Changed
🐛 Fixed
- fix: preserve UBO offsets in unsafe-eval polyfill by @darkdi in #12154
- fix: svg radial gradients render as a linear gradient by @creativoma in #12156
- fix: detach from shared
TextStyleon destroy by @qiao-coding in #12159
🧹 Chores
- chore: bump
@xmldom/xmldomto 0.8.15 by @Zyie in #12162- Removes the
npm warn deprecated @xmldom/xmldom@0.8.14warning printed when installingpixi.js.
- Removes the
New Contributors
- @darkdi made their first contribution in #12154
- @qiao-coding made their first contribution in #12159
Full Changelog: v8.20.0...v8.20.1
v8.20.0
💾 Download
Installation:
npm install pixi.js@8.20.0Development Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.20.0/dist/pixi.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.20.0/dist/pixi.mjs
Production Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.20.0/dist/pixi.min.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.20.0/dist/pixi.min.mjs
Documentation:
Changed
🚨 Behavior Change
- feat: WGSL shader overrides, depth-stencil formats, partial buffer updates & view caching by @Zyie in #12089
StructsAndGroups.isUniformis replaced byaccessMode, which also describes storage buffers. This one fails quietly; the old property readsundefinedrather than throwing.
// before if (group.isUniform) { /* ... */ } // after if (group.accessMode === 'uniform') { /* ... */ }
- fix: apply render group world color and alpha to ParticleContainer by @TheOnlyJason in #12132
ParticleContainerignored the tint and alpha of any ancestor render group, staying fully opaque while everything else faded. Particles now inherit both, so scenes with aParticleContainerunder a tinted or faded render group will look different. Remove any manual compensation you added.
- fix: WebGPU ignores clockwiseFrontFace by @koteelok in #12139
State.clockwiseFrontFacereached the WebGPU pipeline as a cull mode rather than a winding, so@builtin(front_facing)in WGSL reported the opposite ofgl_FrontFacingin GLSL. Which triangles survive culling is unchanged, but WGSL shaders branching onfront_facingwithclockwiseFrontFace: truenow take the other branch; revert any workaround that inverted it.
- fix: align Polygon.strokeContains with the drawn stroke by @Jaybhade in #12137
strokeContainssplit the stroke width on the squared width and ignored winding order, so at the defaultalignment: 0.5the hit area was ~41% wider than the drawn line, and at alignment 0 or 1 it sat on the opposite side of the edge. Hit testing now matches what's drawn.
const graphics = new Graphics() .poly([0, 0, 100, 0, 100, 100, 0, 100], true) .stroke({ width: 20, alignment: 0 }); graphics.containsPoint({ x: -10, y: 50 }); // now true, inside the drawn stroke graphics.containsPoint({ x: 10, y: 50 }); // now false, nothing is drawn there
- fix: Rectangle containsRect edge containment by @cyphercodes in #12083
containsRecttested the right and bottom edges with a strict<, so identical rectangles reportedfalse. Identical rects, and any rect flush against the container's right or bottom edge, now returntrue. Code using it as a strict-interior test, or branching onfalseto mean "partially outside", now takes the other branch.
🎁 Added
- feat: WGSL shader overrides, depth-stencil formats, partial buffer updates & view caching by @Zyie in #12089
- feat: geometry vertexCount, WebGPU render bundles, depth-only targets & Safari WGSL fallback by @Zyie in #12090
- feat: WebGPU-first RenderTarget attachment architecture & TextureView depth sampling by @Zyie in #12091
- feat: copyDepthTexture for render targets (WebGPU/WebGL2) by @Zyie in #12092
- feat: add opt-in flipY render-orientation toggle by @GoodBoyDigital in #12098
RenderOptions.flipYinverts a render's Y orientation, flipping the projection and the winding/cull inversion together. That lets you capture a scene into a texture in screen orientation, which is what 3D geometry UVs expect, without a per-material flip at sample time and with back-face culling still correct. Absent orfalseis a no-op on both backends.
import { Sprite, Texture, TextureSource } from 'pixi.js'; const texture = new Texture({ source: new TextureSource({ width: 256, height: 256 }) }); renderer.render({ container: mesh, target: texture, clear: true, flipY: true }); const sprite = new Sprite(texture);
- feat: copy depth into textures and expose resolved front-face orientation by @GoodBoyDigital in #12103
- feat(rendering): object-form bind/push and capturable bind state by @GoodBoyDigital in #12104
- feat: export GPU shader layout helpers for advanced users by @GoodBoyDigital in #12143
- feat(rendering): object-form bind/push and capturable bind state by @GoodBoyDigital in #12104
- feat: geometry vertexCount, WebGPU render bundles, depth-only targets & Safari WGSL fallback by @Zyie in #12090
🐛 Fixed
- fix: stop Geometry.destroy from double-freeing the index buffer by @GoodBoyDigital in #12144
- fix: support chrome 150+ HTML-in-Canvas upload signatures by @Zyie in #12077
- fix: harden WebGPU render targets, bind groups & pipeline/texture caching by @Zyie in #12093
- fix: prevent double-destroy of render targets on teardown by @Zyie in #12095
- fix: add persistentDeviceId to FederatedPointerEvent by @ShiKirill in #12102
- fix: release mask bindings when pooled AlphaMaskEffect returns to the pool by @shell362 in #12131
- fix: WebGPU sibling sprite masks rendering with each other's mask matrix by @GoodBoyDigital in #12149
- fix: account for frame origin and rotation in graphics texture fills by @Zyie in #12123
- fix: handle missing base in bitmap font parsers by @Zyie in #12121
- fix: use the correct vertex for the first edge in Triangle.strokeContains by @spokodev in #12105
- fix: copy radius in RoundedRectangle.copyFrom by @spokodev in #12129
- fix: unregister GraphicsContext listeners on destroy by @Srinu520 in #12140
- fix: rebuild cached bind groups when the GC unloads uniform buffers by @GoodBoyDigital in #12147
- fix: substitute Texture.EMPTY when a mask texture is destroyed while still in use by @GoodBoyDigital in #12148
- fix: prevent duplicate onRender registrations from same-parent reorders by @Zyie in #12120
🧹 Chores
- chore: tidy cube/mip handling in GPU & GL texture systems by @Zyie in #12088
- fix: make GCSystem lazy-hash-replacement tests independent of real elapsed time by @santichausis in #12124
- fix: raise pixelMatch threshold for html-text-stroke-anchor-tagged visual test by @santichausis in #12138
- fix: stop publish-branch job from poisoning the node_modules cache by @Zyie in #12152
- chore: remove dead https://pixijs.io/customize link in v7 migration guide by @sanjibani in #12094
- chore: export html-source module from docs index by @Zyie
New Contributors
- @ShiKirill made their first contribution in #12102
- @sanjibani made their first contribution in #12094
- @cyphercodes made their first contribution in #12083
- @spokodev made their first contribution in #12105
- @Jaybhade made their first contribution in #12137
- @Srinu520 made their first contribution in #12140
- @santichausis made their first contribution in #12124
- @shell362 made their first contribution in #12131
- @TheOnlyJason made their first contribution in #12132
Full Changelog: v8.19.0...v8.20.0
v8.19.0
💾 Download
Installation:
npm install pixi.js@8.19.0Development Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.19.0/dist/pixi.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.19.0/dist/pixi.mjs
Production Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.19.0/dist/pixi.min.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.19.0/dist/pixi.min.mjs
Documentation:
Changed
🚨 Behavior Change
- fix: Container.updateTransform honors zero scale (#12044) by @Zyie in #12046
Container.updateTransform({ scaleX: 0, scaleY: 0 })previously coerced a zero scale to1(the code usedopts.scaleX || 1), so passing0left the container at full size. It now applies zero scale literally, matchingscale.set(0, 0). If you relied onupdateTransformignoring a zero scale, stop passing0when you mean full scale.
const container = new Container(); container.updateTransform({ scaleX: 0, scaleY: 0 }); // before: scale coerced to (1, 1) — container stayed full-size // after: scale applied as (0, 0) — container hidden, matching scale.set(0, 0)
- fix: particle container inherit blend mode by @DmitriyGolub in #11978
ParticleContainernow respects the blend mode inherited from its ancestors. Previously the render pipe read the container's own localblendModeinstead of the resolvedgroupBlendMode, so setting e.g.stage.blendMode = 'add'had no effect on particles. Particles nested under a parent with a non-default blend mode will now render differently (e.g. additive brightening) where they were silently ignored before. AblendModeset directly on theParticleContaineris unchanged.
- fix: FillPattern tiling and radial gradient sizing by @Zyie in #12037
-
FillPatterngains atextureSpaceoption ('global' | 'local'), while fixing several long-standing pattern/gradient sizing bugs.textureSpacedefaults to'global', so patterns now tile continuously across adjacent shapes instead of remapping per shape;setTransform(matrix)now applies the matrix you pass directly (it previously inverted and rescaled it by the texture size); andtextureSpace: 'local'radial gradients now scale to the gradient's outer radius. Existing pattern fills and local radial gradients can render differently.If you hand-compensated for the old
setTransformbehavior (pre-inverting or scaling by texture size), remove that compensation. The legacy positionalnew FillPattern(texture, repetition)form still works.
import { Assets, FillPattern, Graphics } from 'pixi.js'; const texture = await Assets.load('pattern.png'); // new options-object constructor with explicit textureSpace const pattern = new FillPattern({ texture, repetition: 'repeat', textureSpace: 'local' }); const g = new Graphics().rect(0, 0, 200, 100).fill({ fill: pattern });
-
🎁 Added
- feat: add HTML-in-Canvas texture support by @Zyie in #12053
- A new opt-in
pixi.js/html-sourcesubpath renders live DOM elements into PixiJS textures while the element stays fully interactive in the browser (inputs editable, links clickable, CSS animations running). UseHTMLSourcefor a live element orElementImageSourcefor an immutable snapshot. The element must be a direct child of the Pixi canvas. Importing the subpath also registers a lowest-priorityTexture.fromfallback for generic HTML elements, so it cannot affect apps that don't import it.
import { Application, Sprite } from 'pixi.js'; import { HTMLSource } from 'pixi.js/html-source'; const app = new Application(); await app.init({ resizeTo: window }); document.body.appendChild(app.canvas); const form = document.createElement('form'); form.innerHTML = '<input value="still editable" />'; app.canvas.appendChild(form); // must be a direct child of the Pixi canvas const sprite = Sprite.from(new HTMLSource({ resource: form, autoUpdate: true })); app.stage.addChild(sprite); // live DOM mirrored to the GPU; the form stays interactive
- A new opt-in
- feat: implement transientAttachment for MSAA RenderTextures for WebGPU by @GoodBoyDigital in #12050
- Texture sources gain an opt-in
transientflag so the WebGPU backend can discard the MSAA buffer at the end of a render pass (storeOp: 'discard') instead of writing it back to memory, and keep MSAA contents in tile memory on TBDR mobile GPUs whereGPUTextureUsage.TRANSIENT_ATTACHMENTis available. This cuts memory bandwidth for single-pass MSAA render targets. Only set it on antialiased textures that follow a single-pass-then-discard pattern; a laterloadOp: 'load'on a transient attachment yields undefined contents. Default isfalse, so existing code is unaffected. A WebGPU-onlyrenderer.device.extensions.transientAttachmentprobe reports device support.
- Texture sources gain an opt-in
🐛 Fixed
- fix: BitmapText trailing glyph after glyph-less word-break char by @Zyie in #12035
- fix: SplitText crash when text begins with whitespace (#12040) by @Zyie in #12041
- fix: TilingSprite tileRotation shears pattern on non-square sprites by @Zyie in #12062
- fix: canvas renderer does not round anchor offset when roundPixels is enabled by @Clonex in #12051
- fix: pass renderer's maxBatchableTextures to non-default batchers by @SerG-Y in #12029
- fix: handle null from getShaderSource/getShaderInfoLog on lost context (#12032) by @Zyie in #12042
- fix: GCSystem unload resources before nulling hash entry by @Zyie in #12038
🧹 Chores
- chore: bundle pixijs-skills and add sync workflow by @Zyie in #12045
- Ships 25 PixiJS v8 AI agent skills under
skills/in the published npm package, available atnode_modules/pixi.js/skills/after install.
- Ships 25 PixiJS v8 AI agent skills under
- chore: document blend mode resolution inheritance by @MFei8ht in #12067
- chore: restrict postMessage origin in playground for better security by @RinZ27 in #12055
- chore: bump @xmldom/xmldom from ^0.8.12 to ^0.8.13 by @Copilot in #12025
- chore: bump parse-svg-path by @bigtimebuddy in #12071
- chore: standardize graphics test naming and expand visual coverage by @Zyie in #12036
- chore: stabilize HTMLText visual tests against CI flakiness by @Zyie in #12039
- chore: pin node to 24.15.0 and update GitHub Actions by @Zyie in #12070
- chore: add missing path pattern to CODEOWNERS by @Copilot in #12027
New Contributors
- @RinZ27 made their first contribution in #12055
- @MFei8ht made their first contribution in #12067
- @Clonex made their first contribution in #12051
Full Changelog: v8.18.1...v8.19.0
v8.18.1
💾 Download
Installation:
npm install pixi.js@8.18.1Development Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.18.1/dist/pixi.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.18.1/dist/pixi.mjs
Production Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.18.1/dist/pixi.min.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.18.1/dist/pixi.min.mjs
Documentation:
Changed
🐛 Fixed
- fix: prevent error when using
Application.domContainerRootin Node.js by @UlyssesZh in #12017
v8.18.0
💾 Download
Installation:
npm install pixi.js@8.18.0Development Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.18.0/dist/pixi.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.18.0/dist/pixi.mjs
Production Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.18.0/dist/pixi.min.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.18.0/dist/pixi.min.mjs
Documentation:
Changed
🚨 Behavior Change
- fix:
text.widthand word wrap returning incorrect values by @Zyie in #12007Text/HTMLText/BitmapTextwithwordWrap: trueand non-leftalign(center/right/justify) now return the true rendered width fromtext.widthinstead of reportingwordWrapWidth. If you relied ontext.width === wordWrapWidthfor layout, usewordWrapWidthdirectly or wrap the text in a sized container.
const text = new Text({ text: 'hello', style: { wordWrap: true, wordWrapWidth: 800, align: 'center' }, }); // before: text.width === 800 // after: text.width reflects the rendered string width
🎁 Added
- feat: add
graphicsContextToSvg()for Graphics → SVG export by @GoodBoyDigital in #11989- Adds
graphicsContextToSvg(source, precision?), a pure function that serializes aGraphicsorGraphicsContextto a self-contained SVG string. Supports rects, circles, ellipses, rounded rects, polygons, bezier/quadratic/arc paths, strokes, holes (viafill-rule="evenodd"), and linear/radial gradients.
import { Graphics, graphicsContextToSvg } from 'pixi.js'; const g = new Graphics() .rect(0, 0, 100, 50) .fill({ color: 0xff0000 }) .circle(150, 25, 25) .stroke({ color: 0x0000ff, width: 4 }); const svgString = graphicsContextToSvg(g, 2); await navigator.clipboard.writeText(svgString);
- Adds
- feat: add mask channel selection for sprite masks by @Zyie in #11987
setMask()gains achanneloption ('red' | 'alpha') to pick which texture channel drives visibility, matching how design tools like Figma apply PNG masks. Default remains'red'.
import { Assets, Sprite } from 'pixi.js'; const photo = new Sprite(await Assets.load('photo.png')); const maskSprite = new Sprite(await Assets.load('mask-alpha.png')); photo.setMask({ mask: maskSprite, channel: 'alpha', });
- feat: allow
preferenceto accept an array of renderer types by @Zyie in #11963autoDetectRendererandApplication.initnow accept an array of renderer names forpreference, letting you restrict the fallback chain (e.g. disable WebGPU entirely) rather than only reorder it. A newRendererPreferencetype is exported.
import { Application, autoDetectRenderer } from 'pixi.js'; const renderer = await autoDetectRenderer({ preference: ['webgl', 'canvas'], }); const app = new Application(); await app.init({ preference: ['webgl', 'canvas'] });
- feat: provide a getter to the domElement via
app.domContainerRootby @carlos22 in #11974Applicationexposes a read-onlydomContainerRootgetter returning theHTMLDivElementthat wraps allDOMContainerelements, so apps can add CSS classes, inline styles, or customize the DOM overlay root.
import { Application } from 'pixi.js'; const app = new Application(); await app.init({ resizeTo: window }); app.domContainerRoot.classList.add('pixi-dom-layer'); app.domContainerRoot.style.pointerEvents = 'auto';
- feat: add
widthoption toMeshRopeby @mehmetcanakbay in #11990MeshRopenow accepts an explicitwidthfor rope thickness, decoupling it from the texture's height. Omittingwidthpreserves the previoustexture.heightdefault.
import { MeshRope, Point, Texture } from 'pixi.js'; const points = [new Point(0, 0), new Point(100, 50), new Point(200, 0)]; const rope = new MeshRope({ texture: Texture.from('snake.png'), points, width: 40, });
- feat: add a default anchor to texture generation by @ksv90 in #12011
renderer.generateTexture()accepts adefaultAnchoroption that's forwarded onto the producedTexture.RenderTexture.create()also gains atextureOptionsparameter to pass through fields likedefaultAnchorto the underlyingTexture.
import { Graphics, Sprite } from 'pixi.js'; const shape = new Graphics().circle(0, 0, 50).fill(0xff3366); const texture = app.renderer.generateTexture({ target: shape, defaultAnchor: { x: 0.5, y: 0.5 }, }); const sprite = new Sprite(texture); sprite.position.set(200, 200); // centered by default
🐛 Fixed
- fix: stroke-only Graphics masks now render correctly on Canvas renderer by @DmitriyGolub in #11979
- fix: skip
_applyMipRangefor single-mip textures (iOS 18.0–18.1) by @GoodBoyDigital in #11985 - fix: stale
TextureMatrixwhen pooled textures reuse the same reference by @GoodBoyDigital in #11997 - fix: unhandled actions in
GraphicsPath.transform()switch statement by @Zyie in #11996 - fix(VideoSource): avoid play/mediaReady recursion before video dimensions (#11133) by @satoren in #12009
- fix:
text.widthand word wrap returning incorrect values by @Zyie in #12007 - fix: handle literal
<characters inparseTaggedTextby @glennflanagan in #11972 - fix: move
CanvasFilterSystemto the filters module by @Zyie in #12014 - fix:
SplitTextbaseline mismatch whentagStylesused withlineHeightby @Zyie in #12008 - fix:
TilingSprite.tilePositiondivided by resolution when using Canvas renderer by @Zyie in #11957 - fix: move
CanvasFilterSystemto filters module by @Zyie in #12014 - fix(VideoSource): avoid play/mediaReady recursion before video dimensions by @satoren in #12009
🧹 Chores
New Contributors
- @mehmetcanakbay made their first contribution in #11990
- @DmitriyGolub made their first contribution in #11979
- @carlos22 made their first contribution in #11974
- @satoren made their first contribution in #12009
- @ksv90 made their first contribution in #12011
- @glennflanagan made their first contribution in #11972
v8.17.1
💾 Download
Installation:
npm install pixi.js@8.17.1Development Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.17.1/dist/pixi.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.17.1/dist/pixi.mjs
Production Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.17.1/dist/pixi.min.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.17.1/dist/pixi.min.mjs
Documentation:
Changed
🐛 Fixed
- fix: compressed textures ignoring resolution from URL (e.g.
@0.75x) by @Zyie in #11960 - fix: center-align text correctly when words exceed wordWrapWidth by @Zyie in #11966
🧹 Chores
v8.17.0
💾 Download
Installation:
npm install pixi.js@8.17.0Development Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.17.0/dist/pixi.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.17.0/dist/pixi.mjs
Production Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.17.0/dist/pixi.min.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.17.0/dist/pixi.min.mjs
Documentation:
Changed
🚨 Behavior Change
BlurFilternow uses an optimized halving strength scheme by default, which changes visual output compared to previous versions. Setlegacy: trueto restore the old behavior.new BlurFilter({ legacy: true }); // or globally: BlurFilter.defaultOptions.legacy = true;
- Text with
align: 'justify'now useswordWrapWidthfor width calculation instead ofmaxLineWidth, matching CSS behavior. The last line is no longer stretched. breakWords: trueinHTMLTextnow correctly uses CSSword-break: break-wordinstead ofbreak-allto match behavior of other text renderers.
🎁 Added
- feat: add tagged text support to canvasTextSplit by @Zyie in #11949
SplitTextnow supportstagStyles, so styled runs (e.g.<red>Hello</red> <blue>World</blue>) are correctly split into per-characterTextobjects with individual styles preserved.
- feat: Improves text rendering and layout handling by @Zyie in #11947
- Bitmap text now supports
whiteSpacemodes (normal,pre,nowrap,pre-line,pre-wrap) with proper space/newline collapsing - Bitmap text word wrap supports break-after characters (hyphens, en-dash, em-dash, soft hyphen)
- Canvas text and split text now render
align: 'justify'by distributing extra word spacing - Dynamic bitmap fonts scale drop shadow
bluranddistanceproportionally to font size - Bitmap font
xAdvancenow uses true advance width frommeasureText()instead of bounding-box width - Kerning values correctly scaled by
fontScalein dynamic bitmap fonts
- Bitmap text now supports
- feat: add visibleChanged event to container by @ikigai-bjorn-s in #11940
container.on('visibleChanged', (visible) => { console.log('Visibility changed to:', visible); });
- feat: Add function for removing aliases from resolver by @Sertion in #11921
🐛 Fixed
- fix: prevent filter corruption with TexturePool mipmap separation by @vkarponen in #11865
- fix: blur by reducing strength on each pass by @Zyie in #11909
- fix: Reduce work done by the blur shader by @Sertion in #11917
- fix: Correctly handle offset in ColorMatrixFilter by @Sertion in #11925
- fix: Apply global filter offset to ParticleContainer rendering by @GoodBoyDigital in #11882
- fix: respect texture trim offset in NineSliceSprite by @shtse8 in #11919
- fix: return valid empty bounds from empty Graphics by @GoodBoyDigital in #11908
- fix: Graphics getLocalBounds returns stale data between operations in same frame by @GoodBoyDigital in #11886
- fix: Graphics bounds account for miter joins at sharp angles by @GoodBoyDigital in #11884
- fix: BindGroup crash when resource destroyed in batched group by @GoodBoyDigital in #11876
- fix: remove listener from old resource in BindGroup.setResource by @GoodBoyDigital in #11901
- fix: removeAllListeners() on Renderer.destroy() by @taye in #11951
- fix: correct minFPS/maxFPS mutual clamping in Ticker by @Zyie in #11952
- fix: invalidate cached source in color.setAlpha() to prevent stale alpha reuse by @darthvader58 in #11924
- fix: emit removed event when using addChildAt by @aSipz in #11912
- fix: guard against missing characters and kerning data in bitmap text by @stargazer-2697 in #11907
- fix: copy modifier keys from TouchEvent to normalized touch objects by @kaigritun in #11906
- fix: use quotes when loading a Web font to support old versions of Chrome by @adngdb in #11902
- fix: move DOMPipe registration to init.ts to fix Web Worker support by @Zyie in #11953
- fix: clarify BackgroundLoader cache behavior in documentation by @imuday984 in #11935
🧹 Chores
- chore: Add PixiJS development playground by @GoodBoyDigital in #11878
- chore: overhaul documentation system with TypeDoc plugins, examples, and guides by @Zyie in #11905
- chore: consolidate build and test scripts by @Zyie in #11910
- chore: expand build, test, and API documentation by @Zyie in #11956
- chore: combine visual test diff output into single labeled image by @Zyie in #11954
- chore: add ESLint rule enforcing ~/ imports in test and scene files by @Zyie in #11899
- chore: reorganizes visual scene tests into logical subdirectories by @Zyie in #11872
- chore: Improve test server setup by dynamically allocating port by @Zyie in #11874
- chore: increase HTMLText visual test wait from 250ms to 350ms by @Zyie in #11891
- chore: remove tsc-silent dependency by @Zyie
- docs: document filters + RenderLayer limitation by @GoodBoyDigital in #11883
New Contributors
- @adngdb made their first contribution in #11902
- @kaigritun made their first contribution in #11906
- @darthvader58 made their first contribution in #11924
- @Sertion made their first contribution in #11925
- @shtse8 made their first contribution in #11919
- @aSipz made their first contribution in #11912
- @ikigai-bjorn-s made their first contribution in #11940
- @vkarponen made their first contribution in #11865
- @imuday984 made their first contribution in #11935
- @taye made their first contribution in #11951
v8.16.0
💾 Download
Installation:
npm install pixi.js@8.16.0Development Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.16.0/dist/pixi.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.16.0/dist/pixi.mjs
Production Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.16.0/dist/pixi.min.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.16.0/dist/pixi.min.mjs
Documentation:
Changed
🚨 Behavior Change
SplitTextnow more accurately splitsTextacross a wider range ofTextStyleconfigurations. This may result in slight changes to character positioning.- Using
SplitText.fromfrom an existingTextnow correctly transfers the source anchor to the new instance by mapping the anchor to pivot coordinates. This changes layout and positioning compared to previous behavior. SplitBitmapTextnow correctly defaults to awhitefill, matching the behavior ofBitmapText.HTMLTextnow correctly respectsbreakWordsand no longer cuts off words that exceedwordWrapWidth.HTMLTextnow respects the alpha value of its fill and stroke.Textnow correctly aligns when usingalign: 'right'oralign: 'center', resulting in a small positional adjustment.Container.cullAreais now correctly interpreted in the container’s local coordinate space and transformed to global coordinates before culling checks.// cullArea is defined in local space and transformed during culling container.cullArea = new Rectangle(0, 0, 100, 100);
graphics.texture(texture, 0x000000)will now correctly apply a black tint
🎁 Added
- feat: Canvas renderer by @krzys @Zyie in #11815
- Note: This feature is experimental, please let us know if you run into any issues.
await app.init({ preference: 'canvas' });
- feat: tagged text by @Zyie in #11827
- Note: Currently only works for
Text/HTMLText,BitmapTextsupport coming soon
const text = new Text({ text: '<bold>Important:</bold> This is <highlight>highlighted</highlight> text', style: { fontFamily: 'Arial', fontSize: 28, fill: 'white', tagStyles: { bold: { fontWeight: 'bold', fill: 'yellow' }, highlight: { fill: 'cyan', fontSize: 32 } } } });
- Note: Currently only works for
- feat: improve stability of SplitText by @Zyie in #11858
- SplitText now fully mirrors Text behavior and regenerates automatically when its TextStyle changes via
text.styleChanged()
splitText.style.fontSize = 32 splitText.styleChanged()
- SplitText now fully mirrors Text behavior and regenerates automatically when its TextStyle changes via
- feat: external texture support by @astralarya @GoodBoyDigital in #11846 #11861
- feat: add parseSync to spritesheet by @jimhigson in #11794
- feat: improved Pool typing for pool.get() method by @unstoppablecarl in #11799
- feat: add cube texture by @GoodBoyDigital in #11800
- by @GoodBoyDigital in
- feat: Implement mip level rendering support in the rendering system by @GoodBoyDigital in #11801
- feat: render to array layer by @GoodBoyDigital in #11803
🐛 Fixed
- fix: Improve HTML text measurement accuracy and add comprehensive test scenes by @Zyie in #11862
- fix: project container.cullArea from local to global coordinate space before doing cull check by @jujurocket in #11598
- fix: use vColor instead of localUniforms.uColor in WebGPU MSDF shader by @Riphal in #11848
- fix: preserve VAO cache in GlGeometrySystem by @GoodBoyDigital in #11863
- fix: GC system to ensure render groups are marked as dirty by @Zyie in #11842
- fix: SplitBitmapText requires "fill: 'white'" by @GiorgiMaziashvili in #11721
- fix: preserve generic type parameters in WGSL struct reflection by @stargazer-2697 in #11855
- fix: improve extractAttributesFromGpuProgram to support struct-based inputs by @GoodBoyDigital in #11796
- fix: improves tree-shaking by optimizing module imports by @Zyie in #11833
- fix: disambiguate falsey tint with black uint by @bigtimebuddy in #11831
- fix: BitmapFontManager getFont emitting TextStyle update event by @subhu339 in #11835
- fix: allow custom parsers to override src in Resolver (#11828) by @GoodBoyDigital in #11849
- fix: recognise WGSL vertex attributes followed by closing parenthesis by @stargazer-2697 in #11854
- fix: Video Loader Not Catching Load Errors by @stargazer-2697 in #11856
🧹 Chores
- chore: add visual tests for text rendering features by @Zyie in #11825
- chore: Upgrades dependencies by @Zyie in #11806
- chore: guide to use envinfo to get environment information by @typed SIGTERM in #11859
- chore: optimize fastCopy with waterfall typed array selection by @GoodBoyDigital in #11798
- chore: use texImage2D instead of texSubImage2D for video in Safari by @GoodBoyDigital in #11867
New Contributors
- @subhu339 made their first contribution in #11835
- @stargazer-2697 made their first contribution in #11854
- @GiorgiMaziashvili made their first contribution in #11721
- @Riphal made their first contribution in #11848
- @jujurocket made their first contribution in #11598
- @krzys made their first contribution in #11815
v8.15.0
💾 Download
Installation:
npm install pixi.js@8.15.0Development Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.15.0/dist/pixi.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.15.0/dist/pixi.mjs
Production Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.15.0/dist/pixi.min.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.15.0/dist/pixi.min.mjs
Documentation:
Changed
🎁 Added
- feat: add unified GC by @Zyie in #11786
- Deprecated
TextureGCSystem/RenderableGCSystemin favor ofGCSystem.// old app.init({ textureGCActive: true, textureGCMaxIdle: 60000, textureGCCheckCountMax: 30000, renderableGCActive: true, renderableGCMaxUnusedTime: 60000, renderableGCFrequency: 30000, }); // new app.init({ gcActive: true, gcMaxUnusedTime: 60000, gcFrequency: 30000, });
- feat: Adds auto-GC option to view containers by @Zyie in #11810
- Disable automatic garbage collection for a node.
new Sprite({ autoGarbageCollect: false, });
- Disable automatic garbage collection for a node.
- Deprecated
- feat: add unload method to reset GPU data by @Zyie in #11762
-
You can now manually unload a node by calling its
unloadmethod. This releases any GPU resources associated with the node. The node can still be used afterward—it will be re-created automatically when needed.sprite.unload(); text.unload(); mesh.unload();
-
feat: move GPU context storage to GraphicsContext._gpuData by @Zyie in #11763
-
feat: move GL/GPU buffer storage to Buffer._gpuData and manage buffers list by @Zyie in #11775
-
feat: add descriptive names GCManagedHash by @Zyie in #11811
-
feat: update text GPU lifecycle and resolution updates by @Zyie in #11781
-
- feat: ParticleContainer type improvements by @unstoppablecarl in #11708
- feat: allow RenderTexture.create to accept dynamic option by @seanzhaoxiaoxiao in #11767
🐛 Fixed
- fix: SVGParser.ts Allow negative values for Polygon(s)/polyline(s) by @Raukie in #11771
- fix: prevent double returning of batches to pool by @GoodBoyDigital in #11780
- fix: Add error handling for message processing in KTX worker by @zardoy in #11768
- fix: RenderTexture ignoring format setting (WebGL) by @laino in #11777
- fix: Add Multiple Render Targets (MRT) support by @GoodBoyDigital in #11792
- fix: correct viewport Y calculation for root render targets by @GoodBoyDigital in #11797
- fix: garbage collection for bitmap text by @Zyie in #11809
🧹 Chores
- chore: Improve JSDoc documentation across modules by @Zyie in #11812
- chore: refactors CI workflows for trusted publishing by @Zyie in #11820
New Contributors
v8.15.0-rc
💾 Download
Installation:
npm install pixi.js@8.15.0-rcDevelopment Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.15.0-rc/dist/pixi.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.15.0-rc/dist/pixi.mjs
Production Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.15.0-rc/dist/pixi.min.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.15.0-rc/dist/pixi.min.mjs
Documentation:
Changed
🎁 Added
- feat: allow RenderTexture.create to accept dynamic option by @seanzhaoxiaoxiao in #11767
- feat: add unload method to reset GPU data by @Zyie in #11762
- feat: add unified GC by @Zyie in #11786
- feat: move GPU context storage to GraphicsContext._gpuData by @Zyie in #11763
- feat: move GPU data to Geometry._gpuData by @Zyie in #11772
- feat: move GPUData to TextureSource by @Zyie in #11774
- feat: move GL/GPU buffer storage to Buffer._gpuData and manage buffers list by @Zyie in #11775
- feat: update text GPU lifecycle and resolution updates by @Zyie in #11781
- feat: ParticleContainer type improvements by @unstoppablecarl in #11708
🐛 Fixed
- fix: SVGParser.ts Allow negative values for Polygon(s)/polyline(s) by @Raukie in #11771
- fix: prevent double returning of batches to pool by @GoodBoyDigital in #11780
- fix: Add error handling for message processing in KTX worker by @zardoy in #11768
- fix: RenderTexture ignoring format setting (WebGL) by @laino in #11777
- fix: Add Multiple Render Targets (MRT) support by @GoodBoyDigital in #11792