<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Forge Blog</title>
        <link>https://forge-game-engine.github.io/Forge/blog</link>
        <description>Forge Blog</description>
        <lastBuildDate>Tue, 28 Jul 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[August Update: Native 2D Physics Engine, Terrain, 9-slice sprites, multi-pass rendering and more...]]></title>
            <link>https://forge-game-engine.github.io/Forge/blog/august-2026-update</link>
            <guid>https://forge-game-engine.github.io/Forge/blog/august-2026-update</guid>
            <pubDate>Tue, 28 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Feature Image]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="Feature Image" src="https://forge-game-engine.github.io/Forge/assets/images/banner-7b5e0b96851f65aa6fca47c70a6c0a51.png" width="1280" height="424" class="img_ev3q"></p>
<p>Since <code>0.21.0</code>, Forge has gone from "renders sprites and moves them around" to
"simulates a physical world." This post rounds up everything that's shipped
since then.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-native-2d-physics-engine">A native 2D physics engine<a href="https://forge-game-engine.github.io/Forge/blog/august-2026-update#a-native-2d-physics-engine" class="hash-link" aria-label="Direct link to A native 2D physics engine" title="Direct link to A native 2D physics engine" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Physics" src="https://forge-game-engine.github.io/Forge/assets/images/Physics-4df0b3145f9c7bf7f5140025fae0dbe3.gif" width="952" height="594" class="img_ev3q"></p>
<p>As we move further towards our goal of being a zero-dependency game engine
for the web, we decided to replace
<a href="https://www.brm.io/matter-js/" target="_blank" rel="noopener noreferrer">matter-js</a>,
that we used for initial design, with a native 2D physics implementation in
version <code>0.21.0</code> of Forge. Matter.js is a powerful, mature engine, and
reaching the same feature parity and stability will take some time - but
every release will help close that gap, and we're confident we're
headed in the right direction.</p>
<p>The Forge physics engine brings a lot of the tools you would come to expect;
<a href="https://forge-game-engine.github.io/Forge/docs/api/classes/RigidBody" target="_blank" rel="noopener noreferrer"><code>RigidBody</code></a>
and <a href="https://forge-game-engine.github.io/Forge/docs/api/classes/PhysicsWorld" target="_blank" rel="noopener noreferrer"><code>PhysicsWorld</code></a> gives you gravity,
convex collision shapes, collision detection, raycasting, and
an impulse-based force API - all with zero external dependencies, wired
straight into the ECS. Check out the <a href="https://forge-game-engine.github.io/Forge/demos/physics" target="_blank" rel="noopener noreferrer">Physics demo</a> to
see bodies falling, colliding, and settling in real time.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="joints-springs-and-motors-for-every-kind-of-motion">Joints, springs, and motors for every kind of motion<a href="https://forge-game-engine.github.io/Forge/blog/august-2026-update#joints-springs-and-motors-for-every-kind-of-motion" class="hash-link" aria-label="Direct link to Joints, springs, and motors for every kind of motion" title="Direct link to Joints, springs, and motors for every kind of motion" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Car" src="https://forge-game-engine.github.io/Forge/assets/images/Car-844405406eef396a146288a122ab1476.gif" width="946" height="598" class="img_ev3q"></p>
<p>A physics engine is only as fun as what you can build with it, so the last
few releases have been almost entirely about connecting bodies together:</p>
<ul>
<li class=""><strong><a href="https://forge-game-engine.github.io/Forge/demos/revolute-joint" target="_blank" rel="noopener noreferrer">Revolute joints</a></strong> (hinges) let two bodies
rotate around a shared point - see them swinging a wrecking ball in the
<a href="https://forge-game-engine.github.io/Forge/demos/wrecking-ball" target="_blank" rel="noopener noreferrer">Wrecking Ball demo</a>,
or keeping time in a classic <a href="https://forge-game-engine.github.io/Forge/demos/newtons-cradle" target="_blank" rel="noopener noreferrer">Newton's Cradle</a>.</li>
<li class=""><strong><a href="https://forge-game-engine.github.io/Forge/demos/prismatic-joint" target="_blank" rel="noopener noreferrer">Prismatic joints</a></strong> (sliders) constrain
motion to a single axis, perfect for pistons, elevators, and sliding doors.</li>
<li class=""><strong><a href="https://forge-game-engine.github.io/Forge/demos/linear-spring-damper" target="_blank" rel="noopener noreferrer">Linear springs and dampers</a></strong> add soft, bouncy connections between bodies.</li>
<li class=""><strong><a href="https://forge-game-engine.github.io/Forge/demos/torque" target="_blank" rel="noopener noreferrer">Torque and angular-velocity motors</a></strong> apply continuous rotational force to
a body.</li>
</ul>
<p>Put them all together and you get things like the
<a href="https://forge-game-engine.github.io/Forge/demos/car" target="_blank" rel="noopener noreferrer">Car demo</a>: a car with motorized
wheels, suspension, and a body all held together with joints, driving over
procedurally generated terrain.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="terrain-to-build-worlds-on">Terrain to build worlds on<a href="https://forge-game-engine.github.io/Forge/blog/august-2026-update#terrain-to-build-worlds-on" class="hash-link" aria-label="Direct link to Terrain to build worlds on" title="Direct link to Terrain to build worlds on" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Terrain" src="https://forge-game-engine.github.io/Forge/assets/images/Terrain-f0f0d524cdc2fd70b733f37cf3b35046.gif" width="946" height="598" class="img_ev3q"></p>
<p>Speaking of terrain - <code>TerrainShape</code> gives you 2D heightmap collision that
matches a smooth, curved render mesh point-for-point, so what the player sees
is exactly what they collide with. That render mesh textures itself too: two
independently-tileable layers - a "border" texture near the surface blending
into a "fill" texture below it (grass fading into dirt, for example) - so a
terrain shape never needs a hand-authored texture of its own. The
<a href="https://forge-game-engine.github.io/Forge/demos/rolling-ball" target="_blank" rel="noopener noreferrer">Rolling Ball demo</a>
shows a ball rolling over rolling hills built entirely from this new shape.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="crisp-borders-at-any-size-with-nine-slice-sprites">Crisp borders at any size with nine-slice sprites<a href="https://forge-game-engine.github.io/Forge/blog/august-2026-update#crisp-borders-at-any-size-with-nine-slice-sprites" class="hash-link" aria-label="Direct link to Crisp borders at any size with nine-slice sprites" title="Direct link to Crisp borders at any size with nine-slice sprites" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="nine-slice" src="https://forge-game-engine.github.io/Forge/assets/images/9-slice-cfefa712d7b5e9972cad041175427c68.gif" width="952" height="581" class="img_ev3q"></p>
<p>Sprites no longer have to choose between stretching blurrily or being locked
to one size. Nine-slice sprites split an image into a 3x3 grid and scale only
the stretchable middle regions, keeping corners and edges pixel-perfect at
any dimension - see it in the dedicated
<a href="https://forge-game-engine.github.io/Forge/demos/nine-slice" target="_blank" rel="noopener noreferrer">Nine-Slice Sprites demo</a>.</p>
<p>A full UI system is still a ways off for Forge, but nine-slicing is one of
the foundational building blocks it'll need - scalable buttons and panels
being the most obvious use case once that lands.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="multi-pass-rendering-bloom-and-blur">Multi-pass rendering, bloom, and blur<a href="https://forge-game-engine.github.io/Forge/blog/august-2026-update#multi-pass-rendering-bloom-and-blur" class="hash-link" aria-label="Direct link to Multi-pass rendering, bloom, and blur" title="Direct link to Multi-pass rendering, bloom, and blur" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="post-processing" src="https://forge-game-engine.github.io/Forge/assets/images/post-processing-0e5d4bce0ac243504c7d8d2879ef19c4.gif" width="952" height="581" class="img_ev3q"></p>
<p>Cameras can now render into an off-screen texture instead of straight to the
canvas, via a <a href="https://forge-game-engine.github.io/Forge/docs/docs/rendering/multipass-rendering" target="_blank" rel="noopener noreferrer">render target</a> and a present pass that blits it back - the
foundation any full-frame effect needs. Building on that, a two-pass
separable <a href="https://forge-game-engine.github.io/Forge/docs/docs/rendering/gaussian-blur" target="_blank" rel="noopener noreferrer">Gaussian blur</a>
and an additive-glow <a href="https://forge-game-engine.github.io/Forge/docs/docs/rendering/bloom" target="_blank" rel="noopener noreferrer">bloom</a> effect are both built directly on top of it, backed by an
<a href="https://forge-game-engine.github.io/Forge/docs/docs/rendering/hdr-rendering" target="_blank" rel="noopener noreferrer">HDR render target and tone-mapping</a> pipeline so bloom reacts to true HDR
brightness instead of clipping at an 8-bit ceiling. Render targets can also
be layered, so only part of a scene picks up an effect while the rest
renders untouched - the
<a href="https://forge-game-engine.github.io/Forge/demos/space-shooter" target="_blank" rel="noopener noreferrer">Space Shooter demo</a>
blurs its starfield background while bloom glows only the foreground ships
and lasers.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-camera-that-behaves-the-same-everywhere">A camera that behaves the same everywhere<a href="https://forge-game-engine.github.io/Forge/blog/august-2026-update#a-camera-that-behaves-the-same-everywhere" class="hash-link" aria-label="Direct link to A camera that behaves the same everywhere" title="Direct link to A camera that behaves the same everywhere" translate="no">​</a></h2>
<p>Before this, a world unit was just a pixel: one unit always rendered as one
pixel, no matter the canvas size. That left every scene to work out its own
resolution-dependent ratio to size and position anything relative to the
screen - and it was a recurring source of bugs, with demos playing
differently depending on the resolution they ran at.</p>
<p>Cameras now show a fixed number of vertical world units
(<code>verticalWorldUnits</code>, default <code>10</code>) on screen regardless of resolution or
aspect ratio, so the same scene renders at the same relative scale
everywhere. A new <code>calculateVisibleWorldSize</code> helper computes exactly how
many world units are visible at any destination size, so game logic can
position things relative to what's actually on screen instead of reaching
for canvas pixel dimensions or hand-rolling its own ratio math.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="many-more-smaller-improvements">Many more smaller improvements<a href="https://forge-game-engine.github.io/Forge/blog/august-2026-update#many-more-smaller-improvements" class="hash-link" aria-label="Direct link to Many more smaller improvements" title="Direct link to Many more smaller improvements" translate="no">​</a></h2>
<ul>
<li class=""><code>GamepadInputSource</code> now supports hot-plugging - plug in a controller
mid-game and it's picked up automatically, with the most recently
connected gamepad selected by default. Try it out with a controller in
the <a href="https://forge-game-engine.github.io/Forge/demos/brick-breaker" target="_blank" rel="noopener noreferrer">Brick Breaker demo</a>.</li>
<li class=""><code>createImageSprite</code> takes a <code>pixelated</code> option: nearest-neighbor filtering
for crisp, blocky pixel-art scaling, versus the default linear filtering
suited to rasterized/hand-drawn art.
<img decoding="async" loading="lazy" alt="Texture Filtering" src="https://forge-game-engine.github.io/Forge/assets/images/texture-filtering-23c307128aa5e533cc66e8636b85ea0e.png" width="950" height="602" class="img_ev3q"></li>
<li class="">Demos can now go fullscreen.</li>
<li class="">A new <code>preserveDrawingBuffer</code> option on <code>createRenderContext</code>/<code>RenderContext</code>
lets you read the canvas back after a frame has been presented - handy for
screenshots or <code>toDataURL</code>.</li>
<li class="">Mouse-driven trigger actions now correctly respect the active input group,
matching how keyboard and every other input type already behaved.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="try-it-out">Try it out<a href="https://forge-game-engine.github.io/Forge/blog/august-2026-update#try-it-out" class="hash-link" aria-label="Direct link to Try it out" title="Direct link to Try it out" translate="no">​</a></h2>
<p>All of this is available today - the work landed in <code>0.21.0</code> through <code>0.24.0</code> Grab the
<a href="https://forge-game-engine.github.io/Forge/docs/intro" target="_blank" rel="noopener noreferrer">Getting Started guide</a> to add Forge to your project, or
jump straight into the <a href="https://forge-game-engine.github.io/Forge/demos/car" target="_blank" rel="noopener noreferrer">demos</a> to see it all in motion.
For the full list of changes, release by release, see the
<a href="https://forge-game-engine.github.io/Forge/docs/changelog" target="_blank" rel="noopener noreferrer">changelog</a>.</p>
<p>We're excited about where the physics engine is headed next - if you build
something with it, we'd love to know!</p>]]></content:encoded>
            <category>Release</category>
            <category>Physics</category>
            <category>Rendering</category>
            <category>Demos</category>
        </item>
    </channel>
</rss>