Files
godot-website/article/dev-snapshot-godot-4-6-beta-1/index.html
2025-12-16 09:42:05 +00:00

33 lines
71 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html><html lang=en><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=author content="Godot Engine"><meta name=description content="Godot 4.6 enters beta!"><script defer data-domain=godotengine.org src=https://plausible.godot.foundation/js/script.file-downloads.outbound-links.js></script><meta property="og:site_name" content="Godot Engine"><meta property="og:url" content="https://godotengine.org/article/dev-snapshot-godot-4-6-beta-1/"><meta property="og:type" content="website"><meta property="og:description" content="Godot 4.6 enters beta!"><meta property="og:image" content="https://godotengine.org/storage/blog/covers/dev-snapshot-godot-4-6-beta-1.jpg"><meta name=twitter:card content="summary_large_image"><meta property="twitter:domain" content="godotengine.org"><meta property="twitter:url" content="https://godotengine.org/article/dev-snapshot-godot-4-6-beta-1/"><meta property="og:title" content="Dev snapshot: Godot 4.6 beta 1 Godot Engine"><title>Dev snapshot: Godot 4.6 beta 1 Godot Engine</title>
<link rel=alternate type=application/rss+xml title="Godot News" href=/rss.xml><link rel=alternate type=application/json title="Godot News" href=/rss.json><link rel=alternate type=application/atom+xml title="Godot News" href=/atom.xml><link rel=icon href=/assets/favicon.png sizes=any><link rel=icon href=/assets/favicon.svg type=image/svg+xml><link rel=stylesheet href=/assets/css/main.css?121><link rel=stylesheet href=/assets/css/header.css?6><link rel=stylesheet href=/assets/css/tobii.min.css><link rel=preload as=font href=/assets/fonts/Montserrat-Italic-VariableFont_wght.woff2 crossorigin><link rel=preload as=font href=/assets/fonts/Montserrat-VariableFont_wght.woff2 crossorigin><link rel=me href=https://mastodon.gamedev.place/@godotengine><style>.donation-header{background-color:#ffa700;color:#000;padding:15px;text-align:center;padding:40px 15px;font-size:1.5em;display:none}.donation-header.visible{display:block}.donation-header h2{color:#000;margin-bottom:0;font-size:1.5em}.donation-header p{margin-top:0}.donation-header img{position:absolute;right:10px;top:10px;filter:invert(1);cursor:pointer}.donation-header .btn{background:#000;color:#fff}@media(max-width:600px){.donation-header{font-size:1.2em}}</style><div class=donation-header id=donation-header><img src=/assets/icons/cross.svg width=24 height=24 alt=Close title=Close id=donation-header-close onclick=dismissHeader()><h2>Donate to Godot!</h2><p>This has been a great year for the engine, but there are still a lot of things we would love to do.<br>If everyone visiting the site would donate €5, we could hire 5 more developers to work on Godot full-time.<br></p><a class=btn href="https://fund.godotengine.org/?ref=december-2025" onclick=dismissHeader(!0)>Donate Now</a></div><script>function dismissHeader(e=!1){var t=new Date;e?t.setTime(t.getTime()+30*24*60*60*1e3):(t.setTime(t.getTime()+48*60*60*1e3),document.getElementById("donation-header").classList.remove("visible")),document.cookie="donationHeaderClosed=1;expires="+t.toUTCString()+";path=/"}document.addEventListener("DOMContentLoaded",function(){var e=document.getElementById("donation-header");document.cookie.includes("donationHeaderClosed=1")||e.classList.add("visible")})</script><input type=checkbox id=nav_toggle_cb><header class="flex column"><div class="container flex align-center"><div id=nav_head><a href=/ id=logo-link><img class=nav-logo src=/assets/logo.svg width=136 height=48 alt="Godot Engine">
<img class="nav-logo dark-logo" src=/assets/logo_dark.svg width=136 height=48 alt="Godot Engine"></a><div class=mobile-links><span class="fund mobile"><a href=https://fund.godotengine.org><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="width:13px;fill:#fff;margin-right:4px"><path d="M47.6 300.4 228.3 469.1c7.5 7 17.4 10.9 27.7 10.9s20.2-3.9 27.7-10.9L464.4 300.4c30.4-28.3 47.6-68 47.6-109.5v-5.8c0-69.9-50.5-129.5-119.4-141C347 36.5 300.6 51.4 268 84L256 96 244 84c-32.6-32.6-79-47.5-124.6-39.9C50.5 55.6.0 115.2.0 185.1v5.8c0 41.5 17.2 81.2 47.6 109.5z"/></svg> Donate</a></span>
<label for=nav_toggle_cb id=nav_toggle_btn><img src=/assets/icons/hamburger.svg width=24 height=24 alt="Main menu"></label></div></div><nav id=nav><ul class=left><li><a href=/features/ data-dropdown=features-dropdown>Features</a><li class=mobile-only><a href=/consoles/>Console support</a><li class=mobile-only><a href=/priorities/>Priorities</a><li><a href=/showcase/>Showcase</a><li><a href=/blog/>Blog</a><li><a href=/community/ data-dropdown=community-dropdown>Community</a><li><a href=https://godotengine.org/asset-library/asset>Assets</a></ul><ul class=right><li><a href=/download/windows/ class=set-os-download-url>Download</a><li><a href=https://docs.godotengine.org>Docs</a><li><a href=https://contributing.godotengine.org/en/latest/organization/how_to_contribute.html>Contribute</a><li class="fund desktop"><a href=https://fund.godotengine.org><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="width:13px;fill:#fff;margin-right:4px;top:1px;position:relative"><path d="M47.6 300.4 228.3 469.1c7.5 7 17.4 10.9 27.7 10.9s20.2-3.9 27.7-10.9L464.4 300.4c30.4-28.3 47.6-68 47.6-109.5v-5.8c0-69.9-50.5-129.5-119.4-141C347 36.5 300.6 51.4 268 84L256 96 244 84c-32.6-32.6-79-47.5-124.6-39.9C50.5 55.6.0 115.2.0 185.1v5.8c0 41.5 17.2 81.2 47.6 109.5z"/></svg> Donate</a></ul></nav></div></header><div class=nav-dropdown-menu id=features-dropdown><a href=/features/ class=touch-only>Features</a>
<a href=/consoles/>Console support</a>
<a href=/priorities/>Priorities</a></div><div class=nav-dropdown-menu id=community-dropdown><a href=/community/ class=touch-only>Community</a>
<a href=https://forum.godotengine.org>Forum</a>
<a href=/events/>Events</a></div><script>document.addEventListener("DOMContentLoaded",function(){const e=document.querySelectorAll("[data-dropdown]");e.forEach(e=>{const n=e.getAttribute("data-dropdown"),t=document.getElementById(n);if(t){let n=-1;const i=()=>{if(n===-1)return;clearTimeout(n),n=-1},a=()=>t.style.display==="block",r=()=>{if(a())return;if(window.innerWidth<1200)return;i();const n=e.getBoundingClientRect();t.style.top=n.bottom+"px",t.style.left=n.left+"px",t.style.display="block",e.classList.add("dropdown-open")},s=({instant:s=!1}={})=>{if(!a())return;const o=()=>{i(),t.style.display="none",e.classList.remove("dropdown-open")};if(s){o();return}n=setTimeout(o,100)},l=e=>{if(window.innerWidth<1200)return;e.preventDefault(),a()?s({instant:!0}):r()},c=e=>t=>{t.pointerType==="touch"&&e(t)},o=e=>t=>{t.pointerType!=="touch"&&e(t)};e.addEventListener("pointerup",c(e=>l(e))),document.documentElement.addEventListener("pointerup",c(n=>{!e.contains(n.target)&&!t.contains(n.target)&&s({instant:!0})})),e.addEventListener("pointerenter",o(e=>r())),e.addEventListener("pointerleave",o(e=>s())),t.addEventListener("pointerenter",o(e=>i())),t.addEventListener("pointerleave",o(e=>s()))}})})</script><main><style>body{background-color:var(--background-color)}h1{margin-bottom:8px;margin-top:32px}:not(pre)>code{background:var(--code-background-color);padding:1px 4px;font-size:.95em;border-radius:3px}pre{background:var(--codeblock-background-color);color:var(--codeblock-color)}pre code{display:block;overflow-x:auto;padding:.5em}.date-big{line-height:2;margin-left:32px}article{background-color:var(--base-color);box-shadow:0 3px 2px rgba(0,0,0,.15)}figure{margin:0}figure img{margin:0}article img,article video{max-width:100%;height:auto;display:block;margin:auto;margin-top:16px;margin-bottom:16px}article h1{margin-top:64px}article h2,article h3,article h4{margin-top:42px}.article-info{display:flex;flex-direction:column;gap:8px}.article-metadata{display:flex;gap:24px;align-items:center;font-family:var(--header-font-family);margin-bottom:12px}@media(max-width:900px){.article-metadata{flex-direction:column;align-items:flex-start;gap:16px}}.article-author{color:var(--base-color-text-subtitle-date);font-weight:700;font-size:18px;flex-grow:1;display:flex;gap:12px;align-items:center}.article-author .avatar{border-radius:100%;margin:0;background:0 0}.article-author .by{color:var(--base-color-text-subtitle)}.article-metadata .date{color:var(--base-color-text-subtitle-date)}.article-metadata .date.post-recent-highlight{color:var(--post-recent-highlight-color);opacity:.8}.article-metadata .date.post-recent-highlight::after{font-size:80%;content:"NEW";border:2px solid var(--post-recent-highlight-color);padding:2px 3px;margin-left:8px}.tag.active{filter:saturate(.75)}@media screen and (min-width:900px){article .content{width:70%;margin:auto}}@media(max-width:900px){body{background-color:var(--base-color)}article{background-color:initial;box-shadow:none}article img:first-child,article video:first-child{max-width:100%}}.blog-navigation{display:grid;grid-template-columns:1fr 1fr;padding-top:30px;padding-bottom:60px}.blog-navigation .next{text-align:right}@media(max-width:900px){.blog-navigation{grid-template-columns:1fr;gap:20px;border-top:1px solid var(--code-background-color)}.blog-navigation .next{text-align:left}}.blog-navigation span{opacity:.6;font-weight:700;margin-bottom:5px;display:block}.blog-navigation a{display:inline-block;text-decoration:none;color:inherit;opacity:.6;transition:opacity .2s}.blog-navigation a:hover{opacity:1}</style><link rel=stylesheet href=/assets/css/highlight.obsidian.min.css><div class=container><article class=padded><div class="content article-container"><figure class=article-cover><figcaption><strong>Organized Inside</strong>
<span style=margin-left:.75rem;font-size:90%>A game by Meox Studio</span></figcaption><img src=/storage/blog/covers/dev-snapshot-godot-4-6-beta-1.jpg title="Organized Inside" alt="Organized Inside A game by Meox Studio" class=rounded-lg style=width:100%;height:auto;background-color:initial></figure><div class=article-info><h1>Dev snapshot: Godot 4.6 beta 1</h1><div class=article-metadata><div class=article-author><span>By: </span><img class=avatar width=25 height=25 src=/assets/images/authors/repiteo.jpg alt="Thaddeus Crews" loading=lazy>
<span class=by>Thaddeus Crews</span></div><span class=date data-post-date="2025-12-10 12:00:00 +0000">10 December 2025</span></div><div class=tags><a href=/blog/pre-release><div class="tag active">Pre-release</div></a></div></div><div class=article-body><p>Its finally time for the 4.6 release cycle to feature its very first beta! Thanks to handling the feature freeze in <a href=/article/dev-snapshot-godot-4-6-dev-6>dev 6</a>, there are already been several bugs and regressions identified early and subsequently squashed. However, there are still more to iron out, so all contributors are encouraged to shift their focus to <a href="https://github.com/godotengine/godot/issues?q=is%3Aopen+is%3Aissue+label%3Aregression+milestone%3A4.6">regression fixes</a> exclusively.<p>For those interested in aiding us on our quest to squash any bugs that come up during this time, we once again encourage you to join our bug-hunting sprints. Anyone interested should read the <a href=https://github.com/godotengine/godot-maintainers-docs/blob/main/bug-triage/introduction.md>Bug Triage Introduction</a> for more information, and join the <a href=https://chat.godotengine.org/channel/bugsquad><code class="language-plaintext highlighter-rouge">#bugsquad</code></a> and <a href=https://chat.godotengine.org/channel/bugsquad-sprints><code class="language-plaintext highlighter-rouge">#bugsquad-sprints</code></a> channels on our developer RocketChat to participate!<p>Please consider <a href=#support>supporting the project financially</a>, if you are able. Godot is maintained by the efforts of volunteers and a small team of paid contributors. Your donations go towards sponsoring their work and ensuring they can dedicate their undivided attention to the needs of the project.<p><a href=#downloads>Jump to the <strong>Downloads</strong> section</a>, and give it a spin right now, or continue reading to learn more about improvements in this release. You can also try the <a href=https://editor.godotengine.org/releases/4.6.beta1/><strong>Web editor</strong></a>, the <a href=https://www.meta.com/s/h9JcJGHfg><strong>XR editor</strong></a>, or the <a href="https://play.google.com/store/apps/details?id=org.godotengine.editor.v4"><strong>Android editor</strong></a> for this release. If you are interested in the latter, please request to join <a href=https://groups.google.com/g/godot-testers>our testing group</a> to get access to pre-release builds.<hr><p><em>The cover illustration is from</em> <a href="https://store.steampowered.com/app/3609750/Organized_Inside/?curator_clanid=41324400"><strong>Organized Inside</strong></a>, <em>a slow-paced life simulator where you tidy up after your cat and your life. You can buy the game or download the demo for free on <a href="https://store.steampowered.com/app/3609750/Organized_Inside/?curator_clanid=41324400">Steam</a>, and check out the developers at <a href=https://twitter.com/MeoxStudio>Twitter</a> or <a href=https://www.youtube.com/@MeoxStudio>YouTube</a>!</em><h2 id=highlights>Highlights</h2><p>For those who have been following our development snapshots closely, you may be familiar with a number of the highlights in this post which were already covered in previous articles (<a href=/article/dev-snapshot-godot-4-6-dev-1>dev 1</a>, <a href=/article/dev-snapshot-godot-4-6-dev-2>dev 2</a>, <a href=/article/dev-snapshot-godot-4-6-dev-3>dev 3</a>, <a href=/article/dev-snapshot-godot-4-6-dev-4>dev 4</a>, <a href=/article/dev-snapshot-godot-4-6-dev-5>dev 5</a>, and <a href=/article/dev-snapshot-godot-4-6-dev-6>dev 6</a>).<p>Because were already in feature freeze, there are no new features to cover compared to dev 6. Instead, well focus on a general round-up of what to expect from Godot 4.6 as a whole, as well as expanding on some additions that we didnt have the chance to highlight in our previous snapshots.<ul><li><a href=#breaking-changes>Breaking changes</a><li><a href=#animation>Animation</a><li><a href=#audio--video>Audio / Video</a><li><a href=#core>Core</a><li><a href=#documentation>Documentation</a><li><a href=#editor>Editor</a><li><a href=#gdextension>GDExtension</a><li><a href=#gdscript>GDScript</a><li><a href=#gui>GUI</a><li><a href=#import>Import</a><li><a href=#input>Input</a><li><a href=#internationalization>Internationalization</a><li><a href=#navigation>Navigation</a><li><a href=#physics>Physics</a><li><a href=#platforms>Platforms</a><li><a href=#rendering-and-shaders>Rendering and shaders</a><li><a href=#xr>XR</a></ul><h3 id=breaking-changes>Breaking changes</h3><p>We try to minimize breaking changes, but sometimes they are necessary in order to fix high-priority issues. Where we do break compatibility, we do our best to make sure that the changes are minimal and require few changes in user projects.<p>You can find a list of such issues by filtering the merged PRs in the 4.6 milestone with the <a href="https://github.com/godotengine/godot/issues?q=milestone%3A4.6%20is%3Amerged%20label%3A%22breaks%20compat%22"><code class="language-plaintext highlighter-rouge">breaks compat</code> label</a>. Here are some which are worth being aware of:<ul><li>Default glow blend mode has changed to <code class="language-plaintext highlighter-rouge">screen</code> and default glow levels have changed (<a href=https://github.com/godotengine/godot/pull/110671>GH-110671</a> and <a href=https://github.com/godotengine/godot/pull/110077>GH-110077</a>).<ul><li>Note: Glow blending now occurs before tonemapping and <code class="language-plaintext highlighter-rouge">softlight</code> glow blending has changed to always appear as it did when using HDR 2D on your Viewport.</ul><li><code class="language-plaintext highlighter-rouge">Quaternion</code> now correctly initializes with identity under <code class="language-plaintext highlighter-rouge">Variant</code> (<a href=https://github.com/godotengine/godot/pull/84658>GH-84658</a>).</ul><h3 id=animation>Animation</h3><p><a href=https://github.com/TokageItLab>Tokage</a> has brought IK support for <code class="language-plaintext highlighter-rouge">SkeletonModifier3D</code> via the new class <code class="language-plaintext highlighter-rouge">IKModifier3D</code> (<a href=https://github.com/godotengine/godot/pull/110120>GH-110120</a>). This took the lessons learned from <code class="language-plaintext highlighter-rouge">SkeletonModificationStack3D</code>, a class removed in the 4.0 transition, and reimplemented them in a context thats up to modern standards. Having to account for so many separate systems resulted in <code class="language-plaintext highlighter-rouge">SkeletonModifier3D</code> receiving <strong>8 new subclasses</strong>:<ul><li><a href=https://docs.godotengine.org/en/latest/classes/class_ikmodifier3d.html><code class="language-plaintext highlighter-rouge">IKModifier3D</code></a><ul><li><a href=https://docs.godotengine.org/en/latest/classes/class_chainik3d.html><code class="language-plaintext highlighter-rouge">ChainIK3D</code></a><ul><li><a href=https://docs.godotengine.org/en/latest/classes/class_iterateik3d.html><code class="language-plaintext highlighter-rouge">IterateIK3D</code></a><ul><li><a href=https://docs.godotengine.org/en/latest/classes/class_ccdik3d.html#class-ccdik3d><code class="language-plaintext highlighter-rouge">CCDIK3D</code></a><li><a href=https://docs.godotengine.org/en/latest/classes/class_fabrik3d.html#class-fabrik3d><code class="language-plaintext highlighter-rouge">FABRIK3D</code></a><li><a href=https://docs.godotengine.org/en/latest/classes/class_jacobianik3d.html#class-jacobianik3d><code class="language-plaintext highlighter-rouge">JacobianIK3D</code></a></ul><li><a href=https://docs.godotengine.org/en/latest/classes/class_splineik3d.html#class-splineik3d><code class="language-plaintext highlighter-rouge">SplineIK3D</code></a></ul><li><a href=https://docs.godotengine.org/en/latest/classes/class_twoboneik3d.html#class-twoboneik3d><code class="language-plaintext highlighter-rouge">TwoBoneIK3D</code></a></ul></ul><p>And more:<ul><li>Add BoneTwistDisperser3D to propagate IK targets twist (<a href=https://github.com/godotengine/godot/pull/113284>GH-113284</a>).<li>Add LimitAngularVelocityModifier3D to interpolate deterministic IK (<a href=https://github.com/godotengine/godot/pull/111184>GH-111184</a>).<li>Add option to <code class="language-plaintext highlighter-rouge">BoneConstraint3D</code> to make reference target allow to set <code class="language-plaintext highlighter-rouge">Node3D</code> (<a href=https://github.com/godotengine/godot/pull/110336>GH-110336</a>).<li>Add solo/hide/lock/delete buttons to node groups in bezier track editor (<a href=https://github.com/godotengine/godot/pull/110866>GH-110866</a>).<li>Allow resizing the length of animations by dragging the timeline (<a href=https://github.com/godotengine/godot/pull/110623>GH-110623</a>).<li>Change AnimationLibrary serialization to avoid using Dictionary (<a href=https://github.com/godotengine/godot/pull/110502>GH-110502</a>).</ul><h3 id=audio--video>Audio / Video</h3><p><a href=https://github.com/goatchurchprime>Julian Todd</a> added new experimental functions to AudioServer to allow accessing the microphone buffer directly (<a href=https://github.com/godotengine/godot/pull/113288>GH-113288</a>). This allows individual platforms to access the input and output streams in a way that doesnt assume a uniform rate, something thats not guaranteed on all devices.<h3 id=core>Core</h3><p><a href=https://github.com/kisg>Gergely Kis</a>, <a href=https://github.com/konczg>Gábor Koncz</a> and <a href=https://github.com/zorbathut>Ben Rog-Wilhelm</a> have laid out a foundation for building the engine as a standalone library: <code class="language-plaintext highlighter-rouge">LibGodot</code> (<a href=https://github.com/godotengine/godot/pull/110863>GH-110863</a>). Through the new <a href=https://docs.godotengine.org/en/latest/classes/class_godotinstance.html><code class="language-plaintext highlighter-rouge">GodotInstance</code></a> class, developers now have an entry point for specialized workflows that <em>absolutely require</em> accessing Godot as a library.<p><a href=https://github.com/Ivorforce>Lukas Tenbrink</a> has brought tracing profiler support to Godot (<a href=https://github.com/godotengine/godot/pull/104851>GH-104851</a>). With this, engine developers will no longer need to manually integrate (and constantly re-integrate) profiling logic to the engine, as they are now officially integrated within the build system instead. There is currently support for <a href=https://github.com/wolfpld/tracy>Tracy</a>, <a href=https://perfetto.dev/>Perfetto</a>, and <a href=https://developer.apple.com/documentation/os/recording-performance-data>Apple Instruments signposts</a> (<a href=https://github.com/godotengine/godot/pull/113342>GH-113342</a>).<p>As in every version, contributors come together to improve the stability and performance of some of Godots most used foundational building blocks — For example, you can expect a decrease of RAM use when opening files (<a href=https://github.com/godotengine/godot/pull/106039>GH-106039</a>), a boost of speed when sorting arrays (<a href=https://github.com/godotengine/godot/pull/113132>GH-113132</a>), accelerated <code class="language-plaintext highlighter-rouge">Object</code> casts (<a href=https://github.com/godotengine/godot/pull/105793>GH-105793</a>), and decreased build time (<a href=https://github.com/godotengine/godot/issues/111218>GH-111218</a>).<p>And more:<ul><li>Add Find Sequence to <code class="language-plaintext highlighter-rouge">Span</code>s, and consolidate negative indexing behavior (<a href=https://github.com/godotengine/godot/pull/104332>GH-104332</a>).<li>Add <code class="language-plaintext highlighter-rouge">change_scene_to_node()</code> (<a href=https://github.com/godotengine/godot/pull/85762>GH-85762</a>).<li>Add <code class="language-plaintext highlighter-rouge">reserve</code> function to <code class="language-plaintext highlighter-rouge">Array</code>, <code class="language-plaintext highlighter-rouge">Vector</code>, and <code class="language-plaintext highlighter-rouge">String</code> (<a href=https://github.com/godotengine/godot/pull/105928>GH-105928</a>).<li>Add ability to get list of Project Settings changed, similar to Editor Settings functionality (<a href=https://github.com/godotengine/godot/pull/110748>GH-110748</a>).<li>Add unique Node IDs to support base and instantiated scene refactorings (<a href=https://github.com/godotengine/godot/pull/106837>GH-106837</a>).<li>Buildsystem: SwiftUI lifecycle for Apple embedded platforms (<a href=https://github.com/godotengine/godot/pull/109974>GH-109974</a>).<li>Export: Add “Show Encryption Key” toggle (<a href=https://github.com/godotengine/godot/pull/106146>GH-106146</a>).<li>Export: Add support for delta encoding to patch PCKs (<a href=https://github.com/godotengine/godot/pull/112011>GH-112011</a>).<li>FileAccess: Implement support for reading and writing extended file attributes/alternate data streams (<a href=https://github.com/godotengine/godot/pull/102232>GH-102232</a>).<li>Handle NaN and Infinity in JSON stringify function (<a href=https://github.com/godotengine/godot/pull/111498>GH-111498</a>).<li>Network: Add Core UNIX domain socket support (<a href=https://github.com/godotengine/godot/pull/107954>GH-107954</a>).</ul><h3 id=documentation>Documentation</h3><p><a href=https://github.com/KoBeWi>Tomasz Chabora</a> updated our documentation logic to not expose signals with a leading underscore (<a href=https://github.com/godotengine/godot/pull/112770>GH-112770</a>). Not being exposed in this manner also means that they wont show up as autocompletion results. This is consistent with how we handle methods, and will remove the need for users to work around bloating their documentation with <code class="language-plaintext highlighter-rouge">add_user_signal()</code>.<h3 id=editor>Editor</h3><p>The long-time fan-favorite <a href=https://github.com/passivestar/godot-minimal-theme>Godot Minimal Theme</a>, created by <a href=https://github.com/passivestar>passivestar</a>, is now officially integrated as the new default theme for the editor. As a collaborative effort between passivestar and <a href=https://github.com/YeldhamDev>Michael Alexsander</a>, the theme has been brought to a new life under the name “Modern Theme” (<a href=https://github.com/godotengine/godot/pull/111118>GH-111118</a>). The previous style remains available as the “Classic Theme,” and will continue to be supported.<p><img src=/storage/blog/dev-snapshot-godot-4-6-dev-3/new-editor-theme.jpg alt="New editor theme"><div class="card card-info" style=margin-top:1em><p>The new theme is still actively iterated upon to iron out some issues and take user feedback into account. If you would like to share your thoughts, you can use <a href=https://github.com/godotengine/godot-proposals/discussions/13829>this GitHub discussion</a> or <a href=https://bsky.app/profile/passivestar.bsky.social/post/3m7ktjuv7qk2s>this Bluesky thread</a>.</div><p>In a similar vein to the previous point, weve applied a similar minimal-style overhaul to the array inspector. This change is inherent to the inspector itself, so the benefits will be shown regardless of which theme is chosen. <a href=https://github.com/dugramen>Koliur Rahman</a> brought us this revamped implementation, trimming away wasted space by consolidating information and logic to their essential elements (<a href=https://github.com/godotengine/godot/pull/103257>GH-103257</a>).<table><thead><tr><th>Old<th>New<tbody><tr><td><img src=/storage/blog/dev-snapshot-godot-4-6-dev-3/array-old.jpg alt="Array old"><td><img src=/storage/blog/dev-snapshot-godot-4-6-dev-3/array-new.jpg alt="Array new"></table><p>Tomasz gave the editor docks a major rework (<a href=https://github.com/godotengine/godot/pull/106503>GH-106503</a>). A new <a href=https://docs.godotengine.org/en/latest/classes/class_editordock.html><code class="language-plaintext highlighter-rouge">EditorDock</code></a> class was introduced, which is responsible for handling dock appearance and supported dock slots, and makes it easier to switch dock layouts and save their data. <code class="language-plaintext highlighter-rouge">EditorDock</code> inherits <code class="language-plaintext highlighter-rouge">MarginContainer</code> and is supposed to be used as a root node of your docks. Of course all necessary compatibility code was added, so old plugins will still work without any changes.<p>Another important part of this rework came to us from <a href=https://github.com/lodetrick>lodetrick</a>, whereby the bottom panel is now part of the docking system, so all bottom editors are now docks and docks can be freely moved between sides and bottom (<a href=https://github.com/godotengine/godot/pull/108647>GH-108647</a>). Note that most docks dont support both layouts (yet), but they all can be made floating (except <code class="language-plaintext highlighter-rouge">Debugger</code>), and the persistent docks can be closed. The docking system is planned to be improved further in the future, including a potential rework of main screen editors into docks for further unification.</p><video autoplay loop muted playsinline title="Showcasing the new bottom panel as an `EditorDock`">
<source src=/storage/blog/dev-snapshot-godot-4-6-beta-1/editor-dock-showcase.mp4?1 type=video/mp4></video><p>The 3D viewport received several long-requested functionality commonly available in modern 3D modeling programs. <a href=https://github.com/ryevdokimov>Robert Yevdokimov</a> added a means of visualizing the current delta angle of a rotation operation, a convenient reference point for adjusting objects in a 3D space. passivestar added orbit-snapping within the viewport itself, enabling more granular positioning and consistent feedback.</p><video autoplay loop muted playsinline title="Rotation accumulation">
<source src=/storage/blog/dev-snapshot-godot-4-6-dev-2/rotation-accumulation.mp4?1 type=video/mp4></video>
<video autoplay loop muted playsinline title="Rotation snapping">
<source src=/storage/blog/dev-snapshot-godot-4-6-dev-2/rotation-snapping.mp4?1 type=video/mp4></video><p>And more:<ul><li>2D: Add support for rotating scene tiles in TileMapLayer (<a href=https://github.com/godotengine/godot/pull/108010>GH-108010</a>).<li>3D: Add Bresenham Line Algorithm to GridMap Drawing (<a href=https://github.com/godotengine/godot/pull/105292>GH-105292</a>).<li>3D: Rename Select Mode to Transform Mode, and create a new Select Mode without transform gizmo (<a href=https://github.com/godotengine/godot/pull/101168>GH-101168</a>).<li>Add an ObjectDB Profiling Tool (<a href=https://github.com/godotengine/godot/pull/97210>GH-97210</a>).<li>Add Create Resource Hotkey (<a href=https://github.com/godotengine/godot/pull/110641>GH-110641</a>).<li>Add drag and drop export variables (<a href=https://github.com/godotengine/godot/pull/106341>GH-106341</a>).<li>Add game speed controls to the embedded game window (<a href=https://github.com/godotengine/godot/pull/107273>GH-107273</a>).<li>Add indicator to linked resources (<a href=https://github.com/godotengine/godot/pull/109458>GH-109458</a>).<li>Add switch on hover to TabBar (<a href=https://github.com/godotengine/godot/pull/103478>GH-103478</a>).<li>Add tab menu button to list currently opened scenes (<a href=https://github.com/godotengine/godot/pull/108079>GH-108079</a>).<li>Allow drag setting flags in layers property editor (<a href=https://github.com/godotengine/godot/pull/112174>GH-112174</a>).<li>Allow editing editor settings from project manager (<a href=https://github.com/godotengine/godot/pull/82212>GH-82212</a>).<li>Allow editing groups on multiple nodes (<a href=https://github.com/godotengine/godot/pull/112729>GH-112729</a>).<li>Allow fixing indirect missing dependencies manually (<a href=https://github.com/godotengine/godot/pull/112187>GH-112187</a>).<li>Allow Quick Open dialog to preview change in scene (<a href=https://github.com/godotengine/godot/pull/106947>GH-106947</a>).<li>Automatically open newly created script (<a href=https://github.com/godotengine/godot/pull/108342>GH-108342</a>).<li>Make file part of errors/warnings clickable in Output panel (<a href=https://github.com/godotengine/godot/pull/108473>GH-108473</a>).<li>Move script name to top (<a href=https://github.com/godotengine/godot/pull/86468>GH-86468</a>).<li>Open source code errors in external editor (<a href=https://github.com/godotengine/godot/pull/111805>GH-111805</a>).<li>Show a warning toast when saving a large text-based scene (<a href=https://github.com/godotengine/godot/pull/53679>GH-53679</a>).</ul><h3 id=gdextension>GDExtension</h3><p>Through a collaborative effort between <a href=https://github.com/dsnopek>David Snopek</a> and <a href=https://github.com/repiteo>Thaddeus Crews</a>, its now possible to declare <code class="language-plaintext highlighter-rouge">Object</code> types as “required” (<a href=https://github.com/godotengine/godot/pull/86079>GH-86079</a>). This information is passed as GDExtension metadata, meaning that nullable-aware languages no longer need to assume that <em>every</em> <code class="language-plaintext highlighter-rouge">Object</code> class is inherently optional. This implementation does not break compatibility, as it still passes/receives the same data under the hood.<p>David has also changed the canonical source-of-truth for GDExtension from a C header (<code class="language-plaintext highlighter-rouge">gdextension_interface.h</code>) to JSON (<code class="language-plaintext highlighter-rouge">gdextension_interface.json</code>) (<a href=https://github.com/godotengine/godot/pull/107845>GH-107845</a>). This simplifies the GDExtension workflow, and allows additional information to be included in the interface. For example, GDExtension bindings will now be able to declare builtin functions as deprecated to GDExtension programmers (<a href=https://github.com/godotengine/godot/pull/112290>GH-112290</a>).<h3 id=gdscript>GDScript</h3><p>Lukas continued his dedicated profiler integration by collaborating with <a href=https://github.com/enetheru>Samuel Nicholas</a> to bring native support to GDScript (<a href=https://github.com/godotengine/godot/pull/113279>GH-113279</a>). While currently limited to tracy, this is a major first step in allowing dedicated profilers to be a universal solution for debugging performance. If youre eager to try this yourself, you can find <a href=https://docs.godotengine.org/en/latest/engine_details/development/debugging/using_cpp_profilers.html>instructions for it</a> in our docs already, contributed by David.<p>And more:<ul><li>Add <code class="language-plaintext highlighter-rouge">debug/gdscript/warnings/directory_rules</code> project setting (<a href=https://github.com/godotengine/godot/pull/93889>GH-93889</a>).<li>Add opt-in GDScript warning for when calling coroutine without <code class="language-plaintext highlighter-rouge">await</code> (<a href=https://github.com/godotengine/godot/pull/107936>GH-107936</a>).<li>Add step out to script debugger (<a href=https://github.com/godotengine/godot/pull/97758>GH-97758</a>).<li>Add string placeholder syntax highlighting (<a href=https://github.com/godotengine/godot/pull/112575>GH-112575</a>).<li>Elide unnecessary copies in <code class="language-plaintext highlighter-rouge">CONSTRUCT_TYPED_*</code> opcodes (<a href=https://github.com/godotengine/godot/pull/110717>GH-110717</a>).<li>GDScript LSP: Rework and extend BBCode to markdown docstring conversion (<a href=https://github.com/godotengine/godot/pull/113099>GH-113099</a>).<li>Prevent shallow scripts from leaking into the <code class="language-plaintext highlighter-rouge">ResourceCache</code> (<a href=https://github.com/godotengine/godot/pull/109345>GH-109345</a>).</ul><h3 id=gui>GUI</h3><p>Michael has brought another new addition: the focus state logic for mouse and touch is now decoupled from keyboard and joypad (<a href=https://github.com/godotengine/godot/pull/110250>GH-110250</a>). As we mentioned in the <a href=/article/dev-snapshot-godot-4-6-dev-1/>4.6 dev 1 blog post</a>, its not uncommon for systems to deliberately stylize these two input groups separately, enabling granular control for toolmakers and UI designers.<table><thead><tr><th>Situation<th> <tbody><tr><td>Clicking a <code class="language-plaintext highlighter-rouge">Control</code> with the mouse, giving it focus.<td><tr><td>Successfully switching focus via keyboard/joypad actions.<td>✔️<tr><td>Attempting to switch focus via keyboard/joypad actions but still remaining on the same <code class="language-plaintext highlighter-rouge">Control</code>.<td>✔️<tr><td>Clicking somewhere with the mouse while having a <code class="language-plaintext highlighter-rouge">Control</code> with visible focus.<td><tr><td>Clicking with the mouse a visibly focused <code class="language-plaintext highlighter-rouge">Control</code> (deviates from how it works in browsers).<td><tr><td>Using <code class="language-plaintext highlighter-rouge">Control.grab_focus(true)</code>.<td></table><p>And more:<ul><li>Add <code class="language-plaintext highlighter-rouge">pivot_offset_ratio</code> property to Control (<a href=https://github.com/godotengine/godot/pull/70646>GH-70646</a>).<li>Add scroll hints to <code class="language-plaintext highlighter-rouge">ScrollContainer</code> and <code class="language-plaintext highlighter-rouge">Tree</code> (<a href=https://github.com/godotengine/godot/pull/112491>GH-112491</a>).<ul><li><code class="language-plaintext highlighter-rouge">ItemList</code> also supports scroll hints as of <a href=https://github.com/godotengine/godot/pull/113574>GH-113574</a>.</ul><li>Allow customization of TabContainer tabs in editor (<a href=https://github.com/godotengine/godot/pull/58749>GH-58749</a>).<li>Optimize CPU text shaping (<a href=https://github.com/godotengine/godot/pull/109516>GH-109516</a>).<li>Separate Node editor dock (<a href=https://github.com/godotengine/godot/pull/101787>GH-101787</a>).<li>Speed up very large <code class="language-plaintext highlighter-rouge">Trees</code> (<a href=https://github.com/godotengine/godot/pull/109512>GH-109512</a>).<li>Visualize MarginContainer margins when selected (<a href=https://github.com/godotengine/godot/pull/111095>GH-111095</a>).</ul><h3 id=import>Import</h3><p><a href=https://github.com/zeux>Arseny Kapoulkine</a> has addressed a previous shortcoming of our mesh simplifier by ensuring the components <em>themselves</em> are simplified alongside collapsing edges (<a href=https://github.com/godotengine/godot/pull/110028>GH-110028</a>). This enables topologically complex sections of a larger mesh to more easily reach the desired <abbr title="Level of Detail">LOD</abbr> target.<p><img src=/storage/blog/dev-snapshot-godot-4-6-dev-2/mesh-component-prune.jpg alt="Pruned components in simplified mesh"><p>And more:<ul><li>Betsy: Convert RGB to RGBA on the GPU for faster compression (<a href=https://github.com/godotengine/godot/pull/110060>GH-110060</a>).<li>OBJ importer: Support bump multiplier (normal scale) (<a href=https://github.com/godotengine/godot/pull/110925>GH-110925</a>).<li>Switch LOD generation to use iterative simplification (<a href=https://github.com/godotengine/godot/pull/110027>GH-110027</a>).</ul><h3 id=input>Input</h3><p><a href=https://github.com/Nintorch>Nintorch</a>, the contributor responsible for migrating our input system to SDL3, has laid the foundation for advanced joypad features in Godot (<a href=https://github.com/godotengine/godot/pull/111707>GH-111707</a>). The only functionality this enables at this time is the customization of LED light colors (<a href=https://github.com/godotengine/godot/pull/111681>GH-111681</a>), but hes already created additional PRs that will implement support for <a href=https://github.com/godotengine/godot/pull/111679>motion sensors</a>, <a href=https://github.com/godotengine/godot/pull/111682>adaptive triggers, and custom data packets</a>, which is only scratching the surface of possible functionality in future releases.<p>And more:<ul><li>Add ability to add new EditorSettings shortcuts (<a href=https://github.com/godotengine/godot/pull/102889>GH-102889</a>).</ul><h3 id=internationalization>Internationalization</h3><p><a href=https://github.com/timothyqiu>Haoyu Qiu</a> saw to the improvement of CSV translations (<a href=https://github.com/godotengine/godot/pull/112073>GH-112073</a>). This introduces support for optional <code class="language-plaintext highlighter-rouge">?context</code> and <code class="language-plaintext highlighter-rouge">?plural</code> columns, where the former passes crucial information to translators, while the latter declares plural equivalents to sentences. Plurals can be further expanded via <code class="language-plaintext highlighter-rouge">?pluralrule</code>, which allows for further customization of languages with more complex plural specifications.<table><thead><tr><th>en<th>?context<th>fr<th>ru<th>zh<tbody><tr><td>Letter<td>Alphabet<td>Lettre<td>Буква<td>字母<tr><td>Letter<td>Message<td>Courrier<td>Письмо<td>信件</table><pre><code class=language-csv>en,?context,fr,ru,ja,zh
Letter,Alphabet,Lettre,Буква,字母,字母
Letter,Message,Courrier,Письмо,手紙,信件
</code></pre><table><thead><tr><th>en<th>?plural<th>fr<th>ru<th>zh<tbody><tr><td>?pluralrule<td> <td>nplurals=2; plural=(n >= 2);<td> <td> <tr><td>There is %d apple<td>There are %d apples<td>Il y a %d pomme<td>Есть %d яблоко<td>那里有%d个苹果<tr><td> <td> <td>Il y a %d pommes<td>Есть %d яблока<td> <tr><td> <td> <td> <td>Есть %d яблок<td> </table><pre><code class=language-csv>en,?plural,fr,ru,ja,zh
?pluralrule,,nplurals=2; plural=(n &gt;= 2);,,
There is %d apple,There are %d apples,Il y a %d pomme,Есть %d яблоко,リンゴが%d個あります,那里有%d个苹果
,,Il y a %d pommes,Есть %d яблока,,
,,,Есть %d яблок,,
</code></pre><p><a href=https://github.com/shitake2333>stark233</a> brought proper translation parser support to C# scripts (<a href=https://github.com/godotengine/godot/pull/99195>GH-99195</a>). Now internationalization string collections will have the same functionality as GDScript, alongside native integration with GodotTools.<p>And more:<ul><li>Add CSV translation template generation (<a href=https://github.com/godotengine/godot/pull/112149>GH-112149</a>).<li>Make editor language setting default to Auto (<a href=https://github.com/godotengine/godot/pull/112317>GH-112317</a>).</ul><h3 id=navigation>Navigation</h3><p><a href=https://github.com/smix8>smix8</a> has opened the door to engine backend selection for <code class="language-plaintext highlighter-rouge">NavigationServer</code>s (<a href=https://github.com/godotengine/godot/pull/106290>GH-106290</a>). While Godot doesnt have additional navigation backends at this time, this does grant users a way to effectively disable the servers entirely via <code class="language-plaintext highlighter-rouge">Dummy</code>, removing the need to recompile the engine entirely for games that dont require navigation systems for 2D and/or 3D.<h3 id=physics>Physics</h3><p><a href=https://github.com/mihe>Mikael Hermansso</a> has done an absolutely phenomenal job with integrating Jolt as a first-class physics system for Godot. Its now at the point where we can confidently remove its experimental label (<a href=https://github.com/godotengine/godot/pull/111115>GH-111115</a>) and select it as the default for any newly-created projects (<a href=https://github.com/godotengine/godot/pull/105737>GH-105737</a>). This does not apply retroactively, but any projects made from this point on will be using Jolt out-of-the-box.<p>And more:<ul><li>Add MeshInstance3D primitive conversion options (<a href=https://github.com/godotengine/godot/pull/101521>GH-101521</a>).<li>Add MultiMesh physics interpolation for 2D transforms (MultiMeshInstance2D) (<a href=https://github.com/godotengine/godot/pull/107666>GH-107666</a>).</ul><h3 id=platforms>Platforms</h3><h4 id=android>Android</h4><p><a href=https://github.com/syntaxerror247>Anish Kumar</a> took to the implementation of Storage Access Framework (SAF) support (<a href=https://github.com/godotengine/godot/pull/112215>GH-112215</a>). Previously, accessing non-media files on external storage required the <code class="language-plaintext highlighter-rouge">MANAGE_EXTERNAL_STORAGE</code> permission, which is very broad and discouraged by Google. Now, projects can access files through the systems file picker instead, and this method doesnt require any permissions at all!<p>Thanks to the efforts of <a href=https://github.com/dsnopek>David Snopek</a> and <a href=https://github.com/devloglogan>Logan Lang</a>, Godot is now able to initiate Gradle builds on Android (<a href=https://github.com/godotengine/godot/pull/111732>GH-111732</a>). By sending commands to a companion app that provides a full Linux-like build environment to run Gradle, Godot itself remains lightweight while keeping setup easy by including everything you need within the companion app.<p>And more:<ul><li>Editor: Add game speed control options in game menu bar (<a href=https://github.com/godotengine/godot/pull/111296>GH-111296</a>).<li>Editor: Adjust script editor size for virtual keyboard (<a href=https://github.com/godotengine/godot/pull/112766>GH-112766</a>).<li>Editor: Persist fullscreen setting (<a href=https://github.com/godotengine/godot/pull/112246>GH-112246</a>).<li>Export: Add export option to use “scrcpy” to run project from editor (<a href=https://github.com/godotengine/godot/pull/108737>GH-108737</a>).<li>Tests: Add Android instrumented tests to the <code class="language-plaintext highlighter-rouge">app</code> module (<a href=https://github.com/godotengine/godot/pull/110829>GH-110829</a>).</ul><h4 id=linux>Linux</h4><p><a href=https://github.com/deralmas>Deralmas</a> has continued on their quest to make Wayland a first-class window protocol with the exciting introduction of game embedding (<a href=https://github.com/godotengine/godot/pull/107435>GH-107435</a>). This was one of the final major roadblocks that kept us from confidently declaring Waylands feature-parity with X11, and neatly rounds out the last major holdout towards embedded-window support across all major platforms.<p>And more:<ul><li>Wayland: Implement the xdg-toplevel-icon-v1 protocol (<a href=https://github.com/godotengine/godot/pull/107096>GH-107096</a>).</ul><h4 id=windows>Windows</h4><p><a href=https://github.com/blueskythlikesclouds>Skyth</a> was tasked by the Godot Foundation to bring Direct3D 12 to feature and stability parity with Vulkan, so that we could make it the default RenderingDevice driver on Windows (<a href=https://github.com/godotengine/godot/pull/113213>GH-113213</a>). As a result, Windows users can safely sidestep issues with comparatively outdated Vulkan drivers, as Direct3D 12 is the mainstay renderer for modern programs and API kits.<p>And more:<ul><li>Fix EnumDevices stall using IAT hooks (<a href=https://github.com/godotengine/godot/pull/113013>GH-113013</a>).</ul><h3 id=rendering-and-shaders>Rendering and shaders</h3><p><a href=https://github.com/allenwp>Allen Pestaluky</a> has been hard at work implementing features which will allow Godot to take full advantage of <abbr title="High dynamic range"><a href=https://en.wikipedia.org/wiki/High_dynamic_range>HDR</a></abbr>. Luckily for those stuck with <abbr title="Standard RGB"><a href=https://en.wikipedia.org/wiki/SRGB>sRGB</a></abbr> displays, his efforts have been in the form of visual quality improvements for everyone! Perhaps his most obvious improvement was a result of modifying blend glow to occur before tonemapping and changing the default blend mode behavior to <code class="language-plaintext highlighter-rouge">screen</code> (<a href=https://github.com/godotengine/godot/pull/110671>GH-110671</a>).<table><thead><tr><th>Before PR (glow after tonemapping)<th>After PR (glow before tonemapping)<tbody><tr><td><img src=/storage/blog/dev-snapshot-godot-4-6-beta-1/glow-old.webp alt="After tonemapping (screen, AgX, 16.29 white)"><td><img src=/storage/blog/dev-snapshot-godot-4-6-beta-1/glow-new.webp alt="Before tonemapping (screen, AgX, 16.29 white)"></table><p>But youve already seen this if youve been keeping up with our previous development snapshots. What we <em>havent</em> had the chance to showcase is the addition of <code class="language-plaintext highlighter-rouge">white</code>, <code class="language-plaintext highlighter-rouge">constrast</code>, and future HDR support for the AgX tonemapper (<a href=https://github.com/godotengine/godot/pull/106940>GH-106940</a>). Allen once again has brought us exciting new visual possibilities with this functionality, as this allows for the hue of bright colors to be more consistent, even at higher contrasts. Crucially, the new changes <strong>do not break compatibility</strong> with existing 4.4 and 4.5 projects, as the new curves this system provides were setup such that their visuals are in-line with the old AgX approximations.<p>Scenes using glow or the AgX tonemapper will see improvements to the overall visual quality.<table><thead><tr><th>AgX default contrast<th>AgX contrast of <code class="language-plaintext highlighter-rouge">1.53</code><tbody><tr><td><img src=/storage/blog/dev-snapshot-godot-4-6-beta-1/agx-contrast-default.webp alt="AgX default contrast"><td><img src=/storage/blog/dev-snapshot-godot-4-6-beta-1/agx-contrast-alt.webp alt="AgX contrast of 1.53"></table><table><thead><tr><th>Before<th>After<tbody><tr><td><img src=/storage/blog/dev-snapshot-godot-4-6-beta-1/agx-tonemapper-old.webp alt="AgX tonemapper before"><td><img src=/storage/blog/dev-snapshot-godot-4-6-beta-1/agx-tonemapper-new.webp alt="AgX tonemapper after"></table><p>Skyth overhauled our screen space reflection logic, resulting in higher quality visuals at a reduced performance cost (<a href=https://github.com/godotengine/godot/pull/111210>GH-111210</a>). We feel that the results speak for themselves.<table><thead><tr><th>64 Max Steps (old)<th>64 Max Steps (new - half) (half)<th>64 Max Steps (new - full)<tbody><tr><td><img src=/storage/blog/dev-snapshot-godot-4-6-dev-3/64-max-steps-old.jpg alt="64 max steps old"><td><img src=/storage/blog/dev-snapshot-godot-4-6-dev-3/64-max-steps-new-half.jpg alt="64 max steps new (half)"><td><img src=/storage/blog/dev-snapshot-godot-4-6-dev-3/64-max-steps-new-full.jpg alt="64 max steps new (full)"></table><table><thead><tr><th>256 Max Steps (old)<th>256 Max Steps (new - half)<th>256 Max Steps (new - full)<tbody><tr><td><img src=/storage/blog/dev-snapshot-godot-4-6-dev-3/256-max-steps-old.jpg alt="256 max steps old"><td><img src=/storage/blog/dev-snapshot-godot-4-6-dev-3/256-max-steps-new-half.jpg alt="256 max steps new (half)"><td><img src=/storage/blog/dev-snapshot-godot-4-6-dev-3/256-max-steps-new-full.jpg alt="256 max steps new (full)"></table><table><thead><tr><th>Roughness (old)<th>Roughness (new)<tbody><tr><td><img src=/storage/blog/dev-snapshot-godot-4-6-dev-3/roughness-old.jpg alt="Roughness old"><td><img src=/storage/blog/dev-snapshot-godot-4-6-dev-3/roughness-new.jpg alt="Roughness new"></table><table><thead><tr><th>Metallic surface (old)<th>Metallic surface (new - half)<th>Metallic surface (new - full)<tbody><tr><td><img src=/storage/blog/dev-snapshot-godot-4-6-dev-3/metallic-surface-old.jpg alt="Metallic surface old"><td><img src=/storage/blog/dev-snapshot-godot-4-6-dev-3/metallic-surface-new-half.jpg alt="Metallic surface new (half)"><td><img src=/storage/blog/dev-snapshot-godot-4-6-dev-3/metallic-surface-new-full.jpg alt="Metallic surface new (full)"></table><p>Its not all 3D improvements though, as <a href=https://github.com/stuartcarnie>Stuart Carnie</a> overhauled the design of our 2D renderer to reduce the GPU performance cost when batching (<a href=https://github.com/godotengine/godot/pull/112481>GH-112481</a>). This resulted in better performance across all devices (in GPU-bound scenarios), producing speeds ranging from 1.1x to 7x as fast. The actual benchmarks and more technical details are available in the associated pull request.<p>And more:<ul><li>Add methods to draw ellipses (<a href=https://github.com/godotengine/godot/pull/85080>GH-85080</a>).<li>Apply viewport oversampling to Polygon2D (<a href=https://github.com/godotengine/godot/pull/112352>GH-112352</a>).<li>Implement a very simple SSAO in GLES3 (<a href=https://github.com/godotengine/godot/pull/109447>GH-109447</a>).<li>Implement motion vectors in compatibility renderer (<a href=https://github.com/godotengine/godot/pull/97151>GH-97151</a>).<li>Overhaul and optimize Glow in the mobile renderer (<a href=https://github.com/godotengine/godot/pull/110077>GH-110077</a>).<li>Rewrite Radiance and Reflection probes to use Octahedral maps (<a href=https://github.com/godotengine/godot/pull/107902>GH-107902</a>).<li>TAA adjustment to reduce ghosting (<a href=https://github.com/godotengine/godot/pull/112196>GH-112196</a>).</ul><h3 id=xr>XR</h3><p><a href=https://github.com/BastiaanOlij>Bastiaan Olij</a> has brought native support for OpenXR 1.1 to Godot, which will automatically enable OpenXR 1.1 features on devices that support it (<a href=https://github.com/godotengine/godot/pull/109302>GH-109302</a>). This comes with a compatibility layer to make this as transparent as possible for developers who want to deploy their games both to headsets that support OpenXR 1.1, and those that only support OpenXR 1.0.<p>Bastiaan additionally implemented support for <a href=https://www.khronos.org/blog/openxr-spatial-entities-extensions-released-for-developer-feedback>OpenXR Spatial Entities Extensions</a>, introduced to standardize obtaining and interacting with information about the users real world environment (<a href=https://github.com/godotengine/godot/pull/107391>GH-107391</a>). This brings support for <a href=https://registry.khronos.org/OpenXR/specs/1.1/html/xrspec.html#XR_EXT_spatial_anchor>spatial anchors</a>, <a href=https://registry.khronos.org/OpenXR/specs/1.1/html/xrspec.html#XR_EXT_spatial_plane_tracking>plane tracking</a>, and <a href=https://registry.khronos.org/OpenXR/specs/1.1/html/xrspec.html#XR_EXT_spatial_marker_tracking>marker tracking</a> in a consistent and platform-independent manner. If you have the necessary equipment for it, Bastiaan has provided a <a href=https://github.com/BastiaanOlij/spatial-entities-demo>demo project</a> to showcase this new functionality.<p><a href=https://github.com/dhoverb>dhoverb</a> took to supporting the extensions for offsetting density maps (<a href=https://github.com/godotengine/godot/pull/112888>GH-112888</a>). This is a key feature enabling eye-tracked foveated rendering on devices that support this method. Currently, this has been tested on Meta Quest Pro and Samsung Galaxy XR headsets, but other headsets are expected to benefit from this change as well.<p>dhoverb has also added support for the <code class="language-plaintext highlighter-rouge">XR_KHR_android_thread_settings</code> extension, which informs the XR runtime about threads used for rendering, game logic, or other purposes (<a href=https://github.com/godotengine/godot/pull/112889>GH-112889</a>). This allows for better thread prioritization on AOSP devices that implement this extension.<p>And more:<ul><li>Add support for Android XR devices to the Godot XR Editor (<a href=https://github.com/godotengine/godot/pull/112777>GH-112777</a>).<li>OpenXR: Add core support for Khronos loader (<a href=https://github.com/godotengine/godot/pull/106891>GH-106891</a>).<li>OpenXR: Add support for frame synthesis (<a href=https://github.com/godotengine/godot/pull/109803>GH-109803</a>).<li>OpenXR: Add Valve Steam Frame controller support (<a href=https://github.com/godotengine/godot/pull/113785>GH-113785</a>).</ul><h2 id=changelog>Changelog</h2><p><strong>328 contributors</strong> submitted <strong>1483 fixes</strong> since the release of 4.5-stable. See our <a href=https://godotengine.github.io/godot-interactive-changelog/#4.6><strong>interactive changelog</strong></a> for the complete list of changes. You can also review <a href=https://godotengine.github.io/godot-interactive-changelog/#4.6-beta1>changes since the 4.6-dev6 snapshot</a>, for a more curated selection of <strong>52 fixes</strong> from <strong>29 contributors</strong>.<p>This release is built from commit <a href=https://github.com/godotengine/godot/commit/d743736f84fb668bcdfb5bf86258e483f35c6fec><code class="language-plaintext highlighter-rouge">d743736f8</code></a>.<h2 id=downloads>Downloads</h2><div class="card card-download"><a class=card-download-link href=/download/archive/4.6-beta1>Download Godot 4.6 beta1</a><div class=card-download-details><img class=lightbox-ignore src=/storage/blog/covers/dev-snapshot-godot-4-6-beta-1.jpg><div class=card-download-platforms><div class="download-platform platform-linux"><img width=24 height=24 src=/assets/images/platforms/linux.svg title=Linux alt=Linux class=lightbox-ignore>
Linux</div><a href="https://downloads.godotengine.org/?version=4.6&amp;flavor=beta1&amp;slug=linux.x86_64.zip&amp;platform=linux.64" class="btn btn-download btn-download-primary platform-linux"><div class=download-title>Standard</div></a><a href="https://downloads.godotengine.org/?version=4.6&amp;flavor=beta1&amp;slug=mono_linux_x86_64.zip&amp;platform=linux.64" class="btn btn-download btn-download-primary btn-download-primary--mono platform-linux"><div class=download-title>.NET</div></a><div class="download-platform platform-macos"><img width=24 height=24 src=/assets/images/platforms/macos.svg title=macOS alt=macOS class=lightbox-ignore>
macOS</div><a href="https://downloads.godotengine.org/?version=4.6&amp;flavor=beta1&amp;slug=macos.universal.zip&amp;platform=macos.universal" class="btn btn-download btn-download-primary platform-macos"><div class=download-title>Standard</div></a><a href="https://downloads.godotengine.org/?version=4.6&amp;flavor=beta1&amp;slug=mono_macos.universal.zip&amp;platform=macos.universal" class="btn btn-download btn-download-primary btn-download-primary--mono platform-macos"><div class=download-title>.NET</div></a><div class="download-platform platform-windows"><img width=24 height=24 src=/assets/images/platforms/windows.svg title=Windows alt=Windows class=lightbox-ignore>
Windows</div><a href="https://downloads.godotengine.org/?version=4.6&amp;flavor=beta1&amp;slug=win64.exe.zip&amp;platform=windows.64" class="btn btn-download btn-download-primary platform-windows"><div class=download-title>Standard</div></a><a href="https://downloads.godotengine.org/?version=4.6&amp;flavor=beta1&amp;slug=mono_win64.zip&amp;platform=windows.64" class="btn btn-download btn-download-primary btn-download-primary--mono platform-windows"><div class=download-title>.NET</div></a></div></div><div class=card-download-sublinks><a class=card-download-other href=/download/archive/4.6-beta1>Export templates and other downloads
</a><a class=card-download-donate href=https://fund.godotengine.org/>Make a Donation</a></div></div><style>.thankyou-wrapper{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.85);display:flex;flex-direction:column;justify-content:center;align-items:center;z-index:10}.thankyou{background:var(--base-color);box-shadow:var(--more-shadow);padding:30px;display:flex;flex-direction:column;align-items:center;text-align:center;position:relative;border-radius:13px}.thankyou-reading{font-size:16px}.thankyou-reading-list{font-size:16px;margin:0;margin-left:48px;padding-left:0}.thankyou-donate{margin-bottom:24px;text-align:center}.btn.btn-donate{background-color:var(--primary-color);color:hsla(0,0%,100%,.9);font-size:22px;font-weight:600;margin-bottom:26px}.thankyou h2{text-shadow:var(--base-shadow);font-size:36px;font-weight:800;margin-bottom:12px}.thankyou h2 .anchored-link{display:none!important}.thankyou p{max-width:620px;font-size:25px}@media(max-width:768px){.thankyou-wrapper{display:block}.thankyou{position:absolute;top:0;left:0;right:0;bottom:0;overflow:scroll;padding:30px 40px 18px}.thankyou-reading-list{margin-left:24px}.btn-close-thankyou-popup{width:48px;height:48px;display:flex;justify-content:center;align-items:center}}.btn-close-thankyou-popup{cursor:pointer;position:absolute;top:12px;right:12px}.btn-close-thankyou-popup img{background:0 0!important}@media(prefers-color-scheme:light){.btn-close-thankyou-popup img{filter:invert(1);opacity:.75}}</style><script>document.addEventListener("DOMContentLoaded",()=>{const e=document.getElementById("thank-you");e.addEventListener("click",t=>{t.target===e&&(e.style.display="none")});const t=document.querySelector(".btn-close-thankyou-popup");t.addEventListener("click",()=>{e.style.display="none"});const n=document.querySelectorAll(".btn-download, .download-button");n.forEach(t=>{if(t.dataset?.external==="yes")return;t.addEventListener("click",()=>{e.style.display="",document.querySelector(".btn.btn-donate").focus()})});const s=document.querySelectorAll(".download-link");s.forEach(t=>{t.addEventListener("click",()=>{e.style.display=""})}),document.addEventListener("keydown",t=>{t.key==="Escape"&&(e.style.display="none")})})</script><div class=thankyou-wrapper id=thank-you style=display:none><div class=thankyou><h2>Godot is downloading...</h2><p class=thankyou-donate>Godot exists thanks to donations from people like you. Help us continue our work:</p><a href=https://fund.godotengine.org class="btn btn-donate">Make a Donation</a><div class=btn-close-thankyou-popup><img src=/assets/icons/cross.svg width=24 height=24 alt="Close this popup" class=lightbox-ignore></div></div></div><p><strong>Standard build</strong> includes support for GDScript and GDExtension.<p><strong>.NET build</strong> (marked as <code class="language-plaintext highlighter-rouge">mono</code>) includes support for C#, as well as GDScript and GDExtension.<div class="card card-warning"><p>While engine maintainers try their best to ensure that each preview snapshot and release candidate is stable, this is by definition <strong>a pre-release piece of software</strong>. Be sure to make frequent backups, or use a version control system such as Git, to preserve your projects in case of corruption or data loss.</div><h2 id=known-issues>Known issues</h2><p>During the beta stage, we focus on solving both regressions (i.e. something that worked in a previous release is now broken) and significant new bugs introduced by new features. You can have a look at our current <a href=https://github.com/orgs/godotengine/projects/61>list of regressions and significant issues</a> which we aim to address before releasing 4.6. This list is dynamic and will be updated if we discover new showstopping issues after more users start testing the beta snapshots.<p>With every release, we accept that there are going to be various issues which have already been reported but havent been fixed yet. See the GitHub issue tracker for a complete list of <a href="https://github.com/godotengine/godot/issues?q=is%3Aissue+is%3Aopen+label%3Abug">known bugs</a>.<h2 id=bug-reports>Bug reports</h2><p>As a tester, we encourage you to <a href=https://github.com/godotengine/godot/issues>open bug reports</a> if you experience issues with this release. Please check the <a href=https://github.com/godotengine/godot/issues>existing issues on GitHub</a> first, using the search function with relevant keywords, to ensure that the bug you experience is not already known.<p>In particular, any change that would cause a regression in your projects is very important to report (e.g. if something that worked fine in previous 4.x releases, but no longer works in this snapshot).<h2 id=support>Support</h2><p>Godot is a non-profit, open source game engine developed by hundreds of contributors on their free time, as well as a handful of part and full-time developers hired thanks to <a href=https://fund.godotengine.org/>generous donations from the Godot community</a>. A big thank you to everyone who has contributed <a href=https://github.com/godotengine/godot/blob/master/AUTHORS.md>their time</a> or <a href=https://github.com/godotengine/godot/blob/master/DONORS.md>their financial support</a> to the project!<p>If youd like to support the project financially and help us secure our future hires, you can do so using the <a href=https://fund.godotengine.org/>Godot Development Fund</a> platform managed by <a href=https://godot.foundation/>Godot Foundation</a>. There are also several <a href=/donate>alternative ways to donate</a> which you may find more suitable.<p><a class=btn href=https://fund.godotengine.org/>Donate now</a></div></div></article><div class=blog-navigation><div class=previous><span>Previous</span>
<a rel=prev href=/article/dev-snapshot-godot-4-6-dev-6/>Dev snapshot: Godot 4.6 dev 6</a></div><div class=next><span>Next</span>
<a rel=next href=/article/inverse-kinematics-returns-to-godot-4-6/>Inverse Kinematics Returns to Godot 4.6</a></div></div></div><link rel=stylesheet href=/assets/css/anchor-link.css?1><link rel=stylesheet href=/assets/css/article-cards.css?3><script src=/assets/js/anchor-link.js></script><script>document.addEventListener("DOMContentLoaded",()=>{window.applyAnchorLinks(".article-body"),document.querySelectorAll(".article-cover img, .article-body img").forEach(e=>{if(e.classList.contains("lightbox-ignore"))return;const t=document.createElement("a");t.href=e.src,t.classList.add("lightbox"),t.dataset.group="article",e.parentNode.appendChild(t),t.appendChild(e)})})</script></main><footer class=footer-global><div class=wrapper><div class=columns><div class=col><h2>Godot Engine</h2><ul><li><a class=set-os-download-url href=/download>Download</a><li><a href=https://docs.godotengine.org>Documentation</a><li><a href=/features/>Features</a><li><a href=https://editor.godotengine.org/releases/latest/>Web editor</a><li><a href=/download/archive/>Release archive</a><li><a href=https://github.com/godotengine>Source code</a></ul></div><div class=col><h2>Project</h2><ul><li><a href=/blog/>Blog</a><li><a href=/code-of-conduct/>Code of conduct</a><li><a href=/governance/>Governance</a><li><a href=/teams/>Teams</a><li><a href=/priorities/>Priorities</a><li><a href=/community/>Communities</a></ul></div><div class=col><h2>Resources</h2><ul><li><a href=https://godotengine.org/asset-library/asset>Asset library</a><li><a href=/press/>Press kit</a><li><a href=/showcase/>Showcase</a><li><a href=/education/>Education</a><li><a href=/consoles/>Console support</a></ul></div><div class=col><h2>Foundation</h2><ul><li><a href=https://godot.foundation/>About</a><li><a href=https://fund.godotengine.org>Donate</a><li><a href=/license/>License</a><li><a href=/privacy-policy/>Privacy policy</a><li><a href=/contact/>Contact us</a></ul></div></div><hr><div class=credits-and-socials><p>© 2007-2025 Juan Linietsky, Ariel Manzur and <a href=https://github.com/godotengine/godot/blob/master/AUTHORS.md target=_blank rel=noopener>contributors</a>. Hosted by the <a href=https://godot.foundation/ target=_blank rel=noopener>Godot Foundation</a>. Website <a href=https://github.com/godotengine/godot-website target=_blank rel=noopener>source code on GitHub</a>.<div class=social><a href=https://github.com/godotengine target=_blank rel=noopener title=GitHub><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6.0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6.0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3.0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1.0-6.2-.3-40.4-.3-61.4.0.0-70 15-84.7-29.8.0.0-11.4-29.1-27.8-36.6.0.0-22.9-15.7 1.6-15.4.0.0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5.0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9.0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4.0 33.7-.3 75.4-.3 83.6.0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6.0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9.0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</a><a href=https://bsky.app/profile/godotengine.org target=_blank rel=noopener title=Bluesky><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path d="M407.8 294.7c-3.3-.4-6.7-.8-10-1.3 3.4.4 6.7.9 10 1.3zM288 227.1C261.9 176.4 190.9 81.9 124.9 35.3 61.6-9.4 37.5-1.7 21.6 5.5 3.3 13.8.0 41.9.0 58.4S9.1 194 15 213.9c19.5 65.7 89.1 87.9 153.2 80.7 3.3-.5 6.6-.9 10-1.4-3.3.5-6.6 1-10 1.4-93.9 14-177.3 48.2-67.9 169.9C220.6 589.1 265.1 437.8 288 361.1c22.9 76.7 49.2 222.5 185.6 103.4 102.4-103.4 28.1-156-65.8-169.9-3.3-.4-6.7-.8-10-1.3 3.4.4 6.7.9 10 1.3 64.1 7.1 133.6-15.1 153.2-80.7C566.9 194 576 75 576 58.4s-3.3-44.7-21.6-52.9c-15.8-7.1-40-14.9-103.2 29.8C385.1 81.9 314.1 176.4 288 227.1z"/></svg>
</a><a href=https://mastodon.gamedev.place/@godotengine target=_blank rel=noopener title=Mastodon><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M433 179.1c0-97.2-63.7-125.7-63.7-125.7-62.5-28.7-228.6-28.4-290.5.0.0.0-63.7 28.5-63.7 125.7.0 115.7-6.6 259.4 105.6 289.1 40.5 10.7 75.3 13 103.3 11.4 50.8-2.8 79.3-18.1 79.3-18.1l-1.7-36.9s-36.3 11.4-77.1 10.1c-40.4-1.4-83-4.4-89.6-54a102.5 102.5.0 01-.9-13.9c85.6 20.9 158.7 9.1 178.8 6.7 56.1-6.7 105-41.3 111.2-72.9 9.8-49.8 9-121.5 9-121.5zm-75.1 125.2h-46.6V190.1c0-49.7-64-51.6-64 6.9v62.5H201V197c0-58.5-64-56.6-64-6.9v114.2H90.2c0-122.1-5.2-147.9 18.4-175 25.9-28.9 79.8-30.8 103.8 6.1l11.6 19.5 11.6-19.5c24.1-37.1 78.1-34.8 103.8-6.1 23.7 27.3 18.4 53 18.4 175z"/></svg>
</a><a href=https://discord.gg/godotengine target=_blank rel=noopener title=Discord><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path d="M524.5 69.8a1.5 1.5.0 00-.8-.7A485.1 485.1.0 00404.1 32a1.8 1.8.0 00-1.9.9 337.5 337.5.0 00-14.9 30.6 447.8 447.8.0 00-134.4.0 309.5 309.5.0 00-15.1-30.6 1.9 1.9.0 00-1.9-.9A483.7 483.7.0 00116.1 69.1a1.7 1.7.0 00-.8.7C39.1 183.7 18.2 294.7 28.4 404.4a2 2 0 00.8 1.4A487.7 487.7.0 00176 479.9a1.9 1.9.0 002.1-.7 348.2 348.2.0 0030-48.8 1.9 1.9.0 00-1-2.6 321.2 321.2.0 01-45.9-21.9 1.9 1.9.0 01-.2-3.1c3.1-2.3 6.2-4.7 9.1-7.1a1.8 1.8.0 011.9-.3c96.2 43.9 200.4 43.9 295.5.0a1.8 1.8.0 011.9.2c2.9 2.4 6 4.9 9.1 7.2a1.9 1.9.0 01-.2 3.1 301.4 301.4.0 01-45.9 21.8 1.9 1.9.0 00-1 2.6 391.1 391.1.0 0030 48.8 1.9 1.9.0 002.1.7 486 486 0 00147.2-74.1 1.9 1.9.0 00.8-1.4c12.2-126.7-20.6-236.8-87-334.5zm-302 267.8c-29 0-52.8-26.6-52.8-59.2s23.4-59.3 52.8-59.3c29.7.0 53.3 26.8 52.8 59.2.0 32.7-23.4 59.3-52.8 59.3zm195.4.0c-29 0-52.8-26.6-52.8-59.2s23.3-59.3 52.8-59.3c29.7.0 53.3 26.8 52.8 59.2.0 32.7-23.2 59.3-52.8 59.3z"/></svg>
</a><a href=https://www.reddit.com/r/godot title=Reddit target=_blank rel=noopener><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M0 256C0 114.6 114.6.0 256 0S512 114.6 512 256 397.4 512 256 512H37.1c-13.7.0-20.5-16.5-10.9-26.2L75 437C28.7 390.7.0 326.7.0 256zM349.6 153.6c23.6.0 42.7-19.1 42.7-42.7s-19.1-42.7-42.7-42.7c-20.6.0-37.8 14.6-41.8 34-34.5 3.7-61.4 33-61.4 68.4v.2c-37.5 1.6-71.8 12.3-99 29.1-10.1-7.8-22.8-12.5-36.5-12.5-33 0-59.8 26.8-59.8 59.8.0 24 14.1 44.6 34.4 54.1 2 69.4 77.6 125.2 170.6 125.2s168.7-55.9 170.6-125.3c20.2-9.6 34.1-30.2 34.1-54 0-33-26.8-59.8-59.8-59.8-13.7.0-26.3 4.6-36.4 12.4-27.4-17-62.1-27.7-1e2-29.1v-.2c0-25.4 18.9-46.5 43.4-49.9 4.4 18.8 21.3 32.8 41.5 32.8zM177.1 246.9c16.7.0 29.5 17.6 28.5 39.3s-13.5 29.6-30.3 29.6-31.4-8.8-30.4-30.5S160.3 247 177 247zm190.1 38.3c1 21.7-13.7 30.5-30.4 30.5s-29.3-7.9-30.3-29.6c-1-21.7 11.8-39.3 28.5-39.3s31.2 16.6 32.1 38.3zm-48.1 56.7c-10.3 24.6-34.6 41.9-63 41.9s-52.7-17.3-63-41.9c-1.2-2.9.8-6.2 3.9-6.5 18.4-1.9 38.3-2.9 59.1-2.9s40.7 1 59.1 2.9c3.1.3 5.1 3.6 3.9 6.5z"/></svg>
</a><a href=/rss.xml title=RSS target=_blank rel=noopener><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M64 32C28.7 32 0 60.7.0 96V416c0 35.3 28.7 64 64 64h320c35.3.0 64-28.7 64-64V96c0-35.3-28.7-64-64-64H64zM96 136c0-13.3 10.7-24 24-24 137 0 248 111 248 248 0 13.3-10.7 24-24 24s-24-10.7-24-24c0-110.5-89.5-2e2-2e2-2e2-13.3.0-24-10.7-24-24zm0 96c0-13.3 10.7-24 24-24 83.9.0 152 68.1 152 152 0 13.3-10.7 24-24 24s-24-10.7-24-24c0-57.4-46.6-104-104-104-13.3.0-24-10.7-24-24zm0 120a32 32 0 1164 0 32 32 0 11-64 0z"/></svg></a></div></div></div></footer><script defer src=/assets/js/localize.js?7></script><script defer src=/assets/js/tobii.min.js></script><script defer src=/assets/js/highlight.min.js?1></script><script defer src=/assets/js/highlight.gdscript.min.js?1></script><script>document.addEventListener("DOMContentLoaded",()=>{document.querySelectorAll("pre:not(.manual) code").forEach(e=>{hljs.highlightBlock(e)}),document.querySelectorAll("[data-post-date]").forEach(e=>{Date.parse(e.dataset.postDate)>Date.now()-1e3*60*60*48&&e.classList.add("post-recent-highlight")}),new Tobii({zoom:!1});const e=document.querySelectorAll(".set-os-download-url");for(let n=0;n<e.length;n++){const s=e[n];let o="download";"version"in s.dataset&&s.dataset.version==="3"&&(o="download/3.x");let t="windows";navigator.platform.indexOf("Mac")!==-1?t="macos":navigator.userAgent.indexOf("Android")!==-1?t="android":navigator.platform.indexOf("Linux")!==-1&&(t="linux"),s.href=`/${o}/${t}/`}})</script>