<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Blog - Brickadia]]></title><description><![CDATA[Development Blog]]></description><link>https://brickadia.com/blog/</link><image><url>https://brickadia.com/blog/favicon.png</url><title>Blog - Brickadia</title><link>https://brickadia.com/blog/</link></image><generator>Ghost 5.84</generator><lastBuildDate>Mon, 06 Apr 2026 09:12:31 GMT</lastBuildDate><atom:link href="https://brickadia.com/blog/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Devlog #8 - Scripting, wires upgrades, and the next big patch]]></title><description><![CDATA[A preview of the next version of the game, featuring scripting, voice chat, new wires features, performance improvements and more!]]></description><link>https://brickadia.com/blog/devlog-8/</link><guid isPermaLink="false">69b570aeb0808500072a5796</guid><category><![CDATA[Development]]></category><dc:creator><![CDATA[Sixmorphugus]]></dc:creator><pubDate>Thu, 19 Mar 2026 17:06:22 GMT</pubDate><media:content url="https://brickadia.com/blog/content/images/2026/03/BrickadiaSteam-Win64-Shipping_wh7jzCAjXJ.png" medium="image"/><content:encoded><![CDATA[<img src="https://brickadia.com/blog/content/images/2026/03/BrickadiaSteam-Win64-Shipping_wh7jzCAjXJ.png" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch"><p>Hello fellow Brickadians! We&apos;ve been super busy working on the next version of the game that will have scripting, voice chat, new wires features, performance improvements and more! But first, an announcement:</p>
<!--kg-card-begin: html-->
<iframe src="https://store.steampowered.com/widget/2199420/" frameborder="0" width="646" height="190"></iframe>
<!--kg-card-end: html-->
<p><strong>Brickadia is taking part in the Steam Spring Sale!</strong> The game will be 25% off all through the sale. If you want to pick the game up at our lowest ever price of $15, now is the time!</p><h1 id="overall-goals">Overall Goals</h1><p>Brickadia is a great building game, with some of the most robust and advanced tech powering it (in our opinion!) But with it&apos;s current feature-set, building is still the one primary way players play the game. It&apos;s very rare to see other kinds of servers beyond your classic freebuild server.<br><br>Our goal with EA3 is to turn Brickadia from one of the best building games ever to one of the best games ever for building <em>and playing</em>. In other words, give Brickadia gameplay!</p><p>We want you to be able to make tycoon games in Brickadia. We want you to be able to make Battle Royales in Brickadia. We want you to be able to make procedural dungeons in Brickadia. We want you to be able to make Prop Hunt. And Trouble in Terrorist Town. And deathruns. And so much more.<br><br>While some of these games sort of exist in the current version of Brickadia, they usually employ a ton of tricks and hacks. Most are unfinished due to a lack of tools to let creators cross the finish line.</p><p>Like last time, there is a lot we are doing. Let&apos;s talk about it!</p><h1 id="proximity-voice-chat">Proximity Voice Chat</h1><p>Brickadia will soon have proximity voice chat. Speak to your friends as you would in a Discord call, but in 3D space!</p><p>It will be highly configurable. Servers can enable and disable it, players can mute others, and it makes everything just a bit funnier.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    
    	<video class="lazy" preload="none" controls>
    		<source data-src="https://static.brickadia.com/resources/devlog8-voicechat.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Kenko says hello!</figcaption>

</figure>
<!--kg-card-end: html-->
<h1 id="new-wires-features">New Wires Features</h1><p>Everyone trying to use wires has the same three problems:</p>
<ul>
<li>Wire contraptions take up too much space.</li>
<li>There is a lack of useful gates.</li>
<li>They are super annoying to edit once they&apos;ve been built.</li>
</ul>
<p>Let&apos;s fix all of those at once!</p>
<h2 id="microchips">Microchips</h2><p>You&apos;ll soon be able to collapse your infinitely complex circuits into a single brick with Microchips. You can put a microchip anywhere: inside your arcade machine, inside your car, even inside another chip!</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2026/03/microchips.jpg" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="2000" height="1125" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/microchips.jpg 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/microchips.jpg 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/microchips.jpg 1600w, https://brickadia.com/blog/content/images/2026/03/microchips.jpg 2000w" sizes="(min-width: 1200px) 1200px"></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2026/03/microchips--1-.jpg" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="2000" height="1125" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/microchips--1-.jpg 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/microchips--1-.jpg 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/microchips--1-.jpg 1600w, https://brickadia.com/blog/content/images/2026/03/microchips--1-.jpg 2000w" sizes="(min-width: 1200px) 1200px"></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2026/03/microchips--2-.jpg" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/microchips--2-.jpg 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/microchips--2-.jpg 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/microchips--2-.jpg 1600w, https://brickadia.com/blog/content/images/2026/03/microchips--2-.jpg 1920w" sizes="(min-width: 1200px) 1200px"></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2026/03/microchips--3-.jpg" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/microchips--3-.jpg 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/microchips--3-.jpg 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/microchips--3-.jpg 1600w, https://brickadia.com/blog/content/images/2026/03/microchips--3-.jpg 1920w" sizes="(min-width: 1200px) 1200px"></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2026/03/microchips--4-.png" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="1255" height="973" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/microchips--4-.png 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/microchips--4-.png 1000w, https://brickadia.com/blog/content/images/2026/03/microchips--4-.png 1255w" sizes="(min-width: 1200px) 1200px"></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2026/03/microchips--5-.png" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="1920" height="1042" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/microchips--5-.png 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/microchips--5-.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/microchips--5-.png 1600w, https://brickadia.com/blog/content/images/2026/03/microchips--5-.png 1920w" sizes="(min-width: 1200px) 1200px"></figure><p>We are working on further features for microchips, like inputs and outputs, gamemode integration, and player microchips, prior to release. Stay tuned on this one! It&apos;s going to be big.</p><h2 id="new-gates">New Gates</h2><p>We&apos;re adding a bunch of new gates to the game and have a bunch more on the way. Our focus with the gates we&apos;re adding is the same as it is for the update overall. We&apos;re fully invested in <em>drastically</em> increasing the scope of what Brickadia can do gameplay-wise.</p><p>One of the reasons we haven&apos;t added very many gates in the past few updates is because it actually involves quite a bit of stuff: Programming a gate involves quite a lot of boilerplate code, and art pass where the final gate was modeled by hand. Over the holidays, we&apos;ve streamlined this!<br><br>We&apos;re now procedurally generating our gate models. This has allowed us to speed up our iteration times by decoupling the need for a gate model from the final art pass. We also decided to update the base model for gates to try and make it slightly easier to read connections and layers of gates. It now only requires us to manually add the icon to make the gate shippable!</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_devlog8-procgatedemo" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Devlog8_ProcGateDemo.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Gate models procedurally generated with Geometry Nodes in Blender.</figcaption>
    </a>
    <div id="inline_devlog8-procgatedemo" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Devlog8_ProcGateDemo.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>Icons are now textured icons, rendered using an MSDF-encoded texture. No longer are the icons 3d modeled and baked into the gate mesh!</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2026/03/UnrealEditor-Win64-DebugGame_ZV5Nj6cvQi.jpg" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="2000" height="1152" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/UnrealEditor-Win64-DebugGame_ZV5Nj6cvQi.jpg 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/UnrealEditor-Win64-DebugGame_ZV5Nj6cvQi.jpg 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/UnrealEditor-Win64-DebugGame_ZV5Nj6cvQi.jpg 1600w, https://brickadia.com/blog/content/images/2026/03/UnrealEditor-Win64-DebugGame_ZV5Nj6cvQi.jpg 2000w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Left is old model, right is new gate model using an MSDF icon.</span></figcaption></figure><p>Vectors are now a supported wire type. All of the existing math gates will support it, and we&apos;re adding new gates to complement them!<br><br>We&apos;re also finally adding support for strings! All of the existing gates that accept a text/string input will be upgraded to have a wire port for the field. We&apos;re also adding gates for manipulating strings: formatting, combining strings, etc. And of course, there will be new gates to display text, including one that will let you place text and icons anywhere on your HUD.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2026/03/stringgate.png" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="1669" height="1139" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/stringgate.png 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/stringgate.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/stringgate.png 1600w, https://brickadia.com/blog/content/images/2026/03/stringgate.png 1669w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Silly test with the new string gates, printing out &quot;you have 1000 chunguses&quot; to the screen.</span></figcaption></figure><p><br><br>So far, a lot of the changes have been back-end changes, but we did still manage to cram in a few new gates. We still plan to add a huge number of useful gates before the update launches, so if you have any suggestions, please let us know through our usual channels!</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_devlog8-prefabspawner1" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog8-prefabspawner1.webm" type="video/webm">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Prefab spawner!</figcaption>
    </a>
    <div id="inline_devlog8-prefabspawner1" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog8-prefabspawner1.webm" type="video/webm">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2026/03/image.png" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="2000" height="485" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/image.png 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/image.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/image.png 1600w, https://brickadia.com/blog/content/images/2026/03/image.png 2336w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">With Vector support, we now have &quot;Get&quot; versions of all the entity transform gates!</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2026/03/image-1.png" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="2000" height="1009" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/image-1.png 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/image-1.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/image-1.png 1600w, https://brickadia.com/blog/content/images/2026/03/image-1.png 2336w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Some advanced math gates, and a Format Text gate.</span></figcaption></figure><h2 id="moving">Moving</h2><p>The resizer will soon be able to move and rotate bricks. Meaning you can now move and rotate your gates <em>without </em>disconnecting the wiring:</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_devlog8-movewires" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog8-movewires.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Moving a selection.</figcaption>
    </a>
    <div id="inline_devlog8-movewires" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog8-movewires.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>You can even move multiple bricks around at once:</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_devlog8-multimove" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog8-multimove.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Multi-moving a selection.</figcaption>
    </a>
    <div id="inline_devlog8-multimove" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog8-multimove.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p><br><br>We hope this will make wiring a bit less painful than it is currently!</p><h1 id="scripting-with-luau">Scripting with Luau</h1><p>Scripting has waited long enough, and is now officially in production! The next version of Brickadia will feature <a href="https://luau.org/" rel="noreferrer">Luau</a>, a high-performance scripting language, complete with a REPL accessible via chat and the console.<br><br>Luau scripting is intended to have a lot of control over the game. For that reason, we&apos;re gating script usage behind a special permission. It is also server-side only, but we will be augmenting it so you can do more client-specific tasks like UI. Worlds and Gamemodes can include scripts, and they can be shared on the Gallery.<br><br>This prototype version uses auto-generated bindings based on Unreal Engine&apos;s API, so there will be many changes to make scripting easier and friendlier.</p><p>Here&apos;s some things people have already done with our initial prototype!</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_devlog8-autobridge" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog8-autobridge.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>A script that places a brick right under your character.</figcaption>
    </a>
    <div id="inline_devlog8-autobridge" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog8-autobridge.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_devlog8-jetpack" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog8-jetpack.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>A functioning jetpack!</figcaption>
    </a>
    <div id="inline_devlog8-jetpack" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog8-jetpack.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_devlog8-studioscr" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog8-studioscr.webm" type="video/webm">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Studio mold has evolved...!</figcaption>
    </a>
    <div id="inline_devlog8-studioscr" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog8-studioscr.webm" type="video/webm">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2026/03/UnrealEditor-Win64-DebugGame_LylcPiFvIK.png" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="2000" height="963" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/UnrealEditor-Win64-DebugGame_LylcPiFvIK.png 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/UnrealEditor-Win64-DebugGame_LylcPiFvIK.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/UnrealEditor-Win64-DebugGame_LylcPiFvIK.png 1600w, https://brickadia.com/blog/content/images/2026/03/UnrealEditor-Win64-DebugGame_LylcPiFvIK.png 2000w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Terrain generation using a script.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2026/03/boom.png" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="2000" height="886" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/boom.png 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/boom.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/boom.png 1600w, https://brickadia.com/blog/content/images/2026/03/boom.png 2000w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Spawning an explosion using very verbose bindings.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2026/03/sweeney.png" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="1703" height="714" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/sweeney.png 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/sweeney.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/sweeney.png 1600w, https://brickadia.com/blog/content/images/2026/03/sweeney.png 1703w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Renaming everyone to... Tim Sweeney...</span></figcaption></figure><p>There is still quite a bit to do, but even in this state it can do quite a lot.</p><h1 id="performance-improvements">Performance Improvements</h1><p>For every major update we try to make your game run a little better, and this one is no exception. Off the top of my head, here&apos;s everything we&apos;ve done so far, and there might still be more to come:</p><ul><li>We&apos;ve upgraded Unreal Engine to 5.7, which required solving several hundred rebase conflicts to integrate all our custom changes into the new version (it turns out Epic also likes to change the engine a lot!),</li><li>We&apos;ve fixed a major performance flaw in the Iris replication system that was causing it to poll sleeping and frozen entities every frame, only to discover that they did indeed not change,</li><li>We&apos;ve implemented a new fast rendering system that makes use of a new engine feature to render meshes while completely bypassing all the overhead that comes from using heavy primitive components to draw them, now in use for brick cluster meshes and character parts,</li><li>We&apos;ve implemented a new tick manager for brick components that only sometimes require ticks to update every frame, such as wheel engines that can go asleep when no one is driving the car and the steering has returned to idle,</li><li>We&apos;ve moved the final remaining part of the weapons system that was using Open Alpha-era barely functioning server side hit detection (melee weapons) to the new system of client predicted hits, which then allowed us to completely disable evaluating player animations on servers and only do it when the player is actually visible on clients,</li><li>We&apos;ve nativized more parts of old character blueprints like updating the nametags on screen that was taking up a lot of time, and optimized some redundant logic for bot controllers,</li><li>We&apos;ve made buoyancy computations roughly 10 times faster while also parallelizing it, now making it so fast that we could also enable buoyancy for all entities such as wheels,</li><li>We&apos;ve fixed that light components did not correctly apply the radius clamp from brightness when loading a map in single player or as a listen server (the issue did not occur as a client),</li><li>We&apos;ve refactored the brick cluster mesh system to now allow merging geometry across chunks when the world contains many sparse bricks over a large area, though it cannot yet combine meshes across different grids,</li><li>We&apos;ve removed all unnecessary access to physics scenes from background threads, which now allows us to run PhysX without the scene locks on every API call, removing a lot of overhead on basically everything,</li><li>We&apos;ve started compiling our &quot;shipping&quot; config binaries with <a href="https://clang.llvm.org/docs/ThinLTO.html" rel="noreferrer">Thin LTO</a>, allowing the compiler to remove many unnecessary virtual function calls and inline small functions even across different files and modules,</li><li>We&apos;ve fixed that physics wasn&apos;t parallelized at all on typical cloud servers with two cores, previously it only worked on three cores and up,</li><li>And more that wasn&apos;t worth mentioning here...</li></ul><h3 id="client-performance">Client Performance</h3><p>Wew! That&apos;s a lot! So what did we gain? Are we writing all this fluff for 5% performance gains? Well, let&apos;s compare EA2 to the current main branch. We&apos;ll use a version of the world &quot;Pinkadia&quot; for comparison, which is one of the most complex worlds ever created in the game:</p><figure class="kg-card kg-image-card"><img src="https://brickadia.com/blog/content/images/2026/03/image-5.png" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="787" height="88" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/image-5.png 600w, https://brickadia.com/blog/content/images/2026/03/image-5.png 787w" sizes="(min-width: 720px) 720px"></figure><p>Since most players would see this as a client on a server, we&apos;ve also joined a server as a client. These screenshots are taken on a system with a RTX 5090 and Ryzen 9950X3D, but relative improvements are similar on other computers.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2026/03/image-4.png" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/image-4.png 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/image-4.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/image-4.png 1600w, https://brickadia.com/blog/content/images/2026/03/image-4.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">EA2, ray tracing enabled - 46 fps</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2026/03/image-3.png" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/image-3.png 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/image-3.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/image-3.png 1600w, https://brickadia.com/blog/content/images/2026/03/image-3.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">EA2, ray tracing disabled - 70 fps</span></figcaption></figure><p>This world seems to perform terribly on a very high end computer. Let&apos;s see if that runs any better in the new version so far.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2026/03/image-6.png" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/image-6.png 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/image-6.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/image-6.png 1600w, https://brickadia.com/blog/content/images/2026/03/image-6.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">EA3, ray tracing enabled - 82 fps (78% faster)</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2026/03/image-7.png" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/image-7.png 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/image-7.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/image-7.png 1600w, https://brickadia.com/blog/content/images/2026/03/image-7.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">EA3, ray tracing disabled - 111 fps (58% faster)</span></figcaption></figure><p>We&apos;ve certainly made progress here!</p><p>There is more to come for optimizing the client - we&apos;ll soon introduce a new kinematic joint to connect multiple grids together rigidly, while allowing it to rotate with interpolation when controlled by a wire. This will allow you to replace slow physics based doors with much faster kinematic grids, and in the case where the angle is not controlled by a wire, we will be able to merge meshes across subgrids, making builds with a lot of rotated decorative grids massively faster.</p><p>And we haven&apos;t even started optimizing the GPU memory usage yet - the core brick renderer is still from Open Alpha days where builds mostly fit in VRAM and ray tracing was something far off. There are plans for streaming brick clusters so only the ones within the view distance must be resident in VRAM, and a new way to organize brick vertex data that should reduce its size by roughly 5 times (sadly, that will not apply to the separate ray tracing data, but it should help low end computers who will not be using ray tracing anyway the most).</p><h3 id="server-performance">Server Performance</h3><p>Dedicated servers are now also <em>much</em> faster. Before, most of the time was spent on useless things, which we&apos;ve now removed. For example, here is a direct comparison of a server frame running Pinkadia with a single client connected. To capture this trace, we have to use an instrumented build, so it&apos;s a little slower, but watch the difference in timings of the sections:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2026/03/image-9.png" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="1326" height="610" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/image-9.png 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/image-9.png 1000w, https://brickadia.com/blog/content/images/2026/03/image-9.png 1326w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">EA2 server - this sucks actually</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2026/03/image-10.png" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="1595" height="570" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/image-10.png 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/image-10.png 1000w, https://brickadia.com/blog/content/images/2026/03/image-10.png 1595w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">EA3 server - quite a lot more usable (4 times faster)</span></figcaption></figure><p>Running the server with tracing capability adds a lot of overhead, so let&apos;s also just compare the final frame rate the server is able to achieve, by joining it as a client and viewing this beautiful tps counter made out of bricks and gates and wires:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2026/03/image-11.png" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/image-11.png 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/image-11.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/image-11.png 1600w, https://brickadia.com/blog/content/images/2026/03/image-11.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">EA2 server running the world sim and one client</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2026/03/image-12.png" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/image-12.png 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/image-12.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/image-12.png 1600w, https://brickadia.com/blog/content/images/2026/03/image-12.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">EA3 server running the same (7 times faster)</span></figcaption></figure><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">Want your own tps counter? Use prefab code g81-w7w-q69</div></div><p>In the proper &quot;shipping&quot; configuration of the server we can now also see the performance impact of using Thin LTO to let the compiler optimize across the whole program, making it <em>even faster</em> than the previous comparison.</p><p>A listen server runs both the client and server code each tick, so if you are hosting a large world locally, you should expect performance increases somewhere between the two above.</p><p>Oh, and we&apos;ve also made some tools so you can make your own builds and servers faster rather than waiting for us to find a way to do it by magic!</p><h1 id="performance-debug-views">Performance Debug Views</h1><p>Previously, whenever we tried to implement debug views in the engine, the performance left something to be desired:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2026/03/image-23.png" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/image-23.png 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/image-23.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/image-23.png 1600w, https://brickadia.com/blog/content/images/2026/03/image-23.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">We&apos;re gonna need to measure in seconds per frame for this one</span></figcaption></figure><p>But recently, we&apos;ve gained a super fast new debug drawer based on the excellent work in the <a href="https://github.com/Brickadia/VoxelCore/blob/brickadia/Source/VoxelCore/Public/VoxelMinimal/VoxelDebugDrawer.h" rel="noreferrer">VoxelCore</a> plugin:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2026/03/image-24.png" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/image-24.png 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/image-24.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/image-24.png 1600w, https://brickadia.com/blog/content/images/2026/03/image-24.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Ah. That&apos;s more reasonable.</span></figcaption></figure><p>So naturally, we had a solution and went looking for problems to solve with it...</p><p>For those interested in finding laggy contraptions in your servers and improving the performance of your worlds, we now have several useful debug visualizations you can use, all of which also include statistics for you to look at and use to track down performance issues on your servers.</p><h2 id="entity-debug-view">Entity Debug View</h2><p>This makes it easy to track down rogue entities, like physics grids, that may be contributing to server tick rate issues. It can be enabled with <code>BR.DrawDebugEntities 1</code>.</p><p>Watch out for red entities. Those are actively moving in the simulation and processed by physics and replication.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2026/03/image-15.png" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/image-15.png 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/image-15.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/image-15.png 1600w, https://brickadia.com/blog/content/images/2026/03/image-15.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">The entity visualizer shows you where all those dynamic grids and wheels are.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2026/03/image-16.png" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/image-16.png 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/image-16.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/image-16.png 1600w, https://brickadia.com/blog/content/images/2026/03/image-16.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">The entity visualizer works at any distance.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2026/03/image-17.png" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/image-17.png 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/image-17.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/image-17.png 1600w, https://brickadia.com/blog/content/images/2026/03/image-17.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Finding those physics objects hiding at the world border is now very easy.</span></figcaption></figure><h2 id="light-debug-view">Light Debug View</h2><p>A very common performance pitfall many builds suffer from is from overlapping lights, and this visualization makes it very easy to spot. It can be enabled with <code>BR.DrawDebugLights 1</code>.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2026/03/image-21.png" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/image-21.png 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/image-21.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/image-21.png 1600w, https://brickadia.com/blog/content/images/2026/03/image-21.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">The light visualizer shows you all the lights in the world and who made them.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2026/03/image-22.png" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/image-22.png 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/image-22.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/image-22.png 1600w, https://brickadia.com/blog/content/images/2026/03/image-22.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">It also shows you how many other lights a light is overlapping.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2026/03/image-18.png" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/image-18.png 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/image-18.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/image-18.png 1600w, https://brickadia.com/blog/content/images/2026/03/image-18.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Oh no</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2026/03/image-20.png" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/image-20.png 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/image-20.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/image-20.png 1600w, https://brickadia.com/blog/content/images/2026/03/image-20.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">There really are a lot of lights here</span></figcaption></figure><p>If you have many overlapping lights at some location, and you get close to that location, all those lights are going to cover your entire screen, which is very slow.</p><p>So we thought it&apos;d be useful to show how much overlap there really is, counting up for every light how many others touch it, and coloring them from green to red depending on the number, which ended up being a lot more difficult than expected.</p><p>Quiz: How do you determine which of 15,000 lights overlap each other in under 0.5ms on a single core?</p><h2 id="replication-debug-view">Replication Debug View</h2><p>It can be difficult finding specific contraptions in your world that may be contributing to network performance issues. Thankfully, we have a colorful solution! This can be enabled with <code>BR.DrawDebugClientUpdates 1</code> in the console.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_devlog8-repviz1" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog8-repviz1.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Replication debug view on a smaller system. Each update renders a colored sphere to make it easy to find.</figcaption>
    </a>
    <div id="inline_devlog8-repviz1" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog8-repviz1.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2026/03/image-26.png" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/image-26.png 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/image-26.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/image-26.png 1600w, https://brickadia.com/blog/content/images/2026/03/image-26.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">For example, as a host, you might wonder where someone has hidden the 1000 updates/s.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2026/03/image-27.png" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/image-27.png 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/image-27.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/image-27.png 1600w, https://brickadia.com/blog/content/images/2026/03/image-27.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">The flashing dots and view-relative stats quickly let you home in on the problem.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2026/03/image-28.png" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/image-28.png 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/image-28.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/image-28.png 1600w, https://brickadia.com/blog/content/images/2026/03/image-28.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Ah. So that&apos;s why. Maybe we should switch this contraption off.</span></figcaption></figure><h2 id="collider-debug-view">Collider Debug View</h2><p>We&apos;ve had this view before, but it has now been upgraded to visualize the origin, center of mass and intertia tensor of the object, letting you see whether your custom masses had the intended effect. It can be enabled with <code>BR.DrawDebugColliders 1</code> in the console.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2026/03/image-29.png" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/image-29.png 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/image-29.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/image-29.png 1600w, https://brickadia.com/blog/content/images/2026/03/image-29.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Collider visualizer.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2026/03/image-30.png" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/image-30.png 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/image-30.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/image-30.png 1600w, https://brickadia.com/blog/content/images/2026/03/image-30.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">This object has a custom mass (cyan box) which results in a shift of the COM (grey dot) and inertia tensor (grey box).</span></figcaption></figure><h2 id="brick-cluster-debug-view">Brick Cluster Debug View</h2><p>This one shows you how the brick engine groups the brick geometry to render. It can be enabled with <code>BR.DrawDebugBrickClusters 1</code> in the console.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2026/03/image-25.png" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/image-25.png 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/image-25.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/image-25.png 1600w, https://brickadia.com/blog/content/images/2026/03/image-25.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Every separate grid you use creates separate clusters regardless of whether you freeze it or not.</span></figcaption></figure><h1 id="other-goodies">Other Goodies</h1><p>Characters are finally present in the ray tracing scene, and the quality of ray traced reflections is also vastly improved with the new engine version.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2026/03/image-13.png" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/image-13.png 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/image-13.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/image-13.png 1600w, https://brickadia.com/blog/content/images/2026/03/image-13.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Who&apos;s that?</span></figcaption></figure><p>We&apos;ve fixed replication of sleeping object positions. No more will you load into a server, approach an object, only to learn that it did in fact not exist at that location, and see your character teleport 50 studs to the side.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2026/03/image-32.png" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/image-32.png 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/image-32.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/image-32.png 1600w, https://brickadia.com/blog/content/images/2026/03/image-32.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">All of the sleeping objects on this test server are at the correct position.</span></figcaption></figure><p>We&apos;ve added a network lag indicator that shows up if your average latency is too high or the server hasn&apos;t sent any message at all within a short time frame. There&apos;s also a similar warning for getting close to maxing out your system VRAM.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2026/03/image-34.png" class="kg-image" alt="Devlog #8 - Scripting, wires upgrades, and the next big patch" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2026/03/image-34.png 600w, https://brickadia.com/blog/content/images/size/w1000/2026/03/image-34.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2026/03/image-34.png 1600w, https://brickadia.com/blog/content/images/2026/03/image-34.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">I guess the router died again...</span></figcaption></figure><h1 id="and-more">...And more.</h1><p>There is so much else that we could have covered, but we have to get back to work! If you want to see further highlights, we highly recommend joining our <a href="https://discord.com/invite/brickadia" rel="noreferrer">Discord</a> to get the latest and greatest news in one place. </p><p>Thanks for reading! Stay tuned.</p>]]></content:encoded></item><item><title><![CDATA[Brickadia is now $19.99 until Early Access ends!]]></title><description><![CDATA[To make it easier for you to invite your friends and grow our community, we’re permanently lowering the price to $19.99 for the duration of Early Access.]]></description><link>https://brickadia.com/blog/brickadia-is-now-19-99/</link><guid isPermaLink="false">693c60a1b33dbb0007ef3b34</guid><category><![CDATA[News]]></category><dc:creator><![CDATA[Zeblote]]></dc:creator><pubDate>Sat, 31 Jan 2026 22:51:18 GMT</pubDate><media:content url="https://brickadia.com/blog/content/images/2026/01/EAprice2.png" medium="image"/><content:encoded><![CDATA[<img src="https://brickadia.com/blog/content/images/2026/01/EAprice2.png" alt="Brickadia is now $19.99 until Early Access ends!"><p>Hey everyone,</p><p>We&apos;ve been reading all your feedback since the Early Access release, and one thing that&apos;s come up very often was the price of the game. Many of you felt that $29.99 was too high a price while the game is lacking the last major features, and was making it difficult for you to get your friends to try it out with you.</p><p>We are confident that $29.99 reflects the value of the full 1.0 release, but we want the price to reflect the Early Access journey we&#x2019;re on together right now. To make it easier for you to invite your friends and grow our community, we&#x2019;re lowering the price to $19.99 for the duration of Early Access. Regional pricing will apply as before.</p>
