{"version":"https://jsonfeed.org/version/1.1","title":"Polygonjs releases","description":"What changed in each release of the Polygonjs engine and editor.","home_page_url":"https://polygonjs.com/changelog","feed_url":"https://polygonjs.com/changelog.json","language":"en","items":[{"id":"https://polygonjs.com/changelog/2.0.55","url":"https://polygonjs.com/changelog/2.0.55","title":"2.0.55: minor fixes","summary":"minor fixes","content_html":"<div class=\"markdown\">\n<ul class=\"my-6 space-y-3\">\n      <li class=\"flex gap-3 items-baseline\">\n        <span class=\"inline-block shrink-0 w-24 text-center text-xs uppercase tracking-wide rounded-full px-2 py-0.5 bg-emerald-400 dark:bg-emerald-700\">Fixed</span>\n        <span>When opening the examples panel on windows, there are no more spawned extra windows (which happened due to child processes downloading the thumbnails).</span>\n      </li>\n      <li class=\"flex gap-3 items-baseline\">\n        <span class=\"inline-block shrink-0 w-24 text-center text-xs uppercase tracking-wide rounded-full px-2 py-0.5 bg-emerald-400 dark:bg-emerald-700\">Fixed</span>\n        <span>When using the cursor to drive an object, the cursor would be clamped to the viewer bounds. This is not the case anymore.</span>\n      </li>\n</ul>\n\n</div>\n","date_published":"2026-08-08T00:00:00+00:00","tags":["fixed"]},{"id":"https://polygonjs.com/changelog/2.0.54","url":"https://polygonjs.com/changelog/2.0.54","title":"2.0.54: autoplay for embedded scenes","summary":"autoplay for embedded scenes","content_html":"<div class=\"markdown\">\n<ul class=\"my-6 space-y-3\">\n      <li class=\"flex gap-3 items-baseline\">\n        <span class=\"inline-block shrink-0 w-24 text-center text-xs uppercase tracking-wide rounded-full px-2 py-0.5 bg-green-40 dark:bg-green-700\">New</span>\n        <span>An embedded scene can start playing as soon as it loads: pass <code>autoplay: true</code> to <code>polygonAppInit</code> next to the scene data. Without it the scene sits on frame 0, which makes a solver or an <code>OnTick</code> actor look like a still image on a page with no transport controls.</span>\n      </li>\n      <li class=\"flex gap-3 items-baseline\">\n        <span class=\"inline-block shrink-0 w-24 text-center text-xs uppercase tracking-wide rounded-full px-2 py-0.5 bg-emerald-400 dark:bg-emerald-700\">Fixed</span>\n        <span>The example pages on polygonjs.com no longer show the default scene’s box sitting in the middle of the example. The box is bypassed, not deleted, so un-bypassing it brings it back.</span>\n      </li>\n</ul>\n\n</div>\n","date_published":"2026-08-08T00:00:00+00:00","tags":["new","fixed"]},{"id":"https://polygonjs.com/changelog/2.0.53","url":"https://polygonjs.com/changelog/2.0.53","title":"2.0.53: Cursor-driven physics, render/Combine, shadow fixes","summary":"Cursor-driven physics, render/Combine, shadow fixes","content_html":"<div class=\"markdown\">\n<ul class=\"my-6 space-y-3\">\n      <li class=\"flex gap-3 items-baseline\">\n        <span class=\"inline-block shrink-0 w-24 text-center text-xs uppercase tracking-wide rounded-full px-2 py-0.5 bg-red-400 dark:bg-red-700\">Breaking</span>\n        <span><code>render/Add</code>, <code>render/Multiply</code> and <code>render/Composite</code> are replaced by one <code>render/Combine</code>, whose <code>operation</code> param is ADD, MULTIPLY or OVER. Scenes using the old nodes need the node swapped by hand.</span>\n      </li>\n      <li class=\"flex gap-3 items-baseline\">\n        <span class=\"inline-block shrink-0 w-24 text-center text-xs uppercase tracking-wide rounded-full px-2 py-0.5 bg-red-400 dark:bg-red-700\">Breaking</span>\n        <span><code>mat/MeshInstance</code> is gone. Instances are drawn by <code>mat/MeshBuilder</code> with a <code>code/Instance</code> node inside, which is the graph <code>geo/Instance</code> now builds for you.</span>\n      </li>\n      <li class=\"flex gap-3 items-baseline\">\n        <span class=\"inline-block shrink-0 w-24 text-center text-xs uppercase tracking-wide rounded-full px-2 py-0.5 bg-green-40 dark:bg-green-700\">New</span>\n        <span>A rigid body can be kinematic, driven from an actor with <code>code/SetObjectPosition</code> or <code>code/SetObjectAttribute</code>. It pushes the dynamic bodies around, so you can shove a simulation with the cursor.</span>\n      </li>\n      <li class=\"flex gap-3 items-baseline\">\n        <span class=\"inline-block shrink-0 w-24 text-center text-xs uppercase tracking-wide rounded-full px-2 py-0.5 bg-green-40 dark:bg-green-700\">New</span>\n        <span>Cursor nodes: <code>code/Cursor</code>, <code>code/CursorRay</code>, <code>code/Ray</code>, <code>code/Plane</code> and <code>code/RayPlaneIntersect</code>, to turn a pointer into a position in the scene.</span>\n      </li>\n      <li class=\"flex gap-3 items-baseline\">\n        <span class=\"inline-block shrink-0 w-24 text-center text-xs uppercase tracking-wide rounded-full px-2 py-0.5 bg-green-40 dark:bg-green-700\">New</span>\n        <span><code>compute/Subnet</code> and <code>compute/PolyNode</code>: group compute nodes together, and save the group as a node you can reuse.</span>\n      </li>\n      <li class=\"flex gap-3 items-baseline\">\n        <span class=\"inline-block shrink-0 w-24 text-center text-xs uppercase tracking-wide rounded-full px-2 py-0.5 bg-green-40 dark:bg-green-700\">New</span>\n        <span><code>render/Combine</code> works on WebGL2. Where there are no compute shaders it runs the same operation as a fullscreen pass, and the image is the same.</span>\n      </li>\n      <li class=\"flex gap-3 items-baseline\">\n        <span class=\"inline-block shrink-0 w-24 text-center text-xs uppercase tracking-wide rounded-full px-2 py-0.5 bg-green-40 dark:bg-green-700\">New</span>\n        <span>An embedded scene can be unmounted and remounted from JavaScript, so a page can put a scene away and bring it back.</span>\n      </li>\n      <li class=\"flex gap-3 items-baseline\">\n        <span class=\"inline-block shrink-0 w-24 text-center text-xs uppercase tracking-wide rounded-full px-2 py-0.5 bg-green-40 dark:bg-green-700\">New</span>\n        <span>New example: many rigid bodies you can push around with the cursor.</span>\n      </li>\n      <li class=\"flex gap-3 items-baseline\">\n        <span class=\"inline-block shrink-0 w-24 text-center text-xs uppercase tracking-wide rounded-full px-2 py-0.5 bg-green-40 dark:bg-green-700\">New</span>\n        <span>The command line downloads the SDK without a login.</span>\n      </li>\n</ul>\n\n</div>\n","date_published":"2026-08-08T00:00:00+00:00","tags":["breaking","new"]},{"id":"https://polygonjs.com/changelog/2.0.49","url":"https://polygonjs.com/changelog/2.0.49","title":"2.0.49: Decimate, embedded text fonts, error propagation","summary":"Decimate, embedded text fonts, error propagation","content_html":"<div class=\"markdown\">\n<ul class=\"my-6 space-y-3\">\n      <li class=\"flex gap-3 items-baseline\">\n        <span class=\"inline-block shrink-0 w-24 text-center text-xs uppercase tracking-wide rounded-full px-2 py-0.5 bg-red-400 dark:bg-red-700\">Breaking</span>\n        <span><code>code/Negate</code>, <code>code/Complement</code>, <code>code/Pow</code> and <code>code/Normalize</code> are merged into the node <code>code/MathUnary</code>. Typing the old name in the tab menu still creates it, but scenes saved with the old node types will not load. We don’t have a migration system yet, so this may require manual update in the scene file for now.</span>\n      </li>\n      <li class=\"flex gap-3 items-baseline\">\n        <span class=\"inline-block shrink-0 w-24 text-center text-xs uppercase tracking-wide rounded-full px-2 py-0.5 bg-green-40 dark:bg-green-700\">New</span>\n        <span><code>geo/Decimate</code>: reduce a mesh’s triangle count, either as a fraction of the input or to an absolute triangle count, with boundary locking, small-component pruning and a maximum-error budget.</span>\n      </li>\n      <li class=\"flex gap-3 items-baseline\">\n        <span class=\"inline-block shrink-0 w-24 text-center text-xs uppercase tracking-wide rounded-full px-2 py-0.5 bg-green-40 dark:bg-green-700\">New</span>\n        <span>Chrome-less fullscreen viewer. Toggle it in the viewer and save the scene, and it reopens with no editor UI around it.</span>\n      </li>\n      <li class=\"flex gap-3 items-baseline\">\n        <span class=\"inline-block shrink-0 w-24 text-center text-xs uppercase tracking-wide rounded-full px-2 py-0.5 bg-sky-400 dark:bg-sky-700\">Improved</span>\n        <span><code>geo/Text</code> embeds its font, so text renders with no external font file to ship or find.</span>\n      </li>\n      <li class=\"flex gap-3 items-baseline\">\n        <span class=\"inline-block shrink-0 w-24 text-center text-xs uppercase tracking-wide rounded-full px-2 py-0.5 bg-sky-400 dark:bg-sky-700\">Improved</span>\n        <span>Errors travel through the graph: a node whose input is errored reports it, referencing an errored node is itself an error, and the network panel tells you when you are inside one.</span>\n      </li>\n      <li class=\"flex gap-3 items-baseline\">\n        <span class=\"inline-block shrink-0 w-24 text-center text-xs uppercase tracking-wide rounded-full px-2 py-0.5 bg-sky-400 dark:bg-sky-700\">Improved</span>\n        <span>The web editor reports its loading progress and fetches a gzipped payload, so the first frame arrives sooner.</span>\n      </li>\n      <li class=\"flex gap-3 items-baseline\">\n        <span class=\"inline-block shrink-0 w-24 text-center text-xs uppercase tracking-wide rounded-full px-2 py-0.5 bg-sky-400 dark:bg-sky-700\">Improved</span>\n        <span>Network panel: improve snapping.</span>\n      </li>\n      <li class=\"flex gap-3 items-baseline\">\n        <span class=\"inline-block shrink-0 w-24 text-center text-xs uppercase tracking-wide rounded-full px-2 py-0.5 bg-sky-400 dark:bg-sky-700\">Improved</span>\n        <span>Normals are computed whenever a material needs them, including through <code>geo/CageDeform</code>. No more black shading on deformed geometry.</span>\n      </li>\n      <li class=\"flex gap-3 items-baseline\">\n        <span class=\"inline-block shrink-0 w-24 text-center text-xs uppercase tracking-wide rounded-full px-2 py-0.5 bg-sky-400 dark:bg-sky-700\">Improved</span>\n        <span><code>geo/HexaPlane</code> now faces +Y by default.</span>\n      </li>\n      <li class=\"flex gap-3 items-baseline\">\n        <span class=\"inline-block shrink-0 w-24 text-center text-xs uppercase tracking-wide rounded-full px-2 py-0.5 bg-emerald-400 dark:bg-emerald-700\">Fixed</span>\n        <span>Nodes inside a bypassed subnet no longer cook.</span>\n      </li>\n      <li class=\"flex gap-3 items-baseline\">\n        <span class=\"inline-block shrink-0 w-24 text-center text-xs uppercase tracking-wide rounded-full px-2 py-0.5 bg-emerald-400 dark:bg-emerald-700\">Fixed</span>\n        <span><code>geo/PLYExporter</code> and <code>geo/VolumeExporter</code> preserve the object’s transform.</span>\n      </li>\n      <li class=\"flex gap-3 items-baseline\">\n        <span class=\"inline-block shrink-0 w-24 text-center text-xs uppercase tracking-wide rounded-full px-2 py-0.5 bg-emerald-400 dark:bg-emerald-700\">Fixed</span>\n        <span>Object transforms are no longer read before they are up to date, which could place geometry a frame behind.</span>\n      </li>\n</ul>\n\n  <details class=\"my-6 text-base\">\n    <summary class=\"cursor-pointer text-fg-muted\">Also in this release</summary>\n    <ul class=\"mt-3 ml-5 list-disc space-y-2\">\n        <li><code>geo/Text</code>’s secondary parameters are simplified.</li>\n        <li>Dropdown styling and window corners are consistent across the editor.</li>\n    </ul>\n  </details>\n</div>\n","date_published":"2026-08-01T00:00:00+00:00","tags":["breaking","new","improved","fixed"]},{"id":"https://polygonjs.com/changelog/2.0.46","url":"https://polygonjs.com/changelog/2.0.46","title":"2.0.46: Drag-to-connect network panel, voxel surface offsets","summary":"Drag-to-connect network panel, voxel surface offsets","content_html":"<div class=\"markdown\">\n<ul class=\"my-6 space-y-3\">\n      <li class=\"flex gap-3 items-baseline\">\n        <span class=\"inline-block shrink-0 w-24 text-center text-xs uppercase tracking-wide rounded-full px-2 py-0.5 bg-green-40 dark:bg-green-700\">New</span>\n        <span>Drag a node over another and hold for a moment, they connect, with no aiming at a connector.</span>\n      </li>\n      <li class=\"flex gap-3 items-baseline\">\n        <span class=\"inline-block shrink-0 w-24 text-center text-xs uppercase tracking-wide rounded-full px-2 py-0.5 bg-green-40 dark:bg-green-700\">New</span>\n        <span>Shake a node (or a whole selection) mid-drag to pull it out of the graph: the boundary edges drop and the chain heals behind it, so <code>a → x → c</code> becomes <code>a → c</code>.</span>\n      </li>\n      <li class=\"flex gap-3 items-baseline\">\n        <span class=\"inline-block shrink-0 w-24 text-center text-xs uppercase tracking-wide rounded-full px-2 py-0.5 bg-green-40 dark:bg-green-700\">New</span>\n        <span><code>surfaceOffset</code> on <code>geo/MeshToVoxel</code> and <code>geo/VoxelCreate</code>: shift the iso-surface the voxels are built from: negative erodes so the voxels sit inside the real surface, positive dilates for a thicker shell or to close thin features.</span>\n      </li>\n      <li class=\"flex gap-3 items-baseline\">\n        <span class=\"inline-block shrink-0 w-24 text-center text-xs uppercase tracking-wide rounded-full px-2 py-0.5 bg-sky-400 dark:bg-sky-700\">Improved</span>\n        <span>Connecting nodes no longer needs a precise cursor: connectors snap from a distance, the wire you are dragging previews the connector the drop will actually use, and the snap still works when zoomed out.</span>\n      </li>\n      <li class=\"flex gap-3 items-baseline\">\n        <span class=\"inline-block shrink-0 w-24 text-center text-xs uppercase tracking-wide rounded-full px-2 py-0.5 bg-sky-400 dark:bg-sky-700\">Improved</span>\n        <span>A whole node drag is a single undo step, however many connect, disconnect and splice actions it fired along the way.</span>\n      </li>\n      <li class=\"flex gap-3 items-baseline\">\n        <span class=\"inline-block shrink-0 w-24 text-center text-xs uppercase tracking-wide rounded-full px-2 py-0.5 bg-sky-400 dark:bg-sky-700\">Improved</span>\n        <span><code>geo/MeshToVoxel</code> voxelizes box-shaped meshes far more faithfully.</span>\n      </li>\n      <li class=\"flex gap-3 items-baseline\">\n        <span class=\"inline-block shrink-0 w-24 text-center text-xs uppercase tracking-wide rounded-full px-2 py-0.5 bg-emerald-400 dark:bg-emerald-700\">Fixed</span>\n        <span>Undoing while dragging a node no longer crashes the editor.</span>\n      </li>\n      <li class=\"flex gap-3 items-baseline\">\n        <span class=\"inline-block shrink-0 w-24 text-center text-xs uppercase tracking-wide rounded-full px-2 py-0.5 bg-emerald-400 dark:bg-emerald-700\">Fixed</span>\n        <span>Setting a node path, asset path or string parameter to an empty string resets it to its default, instead of leaving an empty reference that could not resolve and broke code export.</span>\n      </li>\n      <li class=\"flex gap-3 items-baseline\">\n        <span class=\"inline-block shrink-0 w-24 text-center text-xs uppercase tracking-wide rounded-full px-2 py-0.5 bg-emerald-400 dark:bg-emerald-700\">Fixed</span>\n        <span>Node paths and asset paths are trimmed, so a path pasted with a stray leading or trailing space still resolves.</span>\n      </li>\n</ul>\n\n  <details class=\"my-6 text-base\">\n    <summary class=\"cursor-pointer text-fg-muted\">Also in this release</summary>\n    <ul class=\"mt-3 ml-5 list-disc space-y-2\">\n        <li>PolyNode spare parameters and the parameters declared by a PolyNode definition now stay in step with each other, including through save, reload and regeneration.</li>\n    </ul>\n  </details>\n</div>\n","date_published":"2026-07-29T00:00:00+00:00","tags":["new","improved","fixed"]},{"id":"https://polygonjs.com/changelog/2.0.45","url":"https://polygonjs.com/changelog/2.0.45","title":"2.0.45: First public version of Polygon V2","summary":"First public version of Polygon V2","content_html":"<div class=\"markdown\">\n<ul class=\"my-6 space-y-3\">\n      <li class=\"flex gap-3 items-baseline\">\n        <span class=\"inline-block shrink-0 w-24 text-center text-xs uppercase tracking-wide rounded-full px-2 py-0.5 bg-green-40 dark:bg-green-700\">New</span>\n        <span>Polygon V2 is a complete rewrite of v1, that can run and build for native &amp; web.</span>\n      </li>\n</ul>\n\n</div>\n","date_published":"2026-07-28T00:00:00+00:00","tags":["new"]}]}