<!--kg-card-begin: html-->
<iframe src="https://store.steampowered.com/widget/2199420/" frameborder="0" width="646" height="190"></iframe>
<!--kg-card-end: html-->
<p>To those of you who have already jumped in at the original price point: Thank you! Your early support has been instrumental in keeping development moving at this pace. We&apos;ve always said that our community is the most important part of this project, and by making the game more affordable now, we hope to see your servers feel a lot more alive.</p><p>What&apos;s next?</p><p>We have a large content update following soon after with many new additions to the logic system, giving you greater control over your gameplay. Stay tuned!</p>]]></content:encoded></item><item><title><![CDATA[EARLY ACCESS 2: The Prefabs and Bots Update]]></title><description><![CDATA[Customizable bots, reworked physics prefabs system, new selector, player collision channels, brick property changer, X-Ray mode; and so much more.]]></description><link>https://brickadia.com/blog/early-access-2/</link><guid isPermaLink="false">6918ccdcb33dbb0007ef3af9</guid><category><![CDATA[News]]></category><category><![CDATA[Releases]]></category><dc:creator><![CDATA[Zeblote]]></dc:creator><pubDate>Fri, 12 Dec 2025 18:49:50 GMT</pubDate><media:content url="https://brickadia.com/blog/content/images/2025/12/ea2release2.png" medium="image"/><content:encoded><![CDATA[<img src="https://brickadia.com/blog/content/images/2025/12/ea2release2.png" alt="EARLY ACCESS 2: The Prefabs and Bots Update"><p>This is our first major update! We&apos;ve cleaned up all major bugs and fixed a lot of stuff that was broken since EA1. If you encounter issues, please let us know in the bug-reports channel of the Discord or the Steam forums.</p><h2 id="winter-sale">Winter Sale</h2><p>Brickadia is taking part in the Steam Winter Sale! If you haven&apos;t bought the game yet, now is a great time:</p>
<!--kg-card-begin: html-->
<iframe src="https://store.steampowered.com/widget/2199420/" frameborder="0" width="646" height="190"></iframe>
<!--kg-card-end: html-->
<figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/87SfS79kj98?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="Sale + Bots &amp; Prefabs Update Preview!"></iframe></figure><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/d_UWCy9a9FU?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="Bots &amp; Prefabs Update - Brickadia is on sale on Steam right now!"></iframe></figure><h2 id="major-features">Major Features</h2><p>Customizable bots to give life to your maps! Give them any weapon and customize their settings like aggression or 360 degree vision. You can use them without weapons to create wandering NPCs, give them swords to make an army of warriors, or give them all guns to create a deathmatch server. They look the same as a player, and you can give them your avatar settings.</p><p>We&apos;ve fully reworked the prefab system. The new prefabs live in your catalog! Save entire cars, contraptions and other interconnected objects locally for easy reuse. Grab a vehicle from the gallery and place it, instantly, anywhere you have permission. Copy things from the world into your real clipboard, and paste them into Discord or another running instance of the game.</p><p>The selector has been completely rewritten with a new connection mode. Grab a complete physics contraption with all connected grids and entities in a single click.</p><p>Four separate player collision channels let you create invisible walls that only certain teams can pass through, opening up new possibilities for minigames and maps.</p><p>A new component that lets you dynamically change a brick&apos;s visibility, collision, and color through wires. Perfect for hidden doors or interactive displays.</p><p>The Applicator and Connector now have an X-Ray mode, letting you edit components on bricks hidden behind other bricks and entities.</p><h2 id="full-changelog-since-ea1">Full Changelog Since EA1</h2><h3 id="gallery">Gallery</h3><ul><li>Renamed &quot;TOP&quot; and &quot;TOP ALL TIME&quot; categories to &quot;HOT&quot; and &quot;TOP&quot;.</li><li>The &quot;HOT&quot; category now also shows older files on the next pages.</li><li>The browser page no longer reloads every time the dialog is shown.</li></ul><h3 id="worlds">Worlds</h3><ul><li>You can now save the server world to your client if you have any building permissions.</li><li>You can now upload worlds to servers with extended permissions. The server will be in read-only mode with autosave disabled.</li></ul><h3 id="prefabs">Prefabs</h3><ul><li>A new prefab browser is now integrated into the catalog, letting you save your creations and add them to the inventory to place much like bricks and entities.</li><li>Prefabs now have automatically generated thumbnails that look the same as bricks and entities, no longer requiring you to get a nice screenshot.</li><li>A new prefab gallery is also available, letting you share your creations, and browse the ones others shared to use immediately or save for later.</li><li>Copying things now stores a prefab file in your clipboard, letting you paste it in another game client or share it through applications like Discord.</li><li>The legacy prefab system and its associated dialogs were removed, but a button exists in the prefab browser to convert any legacy brs files you may have.</li><li>The Max Selected Bricks default value is now the same as Max Prefab Bricks.</li></ul><h3 id="physics">Physics</h3><ul><li>There are now 4 separate player collision channels, so you can make invisible walls that only some teams can pass.</li><li>Can choose which channel to use on a per-team basis, as well as which channels players on those teams collide with.</li></ul><h3 id="selector">Selector</h3><ul><li>The selection system has been rewritten and now supports tracking an explicit selection of bricks and entities.</li><li>When using a selection box, in addition to immediately copying/cutting that box as before, you can now also add/remove the bricks inside to your selection to refine what you have selected in multiple steps.</li><li>The selector now has an alternative connection selection mode that selects adjacent bricks, such as a whole house on its baseplate.</li><li>The connection mode also supports selecting an entire physics contraption including all connected grids and entities.</li><li>Added entity and brick count limits to the selector.</li><li>The mode switch binding has been changed to C.</li></ul><h3 id="applicator">Applicator</h3><ul><li>You can now press R to toggle X-Ray Mode, which will edit bricks that have existing components through other bricks and entities.</li></ul><h3 id="connector">Connector</h3><ul><li>The connector now also has an X-Ray Mode that only interacts with bricks that have components.</li><li>The gate brick will now be highlighted when hovering a physical port.</li></ul><h3 id="painter">Painter</h3><ul><li>The painter can now paint and pick the color sections of entities, such as making wheels have differently colored tires.</li></ul><h3 id="building">Building</h3><ul><li>High friction tires is now the default for newly placed wheels.</li></ul><h3 id="components">Components</h3><ul><li>Added a new component, the Brick Property Changer. Can be used to change the visibility, collision channels, and color of a brick using wires.</li><li>The ancient per-type component quota has been removed. There is now a single per-user quota of active components (lights, audio, item spawns, engines, etc) which can be adjusted in server settings.</li><li>The Seat component can now be manually attached to all bricks, in case you want to fit custom seats in tight spaces.</li><li>All the uncategorized components have been organized in the list.</li></ul><h3 id="bots">Bots</h3><ul><li>Bots can now be given weapons and use them, attacking with melee weapons or shooting guns, reloading them when appropriate.</li><li>Bots can now wander around freely on the map or walk towards goal points, jumping over obstacles.</li><li>Bots can now be given character skins by copying the current skin from your character.</li><li>Bots can now damage players in the default minigame and join teams by coloring their spawns the same as the team color.</li><li>Bots are now considered for win conditions like last man standing.</li><li>Bots can now spawned and despawned by wires.</li><li>Bots have a lot more settings than we are able to list here.</li></ul><h3 id="weapons">Weapons</h3><ul><li>Return of Crystal Kalis which was accidentally disabled.</li><li>Added Laser Cleaver.</li><li>Added Laser Axe.</li><li>Added Medi-Syringe, an item which quickly heals 50 health when used.</li><li>Added Spear, a melee weapon with a fast underhand stab and a slow overhead stab.</li><li>Added Bandage, a slow self healing item that restores 25 hp.</li><li>Added Basic Claws, Sharp Claws, and Shadow Claws, fast melee weapons intended for zombie bots but also possible to use yourself.</li></ul><h3 id="cosmetics">Cosmetics</h3><ul><li>Added Twintails</li><li>Added Snout (multiple variants)</li><li>Added Shaggy Swept hair (2 variants)</li><li>Added Wings</li><li>Added Back Valve</li><li>Added Robot Paw</li><li>Added Robobunny Ears</li><li>Added Secured Bag</li><li>Added Employee Card</li></ul><h3 id="sounds">Sounds</h3><ul><li>Tool audio has been reclassified under Item audio.</li></ul><h3 id="ui">UI</h3><ul><li>The world browser and catalog now remember the last used tab between sessions.</li><li>Pressing Ctrl F in the My Worlds or My Prefabs tabs will now focus the search box.</li><li>Clicking the current folder breadcrumb will now reload the listing to see external changes.</li><li>The pause menu now has a button to open the server list when on a server as a client.</li><li>The unimplemented admin button has been removed from the pause menu.</li><li>Added the ability to search for worlds. Search also includes files in subfolders of the current folder.</li><li>Added the ability to delete worlds.</li><li>Added a dialog when failing to create a folder.</li><li>Removed the defunct controller column from the key binding menu. This never functioned correctly once we began implementing chorded bindings for tools. The intended way to configure controller mappings is to use Steam Input settings.</li><li>Removed the defunct help menu.</li><li>Removed unnecessary &quot;Release-&quot; text from the version display in the top right.</li><li>The folder tiles in the world and prefab browsers now show how many files and folders are inside them.</li></ul><h3 id="servers">Servers</h3><ul><li>Improved /BrickCount output to include entity counts.</li><li>Removed /DestroyAllGrids, which was an obsolete test command.</li><li>Added /ClearAllEntities, which removes all entities in the world.</li><li>Added /ClearEntities, which removes your own entities.</li><li>Added /ClearEntities [player], which removes someone elses entities.</li><li>Added /ClearAllLooseEntities, which removes all entities not attached to at least one more entity.</li><li>Added /ClearLooseEntities, which does the same but only for your entities.</li><li>Added /ClearLooseEntities [player], which does the same but for someone elses entities.</li><li>Added /ClearAllFarEntities [distance], which removes all entities further away than some distance in studs.</li><li>Added /ClearFarEntities [distance], which does the same but only for your entities.</li><li>Added /ClearFarEntities [player] [distance], which does the same but for someone elses entities.</li><li>Added /BrickCount [player], which shows how many bricks, entities and components a specific player has.</li><li>Updated player admin actions drop down to include Clear Entities, Clear Loose Entities, Clear Far Entities (defaults distance to 10000 studs).</li><li>There is now a permission for whether players can use X-Ray mode, intended for Tutorial but can be used by players too.</li></ul><h3 id="performance">Performance</h3><ul><li>Optimized building and share zone checks when modifying bricks.</li><li>Optimized zone checks when characters move.</li><li>Optimized manipulator searching for possible joints to attach while holding entity.</li></ul><h3 id="engine">Engine</h3><ul><li>The experimental Behaviors code has been removed in preparation of integrating the new Lua scripting engine coming in a future update.</li><li>The world boundary no longer instantly vaporizes your vehicles and simply keeps them inside.</li><li>Some improvements to player movement prediction when walking on large frozen physics grids.</li><li>Refactored how the game accesses worlds and prefabs. File handles are now automatically closed and databases unloaded after a few seconds of inactivity, allowing external access to the files.</li><li>The Test executable is now included with the dedicated server deployment.</li><li>Updated PhysX to the newest patch release of version 5.6.1.</li><li>Updated DLSS plugin to version 8.3.0-NGX310.4.0.</li><li>Updated FSR plugin to 4.0.2b, improving performance and stability.</li></ul><h3 id="localization">Localization</h3><ul><li>Updated Spanish localization with reviewed strings.</li><li>Refreshed strings.</li></ul><h3 id="servers-1">Servers</h3><ul><li>The server log file now logs when a user is unbanned.</li></ul><h3 id="bugs">Bugs</h3><ul><li>Fixed crash auto toggling tool with controller.</li><li>Fixed crash joining server while using a controller.</li><li>Fixed crash when creating a very (very) long chain of rerouters or logic gates.</li><li>Fixed several crashes due to unused quickbar ranges legacy code.</li><li>Fixed crash when recreating output wire with a new type.</li><li>Fixed crash when taking a screenshot with HDR.</li><li>Fixed crash when grenades explode after a garbage collection.</li><li>Fixed clients crashing when homing missile hits a physics object.</li><li>Fixed crash when dedicated server is left alone for a while due to iris replication not ticking.</li><li>Fixed crash running out of replicated objects when playing alone in a listen server.</li><li>Fixed crash when loading specifically crafted world file.</li><li>Fixed crash when applicator dialog is viewing a brick component while replicating additional components.</li><li>Fixed crash when equipping a tool while loading into the server.</li><li>Fixed crash when undoing deletion of a brick tried to revive a brick grid that was deleted.</li><li>Fixed crash due to incorrect check for sync state in async serialize function.</li><li>Fixed crash setting minigame inventory size to 0.</li><li>Fixed crash when placing, resizing and deleting bricks too quickly.</li><li>Fixed crash when trying to load an old world file with components that no longer exist.</li><li>Fixed crash when destroying brick grid entity with a building zone attached to it.</li><li>Fixed crashes caused by being able to attach invalid components to bricks.</li><li>Fixed check against NaN object positions not actually working on world load.</li><li>Fixed rare crash due to use after free in legacy save file loader.</li><li>Fixed rare crash in wire type propagation logic related to placing prefabs.</li><li>Fixed brick replication deadlock in rare case where the first component in the update list generates a message of a specific size.</li><li>Fixed trace scene corruption when trying to set the velocity of a frozen entity.</li><li>Fixed broken overlap check allowing certain cases of intersecting micro wedges to be placed.</li><li>Fixed very rare bundle corruption due to background file write tasks executing in incorrect order.</li><li>Fixed being able to pick up multiple pistols.</li><li>Fixed clients not being able to switch to precision mode on paste when copying bricks from physics grids.</li><li>Fixed chance of mysterious 1 unit offset when using switch to precision mode on paste.</li><li>Fixed Painter getting stuck in &quot;Paint Only Material&quot; mode if put away while ctrl is held.</li><li>Fixed selection outlines not rendering in simple shading mode.</li><li>Fixed hologram and translucent plastic brick materials causing Lumen to render an extremely slow ray traced reflection which cannot be seen.</li><li>Fixed broken depth bounds for fog rendering causing it to cut off on surfaces close to the camera.</li><li>Fixed Z fighting of brick previews when overlapped with the original bricks in precision mode.</li><li>Fixed ugly one pixel visual seams along the edges of brick previews.</li><li>Fixed race condition causing the options button on the escape menu to not function sometimes.</li><li>Fixed non-deterministic vehicle behavior due to wheel engines not applying some settings on servers.</li><li>Fixed non-deterministic joint behavior due to not updating average mass on modifying attached objects.</li><li>Fixed contraptions exploding when deleting a set of jointed bodies and undoing the deletion.</li><li>Fixed re-attaching objects to joints not correctly restoring the relative transform if the joint was bent.</li><li>Fixed re-attaching objects to joints not correctly moving further attached child objects.</li><li>Fixed incorrect mass calculation for bricks grids since the ability to disable collision was added.</li><li>Fixed incorrect joint behavior after re-attaching a wheel to a wheel joint connected to an engine.</li><li>Fixed deleting an entity and undoing the deletion not restoring any changed properties.</li><li>Fixed deleting a frozen object and undoing the deletion failing to re-freeze it.</li><li>Fixed having wheel joints connected to an engine preventing idle physics contraptions from sleeping.</li><li>Fixed being unable to create multiple levels of folders for worlds.</li><li>Fixed client predicted hit markers showing for objects that cannot be damaged.</li><li>Fixed extra physics grids and entities attached to the vehicle you are in blocking the camera.</li><li>Fixed loading a world in single player not waiting for meshes to upload before hiding the loading screen.</li><li>Fixed wrong formatting for the message when using /clearbricks [name] as server.</li><li>Fixed distance to target output not working when a teleport target wire is connected.</li><li>Fixed server settings defaulting to the permissions tab.</li><li>Fixed broken &quot;at target&quot; output on servo bearings.</li><li>Fixed various correctness bugs in world serializer.</li><li>Fixed being able to redo undone actions if the permission to do them was since removed from the client.</li><li>Fixed being able to load nan values through presets in the applicator.</li><li>Fixed being able to place more bricks in a single chunk that the world serializer will allow to load.</li><li>Fixed brick grids teleporting into space when attaching a socket to a bearing.</li><li>Fixed firing weapons in first person while crouched not hitting the correct target on the server side.</li><li>Fixed being able to upload to the gallery from the downloads tab.</li><li>Fixed lives counter not updating for clients in minigames.</li><li>Fixed connection not being aborted if client fails to insert a replicated brick into the designated chunk.</li><li>Fixed gallery viewer scaling incorrectly when there are very long titles.</li><li>Fixed long gallery descriptions breaking the layout of the details page.</li><li>Fixed buttons remaining held when clicked too fast.</li><li>Fixed input splitter being shown in add component list.</li><li>Fixed &quot;Failed to insert brick in chunk&quot; log spam.</li><li>Fixed being able to get stuck in freeze camera mode when entering a minigame.</li><li>Fixed not leaving the current seat when trying to use the teleport command.</li><li>Fixed seats showing the sit prompt in third person when occupied.</li><li>Fixed brick delete sound playing in wrong location when removing bricks from physics grids.</li><li>Fixed &quot;Reselect Last Port&quot; on Connector not being rebindable.</li><li>Fixed &quot;Johnny Ledger&quot; music tracks missing in minigame music selector.</li><li>Fixed inaccurate tool traces against wheels attached to wheel joints.</li><li>Fixed aurora setting in environment not functioning.</li><li>Fixed a case of precision mode on paste selecting the wrong grid.</li><li>Fixed water effects and damage not working when standing in low water.</li><li>Fixed Missile Launcher still being able to fire when out of ammo.</li><li>Fixed flying against a wall accumulating velocity incorrectly.</li><li>Fixed gibs and detached hats affecting physics contraptions.</li><li>Fixed being unable to kick gibs around.</li><li>Fixed hitmarkers playing twice on clients.</li><li>Fixed Manipulator not aiming correctly in free mouse mode.</li><li>Fixed wires not respecting render distance limit.</li><li>Fixed additional bugs that were not correctly tracked.</li></ul>]]></content:encoded></item><item><title><![CDATA[Sale + Bots/Prefabs Preview!]]></title><description><![CDATA[Brickadia is taking part in the Steam Autumn Sale, and our first major update is now available in preview on the unstable branch.]]></description><link>https://brickadia.com/blog/sale-bots-prefabs-preview/</link><guid isPermaLink="false">68dab6f231880f0007fa04bf</guid><category><![CDATA[News]]></category><dc:creator><![CDATA[Zeblote]]></dc:creator><pubDate>Mon, 29 Sep 2025 17:12:05 GMT</pubDate><media:content url="https://brickadia.com/blog/content/images/2025/09/image.png" medium="image"/><content:encoded><![CDATA[<h3 id="steam-autumn-sale">Steam Autumn Sale</h3><img src="https://brickadia.com/blog/content/images/2025/09/image.png" alt="Sale + Bots/Prefabs Preview!"><p>Brickadia is taking part in the Steam Autumn Sale! If you haven&apos;t bought the game yet, now is a great time:</p>
<!--kg-card-begin: html-->
<iframe src="https://store.steampowered.com/widget/2199420/" frameborder="0" width="646" height="190"></iframe>
<!--kg-card-end: html-->
<h3 id="ea2-preview">EA2 Preview</h3><p>At the same time, we&apos;re releasing a preview version of our first major update on the unstable branch so you can try it a few days early. This has two long-awaited major features:</p><p>We&apos;ve fully reworked the prefab system. The new prefabs live in your catalog! Save entire cars, contraptions and other interconnected objects locally for easy reuse. Grab a vehicle from the gallery and place it, instantly, anywhere you have permission. Copy things from the world into your real clipboard, and paste them into Discord or another running instance of the game.</p><p>Customizable bots to give life to your maps! Give them any weapon and customize their settings like aggression or 360 degree vision. You can use them without weapons to create wandering NPCs, give them swords to make an army of warriors, or give them all guns to create a deathmatch server. They look the same as a player, and you can give them your avatar settings.</p><p>Watch the video below for a sneak peek:</p><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/87SfS79kj98?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="ea2release wide"></iframe></figure><p>You can read the full changelog <a href="https://store.steampowered.com/news/app/2199420/view/508466730850321053" rel="noreferrer">on Steam</a>.</p>]]></content:encoded></item><item><title><![CDATA[Tutorial - Car Tuning]]></title><description><![CDATA[Struggling to get a car driving well? Here's a guide on tuning your vehicles!]]></description><link>https://brickadia.com/blog/tutorial-car-tuning/</link><guid isPermaLink="false">68b87cfa786a61000738c839</guid><category><![CDATA[Tutorials]]></category><dc:creator><![CDATA[Kenko]]></dc:creator><pubDate>Fri, 05 Sep 2025 16:43:59 GMT</pubDate><media:content url="https://brickadia.com/blog/content/images/2025/09/tutorial-cartuning.png" medium="image"/><content:encoded><![CDATA[<img src="https://brickadia.com/blog/content/images/2025/09/tutorial-cartuning.png" alt="Tutorial - Car Tuning"><p>Hello again! After our previous car building tutorial we promised to release a second part dedicated to car tuning, and here it is!</p><p>Got a car built and driving, but you&apos;re struggling to get it controlling well? Wheels bouncing all over the place, or your car flips over all the time? This tutorial guides you through the most important settings to tune your car properly, providing far better control and stability.</p><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/KbsfOc-Ke78?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="Take your Brickadia cars to the next level! - Vehicle Tuning Tutorial"></iframe></figure><p>If you&apos;re not sure how to build a car in the first place, <a href="https://www.youtube.com/watch?v=N2TkDHsSmC8" rel="noreferrer">check out our beginner&apos;s car building tutorial.</a></p><p>You may note that we don&apos;t give concrete &quot;recommended&quot; numbers in this video to use - this is because everyone&apos;s car can be so wildly different! They can be small, massive, super long, super wide, carrying a whole lot of cargo, wielding a massive robotic arm, or even more. So, we encourage experimentation on your specific vehicles to find the right calibration for the kind of handling you&apos;d like.</p><p>Thank you all for your feedback on our previous tutorial video - let us know what you&apos;d like us to teach next!</p>]]></content:encoded></item><item><title><![CDATA[Tutorial - Car Building for Beginners]]></title><description><![CDATA[Here's how to build a simple drivable car in just one minute!]]></description><link>https://brickadia.com/blog/tutorial-car-building/</link><guid isPermaLink="false">689a1757786a61000738c519</guid><category><![CDATA[Tutorials]]></category><dc:creator><![CDATA[Kenko]]></dc:creator><pubDate>Mon, 11 Aug 2025 17:43:06 GMT</pubDate><media:content url="https://brickadia.com/blog/content/images/2025/08/tutorial-carbuilding.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://brickadia.com/blog/content/images/2025/08/tutorial-carbuilding.jpg" alt="Tutorial - Car Building for Beginners"><p>Hey all! We&apos;ve been loving your enjoyment and feedback of our in-game tutorial. We definitely want to build more in-game tutorials for more specific features, but we&apos;ve also decided to start a new series of video tutorials too!</p><p>Our first video tutorial is on how to build a simple car in just one minute:</p><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/N2TkDHsSmC8?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="Beginners Car Building Tutorial in Brickadia! &#x1F697;"></iframe></figure><p>The next Brickadia video tutorial will be about <strong>vehicle tuning</strong> - guidance on how to create cars that are more fun to drive. Our video tutorials are going to always be uploaded in full on our Youtube channel with shorter versions on all of our other social medias, so follow and subscribe to become the most skilled builder around!</p>]]></content:encoded></item><item><title><![CDATA[Feature Preview #2: What's next for Brickadia]]></title><description><![CDATA[Going over some short and long term plans after the release!]]></description><link>https://brickadia.com/blog/whats-next-for-brickadia/</link><guid isPermaLink="false">68720bf9786a61000738be02</guid><category><![CDATA[News]]></category><dc:creator><![CDATA[Zeblote]]></dc:creator><pubDate>Wed, 16 Jul 2025 17:36:44 GMT</pubDate><media:content url="https://brickadia.com/blog/content/images/2025/07/AVAILABLE_NOW.png" medium="image"/><content:encoded><![CDATA[<img src="https://brickadia.com/blog/content/images/2025/07/AVAILABLE_NOW.png" alt="Feature Preview #2: What&apos;s next for Brickadia"><p>So, it happened. After quite a bit of time, Brickadia Early Access is available for people to play! We still can&apos;t really believe it.</p><p>We&apos;ve been loving your creations on the Gallery. We saw a concurrent player peak just a little higher than what we had in the free demo, which is amazing for day 1 of the paid release! We also saw a really nice amount of engagement with lots of servers being put up and plenty of players running around doing things.</p><h1 id="short-term-roadmap">Short Term Roadmap</h1><h3 id="bugs">Bugs</h3><p>It turns out the best way to find out how many bugs your Early Access game really has is to launch it! While we&apos;ve tracked and fixed dozens of bugs during the closed beta, there are still a few more we didn&apos;t manage to get to in time.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2025/07/image-4.png" class="kg-image" alt="Feature Preview #2: What&apos;s next for Brickadia" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2025/07/image-4.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/07/image-4.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/07/image-4.png 1600w, https://brickadia.com/blog/content/images/2025/07/image-4.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">The tutorial doesn&apos;t work if people changed their server permissions in the demo (fixed today).</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2025/07/image-3.png" class="kg-image" alt="Feature Preview #2: What&apos;s next for Brickadia" loading="lazy" width="1903" height="1120" srcset="https://brickadia.com/blog/content/images/size/w600/2025/07/image-3.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/07/image-3.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/07/image-3.png 1600w, https://brickadia.com/blog/content/images/2025/07/image-3.png 1903w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Crash reports are coming in. Users with AMD GPUs seem to be hit more often than others.</span></figcaption></figure><p>Notably there are <em>lots</em> of crashes coming in from AMD. For now we&apos;ve made the game switch all AMD users to DX11 by default as that seems to not crash. We&apos;ve also bought one of the affected AMD GPUs and began debugging it, but it only arrived today, so it will take a while to fix the DX12 mode.</p><p>We&apos;re going to address the most critical issues as they pop up while we work on the new features. The <a href="https://store.steampowered.com/news/app/2199420/view/517467588398153800" rel="noreferrer">first hotfix</a> went out today, with more coming over the next weeks.</p><h2 id="gamemode-system">Gamemode System</h2><p>The Minigame system we currently have is causing a bunch of problems and badly needs an update. It was made for Alpha 4, where it wasn&apos;t really possible to make any kind of real gamemode, and was meant more to help players mess around together in an otherwise building-focused server.</p><p>Over the coming months, we&apos;ll be working on a Gamemode system that will replace it. There will only be one Gamemode supported in a server, but Gamemodes will be much easier to use than Minigames and much more powerful. Crucially, they will be much easier not to use incorrectly, resulting in people who downloaded your world spawning outside it and other issues.</p><p>It&apos;ll be designed for hosts, rather than random players who want to deathmatch in the middle of a server hosted by someone else. In addition, once your Gamemode is done, you&apos;ll be able to put it on the gallery alongside all its internal wires, due to a feature called Gamemode Microchips we&apos;ll talk about in the next section!</p><p>Don&apos;t worry for your existing worlds with a default minigame set up - everything should port over sensibly. In fact, due to the removal of the &quot;included bricks&quot; system, many worlds that are currently broken will immediately be fixed!</p><h2 id="wires-v2come-on-more-stuff">Wires V2 - Come on... More Stuff!</h2><p>Wires V2 is an upgrade we made to the wires system for EA. It turns your wire contraptions into a graph that is stored on the server, like this:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2025/07/image-9.png" class="kg-image" alt="Feature Preview #2: What&apos;s next for Brickadia" loading="lazy" width="1017" height="706" srcset="https://brickadia.com/blog/content/images/size/w600/2025/07/image-9.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/07/image-9.png 1000w, https://brickadia.com/blog/content/images/2025/07/image-9.png 1017w"><figcaption><span style="white-space: pre-wrap;">&quot;Demo&quot; circuit where 2 switches must be turned on to turn on a light.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2025/07/Untitled.png" class="kg-image" alt="Feature Preview #2: What&apos;s next for Brickadia" loading="lazy" width="2000" height="403" srcset="https://brickadia.com/blog/content/images/size/w600/2025/07/Untitled.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/07/Untitled.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/07/Untitled.png 1600w, https://brickadia.com/blog/content/images/size/w2400/2025/07/Untitled.png 2400w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Internal wire graph produced to execute that circuit.</span></figcaption></figure><p>Wires are now automatically organized into a dependency graph so we can update all gates in the correct order in a single step. This means you can build arbitrarily complex circuits without having to deal with any of the problems getting multiple signals to arrive at the same time like in the demo! The new system is also massively faster.</p><p>This does add a new restriction - the graph can&apos;t have cycles, so you need to break your circuit up with delays. But it also means things that were slow in the NextFest demo can suddenly run very very fast:</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_nextforbrickadia-fastwires" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/NextForBrickadia_VeryFastWires.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Very fast wire contraption by toval. No, we don&apos;t know how this thing works either.</figcaption>
    </a>
    <div id="inline_nextforbrickadia-fastwires" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/NextForBrickadia_VeryFastWires.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>It also means that there are no more &quot;false&quot; states. Unlike the demo, wire circuits fully update when an input changed, rather than signals taking 1 tick to propagate.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2025/07/image-10.png" class="kg-image" alt="Feature Preview #2: What&apos;s next for Brickadia" loading="lazy" width="1097" height="603" srcset="https://brickadia.com/blog/content/images/size/w600/2025/07/image-10.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/07/image-10.png 1000w, https://brickadia.com/blog/content/images/2025/07/image-10.png 1097w"><figcaption><span style="white-space: pre-wrap;">In the demo, this circuit would have beeped every time you flicked the switch on because for 1 tick, the AND gate would have turned on.With wires V2, you will never hear the audio component make a noise.</span></figcaption></figure><p>The new system has allowed us to add something called Exec wires. Exec wires make wires into a scripting system, by passing along a pure &quot;update&quot; signal rather than data. Any data passed into an exec port becomes an update signal if it <em>changed </em>to a nonzero value. Unlike the demo, this lets actions run in a chain:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2025/07/image-12.png" class="kg-image" alt="Feature Preview #2: What&apos;s next for Brickadia" loading="lazy" width="1414" height="550" srcset="https://brickadia.com/blog/content/images/size/w600/2025/07/image-12.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/07/image-12.png 1000w, https://brickadia.com/blog/content/images/2025/07/image-12.png 1414w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">When a player pushes this button, teleport them, </span><i><em class="italic" style="white-space: pre-wrap;">then</em></i><span style="white-space: pre-wrap;"> play a sound where they arrived.</span></figcaption></figure><p>Unfortunately, making the system itself took so long that we could barely include any gates aside from rewrites of the ones we already included in the NextFest demo! Which is a shame - because once those are in, Wires V2 will <em>really</em> start to shine.</p><p>Our plans for the following weeks are thus:</p><ul><li><strong>Microchips </strong>- compress your logic circuits into a single 1x1f brick. Create entirely custom gates by combining the gates that come with the game!</li><li><strong>Variables and Branching</strong> - Store, read and write values when your wire nodes run. No more manually building flip flops or using the blend gate to store data!</li><li><strong>Proper Gamemode Support</strong> - MANY more gates for responding to minigame events like new rounds, custom chat commands, entity manipulation and more!</li><li><strong>Gamemode &amp; Player Microchips</strong> - Store information on your gamemode/minigame and on players via microchip grids that save and load. Create callable circuits and build a fully reuseable gamemode - just with wires!</li><li><strong>Implicit Input Combining</strong> - Wire multiple things into one input. Booleans implicitly OR, numbers implicitly add, execs implicitly union. In some cases, save tens of gates!</li><li><strong>And Much More</strong> - Array variables and iteration, queues that can wait for many events with parameters, loops, data displays, strings, kinematic joints, entity homes, and more...</li></ul><h2 id="new-prefab-system">New Prefab System</h2><p>This sadly didn&apos;t make the cut for the initial Early Access release, but we&apos;re very close to having our new prefab system completed.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2025/07/image-6.png" class="kg-image" alt="Feature Preview #2: What&apos;s next for Brickadia" loading="lazy" width="2000" height="1048" srcset="https://brickadia.com/blog/content/images/size/w600/2025/07/image-6.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/07/image-6.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/07/image-6.png 1600w, https://brickadia.com/blog/content/images/2025/07/image-6.png 2000w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">The selector will be upgraded to be able to select bricks, entities, and entire contraptions.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2025/07/image-7.png" class="kg-image" alt="Feature Preview #2: What&apos;s next for Brickadia" loading="lazy" width="1574" height="1098" srcset="https://brickadia.com/blog/content/images/size/w600/2025/07/image-7.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/07/image-7.png 1000w, https://brickadia.com/blog/content/images/2025/07/image-7.png 1574w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">You can soon select individual objects and precisely control your selection.</span></figcaption></figure><p>The new prefab system finally replaces our legacy &quot;brs&quot; save files from the first alpha version, which can only store bricks from a single grid in a very inefficient manner, with a completely redesigned one based on the worlds format. We will include a brs -&gt; brz converter with the release so old builds can still be loaded in.</p><p>Prefabs will then be able to contain full physics contraptions, properly tuned cars (including their wheels!), logic computers, and whatever else you can think of.</p><p>They&apos;re going to be integrated with the main catalog UI, so you can put prefabs in your hotbar the same way you do with bricks and entities. And we&apos;re adding a gallery for them so you can share them with others.</p><h3 id="bots">Bots</h3><p>This was actually one of the most requested features to the game that we&apos;ve been able to see, with lots of players having a strong desire to use bots to make zombie servers, or simply adding ambient NPCs that roam about the map. We didn&apos;t have strong plans for this, but we think it&apos;ll be cool to throw in as soon as we can especially with our focus on adding more gameplay features.</p><p>The initial version of bots will be ready soon, letting them hold different weapons, move around randomly, and be controlled through wires. This is only the starting stage, but we&apos;d like to get this out the door quickly so that people can start experimenting with them. Here&apos;s a preview:</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_nextforbrickadia-botland" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/NextForBrickadia_Botland.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>The first ever bot DM! Ignore the physics glitches, it is an editor-only issue.</figcaption>
    </a>
    <div id="inline_nextforbrickadia-botland" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/NextForBrickadia_Botland.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>They will be improved over time, with features like smarter navigation, direct wire controlling, and a special bot type to replace players that disconnect from a minigame. These features might take a while to get to, depending on priorities once the first version is released.</p><h2 id="sounds">Sounds</h2><p>A much smaller but still prevalent complaint that was brought up, presumably from the excess of deathmatch servers, was the difficulty of hearing other players when they were walking around. If someone was sneaking up on you, you could barely hear them!</p><p>We&apos;ll be adding a bunch of smaller features to try to allow hosts to set up exactly how they want such things to work in their server. This requires certain systems to be rewritten first, but we&apos;d like for the game to support dynamically changing how loud and how far certain sounds are on a team basis for minigames. You should also be able to change how a team perceives sound, such as making teammates sound quieter than enemies.</p><p>This is one of the lower priority changes, so we have no ETA on when that will happen. In the meantime, more sounds are going to be added to the audio components, as well as the environment settings. If you&apos;ve got any desires, feel free to suggest them in the Discord!</p><h2 id="and-more">And More...</h2><ul><li><strong>Aircraft</strong> - We&apos;ve been experimenting in the last 2 days with tools for making aircraft. There is nothing that is showable yet but we expect this feature to develop quite quickly, so I&apos;ve included it here.</li><li><strong>Better Admin Tools</strong><ul><li>Finder tool server admins can use to see a tree view of all entities in the world and find hidden or far-away spam entities.</li><li>&quot;Home&quot; positions for entities that they return to when respawned, leave the world, or when the gamemode is reset (mentioned with wire changes above).</li><li>Better, more in depth permissions for players - we&apos;ve already started on this one!</li></ul></li><li><strong>Avatars on the Gallery</strong> - It&apos;s coming, folks! We&apos;re just working on what the UI looks like.</li></ul><h1 id="long-term-roadmap">Long Term Roadmap</h1><p>While it&apos;s too early to fully get into details, we have quite a lot of other features we&apos;re interested in adding to the game, over the next year.</p><ul><li><strong>Editable Voxel Terrain </strong>- Building terrain is super hard! It&apos;s so difficult and tedious for even experienced builders that it causes them to not try to build things. Unfortunately, if you don&apos;t build any terrain, Brickadia currently imposes upon you a very heavy visual punishment - the sight of bare plate as far as the eye can see. Terrain would fix this.</li><li><strong>Destruction </strong>- You&apos;ve probably tried blowing up a wall of bricks with a rocket and noticed that nothing happened whatsoever. So lame! Luckily we&apos;re going to do something about it.</li><li><strong>Scripting</strong> - We&apos;re moving into prototyping for this. Luau is currently on the table, but research is ongoing. Stay tuned.</li><li><strong>Custom Content (Modding)</strong> - We have existing plans for how common types of custom content can be added to the game and automatically replicate to players joining servers. It&apos;s very much on our minds still!<br><br>PS: We have removed all technical measures preventing modification of the game such as package signing and obfuscation. These were leftover from the Open Alpha and never intended to ship in the release. While we don&apos;t think this is the correct approach for a multiplayer game in the end, feel free to mess around locally in the interim. There will be no support.</li></ul><h1 id="anything-else">Anything Else?</h1><p>We&apos;ll be keeping our ear to the ground on what our players think is vital to add to the game. The things that we prioritize will change over time, so make sure to provide your feedback on what you think is most important, or if there&apos;s anything we haven&apos;t yet mentioned you want to see.</p><p>That&apos;s it for now! If your game doesn&apos;t work, let us know and hang tight, we&apos;ll fix it. Otherwise, we hope you are having fun! This is just the beginning of our journey.</p>]]></content:encoded></item><item><title><![CDATA[BRICKADIA EARLY ACCESS IS NOW AVAILABLE]]></title><description><![CDATA[It's really happening!]]></description><link>https://brickadia.com/blog/brickadia-early-access-is-now-available/</link><guid isPermaLink="false">68710c778564ad0006dc8f85</guid><category><![CDATA[News]]></category><dc:creator><![CDATA[Zeblote]]></dc:creator><pubDate>Fri, 11 Jul 2025 16:10:05 GMT</pubDate><media:content url="https://brickadia.com/blog/content/images/2025/07/AVAILABLE-NOW--1-.png" medium="image"/><content:encoded><![CDATA[<img src="https://brickadia.com/blog/content/images/2025/07/AVAILABLE-NOW--1-.png" alt="BRICKADIA EARLY ACCESS IS NOW AVAILABLE"><p>Hey, everyone!</p><p>After this long journey of development, we first want to thank you all for joining us on this incredible adventure that has been the creation of Brickadia. We&#x2019;re beyond excited to finally announce that <a href="https://store.steampowered.com/app/2199420/Brickadia/" rel="noreferrer">Brickadia Early Access is NOW LIVE on Steam</a>! To celebrate, we&#x2019;ve put together a launch trailer made entirely with in-game footage, check it out below! &#x1F447;</p><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/5XXUGW41jos?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="Brickadia | Early Access Launch Trailer"></iframe></figure><p><strong>This isn&#x2019;t the typical Early Access release, </strong><em>Brickadia</em> Early Access already feels like a full game, completely polished and content-rich. With constant updates planned based on your feedback, it&#x2019;s only going to get better from here. </p><p>What are you waiting for? The world of Brickadia is yours to shape, one brick at a time. Join Early Access now and unleash your imagination!</p><p><a href="https://store.steampowered.com/app/2199420/Brickadia/?l=spanish"><u>https://store.steampowered.com/app/2199420/Brickadia/</u></a></p><p>As always, thank you for being part of the journey as we build Brickadia together &#x2665;&#xFE0F;.&#xA0;</p><p>We can&#x2019;t wait to see the game in your libraries and your creations on social media with #Brickadia!</p><p>Look for Brickadia on <a href="https://bsky.app/profile/did:plc:hm2f45hhjcmnmc2seqqttguh"><u>Bluesky</u></a>, <a href="https://x.com/brickadiagame"><u>Twitter/X</u></a>, <a href="https://www.tiktok.com/@brickadia"><u>TikTok</u></a>, <a href="https://www.youtube.com/@brickadia"><u>YouTube</u></a>, <a href="https://www.instagram.com/brickadiagame/"><u>Instagram</u></a> and join the always growing community on <a href="https://discord.gg/brickadia"><u>Discord</u></a>.</p>]]></content:encoded></item><item><title><![CDATA[Feature Preview #1: HDR, Lumen & Ray Tracing]]></title><description><![CDATA[A little preview of some really fancy optional features going into Early Access.]]></description><link>https://brickadia.com/blog/feature-preview-1/</link><guid isPermaLink="false">6856d2a58564ad0006dc8acf</guid><category><![CDATA[Development]]></category><dc:creator><![CDATA[Zeblote]]></dc:creator><pubDate>Sat, 21 Jun 2025 18:38:45 GMT</pubDate><media:content url="https://brickadia.com/blog/content/images/2025/06/Brickadia-Win64-Shipping_i2rujLCJRp-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://brickadia.com/blog/content/images/2025/06/Brickadia-Win64-Shipping_i2rujLCJRp-1.png" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing"><p>Welcome to a new little blog series we&apos;re doing in the run up to Early Access. We currently don&apos;t have time to write huge technical dev logs like we did <a href="https://brickadia.com/blog/devlog-4/" rel="noreferrer">in</a> <a href="https://brickadia.com/blog/devlog-5/" rel="noreferrer">the</a> <a href="https://brickadia.com/blog/devlog-6/" rel="noreferrer">past</a>, but there are still a lot of new features to talk about! So, we decided to instead post a bunch of little blogs whenever something is ready without losing ourselves too much in the details.</p><p>Today we&apos;ll talk about a few optional graphics enhancements you can use if &quot;Ultra&quot; just isn&apos;t good enough for you and you would really like to use your GPU for heating your room in the winter.</p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">If you <i><em class="italic" style="white-space: pre-wrap;">don&apos;t</em></i> want to do that for some inexplicable reason, no need to worry, we&apos;ve taken great care to ensure these features existing causes no overhead if you&apos;ve disabled them!</div></div><h2 id="introduction">Introduction</h2><p>Before we start, you can watch this video demonstrating what it looks like with all the features enabled. We had to wait over a day for YouTube to process the video and actually make the 4k60 HDR option available. Isn&apos;t that crazy?&#x1F447;</p><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/WdKFOIVDVFQ?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="HDR HWRT Lumen Test"></iframe></figure><h2 id="hdr-output-episode-2">HDR Output, Episode 2</h2><p>If you remember our post from a year ago, we actually talked about this <a href="https://brickadia.com/blog/devlog-5/#high-dynamic-range-output" rel="noreferrer">before</a>.</p><p>The only problem was that since that previous post, we had upgraded to Unreal Engine 5.5 just before the demo, and naturally Epic had managed to somehow break the HDR in the new engine version. This is what were greeted with after the update when a user enabled HDR and opened any UI:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2025/06/image.png" class="kg-image" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing" loading="lazy" width="2000" height="1125" srcset="https://brickadia.com/blog/content/images/size/w600/2025/06/image.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/06/image.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/06/image.png 1600w, https://brickadia.com/blog/content/images/2025/06/image.png 2000w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Some serious skill issues here.</span></figcaption></figure><p>Luckily, this turned out to be easily fixed after some investigation in RenderDoc. They had merely forgotten to clear a render target before using it, causing all this garbage data to be displayed on screen. </p><p>There was also a second issue where having the avatar editor on screen turned the background black. That one was more involved, but is also fixed now - to render the avatar editor we now first blur the background in HDR, render most of the UI, render the avatar background on top of the blurred HDR render target and cut a hole into the UI where it should show, and finally composite everything back together into the final output.</p><p>These images were captured in 4k HDR using Xbox Game Bar on Windows 11, which writes a JPEG-XR file, and then converted to AVIF using this <a href="https://github.com/ledoge/jxr_to_avif">tool</a> I found, so they can display in the browser. On my computer, the version in the browser looks exactly the same as the game, but I have no idea if that works for you too.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_hdr-test-1" data-lity>
    	<img loading="lazy" src="https://static.brickadia.com/resources/feature-preview-1-output5.avif" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing">
    <figcaption>The avatar editor now has HDR. Whoa.</figcaption>
    </a>
    <div id="inline_hdr-test-1" class="lity-hide">
        <img loading="lazy" src="https://static.brickadia.com/resources/feature-preview-1-output5.avif" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing">
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_hdr-test-2" data-lity>
    	<img loading="lazy" src="https://static.brickadia.com/resources/feature-preview-1-output1.avif" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing">
    <figcaption>HDR test image 1.</figcaption>
    </a>
    <div id="inline_hdr-test-2" class="lity-hide">
        <img loading="lazy" src="https://static.brickadia.com/resources/feature-preview-1-output1.avif" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing">
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_hdr-test-3" data-lity>
    	<img loading="lazy" src="https://static.brickadia.com/resources/feature-preview-1-output2.avif" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing">
    <figcaption>HDR test image 2.</figcaption>
    </a>
    <div id="inline_hdr-test-3" class="lity-hide">
        <img loading="lazy" src="https://static.brickadia.com/resources/feature-preview-1-output2.avif" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing">
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_hdr-test-4" data-lity>
    	<img loading="lazy" src="https://static.brickadia.com/resources/feature-preview-1-output3.avif" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing">
    <figcaption>HDR test image 3.</figcaption>
    </a>
    <div id="inline_hdr-test-4" class="lity-hide">
        <img loading="lazy" src="https://static.brickadia.com/resources/feature-preview-1-output3.avif" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing">
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_hdr-test-5" data-lity>
    	<img loading="lazy" src="https://static.brickadia.com/resources/feature-preview-1-output4.avif" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing">
    <figcaption>HDR test image 4.</figcaption>
    </a>
    <div id="inline_hdr-test-5" class="lity-hide">
        <img loading="lazy" src="https://static.brickadia.com/resources/feature-preview-1-output4.avif" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing">
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_hdr-test-6" data-lity>
    	<img loading="lazy" src="https://static.brickadia.com/resources/feature-preview-1-output6.avif" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing">
    <figcaption>HDR test image 5.</figcaption>
    </a>
    <div id="inline_hdr-test-6" class="lity-hide">
        <img loading="lazy" src="https://static.brickadia.com/resources/feature-preview-1-output6.avif" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing">
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_hdr-test-7" data-lity>
    	<img loading="lazy" src="https://static.brickadia.com/resources/feature-preview-1-output7.avif" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing">
    <figcaption>HDR test image 6.</figcaption>
    </a>
    <div id="inline_hdr-test-7" class="lity-hide">
        <img loading="lazy" src="https://static.brickadia.com/resources/feature-preview-1-output7.avif" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing">
    </div>
</figure>
<!--kg-card-end: html-->
<p>Some troubleshooting if the images don&apos;t display correctly:</p><ul><li>If you don&apos;t have a HDR monitor, you can&apos;t view them.</li><li>If you have HDR disabled in Windows, enable it.</li><li>If you are using Edge or Firefox or something else, use Chrome.</li><li>If you are using Chrome but the images are too dark, change the HDR brightness balance setting in Windows, or change the dynamic tone mapping setting on your display&apos;s menu.</li><li>If you are not using Windows, I can&apos;t help you.</li></ul><h2 id="lumen-hardware-ray-tracing">Lumen &amp; Hardware Ray Tracing</h2><p>Remember how we implemented support for hardware ray tracing bricks <a href="https://brickadia.com/blog/brickadia-alpha-5-patch-5/#experimental-rtx-ray-tracing-support" rel="noreferrer">a long time ago</a>? That code had gotten a little scuffed up over the years and was no longer functioning in the demo, but I just fixed it up. Hardware ray tracing is now back for Early Access, it&apos;s also quite a bit faster since back then (but still slow...).</p><p>In the mean time, Epic had made lots of progress on Lumen. Since we are now on Unreal Engine 5.5, I thought I&apos;d give it another try. We still don&apos;t have distance fields to be able to use <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/lumen-technical-details-in-unreal-engine#software-ray-tracing" rel="noreferrer">software ray tracing</a>, but what if we could make the <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/lumen-technical-details-in-unreal-engine#hardware-ray-tracing" rel="noreferrer">hardware ray tracing</a> path work?</p><p>Naturally the first attempt did not work <em>at all</em>. We weren&apos;t getting any information from HWRT to Lumen whatsoever:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2025/06/image-1.png" class="kg-image" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing" loading="lazy" width="2000" height="1006" srcset="https://brickadia.com/blog/content/images/size/w600/2025/06/image-1.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/06/image-1.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/06/image-1.png 1600w, https://brickadia.com/blog/content/images/2025/06/image-1.png 2000w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Not even the wheels and character are working correctly, which only use basic engine meshes.</span></figcaption></figure><p>Since I had never really worked with Lumen before, I opened up an Unreal Engine example project to see how this view should look, and theirs is... quite different, wouldn&apos;t you say?</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2025/06/image-3.png" class="kg-image" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing" loading="lazy" width="2000" height="1098" srcset="https://brickadia.com/blog/content/images/size/w600/2025/06/image-3.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/06/image-3.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/06/image-3.png 1600w, https://brickadia.com/blog/content/images/2025/06/image-3.png 2000w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">It&apos;s not black.</span></figcaption></figure><p>Turns out most of that was just because I had purposefully broken the lumen scene  some time ago while making Proto Lumen. Let&apos;s revert that change so it only applies when we are actually running in Proto Lumen mode...</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2025/06/image-4.png" class="kg-image" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing" loading="lazy" width="2000" height="1079" srcset="https://brickadia.com/blog/content/images/size/w600/2025/06/image-4.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/06/image-4.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/06/image-4.png 1600w, https://brickadia.com/blog/content/images/2025/06/image-4.png 2000w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Our ground has started to show up. Wheels are still getting culled, but let&apos;s worry about that later.</span></figcaption></figure><p>The bigger problem is that our bricks are still broken.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2025/06/image-5.png" class="kg-image" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing" loading="lazy" width="2000" height="1078" srcset="https://brickadia.com/blog/content/images/size/w600/2025/06/image-5.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/06/image-5.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/06/image-5.png 1600w, https://brickadia.com/blog/content/images/2025/06/image-5.png 2000w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">All of the bricks are culled despite taking up all the screen. Why?</span></figcaption></figure><p>It turns out Lumen requires something called a <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/lumen-technical-details-in-unreal-engine#surface-cache" rel="noreferrer">Surface Cache</a> to work properly. Basically, we have to cover our meshes with planes onto which it will render indirect lighting. Of course the code Epic made to do this for normal meshes only works in the editor and is extremely slow as it is intended for offline processing.</p><p>How do we do this? We could just write a more optimized version of their code that works at runtime. They are doing ray tracing against the meshes on the CPU side and it can take like half a second to process a single mesh this way. When we build clusters for a large build, we have <em>thousands</em> of meshes.</p><p>To do it at runtime, we&apos;ll do all of the following:</p><ul><li>We will use the <a href="https://www.embree.org/" rel="noreferrer">embree4</a> library to trace the rays, making full use of its capability to trace 8 rays in parallel with AVX instructions.</li><li>We will use our <a href="https://brickadia.com/blog/optimizing-bricks-for-alpha-5-part-2/#level-of-detail-for-bricks" rel="noreferrer">low detail mesh</a> as input for each brick cluster.</li><li>We will use very few rays, accepting a mediocre real-time result.</li></ul><p>The full algorithm ends up as the following: it will take the low detail mesh we build for the brick cluster, convert this to an embree4 scene to be able to ray trace it on CPU, overlay a 32x32x32 voxel grid, then for each face of the grid (6) it will trace rays through the grid to hit the mesh, generating layers of surfels at the hit surfaces, trace additional rays to determine if some hits might be &quot;inside&quot; the mesh only and useless, then cluster those surfels to finally end up with the set of most significant surfaces to output as cards.</p><p>Our implementation of this is now so fast that it barely increases the time it takes to generate brick clusters.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2025/06/image-6.png" class="kg-image" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2025/06/image-6.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/06/image-6.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/06/image-6.png 1600w, https://brickadia.com/blog/content/images/2025/06/image-6.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Generated cards for a hollow brick structure.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2025/06/image-8.png" class="kg-image" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2025/06/image-8.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/06/image-8.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/06/image-8.png 1600w, https://brickadia.com/blog/content/images/2025/06/image-8.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">We have full surface caching for all the bricks!</span></figcaption></figure><p>In real builds, it looks significantly more cluttered, but it works surprisingly well. We don&apos;t always cover <em>every</em> surface since the brick clusters may randomly include multiple hollow structures, but we get most of them which is enough for the whole system to work.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2025/06/image-9.png" class="kg-image" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2025/06/image-9.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/06/image-9.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/06/image-9.png 1600w, https://brickadia.com/blog/content/images/2025/06/image-9.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">That&apos;s a lot of cards.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2025/06/Brickadia_x7JN1bPtdx.png" class="kg-image" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2025/06/Brickadia_x7JN1bPtdx.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/06/Brickadia_x7JN1bPtdx.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/06/Brickadia_x7JN1bPtdx.png 1600w, https://brickadia.com/blog/content/images/2025/06/Brickadia_x7JN1bPtdx.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">We&apos;ve covered like 90% of the scene with at least one card, so I&apos;m happy with the result.</span></figcaption></figure><p>Almost every build I&apos;ve tried had ended up with a usable surface cache.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2025/06/image-11.png" class="kg-image" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2025/06/image-11.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/06/image-11.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/06/image-11.png 1600w, https://brickadia.com/blog/content/images/2025/06/image-11.png 1920w" sizes="(min-width: 1200px) 1200px"></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2025/06/image-10.png" class="kg-image" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2025/06/image-10.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/06/image-10.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/06/image-10.png 1600w, https://brickadia.com/blog/content/images/2025/06/image-10.png 1920w" sizes="(min-width: 1200px) 1200px"></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2025/06/image-12.png" class="kg-image" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2025/06/image-12.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/06/image-12.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/06/image-12.png 1600w, https://brickadia.com/blog/content/images/2025/06/image-12.png 1920w" sizes="(min-width: 1200px) 1200px"></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2025/06/image-13.png" class="kg-image" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2025/06/image-13.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/06/image-13.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/06/image-13.png 1600w, https://brickadia.com/blog/content/images/2025/06/image-13.png 1920w" sizes="(min-width: 1200px) 1200px"></figure><p>Let&apos;s get rid of those annoying debug views so we can appreciate the glory.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2025/06/image-14.png" class="kg-image" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2025/06/image-14.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/06/image-14.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/06/image-14.png 1600w, https://brickadia.com/blog/content/images/2025/06/image-14.png 1920w" sizes="(min-width: 1200px) 1200px"></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2025/06/image-15.png" class="kg-image" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2025/06/image-15.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/06/image-15.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/06/image-15.png 1600w, https://brickadia.com/blog/content/images/2025/06/image-15.png 1920w" sizes="(min-width: 1200px) 1200px"></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2025/06/image-16.png" class="kg-image" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2025/06/image-16.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/06/image-16.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/06/image-16.png 1600w, https://brickadia.com/blog/content/images/2025/06/image-16.png 1920w" sizes="(min-width: 1200px) 1200px"></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2025/06/image-17.png" class="kg-image" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2025/06/image-17.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/06/image-17.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/06/image-17.png 1600w, https://brickadia.com/blog/content/images/2025/06/image-17.png 1920w" sizes="(min-width: 1200px) 1200px"></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2025/06/image-18.png" class="kg-image" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2025/06/image-18.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/06/image-18.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/06/image-18.png 1600w, https://brickadia.com/blog/content/images/2025/06/image-18.png 1920w" sizes="(min-width: 1200px) 1200px"></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2025/06/image-19.png" class="kg-image" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2025/06/image-19.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/06/image-19.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/06/image-19.png 1600w, https://brickadia.com/blog/content/images/2025/06/image-19.png 1920w" sizes="(min-width: 1200px) 1200px"></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2025/06/image-20.png" class="kg-image" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2025/06/image-20.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/06/image-20.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/06/image-20.png 1600w, https://brickadia.com/blog/content/images/2025/06/image-20.png 1920w" sizes="(min-width: 1200px) 1200px"></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2025/06/image-21.png" class="kg-image" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2025/06/image-21.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/06/image-21.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/06/image-21.png 1600w, https://brickadia.com/blog/content/images/2025/06/image-21.png 1920w" sizes="(min-width: 1200px) 1200px"></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2025/06/image-22.png" class="kg-image" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing" loading="lazy" width="2000" height="1125" srcset="https://brickadia.com/blog/content/images/size/w600/2025/06/image-22.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/06/image-22.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/06/image-22.png 1600w, https://brickadia.com/blog/content/images/size/w2400/2025/06/image-22.png 2400w" sizes="(min-width: 1200px) 1200px"></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2025/06/image2.png" class="kg-image" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing" loading="lazy" width="2000" height="1125" srcset="https://brickadia.com/blog/content/images/size/w600/2025/06/image2.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/06/image2.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/06/image2.png 1600w, https://brickadia.com/blog/content/images/size/w2400/2025/06/image2.png 2400w" sizes="(min-width: 1200px) 1200px"></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2025/06/image3.png" class="kg-image" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing" loading="lazy" width="2000" height="1125" srcset="https://brickadia.com/blog/content/images/size/w600/2025/06/image3.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/06/image3.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/06/image3.png 1600w, https://brickadia.com/blog/content/images/size/w2400/2025/06/image3.png 2400w" sizes="(min-width: 1200px) 1200px"></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2025/06/image5.png" class="kg-image" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing" loading="lazy" width="2000" height="1125" srcset="https://brickadia.com/blog/content/images/size/w600/2025/06/image5.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/06/image5.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/06/image5.png 1600w, https://brickadia.com/blog/content/images/size/w2400/2025/06/image5.png 2400w" sizes="(min-width: 1200px) 1200px"></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2025/06/image6.png" class="kg-image" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing" loading="lazy" width="2000" height="1125" srcset="https://brickadia.com/blog/content/images/size/w600/2025/06/image6.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/06/image6.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/06/image6.png 1600w, https://brickadia.com/blog/content/images/size/w2400/2025/06/image6.png 2400w" sizes="(min-width: 1200px) 1200px"></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2025/06/image7.png" class="kg-image" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing" loading="lazy" width="2000" height="1125" srcset="https://brickadia.com/blog/content/images/size/w600/2025/06/image7.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/06/image7.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/06/image7.png 1600w, https://brickadia.com/blog/content/images/size/w2400/2025/06/image7.png 2400w" sizes="(min-width: 1200px) 1200px"></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2025/06/image8.png" class="kg-image" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing" loading="lazy" width="2000" height="1125" srcset="https://brickadia.com/blog/content/images/size/w600/2025/06/image8.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/06/image8.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/06/image8.png 1600w, https://brickadia.com/blog/content/images/size/w2400/2025/06/image8.png 2400w" sizes="(min-width: 1200px) 1200px"></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2025/06/ScreenShot00050-1.png" class="kg-image" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing" loading="lazy" width="2000" height="1125" srcset="https://brickadia.com/blog/content/images/size/w600/2025/06/ScreenShot00050-1.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/06/ScreenShot00050-1.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/06/ScreenShot00050-1.png 1600w, https://brickadia.com/blog/content/images/size/w2400/2025/06/ScreenShot00050-1.png 2400w" sizes="(min-width: 1200px) 1200px"></figure><p>Yes, it does ray traced reflections too.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2025/06/image-23.png" class="kg-image" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2025/06/image-23.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/06/image-23.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/06/image-23.png 1600w, https://brickadia.com/blog/content/images/2025/06/image-23.png 1920w" sizes="(min-width: 1200px) 1200px"></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2025/06/Brickadia_1W9KYnxKjd.png" class="kg-image" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2025/06/Brickadia_1W9KYnxKjd.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/06/Brickadia_1W9KYnxKjd.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/06/Brickadia_1W9KYnxKjd.png 1600w, https://brickadia.com/blog/content/images/2025/06/Brickadia_1W9KYnxKjd.png 1920w" sizes="(min-width: 1200px) 1200px"></figure><p>Almost feels like a real-time photo mode, rivaling the old <a href="https://brickadia.com/blog/brickadia-alpha-5-patch-5/#experimental-rtx-path-tracing-renderer" rel="noreferrer">path tracer</a> we used to have. I&apos;ve never seen a building game capable of looking this good before...</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2025/06/image-24.png" class="kg-image" alt="Feature Preview #1: HDR, Lumen &amp; Ray Tracing" loading="lazy" width="620" height="472" srcset="https://brickadia.com/blog/content/images/size/w600/2025/06/image-24.png 600w, https://brickadia.com/blog/content/images/2025/06/image-24.png 620w"><figcaption><span style="white-space: pre-wrap;">All the new options at a glance.</span></figcaption></figure><p>The memory usage and performance of this mode can be quite heavy. Epic has several performance optimizations in Unreal Engine 5.6, but we won&apos;t be able to get that in before release. If it doesn&apos;t currently run well on your computer yet, maybe it will once we upgrade to that.</p><p>Well, that&apos;s all for this preview. There are going to be many more before we reach Early Access. Stay tuned!</p>]]></content:encoded></item><item><title><![CDATA[Brickadia Early Access coming this July 11!]]></title><description><![CDATA[Everything you need to know about the upcoming Early Access launch, plus a new montage trailer made entirely from in-game footage!]]></description><link>https://brickadia.com/blog/early-access-coming-this-july-11/</link><guid isPermaLink="false">682f6dd28564ad0006dc8200</guid><category><![CDATA[News]]></category><dc:creator><![CDATA[Zeblote]]></dc:creator><pubDate>Fri, 23 May 2025 12:35:00 GMT</pubDate><media:content url="https://brickadia.com/blog/content/images/2025/05/brickadia.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://brickadia.com/blog/content/images/2025/05/brickadia.jpg" alt="Brickadia Early Access coming this July 11!"><p>Hey everyone!</p><p>You&#x2019;ve been asking us everywhere, and we can finally say it: Brickadia is launching in <strong>Early Access on July 11, 2025</strong>, on <strong>Steam</strong> - We can&#x2019;t tell you how excited we are to finally write those words!. And we&#x2019;re making this announcement in style, with a <strong>new montage trailer</strong> made entirely from in-game footage. Check it out below &#x1F447;</p><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/RPAnrTAAjMM?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="BRICKADIA &#x1F9F1; &#x2728;|  Early Access release date - July 11!"></iframe></figure><p>Here&#x2019;s what we can share right now: the Early Access version will feel like the <strong>full game experience from day one</strong>, with the extra-benefit that <strong>it&#x2019;ll come at a lower price </strong>than the final release. It&#x2019;ll be your chance to jump into Brickadia early and be part of something big as it evolves. So for now, don&#x2019;t forget to <strong>wishlist the game on our </strong><a href="https://store.steampowered.com/app/2199420/Brickadia/"><strong><u>Steam page.</u></strong></a></p><p>As always, thank you for being part of the journey as we build Brickadia together.&#xA0;We can&#x2019;t wait to see the game in your libraries, we&apos;re almost there!</p><p><a href="https://discord.gg/brickadia" rel="noreferrer">For more regular updates, join our Discord!</a></p><p>And to make sure you don&#x2019;t miss anything, let us remind you about our official <strong>Brickadia newsletter -</strong> in it, you&#x2019;ll get everything from the<strong> latest game updates to behind-the-scenes news</strong>, and even<strong> a chance to be selected for an exclusive closed beta ahead of Early Access</strong>!</p><p>Sounds interesting? &#x1F447;&#xA0;</p>]]></content:encoded></item><item><title><![CDATA[Next Fest Wrap-Up: Survey Results, Plans for EA]]></title><description><![CDATA[A quick summary of the survey, addressing feedback, and our plan for early access.]]></description><link>https://brickadia.com/blog/next-fest-follow-up/</link><guid isPermaLink="false">67d455f2d1b9ca0007fee672</guid><category><![CDATA[News]]></category><dc:creator><![CDATA[wrap]]></dc:creator><pubDate>Mon, 24 Mar 2025 20:47:01 GMT</pubDate><media:content url="https://brickadia.com/blog/content/images/2025/03/nextfest.png" medium="image"/><content:encoded><![CDATA[<img src="https://brickadia.com/blog/content/images/2025/03/nextfest.png" alt="Next Fest Wrap-Up: Survey Results, Plans for EA"><p>Hey everyone! With Steam Next Fest wrapped up, we&apos;re now full steam ahead, working toward our Early Access release. From the bottom of our hearts, we want to thank everyone, especially our amazing community, for participating in the Demo!</p><p>We loved playing with your different worlds and meeting new players and veterans alike. The creativity on display is genuinely beyond our imaginations! Seriously, thank you. We love this community&#x2764;&#xFE0F;!</p><p><a href="#survey-results">Survey Results</a><br>
<a href="#feedback">Feedback</a><br>
&#x2003;<a href="#horrible-hit-detection">Horrible hit detection</a><br>
&#x2003;<a href="#vehicles-are-hard-to-control-slip-and-clip-often">Vehicles are hard to control, slip, and clip often</a><br>
&#x2003;<a href="#no-prefab-support-for-physics-grids">No prefab support for physics grids</a><br>
&#x2003;<a href="#griefing-physics-contraptions-is-too-easy">Griefing physics contraptions is too easy</a><br>
&#x2003;<a href="#the-tutorial-is-clunky-unclear-and-confusing">The Tutorial is clunky, unclear and confusing</a><br>
&#x2003;<a href="#limited-gameplay-gate-options">Limited gameplay gate options</a><br>
<a href="#plans-for-ea">Plans for EA</a><br>
&#x2003;<a href="#improved-tools-and-prefab-support">Improved tools and prefabs support</a><br>
&#x2003;<a href="#improved-combat-and-hit-detection">Improved combat and hit detection</a><br>
&#x2003;<a href="#the-gallery">The Gallery</a><br>
&#x2003;<a href="#improved-physics-and-vehicle-handling">Improved physics and vehicle handling</a><br>
&#x2003;<a href="#wires-v2">Wires V2</a><br>
&#x2003;<a href="#new-game-mode-system">New Game Mode system</a><br>
&#x2003;<a href="#tutorial-world">Tutorial World</a><br>
<a href="#key-giveaway">Key Giveaway</a><br>
<a href="#thank-you">Community Showcase</a></p>
<h1 id="survey-results">Survey Results</h1><p>Near the start of the demo, we put out a survey to help us gauge where we are doing things right, where we fell short, and where we should aim our development goals toward. Nearly 2,000 people submitted their surveys, and there are some interesting findings! That is roughly 5.5% of demo players submitting the survey. Thank you to everyone who submitted one.</p><p>First, some fun statistics (unfortunately, non-interactive on here).</p><p>Roughly half of players who filled the survey indicate they played the Open Alpha. This is interesting, as only about 10% of total players linked an Open Alpha account:</p><figure class="kg-card kg-image-card"><img src="https://brickadia.com/blog/content/images/2025/03/data-src-image-5cc311f3-f3af-407e-ad78-21b393605b25.png" class="kg-image" alt="Next Fest Wrap-Up: Survey Results, Plans for EA" loading="lazy" width="2000" height="840" srcset="https://brickadia.com/blog/content/images/size/w600/2025/03/data-src-image-5cc311f3-f3af-407e-ad78-21b393605b25.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/03/data-src-image-5cc311f3-f3af-407e-ad78-21b393605b25.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/03/data-src-image-5cc311f3-f3af-407e-ad78-21b393605b25.png 1600w, https://brickadia.com/blog/content/images/2025/03/data-src-image-5cc311f3-f3af-407e-ad78-21b393605b25.png 2199w" sizes="(min-width: 720px) 720px"></figure><p>We have an overwhelming majority of male users:</p><figure class="kg-card kg-image-card"><img src="https://brickadia.com/blog/content/images/2025/03/data-src-image-4d776e6e-f9a2-4b6c-ba8e-7bc5ac1a8003.png" class="kg-image" alt="Next Fest Wrap-Up: Survey Results, Plans for EA" loading="lazy" width="2000" height="840" srcset="https://brickadia.com/blog/content/images/size/w600/2025/03/data-src-image-4d776e6e-f9a2-4b6c-ba8e-7bc5ac1a8003.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/03/data-src-image-4d776e6e-f9a2-4b6c-ba8e-7bc5ac1a8003.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/03/data-src-image-4d776e6e-f9a2-4b6c-ba8e-7bc5ac1a8003.png 1600w, https://brickadia.com/blog/content/images/2025/03/data-src-image-4d776e6e-f9a2-4b6c-ba8e-7bc5ac1a8003.png 2199w" sizes="(min-width: 720px) 720px"></figure><p>Our main audience appears to be young adults currently:</p><figure class="kg-card kg-image-card"><img src="https://brickadia.com/blog/content/images/2025/03/data-src-image-d275152c-3408-4eae-bc99-bf97a84d9995.png" class="kg-image" alt="Next Fest Wrap-Up: Survey Results, Plans for EA" loading="lazy" width="2000" height="840" srcset="https://brickadia.com/blog/content/images/size/w600/2025/03/data-src-image-d275152c-3408-4eae-bc99-bf97a84d9995.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/03/data-src-image-d275152c-3408-4eae-bc99-bf97a84d9995.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/03/data-src-image-d275152c-3408-4eae-bc99-bf97a84d9995.png 1600w, https://brickadia.com/blog/content/images/2025/03/data-src-image-d275152c-3408-4eae-bc99-bf97a84d9995.png 2199w" sizes="(min-width: 720px) 720px"></figure><p>The majority of players prefer playing in small friend groups:</p><figure class="kg-card kg-image-card"><img src="https://brickadia.com/blog/content/images/2025/03/data-src-image-a738f594-ec27-4214-98a0-aab2fabfae16.png" class="kg-image" alt="Next Fest Wrap-Up: Survey Results, Plans for EA" loading="lazy" width="2000" height="840" srcset="https://brickadia.com/blog/content/images/size/w600/2025/03/data-src-image-a738f594-ec27-4214-98a0-aab2fabfae16.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/03/data-src-image-a738f594-ec27-4214-98a0-aab2fabfae16.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/03/data-src-image-a738f594-ec27-4214-98a0-aab2fabfae16.png 1600w, https://brickadia.com/blog/content/images/2025/03/data-src-image-a738f594-ec27-4214-98a0-aab2fabfae16.png 2199w" sizes="(min-width: 720px) 720px"></figure><p>During the demo, most people focused on dressing up their avatars and exploring existing worlds, which is about what we expected:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2025/03/data-src-image-27b7e069-8826-42af-b3f3-149448b4f315.png" class="kg-image" alt="Next Fest Wrap-Up: Survey Results, Plans for EA" loading="lazy" width="2000" height="568" srcset="https://brickadia.com/blog/content/images/size/w600/2025/03/data-src-image-27b7e069-8826-42af-b3f3-149448b4f315.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/03/data-src-image-27b7e069-8826-42af-b3f3-149448b4f315.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/03/data-src-image-27b7e069-8826-42af-b3f3-149448b4f315.png 1600w, https://brickadia.com/blog/content/images/2025/03/data-src-image-27b7e069-8826-42af-b3f3-149448b4f315.png 2000w" sizes="(min-width: 1200px) 1200px"></figure><p>Surprisingly, the most liked built-in world was Officecorp Inc! We didn&apos;t know we had so many single player puzzle enjoyers among us:</p><figure class="kg-card kg-image-card"><img src="https://brickadia.com/blog/content/images/2025/03/data-src-image-53708a48-f743-4491-a2b5-94b855bb46bf.png" class="kg-image" alt="Next Fest Wrap-Up: Survey Results, Plans for EA" loading="lazy" width="2000" height="1222" srcset="https://brickadia.com/blog/content/images/size/w600/2025/03/data-src-image-53708a48-f743-4491-a2b5-94b855bb46bf.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/03/data-src-image-53708a48-f743-4491-a2b5-94b855bb46bf.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/03/data-src-image-53708a48-f743-4491-a2b5-94b855bb46bf.png 1600w, https://brickadia.com/blog/content/images/2025/03/data-src-image-53708a48-f743-4491-a2b5-94b855bb46bf.png 2199w" sizes="(min-width: 720px) 720px"></figure><p>Most of you were happy with the visuals and performance of the game, but we can still improve on making the interface easier to use:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2025/03/data-src-image-72fbc7e1-ac4d-4ceb-a5a2-e3f3daad8d9e.png" class="kg-image" alt="Next Fest Wrap-Up: Survey Results, Plans for EA" loading="lazy" width="2000" height="723" srcset="https://brickadia.com/blog/content/images/size/w600/2025/03/data-src-image-72fbc7e1-ac4d-4ceb-a5a2-e3f3daad8d9e.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/03/data-src-image-72fbc7e1-ac4d-4ceb-a5a2-e3f3daad8d9e.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/03/data-src-image-72fbc7e1-ac4d-4ceb-a5a2-e3f3daad8d9e.png 1600w, https://brickadia.com/blog/content/images/2025/03/data-src-image-72fbc7e1-ac4d-4ceb-a5a2-e3f3daad8d9e.png 2000w" sizes="(min-width: 1200px) 1200px"></figure><p>The avatar editor was well liked in general, though some people are still wishing for even more options, despite us already having hundreds of parts!</p><figure class="kg-card kg-image-card"><img src="https://brickadia.com/blog/content/images/2025/03/data-src-image-086e2375-526e-4235-918c-4e1a45bb0634.png" class="kg-image" alt="Next Fest Wrap-Up: Survey Results, Plans for EA" loading="lazy" width="2000" height="868" srcset="https://brickadia.com/blog/content/images/size/w600/2025/03/data-src-image-086e2375-526e-4235-918c-4e1a45bb0634.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/03/data-src-image-086e2375-526e-4235-918c-4e1a45bb0634.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/03/data-src-image-086e2375-526e-4235-918c-4e1a45bb0634.png 1600w, https://brickadia.com/blog/content/images/2025/03/data-src-image-086e2375-526e-4235-918c-4e1a45bb0634.png 2000w" sizes="(min-width: 720px) 720px"></figure><p>It&apos;s very interesting how the mouse controls and keyboard controls were rated nearly the same. I think there is still room for improvement here:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2025/03/data-src-image-a609154d-4c01-451d-921d-6bbe0db9dc0c.png" class="kg-image" alt="Next Fest Wrap-Up: Survey Results, Plans for EA" loading="lazy" width="2000" height="434" srcset="https://brickadia.com/blog/content/images/size/w600/2025/03/data-src-image-a609154d-4c01-451d-921d-6bbe0db9dc0c.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/03/data-src-image-a609154d-4c01-451d-921d-6bbe0db9dc0c.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/03/data-src-image-a609154d-4c01-451d-921d-6bbe0db9dc0c.png 1600w, https://brickadia.com/blog/content/images/2025/03/data-src-image-a609154d-4c01-451d-921d-6bbe0db9dc0c.png 2000w" sizes="(min-width: 1200px) 1200px"></figure><p>Using the hammer to delete bricks is the easiest tool to use. Who could have thought?</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2025/03/data-src-image-22136db1-870a-4597-981d-fda1d5578b71.png" class="kg-image" alt="Next Fest Wrap-Up: Survey Results, Plans for EA" loading="lazy" width="2000" height="542" srcset="https://brickadia.com/blog/content/images/size/w600/2025/03/data-src-image-22136db1-870a-4597-981d-fda1d5578b71.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/03/data-src-image-22136db1-870a-4597-981d-fda1d5578b71.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/03/data-src-image-22136db1-870a-4597-981d-fda1d5578b71.png 1600w, https://brickadia.com/blog/content/images/2025/03/data-src-image-22136db1-870a-4597-981d-fda1d5578b71.png 2000w" sizes="(min-width: 1200px) 1200px"></figure><p>Most of you prefer the streamlined mouse building control scheme:</p><figure class="kg-card kg-image-card"><img src="https://brickadia.com/blog/content/images/2025/03/data-src-image-4d1e1058-1f01-4277-914a-30db33a0bb08.png" class="kg-image" alt="Next Fest Wrap-Up: Survey Results, Plans for EA" loading="lazy" width="2000" height="840" srcset="https://brickadia.com/blog/content/images/size/w600/2025/03/data-src-image-4d1e1058-1f01-4277-914a-30db33a0bb08.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/03/data-src-image-4d1e1058-1f01-4277-914a-30db33a0bb08.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/03/data-src-image-4d1e1058-1f01-4277-914a-30db33a0bb08.png 1600w, https://brickadia.com/blog/content/images/2025/03/data-src-image-4d1e1058-1f01-4277-914a-30db33a0bb08.png 2199w" sizes="(min-width: 720px) 720px"></figure><p>We experimented with a lot of ways to integrate removing bricks into the builder, but it seems the hammer is still the most popular:</p><figure class="kg-card kg-image-card"><img src="https://brickadia.com/blog/content/images/2025/03/data-src-image-53e8d2db-178d-4a2d-b5d1-67d94a3e702d.png" class="kg-image" alt="Next Fest Wrap-Up: Survey Results, Plans for EA" loading="lazy" width="2000" height="840" srcset="https://brickadia.com/blog/content/images/size/w600/2025/03/data-src-image-53e8d2db-178d-4a2d-b5d1-67d94a3e702d.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/03/data-src-image-53e8d2db-178d-4a2d-b5d1-67d94a3e702d.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/03/data-src-image-53e8d2db-178d-4a2d-b5d1-67d94a3e702d.png 1600w, https://brickadia.com/blog/content/images/2025/03/data-src-image-53e8d2db-178d-4a2d-b5d1-67d94a3e702d.png 2199w" sizes="(min-width: 720px) 720px"></figure><p>We are frankly surprised by how high you have rated the stability of the physics in the demo. Are our standards too high?</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2025/03/data-src-image-c4496371-7c80-4e0d-9174-1570112a0bc4.png" class="kg-image" alt="Next Fest Wrap-Up: Survey Results, Plans for EA" loading="lazy" width="2000" height="434" srcset="https://brickadia.com/blog/content/images/size/w600/2025/03/data-src-image-c4496371-7c80-4e0d-9174-1570112a0bc4.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/03/data-src-image-c4496371-7c80-4e0d-9174-1570112a0bc4.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/03/data-src-image-c4496371-7c80-4e0d-9174-1570112a0bc4.png 1600w, https://brickadia.com/blog/content/images/2025/03/data-src-image-c4496371-7c80-4e0d-9174-1570112a0bc4.png 2000w" sizes="(min-width: 1200px) 1200px"></figure><p>Most of you said you were able to figure out some basic contraptions:</p><figure class="kg-card kg-image-card"><img src="https://brickadia.com/blog/content/images/2025/03/data-src-image-0576e868-2aaf-408d-a53c-e85487442c1b.png" class="kg-image" alt="Next Fest Wrap-Up: Survey Results, Plans for EA" loading="lazy" width="2000" height="977" srcset="https://brickadia.com/blog/content/images/size/w600/2025/03/data-src-image-0576e868-2aaf-408d-a53c-e85487442c1b.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/03/data-src-image-0576e868-2aaf-408d-a53c-e85487442c1b.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/03/data-src-image-0576e868-2aaf-408d-a53c-e85487442c1b.png 1600w, https://brickadia.com/blog/content/images/2025/03/data-src-image-0576e868-2aaf-408d-a53c-e85487442c1b.png 2000w" sizes="(min-width: 720px) 720px"></figure><p>Everyone figured out how to drive a vehicle but it was much harder to make a new one that drives well:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2025/03/data-src-image-bfa59caa-6de2-4945-b039-7deb61ed133f.png" class="kg-image" alt="Next Fest Wrap-Up: Survey Results, Plans for EA" loading="lazy" width="2000" height="639" srcset="https://brickadia.com/blog/content/images/size/w600/2025/03/data-src-image-bfa59caa-6de2-4945-b039-7deb61ed133f.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/03/data-src-image-bfa59caa-6de2-4945-b039-7deb61ed133f.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/03/data-src-image-bfa59caa-6de2-4945-b039-7deb61ed133f.png 1600w, https://brickadia.com/blog/content/images/2025/03/data-src-image-bfa59caa-6de2-4945-b039-7deb61ed133f.png 2000w" sizes="(min-width: 1200px) 1200px"></figure><p>Your most desired future features seem to already align with our goals for Early Access and beyond:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2025/03/data-src-image-29667248-f138-4d4c-bdc0-dc49326b3279.png" class="kg-image" alt="Next Fest Wrap-Up: Survey Results, Plans for EA" loading="lazy" width="2000" height="394" srcset="https://brickadia.com/blog/content/images/size/w600/2025/03/data-src-image-29667248-f138-4d4c-bdc0-dc49326b3279.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/03/data-src-image-29667248-f138-4d4c-bdc0-dc49326b3279.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/03/data-src-image-29667248-f138-4d4c-bdc0-dc49326b3279.png 1600w, https://brickadia.com/blog/content/images/2025/03/data-src-image-29667248-f138-4d4c-bdc0-dc49326b3279.png 2000w" sizes="(min-width: 1200px) 1200px"></figure><p>It&apos;s clear that those of you who filled the survey were already very invested in the game:</p><figure class="kg-card kg-image-card"><img src="https://brickadia.com/blog/content/images/2025/03/data-src-image-acfb1e11-cd6c-4f93-978c-27f871eda650.png" class="kg-image" alt="Next Fest Wrap-Up: Survey Results, Plans for EA" loading="lazy" width="2000" height="950" srcset="https://brickadia.com/blog/content/images/size/w600/2025/03/data-src-image-acfb1e11-cd6c-4f93-978c-27f871eda650.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/03/data-src-image-acfb1e11-cd6c-4f93-978c-27f871eda650.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/03/data-src-image-acfb1e11-cd6c-4f93-978c-27f871eda650.png 1600w, https://brickadia.com/blog/content/images/2025/03/data-src-image-acfb1e11-cd6c-4f93-978c-27f871eda650.png 2199w" sizes="(min-width: 720px) 720px"></figure><h1 id="feedback">Feedback</h1><p>There was a <em>ton </em>of amazing feedback posted on the survey, on Discord, and on Steam, and we&apos;ve been reading all that we could. Here&apos;s a list of things that you all made very clear needs improving (in no particular order):</p><h3 id="horrible-hit-detection">Horrible hit detection</h3><p>Hit detection has degraded noticeably from Alpha 5 (which already had subpar hit detection).</p><p>The Alpha 5 version of hit registration is based on an unfinished rollback model, where the server validates hits by rewinding time to see where you hit the enemy on your screen. Unfortunately, the solution implemented isn&apos;t perfect due to many factors, and it has seemingly gotten worse due to latency issues from EOS P2P and bugs from engine upgrades.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2025/03/image-5.png" class="kg-image" alt="Next Fest Wrap-Up: Survey Results, Plans for EA" loading="lazy" width="2000" height="1156" srcset="https://brickadia.com/blog/content/images/size/w600/2025/03/image-5.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/03/image-5.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/03/image-5.png 1600w, https://brickadia.com/blog/content/images/2025/03/image-5.png 2034w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Skill issue, some would say.</span></figcaption></figure><p>Another issue with weapons is that bullets come from the muzzle of your gun. Seems realistic and reasonable, but in practice, it is very easy to hit obstacles blocking your shot instead of your target in first person. It makes gun fights in corridors and nearby obstacles very annoying.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2025/03/image-7.png" class="kg-image" alt="Next Fest Wrap-Up: Survey Results, Plans for EA" loading="lazy" width="964" height="578" srcset="https://brickadia.com/blog/content/images/size/w600/2025/03/image-7.png 600w, https://brickadia.com/blog/content/images/2025/03/image-7.png 964w"><figcaption><span style="white-space: pre-wrap;">This shot will be blocked, very annoying and common!</span></figcaption></figure><h3 id="vehicles-are-hard-to-control-slip-and-clip-often">Vehicles are hard to control, slip, and clip often</h3><p>One of the more common problems faced in the demo was vehicles flipping over and having little traction. Plus, since we&apos;re using actual physical wheels that actually spin, there&apos;s quite a bit of unstable behavior that occurs (especially at lower frame rates!). Additionally, climbing up plate bricks is a bumpy ride.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2025/03/image-2.png" class="kg-image" alt="Next Fest Wrap-Up: Survey Results, Plans for EA" loading="lazy" width="1494" height="873" srcset="https://brickadia.com/blog/content/images/size/w600/2025/03/image-2.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/03/image-2.png 1000w, https://brickadia.com/blog/content/images/2025/03/image-2.png 1494w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">The average driving experience going up 1f plates.</span></figcaption></figure><p>There were also many cases of &quot;clipping&quot; that occurs when two brick grids interact on a seam. You may have ran into this going up ramps or roads on vehicles where the chassis is low to the ground. This is an inherent limitation of how contacts are generated with physics. This has been mitigated with wheels, but not with brick grids. You can see the core of the issue here:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2025/03/GhostCollision.png" class="kg-image" alt="Next Fest Wrap-Up: Survey Results, Plans for EA" loading="lazy" width="753" height="328" srcset="https://brickadia.com/blog/content/images/size/w600/2025/03/GhostCollision.png 600w, https://brickadia.com/blog/content/images/2025/03/GhostCollision.png 753w"><figcaption><span style="white-space: pre-wrap;">Diagram of how incorrect contacts are generated.</span></figcaption></figure><p></p><h3 id="no-prefab-support-for-physics-grids">No prefab support for physics grids</h3><p>The demo still employs the same old saving system from Alpha 5, which never supported multiple physics grids or entities.</p><p>Additionally, the Selector tool is still functionally similar to the one in Alpha 5, with the addition of working with brick grids and some usability updates (like splitting grids apart). However, it&apos;s not possible to copy/paste an entire contraption at once!</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_prefab-exp" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/NextFestWrapUp-average-prefab-experience.webm" type="video/webm">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>The average copy/paste experience or saving prefabs.</figcaption>
    </a>
    <div id="inline_prefab-exp" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/NextFestWrapUp-average-prefab-experience.mp4" type="video/webm">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<h3 id="griefing-physics-contraptions-is-too-easy">Griefing physics contraptions is too easy</h3><p>The demo was intended for playing with trusted users only, and therefore barely had any restrictions on physics objects or their interactions. A few brave souls who dared to host a public server soon found out that there is a reason why we did not include the server browser at first as their creation became permanently covered in thousands of wheels and their vehicles lost to outer space.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2025/03/grieeef.png" class="kg-image" alt="Next Fest Wrap-Up: Survey Results, Plans for EA" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2025/03/grieeef.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/03/grieeef.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/03/grieeef.png 1600w, https://brickadia.com/blog/content/images/2025/03/grieeef.png 1920w" sizes="(min-width: 1200px) 1200px"></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2025/03/image-10.png" class="kg-image" alt="Next Fest Wrap-Up: Survey Results, Plans for EA" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2025/03/image-10.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/03/image-10.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/03/image-10.png 1600w, https://brickadia.com/blog/content/images/2025/03/image-10.png 1920w" sizes="(min-width: 1200px) 1200px"></figure><p>Another very common request was to be able to define home positions for contraptions and vehicles so you can reset them with the minigame (or even through wires).</p><h3 id="the-tutorial-is-clunky-unclear-and-confusing">The Tutorial is clunky, unclear, and confusing</h3><p>The demo became super invaluable for us in improving this area. Tons of new users struggled with not only the content of the tutorial, but also in the way the tutorial is presented. It is very clunky to press &quot;M&quot; on your keyboard to free the mouse, just to be able to interact with the tutorial. We&apos;ve seen many screenshots where the tutorial widget is still stuck on in the player&apos;s HUD, no good!</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2025/03/image-4.png" class="kg-image" alt="Next Fest Wrap-Up: Survey Results, Plans for EA" loading="lazy" width="1229" height="926" srcset="https://brickadia.com/blog/content/images/size/w600/2025/03/image-4.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/03/image-4.png 1000w, https://brickadia.com/blog/content/images/2025/03/image-4.png 1229w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">New players learning how to close the tutorial.</span></figcaption></figure><p>We quickly added some UX improvements during the demo, such as the third-person interaction prompts to tackle some of the low-points, but there is still plenty to improve here.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2025/03/image-1.png" class="kg-image" alt="Next Fest Wrap-Up: Survey Results, Plans for EA" loading="lazy" width="1064" height="724" srcset="https://brickadia.com/blog/content/images/size/w600/2025/03/image-1.png 600w, https://brickadia.com/blog/content/images/size/w1000/2025/03/image-1.png 1000w, https://brickadia.com/blog/content/images/2025/03/image-1.png 1064w"><figcaption><span style="white-space: pre-wrap;">Helping out new players sit in a seat!</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2025/03/image.png" class="kg-image" alt="Next Fest Wrap-Up: Survey Results, Plans for EA" loading="lazy" width="899" height="633" srcset="https://brickadia.com/blog/content/images/size/w600/2025/03/image.png 600w, https://brickadia.com/blog/content/images/2025/03/image.png 899w"><figcaption><span style="white-space: pre-wrap;">Another instance of the interaction prompt.</span></figcaption></figure><h3 id="limited-gameplay-gate-options">Limited gameplay gate options</h3><p>Wires and the new logic/gameplay gates have opened tons of possibilities for players (and you all have done some insanely creative things with just the ones available!)</p><p>There is definitely some room to improve here, especially when interacting with Gamemode features. For example, it&apos;s not possible to join a team using wires, detect when a round of deathmatch ended, add score, compare score... etc.</p><p>In the Demo, it wasn&apos;t really possible to make anything too groundbreaking when making gamemodes. (Though, there were some creative usages of physics and wires to make games like payload and survive-the-falling-cars!)</p><h1 id="plans-for-ea">Plans for EA</h1><p>We want the launch of Early Access to have the right foundations and the best possible user experience we can muster, but we also don&apos;t want to launch the game next year. So, the changes below from what you saw in the demo are our MVP for Early Access, and we are currently targeting a release in <strong>July 2025</strong>.</p><h3 id="improved-tools-and-prefab-support">Improved tools and prefab support</h3><p>Tackling the issue of saving vehicles and other physics contraptions, we will be upgrading the prefab system to support the new features that BRS did not.</p><p>The Selector will also be getting a big upgrade, such as being able to select or deselect individual bricks, and select by brick grids, which should make the Selector much more powerful than just only being able to select a box-volume.</p><h3 id="improved-combat-and-hit-detection">Improved combat and hit detection</h3><p>Improving the hit detection has been fairly tricky, and originally we wanted the combat system to be <em>very</em> precise. On the technical side, it implements a rollback system (similar to Counter-Strike 2) to ensure hits happened where they happened on your screen. At least, in theory, that is supposed to be what happens.</p><p>Due to various factors like Unreal Engine missing fixed-tick character movement, network replication and compensation, the implementation isn&apos;t very effective. We will likely move towards favoring client hits, with less aggressive server-side &quot;sanity&quot; checks and/or simplifying the implementation.</p><p>And another small but impactful change: the physical muzzle of your gun being blocked will no longer stop bullets the way it used to. Makes it much simpler to build maps that work correctly in first person.</p><h3 id="the-gallery">The Gallery</h3><p>The Gallery is a new feature coming to EA, where you can share your creations with others. It comes with full in-game integration, enabling you to easily find and upload content for all things Brickadia.</p><p>We will likely have a blog post detailing all the features and goodies that the Gallery adds, stay tuned!</p><h3 id="improved-physics-and-vehicle-handling">Improved physics and vehicle handling</h3><p>As mentioned earlier with clipping, this issue is unfortunately a limitation of physics engines. But, there are things we can do to (hopefully!) fix this, such as implementing sweep-based vehicles/wheels. Definitely stay tuned for a future blog post on this!</p><p>We plan on adding various weight bricks / the ability to change your vehicle&apos;s center of mass, which should help improve vehicles from tipping over. Increasing the tire friction is an obvious next step after improving these, and improving the handling of vehicles, especially at high speeds.</p><h3 id="wires-v2">Wires V2</h3><p>One of the limitations of gates in the version of wires that shipped in the demo was the reliance on brick components to implement their functionality. This puts many limitations on what gates can do, like having a variable number of ports, or supporting different wire types.</p><p>Wires v2 introduces &quot;generic&quot; gates, allowing us to implement gates for many different wire types. This is particularly useful for math gates that support integer and float/double math. Additionally, logic gates will benefit by having any number of inputs/outputs, and will let us design new types of gates such as selectors that need the flexibility.</p><p>Anyone who tried creating a complex contraption will likely have noticed timing issues where signals take different time to propagate down paths of different lengths, or even managed to get your gates stuck flickering in a loop for seemingly no reason. While this might be neat in a hardware simulator, it is extremely annoying if you are trying to make things just work. For the new version of wires, the system will correctly order the gates by their dependencies and propagate everything in a single tick.</p><p>A new gate, the Microchip, will also allow you to compact entire logic gate circuits into a single gate. A great utility of it is being able to modularize your wire circuits and share them on the Gallery! Plus, there are some <em>really</em> exciting things Microchips enable, as you&apos;ll read below.</p><h3 id="new-game-mode-system">New Game Mode system</h3><p>We will be replacing the ancient minigames system with gamemodes! Functionally, they will work very similar, and our plan is to keep as much familiarity between both as possible, while improving the UX and confusion around setting up minigames.</p><p>Game modes will be able to be packaged up into a bundle that you can activate independently from the worlds, so you can easily combine different maps with playing different modes on them.</p><p>Problems with the old minigame system included figuring out which bricks/entities should be part of the minigame and unclear configuration, which leads many users (even experienced ones) to wonder why things just don&apos;t work the way they expect when creating minigames.</p><p>Once we&apos;re happy with the new UX, we&apos;re expanding the power of gamemodes in a dramatic way.</p><p>As mentioned before, we&apos;re adding the Microchip, a useful tool in the wiring arsenal for compacting circuit designs. In the context of gamemodes, they get a <em>whole</em> <em>lot</em> more powerful and interesting:</p><p>Microchips can also be attached to players, or directly integrated in your gamemodes to add new logic. Originally, we wanted to wait on Behaviors (our scripting language) to bring this ability, but it seems obvious that wires are a great fit here too, so we&apos;re adding it for EA!</p><p>We will be adding onto the collection of gates available, allowing you to do even more powerful things, like listen to game mode and player events, and do things with those events when used in conjunction with the Microchip.</p><h3 id="tutorial-world">Tutorial World</h3><p>The tutorial widget we had in the demo, while it helped a little, definitely left many users confused. For EA, we plan to include a detailed Tutorial world that guides you through many of Brickadia&apos;s building features, one by one, in an approachable manner.</p><p>If your favorite future feature isn&apos;t listed yet, don&apos;t worry! This journey continues on far beyond Early Access.</p><h1 id="key-giveaway">Key Giveaway</h1><p>For those who opted-in to the key giveaway in the survey, we&apos;ve gone ahead and emailed the randomly selected 5 winners a Steam key. Congratulations to the winners, you will be able to play the game as soon as it releases!</p><h1 id="thank-you">Thank you!</h1><p>And to everyone that had a chance to play the demo, thank you! For those who haven&apos;t seen any of the amazingly creative builds users have built, here is just a handful of ones we picked from our Discord and socials:</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_arcade" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/NextFestWrapUp-slots.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Fancy slot machine arcade room by FancyPants!</figcaption>
    </a>
    <div id="inline_arcade" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/NextFestWrapUp-slots.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_strandbeest" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/NextFestWrapUp-strandbeast.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>A walking strandbeest by durb!</figcaption>
    </a>
    <div id="inline_strandbeest" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/NextFestWrapUp-strandbeast.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_car2" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/NextFestWrapUp-car2.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>A well engineered car by sink</figcaption>
    </a>
    <div id="inline_car2" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/NextFestWrapUp-car2.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_monorail" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/NextFestWrapUp-monorail.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Fully functioning monorail car by AXIIOM and Stelle!</figcaption>
    </a>
    <div id="inline_monorail" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/NextFestWrapUp-monorail.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_orion-car" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/NextFestWrapUp-automatic-lights.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>A car with built-in automatic brakelights, by orion</figcaption>
    </a>
    <div id="inline_orion-car" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/NextFestWrapUp-automatic-lights.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_mech" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/NextFestWrapUp-mech.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>A battle-ready mech, by Cybo</figcaption>
    </a>
    <div id="inline_mech" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/NextFestWrapUp-mech.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_display" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/NextFestWrapUp-video-display.webm" type="video/webm">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>An animated dot display matrix display by ZippyDev!</figcaption>
    </a>
    <div id="inline_display" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/NextFestWrapUp-video-display.webm" type="video/webm">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_tank-treads" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/NextFestWrapUp-tank-treads.mp4" type="video/webm">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Fully functioning tank treads by Edz!</figcaption>
    </a>
    <div id="inline_tank-treads" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/NextFestWrapUp-tank-treads.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_tomogatchi" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/NextFestWrapUp-tomogatchi.mp4" type="video/webm">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>A beary happy bear tamagotchi by eluna!</figcaption>
    </a>
    <div id="inline_tomogatchi" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/NextFestWrapUp-tomogatchi.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_walker" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/NextFestWrapUp-walker.mp4" type="video/webm">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>An 8-legged walker by Smallguy!</figcaption>
    </a>
    <div id="inline_walker" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/NextFestWrapUp-walker.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>And finally, some crazy devices that employ sound. Take a listen!</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    	<video class="lazy" controls preload="none">
    		<source data-src="https://static.brickadia.com/resources/NextFestWrapUp-cake-1.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>A gigantic MIDI player by cake</figcaption>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    	<video class="lazy" controls preload="none">
    		<source data-src="https://static.brickadia.com/resources/NextFestWrapUp-cake-2.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Different shot of a different MIDI player by cake</figcaption>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    	<video class="lazy" controls preload="none">
    		<source data-src="https://static.brickadia.com/resources/NextFestWrapUp-midi-mini.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>A small, customizable MIDI player by TonicThunder</figcaption>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    	<video class="lazy" controls preload="none">
    		<source data-src="https://static.brickadia.com/resources/NextFestWrapUp-morsecode.mp4" type="video/webm">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Morse Code keyboard also by Smallguy!</figcaption>
</figure>
<!--kg-card-end: html-->
<p>We&#x2019;re really excited about what&#x2019;s coming next, and we can&#x2019;t wait to share more with you soon. As always, thanks for all your feedback and support&#x2014;it means the world to us! If you have additional feedback, you can always drop by our Discord (we&apos;re active there!), or send us a message through any of our social medias.</p><p>And lastly, Happy Frog Day! Wait, what do you mean it&apos;s not Frog Day anymore, and it was last week? Oh well, have this frog anyway.</p><figure class="kg-card kg-image-card"><img src="https://brickadia.com/blog/content/images/2025/03/frog-smol.png" class="kg-image" alt="Next Fest Wrap-Up: Survey Results, Plans for EA" loading="lazy" width="32" height="32"></figure>]]></content:encoded></item><item><title><![CDATA[Next Fest Demo Is Out Now!]]></title><description><![CDATA[Limited Time Demo Featuring Building, Wires, Vehicles, Physics, Worlds and much more!]]></description><link>https://brickadia.com/blog/next-fest-demo-is-out/</link><guid isPermaLink="false">67bca602d1b9ca0007fee2d4</guid><category><![CDATA[News]]></category><dc:creator><![CDATA[wrap]]></dc:creator><pubDate>Mon, 24 Feb 2025 17:57:32 GMT</pubDate><media:content url="https://brickadia.com/blog/content/images/2025/02/ScreenShot00297-1080p.png" medium="image"/><content:encoded><![CDATA[<img src="https://brickadia.com/blog/content/images/2025/02/ScreenShot00297-1080p.png" alt="Next Fest Demo Is Out Now!"><p>Hey everyone, a short post for once! We&apos;re extremely happy to announce that the <strong>Brickadia Next Fest Demo</strong> <strong>is now available for download</strong> through Steam for a limited time! If you&apos;re here to play the game, <a href="https://store.steampowered.com/app/2199420/Brickadia/" rel="noreferrer">you can click here for the Steam page</a> to download the demo. For everyone else still here (you should go play the demo instead!), read on.</p><p>Our Next Fest Demo includes almost every feature we&apos;ve been cooking up over the last few years, including physics contraptions, drive-able vehicles, wires, and our world system, and of course our brick-building system that supports <em>millions</em> of bricks at the core of it. If you haven&apos;t seen the brand new trailer for this demo, it was filmed entirely in-game in this demo!</p><figure class="kg-card kg-embed-card kg-card-hascaption"><iframe width="200" height="113" src="https://www.youtube.com/embed/t6kyTLkLIXA?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="Brickadia Next Fest Demo Trailer | Cars and Physics Contraptions!"></iframe><figcaption><p><span style="white-space: pre-wrap;">Next Fest Demo Trailer</span></p></figcaption></figure><p>What does this demo <strong>not</strong> include? Behaviors, the new gamemodes system, and the Gallery. Our planned Behaviors scripting system is on the back burner at the moment as we have been focusing on wires and logic gates first! This demo currently has the same old &quot;mini-games&quot; system as our old Alpha had - this system is planned to be replaced with a simpler, more flexible gamemode system in Early Access, but currently this hasn&apos;t been implemented yet for this demo. Our Gallery is also not ready yet - but we do really want it to be part of the proper Early Access release as it will let everyone properly share their creations and instantly load into other peoples awesome worlds.</p><p>A very exciting day for Brickadia indeed! This isn&apos;t our full Early Access release yet, but releasing a brand new demo showcasing the current state of our game is still a giant leap forward for us. We really look forward to seeing what you all create in this demo - please post your creations in our Discord, on social media, and in the subreddit. We love to see them!</p><p>We will have a survey available towards the end of the Demo. Please give us your honest thoughts and suggestions as that will shape the direction we take the first Early Access release.</p><p>As always, thank you for reading. And go play the Demo! Stay tuned.</p>]]></content:encoded></item><item><title><![CDATA[Devlog #7 - Wires, Vehicles, Next Fest & More!]]></title><description><![CDATA[A catch-up of everything we got done in the latter half of 2024, plus a big announcement!]]></description><link>https://brickadia.com/blog/devlog-7/</link><guid isPermaLink="false">6766eaf182f33200061978e4</guid><category><![CDATA[Development]]></category><category><![CDATA[News]]></category><dc:creator><![CDATA[Sixmorphugus]]></dc:creator><pubDate>Fri, 03 Jan 2025 17:17:56 GMT</pubDate><media:content url="https://brickadia.com/blog/content/images/2025/01/blogscene.png" medium="image"/><content:encoded><![CDATA[<img src="https://brickadia.com/blog/content/images/2025/01/blogscene.png" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!"><p>Today we&apos;re going to be dipping our toes into two big Early Access features that haven&apos;t been discussed much on the blog: Wires and Vehicles. We&apos;ll also go over all the other cool stuff that the team did in 2024!</p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">We would advise you to watch your bandwidth usage, and not to scroll too fast, as this page contains <b><strong style="white-space: pre-wrap;">46 videos</strong></b>!</div></div><p>But before all that, we have an announcement: <strong>In February, we&apos;ll be joining the Steam Next Fest with a time-limited demo!</strong> During the fest, you&apos;ll be able to get your hands on an early preview of all the new creative features we&apos;ve been cooking for the past few years!</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2025/01/Banner-Steam-Next-Fest-2023-all.jpg" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="900" height="506" srcset="https://brickadia.com/blog/content/images/size/w600/2025/01/Banner-Steam-Next-Fest-2023-all.jpg 600w, https://brickadia.com/blog/content/images/2025/01/Banner-Steam-Next-Fest-2023-all.jpg 900w"></figure><p>The Next Fest build will be our <strong>Creator Demo</strong>, a build of the game that will focus on building and creators. The demo will be available from February 24 at 10 AM Pacific to March 3. We&apos;ll share more on this demo as we get closer to the Fest!</p><p>To be notified, <a href="https://store.steampowered.com/app/2199420/Brickadia/" rel="noreferrer">add Brickadia to your wishlist on Steam</a>.</p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">Start thinking about what you&apos;re going to build! We&apos;re really looking forward to seeing your creations.</div></div><p><a href="#building-tool-improvements">Building Tool Improvements</a><br>
&#x2003;<a href="#offsetting-from-the-plane-lock-plane">Offsetting From the Plane Lock Plane</a><br>
&#x2003;<a href="#follow-mode-and-precision-mode">Follow Mode and Precision Mode</a><br>
&#x2003;&#x2003;<a href="#new-arcball-rotation-controls">New &quot;arcball&quot; rotation controls</a><br>
&#x2003;&#x2003;<a href="#reorient-rotation-still-exists">Reorient rotation still exists</a><br>
&#x2003;&#x2003;<a href="#in-follow-mode-player-now-faces-the-brick">In follow mode, player now faces the brick</a><br>
&#x2003;<a href="#negative-spacing">Negative Spacing</a><br>
&#x2003;<a href="#upgraded-pie-menu">Upgraded Pie Menu</a><br>
&#x2003;<a href="#default-loadout-of-bricks">Default &quot;Loadout&quot; of Bricks</a><br>
&#x2003;<a href="#correct-grid-snapping-to-edgeover-edge">Correct Grid Snapping (To Edge/Over Edge)</a><br>
&#x2003;<a href="#align-half-plate-thick-bricks-to-surface">Align Half-Plate Thick Bricks To Surface</a><br>
&#x2003;<a href="#inventory-is-single-quickbar-again">Inventory is Single-Quickbar Again</a><br>
&#x2003;<a href="#entities">Entities</a><br>
&#x2003;<a href="#improved-catalog-organization">Improved Catalog Organization</a><br>
<a href="#wires">Wires</a><br>
&#x2003;<a href="#the-solution">The Solution</a><br>
&#x2003;<a href="#the-connector">The Connector</a><br>
&#x2003;<a href="#buttons-targets-and-switches">Buttons, Targets and Switches</a><br>
&#x2003;<a href="#logic-gates">Logic Gates</a><br>
&#x2003;<a href="#wire-types">Wire Types</a><br>
&#x2003;<a href="#various-examples">Various Examples</a><br>
<a href="#vehicles-and-contraptions">Vehicles and Contraptions</a><br>
&#x2003;<a href="#joints">Joints</a><br>
&#x2003;<a href="#joints-being-used-ingame">Joints Being Used Ingame</a><br>
&#x2003;<a href="#seats">Seats</a><br>
&#x2003;<a href="#driveable-cars">Driveable Cars</a><br>
&#x2003;<a href="#various-examples-1">Various Examples</a><br>
<a href="#other-stuff">Other Stuff!</a><br>
&#x2003;<a href="#procedural-brick-generation">Procedural Brick Generation</a><br>
&#x2003;<a href="#weapon-resources">Weapon Resources</a><br>
&#x2003;<a href="#homing-missile">Homing Missile</a><br>
&#x2003;<a href="#pole-resizable-in-all-directions">Pole Resizable in All Directions</a><br>
&#x2003;<a href="#other-new-bricks">Other New Bricks</a><br>
&#x2003;<a href="#skirts-and-dresses">Skirts and Dresses</a><br>
<a href="#ok-thats-everything">OK That&apos;s Everything</a></p>
<h1 id="building-tool-improvements">Building Tool Improvements</h1><p>I really should write a full blog on how these work but here&apos;s an outline of what I have at the moment.</p><h2 id="offsetting-from-the-plane-lock-plane">Offsetting From the Plane Lock Plane</h2>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_offset-plane" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/Catchup-1-Offset-Plane.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>You are now able to offset from the plane lock plane by scrolling the mouse.</figcaption>
    </a>
    <div id="inline_offset-plane" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/Catchup-1-Offset-Plane.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>Plane lock was added back into the new mouse building controls with a new feature: You are now able to offset from the plane lock plane in plane lock by scrolling the mouse.</p><p>This creates this cool line between the actual lock grid and the raised one. It has a bunch of uses.</p><h2 id="follow-mode-and-precision-mode">Follow Mode and Precision Mode</h2><p>In a huge surprise to absolutely nobody, I remade Orbit Mode and Detached Mode. They are now renamed to Follow Mode and Precision Mode. These modes share essentially the same codebase with different keybinds. However, several things work much better:</p><h3 id="new-arcball-rotation-controls"><strong>New &quot;arcball&quot; rotation controls</strong></h3><p>The rotation in follow and precision mode now offers an &quot;arcball&quot; rotation scheme when you hold ctrl, inspired by that offered by games such as Space Engineers. What does &quot;arcball&quot; mean? It means rotation is now relative to the surface you&apos;re looking at. Left/Right/Up/Down will all rotate the surface 90 degrees to point in that direction without affecting other axis, while the additional rotate buttons will turn it counter-clockwise and clockwise. Take a look:</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-arcball" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-arcball.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Rotation in follow mode.</figcaption>
    </a>
    <div id="inline_catchup-1-arcball" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-arcball.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<h3 id="reorient-rotation-still-exists">Reorient rotation still exists</h3><p>Holding R still gives you reorient controls. Tapping in a direction will rotate your brick to face in that direction, exactly as is offered by the mouse controls:</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-reorient" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-reorient.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Reorientation in follow mode.</figcaption>
    </a>
    <div id="inline_catchup-1-reorient" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-reorient.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<h3 id="in-follow-mode-player-now-faces-the-brick">In follow mode, player now faces the brick</h3><p>Finally, as a last little polish feature, your player will now &quot;look&quot; at what you are doing while you&apos;re in follow mode. Other clients see this too.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_Catchup-1-Orbit-Follow" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/Catchup-1-Orbit-Follow.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Look alive while you&apos;re building in Orbit mode!</figcaption>
    </a>
    <div id="inline_Catchup-1-Orbit-Follow" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/Catchup-1-Orbit-Follow.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<h2 id="negative-spacing">Negative Spacing</h2><p>A very oft-requested feature since we added the ability to row-drag templates, and especially since we gave testers the ability to grid and volume-drag them has been negative spacing. Negative spacing allows you to overlap instances of the template you&apos;re dragging, making it possible to place a template that interlocks with itself.</p><p>The simplest example of course is a brick wall like here.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-negative-spacing-1" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-negative-spacing-1.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>You can place a brick wall without having to fill in gaps now!</figcaption>
    </a>
    <div id="inline_catchup-1-negative-spacing-1" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-negative-spacing-1.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>But there are more advanced cases, especially when you&apos;re placing wires (which we&apos;ll talk about in a bit) which auto-attach when overlapped with the same brick type attached within the template:</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-negative-spacing-2" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-negative-spacing-2.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>I&apos;m setting up my communication lines...</figcaption>
    </a>
    <div id="inline_catchup-1-negative-spacing-2" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-negative-spacing-2.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<h2 id="upgraded-pie-menu">Upgraded Pie Menu</h2><p>The tool pie menu now has descriptions.</p><p>When you select the Placer from the pie menu, you&apos;ll select the last brick you had selected, or else the first brick found in your inventory, or else a 1x1f will be thrown in the TEMP slot and you&apos;ll select that.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/image-37.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="1082" height="1136" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/image-37.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/12/image-37.png 1000w, https://brickadia.com/blog/content/images/2024/12/image-37.png 1082w"><figcaption><span style="white-space: pre-wrap;">Easier? We&apos;ll see.</span></figcaption></figure><h2 id="default-loadout-of-bricks">Default &quot;Loadout&quot; of Bricks</h2><p>The quickbar now has things in it without you having to open the catalog and add them, which greatly confused people who came by our booth when we showed the game at a convention in November.</p><p>The default loadout is very transparently the minimal kit for building a car (don&apos;t worry, we&apos;ll get to cars):</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/image-17.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="1518" height="251" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/image-17.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/12/image-17.png 1000w, https://brickadia.com/blog/content/images/2024/12/image-17.png 1518w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">We would have put micros in but those aren&apos;t really a new people thing and there wasn&apos;t space.</span></figcaption></figure><h2 id="correct-grid-snapping-to-edgeover-edge">Correct Grid Snapping (To Edge/Over Edge)</h2><p>In alpha 5, when you are in one of the keyboard building modes (follow/precision as they&apos;re now called) your brick has never actually moved or aligned to the grid properly. Thankfully, the only way to notice this was to try and use a micro-brick, or some other brick that wasn&apos;t large enough to align to the grid.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/image-38.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="2000" height="1063" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/image-38.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/12/image-38.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/12/image-38.png 1600w, https://brickadia.com/blog/content/images/2024/12/image-38.png 2000w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">This is how Alpha 5 aligns your micro-brick to the grid in Follow Mode.</span></figcaption></figure><p>In mouse mode, Alpha 5 can align your brick the way we intended - to the nearest edge of the aimed-at grid cell. It&apos;s only follow and precision mode that are broken (actually, quite a lot of the Alpha 5 building is broken).</p><p>What follow and precision mode actually should have been able to do was move bricks that are smaller than the grid cell on the move axis &quot;to, <em>then</em> over&quot; the grid cell&apos;s border, which oftentimes is an uneven movement per button press and so can&apos;t be done by simply offsetting the brick each key press. This corrected &quot;to, <em>then</em> over&quot; movement is how it works in Early Access.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-to-edge" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-to-edge.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>The correct follow mode grid alignment.</figcaption>
    </a>
    <div id="inline_catchup-1-to-edge" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-to-edge.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<h2 id="align-half-plate-thick-bricks-to-surface">Align Half-Plate Thick Bricks To Surface</h2><p>When you have the plate grid alignment mode selected (you literally <em>must</em> give it a try!) try aiming at the surface of a micro-brick or some other surface that does not align to that grid in Alpha 5. Your brick will float.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/blogbrick.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="1390" height="697" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/blogbrick.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/12/blogbrick.png 1000w, https://brickadia.com/blog/content/images/2024/12/blogbrick.png 1390w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Bother!</span></figcaption></figure><p>What&apos;s worse is that this can be hard to notice from a distance, so you get done building something and then find it floating an uncorrectable (1-2 unit) distance off the ground.</p><p>In Early Access, your brick aligns to the depth of the surface you&apos;re looking at,  even in Plate mode, as long as it isn&apos;t inside the bounds of a brick. So your micro-brick will actually place against off grid surfaces in Early Access:</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-micro-sink" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-micro-sink.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Painting with Micro-Bricks.</figcaption>
    </a>
    <div id="inline_catchup-1-micro-sink" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-micro-sink.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>Also notable here, but easy to miss - resize dragging moves the size up to the first grid edge for the first resize increment, <em>then</em> expands to fill further grid cells.</p><h2 id="inventory-is-single-quickbar-again">Inventory is Single-Quickbar Again</h2><p>Many of you commented on the section of the last blog post saying that the multiple quickbars and increased inventory size may be difficult to deal with for new players. This is exactly what we found during testing, so they&apos;ve been removed.</p><h2 id="entities">Entities</h2><p>Since adding entities, we have added exactly two (2) entity types so far.</p><p>The first is a ball that can be painted and resized. As always, I forgot to add a size limit.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/image-4.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="2000" height="1014" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/image-4.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/12/image-4.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/12/image-4.png 1600w, https://brickadia.com/blog/content/images/2024/12/image-4.png 2000w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Me and the spare Zeblote explore a new planet.</span></figcaption></figure><p>But then we have the current main use case of entities: Wheels. Wheels make perfect sense not to be bricks - they get to have proper analytical collision and they do not waste the server&apos;s processing power managing another brick grid. There are countless wheels in the game so far and here are a few of them:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/image-19.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="1273" height="773" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/image-19.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/12/image-19.png 1000w, https://brickadia.com/blog/content/images/2024/12/image-19.png 1273w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">A bunch of different variations of the regular-sized wheel.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/image-20.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="1086" height="623" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/image-20.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/12/image-20.png 1000w, https://brickadia.com/blog/content/images/2024/12/image-20.png 1086w"><figcaption><span style="white-space: pre-wrap;">A bunch wheels from our &quot;small&quot; wheel set, for trolleys and RC cars!</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/image-21.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="1238" height="925" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/image-21.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/12/image-21.png 1000w, https://brickadia.com/blog/content/images/2024/12/image-21.png 1238w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Bigger wheels!</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/image-22.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="509" height="505"><figcaption><span style="white-space: pre-wrap;">Airplane wheels!</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/image-23.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="1797" height="1054" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/image-23.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/12/image-23.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/12/image-23.png 1600w, https://brickadia.com/blog/content/images/2024/12/image-23.png 1797w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Snazzy wheels!</span></figcaption></figure><h2 id="improved-catalog-organization">Improved Catalog Organization</h2><p>Confidentbottle has improved a bunch of stuff relating to the organization of the default catalog. First and foremost, the Entities tab is gone as there were not enough entities in the game to justify it. Instead, the Bricks tab is now an Objects tab:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/image-24.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="2000" height="1152" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/image-24.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/12/image-24.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/12/image-24.png 1600w, https://brickadia.com/blog/content/images/2024/12/image-24.png 2000w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">The object catalog.</span></figcaption></figure><p>Categories have been reordered to make more sense, with bricks you&apos;ll want to use first prioritized rather than the alphabetically ordered sets of Alpha 5.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2024/12/image-5.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="451" height="732"></figure><p>Also, Micro-Bricks now have their own tab and are actually ordered sensibly, meaning you don&apos;t have to scroll right to the bottom to get at the regular cubes.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/image-6.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="946" height="944" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/image-6.png 600w, https://brickadia.com/blog/content/images/2024/12/image-6.png 946w"><figcaption><span style="white-space: pre-wrap;">The cubes are no longer last!!</span></figcaption></figure><p>All the magical gameplay bricks and entities are spread across 3 categories, rather than ending up hidden in Special;</p><ul><li><strong>Physics</strong> stores bricks and entities meant for making physics contraptions.</li><li><strong>Mechanics</strong> stores bricks and entities meant for making interactive machines or experiences.</li><li><strong>Logic Gates</strong> stores the logic gates provided to users of the wire system.</li></ul><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/image-25.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="2000" height="1129" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/image-25.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/12/image-25.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/12/image-25.png 1600w, https://brickadia.com/blog/content/images/2024/12/image-25.png 2398w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">The Physics category. We&apos;ll discuss joints later.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/image-26.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="2000" height="1154" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/image-26.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/12/image-26.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/12/image-26.png 1600w, https://brickadia.com/blog/content/images/size/w2400/2024/12/image-26.png 2400w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">The mechanics category.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/image-27.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="2000" height="1160" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/image-27.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/12/image-27.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/12/image-27.png 1600w, https://brickadia.com/blog/content/images/2024/12/image-27.png 2398w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">The logic gates category. We&apos;ll discuss Wires... now, actually!</span></figcaption></figure><h1 id="wires">Wires</h1><p>Back when we were thinking about the design of our still TBA scripting language, Behaviors, we very quickly realized that most of our players wouldn&apos;t want to have to use it to do simple things. No matter how approachable you make your scripting system, the more it can do, the more complex it has to be - and the more daunting it becomes to beginners.</p><p>But why should they have to learn what a function is, what bindings are, what symbols and variables and booleans and parameters are, just to make a switch open a door? </p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-door-switch-1" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-door-switch-1.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Like this?</figcaption>
    </a>
    <div id="inline_catchup-1-door-switch-1" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-door-switch-1.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>Or even to make the correct combination of switch values open a door?</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-door-switch-2" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-door-switch-2.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Like this?</figcaption>
    </a>
    <div id="inline_catchup-1-door-switch-2" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-door-switch-2.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>These are use cases so simple that they shouldn&apos;t even have to go through scripting at all.</p><h2 id="the-solution">The Solution</h2><p>If you&apos;ve read previous blog posts, you already know this bit, but for new people I&apos;m going to go over it again;</p><p>Conveniently, everything in Brickadia is data-driven - i.e. has a state that can be controlled very directly by reading and changing variables. Let&apos;s simply designate some variables outputs, and some variables inputs, and let players designate &quot;links&quot; between a given output and multiple inputs somewhere else. When the output variable changes, linked input variables are set to the same value.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/switchdoor-1.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="1000" height="1000" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/switchdoor-1.png 600w, https://brickadia.com/blog/content/images/2024/12/switchdoor-1.png 1000w"><figcaption><span style="white-space: pre-wrap;">For more information on the design, you can check out our old &quot;Interactive Brickadia: Next Steps&quot; blog post which this diagram is from.</span></figcaption></figure><p>This &quot;link&quot; is all a wire is.</p><h2 id="the-connector">The Connector</h2><p>To attach wires, we have this tool, the connector. The connector lets you connect wires between physical ports in 2 clicks. For bricks without those, you can select your source or target port from a list instead:</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-wires-basic" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-wires-basic.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Connecting a wire from a source port to the enabled property of a light!</figcaption>
    </a>
    <div id="inline_catchup-1-wires-basic" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-wires-basic.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>As always, we&apos;ve added a bunch of QoL features to the Connector to make it super easy to work with. You can hit R to restart connecting from the last port and hold Ctrl to multi-connect. The GUI has a quick fuzzy find search where you can press enter to choose the first port in the current results.</p><p>You&apos;re probably wondering if there&apos;s a way to organize these wires better. There is! Rerouter bricks. With the Rerouter brick, you can always organize your wires super nicely.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-motor-button" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-motor-button.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Connecting a wire from a source port though a bunch of rerouters to a motor!</figcaption>
    </a>
    <div id="inline_catchup-1-motor-button" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-motor-button.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/image-11.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="989" height="813" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/image-11.png 600w, https://brickadia.com/blog/content/images/2024/12/image-11.png 989w"><figcaption><span style="white-space: pre-wrap;">Busses!</span></figcaption></figure><h2 id="buttons-targets-and-switches">Buttons, Targets and Switches</h2><p>We have 3 inputs to the wire system right now, none of which support animations yet:</p><p><strong>Switches</strong> can be clicked to toggle their output signal between off and on. There are a lot of use cases.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/image-2.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="910" height="762" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/image-2.png 600w, https://brickadia.com/blog/content/images/2024/12/image-2.png 910w"><figcaption><span style="white-space: pre-wrap;">Control panel with switches.</span></figcaption></figure><p><strong>Buttons</strong> emit an on signal while your mouse is held and an off signal otherwise. Originally, they had an on-off time, but the &quot;holding&quot; functionality is far more versatile. For advanced use cases, you can even get a count for how many players are holding down one button.</p><p><strong>Targets</strong> emit an on signal for a certain amount of time when shot with a projectile or hit with a melee weapon. If hit while on, their current &quot;on&quot; signal will be reset to that amount of time instead.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-shooting-range" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/Catchup-1-Shooting-Range.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>What else to demo this but a shooting range?</figcaption>
    </a>
    <div id="inline_catchup-1-shooting-range" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/Catchup-1-Shooting-Range.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<h2 id="logic-gates">Logic Gates</h2><p>There are a ton of gate bricks with physical ports (most of which you see in the catalog above) that you can route your wires through. The system is turing complete, and you can use it to do most things. </p><p>As an example, we can use an AND gate to make a door that opens only when two switches are flipped.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_Catchup-1-Door-Switch-3" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/Catchup-1-Door-Switch-3.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>You must find and turn on both switches to open the door.</figcaption>
    </a>
    <div id="inline_Catchup-1-Door-Switch-3" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/Catchup-1-Door-Switch-3.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>Or an OR gate to make an item collectable when one of two buttons are held.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-wires-or" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-wires-or.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Either button makes the item collectable.</figcaption>
    </a>
    <div id="inline_catchup-1-wires-or" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-wires-or.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<h2 id="wire-types">Wire Types</h2><p>You&apos;ve probably noticed all the wires are red. Can they be other colors? Yes, they can!</p><p>A wire&apos;s color is determined by the type of data it carries. Red wires carry <strong>booleans</strong>, i.e. an on/off signal. But since wires can carry any property type, you can also send <strong>decimal </strong>numbers and do operations on those.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_Catchup-1-Constants-Add" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/Catchup-1-Constants-Add.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Also, the entry box for integers smart enough to do math on its own!</figcaption>
    </a>
    <div id="inline_Catchup-1-Constants-Add" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/Catchup-1-Constants-Add.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>Since wires automatically convert between all the basic types, you can send boolean values into ports that take numbers (as 0 or 1) and vice versa (!= 0 is 1).</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_Catchup-1-Bool-Add" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/Catchup-1-Bool-Add.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>There is no problem whatsoever with treating a boolean as the number 0 or 1 depending on its value. The switch can be wired right in!</figcaption>
    </a>
    <div id="inline_Catchup-1-Bool-Add" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/Catchup-1-Bool-Add.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>In addition to this, and as you saw above, everything always converts into a <strong>string</strong> - which is how we can display the value on interact at the end.</p><p>With <strong>integer</strong> numbers, you can do bitwise operations. So here&apos;s something more advanced that most of you won&apos;t ever need to do: With a bit of work, we can send 8 different booleans as a single integer value.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_Catchup-1-Combine" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/Catchup-1-Combine.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>This is how computers count!</figcaption>
    </a>
    <div id="inline_Catchup-1-Combine" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/Catchup-1-Combine.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">This is a technique testers have ended up using in a lot of their wire contraptions, since an integer can actually hold up to 64 booleans in its bits that can then be sent over just 1 wire! It&apos;s even easier to disassemble later - just use bitwise AND and use that value as a bool.</div></div><h2 id="various-examples">Various Examples</h2><p>You can make lots of things in Brickadia with just wires and no scripting. Eventually, though, wiring contraptions together becomes more of an art itself. There are some things you really should be doing with scripting later. But of course, you don&apos;t <em>have</em> to, so maybe, just for fun, you don&apos;t.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_Catchup-1-Wires-Showcase-1" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/Catchup-1-Wires-Showcase-1.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Conway&apos;s game of life, made with only wires.</figcaption>
    </a>
    <div id="inline_Catchup-1-Wires-Showcase-1" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/Catchup-1-Wires-Showcase-1.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-wires-showcase-2" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-wires-showcase-2.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Connect 4, made with only wires.</figcaption>
    </a>
    <div id="inline_catchup-1-wires-showcase-2" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-wires-showcase-2.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-wires-showcase-3" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-wires-showcase-3.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Othello, made with only wires.</figcaption>
    </a>
    <div id="inline_catchup-1-wires-showcase-3" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-wires-showcase-3.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-wires-showcase-4" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-wires-showcase-4.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>A deathrun using wires, and joints (discussed next!).</figcaption>
    </a>
    <div id="inline_catchup-1-wires-showcase-4" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-wires-showcase-4.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/image-43.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="2000" height="1063" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/image-43.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/12/image-43.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/12/image-43.png 1600w, https://brickadia.com/blog/content/images/2024/12/image-43.png 2000w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Electrician simulator.</span></figcaption></figure><p>The UX of wires is basically finished with just some polish and additional features down the line.</p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">And yes, you can hide them. Wires will be hidden if either of the bricks they&apos;re attached to are. If you don&apos;t want to hide either of the attached bricks, put a wire rerouter between your bricks, route the wire though it, and hide that.</div></div><h1 id="vehicles-contraptions">Vehicles &amp; Contraptions</h1><p>You are all <em>long overdue</em> for an explanation of our plans for this, but there is a lot to go over so I will try to be concise here.</p><h2 id="joints">Joints</h2><p>The first part of vehicles we implemented were the basic bearing joints, which currently remain the only joints in the game. Right now, they come in 3 flavors; Bearing, Motor, Servo. To attach a brick to a joint, you simply place it on top of the joint.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/image-3.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="710" height="839" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/image-3.png 600w, https://brickadia.com/blog/content/images/2024/12/image-3.png 710w"><figcaption><span style="white-space: pre-wrap;">Every type of bearing currently in the game. The regular Bearing, the Motor, and the Servo.</span></figcaption></figure><p>The <strong>Bearing</strong> (left) simply rotates freely with customizable damping (damping is the force with which the joint tries to slow to a stop while spinning). It&apos;s good for making hinges for doors, windows and other things, but it can&apos;t do anything advanced.</p><p>The <strong>Motor</strong> (center) is your workhorse powered joint. When enabled, it will spin with constant power you set. You can make something that spins constantly such as a platform or part for a total wipeout course, and you can even combine it with wires to make things like deathrun traps, fairground rides, and mechanisms. </p><p>Finally, the <strong>Servo</strong> (right) is what you use when you want something to move to a specific position and to try with user-specified force to stay there. It can be used to make suspensions but is most useful when paired with wires, which you can use to make automatic doors, spinning counters, all sorts of things.</p><p>We have micro joints too!</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/image-14.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="1402" height="770" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/image-14.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/12/image-14.png 1000w, https://brickadia.com/blog/content/images/2024/12/image-14.png 1402w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Micro bearing.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/image-42.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="1446" height="845" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/image-42.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/12/image-42.png 1000w, https://brickadia.com/blog/content/images/2024/12/image-42.png 1446w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Other micro-joints.</span></figcaption></figure><h2 id="joints-being-used-ingame">Joints Being Used Ingame</h2><p>There are lots of use cases. Here are some images and videos from recent dev media.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-joint-showcase-1" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-joint-showcase-1.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Puppeteering a robot on mars.</figcaption>
    </a>
    <div id="inline_catchup-1-joint-showcase-1" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-joint-showcase-1.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-joint-showcase-2" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-joint-showcase-2.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Searching in the darkness...</figcaption>
    </a>
    <div id="inline_catchup-1-joint-showcase-2" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-joint-showcase-2.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-joint-showcase-3" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-joint-showcase-3.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Collision detail is good enough to make a roblox-style train!</figcaption>
    </a>
    <div id="inline_catchup-1-joint-showcase-3" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-joint-showcase-3.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-joint-showcase-4" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-joint-showcase-4.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>We can open and close this hatch!</figcaption>
    </a>
    <div id="inline_catchup-1-joint-showcase-4" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-joint-showcase-4.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-joint-showcase-5-new" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-joint-showcase-5-new.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>By separating collision across multiple grids, we can make a working Geneva drive!</figcaption>
    </a>
    <div id="inline_catchup-1-joint-showcase-5-new" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-joint-showcase-5-new.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-joint-showcase-6" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-joint-showcase-6.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Slotcars!</figcaption>
    </a>
    <div id="inline_catchup-1-joint-showcase-6" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-joint-showcase-6.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-joint-showcase-7" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-joint-showcase-7.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>A MERP city, animated with joints!</figcaption>
    </a>
    <div id="inline_catchup-1-joint-showcase-7" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-joint-showcase-7.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-joint-showcase-8" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-joint-showcase-8.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>A mechanical seven-segment display!</figcaption>
    </a>
    <div id="inline_catchup-1-joint-showcase-8" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-joint-showcase-8.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-joints-showcase-9" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-joints-showcase-9.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>A rideable ferris wheel!</figcaption>
    </a>
    <div id="inline_catchup-1-joints-showcase-9" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-joints-showcase-9.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-joint-showcase-10" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-joint-showcase-10.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>More gears!</figcaption>
    </a>
    <div id="inline_catchup-1-joint-showcase-10" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-joint-showcase-10.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/ScreenShot00031.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/ScreenShot00031.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/12/ScreenShot00031.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/12/ScreenShot00031.png 1600w, https://brickadia.com/blog/content/images/2024/12/ScreenShot00031.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Something for the Mecha fans!</span></figcaption></figure><h2 id="seats">Seats</h2><p>The obvious next thing to make was some way to sit down and be attached to whatever ride/pseudo-car/other miscellaneous deathtrap you made. That comes in the form of the Seat, which you can click on to sit in.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-seat" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-seat.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Finally, a comfortable chair.</figcaption>
    </a>
    <div id="inline_catchup-1-seat" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-seat.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>There is not much else to say here. If you put one on a physics contraption it works as expected.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-2-seat" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-seat-2.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>This chair seems less comfortable.</figcaption>
    </a>
    <div id="inline_catchup-2-seat" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-seat-2.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<h2 id="driveable-cars">Driveable Cars</h2><p>Again we are left with the problem of how to make versatile behavior possible without forcing the user to do a lot of work. And just so we&apos;re on the same page, programming good vehicle control is <em>hard</em>, easy to do wrong, and not even the first problem we need to solve. </p><p>The first problem we need to solve is how to allow a player set up their car, which they have built out of a lot of small little bricks, to drive in a way that resembles sensible.</p><p>To demonstrate the solution I came up with, here&apos;s what we want to drive:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/image-28.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="1322" height="895" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/image-28.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/12/image-28.png 1000w, https://brickadia.com/blog/content/images/2024/12/image-28.png 1322w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">My design skills are rivaled by none.</span></figcaption></figure><p>It would certainly be quite a stretch to call this a &quot;vehicle&quot;, but I&apos;m going to anyway.</p><p>We need to mount the wheels, but there&apos;s immediately a problem. If we put our wheels on the car with a Motor, they wouldn&apos;t be able to steer. Motors only turn.</p><p>Enter the Wheel Joint, which can steer and turn. It even has a built in suspension.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-vehicle-1" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-vehicle-1.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Putting wheels on. The line across the joint is the direction the suspension works in and that steering works across.</figcaption>
    </a>
    <div id="inline_catchup-1-vehicle-1" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-vehicle-1.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>Already this is starting to look more like a car. We still can&apos;t drive it, though. Nothing is controlling the wheel joints.</p><p>There are many different schools of thought in sandbox games for how you tell the game how the player&apos;s controls control the car, but me? I&apos;m partial to the approach taken by Robocraft and Spore (a creature is technically a vehicle, right?). That approach being: The game should figure out as much about how to drive and steer your creation as possible on its own, without you needing to be involved in every little decision.</p><p>But this is Brickadia, so we also want modularity. We want to be able to entirely exclude functionality we don&apos;t want, like gear switching and air control. And we want to be able to tweak things that make sense to tweak, like acceleration, braking force and top speed. </p><p>This means that first of all, we should add the least additional functionality to the Seat as possible. We should simply have the Seat emit a <em>Control</em> signal that we can use (or decompose into wire outputs) somewhere else.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/UnrealEditor-Win64-DebugGame_nzVOpzzzCV.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="1895" height="1186" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/UnrealEditor-Win64-DebugGame_nzVOpzzzCV.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/12/UnrealEditor-Win64-DebugGame_nzVOpzzzCV.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/12/UnrealEditor-Win64-DebugGame_nzVOpzzzCV.png 1600w, https://brickadia.com/blog/content/images/2024/12/UnrealEditor-Win64-DebugGame_nzVOpzzzCV.png 1895w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">The seat has a wire output.</span></figcaption></figure><p>What do we attach it to? Introducing the Wheel Engine.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/image-31.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="1157" height="967" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/image-31.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/12/image-31.png 1000w, https://brickadia.com/blog/content/images/2024/12/image-31.png 1157w"><figcaption><span style="white-space: pre-wrap;">Our car has an engine!</span></figcaption></figure><p>The Wheel Engine&apos;s placement designates the forward direction for our vehicle, and also where the engine noise comes from. This means that even if the seat were placed like this:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/image-32.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="1032" height="837" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/image-32.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/12/image-32.png 1000w, https://brickadia.com/blog/content/images/2024/12/image-32.png 1032w"><figcaption><span style="white-space: pre-wrap;">???</span></figcaption></figure><p>The vehicle would still drive correctly. In fact, to make sure, let&apos;s leave that there. We&apos;ll put another one on the other side. For balance. And we&apos;ll also wire up the driver&apos;s seat.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/image-33.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="897" height="679" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/image-33.png 600w, https://brickadia.com/blog/content/images/2024/12/image-33.png 897w"><figcaption><span style="white-space: pre-wrap;">Here we go!</span></figcaption></figure><p>The driver sits on the left side, so they&apos;re not in danger of being hit by traffic. I&apos;m so glad we found a way to solve that design problem.</p><p>By the way, you don&apos;t have to use this big bulky engine if you don&apos;t want to. There is a small alternative that has all the same features.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/image-41.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="384" height="242"><figcaption><span style="white-space: pre-wrap;">Small wheel engine. Good for RC cars!</span></figcaption></figure><p>The engine gets very happy when we sit down in the seat and makes a noise. But we can&apos;t drive yet because we gave it no control over the wheels. </p><p>How do we do that? It&apos;s easy. The engine takes the seat&apos;s input signal and translates it to a wheel control signal that we can wire into the wheel joints.</p><p>Let&apos;s do that now.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/image-34.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="1122" height="1032" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/image-34.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/12/image-34.png 1000w, https://brickadia.com/blog/content/images/2024/12/image-34.png 1122w"><figcaption><span style="white-space: pre-wrap;">You only need to wire the engine&apos;s control signal to the wheels. I used rerouters to make it still look pretty with my very strange seat and engine locations.</span></figcaption></figure><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">Later, you will be able to pass that wheel control signal through other bricks before sending it to a wheel, such as the planned transmission brick which will give your engine gear-switching. This is what I mean when I say I want the system to be modular!</div></div><p>And now it drives!</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-vehicle-2" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-vehicle-2.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Off we go!</figcaption>
    </a>
    <div id="inline_catchup-1-vehicle-2" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-vehicle-2.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>And no, extremely keen eyed readers, you eyes are not deceiving you - the engine is calculating a steering box containing all the wheel joints and doing <a href="https://en.wikipedia.org/wiki/Ackermann_steering_geometry" rel="noreferrer">Ackermann Steering</a>, which reduces wheel slipping and is what you find on most vehicles in the real world:</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-ackmann" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-ackmann.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>An engine steers wheels depending on the turning circle, whose center can be adjusted via the Center of Steering.</figcaption>
    </a>
    <div id="inline_catchup-1-ackmann" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-ackmann.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>All this, too can be combined with wires. The engine is fully wire controllable!</p><h2 id="various-examples-1">Various Examples</h2><p>The testing team have built vehicles that are, somehow, even better than mine. Here are some videos of their adventures:</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-vehicle-showcase-4" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-vehicle-showcase-4.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Driving a familiar car in a town.</figcaption>
    </a>
    <div id="inline_catchup-1-vehicle-showcase-4" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-vehicle-showcase-4.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-vehicle-showcase-5" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-vehicle-showcase-5.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>A tank! Treads are not possible yet, but the engine can tank steer.</figcaption>
    </a>
    <div id="inline_catchup-1-vehicle-showcase-5" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-vehicle-showcase-5.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-vehicle-showcase-6" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-vehicle-showcase-6.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Donuts in the city.</figcaption>
    </a>
    <div id="inline_catchup-1-vehicle-showcase-6" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-vehicle-showcase-6.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-vehicle-showcase-7" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-vehicle-showcase-7.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Loopin&apos;!</figcaption>
    </a>
    <div id="inline_catchup-1-vehicle-showcase-7" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-vehicle-showcase-7.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-vehicle-showcase-1" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-vehicle-showcase-1.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Driving a jeep in the mountains as a client on day one that vehicles worked. The netcode has improved a lot since then and continues to!</figcaption>
    </a>
    <div id="inline_catchup-1-vehicle-showcase-1" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-vehicle-showcase-1.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<h1 id="other-stuff">Other Stuff!</h1><h2 id="procedural-brick-generation">Procedural Brick Generation</h2><p>I have just finished the brick composer, a dev tool we can use to create new procedural brick types.</p><p>Without going too deep into detail, the brick composer is able to take a few carefully made mesh parts parts in blender, like these:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/image-36.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="1644" height="983" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/image-36.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/12/image-36.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/12/image-36.png 1600w, https://brickadia.com/blog/content/images/2024/12/image-36.png 1644w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">The green sections are &quot;dynamic&quot; sections, for which we fit textures automatically.</span></figcaption></figure><p>And by arranging them and retexturing them, create a fully realized resizable brick.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-dyntexturer-1" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-dyntexturer-1.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Generates a picket fence of any length!</figcaption>
    </a>
    <div id="inline_catchup-1-dyntexturer-1" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-dyntexturer-1.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>This generator is super powerful. It can already be used to make all but 3 of the 28 procedural brick types currently in the game. Of that 25, 16 (including <em>all</em> of the micro-bricks) can be made simply by opening Blender, cutting up the default cube a little bit and throwing some Dyn texture markings on its faces:</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-dyntexturer-2" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-dyntexturer-2.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Generates a wedge from any size, with a sliced blender default cube as the only input!</figcaption>
    </a>
    <div id="inline_catchup-1-dyntexturer-2" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-dyntexturer-2.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>We plan to use it for many more bricks including the resizable slider joints.</p><h2 id="weapon-resources">Weapon Resources</h2><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2025/01/Untitled.jpg" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="2000" height="1600" srcset="https://brickadia.com/blog/content/images/size/w600/2025/01/Untitled.jpg 600w, https://brickadia.com/blog/content/images/size/w1000/2025/01/Untitled.jpg 1000w, https://brickadia.com/blog/content/images/size/w1600/2025/01/Untitled.jpg 1600w, https://brickadia.com/blog/content/images/2025/01/Untitled.jpg 2000w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Different types of ammo pickup.</span></figcaption></figure><p>Weapons now have a &quot;resources&quot; system.</p><p>There are several types of weapon ammo in Early Access:</p><ul><li><strong>Arrows</strong>, used for Bows and Crossbows.</li><li><strong>Black Powder</strong>, used for old timey weapons like the Flintlock Pistol.</li><li><strong>Explosive Ammo</strong>, used for the Rocket Launcher &amp; Grenade Launcher.</li><li><strong>Light Ammo</strong>, used for Pistols, SMGs and others.</li><li><strong>Medium Ammo</strong>, used for Assault Rifles, Machine Guns and others.</li><li><strong>Heavy Ammo</strong>, used for precision rifles.</li><li><strong>Magnum Ammo</strong>, used for Magnums, Revolvers, and the LAR.</li><li><strong>Plasma Ammo</strong>, used for heavy energy Sci-Fi weapons.</li><li><strong>Pulse Ammo</strong>, used for low energy Sci-Fi weapons.</li><li><strong>Shotgun Shells</strong>, used for shotguns.</li></ul><p>But the resource system is made in such a way that weapon resources aren&apos;t just limited to ammo. Weapons can have <em>individual<strong> </strong></em>resource values that they track to influence behavior - heat, charge, and more. There are no examples yet - for now, as a task, ammo is large enough.</p><h2 id="homing-missile">Homing Missile</h2><p>I saw a cool implementation of speed-conserving proportional navigation, a homing algorithm for projectiles, on the UE5 marketplace. It made me want to program my own from scratch, so here is Brickadia&apos;s very own homing missile in action:</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_catchup-1-homing-missile" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-homing-missile.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Aiming? What for?</figcaption>
    </a>
    <div id="inline_catchup-1-homing-missile" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/Catchup1/catchup-1-homing-missile.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<h2 id="speakers">Speakers</h2><p>These come with an audio component pre-attached. Get some tunes on!</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2024/12/image-44.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="931" height="858" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/image-44.png 600w, https://brickadia.com/blog/content/images/2024/12/image-44.png 931w"></figure><h2 id="pole-resizable-in-all-directions">Pole Resizable in All Directions</h2><p>I decided to unlock the pole&apos;s resizing and see what would happen. I expected the brick to break but with a few tweaks to the vertex count generation it&apos;s actually fine. So I&apos;ve left it unlocked:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2024/12/image-7.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="709" height="806" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/image-7.png 600w, https://brickadia.com/blog/content/images/2024/12/image-7.png 709w"></figure><h2 id="other-new-bricks">Other New Bricks</h2><p>We have (a few) new decorative bricks that don&apos;t do anything at all!</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/image.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="1341" height="802" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/image.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/12/image.png 1000w, https://brickadia.com/blog/content/images/2024/12/image.png 1341w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">A floor pattern made with the new round and inverted round.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/Brickadia-Win64-Shipping_CIdjfK5fR0.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/Brickadia-Win64-Shipping_CIdjfK5fR0.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/12/Brickadia-Win64-Shipping_CIdjfK5fR0.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/12/Brickadia-Win64-Shipping_CIdjfK5fR0.png 1600w, https://brickadia.com/blog/content/images/2024/12/Brickadia-Win64-Shipping_CIdjfK5fR0.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">A fence using the inverted round corners.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/Brickadia-Win64-Shipping_Ek3lo8nvYD.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="1728" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/Brickadia-Win64-Shipping_Ek3lo8nvYD.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/12/Brickadia-Win64-Shipping_Ek3lo8nvYD.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/12/Brickadia-Win64-Shipping_Ek3lo8nvYD.png 1600w, https://brickadia.com/blog/content/images/2024/12/Brickadia-Win64-Shipping_Ek3lo8nvYD.png 1728w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Some chocolate bars using the new ingot brick as segments.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/Brickadia-Win64-Shipping_Qm7FOeqkqV.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="1080" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/Brickadia-Win64-Shipping_Qm7FOeqkqV.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/12/Brickadia-Win64-Shipping_Qm7FOeqkqV.png 1000w, https://brickadia.com/blog/content/images/2024/12/Brickadia-Win64-Shipping_Qm7FOeqkqV.png 1080w"><figcaption><span style="white-space: pre-wrap;">A fridge using the coins and quarter rounds as food.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/image-35.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="1909" height="1087" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/image-35.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/12/image-35.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/12/image-35.png 1600w, https://brickadia.com/blog/content/images/2024/12/image-35.png 1909w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Frog????</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/UnrealEditor-Win64-DebugGame_DncIYDtgPo.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="1558" height="888" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/UnrealEditor-Win64-DebugGame_DncIYDtgPo.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/12/UnrealEditor-Win64-DebugGame_DncIYDtgPo.png 1000w, https://brickadia.com/blog/content/images/2024/12/UnrealEditor-Win64-DebugGame_DncIYDtgPo.png 1558w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Frog!!!!!!!!!!!!!!!!!!!</span></figcaption></figure><h2 id="skirts-and-dresses">Skirts and Dresses</h2><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/image-15.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="478" height="658"><figcaption><span style="white-space: pre-wrap;">The basic skirt from in front.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/image-16.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="433" height="639"><figcaption><span style="white-space: pre-wrap;">Behind.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/image-45.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="2000" height="1125" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/image-45.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/12/image-45.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/12/image-45.png 1600w, https://brickadia.com/blog/content/images/2024/12/image-45.png 2000w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Modern home, retro comforts.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/Brickadia-Win64-Shipping_1lrFka9csF.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="1132" height="1336" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/Brickadia-Win64-Shipping_1lrFka9csF.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/12/Brickadia-Win64-Shipping_1lrFka9csF.png 1000w, https://brickadia.com/blog/content/images/2024/12/Brickadia-Win64-Shipping_1lrFka9csF.png 1132w"><figcaption><span style="white-space: pre-wrap;">Peak performance.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/12/ss_2024-12-31_at_18.39.22.png" class="kg-image" alt="Devlog #7 - Wires, Vehicles, Next Fest &amp; More!" loading="lazy" width="1182" height="982" srcset="https://brickadia.com/blog/content/images/size/w600/2024/12/ss_2024-12-31_at_18.39.22.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/12/ss_2024-12-31_at_18.39.22.png 1000w, https://brickadia.com/blog/content/images/2024/12/ss_2024-12-31_at_18.39.22.png 1182w"><figcaption><span style="white-space: pre-wrap;">LET&apos;S GO!</span></figcaption></figure><h1 id="ok-thats-everything">OK, That&apos;s Everything</h1><p><a href="https://discord.gg/brickadia" rel="noreferrer">For more regular updates, join our Discord!</a></p>]]></content:encoded></item><item><title><![CDATA[Devlog #6 - Upgrading the Building System, Part 1]]></title><description><![CDATA[Resizing bricks while placing, easier reorienting, unified inventory, and a few more usability improvements for Early Access.]]></description><link>https://brickadia.com/blog/devlog-6/</link><guid isPermaLink="false">65b70c135d108b000717ca03</guid><category><![CDATA[Development]]></category><dc:creator><![CDATA[Sixmorphugus]]></dc:creator><pubDate>Tue, 26 Mar 2024 17:21:58 GMT</pubDate><media:content url="https://brickadia.com/blog/content/images/2024/03/Brickadia-Win64-Shipping_VGodTFb9o1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://brickadia.com/blog/content/images/2024/03/Brickadia-Win64-Shipping_VGodTFb9o1.jpg" alt="Devlog #6 - Upgrading the Building System, Part 1"><p>My favorite thing to do in Brickadia is watch other people build.</p><p>I&apos;m always interested to see the cool things people are making, but I&apos;m most interested in the techniques they use. How they make use of the tools we made - and how they don&apos;t. What I found out was in some cases surprising, and has fed into a lot of the new design decisions I&apos;ve made.</p><p>Before we go further, make sure you&apos;re not browsing on mobile data! Here&apos;s a table of contents for this post:</p><p><a href="#what-needs-improvement">What Needs Improvement?</a><br>	<a href="#resize-dragging-rather-than-row-dragging">Resize-Dragging rather than Row-Dragging</a><br>	<a href="#unusable-brick-reorientation">Unusable Brick Reorientation</a><br>	<a href="#no-visual-metrics">No Visual Metrics</a><br>	<a href="#bad-new-player-ux">Bad New Player UX</a><br>	<a href="#complicated-dual-inventory-system">Complicated Dual Inventory System</a><br>	<a href="#too-little-inventory-space">Too Little Inventory Space</a><br>	<a href="#unable-to-start-floating-builds">Unable to Start Floating Builds</a><br>	<a href="#more-extensibility-desired">More Extensibility Desired</a><br><a href="#rewrite-the-whole-building-system">Rewrite the whole building system??</a><br><a href="#upgrading-the-inventory">Upgrading the Inventory</a><br>	<a href="#extensible-inventory-slots">Extensible Inventory Slots</a><br>	<a href="#more-inventory-space">More Inventory Space</a><br>	<a href="#keeping-your-character-inventory">Keeping your Character Inventory</a><br>	<a href="#selecting-inventory-slots">Selecting Inventory Slots</a><br><a href="#upgrading-building">Upgrading Building</a><br>	<a href="#the-core">The Core</a><br>	<a href="#aligning-bricks-with-the-mouse">Aligning Bricks with the Mouse</a><br>	<a href="#placing-floating-bricks">Placing Floating Bricks</a><br>	<a href="#gizmos-and-the-preview-grid">Gizmos and the Preview Grid</a><br>	<a href="#dragging-brick-rows-old">Dragging Brick Rows (Old)</a><br>	<a href="#dragging-brick-rows-new">Dragging Brick Rows (New)</a><br>	<a href="#resize-dragging">Resize-Dragging</a><br>	<a href="#rotation-and-reorientation">Rotation and Reorientation</a><br>	<a href="#tool-widgets">Tool Widgets</a><br>	<a href="#tool-bind-hints">Tool Bind Hints</a><br>	<a href="#selection-highlighting">Selection Highlighting</a><br><a href="#more-to-come">More to Come!</a></p><h2 id="what-needs-improvement">What Needs Improvement?</h2><p>First, let&apos;s talk about what we can learn from how players built in Alpha 5, and how we can use that information to improve the tools for Early Access. </p><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">There are even more improvements coming, especially related to building physics contraptions. More on those in a future blog post!</div></div><h3 id="resize-dragging-rather-than-row-dragging">Resize-Dragging rather than Row-Dragging</h3><p>Years ago, we built Brickadia&apos;s original mouse building around point and click placement of bricks, and - as an afterthought intended for people making regular patterned things such as brick walls - made it so that if you click and move the mouse without releasing it, you drag out a row of bricks.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_a5-row-dragging" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-a5-row-dragging.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Building a brick wall with row dragging in Alpha 5.</figcaption>
    </a>
    <div id="inline_a5-row-dragging" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-a5-row-dragging.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>You can do the same thing with a brick template.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_a5-template-row-dragging" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-a5-template-row-dragging.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Building pillars with template row dragging in Alpha 5.</figcaption>
    </a>
    <div id="inline_a5-template-row-dragging" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-a5-template-row-dragging.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>This is super efficient for placing rows of the same brick.</p><p>Brickadia also supports resizing bricks. It&apos;s a separate tool, here.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2024/03/image-10.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-10.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/03/image-10.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/03/image-10.png 1600w, https://brickadia.com/blog/content/images/2024/03/image-10.png 1920w" sizes="(min-width: 1200px) 1200px"></figure><p>You can resize any brick to any valid size. If you like a certain size, you can pick it into the quickbar with Ctrl-MMB. You can have up to 10 bricks in your quickbar, which seems like enough for most tasks we can think of. And the resizer has quick binds for resizing to the minimum and maximum size:</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_resize-quickly" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-resize-quickly.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Extending a ramp by quick-resizing in Alpha 5.</figcaption>
    </a>
    <div id="inline_resize-quickly" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-resize-quickly.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>And so, our thinking went, now all our builders have everything they need to make cool structures quickly. We released these features in the Open Alpha. </p><p>Here&apos;s how people <em>actually</em> used them:</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_build-resize" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-build-resize.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>How many people build in Alpha 5.</figcaption>
    </a>
    <div id="inline_build-resize" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-build-resize.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>First, you place a very small brick. Usually a 2x2x2 micro brick, sometimes larger. It&apos;s the only thing that&apos;s useful to have in your quickbar with this style of building, <em>ever</em>. The size it needs to be is your lowest common denominator - the smallest gap you&apos;d ever need to fit it into, meaning smaller is better. Then, you switch to the resizer. You resize your very small brick to the size it <em>actually </em>needs to be. Then you start over.</p><p>At first this is clumsy. It feels bad. It feels like the game is broken. Slowly, though, you grow used to it. You bind the resizer to its own key. You go through this process tens of times, then hundreds of times, then thousands of times. It becomes muscle memory. You learn to do it without thinking. One building away, I&apos;m standing on a roof, watching you. Horrified.</p><p>The problem here is that our iterative improvements to the game created a contradictory user experience:</p><ul><li>The placer is designed for a building experience where players build things by arranging non-resizable shapes of different sizes.</li><li>Most of the bricks in Brickadia became dynamically resizable when the resizer was added in Alpha 4.</li></ul><p>These players aren&apos;t doing this constant switching between the Placer and the Resizer to be annoying contrarians. To actually be able to leverage the resizability of almost every brick in the game, they&apos;re forced to do it. The placer tool doesn&apos;t let them do so on its own. To add insult to injury, the resizer doesn&apos;t snap brick sizes to the current alignment grid, so if you want plate sized micro-bricks you&apos;re forced to strain your wrists doing it carefully.</p><p>Resizing bricks directly as you place them would make a lot more sense. In reality, there are many more cases where you&apos;d find it handy to resize a brick as you place, than cases where it&apos;s helpful to place a row of the same brick.</p><p>Therefore, clicking and dragging shouldn&apos;t default to row placing. It should place one brick, which resizes according to your drag. In addition, you should be able to resize the brick on all of the axes in one go, so you can make any size you want without ever needing the Resizer unless you want to modify an existing structure.</p><p>Obviously, the resizing should snap to the lines of the current placement grid too.</p><h3 id="unusable-brick-reorientation">Unusable Brick Reorientation</h3><p>This one is not that hard and we should have gotten it right the first time.</p><p>For most of Brickadia&apos;s lifespan it has been a pain to orient bricks to rotations where they are not upright. In Alpha 5, you do this using a horrible keybind called Cycle Brick Orientation (default keybind: Numpad /) that cycles through every possible brick orientation in an apparently random order;</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_horrible-reorient" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-horrible-reorient.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Cycling through brick orientations seemingly arbitrarily.</figcaption>
    </a>
    <div id="inline_horrible-reorient" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-horrible-reorient.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>You might notice I miss the orientation I wanted to stop at the first time and have to go through them all again. This is a result of years of training - most people miss the orientation they want at least twice.</p><p>This was actually an iterative improvement, because we only gave it a dedicated keybind in Alpha 5 - before then, you had to use advanced trickery with side studded bricks if you wanted to reorient a brick.</p><p>Let&apos;s get some insight into what&apos;s happening here. Brickadia stores which way your brick points in an enum (called EBrickDirection), with 6 possible values:</p><figure class="kg-card kg-code-card"><pre><code class="language-cpp">/** An axis aligned direction. */
enum class EBrickDirection : uint8
{
	X_Positive,
	X_Negative,
	Y_Positive,
	Y_Negative,
	Z_Positive,
	Z_Negative,
};</code></pre><figcaption><p><span style="white-space: pre-wrap;">EBrickDirection.</span></p></figcaption></figure><p>Cycle Brick Orientation might seem disordered, but it actually is ordered; it&apos;s going through the values of the EBrickDirection enum. This seemed like the way to go at the time, but the order it goes through orientations is actually so confusing that the Brickadia programmers are still the only people it makes sense to. </p><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">A big lesson you have to learn working on building games where world positions of objects are relevant to players is this: players will never be able to keep track of where north, east, south and west are the same way that they can keep track of up and down.</div></div><p>The fundamental problem is that it is meaningless to tell your players something is X+, Y-, etc, to try to come up with any &quot;natural&quot; order to cycle through the different directions, or to ask them to &quot;set a direction&quot; given a list like the one specified in EBrickDirection. You must let them <em>point </em>in a direction, and then resolve the axis and sign they wanted from that - you must translate how the user understands space to how the computer does.</p><h3 id="no-visual-metrics">No Visual Metrics</h3><p>In the same vein, it&apos;s quite strange that not just Brickadia, but so many advanced creation tools find it sufficient to simply display measurements for things only on the HUD, when you&apos;re doing something in the <em>world</em>.</p><p>I recently watched a GDC talk called <a href="https://www.youtube.com/watch?v=brByJ5EVBn4&amp;t=555s">Keeping Level Designers in the Zone Through Level Editor Design</a>, which for some reason is now unlisted. A lot of the talk is about texturing and pivots and other things not really relevant to Brickadia.</p><p>I found one specific point very interesting though: In Hammer, moveable brushes are positioned as boxes, where we instantly see the measurements of each edge displayed as text on that edge. Not as some &quot;X by Y by Z&quot; formatted size that we have no idea how to translate to the world. </p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-34.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="1468" height="874" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-34.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/03/image-34.png 1000w, https://brickadia.com/blog/content/images/2024/03/image-34.png 1468w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">A measurement for each axis displayed right in the world, in Hammer 2.</span></figcaption></figure><p>By comparison, the information Brickadia shows you when resizing a brick is completely worthless:</p><figure class="kg-card kg-image-card"><img src="https://brickadia.com/blog/content/images/2024/03/image-35.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="500" height="40"></figure><p>Clearly we can do better here, as well.</p><h3 id="bad-new-player-ux">Bad New Player UX</h3><p>The HUD meant to teach users how to use the Placer is, to put it bluntly, programmer UI:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-2.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="2000" height="1076" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-2.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/03/image-2.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/03/image-2.png 1600w, https://brickadia.com/blog/content/images/2024/03/image-2.png 2000w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Press E to strain your eyes.</span></figcaption></figure><p>It uses only text, and it doesn&apos;t include certain key functions, like picking, at all. It&apos;s hard coded to display the default keybind rather than displaying the currently bound key name. In a particularly egregious case - the detached mode controls - it simply tells you to move the brick by using &quot;Numpad&quot;.</p><p>In addition, prompts for keys aren&apos;t unified in any way. Down here is a little set of mystery icons meant to show new players how to open the inventory, use tools, use bricks etc, which <em>do</em> change to reflect your current bindings:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-3.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="352" height="310"><figcaption><span style="white-space: pre-wrap;">Press 1 to go hiking, B to buy Brickadia, T to see warnings, or H for a surprise.</span></figcaption></figure><p>Painting has its own style of control prompts again. These, again, don&apos;t change to reflect your key bindings, but do change contextually as you navigate the menu.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-4.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="420" height="590"><figcaption><span style="white-space: pre-wrap;">Top-down is a slightly nicer layout.</span></figcaption></figure><p>And like the Placer, these are missing things like fill paint, which people have requested me to add to the game at least 15 times not knowing it&apos;s already there (alt-click with the paint tool) because there&apos;s no hint.</p><p>In Early Access we should show control prompts in a way that is more prominent, digestible, consistent, complete and reactive.</p><h3 id="complicated-dual-inventory-system">Complicated Dual Inventory System</h3><p>This one was a little contentious. Basically, in Alpha 5, there are two character inventories. We have the brick inventory:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-11.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="1091" height="153" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-11.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/03/image-11.png 1000w, https://brickadia.com/blog/content/images/2024/03/image-11.png 1091w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">A brick inventory.</span></figcaption></figure><p>And the item inventory:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-12.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="1114" height="151" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-12.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/03/image-12.png 1000w, https://brickadia.com/blog/content/images/2024/03/image-12.png 1114w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">An item inventory.</span></figcaption></figure><p>This pretty much always confuses new players who don&apos;t realize that they have two inventories and need to use Ctrl+Q to switch between them. They should be merged into one inventory which can contain both bricks and items, like Minecraft, Space Engineers, Stardew Valley, or basically any other game do.</p><h3 id="too-little-inventory-space">Too Little Inventory Space</h3><p>The inventory needs more space than just the 10 slots if we want people creating RPGs, salvage gamemodes and other experiences! This is doubly necessary after the last change as items now share space with bricks. Something that has been requested a lot is more than one quickbar, which advanced users could find very helpful.</p><p>We can design things so that only the currently selected quickbar is considered for adding new items, eliminating cases where new users might otherwise &quot;lose&quot; an item in a different quickbar.</p><h3 id="unable-to-start-floating-builds">Unable to Start Floating Builds</h3><p>People often want to place things in mid air. Brickadia is supposed to be a game that is okay with you placing things in mid air. However, regardless of mode, the controls make this unreasonably hard. I always feel slightly embarrassed watching what people have to do to hoodwink the game into letting them do so.</p><p>To explain, let&apos;s say I want to start building an airship here:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/devlog-6-location.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/devlog-6-location.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/03/devlog-6-location.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/03/devlog-6-location.png 1600w, https://brickadia.com/blog/content/images/2024/03/devlog-6-location.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Say we want to build something above the lake here.</span></figcaption></figure><p>My best options are:</p><ul><li>Aiming at some wall on the ground, plane locking and aiming up (the fastest way, but don&apos;t tell the mouse mode haters).</li><li>Going into orbit mode on the ground and holding the &quot;move up&quot; button for an obnoxiously long time.</li><li>Going into detached mode on the ground and holding the &quot;move up&quot; button for an obnoxiously long time.</li></ul><p>You should just be able to position bricks in mid air at a set distance from your face. It should work like this: if you hold a &apos;float&apos; key while in mouse mode, your ghost brick starts hovering at its current distance. If you&apos;re aiming at something too far away (like the sky), it will hover at a preset default distance instead.</p><h3 id="more-extensibility-desired">More Extensibility Desired</h3><p>This final new requirement is that the building system should be implemented in a modular way. That means the core Placer code should do very little, almost all functionality should be inside modes which are added on to it. </p><p>We currently have three types of modes:</p><p><strong>Control Modes</strong> will implement the UX for handling user input and displaying output on the HUD. They will register a set of control hints to display on screen and can show or hide them from the HUD at any time.</p><p>We will continue to have three: Mouse, Orbit, and Detached mode. Implementing them as entire separate modes allows us to implement each mode more robustly as a state machine.</p><p><strong>Alignment Modes</strong> will decide the behavior of the placement grid in all cases. At present, we have Plate, Half, Fifth, Tenth, and Brick.</p><p>Later we might add new alignment modes, or better yet, let the player define their own alignment grids for certain building styles like cube terrain.</p><p>And finally, <strong>Placement Modes</strong> will decide placement behavior. At present, we have Resize-Drag and the old Row-Drag.</p><p>Future placement modes could include a Circle-Drag or Frame-Drag. The way the system is designed will make it easy to extend, and all placement modes will work in all control modes.</p><p>We have our work cut out for us. Time to rewrite the whole building system!</p><h2 id="rewrite-the-whole-building-system">Rewrite the whole building system??</h2><p>There are many reasons we chose to rewrite the building mechanics in this case, even though we want to release the game some time this year still:</p><ul><li>The code for both the old inventory and building systems is almost entirely written in Blueprint prototypes (Unreal Engine&apos;s artist targeted visual scripting language), because we didn&apos;t really know what we were doing back then. Over the years this turned into literal spaghetti code, Blueprints are incredibly slow to refactor, cannot merge or version properly because of binary files, and there are no good tools to edit them other than Unreal&apos;s very clunky editor.</li><li>There are now special bricks and other objects such as physics joints that you can place. Many of them need custom placement behavior. With the old Blueprint code, this was impossible to do in a reasonable way because the code is <em>highly specialized to ordinary bricks</em>.</li><li>Important parts of the inventory system&apos;s &quot;state&quot;, such as the brick inventory in its entirety and the current selected slot, were stored entirely client-side. This meant the server could never do things like know what bricks you have or what you have selected. This prevented us from implementing many long-desired features such as letting you put prefabs from the Gallery (more on that in later posts) in your quickbar.</li><li>There was no modularity or real separation of the control modes (mouse, orbit, detached) and shared behaviors (alignment grid). Everything was either implemented multiple times for each case, or done by a shared function that had to be branch-heavy to the point of unreadability because of all the special cases. Nobody knows what parts you&apos;d have to change to do X! And even if someone did...</li><li>The blueprints were impossible to navigate and maintain, because there were <em>so many</em> functions and variables, and you can only view one at a time:</li></ul><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/brblog_buildingmanager.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="1712" height="1164" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/brblog_buildingmanager.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/03/brblog_buildingmanager.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/03/brblog_buildingmanager.png 1600w, https://brickadia.com/blog/content/images/2024/03/brblog_buildingmanager.png 1712w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">The building manager is perhaps not the worst Blueprint ever made, but pretty hard to work with.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-36.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="1959" height="945" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-36.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/03/image-36.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/03/image-36.png 1600w, https://brickadia.com/blog/content/images/2024/03/image-36.png 1959w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Blueprints are great for making simple logic take incredibly long to read.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-37.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="2000" height="1140" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-37.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/03/image-37.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/03/image-37.png 1600w, https://brickadia.com/blog/content/images/2024/03/image-37.png 2117w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">I hate working on these so badly.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-38.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="2000" height="762" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-38.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/03/image-38.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/03/image-38.png 1600w, https://brickadia.com/blog/content/images/2024/03/image-38.png 2153w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Feels more like playing a game of Factorio than code.</span></figcaption></figure><p>Why didn&apos;t we just buckle down and try extending this rather than a rewrite? Well, we sort of did, but it quickly became obvious it wasn&apos;t the way to go.</p><p>If you&apos;ve been following the project for a while, you may have seen the recent Ferris wheel video in our #dev-media <a href="https://discord.com/invite/brickadia">Discord</a> channel, and the not-so-recent <a href="https://www.youtube.com/watch?v=_S9OfbkGH-c">Physics Trailer</a>. Those were made with prototype tools that were created by modifying (bodging) the building manger. And those prototype tools were not very good.</p><p>Here&apos;s me trying to build the Ferris wheel with them <em>again</em>, as a demonstration of how terrible it was the first time:</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_holy-hinge" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-holy-hinge.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Aligning the hinges. Only takes about a day each.</figcaption>
    </a>
    <div id="inline_holy-hinge" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-holy-hinge.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_holy-hinge-2" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-holy-hinge-2.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Aligning something on the hinge is even worse.</figcaption>
    </a>
    <div id="inline_holy-hinge-2" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-holy-hinge-2.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>All the problems worked together to make the prototype UX this bad. It was slow for Zeblote to work with, and he had to really fight the fact that the building manager is written only for bricks, and has spaghetti-like code that is essentially working for every one of the neatly separated &quot;modes&quot; we designed above at once. Even if it were fully written in C++, this would have been very tiresome and resulted in wiping out most of the original code either way.</p><p>At the end of the day, addressing this kind of technical debt is something that just can&apos;t wait. </p><p>So let&apos;s get it done!</p><h2 id="upgrading-the-inventory">Upgrading the Inventory</h2><p>Firstly, you will often see me use the expression &quot;the inventory&quot;. But in Brickadia, at least in the Open Alpha, you really had <em>three </em>inventories: the Item Inventory, the Brick Inventory (client side only), and the Tool Inventory.</p><p>The <strong>Item Inventory</strong> lives on your character. It defines what appears in the quickbar, and in Alpha 5 it can only contain items. Because the character inventory lives on your character, it&apos;s fully lost when you die.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-19.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="1461" height="182" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-19.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/03/image-19.png 1000w, https://brickadia.com/blog/content/images/2024/03/image-19.png 1461w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">The character inventory filled with guns.</span></figcaption></figure><p>The <strong>Brick Inventory</strong> holds all the bricks you want to build with.</p><p>This inventory has a special extra slot in it called the TEMP slot. Something can be held in it temporarily, until you switch to another slot, at which point the TEMP slot is destroyed. This was mainly used for picking bricks from the world.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-20.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="1614" height="861" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-20.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/03/image-20.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/03/image-20.png 1600w, https://brickadia.com/blog/content/images/2024/03/image-20.png 1614w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Temp-placing a pumpkin.</span></figcaption></figure><p>The <strong>Tool Inventory</strong> lives on your player controller, which can be seen as the &quot;soul&quot; that inhabits characters you control in Brickadia. Unlike the character, it&apos;s not recreated when you respawn - it&apos;s created once when you join a game, and deleted only when you leave. In addition, the tool inventory being here means you <em>don&apos;t</em> lose your tools when your character dies - they&apos;re kept.</p><p>We display the tool inventory via the tool pie menu:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-21.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="846" height="872" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-21.png 600w, https://brickadia.com/blog/content/images/2024/03/image-21.png 846w"><figcaption><span style="white-space: pre-wrap;">The tool inventory.</span></figcaption></figure><p>The tool inventory can technically be edited by game modes, which will change what&apos;s in the pie menu! There&apos;s no particular reason it can&apos;t contain guns or, in the case of our new inventory changes, bricks. We just haven&apos;t added a way to do so.</p><h3 id="extensible-inventory-slots">Extensible Inventory Slots</h3><p>In Alpha 5, inventory entries <em>always </em>store references to item actors. The game spawns item actors in the world when they are added to someone&apos;s inventory and hides them under the map until they&apos;re held, at which point it welds them to that player&apos;s hand(s) and plays any relevant animations.</p><p>We can visualise that inventory design like this:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-27.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="1130" height="180" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-27.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/03/image-27.png 1000w, https://brickadia.com/blog/content/images/2024/03/image-27.png 1130w"><figcaption><span style="white-space: pre-wrap;">An inventory in Alpha 5.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-29.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="799" height="365" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-29.png 600w, https://brickadia.com/blog/content/images/2024/03/image-29.png 799w"><figcaption><span style="white-space: pre-wrap;">How that inventory is stored: Inventory entries point directly to item instances.</span></figcaption></figure><p>You will notice it seems like this can&apos;t support bricks, even though we had a Brick Inventory in Alpha 5. That&apos;s exactly right! Alpha 5 only works because the Brick Inventory in Alpha 5 isn&apos;t real. It&apos;s a bunch of Blueprint hell where we create 11 widgets and store a brick reference on each one, and the UI widget calls a function on the building manager to change the current brick being placed. Which means the server has no idea, or authority over, what bricks you have!</p><p>The first thing we are going to do to fix this is throw out this separate, &quot;fake&quot; Brick Inventory and merge it into the Character Inventory. To do that we&apos;ll need to adapt our inventory to store bricks in it, which means we need a layer of indirection between the inventory and the different things you can store in it. Like this:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-18.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="1641" height="562" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-18.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/03/image-18.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/03/image-18.png 1600w, https://brickadia.com/blog/content/images/2024/03/image-18.png 1641w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">The slots can now hold arbitrary things.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-30.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="1611" height="458" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-30.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/03/image-30.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/03/image-30.png 1600w, https://brickadia.com/blog/content/images/2024/03/image-30.png 1611w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Here&apos;s what&apos;s going on under the hood now.</span></figcaption></figure><p>Entries point to an item that should be put in the player&apos;s hand when that entry is selected. As selecting a brick still needs to put the placer in your hand, we&apos;ll do something broadly the same as what A5 did - we&apos;ll create a placer instance with every player that joins the server, and put it in their hand when they have any brick selected in the quickbar.</p><h3 id="more-inventory-space">More Inventory Space</h3><p>Currently, our quickbar widget can only ever view the first 10 slots of the inventory - adding more doesn&apos;t work. But we can upgrade it to view specific ranges instead.</p><p>Here&apos;s what we do: When the widget is initialized, it takes the total inventory size and divides it by 10 to compute the quickbar count (i.e. 10). Now, you can switch between quickbars in order by CTRL-scrolling:</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_quickbar_scrolling" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-quickbar_scrolling.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Switching between quickbars.</figcaption>
    </a>
    <div id="inline_quickbar_scrolling" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-quickbar_scrolling.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>Or, you can press CTRL-[0-9] to go directly to a specific quickbar:</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_quickbar-quick-switching" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-quickbar-quick-switching.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Quick-switching between quickbars.</figcaption>
    </a>
    <div id="inline_quickbar-quick-switching" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-quickbar-quick-switching.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<h3 id="keeping-your-character-inventory">Keeping your Character Inventory</h3><p>Doing all this has foregrounded an issue that already existed and was quite annoying in Brickadia&apos;s creative mode - when you die, either by physics damage or self destructing for a joke, your character inventory is cleared. The new problem? This now clears all the bricks in your inventory, too.</p><p>To fix this, I&apos;ve added one more new feature: Keep Inventory. If you are in a minigame where this is on, or if you are not in a minigame at all, this feature will cause your inventory to be copied to your new character when you die. This means you don&apos;t lose your bricks, or any guns you spawned in for fun.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_inventory-saving" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-inventory-saving.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>If you die outside a minigame, you keep your character inventory.</figcaption>
    </a>
    <div id="inline_inventory-saving" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-inventory-saving.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<h3 id="selecting-inventory-slots">Selecting Inventory Slots</h3><p>This mostly only exists for historical reasons at this point, but it seemed like an interesting tidbit nonetheless. When we were setting up the inventory system years ago, we wanted client side prediction for switching and firing weapons.</p><p>That meant the slot selection had to be routed through the character movement component in Unreal Engine. This wasn&apos;t easily extensible, but we had one free byte that could be used.</p><p>How do we select something out of two inventories and a TEMP slot using a single byte? Simple, we encode the current inventory selection in an <strong>int8</strong> - a signed integer with 256 possible values, ranging from -128 to 127 - which we call an inventory index. We map inventory slots to the index like this:</p><ul><li>0 is a special case. It means the player sending this index is not holding anything from any inventory.</li><li>-1 is a special case. It means the player sending this index is holding whatever is in the TEMP slot.</li><li>1 to 100 select inventory items from the character inventory - you can get the index of the item in the character inventory by subtracting 1.</li><li>-2 to -101 to select inventory items from the tool inventory - you can get the index of the item in the character inventory by removing the sign, then subtracting 2.</li></ul><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-26.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="2000" height="585" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-26.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/03/image-26.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/03/image-26.png 1600w, https://brickadia.com/blog/content/images/2024/03/image-26.png 2017w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Helpful diagram of how inventory indexes map to entries in the inventories.</span></figcaption></figure><p>This fits 126 entries in each inventory, of which we&apos;ll only use 100.</p><h2 id="upgrading-building">Upgrading Building</h2><p>Building has now been mostly rewritten in C++. It&apos;s nicely modularized and much easier to extend and debug. Here are the cliff notes of how it works!</p><h3 id="the-core">The Core</h3><p>With a lot of checking back to the building manager, I started by making the Placer&apos;s core - its state machine for the control mode, as well as selection for the alignment and placement modes.</p><p>Things that work exactly the same way in every mode can be implemented on the Placer itself, so we&apos;ll implement the controls to switch between placement and alignment modes here. C switches alignment mode, J switches placement mode. Holding C selects the special &quot;super&quot; alignment mode.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-32.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="1926" height="1120" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-32.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/03/image-32.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/03/image-32.png 1600w, https://brickadia.com/blog/content/images/2024/03/image-32.png 1926w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Wait, this is just a picture of someone holding a placer while nothing happens.</span></figcaption></figure><p>Of course, even though you can select bricks from the Quickbar, you can&apos;t actually place a brick yet at all. Or see anything happening when you swap the modes. We&apos;re about to get to that. Starting with...</p><h3 id="aligning-bricks-with-the-mouse">Aligning Bricks with the Mouse</h3><p>The second most complicated part of building is the code that uses the position of your mouse to determine where the brick you&apos;re aiming should go. It seems trivial but it&apos;s not. The tool trace hit position must be resolved into a brick placement location, where:</p><ol><li>The resulting placement must be positioned on the grid that was intersected, or if none the global brick grid (and the placement preview should parent itself to that brick grid, so there&apos;s no jittering if that grid is a moving vehicle);</li><li>The resulting placement must not be positioned in a way that causes it to intersect the surface it was aimed at;</li><li>The resulting placement must treat hidden or noncollided bricks like regular bricks;</li><li>The resulting placement must respect the placement alignment grid, meaning that the placement&apos;s edges must be aligned to a minimum of 3 faces of one of the alignment grid cells it lies inside (which is why bricks smaller than the alignment grid align themselves to corners);</li><li>That alignment grid&apos;s origin and oriented cell size must first be resolved from considering the orientation of any hit anchors (such as studs or stud inlets) or else the orientation of the surface on the brick that was hit by our raycast - i.e. if you aim at the side of a reoriented brick, or a stud grid, you get a rotated alignment grid;</li><li>The resulting placement should also <em>orient</em> itself to any anchors (such as studs or stud inlets) unless a specific direction is requested - i.e if you aim at side studs and you haven&apos;t manually set your direction, your brick should turn sideways to place on it, and;</li><li>The specified user rotation, and, if set, direction, should otherwise always be respected.</li></ol><p>In other words, firing the correct raycast given the position of the cursor is the easy part.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_raycast-positioning-fail" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-raycast-positioning-fail.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>How the brick would position itself if we merely fired a raycast.</figcaption>
    </a>
    <div id="inline_raycast-positioning-fail" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-raycast-positioning-fail.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>How do we tackle this?</p><p>Let&apos;s start by grabbing a bit of information from our hit result. We&apos;ll grab:</p><ul><li>The brick grid we hit, or global if we hit the map.</li><li>The EBrickDirection of any anchor (stud or inlet) we hit, or the global up direction (Z+) if we didn&apos;t hit any.</li><li>The type of anchor we hit, or none if we didn&apos;t hit one.</li></ul><p>We can already compute our alignment grid&apos;s origin and cell size from this information combined with our current alignment mode. The origin is the position of any anchor we hit (or the brick grid&apos;s position if we didn&apos;t hit one), and the cell size is our alignment mode&apos;s cell size rotated to our up direction.</p><p>We can now snap our brick to some kind of grid and rotate it to anchors&apos; orientation.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_grid-snap-1" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-grid-1-v2.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>See? Our 2x micro cube snaps to the grid! We did it, guys! We made building! Don&apos;t ask why I&apos;m suddenly using a 2x micro cube!</figcaption>
    </a>
    <div id="inline_grid-snap-1" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-grid-1-v2.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>But of course, as soon as we try to place something other than a 2x2 micro brick, it&apos;s obvious that something is still very wrong - even when we align the placement point to the grid, the brick ends up wrongly positioned.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_grid-snap-2" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-grid-2.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Oh...</figcaption>
    </a>
    <div id="inline_grid-snap-2" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-grid-2.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>Positioning the brick properly requires understanding that what we are placing is not a point, but a box with a size. Placing it like that means we can use the box extents to de-penetrate it from the surface we hit and the nearest 3 grid cell faces, which gives us <em>way</em> better results:</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_grid-snap-3" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-grid-3.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Placing the brick as a box. Now it does work for most bricks.</figcaption>
    </a>
    <div id="inline_grid-snap-3" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-grid-3.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>And because of what we did before, it&apos;ll even rotate to face away from studs or towards inlets.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_grid-snap-4" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-grid-snap-4.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>The brick rotates away from studs, and towards inlets.</figcaption>
    </a>
    <div id="inline_grid-snap-4" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-grid-snap-4.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>Unfortunately, it&apos;s still a bit difficult to work with. To explain why, let me demonstrate with this extremely long, tall ramp.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_grid-snap-5" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-grid-snap-5-v2.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Notice how it&apos;s impossible to place this at the end on its inlet - without a feature like plane lock, which we don&apos;t currently have.</figcaption>
    </a>
    <div id="inline_grid-snap-5" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-grid-snap-5-v2.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>This isn&apos;t very usable for building with unless I&apos;m placing it on the floor of the map. For most other use cases, like placing them corner to corner, I need the origin to be where the stud inlet is. I need a <em>pivot.</em></p><p>So let&apos;s upgrade our size to a full pivot - a box with a relative offset and a size that is calculated <em>within</em> the bounds of the brick being placed. We can use the existing code from the old building system, which per-calculates several of these, and we can choose a pivot to use based on what our ray cast hit. We&apos;ll add:</p><ul><li>A &quot;Bottom Studs&quot; pivot, which records the location and size of the first found bottom stud grid. We&apos;ll choose this one for aligning to top studs.</li><li>A &quot;Top Studs&quot; pivot, which does the same for the first found top stud grid. We&apos;ll choose this one for aligning to bottom studs.</li><li>An &quot;Expanded Studs&quot; pivot, which takes the top studs pivot and expands it to the other end of the brick. We&apos;ll choose this one if we&apos;re aligning to the side of a brick with our rotation or aligning against the map, since it helps us cull parts of the brick from the placement calculation that are irrelevant.</li><li>A &quot;Bounds&quot; pivot, which when used produces behavior identical to what we were doing before we used pivots - an unmoved bounding box that encapsulates the entire brick. We&apos;ll only choose this one if we&apos;re aligning to the side of a brick with a different rotation to our previewed one, and we can&apos;t reorient to match it. We can also use it for other placement calculations, such as the origin of the brick in the next section.</li></ul><p>All sorted!</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_long-triangle" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-long-triangle.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Now we can build our long triangle.</figcaption>
    </a>
    <div id="inline_long-triangle" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-long-triangle.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>Knowing where the stud grids are also lets us do stuff like this.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_grid-snap-6" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-grid-snap-6.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>The turkey has studs on its sides, so when you point at an inlet it rotates sideways.</figcaption>
    </a>
    <div id="inline_grid-snap-6" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-grid-snap-6.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>And even if we locked the orientation, we can still line things up relative to the brick being placed on.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_grid-snap-7" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-grid-snap-7.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>When we point at a brick placed sideways, we place on a rotated plate grid, so we can better align to it in that surface&apos;s units.</figcaption>
    </a>
    <div id="inline_grid-snap-7" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-grid-snap-7.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<h3 id="placing-floating-bricks">Placing Floating Bricks</h3><p>We wanted a floating placement mode that lets you place your brick in front of your face while holding ALT.</p><p>We can do that fairly easily - take the origin and direction of the cursor ray and the distance from it of the current preview brick (or a sensible default distance if there is none) and compute a location. Now, continuously move the brick&apos;s origin to the grid cell nearest to that location:</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_float-1" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-float-1.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>It just floats in front of your face.</figcaption>
    </a>
    <div id="inline_float-1" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-float-1.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>We can improve it further by binding the mouse wheel to changing the distance, so you can move the brick closer or further away.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_float-2" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-float-2.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Threading the needle?</figcaption>
    </a>
    <div id="inline_float-2" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-float-2.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<h3 id="gizmos-and-the-preview-grid">Gizmos and the Preview Grid</h3><p>You&apos;ve been seeing a grid in the last few videos. That grid is not the same one from Alpha 5 - it&apos;s been re-implemented as something called a gizmo.</p><p>A gizmo is a rendered element that provides interactivity and/or feedback when working with 3D scenes. You may have seen these before:</p><figure class="kg-card kg-image-card"><img src="https://brickadia.com/blog/content/images/2024/03/unnamed.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="512" height="265"></figure><p>These are common gizmos you&apos;ll find in engines like Unity and Unreal, as well as modelling tools like Blender. And soon you&apos;ll find them in Brickadia. But more on that in another post.</p><p>Unreal&apos;s <a href="http://www.gradientspace.com/tutorials/2022/6/1/the-interactive-tools-framework-in-ue5">Interactive Tools Framework</a> provides an entire system for displaying arbitrary gizmos at runtime, and previously, Zeblote has done work that allows me to draw things in the engine&apos;s Editor compositing layer at runtime too. It only makes sense to make some use of it!</p><p>I started by creating a gizmo manager which we&apos;ll provide with some materials to draw gizmos with. You can register gizmos with it, and gizmos are allowed both to control actors, and do manual drawing with ITF&apos;s gizmo elements. Let&apos;s do some quick testing to make sure it can be configured to draw things on top of everything else:</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_gizmo-february" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-gizmo-february.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>3d arrow gizmo in the world!</figcaption>
    </a>
    <div id="inline_gizmo-february" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-gizmo-february.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<h3 id="dragging-brick-rows-old">Dragging Brick Rows (Old)</h3><p>Do you remember when I said that previewing brick placements was the second most complicated part of building? This is the <em>most </em>complicated part. We need to determine, with only a world start location and a camera angle as our inputs, which direction the player wants to drag their brick row - up, down, north, east, south, or west - and how long they want it to be. To recap:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-40.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-40.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/03/image-40.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/03/image-40.png 1600w, https://brickadia.com/blog/content/images/2024/03/image-40.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Dragging a row of 6 bricks on the ground in Alpha 5.</span></figcaption></figure><p>In Alpha 5, we already had an algorithm to do so that worked roughly like the following steps: </p><p>1. We convert everything to local space relative to the position the row starts at. From there, imagine lines extending in the direction of the 3 axes. The crosshair can be converted to a ray from the camera origin into the world.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-5.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="1222" height="1091" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-5.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/03/image-5.png 1000w, https://brickadia.com/blog/content/images/2024/03/image-5.png 1222w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Coordinate axis cross, with our camera ray going diagonally.</span></figcaption></figure><p>2. Now, we construct 3 axis aligned planes between each pair of axes, then intersect our ray with each of them. This gives us up to 3 intersection points.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-6.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="1200" height="1054" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-6.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/03/image-6.png 1000w, https://brickadia.com/blog/content/images/2024/03/image-6.png 1200w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">The ray passes through 1, 2, or 3 planes, or 0 if you&apos;re looking away.</span></figcaption></figure><p>3. For each plane, we determine how close the intersection point is to the axes.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-7.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="764" height="752" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-7.png 600w, https://brickadia.com/blog/content/images/2024/03/image-7.png 764w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Two candidate distances from the first plane hit.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-41.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="1213" height="941" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-41.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/03/image-41.png 1000w, https://brickadia.com/blog/content/images/2024/03/image-41.png 1213w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Two more candidates from the second plane hit.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-8.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="1135" height="1101" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-8.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/03/image-8.png 1000w, https://brickadia.com/blog/content/images/2024/03/image-8.png 1135w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Two more candidates from the third plane hit.</span></figcaption></figure><p>4. From these, we select the intersection point that is closest to an axis overall. The nearest axis will then be used to drag along.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-9.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="1637" height="961" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-9.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/03/image-9.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/03/image-9.png 1600w, https://brickadia.com/blog/content/images/2024/03/image-9.png 1637w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">The hit closest to an axis was on the second plane, and then we select the axis.</span></figcaption></figure><p>5. From there, we simply have to snap the distance along the selected axis to the grid cell size and return the result.</p><p>This algorithm produced mostly sensible results in most cases, and worked well enough for the Alpha. However, there are many annoying edge cases that we could never figure out how to solve with this approach, such as:</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_drag-mystery" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-drag-mystery.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Mysterious flip-flopping between the axes at certain angles.</figcaption>
    </a>
    <div id="inline_drag-mystery" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-drag-mystery.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_drag-mystery-2" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-drag-mystery-2.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>The row sometimes ends up longer or shorter than you expect, or snaps.</figcaption>
    </a>
    <div id="inline_drag-mystery-2" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-drag-mystery-2.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-42.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-42.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/03/image-42.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/03/image-42.png 1600w, https://brickadia.com/blog/content/images/2024/03/image-42.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">But I wanted it to go left, not in my face...</span></figcaption></figure><h3 id="dragging-brick-rows-new">Dragging Brick Rows (New)</h3><p>The problem is this existing algorithm is not very good at the transitions between planes. It constantly annoyed us by randomly jumping around as it selected a different plane to be closer and produced unintuitive results. So after I pushed the first building changelist, Zeblote rewrote this function to select the closest axis to your cursor in screen space instead.</p><p>1. We start with the same axes and crosshair:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-43.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-43.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/03/image-43.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/03/image-43.png 1600w, https://brickadia.com/blog/content/images/2024/03/image-43.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Visualizing the 3 axes leading from the drag starting position as yellow lines in the world.</span></figcaption></figure><p>2. We project those world-space lines to screen-space lines. This sounds trivial at first, since Unreal Engine already provides a <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Runtime/Engine/Kismet/UGameplayStatics/ProjectWorldToScreen">ProjectWorldToScreen</a> function. All we need to do is pick two points on the line (such as the origin and one unit away) and we&apos;ll have screen space points defining our line in 2D.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-44.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-44.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/03/image-44.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/03/image-44.png 1600w, https://brickadia.com/blog/content/images/2024/03/image-44.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Screen space lines representing the axes overlaid in red.</span></figcaption></figure><p>However, there&apos;s a problem with that approach. In some cases, you might want to start dragging a row and then move or turn your camera far away, until the start point of the line is no longer on screen at all. This then breaks the projection.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-45.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-45.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/03/image-45.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/03/image-45.png 1600w, https://brickadia.com/blog/content/images/2024/03/image-45.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">We can&apos;t project the origin point to screen.</span></figcaption></figure><p>So we need a more robust way to construct screen space lines. There is a simple solution in theory, we need to find two points on the axis that are actually on screen, but how can we do that reliably?</p><p>One way is to clip the line inside the view frustum, so we end up with a line segment that is entirely on screen. In the above image, this would effectively select the point at the bottom left corner and the point at the horizon.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-46.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-46.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/03/image-46.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/03/image-46.png 1600w, https://brickadia.com/blog/content/images/2024/03/image-46.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Successfully projected the line segment inside the view frustum to screen space.</span></figcaption></figure><p>We can then extend the line segment again to make sure it reaches the edges.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-47.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-47.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/03/image-47.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/03/image-47.png 1600w, https://brickadia.com/blog/content/images/2024/03/image-47.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Screen space line with off-screen origin constructed successfully.</span></figcaption></figure><p>3. We select the line that is closest to the cursor in screen space. This effectively divides the screen into up to 6 zones that will select one of the axes, but they&apos;re not necessarily the same size.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-48.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-48.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/03/image-48.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/03/image-48.png 1600w, https://brickadia.com/blog/content/images/2024/03/image-48.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Pick the closest points to the crosshair on each axis, and see how far away they are.</span></figcaption></figure><p>4. There&apos;s an additional filter to reject axes that are very steep when multiple axes are near the crosshair at the same time. This fixes the issue of extending the row into your face when you are looking at the brick from a steep angle.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-49.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-49.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/03/image-49.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/03/image-49.png 1600w, https://brickadia.com/blog/content/images/2024/03/image-49.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">The steep axis got filtered out as there&apos;s a more likely intended one close enough to the crosshair.</span></figcaption></figure><p>5. Once we have our chosen point on the screen space line, we need to convert it back to a world space point so we can calculate how far along on the axis it actually is. We could attempt to do some linear algebra here, to figure out what distance along the screen space line equals what distance along the world space axis, but that seems annoying given the perspective view.</p><p>So we just use the existing <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Runtime/Engine/Kismet/UGameplayStatics/DeprojectScreenToWorld">DeprojectScreenToWorld</a> function in the engine to construct a ray from the camera origin going into the scene. By finding the closest point on the world space axis to this ray, we&apos;ve finally got the point we wanted. What an ordeal!</p><p>Also, there&apos;s one more edge case to take care of, if we&apos;re looking away from the axis (even though it is on screen), that trick won&apos;t work, because the ray will diverge from the axis. So we detect that special case and just drag a row to the maximum length along the chosen axis.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-50.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-50.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/03/image-50.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/03/image-50.png 1600w, https://brickadia.com/blog/content/images/2024/03/image-50.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">The final special case for the screen space axis selection.</span></figcaption></figure><p>Once we picked an axis and world space point, we figure out the row length the same way as before, and we finally have row dragging working again. It&apos;s much more robust now, and the edge cases we had above no longer happen.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_row-drag-1" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-row-drag-1.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Dragging a row.</figcaption>
    </a>
    <div id="inline_row-drag-1" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-row-drag-1.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>It&apos;s trivial to add in spacing too.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_row-drag-2" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-row-drag-2.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Dragging a row with spacing.</figcaption>
    </a>
    <div id="inline_row-drag-2" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-row-drag-2.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>But we&apos;re not done yet - Let&apos;s take advantage of our gizmo system to display a line on top of everything showing the drag start point and both ends of the row. Near the active end, we&apos;ll display a row length in-world.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_row-drag-3" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-row-drag-3-v2.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>The gizmo shows us how long the brick row is in bricks without having to count.</figcaption>
    </a>
    <div id="inline_row-drag-3" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-row-drag-3-v2.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<h3 id="resize-dragging">Resize-Dragging</h3><p>Resize dragging is a simple extension to row dragging, it mainly involved changes to the very last part of the row dragging math. Instead of resizing the brick in increments of the brick size, as if we were row dragging, we resize in increments of the alignment grid size, skipping increments that don&apos;t line up with valid dimensions for the brick type. That means we resize on our grid, like this:</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_resize-drag-1" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-resize-drag-1.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Resize dragging from the 4x cube with a plate grid.</figcaption>
    </a>
    <div id="inline_resize-drag-1" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-resize-drag-1.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>We can still resize in increments of the brick size, if we change the grid size:</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_resize-drag-2" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-resize-drag-2.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Resize dragging from the 4x cube with a 4 stud grid size.</figcaption>
    </a>
    <div id="inline_resize-drag-2" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-resize-drag-2.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>One note; we need a special case if the brick&apos;s starting size does not entirely fill the grid cells it&apos;s in. In this case, for the first increment we want to size it up <em>slightly less</em>, so we only resize up to the grid line:</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_resize-drag-3" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-resize-drag-3-v2.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Resize dragging micro bricks, snapped to a plate grid.</figcaption>
    </a>
    <div id="inline_resize-drag-3" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-resize-drag-3-v2.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>But what use is being able to resize only in one direction? Let&apos;s quickly add the support for switching axis with RMB. The row dragging math only needs a few more branches to filter out axes that we&apos;ve already locked in.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_resize-drag-4" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-resize-drag-4-v2.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Resize dragging a brick in multiple dimensions.</figcaption>
    </a>
    <div id="inline_resize-drag-4" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-resize-drag-4-v2.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_resize-drag-5" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-resize-drag-5-v2.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Resize dragging micro-bricks in multiple dimensions.</figcaption>
    </a>
    <div id="inline_resize-drag-5" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-resize-drag-5-v2.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">Note how now, for plate-sized bricks, the row lengths are displayed in brick units. In addition, we&apos;ve improved the plate size format to display the brick and plate heights separately - 5+1f, not 16f.</div></div><p>We can easily allow this in row dragging mode too to create &quot;grids&quot; and &quot;volumes&quot; - 3d grids of the same brick with arbitrary spacing.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_resize-drag-6" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-resize-drag-6-v2.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Row dragging a lattice in multiple dimensions.</figcaption>
    </a>
    <div id="inline_resize-drag-6" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-resize-drag-6-v2.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<h3 id="rotation-and-reorientation">Rotation and Reorientation</h3><p>It&apos;s easy to make tapping R rotate our brick clockwise, as before. But remember how we wanted to reorient bricks to the closest direction to the cursor? Well, that&apos;s exactly half of how row-dragging and resize-dragging already work.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/bricks_rendered-1.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="690" height="500" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/bricks_rendered-1.png 600w, https://brickadia.com/blog/content/images/2024/03/bricks_rendered-1.png 690w"><figcaption><span style="white-space: pre-wrap;">When reorienting, bricks should change their direction so that their studs point at the mouse.</span></figcaption></figure><p>We&apos;ll activate this new behavior if the player holds R for more than 200ms and moves the mouse, then finalize the orientation once they release it. While reorienting, we simply make the brick&apos;s up direction point towards where the mouse is.</p><p>And of course, we made a gizmo for this too.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_reorient" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-reorient.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Reorienting a 4x Cube.</figcaption>
    </a>
    <div id="inline_reorient" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-reorient.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<h3 id="tool-widgets">Tool Widgets</h3><p>Our HUD is looking quite bare with the new placer.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-33.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="1926" height="1120" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-33.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/03/image-33.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/03/image-33.png 1600w, https://brickadia.com/blog/content/images/2024/03/image-33.png 1926w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">An empty, boring HUD that tells us nothing.</span></figcaption></figure><p>The old one modified some text that was manually added to the A5 HUD - but that text has been removed from the EA one, depriving us of some important information the old placer, resizer and other tools were able to report by modifying it.</p><p>Actually, doesn&apos;t this case happen a lot? There are two other tools I can think of that put information on the screen - the Painter and the Resizer - and yet we manually modify the HUD to add their widgets every time, then just make the tool unhide them. Shouldn&apos;t we have a better system? We should, right?</p><p>Here&apos;s that better system: All tools can now add an arbitrary &quot;large&quot; tool widget to the bottom right corner of the screen, and a &quot;status&quot; tool widget to the area above the quickbar. For the placer, we&apos;ll use this to display more measurements onscreen.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_inventory-saving" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-hud.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>A brand new HUD for the placer. I gave the text lots of space to expand while keeping it looking nice.</figcaption>
    </a>
    <div id="inline_inventory-saving" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-hud.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<h3 id="tool-bind-hints">Tool Bind Hints</h3><p>The new system is working nicely, but it needs learnability! We&apos;re in need of a means to display our new controls to the user in a way we can dynamically update in real time, because we want to display all the controls the user can use <em>right now - </em>and hide ones that aren&apos;t relevant until they are.</p><p>First, we needed a nice way to show any input. This <a href="https://kenney.nl/assets/input-prompts">CC0 pack by Kenney</a> fit great into our new UI style, and they even <a href="https://twitter.com/KenneyNL/status/1770217303868633568">fixed a bug</a> we reported quickly. Can definitely recommend these for your project!</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2024/03/preview-keyboard-mouse.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="918" height="515" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/preview-keyboard-mouse.png 600w, https://brickadia.com/blog/content/images/2024/03/preview-keyboard-mouse.png 918w"></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/preview-xbox-series.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="918" height="515" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/preview-xbox-series.png 600w, https://brickadia.com/blog/content/images/2024/03/preview-xbox-series.png 918w"><figcaption><span style="white-space: pre-wrap;">Thank you, Kenney!</span></figcaption></figure><p>We then (manually, ugh) wrote a big table that would translate Unreal Engine FKeys to an icon texture reference from the Kenney pack, and a widget that given an Input Action or Input Axis name, displays the icon for the key bound to that action. Or sometimes multiple icons for chords like Ctrl+C.</p><p>Now that we had a way to display keys, we created a system called Tool Bind Hints. All tools are allowed to register them, and they look like this:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-13.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="349" height="352"><figcaption><span style="white-space: pre-wrap;">Up close.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-51.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="1926" height="1120" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-51.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/03/image-51.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/03/image-51.png 1600w, https://brickadia.com/blog/content/images/2024/03/image-51.png 1926w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Positioned on screen! This is the whole HUD as of now.</span></figcaption></figure><p>How it works is that all tools define a list of bind hints they display in any order they choose. For example, the placer defines this list:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/placerbindhints.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="1000" height="1114" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/placerbindhints.png 600w, https://brickadia.com/blog/content/images/2024/03/placerbindhints.png 1000w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">The placer&apos;s list of bind hints.</span></figcaption></figure><p>Bind hints have tags, and the game chooses what bind hints to display by determining if they have any tags that are currently shown. For example, here&apos;s how the placer uses its tags:</p><ul><li><em>Previewing</em> is set while the placer is previewing a brick position.</li><li><em>Placing</em> is set while the placer is dragging a brick row.</li><li><em>SwitchAxis[123] </em>are used to show the various switch axis prompts (this might be upgraded to a better solution later, bear with me)</li><li><em>BuildingSpacing</em> is set if you&apos;re placing in a placement mode that allows the usage of spacing (so we hide the spacing hint in resize-drag mode)</li><li><em>FloatBuilding</em> is set if you&apos;re using floating building (to show the scroll prompt).</li><li><em>Reorienting</em> is set if you are reorienting the brick.</li></ul><p>And finally, here&apos;s a demo of its hint UI updating in real time as you place stuff!</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_hint-update" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-6-hint-update.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>It&apos;s all coming together.</figcaption>
    </a>
    <div id="inline_hint-update" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-6-hint-update.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<h3 id="selection-highlighting">Selection Highlighting</h3><p>One more thing, we added a system to highlight specific bricks and objects with selection outlines in various colors. For example, the Hammer now shows you which brick is going to be deleted with a red highlight:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2024/03/image-39.png" class="kg-image" alt="Devlog #6 - Upgrading the Building System, Part 1" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2024/03/image-39.png 600w, https://brickadia.com/blog/content/images/size/w1000/2024/03/image-39.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2024/03/image-39.png 1600w, https://brickadia.com/blog/content/images/2024/03/image-39.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Selection outline for deletion preview.</span></figcaption></figure><p>Placing new bricks also uses a selection outline around the preview, except it&apos;s white. Did you notice it in the videos above?</p><h2 id="more-to-come">More to Come!</h2><p>That&apos;s all I have for you today, but there&apos;s more coming soon. We&apos;ll show the new modes for building physics contraptions. We&apos;ll look at the new locking modes, which will bring back the plane locking functionality you can get by holding ctrl, and then some. We&apos;ll also be getting into the new orbit mode for building on a controller or Steam Deck, and some new detached mode features.</p><p>I look forward to seeing you then. Stay tuned!</p>]]></content:encoded></item><item><title><![CDATA[Devlog #5 - Recent Graphics Improvements Roundup]]></title><description><![CDATA[Upgraded environments, volumetric clouds, borderless water reflections, order independent glass, HDR, DLSS 3, FSR 2, and more for Early Access.]]></description><link>https://brickadia.com/blog/devlog-5/</link><guid isPermaLink="false">656f7bcc5d108b000717b7e6</guid><category><![CDATA[Development]]></category><dc:creator><![CDATA[Zeblote]]></dc:creator><pubDate>Wed, 27 Dec 2023 16:47:37 GMT</pubDate><media:content url="https://brickadia.com/blog/content/images/2023/12/Untitled.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://brickadia.com/blog/content/images/2023/12/Untitled.jpg" alt="Devlog #5 - Recent Graphics Improvements Roundup"><p>Welcome back to another devlog! What do you mean it&apos;s been half a year since the last one? Time really flies. Anyway, today I want to show you all the graphics improvements and new features that I added over the past year. Of course these don&apos;t all come for free, but they can be quite nice on capable GPUs.</p><p>Mobile data warning: This page will load hundreds of MB of media as you scroll!</p><h2 id="overview">Overview</h2><p>Having an index was quite useful on the last post, so let&apos;s do it again.<br><a href="#introduction">Introduction</a><br><a href="#unreal-engine-53-and-physx-53">Unreal Engine 5.3 and PhysX 5.3</a><br><a href="#upgraded-dynamic-environments">Upgraded Dynamic Environments</a><br>	<a href="#volumetric-clouds">Volumetric Clouds</a><br>	<a href="#new-environment-settings">New Environment Settings</a><br>	<a href="#flat-earth-theory-disproven">Flat Earth Theory Disproven</a><br><a href="#improved-screen-space-reflections">Improved Screen Space Reflections</a><br>	<a href="#bending-water-reflection-rays">Bending Water Reflection Rays</a><br>	<a href="#inexact-proto-lumen-reflections">Inexact Proto-Lumen Reflections</a><br>	<a href="#final-result">Final Result</a><br><a href="#order-independent-glass">Order Independent Glass</a><br>	<a href="#how-does-that-work">How Does That Work?</a><br>	<a href="#its-never-that-simple">It&apos;s Never That Simple</a><br>	<a href="#performance-testing">Performance Testing</a><br><a href="#high-dynamic-range-output">High Dynamic Range Output</a><br><a href="#new-upscaling-plugins">New Upscaling Plugins</a><br>	<a href="#dlss-3-frame-generation">DLSS 3 Frame Generation</a><br>	<a href="#fsr-2-upscaling">FSR 2 Upscaling</a><br>	<a href="#what-about-fsr-3">What about FSR 3?</a><br><a href="#improved-level-of-detail-transitions">Improved Level of Detail Transitions</a><br>	<a href="#dithered-level-of-detail-transitions">Dithered Level of Detail Transitions</a><br>	<a href="#improved-low-detail-brick-shapes">Improved Low Detail Brick Shapes</a><br>	<a href="#combining-both-improvements">Combining Both Improvements</a><br><a href="#whats-next">What&apos;s Next?</a></p><h2 id="introduction">Introduction</h2><p>Since our previous post was already about physics, it only makes sense for this one to focus on graphics again, right? There&apos;s a lot to discover in this one, from simple pretty pictures to technical details and views under the hood, debugging graphical problems, and more. I&apos;m not a very experienced graphics programmer, so some of it is also just my personal curiosity to get some of these things to work. I think it will have something interesting for you regardless of whether you&apos;re waiting to play the game or working on your own projects :)</p><p>PS: This blog is <em>not </em>co-authored by ChatGPT! I actually tried to do that once, and it spewed unusable corporate-sounding garbage.</p><h2 id="unreal-engine-53-and-physx-53">Unreal Engine 5.3 and PhysX 5.3</h2><p>Since the <a href="https://brickadia.com/blog/devlog-1/#combining-unreal-engine-51-and-physx-51">last upgrade post</a>, I&apos;ve migrated the project from Unreal Engine 5.1 to 5.2 and then to 5.3, so now we are fully up to date again. Due to the amount of changes we have to the engine, each of these migrations is a massive task. I have to rebase tens of thousands of changes in hundreds of files to the new branch, fixing several hundred merge conflicts along the way. Somehow Epic likes to change the same files as us.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="600" height="400" srcset="https://brickadia.com/blog/content/images/2023/12/image.png 600w"><figcaption><span style="white-space: pre-wrap;">Brickadia Editor loading screen on Unreal Engine 5.3. Opens much faster than 5.1 did!</span></figcaption></figure><p>Those changes include our PhysX integration, now targeting PhysX 5.3 (isn&apos;t that number a funny coincidence?), which was originally based on a version of Epic&apos;s code in Unreal Engine 4 but somehow strays further from the beaten path with every upgrade. There are also many rendering and shader modifications, bug fixes, networking and performance improvements, ... and that&apos;s <em>before </em>we can start fixing all the new bugs we just added.</p><p>For example, Proto-Lumen had broken in multiple ways during this upgrade. It was no longer getting any velocity information, which I finally managed to track down to be caused by Epic having allowed async compute on NVIDIA GPUs for the first time in 5.3, causing Lumen to go down a different code path that was previously never used.</p><p>In this path, Lumen was not compatible with not having a depth pre-pass, because that&apos;d result in velocity information only being generated after Lumen work had been dispatched. Brickadia does not have a depth pre-pass, because that actually slows down the rendering with lots of meshes and only simple shaders being used. Having to process thousands of draw calls and millions of vertices twice, perhaps unsurprisingly, doesn&apos;t make the game faster.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_lumen-fail-2" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-5-lumen-fail-2.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Proto-Lumen doesn&apos;t work very well without velocity data.</figcaption>
    </a>
    <div id="inline_lumen-fail-2" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-5-lumen-fail-2.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>I tried to enable the early velocity pass so this data would be ready in time, but it turns out this does not work without the early depth pass. It produced clearly nonsensical velocity information, such as seeing the movement of the left hand through the body of the character, when it should be obscured.</p><p>In hindsight, this should have been the expected result with front to back draw order and no depth buffer, but it still took me quite a while to figure out the cause.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card">
    <a href="#inline_velocity-fail" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-5-velocity-fail.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Rendering velocity before the depth pass doesn&apos;t work very well either.</figcaption>
    </a>
    <div id="inline_velocity-fail" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-5-velocity-fail.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>The final fix ended up being to move Lumen dispatch after the normal base pass and velocity were done. There were still more problems with Proto-Lumen, though, it was also flickering so terribly in the dark that I&apos;d consider it unplayable.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_lumen-flicker" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-5-lumen-flicker.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Proto-Lumen flickering terribly.</figcaption>
    </a>
    <div id="inline_lumen-flicker" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-5-lumen-flicker.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>Lots of tweaks later, this version of it seems much more stable.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_lumen-no-flicker" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-5-lumen-no-flicker.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Flicker-free Proto-Lumen in the dark.</figcaption>
    </a>
    <div id="inline_lumen-no-flicker" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-5-lumen-no-flicker.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>We continue to have silly issues with our PhysX implementation too, seems something has changed with the joint axes in either PhysX or Unreal Engine.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-1.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1918" height="1076" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-1.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-1.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-1.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-1.png 1918w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Two of these ragdoll joints are now rotating on the wrong axis, because of course they are.</span></figcaption></figure><p>On that note, I&apos;ve received many requests from other indie developers if they could use our PhysX integration for other, non-competing projects. That sounds reasonable to me, but the changes have been slowly getting mixed up with other commits and fixes. Before we can share it, it would need to be separated out and cleaned up and tested more, and I don&apos;t currently know when there will be time.</p><p>At the moment, it doesn&apos;t even compile outside of the Brickadia project with its very specific set of enabled/disabled plugins and related changes. </p><h2 id="upgraded-dynamic-environments">Upgraded Dynamic Environments</h2><p>If you&apos;ve been following our project or Unreal Engine in general for a while, you might have recognized that the customizable environment on Plate is powered by something called <a href="https://www.unrealengine.com/marketplace/en-US/product/ultra-dynamic-sky">Ultra Dynamic Sky</a>, which builds on the existing lighting and <a href="https://docs.unrealengine.com/5.3/en-US/sky-atmosphere-component-in-unreal-engine/">atmosphere simulation</a> features in Unreal Engine. It also provides the weather effects we&apos;re using in the game currently. From there, we mostly optimize its performance, improve the look and colors, integrate it with our inspector system to allow you to customize it in multiplayer and create presets, control it with behavior scripts, etc. It&apos;s layers of abstraction all the way down!</p><p>However, for most of this time, we were using a <em>very </em>old version of it - several <em>years </em>behind by now. So, what if we modernized our maps a bit, and re-created the environments using the new version for Unreal Engine 5?</p><h3 id="volumetric-clouds">Volumetric Clouds</h3><p>The most striking difference you&apos;ll notice are the clouds. Now that we&apos;re at Unreal Engine 5.3, Epic has slowly improved the performance of their new volumetric cloud system so much that we can actually consider using it in game. Just look at how pretty the clouds are!</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-64.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-64.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-64.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-64.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-64.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Wait, wrong clouds. Those are from Alpha 5!</span></figcaption></figure><p>Woops, wrong image. Let&apos;s try that again:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-65.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-65.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-65.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-65.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-65.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Volumetric clouds are here!</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-66.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-66.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-66.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-66.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-66.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">So pretty in the evening!</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-68.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-68.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-68.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-68.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-68.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Works at night too!</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-83.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-83.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-83.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-83.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-83.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">We can increase the cloud coverage as before.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-71.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-71.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-71.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-71.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-71.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Relaxing at sunset?</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-79.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-79.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-79.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-79.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-79.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Vacation in the mountains?</span></figcaption></figure><p>But wait, there&apos;s more. Volumetric clouds are actually located at a fixed height in the world, so you can fly towards them, and then above...</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_rise" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-5-rise.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Flying up through the clouds.</figcaption>
    </a>
    <div id="inline_rise" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-5-rise.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-88.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-88.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-88.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-88.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-88.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">The mountains on peaks now also reach into the clouds.</span></figcaption></figure><p>Yes, you can fly vehicles above the clouds, and build things there too.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-72.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-72.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-72.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-72.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-72.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Brickadia Flight Simulator?</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-76.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="2000" height="1125" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-76.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-76.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-76.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-76.png 2000w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Did we build too high?</span></figcaption></figure><p>Now, when I said earlier that they perform well, that doesn&apos;t mean the fancy clouds are free. Enabling them, as nice as it looks, <em>will </em>slow down your game a bit. So I&apos;ve hooked up a graphics setting to turn them back off and essentially revert back to the 2D clouds you&apos;ve seen in Alpha 5, ensuring we don&apos;t degrade performance on low end hardware as we get closer to the release.</p><h3 id="new-environment-settings">New Environment Settings</h3><p>Much of the environment menu has been revamped to expose new features. For example, you can now control the day/night cycle more sensibly.</p><figure class="kg-card kg-image-card"><img src="https://brickadia.com/blog/content/images/2023/12/image-82.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="650" height="638" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-82.png 600w, https://brickadia.com/blog/content/images/2023/12/image-82.png 650w"></figure><p>You have much more control over the night sky now with extra moon settings.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_moon" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-5-moon.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Adjusting the moon phase also influences the moonlit clouds.</figcaption>
    </a>
    <div id="inline_moon" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-5-moon.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>Weather effects can now be individually controlled, and there&apos;s a new one, too.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_dust" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-5-dust.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Dust storms don&apos;t enter buildings.</figcaption>
    </a>
    <div id="inline_dust" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-5-dust.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_weather" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-5-weather.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Average British weather simulation.</figcaption>
    </a>
    <div id="inline_weather" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-5-weather.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>Here are some pictures of environments our testers created!</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/Untitled-1.jpg" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/Untitled-1.jpg 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/Untitled-1.jpg 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/Untitled-1.jpg 1600w, https://brickadia.com/blog/content/images/2023/12/Untitled-1.jpg 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Taking shelter from the rain at night?</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-73.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-73.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-73.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-73.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-73.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Storm at sea?</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-74.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="2000" height="1125" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-74.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-74.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-74.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-74.png 2000w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Hmm. What is this?</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-75.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="2000" height="1125" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-75.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-75.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-75.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-75.png 2000w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Battle for mars?</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-77.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="2000" height="1125" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-77.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-77.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-77.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-77.png 2000w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Make sure to stay warm in the winter.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-78.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="2000" height="1125" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-78.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-78.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-78.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-78.png 2000w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">It&apos;s cold out here.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/Untitled-2.jpg" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/Untitled-2.jpg 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/Untitled-2.jpg 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/Untitled-2.jpg 1600w, https://brickadia.com/blog/content/images/2023/12/Untitled-2.jpg 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Can you survive the sandstorm?</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-81.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-81.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-81.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-81.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-81.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">It&apos;s wimdy!</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/Untitled-3.jpg" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/Untitled-3.jpg 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/Untitled-3.jpg 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/Untitled-3.jpg 1600w, https://brickadia.com/blog/content/images/2023/12/Untitled-3.jpg 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Alien world?</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-89.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-89.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-89.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-89.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-89.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">All hope is lost.</span></figcaption></figure><h3 id="flat-earth-theory-disproven">Flat Earth Theory Disproven</h3><p>We&apos;ve finally managed to send a satellite with a camera into outer space, and discovered the ground is in fact <em>not</em> flat.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-85.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="2000" height="1090" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-85.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-85.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-85.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-85.png 2000w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Whoa.</span></figcaption></figure><p>This change had to be made because the sky relies on atmosphere simulation, and atmospheres only exist for round planets. So we curved the entire map. Don&apos;t worry, it&apos;s imperceptible at ground level, because the playable area is contained in the little white cube. You can see the difference clearly above the clouds:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-86.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="2000" height="918" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-86.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-86.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-86.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-86.png 2000w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">On a flat earth, there&apos;s a strange edge in the distance.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-87.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="2000" height="961" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-87.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-87.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-87.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-87.png 2000w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">With a round earth, it looks much more sensible.</span></figcaption></figure><h2 id="improved-screen-space-reflections">Improved Screen Space Reflections</h2><p>We can currently only use screen space reflections in the game, as our bricks are not yet represented in the off-screen scene data used for Lumen reflections. In most cases, like if you don&apos;t look straight at a mirror, this looks good enough to be acceptable. There are a few really bad outliers though, especially with large bodies of reflective water.</p><p>For example, the reflection of the environment on this lake really doesn&apos;t look great. It&apos;s cut off at the edges of the screen, which looks extremely distracting as you&apos;re moving the camera around, because it&apos;s always reflecting the sky at full brightness in those corners. Note that I replaced the lake with a perfectly smooth metal surface to make the reflection more easily visible.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-7.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-7.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-7.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-7.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-7.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Screen space reflections cutting out at the edges of the screen.</span></figcaption></figure><p>And if we enable the Proto-Lumen reflections, we get sharper reflections with even more sky incorrectly visible in them. This is especially visible under the trees. It&apos;s because Lumen would normally trace the off-screen scene data there, but we don&apos;t have that, and won&apos;t at release.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-8.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-8.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-8.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-8.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-8.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Lumen screen space reflections without off-screen scene data in stock 5.3.</span></figcaption></figure><p>So I decided to fix, or at least, bodge this until we can eventually use &quot;proper&quot; Lumen. Let&apos;s attack the white edges on the left and right side first. What is actually the problem there?</p><h3 id="bending-water-reflection-rays">Bending Water Reflection Rays</h3><p>To understand the problem at the screen edges, we have to be aware of how screen space reflections work at least on a high level. It&apos;s actually a fairly simple concept. The engine first renders the game world without reflections, then for each pixel where a reflective surface (like a lake) is visible, it calculates where the reflection would be located, and tries to retrieve the color at that location from the rendered image.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-5.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1289" height="693" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-5.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-5.png 1000w, https://brickadia.com/blog/content/images/2023/12/image-5.png 1289w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">We can see the building in the water, because the building is rendered on screen.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-6.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1157" height="615" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-6.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-6.png 1000w, https://brickadia.com/blog/content/images/2023/12/image-6.png 1157w"><figcaption><span style="white-space: pre-wrap;">We can&apos;t see ourselves in the wall mirror, as the reflection would be behind the camera.</span></figcaption></figure><p>So according to that simple drawing we should be able to see buildings on screen reflected in the water. But then, what&apos;s the issue at the screen edges?</p><p>Part of it is actually an intentional fade towards the edges in the shader, to hide artifacts. Let&apos;s start by turning that off so we can see what&apos;s really going on.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-9.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-9.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-9.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-9.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-9.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Screen space reflections without manual edge fade, looking down.</span></figcaption></figure><p>Now we can see the issue more clearly. There&apos;s a straight cut where the reflection reaches the edge of what is visible on screen above. The further we look down, the worse it gets, due to the way perspective works.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-10.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-10.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-10.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-10.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-10.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Screen space reflections without manual edge fade, looking down further.</span></figcaption></figure><p>Meanwhile, if we look straight ahead or up, it actually looks fine at the edges, as the reflected area is now smaller than the area we have rendered on screen.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-11.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-11.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-11.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-11.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-11.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Screen space reflections without manual edge fade, looking straight ahead.</span></figcaption></figure><p>My initial try to fix this was to take the reflections we have, and extrude the outer edges to the edge of the screen. So it&apos;d just continue whatever color there is to the actual edge.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-12.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-12.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-12.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-12.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-12.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">First idea for filling in the edges.</span></figcaption></figure><p>I implemented this by clipping the screen space search at the edges of the screen, rather than shortening the ray to remain within the screen. It even looked somewhat reasonable in a still image!</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-13.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-13.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-13.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-13.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-13.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">First idea for filling in the edges has been implemented.</span></figcaption></figure><p>There&apos;s a problem though. It looks absolutely terrible in motion! Due to the extrusion effect, large swathes of pixels are changing their color together as we turn the camera, so this isn&apos;t any less distracting than the sky-colored borders.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_ssr-fail-1" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-5-ssr-fail-1.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>First idea for filling in the edges looks terrible in motion.</figcaption>
    </a>
    <div id="inline_ssr-fail-1" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-5-ssr-fail-1.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>So this idea was a complete failure. Let&apos;s try that again, but this time armed with more understanding of what&apos;s happening behind the scenes. To really visualize the issue with the reflection rays going outside the screen, we need to take our sketch from above and upgrade it to be 3-dimensional.</p><p>I don&apos;t really have a good software to visualize this kind of stuff, so I used a bunch of translucent shapes in Unreal Engine. As long as it gets the idea across, the method doesn&apos;t matter, right? Ignore that there&apos;s a sky in the background, it&apos;s not relevant to our visualization.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-14.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-14.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-14.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-14.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-14.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">An attempt to visualize the camera in 3d.</span></figcaption></figure><p>The grey plane at the bottom represents the lake. The light grey shape that gets larger in the distance represents your camera. This is actually a fairly reasonable approximation of a view frustum for a camera with 16:9 aspect ratio and a 55&#xB0; vertical field of view. The rod inside represents a ray from the eye towards the lake, which is then getting reflected off it. We are trying to determine the reflection for a pixel in the bottom right of the screen.</p><p>You can see how as long as the camera is aiming straight horizontal, the ray will remain within the view frustum, i.e. it will intersect with the large back wall (shown by its shadow, or the image below, where I flew inside the thing).</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-15.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-15.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-15.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-15.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-15.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Flying inside the visualization of the camera pointing straight ahead.</span></figcaption></figure><p>That all looks reasonable so far. But what if we rotate the camera down a little?</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-16.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-16.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-16.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-16.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-16.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">The camera has rotated down a little. The reflected ray no longer intersects the back!</span></figcaption></figure><p>Uh oh! With the camera pointing down, our reflection ray is leaving the view frustum to the side. This is exactly what is happening with the diagonal edge in the screenshots above.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-17.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-17.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-17.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-17.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-17.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Flying inside the visualization of the camera pointing down slightly.</span></figcaption></figure><p>This happens because with the camera pointing down, the right side of our view frustum actually ends up at an angle, when compared to the Z axis going straight up. So even though we are still reflecting straight up off the flat water, it is leaving our view to the side.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-18.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-18.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-18.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-18.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-18.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">View frustum with a slight downwards tilt has the sides at an angle, too.</span></figcaption></figure><p>Hopefully this 3d visualization helped in some way. But now that we understand where our reflection ray is going, what do we do with this information?</p><p>Essentially, what we want to accomplish is to make sure the reflected rays stay within the view frustum. To do this, we have to switch to a different coordinate space.</p><p>Imagine a cube. It has an extent of one unit on each axis, and is centered at the origin. If you draw a top view of this cube, with the coordinate system overlaid, it looks somewhat like the below image. You could consider this something like cube-space, and a set of coordinates between -1 and 1 on each axis would let you position something anywhere relative to the cube.</p><figure class="kg-card kg-image-card"><img src="https://brickadia.com/blog/content/images/2023/12/image-19.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="499" height="421"></figure><p>We can do the same thing for the view frustum of our camera above, except we stretch it, like the below image. You can now use coordinates between -1 and 1 to position something anywhere within the view frustum.</p><figure class="kg-card kg-image-card"><img src="https://brickadia.com/blog/content/images/2023/12/image-20.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="567" height="440"></figure><p>In graphics programming, this is normally called &quot;clip space&quot;, because objects outside of the unit cube will be clipped by the edges of the screen. The part we care about though, is that parallel lines starting inside the view and going &quot;forward&quot; in this coordinate space will remain within the view. We can visualize our reflection ray going off screen (red) in this coordinate space.</p><figure class="kg-card kg-image-card"><img src="https://brickadia.com/blog/content/images/2023/12/image-22.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="620" height="384" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-22.png 600w, https://brickadia.com/blog/content/images/2023/12/image-22.png 620w"></figure><p>All we have to do to ensure we get a valid reflection point, is align it to face straight forward in clip space. This is as easy as ensuring the x component of its direction is equal to 0.</p><figure class="kg-card kg-image-card"><img src="https://brickadia.com/blog/content/images/2023/12/image-23.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="627" height="397" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-23.png 600w, https://brickadia.com/blog/content/images/2023/12/image-23.png 627w"></figure><p>Let&apos;s try to implement this in the shader and see how it looks!</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-24.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1926" height="1120" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-24.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-24.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-24.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-24.png 1926w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">I can do math I promise...</span></figcaption></figure><p>Let&apos;s try that one more time, shall we?</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_ssr-fail-2" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-5-ssr-fail-2.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Forcing all screen space reflection rays forward in clip space.</figcaption>
    </a>
    <div id="inline_ssr-fail-2" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-5-ssr-fail-2.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>Well, we have indeed fixed the edges. But... this is not the way either, is it? Now everything is horribly distorted as we move the camera around! Argh...</p><p>One last try before we give up, what if we kept this effect but only applied it towards the edges, fading it out towards the center where most of the attention goes?</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-25.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-25.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-25.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-25.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-25.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Fading out the reflection distortion towards the center.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-26.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-26.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-26.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-26.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-26.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Aiming the camera further down.</span></figcaption></figure><p>It seems like this works pretty well! It isn&apos;t perfect by any means (it cannot be, without off-screen scene information), and the distortion is still visible, but I think it&apos;s much better than the glowing white border we started with. Especially if used for something like an underground cave filled with water.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_ssr-after-1" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-5-ssr-after-1.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Final bent screen space reflections effect.</figcaption>
    </a>
    <div id="inline_ssr-after-1" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-5-ssr-after-1.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<h3 id="inexact-proto-lumen-reflections">Inexact Proto-Lumen Reflections</h3><p>With the screen edges solved, we still have the problem that once we turn on Proto-Lumen, most of the reflections disappear. This is because Lumen only uses screen space reflections for cases where it is certain the reflection is correct, i.e. the screen space ray does not get occluded by anything. In all other cases it tries to fall back to tracing the distance field scene instead (which we don&apos;t have!).</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-27.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-27.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-27.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-27.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-27.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Proto-Lumen reflections are full of holes.</span></figcaption></figure><p>Luckily the fix for this is rather simple. Just... don&apos;t do that. It&apos;s going to produce a bunch of nonsense in some cases, but that&apos;s fine, the old screen space reflection effect did that too.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-28.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-28.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-28.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-28.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-28.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Proto-Lumen reflections without fallback to distance field tracing.</span></figcaption></figure><h3 id="final-result">Final Result</h3><p>Here is what this lake looks like now, if we swap the metal plate back for the glass surface that was there previously, and look at it with Proto-Lumen enabled. This improvement has no additional performance cost.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-29.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-29.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-29.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-29.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-29.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Final Proto-Lumen reflections on the lake.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-30.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-30.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-30.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-30.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-30.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Final Proto-Lumen reflections on the lake.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-31.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-31.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-31.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-31.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-31.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Final Proto-Lumen reflections on the lake.</span></figcaption></figure><h2 id="order-independent-glass">Order Independent Glass</h2><p>Another very jarring visual oddity in the game is the bad translucency sorting we get from the way we batch render bricks, which prevents any sorting of the inner surfaces relative to each other. So if you look at, for example, a large translucent preview of a prefab you&apos;re going to place, it will often look like nonsense.</p><p>Some examples:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-37.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-37.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-37.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-37.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-37.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Even a single tree brick looks somewhat... wrong.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-38.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-38.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-38.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-38.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-38.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">This house preview isn&apos;t looking right.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-39.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-39.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-39.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-39.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-39.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">This church preview isn&apos;t looking right either.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-40.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-40.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-40.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-40.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-40.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">This castle preview is looking like it&apos;s inside out.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-41.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-41.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-41.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-41.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-41.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">We built the walls and floors of this castle out of glass from a parallel dimension.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-42.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-42.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-42.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-42.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-42.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">It&apos;s still looking rather nonsensical if we go up the stairs.</span></figcaption></figure><p>What if there was a simple way to fix it? Compare to the following images!</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-43.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-43.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-43.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-43.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-43.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">The tree now looks like it has depth to it.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-44.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-44.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-44.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-44.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-44.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">The house now has the walls on the outside.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-45.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-45.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-45.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-45.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-45.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">So does this church.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-46.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-46.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-46.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-46.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-46.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">And this castle.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-47.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-47.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-47.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-47.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-47.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">We&apos;ve replaced our alternate dimension glass with normal glass.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-48.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-48.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-48.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-48.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-48.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Looking much more sensible from here too.</span></figcaption></figure><h3 id="how-does-that-work">How Does That Work?</h3><p>Unreal Engine implements a technique called Multi Layer Alpha Blending (MLAB). There is a nice blog post <a href="https://interplayoflight.wordpress.com/2022/07/02/order-independent-transparency-part-2/">here</a> that goes into more detail on how such a thing could be implemented when you&apos;re not dealing with the massive engine shaders. The implementation in Unreal Engine is more efficient though, we&apos;ll get to that later on.</p><p>At a high level view, what the engine does is use a large buffer to store up to N translucent surface layers for each pixel, sorted by their depth. Every time a new layer is rendered to that pixel, we insert it into this buffer at the correct index, potentially merging the last layers if the buffer is full. Then after all objects were rendered, we flatten the layers to a single color.</p><p>To compare, let&apos;s first look how Unreal Engine traditionally rendered translucent objects in the world. We will take a look at the following scene.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-51.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-51.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-51.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-51.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-51.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">The final image. Note how the preview of these boxes looks completely nonsensical.</span></figcaption></figure><p>Before rendering any translucency, the opaque scene is drawn and lit.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-52.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-52.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-52.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-52.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-52.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">The scene color with lighting applied before rendering translucency. Ignore the colors, it&apos;s not tone mapped yet.</span></figcaption></figure><p>Then we start drawing the translucent objects on top of the scene with forward shading. The engine tries to sort objects by their distance from the camera here, so nearest objects are drawn last. This doesn&apos;t work as intended for our bricks, because we can&apos;t draw tens of thousands of translucent bricks as individual objects. Instead they&apos;ll be rendered in large clusters, which means most of them remain unsorted. </p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-53.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-53.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-53.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-53.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-53.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Starting to render translucent clusters.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-54.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-54.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-54.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-54.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-54.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Rendering more translucent clusters.</span></figcaption></figure><p>With the translucent faces drawing arbitrarily over each other inside each cluster, performance is very good, but the result is very bad looking with wrongly sorted surfaces.</p><p>In many other cases sorting objects by distance will not work either, for example, consider the classic case below. There is no known real time solution to this problem, other than to use an OIT technique.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-49.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="999" height="629" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-49.png 600w, https://brickadia.com/blog/content/images/2023/12/image-49.png 999w"><figcaption><span style="white-space: pre-wrap;">Sorting by distance incorrectly orders the spheres relative to the diagonal wall.</span></figcaption></figure><p>Let&apos;s take a look how Unreal Engine solves this. As mentioned they are using MLAB, but the implementation is quite unusual. There is a raster order view of the same size as the normal screen buffers, which contains a single sample count value for each pixel. Then, separate buffers are used to store the color, depth and transmittance of the individual layers, with N values for each pixel. Usually, N is 4 for a good balance between quality and performance.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://brickadia.com/blog/content/images/2023/12/image-50.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1805" height="587" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-50.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-50.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-50.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-50.png 1805w" sizes="(min-width: 1200px) 1200px"></figure><p>You might be wondering what a raster order view does. Usually the GPU handles many thousands of fragments concurrently, only merging them at the end. However, with OIT, our shader needs to write samples to the correct position for the current layer count, and potentially merge others! So we really don&apos;t want it to run multiple instances affecting the same pixel concurrently, because that corrupts our buffers and looks like this:</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_oit-fail-1" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-5-oit-fail-1.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Running the OIT shader without a raster order view.</figcaption>
    </a>
    <div id="inline_oit-fail-1" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-5-oit-fail-1.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_oit-fail-2" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-5-oit-fail-2.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Running the OIT shader without a raster order view.</figcaption>
    </a>
    <div id="inline_oit-fail-2" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-5-oit-fail-2.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>The raster order view solves this, by serializing operations for each pixel. So different pixels can still run in parallel, but we&apos;re no longer messing up the values in our buffers by running multiple fragments affecting the same pixel at once.</p><p>Let&apos;s follow rendering the scene from above again, but this time with OIT!</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-55.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-55.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-55.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-55.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-55.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Enabling OIT immediately fixes the preview of the boxes.</span></figcaption></figure><p>Up to the opaque scene being rendered, everything works the same as before. However, translucent objects now render to the OIT buffers rather than directly onto the scene color. Since the OIT buffers are so large, I changed the main resolution of the window to 960x560, but here is what these look like once we&apos;re done rendering translucent objects:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-56.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="960" height="560" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-56.png 600w, https://brickadia.com/blog/content/images/2023/12/image-56.png 960w"><figcaption><span style="white-space: pre-wrap;">Sample count buffer. Black = no translucent layers, white = 4 layers for the pixel.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-62.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1120" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-62.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-62.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-62.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-62.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Sample color buffer. Err, hold up, why is it red?</span></figcaption></figure><p>At this point I found out that these buffers are encoded in r11g11b10 format, which is rather annoying, because the engine only binds them as r32 buffers, so they don&apos;t display correctly in any visualization tool. Long story short, we can use a custom <a href="https://renderdoc.org/docs/how/how_custom_visualisation.html">visualization shader</a> in RenderDoc that decodes the texture, and since I found no useful minimal examples of this being done anywhere on the internet, here is the code that displays the texture in the correct format:</p><figure class="kg-card kg-image-card"><img src="https://brickadia.com/blog/content/images/2023/12/image-63.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="463" height="73"></figure><pre><code class="language-cpp">// This is the standard r11g11b10 unpacking function
float3 UnpackR11G11B10F(uint rgb)
{
	float r = f16tof32((rgb &gt;&gt; 17) &amp; 0x7FF0);
	float g = f16tof32((rgb &gt;&gt; 6) &amp; 0x7FF0);
	float b = f16tof32((rgb &lt;&lt; 5) &amp; 0x7FE0);
	return float3(r, g, b);
}

// This is how you access the selected texture in RenderDoc
// For some inexplicable reason it is always an array
uint4 RD_TexDim();
Texture2DArray&lt;uint&gt; texArray : register(RD_UINT_2D_ARRAY_BINDING);

float4 main(float4 pos : SV_Position, float4 UV : TEXCOORD0) : SV_Target0
{
	uint4 res = RD_TexDim();
	uint packed = texArray.Load(int4(UV.xy * res.xy, 0, 0)).r;

	return float4(UnpackR11G11B10F(packed), 1.f);
}
</code></pre>
<p>Now we can continue looking at our buffers.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/samplecolor.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1120" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/samplecolor.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/samplecolor.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/samplecolor.png 1600w, https://brickadia.com/blog/content/images/2023/12/samplecolor.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Sample color buffer. See how it has a checker pattern, interleaving 4 values for each pixel?</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/sampletrans.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1120" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/sampletrans.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/sampletrans.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/sampletrans.png 1600w, https://brickadia.com/blog/content/images/2023/12/sampletrans.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Sample transmittance buffer. This stores how the scene behind the translucent surface should tint.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/sampledepth.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1120" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/sampledepth.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/sampledepth.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/sampledepth.png 1600w, https://brickadia.com/blog/content/images/2023/12/sampledepth.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Sample depth buffer. This stores the depth of each of the 4 layers, for sorting in new values.</span></figcaption></figure><p>The interleaved layers are easier to see, if we zoom in to the image. Here each group of 2x2 values represents data for one pixel of the final image.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-58.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-58.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-58.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-58.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-58.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Sample color buffer, zoomed in 4x.</span></figcaption></figure><p>Once we have collected all this data, a combine pass will flatten these layers onto the scene color, and we can resume the same rendering path as without OIT.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-57.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="960" height="560" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-57.png 600w, https://brickadia.com/blog/content/images/2023/12/image-57.png 960w"><figcaption><span style="white-space: pre-wrap;">Lit scene color with OIT merged in, before tone mapping and post processing.</span></figcaption></figure><p>This scene was a bit messy, so here is another example with a much simpler one. We&apos;re rendering three tinted glass panes in a row.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-59.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="960" height="560" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-59.png 600w, https://brickadia.com/blog/content/images/2023/12/image-59.png 960w"><figcaption><span style="white-space: pre-wrap;">Much simpler scene. Notice how overlapping RGB colored glass panels almost becomes opaque.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-60.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="960" height="560" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-60.png 600w, https://brickadia.com/blog/content/images/2023/12/image-60.png 960w"><figcaption><span style="white-space: pre-wrap;">We once again have a sample count buffer, tracking how many overlapping layers affect each pixel.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/egg1.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1120" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/egg1.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/egg1.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/egg1.png 1600w, https://brickadia.com/blog/content/images/2023/12/egg1.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Glass slightly reflects the sky without tinting it, which can be faintly seen in the sample color buffer.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/egg2.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1120" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/egg2.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/egg2.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/egg2.png 1600w, https://brickadia.com/blog/content/images/2023/12/egg2.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">We find the tint colors in the sample transmittance buffer, tinting the scene behind the glass.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-61.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-61.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-61.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-61.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-61.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Zooming in on the last image. See how each of the colored layers have been saved for every pixel?</span></figcaption></figure><p>Due to the separate buffers, this implementation is highly efficient for cases where not much translucency is actually on screen, so basically most real scenes. On most pixels we&apos;ll just read that the sample count is 0 during the combine pass, and skip them entirely. It requires little memory bandwidth to run too, as only the minimal amount of data actually needed is being written to the buffers. But this doesn&apos;t mean it&apos;s free. We&apos;ll evaluate the performance later.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_oit-switch" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-5-oit-switch.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Switching order independent glass on and off.</figcaption>
    </a>
    <div id="inline_oit-switch" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-5-oit-switch.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<h3 id="its-never-that-simple">It&apos;s Never That Simple</h3><p>The excitement of seeing translucent previews finally rendering in a sensible way did not last long at first. This is because when I turned my camera and breathed incorrectly, my whole computer would crash. Giving this build to a few testers to try on their machine, they could reproduce it, and crash their computers too.</p><p>Eventually we discovered that what happened is the GPU froze and timed out, also called a <a href="https://learn.microsoft.com/en-us/windows-hardware/drivers/display/timeout-detection-and-recovery">TDR</a>, and the computer actually recovers after about a minute if you continue staring at a black screen for what feels like forever. Why it takes a minute to recover, when the timeout triggers after two seconds, remains a complete mystery. This was the first time I ever had Unreal Engine fail in this way, so I didn&apos;t really know how to go about debugging it. Also, the freeze <em>only </em>occurs in a shipping build, isn&apos;t that amazing?</p><p>Let&apos;s check if the game wrote something to its log file first.</p><pre><code>[2023.11.04-21.36.38:515][110]LogD3D12RHI: Warning: GPU timeout: A payload (0x0000015E5AC55F00) on the [0x00000151B6270B00, 3D] queue has not completed after 5.000000 seconds.
[2023.11.04-21.37.34:005][110]LogD3D12RHI: Error: CurrentQueue.Fence.D3DFence-&gt;GetCompletedValue() failed 
 at .\Runtime/D3D12RHI/Private/D3D12Submission.cpp:980 
 with error DXGI_ERROR_DEVICE_REMOVED with Reason: DXGI_ERROR_DEVICE_HUNG

[2023.11.04-21.37.34:005][110]LogD3D12RHI: Error: [GPUBreadCrumb] Last tracked GPU operations:
[2023.11.04-21.37.34:005][110]LogD3D12RHI: Error: [GPUBreadCrumb]	3D Queue 0

[2023.11.04-21.37.34:010][110]LogD3D12RHI: Error: [GPUBreadCrumb]	Copy Queue 0

[2023.11.04-21.37.34:021][110]LogD3D12RHI: Error: [GPUBreadCrumb]	Compute Queue 0

[2023.11.04-21.37.34:032][110]LogD3D12RHI: Error: DRED: Last tracked GPU operations:
[2023.11.04-21.37.34:032][110]LogD3D12RHI: Error: DRED: No command list found with active outstanding operations (all finished or not started yet).
[2023.11.04-21.37.34:032][110]LogD3D12RHI: Error: DRED: No PageFault data.
[2023.11.04-21.37.34:032][110]LogD3D12RHI: Error: Memory Info from frame ID -1:
[2023.11.04-21.37.34:032][110]LogD3D12RHI: Error: 	Budget:	   0.00 MB
[2023.11.04-21.37.34:032][110]LogD3D12RHI: Error: 	Used:	   0.00 MB
[2023.11.04-21.37.34:044][110]LogD3D12RHI: Error: GPU Crashed or D3D Device Removed.

Use -d3ddebug to enable the D3D debug device.
Use -gpucrashdebugging to track current GPU state.
</code></pre>
<p>It did, but the output is not useful, it&apos;s basically just telling us &quot;yes it crashed&quot;. We can try to add those two command line arguments it suggests, but neither of them are useful: -d3ddebug does nothing, and -gpucrashdebugging makes the game run slower without triggering the freeze at all.</p><p>After looking around more, I discovered Unreal Engine also integrates something called <a href="https://docs.unrealengine.com/5.3/en-US/nvidia-nsight-aftermath-for-gpu-pipeline-debugging-in-unreal-engine/">NVIDIA Aftermath</a> which should give us more information. However, the documentation just tells us the same flag again, which hides the freeze!</p><p>Digging through the code, I found that you can enable Aftermath by itself with the following arguments: &quot;-nvaftermath -aftermathall&quot;. This way it&apos;s not enabling the other systems that hide the freeze at the same time.</p><p>We get a little more information this time!</p><pre><code>[2023.11.04-22.51.53:639][270]LogD3D12RHI: Warning: GPU timeout: A payload (0x00000220144D6200) on the [0x00000213EE430B00, 3D] queue has not completed after 5.000000 seconds.
[2023.11.04-22.52.48:744][270]LogD3D12RHI: Error: CurrentQueue.Fence.D3DFence-&gt;GetCompletedValue() failed 
 at .\Runtime/D3D12RHI/Private/D3D12Submission.cpp:980 
 with error DXGI_ERROR_DEVICE_REMOVED with Reason: DXGI_ERROR_DEVICE_HUNG

[2023.11.04-22.52.48:744][270]LogRHI: Error: [Aftermath] Status: Timeout
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] Scanning 22 command lists for dumps
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] Context 0, command list 00000213ED87E4F0, status Finished, 0 markers. Begin GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] End GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] Context 1, command list 00000213F88B0A00, status Finished, 0 markers. Begin GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] End GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] Context 2, command list 0000021388881020, status Finished, 0 markers. Begin GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] End GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] Context 3, command list 00000213A921ADE0, status Finished, 0 markers. Begin GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] End GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] Context 4, command list 00000213A920F0B0, status Finished, 0 markers. Begin GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] End GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] Context 5, command list 00000213AFD34050, status Finished, 0 markers. Begin GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] Context 6, command list 00000213A920C690, status Executing, 3 markers. Begin GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] 0: Scene
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] 1: Translucency
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] 2: Translucency(%s Parallel) %dx%d
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] End GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] Context 7, command list 00000213A9209C70, status Finished, 1 markers. Begin GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] 0: EnqueueCopy(%s)
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] End GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] Context 8, command list 00000213B393E490, status Finished, 0 markers. Begin GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] End GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] Context 9, command list 00000213A92105C0, status Finished, 0 markers. Begin GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] End GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] Context 10, command list 00000213A920B180, status Finished, 0 markers. Begin GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] End GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] Context 11, command list 00000213AB9A7B40, status Finished, 2 markers. Begin GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] 0: Scene
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] 1: FGPUSortManager::OnPostRenderOpaque
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] End GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] Context 12, command list 00000213AB9A9050, status Finished, 2 markers. Begin GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] 0: Scene
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] 1: ClearRenderTarget(%s, slice %d, mip %d) %dx%d ClearAction
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] End GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] Context 13, command list 0000000000000000, status Finished, 0 markers. Begin GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] End GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] Context 14, command list 0000000000000000, status Finished, 0 markers. Begin GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] End GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] Context 15, command list 0000000000000000, status Finished, 0 markers. Begin GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] End GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] Context 16, command list 0000000000000000, status Finished, 0 markers. Begin GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] End GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] Context 17, command list 0000000000000000, status Finished, 0 markers. Begin GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] End GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] Context 18, command list 0000000000000000, status Finished, 0 markers. Begin GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] End GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] Context 19, command list 00000213AF9F79F0, status Finished, 0 markers. Begin GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] End GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] Context 20, command list 00000213AF9F3AC0, status Finished, 0 markers. Begin GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] End GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] Context 21, command list 0000000000000000, status Finished, 0 markers. Begin GPU Stack Dump
[2023.11.04-22.52.48:746][270]LogRHI: Error: [Aftermath] End GPU Stack Dump
</code></pre>
<p>This is again not actually helpful though. The most we can tell from this output is that the issue occurs during &quot;Translucency&quot;, which is about what we&apos;d expect to happen given the freeze only occurs when OIT is enabled, but it tells us nothing about the underlying cause. So we&apos;ll need another approach.</p><p>Searching the internet for how to debug a TDR, one thing I found was this <a href="https://devblogs.microsoft.com/pix/tdr-debugging/">page</a> explaining that you can analyze a TDR with <a href="https://devblogs.microsoft.com/pix/">PIX</a>. Except that to analyze it, it has to take a single-frame capture on exactly the frame that causes the freeze. With it seemingly freezing randomly during camera movement, how are we meant to know in advance which frame will freeze to capture it? This feature seems a bit useless to me, though maybe there are some situations where you can accurately reproduce the issue like that. It&apos;s certainly not going to help us.</p><p>Then I discovered that NVIDIA Aftermath is not just the library the engine uses, there are also <a href="https://developer.nvidia.com/blog/speed-up-gpu-crash-debugging-with-nvidia-nsight-aftermath/">standalone tools</a> for interacting with it. After setting up the crash monitor on my computer, it did indeed capture the TDR in Nsight.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-34.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="848" height="419" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-34.png 600w, https://brickadia.com/blog/content/images/2023/12/image-34.png 848w"><figcaption><span style="white-space: pre-wrap;">Aftermath monitor window.</span></figcaption></figure><p></p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-32.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1383" height="916" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-32.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-32.png 1000w, https://brickadia.com/blog/content/images/2023/12/image-32.png 1383w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Nsight with an Aftermath capture open.</span></figcaption></figure><p>But we don&apos;t have any shader symbols, so it&apos;s useless in its current state.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-33.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1172" height="170" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-33.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-33.png 1000w, https://brickadia.com/blog/content/images/2023/12/image-33.png 1172w"><figcaption><span style="white-space: pre-wrap;">No shader debugging info in Nsight.</span></figcaption></figure><p>We can follow the instructions on their <a href="https://docs.nvidia.com/nsight-graphics/UserGuide/index.html#source-shader-debug-information">documentation</a> and hook up the separate shader <a href="https://docs.unrealengine.com/5.3/en-US/shader-debugging-workflows-unreal-engine/">debugging information</a> that Unreal Engine optionally generates during packaging to get this working.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-35.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="2000" height="1160" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-35.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-35.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-35.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-35.png 2120w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Another Aftermath capture, this time with shader debugging info.</span></figcaption></figure><p>Now we can tell that the GPU is freezing inside the <a href="https://github.com/EpicGames/UnrealEngine/blob/5.3/Engine/Shaders/Private/OITCommon.ush#L231">AddOITSample</a> method in the translucent base pass shader! I didn&apos;t have access to Nsight Graphics Pro while I was investigating this last month, and this is as far as the no-NDA edition will get us. But we can still manually review this function and the surrounding code and see if any issues pop out.</p><p>There&apos;s definitely a questionable control flow here:</p><p></p><pre><code class="language-cpp">void AddOITSample_MLAB(uint2 InPixelCoord, float3 InColor, float3 InTrans, float InDepth)
{
    // ROV read to for pixel synchronization
    uint SampleCount = min(TranslucentBasePass.OIT.OutOITSampleCount[InPixelCoord], TranslucentBasePass.OIT.MaxSamplePerPixel);

    [...]

    if (SampleCount &gt; 0)
    {
        const uint2 LastSampleCoord = GetStoringCoord(SampleBaseCoord, SampleCount-1);
        const FOITSample LastSample = OITLoadSample(LastSampleCoord);
        if (Current.Depth &gt; LastSample.Depth) // Scene depth (not inv-Z)
        {
            if (all(LastSample.Trans &lt; TranslucentBasePass.OIT.TransmittanceThreshold))
            {
                discard;
            }
        }
    }

    [...]

    // Write to ROV to unlock pixel
    SampleCount = min(SampleCount + 1, TranslucentBasePass.OIT.MaxSamplePerPixel);
    TranslucentBasePass.OIT.OutOITSampleCount[InPixelCoord] = SampleCount;
}
</code></pre>
<p>The shader starts by acquiring a lock on the raster order view, doing a bunch of logic, potentially discarding the current pixel if it is deemed irrelevant, at the end releasing the lock by writing back to the raster order view.</p><p>What exactly happens to our unlock write to the raster order view, if we have discarded the pixel above, which prevents the writes from actually happening? I honestly don&apos;t know the answer, but I made a little experiment here: let&apos;s just add return after discard, to force the compiler to generate explicit unlock instructions and exit the function right there.</p><p></p><pre><code class="language-cpp">    if (SampleCount &gt; 0)
    {
        const uint2 LastSampleCoord = GetStoringCoord(SampleBaseCoord, SampleCount-1);
        const FOITSample LastSample = OITLoadSample(LastSampleCoord);
        if (Current.Depth &gt; LastSample.Depth) // Scene depth (not inv-Z)
        {
            if (all(LastSample.Trans &lt; TranslucentBasePass.OIT.TransmittanceThreshold))
            {
                discard;
                return;
            }
        }
    }
</code></pre>
<p>Surprisingly, this really did fix the issue. My GPU is no longer randomly freezing during translucency rendering, and neither are any of the others.</p><p>Another fix to be made here is that Epic had declared <a href="https://github.com/EpicGames/UnrealEngine/blob/5.3/Engine/Source/Runtime/Renderer/Private/OIT/OITParameters.h#L16">TransmittanceThreshold</a> as the wrong type, it needs to be a float, not an integer. This had likely made the issue worse as the comparison was now invalid, causing more pixels to hit the discard case than intended.</p><p>But if this was the issue, why did the freeze only occur in the shipping build with GPU crash debugging disabled? Are we dealing with an optimization bug in the shader compiler or driver?</p><p>We could potentially figure this out with Nsight Graphics Pro now, but here is where I gave up on investigating further. It is somewhat unsatisfying to not have a complete low level explanation of what the GPU was hanging on or why it has been fixed by this change, but we can&apos;t lose ourselves in this one issue.</p><p>So are we done? I thought we were, until another tester reported the game not launching at all on his computer with an RX 580 GPU.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-36.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="610" height="151" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-36.png 600w, https://brickadia.com/blog/content/images/2023/12/image-36.png 610w"><figcaption><span style="white-space: pre-wrap;">Crash report on launch.</span></figcaption></figure><p>Running with -d3ddebug should tell us what caused the shader compilation error. Except that when he ran it on his computer, it would just show this message:</p><pre><code>Fatal error: [File:.\Runtime/D3D12RHI/Private/D3D12Adapter.cpp] [Line: 418] The debug interface requires the D3D12 SDK Layers. Please install the Graphics Tools for Windows. See: https://docs.microsoft.com/en-us/windows/uwp/gaming/use-the-directx-runtime-and-visual-studio-graphics-diagnostic-features
</code></pre>
<p>Too bad that was already installed... now what? The log reveals another problem:</p><pre><code>D3D Error 887e0003: (12600@88679078) at 00007FF9AEFFC9F0 - D3D12 SDKLayers dll not found at D3D12SDKPath. 	
</code></pre>
<p>So it seems the dll needed to run -d3ddebug was excluded from shipping builds by default, breaking the feature completely. Easy fix, just always include it.</p><p></p><pre><code class="language-cpp">            RuntimeDependencies.Add(
                &quot;$(TargetOutputDir)/D3D12/D3D12Core.dll&quot;,
                DirectX.GetDllDir(Target) + &quot;D3D12Core.dll&quot;);

            //if (Target.Configuration != UnrealTargetConfiguration.Shipping &amp;&amp;
            //    Target.Configuration != UnrealTargetConfiguration.Test)
            {
                RuntimeDependencies.Add(
                    &quot;$(TargetOutputDir)/D3D12/d3d12SDKLayers.dll&quot;,
                    DirectX.GetDllDir(Target) + &quot;d3d12SDKLayers.dll&quot;);
            }
</code></pre>
<p>Finally we get a message telling us the actual issue. Who would have thought there could be a DirectX12 capable GPU without support for raster order views?</p><pre><code>D12 ERROR: ID3D12Device::CreatePixelShader: Shader uses Rasterizer Ordered Views, but the device does not support this. To check for support, check device caps via the CheckFeatureSupport() API [ STATE_CREATION ERROR #93: CREATEPIXELSHADER_INVALIDSHADERBYTECODE]
</code></pre>
<p>Epic didn&apos;t, apparently.</p><p></p><pre><code class="language-cpp">AdditionalDefines.SetDefine(TEXT(&quot;PLATFORM_SUPPORTS_ROV&quot;), 1); // Assume min. spec HW supports with DX12/SM5
</code></pre>
<p>The problem this time was that having OIT enabled in the project would always bind a raster order view in the translucency shaders, even if not actually used. This then causes the game to crash, as those shaders fail to compile on GPUs that don&apos;t support raster order views, even if they are never used. Fixing this took more effort, but the gist is basically:</p><ul><li>Add a GRHISupportsRasterOrderViews flag next to all the other runtime feature flags that is populated from D3D12_FEATURE_DATA_D3D12_OPTIONS::ROVsSupported.</li><li>Add a new r.OIT.SortedPixels.Enabled cvar that can be used to fully enable/disable OIT at runtime, to be controlled by graphics settings.</li><li>Add a permutation domain to TBasePassPS with a PERMUTATION_SUPPORTS_OIT flag that is combined into OIT_ENABLED in BasePassPixelShader.usf. The extra permutation is only compiled for translucent materials and only if OIT is enabled for the project.</li><li>Extend FBasePassMeshProcessor slightly to use the correct shader permutation depending on if we are drawing a translucent base pass that requests OIT.</li></ul><p>Finally we can have optional OIT in our project, that can be toggled on and off from graphics settings. What an adventure!</p><p>PS: I sent my changes to Epic on UDN and they have integrated them into 5.4, so you should no longer hit these issues if you want to use OIT in your own projects.</p><ul><li><a href="https://github.com/EpicGames/UnrealEngine/commit/2a74011ed5db985e9c81a9bf2dad609df970f80c">Random TDRs with OIT enabled fix commit</a></li><li><a href="https://github.com/EpicGames/UnrealEngine/commit/1d73d81d522268f434772aef17d5abd0d4661da7">Optional ROVs/runtime OIT toggle/sorting order fix commit</a></li></ul><h3 id="performance-testing">Performance Testing</h3><p>I&apos;m using a PC with a GTX 1650 in this test, the smallest non-integrated GPU I have available currently from almost 5 years ago, running the game in 1080p with no upscaling. All the screenshots below have frame rate counters enabled.</p><p>We&apos;ll look at scenes with different amounts of translucent geometry visible on screen, from very little to filling the entire screen, and compare the performance with OIT on/off for each. I also chose not to enable the volumetric clouds here.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_Oh0a7Jd1oD.jpg" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/Brickadia-Win64-Shipping_Oh0a7Jd1oD.jpg 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/Brickadia-Win64-Shipping_Oh0a7Jd1oD.jpg 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/Brickadia-Win64-Shipping_Oh0a7Jd1oD.jpg 1600w, https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_Oh0a7Jd1oD.jpg 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">OIT off, ~10ms.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_aSmUgR2wDx.jpg" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/Brickadia-Win64-Shipping_aSmUgR2wDx.jpg 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/Brickadia-Win64-Shipping_aSmUgR2wDx.jpg 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/Brickadia-Win64-Shipping_aSmUgR2wDx.jpg 1600w, https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_aSmUgR2wDx.jpg 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">OIT on, ~10.8ms, overhead: 0.8ms.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_frTglhyXIr.jpg" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/Brickadia-Win64-Shipping_frTglhyXIr.jpg 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/Brickadia-Win64-Shipping_frTglhyXIr.jpg 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/Brickadia-Win64-Shipping_frTglhyXIr.jpg 1600w, https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_frTglhyXIr.jpg 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">OIT off, ~10.8ms.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_m45x5oydbJ.jpg" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/Brickadia-Win64-Shipping_m45x5oydbJ.jpg 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/Brickadia-Win64-Shipping_m45x5oydbJ.jpg 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/Brickadia-Win64-Shipping_m45x5oydbJ.jpg 1600w, https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_m45x5oydbJ.jpg 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">OIT on, ~13.3ms, overhead: 2.5ms.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_07rrG6KbR0.jpg" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/Brickadia-Win64-Shipping_07rrG6KbR0.jpg 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/Brickadia-Win64-Shipping_07rrG6KbR0.jpg 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/Brickadia-Win64-Shipping_07rrG6KbR0.jpg 1600w, https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_07rrG6KbR0.jpg 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">OIT off, 13.3ms.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_ljyFJcWZ1N.jpg" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/Brickadia-Win64-Shipping_ljyFJcWZ1N.jpg 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/Brickadia-Win64-Shipping_ljyFJcWZ1N.jpg 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/Brickadia-Win64-Shipping_ljyFJcWZ1N.jpg 1600w, https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_ljyFJcWZ1N.jpg 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">OIT on, ~19ms, overhead: 5.7ms.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_kl15y1tMsC.jpg" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/Brickadia-Win64-Shipping_kl15y1tMsC.jpg 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/Brickadia-Win64-Shipping_kl15y1tMsC.jpg 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/Brickadia-Win64-Shipping_kl15y1tMsC.jpg 1600w, https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_kl15y1tMsC.jpg 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">OIT off, ~16.3ms.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_4vFwMrlNSG.jpg" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/Brickadia-Win64-Shipping_4vFwMrlNSG.jpg 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/Brickadia-Win64-Shipping_4vFwMrlNSG.jpg 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/Brickadia-Win64-Shipping_4vFwMrlNSG.jpg 1600w, https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_4vFwMrlNSG.jpg 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">OIT on, 29.4ms, overhead: 13.1ms.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_88MqkSNqg3.jpg" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/Brickadia-Win64-Shipping_88MqkSNqg3.jpg 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/Brickadia-Win64-Shipping_88MqkSNqg3.jpg 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/Brickadia-Win64-Shipping_88MqkSNqg3.jpg 1600w, https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_88MqkSNqg3.jpg 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">OIT off, ~15.1ms.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_OBGnbFcT3c.jpg" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/Brickadia-Win64-Shipping_OBGnbFcT3c.jpg 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/Brickadia-Win64-Shipping_OBGnbFcT3c.jpg 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/Brickadia-Win64-Shipping_OBGnbFcT3c.jpg 1600w, https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_OBGnbFcT3c.jpg 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">OIT on, ~17.9ms, overhead: 2.8ms.</span></figcaption></figure><p>So this effect is still usable even on low end hardware, staying in playable framerates, as long as you don&apos;t go crazy filling the whole screen with it.</p><p>Is it worth it to enable? Maybe. Depends how much the wrong translucency sorting is annoying you while building, what hardware you currently use, and how much you can tolerate reducing your frame rate to fix it. I like to think that we are creating things for the future, not the past - the number of people who can run the effect will only increase over time.</p><p>On higher end systems, it&apos;s usually a non-issue, and I always keep it enabled myself. For example, here is a similar scene running on a RTX 4090:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_ZSi5o6M5bG.jpg" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="2000" height="833" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/Brickadia-Win64-Shipping_ZSi5o6M5bG.jpg 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/Brickadia-Win64-Shipping_ZSi5o6M5bG.jpg 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/Brickadia-Win64-Shipping_ZSi5o6M5bG.jpg 1600w, https://brickadia.com/blog/content/images/size/w2400/2023/12/Brickadia-Win64-Shipping_ZSi5o6M5bG.jpg 2400w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">OIT off, 3840x1600, ~6.4ms.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_IXfVRcqjuD.jpg" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="2000" height="833" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/Brickadia-Win64-Shipping_IXfVRcqjuD.jpg 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/Brickadia-Win64-Shipping_IXfVRcqjuD.jpg 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/Brickadia-Win64-Shipping_IXfVRcqjuD.jpg 1600w, https://brickadia.com/blog/content/images/size/w2400/2023/12/Brickadia-Win64-Shipping_IXfVRcqjuD.jpg 2400w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">OIT on, 3840x1600, ~6.9ms, overhead: 0.5ms.</span></figcaption></figure><h2 id="high-dynamic-range-output">High Dynamic Range Output</h2><p>This is a pretty simple one, considering it&apos;s already integrated in Unreal Engine and you just have to turn it on. Except you can&apos;t use the existing function in the engine, of course, that would be too easy. For example, you might be looking at <a href="https://docs.unrealengine.com/5.3/en-US/API/Runtime/Engine/GameFramework/UGameUserSettings/EnableHDRDisplayOutput/">EnableHDRDisplayOutput</a> and think it will do the trick, until you actually look at the code and notice that it changes the fullscreen setting for no reason.</p><p>Attempting to enable HDR also exposed a lot of issues with our environment setup. When I first tried it, the image was way too dark, and basically unusable on anything other than a TV with Dynamic Tone Mapping enabled to bring it back into a sensible range. Turns out our scenes did not have nearly enough light, which had been compensated for by the SDR tonemapper in previous versions.</p><p>After fixing all those issues though, it looks absolutely fantastic. Seeing the game on the big LG OLED G3, with HDR enabled and all the settings maxed, is almost unbelievable - the sky during the day and emissive bricks at night especially.</p><p>I never want to play without it again! We&apos;ve got a problem here though - I can&apos;t actually show it to you, unless you also have a good HDR display, enabled HDR for your desktop, and are using the latest version of Chrome. I have the game set to 1500 nits peak brightness, but that does not mean every scene will use it.</p><p>These images were captured in 4k HDR using Xbox Game Bar on Windows 11, which writes a JPEG-XR file, and then converted to AVIF using this <a href="https://github.com/ledoge/jxr_to_avif">tool</a> I found, so they can display in the browser. On my computer, the version in the browser looks exactly the same as the game, but I have no idea if that works for you too.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_hdr-test-1" data-lity>
    	<img loading="lazy" src="https://static.brickadia.com/resources/devlog-5-hdr-test-1.avif" alt="Devlog #5 - Recent Graphics Improvements Roundup">
    <figcaption>HDR test image 1.</figcaption>
    </a>
    <div id="inline_hdr-test-1" class="lity-hide">
        <img loading="lazy" src="https://static.brickadia.com/resources/devlog-5-hdr-test-1.avif" alt="Devlog #5 - Recent Graphics Improvements Roundup">
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_hdr-test-2" data-lity>
    	<img loading="lazy" src="https://static.brickadia.com/resources/devlog-5-hdr-test-2.avif" alt="Devlog #5 - Recent Graphics Improvements Roundup">
    <figcaption>HDR test image 2.</figcaption>
    </a>
    <div id="inline_hdr-test-2" class="lity-hide">
        <img loading="lazy" src="https://static.brickadia.com/resources/devlog-5-hdr-test-2.avif" alt="Devlog #5 - Recent Graphics Improvements Roundup">
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_hdr-test-3" data-lity>
    	<img loading="lazy" src="https://static.brickadia.com/resources/devlog-5-hdr-test-3.avif" alt="Devlog #5 - Recent Graphics Improvements Roundup">
    <figcaption>HDR test image 3.</figcaption>
    </a>
    <div id="inline_hdr-test-3" class="lity-hide">
        <img loading="lazy" src="https://static.brickadia.com/resources/devlog-5-hdr-test-3.avif" alt="Devlog #5 - Recent Graphics Improvements Roundup">
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_hdr-test-4" data-lity>
    	<img loading="lazy" src="https://static.brickadia.com/resources/devlog-5-hdr-test-4.avif" alt="Devlog #5 - Recent Graphics Improvements Roundup">
    <figcaption>HDR test image 4.</figcaption>
    </a>
    <div id="inline_hdr-test-4" class="lity-hide">
        <img loading="lazy" src="https://static.brickadia.com/resources/devlog-5-hdr-test-4.avif" alt="Devlog #5 - Recent Graphics Improvements Roundup">
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_hdr-test-5" data-lity>
    	<img loading="lazy" src="https://static.brickadia.com/resources/devlog-5-hdr-test-5.avif" alt="Devlog #5 - Recent Graphics Improvements Roundup">
    <figcaption>HDR test image 5.</figcaption>
    </a>
    <div id="inline_hdr-test-5" class="lity-hide">
        <img loading="lazy" src="https://static.brickadia.com/resources/devlog-5-hdr-test-5.avif" alt="Devlog #5 - Recent Graphics Improvements Roundup">
    </div>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_hdr-test-6" data-lity>
    	<img loading="lazy" src="https://static.brickadia.com/resources/devlog-5-hdr-test-6.avif" alt="Devlog #5 - Recent Graphics Improvements Roundup">
    <figcaption>HDR test image 6.</figcaption>
    </a>
    <div id="inline_hdr-test-6" class="lity-hide">
        <img loading="lazy" src="https://static.brickadia.com/resources/devlog-5-hdr-test-6.avif" alt="Devlog #5 - Recent Graphics Improvements Roundup">
    </div>
</figure>
<!--kg-card-end: html-->
<p>Some troubleshooting if the images don&apos;t display correctly:</p><ul><li>If you don&apos;t have a HDR monitor, you can&apos;t view them.</li><li>If you have HDR disabled in Windows, enable it.</li><li>If you are using Edge or Firefox or something else, use Chrome.</li><li>If you are using Chrome but the images are too dark, change the HDR brightness balance setting in Windows, or change the dynamic tone mapping setting on your display&apos;s menu.</li><li>If you are not using Windows, I can&apos;t help you.</li></ul><h2 id="new-upscaling-plugins">New Upscaling Plugins</h2><p>I try to keep up to date on all the commonly used upscaling plugins, especially those that I use myself and know work very well. Here are some that were released over the past year, that will be available in Early Access:</p><h3 id="dlss-3-frame-generation">DLSS 3 Frame Generation</h3><p>Since NVIDIA released a <a href="https://developer.nvidia.com/blog/now-available-nvidia-dlss-3-for-unreal-engine-5/">plugin</a> for DLSS 3 Frame Generation earlier this year, I have obviously already added this to the game.</p><p>This is some truly magic tech - by generating new frames inbetween the ones the game actually renders, your frame rate can be almost doubled in many cases. It works very well for taking a game running at 60 fps to around 100-120 fps.</p><p>Unlike most graphics quality settings, this applies regardless if the bottleneck is your GPU or your CPU. So for example, you can use it to run some crazy physics contraptions! Do note though, that this requires at least a 40 series GPU. I have the RTX 4090 here, so let&apos;s try loading something completely absurd.</p><p>We&apos;ll start with this classic map built from about 2.3 million bricks as a backdrop.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_k6eAoQJyoY.jpg" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="2000" height="833" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/Brickadia-Win64-Shipping_k6eAoQJyoY.jpg 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/Brickadia-Win64-Shipping_k6eAoQJyoY.jpg 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/Brickadia-Win64-Shipping_k6eAoQJyoY.jpg 1600w, https://brickadia.com/blog/content/images/size/w2400/2023/12/Brickadia-Win64-Shipping_k6eAoQJyoY.jpg 2400w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">2.3M bricks, DLSS 3 off, 6.8ms.</span></figcaption></figure><p>Then we&apos;ll load in a space ship built from roughly 2500 bricks, with multiple materials like glass in use and even some components attached.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_8mIFrju6e1.jpg" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="2000" height="833" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/Brickadia-Win64-Shipping_8mIFrju6e1.jpg 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/Brickadia-Win64-Shipping_8mIFrju6e1.jpg 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/Brickadia-Win64-Shipping_8mIFrju6e1.jpg 1600w, https://brickadia.com/blog/content/images/size/w2400/2023/12/Brickadia-Win64-Shipping_8mIFrju6e1.jpg 2400w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">2.3M bricks, 1 physics object, DLSS 3 off, 5.9ms.</span></figcaption></figure><p>Wait, obviously I meant <em>2000</em> space ships. Otherwise what is even the point?!</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_XEC8RSx6fa.jpg" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="2000" height="833" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/Brickadia-Win64-Shipping_XEC8RSx6fa.jpg 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/Brickadia-Win64-Shipping_XEC8RSx6fa.jpg 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/Brickadia-Win64-Shipping_XEC8RSx6fa.jpg 1600w, https://brickadia.com/blog/content/images/size/w2400/2023/12/Brickadia-Win64-Shipping_XEC8RSx6fa.jpg 2400w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">7.3M bricks, 2000 physics objects, DLSS 3 off, 17.9ms.</span></figcaption></figure><p>Our frame rate seems to have taken a bit of a hit. Let&apos;s enable DLSS 3 to fix it.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_EY9iR3no0Q.jpg" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="2000" height="833" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/Brickadia-Win64-Shipping_EY9iR3no0Q.jpg 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/Brickadia-Win64-Shipping_EY9iR3no0Q.jpg 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/Brickadia-Win64-Shipping_EY9iR3no0Q.jpg 1600w, https://brickadia.com/blog/content/images/size/w2400/2023/12/Brickadia-Win64-Shipping_EY9iR3no0Q.jpg 2400w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">7.3M bricks, 2000 physics objects, DLSS 3 on, 9.4ms.</span></figcaption></figure><p>And there you have it! Some of the optimizations I have already planned for after launch will likely speed this up significantly without having to use DLSS 3, but for now this works very very well (if you can run it).</p><h3 id="fsr-2-upscaling">FSR 2 Upscaling</h3><p>There are some goodies for people on AMD GPUs too! FSR 2 is AMD&apos;s counter to the DLSS 2 that we had during the Open Alpha, and has been released as a <a href="https://gpuopen.com/learn/ue-fsr2/">plugin</a> some time ago. This replaces the temporal upscaling pass in Unreal Engine with a new, better one that works on more GPUs, and also works on the native Linux build. I don&apos;t consider the visual quality as good as DLSS, but it can definitely be a viable alternative to TSR with comparable performance.</p><p>Comparing these on a high end system doesn&apos;t really lead to meaningful differences in performance, they&apos;re all pretty good.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_1lDinwClc3.jpg" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/Brickadia-Win64-Shipping_1lDinwClc3.jpg 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/Brickadia-Win64-Shipping_1lDinwClc3.jpg 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/Brickadia-Win64-Shipping_1lDinwClc3.jpg 1600w, https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_1lDinwClc3.jpg 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">DLSS 2 Quality preset, 3.4ms.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_AT4qXehfaz.jpg" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/Brickadia-Win64-Shipping_AT4qXehfaz.jpg 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/Brickadia-Win64-Shipping_AT4qXehfaz.jpg 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/Brickadia-Win64-Shipping_AT4qXehfaz.jpg 1600w, https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_AT4qXehfaz.jpg 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">FSR 2 Quality preset, 3.7ms.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_tcFWe7TsXU.jpg" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/Brickadia-Win64-Shipping_tcFWe7TsXU.jpg 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/Brickadia-Win64-Shipping_tcFWe7TsXU.jpg 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/Brickadia-Win64-Shipping_tcFWe7TsXU.jpg 1600w, https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_tcFWe7TsXU.jpg 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">TSR-Ultra Quality preset, 3.6ms.</span></figcaption></figure><p>However, things change drastically when comparing them on the low end PC, combined with the usual graphics settings to keep our frame rate up.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/wwytcg9W6k.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/wwytcg9W6k.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/wwytcg9W6k.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/wwytcg9W6k.png 1600w, https://brickadia.com/blog/content/images/2023/12/wwytcg9W6k.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">DLSS 2 Quality preset, not supported.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_bG0jOQvkII.jpg" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/Brickadia-Win64-Shipping_bG0jOQvkII.jpg 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/Brickadia-Win64-Shipping_bG0jOQvkII.jpg 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/Brickadia-Win64-Shipping_bG0jOQvkII.jpg 1600w, https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_bG0jOQvkII.jpg 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">FSR 2 Quality preset, 10.1ms.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_yjYOLOnf6U.jpg" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/Brickadia-Win64-Shipping_yjYOLOnf6U.jpg 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/Brickadia-Win64-Shipping_yjYOLOnf6U.jpg 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/Brickadia-Win64-Shipping_yjYOLOnf6U.jpg 1600w, https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_yjYOLOnf6U.jpg 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">TSR-Ultra Quality preset, 14.7ms.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_kD31eT9qew.jpg" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/Brickadia-Win64-Shipping_kD31eT9qew.jpg 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/Brickadia-Win64-Shipping_kD31eT9qew.jpg 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/Brickadia-Win64-Shipping_kD31eT9qew.jpg 1600w, https://brickadia.com/blog/content/images/2023/12/Brickadia-Win64-Shipping_kD31eT9qew.jpg 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">TSR-Low Quality preset, 9.7ms.</span></figcaption></figure><p>With DLSS 2 and TSR-Ultra not usable on the GTX 1650, the fight is between the FSR 2 and TSR-Low, and FSR 2 definitely feels less blurry to me.</p><p>Unfortunately I can&apos;t show it to you in motion, as that would need lossless video for a fair comparison. This is very subjective, so your impressions might be different from mine. If in doubt, just try all the upscalers yourself.</p><h3 id="what-about-fsr-3">What about FSR 3?</h3><p>Now you might be thinking: Hang on, if I&apos;m adding DLSS 3 Frame Generation, and FSR 2 upscaling, why not <a href="https://gpuopen.com/fsr3-announce/">FSR 3 Frame Generation</a>? It was <a href="https://gpuopen.com/learn/ue-fsr3/">just released</a> also!</p><p>However, as far as I can tell in my experiments, this is just... not working?</p><p>To give it a fair test, I&apos;ve used possibly some of the best gaming displays available: an LG UltraGear 38GN950-B and an LG OLED G3, set to 144Hz and 120Hz respectively, both G-Sync Compatible.</p><p>I&apos;ve tried every possible combination of sync settings: G-Sync enabled on the display, or not, V-Sync enabled, or not, and combined these with the source frame rate ranging between 50 and 90. Can you imagine there wasn&apos;t a single case where it provided a good experience? In <em>every </em>single test, enabling it would introduce pacing issues that appear as slight to very visible stuttering.</p><p>V-Sync appears to be entirely unusable, despite the documentation saying that it works better using V-Sync. It was stuttering so much, I even tried to capture the screen at 144Hz to see what is going on. Stepping through that capture frame by frame revealed many frames that were just duplicates of the previous one, despite the game being capable of running much faster than that. Meanwhile, capturing the game running at 144Hz without FSR 3 enabled is perfectly smooth.</p><p>G-Sync is able to hide the terrible pacing somewhat due to its highly variable refresh rate, but it still doesn&apos;t feel smooth. For example, the game running at 65 fps with G-Sync actually felt better to play than the result of FSR 3 doubling that to 130 fps. The improved motion smoothness I can clearly notice from DLSS 3 is nowhere to be found.</p><p>So what&apos;s the problem? I have no idea. Maybe the plugin is broken. Maybe it&apos;s just incompatible with some other configuration. Maybe I just did it wrong somehow. But there&apos;s nothing I could compare it to and find out. If AMD wants to post a sample project that has it actually working nice and smoothly, like there is for DLSS, we can revisit this.</p><h2 id="improved-level-of-detail-transitions">Improved Level of Detail Transitions</h2><p>One graphical oddity I&apos;ve seen a lot of people complain about (and complained about a lot myself) is how the low detail meshes we use for bricks absolutely destroy special bricks like trees at a distance. They&apos;ll have this really ugly and distracting popping effect if you fly over a large build.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_lod-before-2" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-5-lod-before-2.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Flying over Brick Party in Alpha 5.</figcaption>
    </a>
    <div id="inline_lod-before-2" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-5-lod-before-2.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>But why does that happen? There are three main reasons:</p><ul><li>We group bricks into clusters for rendering, which means many bricks switch the level of detail together as a group, making it more noticeable on screen as a larger area is affected in a single frame.</li><li>The low detail version of special bricks is auto generated and absurdly bad. It&apos;s just a bounding box around the brick, often too large.</li><li>There isn&apos;t any kind of transition, it just snaps from showing one version in one frame to another version in the next frame.</li></ul><p>Now, we&apos;re not going to make any more major changes to the brick rendering system before release at this point. So we can&apos;t do anything about the first point. Bricks will continue to be rendered as clusters in the near future, at least until we get to a full Nanite integration some time during Early Access (maybe?).</p><p>But we <em>can </em>do something about the latter two.</p><h3 id="dithered-level-of-detail-transitions">Dithered Level of Detail Transitions</h3><p>Unreal Engine supports transitioning between distinct levels of detail with a fade effect that lasts several frames. This works by temporarily rendering both versions, blending between them with a dither pattern.</p><p>It&apos;s quite badly documented, but here&apos;s how to use it for custom meshes:</p><ul><li>Enable the <em>Dithered LOD Transition</em> setting in all of the materials.</li><li>Enable the <em>bDitheredLODTransition </em>flag on all your mesh batches.</li><li>Make sure you have <em>MaxScreenSize </em>and <em>MinScreenSize </em>configured.</li><li>Create separate static mesh batches for each level of detail.</li></ul><p>Now if you went and done all of that, the result will be this unusable thing that is always flashing for one frame before the transition starts, because <em>of course</em> the feature is actually broken in 5.3. Watch closely and then you can&apos;t unsee it.</p><p>(These videos were taken from a newer version of the game, so the lighting is quite different. That&apos;s not relevant to this comparison, try to ignore it.)</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_lod-after-1" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-5-lod-after-1.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Flying over Brick Party with dithered LoD transitions enabled. See it flashing?</figcaption>
    </a>
    <div id="inline_lod-after-1" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-5-lod-after-1.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>After some investigation, it turns out someone had refactored a bunch of the code and accidentally taken it out of order - it was binding the dithered LoD state uniform buffer before regenerating it for the current frame, so it ended up combining the set of LoD models for the current frame with the fade progression of the previous frame (where the previous transition had already completed), resulting in a flash of nonsense for exactly one frame.</p><p>When I say &quot;some&quot; investigation, I actually mean it took all day to track this down, mostly because I was not familiar with how any of the code involved works.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_lod-after-2" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-5-lod-after-2.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Flying over Brick Party again, but the dithered transitions are fixed.</figcaption>
    </a>
    <div id="inline_lod-after-2" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-5-lod-after-2.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>Now we have smoother transitions, but it still doesn&apos;t really look good.</p><h3 id="improved-low-detail-brick-shapes">Improved Low Detail Brick Shapes</h3><p>Take a look at some special bricks up close, and what they look like when rendered as low detail. You&apos;ll hopefully agree that this is quite suboptimal.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-2.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-2.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-2.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-2.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-2.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">A few special bricks with custom models.</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-3.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-3.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-3.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-3.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-3.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">The automatic low detail shape used when no custom one is imported with the brick.</span></figcaption></figure><p>In a <a href="https://brickadia.com/blog/devlog-4/#results-for-real-world-builds">previous post</a> I wrote a bit about generating convex hulls around collections of bricks. In hindsight, doesn&apos;t it seem quite obvious to use the same approach for generating more &quot;snug&quot; low detail versions of these bricks? Let&apos;s try that.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://brickadia.com/blog/content/images/2023/12/image-4.png" class="kg-image" alt="Devlog #5 - Recent Graphics Improvements Roundup" loading="lazy" width="1920" height="1080" srcset="https://brickadia.com/blog/content/images/size/w600/2023/12/image-4.png 600w, https://brickadia.com/blog/content/images/size/w1000/2023/12/image-4.png 1000w, https://brickadia.com/blog/content/images/size/w1600/2023/12/image-4.png 1600w, https://brickadia.com/blog/content/images/2023/12/image-4.png 1920w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">The new automatic low detail shape uses a convex hull around the brick.</span></figcaption></figure><p>Much better! The new low detail shapes are less comically oversized, and also have face normals in directions more similar to the high detail version so the difference in lighting will be smaller. As a result, the transition will be less visible. We still want to use as few faces as possible, so for bricks below a certain volume like that jar on the right, those will remain a simple box.</p><h3 id="combining-both-improvements">Combining Both Improvements</h3><p>Here is what the fly over looks like now, with both improvements combined. I think it&apos;s quite satisfying, virtually all of the popping has disappeared.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_lod-after-3" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-5-lod-after-3.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Flying over Brick Party again, with both improvements together.</figcaption>
    </a>
    <div id="inline_lod-after-3" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-5-lod-after-3.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<p>Let&apos;s do that again from a different angle.</p>
<!--kg-card-begin: html-->
<figure class="kg-card kg-image-card kg-width-wide">
    <a href="#inline_lod-after-4" data-lity>
    	<video class="lazy" muted autoplay loop preload="none">
    		<source data-src="https://static.brickadia.com/resources/devlog-5-lod-after-4.mp4" type="video/mp4">
			Sorry, your browser doesn&apos;t support embedded videos.
		</video>
    <figcaption>Flying over Brick Party in a different direction.</figcaption>
    </a>
    <div id="inline_lod-after-4" class="lity-hide">
        <video class="lazy" muted autoplay loop preload="none">
            <source data-src="https://static.brickadia.com/resources/devlog-5-lod-after-4.mp4" type="video/mp4">
            Sorry, your browser doesn&apos;t support embedded videos.
        </video>
    </div>
</figure>
<!--kg-card-end: html-->
<h2 id="whats-next">What&apos;s Next?</h2><p>I haven&apos;t been around much in the community this year, but our social media managers tell me these are your three most important questions:</p><ul><li>What happened to the networked physics?</li><li>Why don&apos;t we write blog posts more often?</li><li>When will you be able to you buy the game?</li></ul><p>To be completely honest with you, progress has been slow. We still have little time to work on the game after our jobs. But we&apos;re still going, so there&apos;s no need to worry. I&apos;m continuing my networked physics implementation right after I finish writing this post, and there will be another post on that as soon as it is ready to demo. Perhaps a Physics Trailer 2 too? There&apos;s been lots of hidden progress on Behaviors scripting, and Six is now working on revamping the building controls to work better for vehicles. You definitely won&apos;t have to wait another 6 months for updates this time, but some of these things have to cook for a while longer still.</p><p>Partly due to the things we have posted on here before, I have been hesitant to post something on this blog, unless I feel like we have collected enough stuff to make each individual post impress people somehow. It also takes quite a while to create these large posts, I just spent several days writing this one and getting media for it, which is all time not spent on actually adding more features to the game. But that means we sometimes go half a year without posting updates at all, so I can understand how that probably isn&apos;t what you&apos;d like us to do...</p><p>Originally this blog was intended to just be posted regularly, every few weeks or so, with whatever curious things we did during that time and little polish. We&apos;ll try to get back to that for future posts. </p><p>As for the release date, I still can&apos;t tell you. We&apos;d previously said &quot;when it&apos;s done&quot;, and that is still the case. My best guess for when it might be done is now mid 2024. There are interesting events during that time, so it would align really well.</p><p>We will let you know once we are aiming for a specific date again, stay tuned.</p>]]></content:encoded></item></channel></rss>