Skip to content

Releases: JuggyMcNutty/DXEngine

2026.11.03-c74da5ff

Choose a tag to compare

@JuggyMcNutty JuggyMcNutty released this 03 Nov 12:46

DXEngine alone, at c74da5ff, for every port, each built as its launcher branch configures it at the commits Port Ex Machina pins (ca7400b2). With the launcher, each port's app is in Port Ex Machina's releases.

You supply your own game files. None are included. What each port is and how far along: the ports.

What changed

a838465...c74da5f

  • Docs: the owner's rulings on 24 of the differences made on purpose (bugs.md D) -- each kept, by choice, and said so where the docs cite it, with its reason: the view Hor+ on a screen wider than 4:3, a... (acf5bdcb)
  • A destroyed actor no longer travels, by the owner's ruling, departing from the original's own bug (bugs.md D.33) -- the original's travel export (Engine.dll 0x10391740) writes an actor a travel proper... (282e084f)
  • A mesh's level of detail from the original's angle on a wide screen, by the owner's ruling (bugs.md D.2) -- the vertex budget took the frame's angle, which Hor+ widens on a screen wider than 4:3, so a... (00cca36b)
  • Galaxy's volume floor carried, by the owner's ruling (bugs.md D.21) -- Galaxy's Update holds every voice it starts or updates to at least 128 of its 32,767, 1/256 of full, after its cap and whatever t... (57d5e288)
  • The text parser's comment left open gives the original's listing, by the owner's ruling (bugs.md D.22) -- at a NOTE, GOAL or COMMENT with no end tag the original reads on past the end of its copy of t... (3ef2e4c8)
  • The blink, strobe, flicker and the torch and fire wavers at the original's pace at 60 frames, by the owner's rulings (bugs.md D.15, D.16) -- the original changes each with every frame it draws, paused... (3c9c01d6)
  • The text parser's last token and its end as the original's (bugs.md DX.3) -- the original's ParseTextBlock (DeusExText.dll 0x10001a20) starts each call with no tag and ends a token at the text's end a... (3e4385fb)
  • The HUD on the original's pixels at every scale: the 4:3 root centred to a whole unit, and the screen in units the original's, unrounded (bugs.md EXT.21) -- the original's root is the viewport over it... (414f3986)
  • What a window's clip rectangle holds back, as the original's (bugs.md EXT.20) -- the original draws a window only while it is shown and some of it shows, its clip rectangle's width and height both abo... (ad0bf61a)
  • A function that ends without a value writes nothing, as the original's (bugs.md VM.12) -- every function's code ends in a Return with Nothing, which writes nothing (Core.dll execNothing 0x10102095), a... (a5af7f2d)
  • The travel's export in the original's order and only of what travels (bugs.md PKG.17, PKG.18) -- the original's export (Engine.dll 0x10391740) reads each object's travel properties by its field iterat... (37a9dbf5)
  • The first keyboard focus seeded at the root's own tick, as the original's (bugs.md EXT.9) -- the original seeds it in XRootWindow::Tick (Extension.dll 0x1003a540), which its walk runs before the root'... (803b2be5)
  • A box's multi-hit check as the original's, the actors asked along the cut line (bugs.md PHYS.18) -- the original's MultiLineCheck (Engine.dll 0x1039b220) checks the level first, cuts the line 5 units ... (29ef2fc7)
  • Windows laid out at once as each asks, as the original's (bugs.md EXT.8) -- the original has no layout pass: a window that asks to be laid out (AskParentForReconfigure, Extension.dll 0x1004e060), made... (dd5867b7)
  • A trace's hit at the place its check left, as the original's natives give it (bugs.md PHYS.19, its first part) -- the original's checks leave each hit's place in its FCheckResult, and Trace, TraceActo... (be65bbec)
  • A cylinder checked as the original's UPrimitive::LineCheck, in its floats at the x87's precision (bugs.md PHYS.19) -- the original's cylinder check (Engine.dll 0x103d8af0) works on the line it is give... (240b5b06)
  • An int multiplied or divided in place by a float at the x87's precision of the tick it runs in (bugs.md VM.14) -- the original's *= and /= of an int by a float (Core.dll 0x10134280, 0x10134370) make t... (51cb83cc)
  • The travel's export writes a value only where it differs from its class's default, as the original's (bugs.md PKG.19) -- the original's export writes each travel property's value by ExportText against... (471ba3d2)
  • A Let's script call writes its value into the variable before its out parameters are copied back, the last first, as the original's (bugs.md VM.13) -- the original's Let steps the call straight into t... (74486b3f)
  • A call a net game sends to the other side writes nothing, and a dedicated server survives a player's join (bugs.md NET.10; ENG.16, found and fixed) -- the original's ProcessInternal (Core.dll 0x1013f6... (cc9b9ef0)
  • A level surface seen from behind is passed over by its own flags, its texture's taken after, as the original's (bugs.md REN.28) -- the original's OccludeBsp (Render.dll 0x10b173d0) tests a one-sided s... (8cde7490)
  • Viewport windows as the original's XViewportWindow (bugs.md EXT.14) -- each of the nine: (a) the script's CalcView event (Extension.dll 0x1004b180) runs after relRotation, and the place and turn it le... (a0c61241)
  • The post-increment and post-decrement natives write their result into the variable assigned before they step their own, as the original's (bugs.md VM.15) -- the original's (Core.dll 0x101347e0, 0x1013... (375d9ec7)
  • NATIVES.md: a viewport window's frame corner differs not -- the original adds its canvas frame's corner (Extension.dll 0x1004acad), the whole view's while the windows draw: XRootWindow's PostRender (0... (a6efc4b9)
  • ViewConsole: FovAngle, the view's field of view, and the weapon's animation, place and turn logged (bugs.md REN.29) -- with FovAngle the player's FOVAngle, DefaultFOV and DesiredFOV take it, as Weapon... (654e675d)
  • An actor drawn on its own is lit by the static lights and those it kept, and no actor by its own light, as the original's (bugs.md REN.29) -- the original's URender::DrawActor (Render.dll 0x10b262c0),... (248daa4a)
  • NATIVES.md: which of two opaque surfaces at one depth shows is for the owner (bugs.md D.37, was REN.14) -- the original's draw list sorts its solid surfaces by a key of its objects' indices, the zone ... (ab4f6e98)
  • MeshConsole: Hold, HoldFrame and Extra; NATIVES.md: the pier's brightness narrowed and a two-sided face's light for the owner's list (bugs.md REN.24, REN.30) -- with Hold Paul Denton is held at his se... (06da33d6)
  • MeshConsole: Hold holds one sequence too (bugs.md REN.24) -- with HoldAnim Paul Denton is held at that sequence's HoldFrame, his blend slots emptied, where Hold kept whichever idle and head turn his s... (a2072a79)
  • MeshConsole: ExtraYaw, the extra actor turned from the view's way (bugs.md REN.30) -- Liberty Island's flagpole turned...
Read more

2026.11.01-a8384654

Choose a tag to compare

@JuggyMcNutty JuggyMcNutty released this 01 Nov 17:09

DXEngine alone, at a8384654, for every port, each built as its launcher branch configures it at the commits Port Ex Machina pins (87b7e9f9). With the launcher, each port's app is in Port Ex Machina's releases.

You supply your own game files. None are included. What each port is and how far along: the ports.

What changed

94968ca...a838465

  • A mover's polygon drawn with its texture's own flags, as the original's walk draws the surface its brush tracker files for it (bugs.md REN.27; Render.dll OccludeBsp 0x10b173d0, the surface's Texture->... (af1086be)
  • The travelled items' TravelPreAccept and TravelPostAccept run last to first, and the player's once, as the original's SpawnPlayActor runs them (bugs.md PKG.16; Engine.dll 0x10396bd0: the player's Trav... (ce65efd3)
  • Going public: the README says the engine is an alpha, where a bug in the game goes (this repository's issues, what to say in Port Ex Machina's README) and that it is made with AI assistance, as the wo... (a8384654)

2026.11.01-94968ca9

Choose a tag to compare

@JuggyMcNutty JuggyMcNutty released this 01 Nov 14:19

DXEngine alone, at 94968ca9, for every port, each built as its launcher branch configures it at the commits Port Ex Machina pins (80f667ec). With the launcher, each port's app is in Port Ex Machina's releases.

You supply your own game files. None are included. What each port is and how far along: the ports.

What changed

aa1985f...94968ca

  • NATIVES.md and ENGINE.md cite a playthrough's open items: the intro's door under the two pawns lit another colour (bugs.md REN.26), the terrorists Liberty Island's script kills as the statue's mission... (da18e4eb)
  • The pointer drawn over a window with a CursorRequested event, as the original's (bugs.md EXT.17): the event's out color went by engine->colorprop, a struct property made by hand and so typed a plain s... (a5aa4641)
  • StatueConsole: the terrorists Liberty Island's script kills as the statue's mission ends leave empty carcasses in both engines (bugs.md AI.7, refuted). With StatueMissionComplete set 6 s into the isla... (1dc75709)
  • A box meets a mover's brush in the world's axes, as the original's (bugs.md PHYS.14; Engine.dll UModel::LineCheck 0x103f3c20, its box walk 0x103f42f0). With an owner, the original's walk turns each of... (454221fa)
  • DebrisConsole: a broken window's pieces and a destroyed container's trash are refused at the same spots in both engines (bugs.md PHYS.15, refuted). The original's SpawnActor (Engine.dll 0x10394f60) fi... (3de10816)
  • The box check the original's (bugs.md PHYS.7; Engine.dll UModel::PointCheck 0x103f1570, its walk 0x103f19b0, FindSpot's MultiPointCheck 0x1039acc0, FCollisionHash::ActorEncroachmentCheck 0x10358d50, F... (6bcb85ee)
  • A box trace's bevels at the original's threshold (Engine.dll 0x103f5273): the original's box walk adds a bevel at a hull's edge where the two planes' crosses with the axis, dotted, come over 0.001, a ... (8ccf1fd6)
  • NATIVES.md cites two differences runs found: a buoyant crate in the water by Liberty Island's pier comes to rest at the surface some 6 s in, PHYS_None and its pitch and roll put flat as Landed puts th... (b6c38deb)
  • A window's character clipped in the window's units, then put on whole units, as the original's (bugs.md EXT.18; Extension.dll XGC::DrawChar 0x10029e40). The original clips a character to the GC's clip... (b5c9896f)
  • A window's tiles placed as the original's GC places them (bugs.md EXT.19; Extension.dll XGC::DrawTile 0x1002a820, XGC::ClipTile 0x1002a4f0, DrawPattern 0x10028a60, DrawIconPattern 0x10028770, DrawText... (c34b3636)
  • NATIVES.md: Hor+ in a conversation's letterboxed view (bugs.md D.1) -- the letterbox makes the view wider than 4:3 whatever the screen, so DXEngine sees more at the sides there even at 4:3: the intro'... (f749af02)
  • A mover's polygon filed in the plane of a level surface drawn a step behind it, as the original's frame shows the surface over it (bugs.md REN.26; Engine.dll FilterPoly 0x1037c0c0, AddPolyFragment 0x1... (747d848a)
  • NATIVES.md: a floating crate coming to rest is the original's script, not a difference (bugs.md PHYS.16, refuted). Engine.u's Decoration.ZoneChange, which DeusExDecoration.ZoneChange calls first, stop... (10d9d82c)
  • Each window keeps its clip rectangle, and a modal's tab groups go by the first of their windows that shows, as the original's (bugs.md EXT.10; Extension.dll XWindow::ClipTree 0x10051160, ConfigureChil... (d7282273)
  • A box trace's check in floats, in the original's order, its walk taking the start's side first (bugs.md PHYS.17; Engine.dll UModel::LineCheck 0x103f3c20, its box walk 0x103f42f0, the bevels' clip 0x10... (3675bcca)
  • A line's hits timed and sorted as the original's multi-hit check times and sorts them, in its floats (bugs.md PHYS.8; Engine.dll ULevel::MultiLineCheck 0x1039b220, the cut 0x1039b35a, its end 0x1039b3... (9a7bd685)
  • Docs brought up to date with the session's fixes -- NATIVES.md's box paragraph said GrateConsole's sweeps hit where the original's do at every place and, from before PHYS.17, that a grate is met in DX... (94968ca9)

2026.10.31-aa1985f2

Choose a tag to compare

@JuggyMcNutty JuggyMcNutty released this 31 Oct 18:03

DXEngine alone, at aa1985f2, for every port, each built as its launcher branch configures it at the commits Port Ex Machina pins (77028118). With the launcher, each port's app is in Port Ex Machina's releases.

You supply your own game files. None are included. What each port is and how far along: the ports.

What changed

a31b8ad...aa1985f

  • A mesh's lighting as Render.dll's: its lights picked and faded as SetupForActor does, the AmbientGlow pulse on the viewport's clock, and no vertex fog (dx-reverse-info render-dll.md, meshes; d3ddrv-dl... (8b5804a9)
  • NATIVES.md: the laser fence's rows are D3DDrv's without multisampling -- it said the middle beam was a fraction of a pixel thinner, missing a row D3DDrv draws (bugs.md REN.11). LaserConsole at 1024x76... (865148a5)
  • A mesh with an opaque face after a translucent one drawn whole in face order, as the original draws a mesh's faces -- DXEngine drew every mesh's opaque faces first and its translucent ones later, back... (d456b09c)
  • GC.DrawActor's bConstrain, as the original's -- it was ignored, where the original's XGC::DrawActor (Extension.dll 0x1002aa60) draws a constrained actor through the scene's frame narrowed to the windo... (d375c9fb)
  • NATIVES.md: Effects Channels' lowered and raised counts go to the owner -- the original's sounds past a lowered count play on out of its reach, a looping one for good, and a raised count's channels ta... (bce1cb7b)
  • A box meets the level as the original's box check does: the hulls of the solid leaves its box reaches alone -- the walk tried the hull of every node it visited, so a box whose ends stop short of a flo... (5749b91f)
  • DoorConsole logs where its spawn placed the crate -- the crate settled 8 units from the original's before the door closed on it (bugs.md PHYS.7), and its place at the spawn shows the fit already apart... (482ebe01)
  • NATIVES.md: UnloadTexture's kept mips by choice -- the original frees a texture's mips and reads them from its package again when it is next drawn; DXEngine keeps them until nothing holds the texture,... (9f989460)
  • The root counts its grabs as the original's: the keys are the UI's while its count of the keyboard's grabs is not 0, the mouse's buttons, axes and wheel while its count of the mouse's is not 0, where ... (e0054d29)
  • IntroConsole: the menu map's flyby, shot and logged in both engines -- its InterpolationPoints, then a marked shot every second with the view's place, the path's target, rate and alpha and the level's... (f7d13f2a)
  • A key's name follows the layout and Num Lock as the original's does, and a key typed with Alt held reaches the windows as the character the layout gives it -- the SDL2 and SDL3 windows, the launchers'... (bf10b196)
  • The player's input is read, and a key's binding run, as the original's input does them (bugs.md ENG.8, ENG.9, ENG.10). The read is the original's UInput::ReadInput, in the player's tick before PlayerI... (f4856704)
  • A float read by hand from an ini is read as the original's import reads one (appAtof): the number its text starts with, 0 for an empty value or any other text, the default only for a key not there -- ... (a680c081)
  • A SET and a ResetConfig tell each object of their class of the change, as the original's do (UObject::PostEditChange; bugs.md ENG.12), DXEngine telling none: the hook is UObject's, overridden where th... (d0c7ffce)
  • NATIVES.md: a spawn notification as the original's -- an actor spawned while the notifications run hears none, as the original's SpawnActor (0x10394f60) has it, a flag (GSpawnNotifying, 0x10588b48) he... (821e2bdc)
  • A struct's text with an element by its index stops its import there, logged ("ImportText: Illegal array element"), the members before it set, as the original's UStructProperty::ImportText (Core.dll 0x... (ffdee883)
  • A level's URL and the last URL as the original's (bugs.md PKG.10, PKG.12). A level's URL, which Level.GetLocalURL gives, is the one it was entered by, as the original's LoadMap (Engine.dll 0x1038c1f0)... (9aa17b46)
  • A travel's map browsed as the original's Browse browses it (bugs.md PKG.9, PKG.11). The pre-travel comes first, in the original's order (DeusEx.dll 0x10010b90): within the mission the level pruned and... (60a6ebb7)
  • A level's game named by its class's count, as the original's spawn names any actor (bugs.md ENG.14): MakeUniqueObjectName, Entry's DeusExGameInfo0, the menu map's 1, the next map's 2, where DXEngine n... (638abe50)
  • The player's flag base made as the original's constructor makes it (bugs.md EXT.16): APlayerPawnExt's (Extension.dll 0x10037ba0) gives a pawn that holds none its own, the pawn its outer and its name t... (647b80b2)
  • A float's text as the original's %f writes it, its MSVC runtime's (bugs.md VM.10): every digit exact to six decimals, a tie at the sixth rounding up, infinity 1.#INF00 and NaN as that runtime spells t... (24e58ea7)
  • The Entry level as the original's (bugs.md PKG.13): loaded as entry.dx with no option, as UGameEngine::Init loads it, its game's InitGame given none, where DXEngine gave it the player's options from t... (8416462d)
  • PORT=, MULTIHOME= and -PRIMARYNET taken as the original's net driver takes them (bugs.md NET.4; the first sweep's E15b.16, its half left). A server binds the URL's port or the next free of the 20 from... (51baf70c)
  • A download written to the cache as the original's file channel writes it (bugs.md NET.5): its GUID and .uxx whatever CacheExt says (UFileChannel::Destroy, Engine.dll 0x10400a40), where DXEngine wrote ... (5e1b214a)
  • A remote player's pawn destroyed by script, run against the original (bugs.md NET.6): ServeConsole's Kick, new, destroys the other player's pawn 5 s after the host is placed, as the game's Kick does. ... (2352149e)
  • The frame after a map's load shows PRECACHING with the render device's UsePrecache on, as the original's (bugs.md PKG.8). The device's UsePrecache, D3DDrv's, is read from the game's render device's se... (f0517042)
  • What stands on an actor that turns, carried as the original's MoveActor carries it (bugs.md PHYS.13; Engine.dll 0x103990e0): each rider moved round the actor by the change of yaw, each yaw to a multip... (aea9d3f2)
  • A border window resized and moved by its border, as the original's (bugs.md EXT.15; Extension.dll XBorderWindow's MouseButtonPressed 0x10001e00, MouseButtonReleased 0x10001ff0, MouseMoved 0x100020e0, ... (12474436)
  • A mover drawn where the level's BSP last filed it, hidden or not, as the original's (bugs.md REN.16; Render.dll SetupDynamics 0x10b22d90, Engine.dll's tracker 0x1037a400). The original's walk draws th... (6f4d14ee)
  • The light effects no stock view tells apart or no stock light shows, run against the original (bugs.md REN.23): LightC...
Read more

2026.10.29-a31b8ade

Choose a tag to compare

@JuggyMcNutty JuggyMcNutty released this 29 Oct 19:12

DXEngine alone, at a31b8ade, for every port, each built as its launcher branch configures it at the commits Port Ex Machina pins (8bc8c5d9). With the launcher, each port's app is in Port Ex Machina's releases.

You supply your own game files. None are included. What each port is and how far along: the ports.

What changed

70ce766...a31b8ad

  • The game folder's System, Maps, save and cache folders in any case -- FindUE1GameInPath opened root/"System"/DeusEx.exe by that exact name, so a copy whose folder a player recased on a case-sensitive ... (a31b8ade)

2026.10.29-70ce766f

Choose a tag to compare

@JuggyMcNutty JuggyMcNutty released this 29 Oct 17:50

DXEngine alone, at 70ce766f, for every port, each built as its launcher branch configures it at the commits Port Ex Machina pins (f787e72a). With the launcher, each port's app is in Port Ex Machina's releases.

You supply your own game files. None are included. What each port is and how far along: the ports.

What changed

b6e8d76...70ce766

  • DEVELOPMENT.md: the original's saves, gone from reference/ -- what holds of them stays: a hub save the original made loads in both engines from Save0009, a quick save there keeps the original from fin... (0308337f)
  • The harness runs the original on Steam's install -- Steam's DeusEx.exe is packed and starts only under Steam's client (its dialog: "Failed to find Steam"), and an install never started keeps FirstRun ... (c556a900)
  • The VM: Clamp and FClamp in the original's order, a native past the table and a cast to a class that did not load script errors -- NObject's Clamp and FClamp took the bounds as std::clamp does, the lo... (c4f0a9f6)
  • Packages and travel: GetExportName reads, a partial travel resets the server, a save's extension in any case -- GetExportName indexed the export table with the 1-based reference unshifted and walked t... (513b3907)
  • The save listing takes every Save* folder, in name order -- it kept only a Save followed by a digit, case and all, so the console's savegame -3, which writes Save-003, and savegame -2's Save-002 w... (5f144ef3)
  • A browse's edges as the original's: a map that is not there fails the travel, ?restart carries nothing, switchlevel is the player's -- a travel to a missing map unloaded the level, then threw opening ... (13ae6887)
  • Movement as the original's: FindBase's test the right way round, a pawn's turn gated as Engine.dll gates it, the latent moves polled in the state code, a trace's extent a radius -- FindBase asked hit-... (f17c283f)
  • The AI events as the original's AIProcess weighs them -- a destroyed sender gave off its last levels until CleanupDestroyed, up to 128 destructions later, where the original's ring zeroes a sender's l... (bcf401af)
  • The windows as the original's: no debug outline, the script's winParent set, a list's GC released, IsActorValid's lookup, a modal under the root alone -- BorderWindow ended its draw with DrawDebugBox,... (f7d3b39b)
  • The links: a UdpLink non-blocking from its making, a TcpLink's failed connect forgotten at the next Open, a vector's bias added unsigned -- BindPort made the socket non-blocking only after a bind that... (31a1a88b)
  • The renderer: water drops within their fields, NEON's light at a texel, a warp's normal, textures stepping in every frame -- a water texture's drops wrote at the full texture's masks into fields half ... (f0c13a16)
  • A Vulkan shot's read-back made visible to the host -- ReadPixels read its staging buffer after the fence with no barrier from the copy's transfer write to host reads and no invalidate, which the spec ... (d27c4e04)
  • The GL device's skipped frame: no flash drawn into it, no read-back of buffers a failed resize left unmade -- EndFlash had no IsLocked test, so on a frame whose Lock failed at the scene buffers' resiz... (20c2e202)
  • The D3D11 and software devices: D3D11 takes what the Vulkan device does of a texture, maps a frame's buffers fresh after a flush; the software device draws a window past 8000 pixels whole, starts a re... (629a32d3)
  • The music plays whole, and a muffled sound whose actor went fades back -- the tracker source answered OpenMPT's frame count where every read counts samples, so the music thread took each 256-sample ch... (e63437c2)
  • The input as the original's: keys on one axis add, key and alias names in any case, a failing engine command logged -- activeInputAxes kept one key an axis, so W held with S pressed over it took S's v... (11d0c140)
  • The fatal error's path: the command line read before it goes, no window system said so -- GameApp's catch asked commandline->HasArg after the try block's end had destroyed the CommandLine it points to... (a56e0a35)
  • The windows' keys and waits as the original's: Alt+Enter toggles full screen, Alt+F4 closes nothing under SDL3, the X11 loop waits with no timer -- Enter with Alt held reached the game as Enter, where... (694fd733)
  • The original's -lanplay through --cmdline -- GetLaunchInfo took -server, INI=, USERINI= and the start URL from the original's command line but not -lanplay, so a dedicated server a launcher started wi... (70ce766f)

2026.10.29-b6e8d763

Choose a tag to compare

@JuggyMcNutty JuggyMcNutty released this 29 Oct 03:28

DXEngine alone, at b6e8d763, for every port, each built as its launcher branch configures it at the commits Port Ex Machina pins (ae498ef9). With the launcher, each port's app is in Port Ex Machina's releases.

You supply your own game files. None are included. What each port is and how far along: the ports.

What changed

59dd1e4...b6e8d76

  • The harness's usage names MultiEditConsole's Keys -- the list tools/dxcap.sh help prints ended at SwimConsole's Only and lacked the key DEVELOPMENT.md lists (bugs.md X2.21) (f4aace06)
  • PerfTurnConsole is named among the consoles DXCAP_MISSION_MAP drives -- it extends PerfConsole and inherits TargetMap, and the harness writes TargetMap into the run's console class's own section, so i... (7557d47a)
  • ENGINE.md names every Settings.json key the engine reads -- the table named Performance.RenderScale, the GLES and Software types, CPUDriver and the pad's six, while the engine also reads the Vulkan, O... (775296f4)
  • ENGINE.md says CPUDriver's GL half is Linux's -- LIBGL_ALWAYS_SOFTWARE is set under #ifndef WIN32 alone, so on Windows CPUDriver with the GL device draws through the GPU's driver, which the doc did no... (4cccf2c8)
  • ENGINE.md names the software device among those that step a mover's surfaces -- the step and slope toward the viewer were said of Vulkan and GL, while the software device biases them too, as its own s... (792d13da)
  • ENGINE.md says which GL scene buffers are immutable -- "each is made with immutable storage (glTexStorage2D)" held for the single-sample colour buffer and the post-process image alone: a multisampled ... (d25afecd)
  • ENGINE.md says what a sound keeps -- "only its length, channels, rate and loop" left out the file's bytes, read at load and decoded again for the lip-sync shapes, and the lip-sync letters (USound) (bu... (2e1ccf9f)
  • NATIVES.md's vsync note covers the Wayland window -- it named X11's and Win32's presents and nothing of the engine's own Wayland window, a dev build's, which copies the frame into its buffer and commi... (51410bf5)
  • NATIVES.md says which spawns a SpawnNotify is not asked about -- an actor spawned while a notification runs, DXEngine's guard against a notification spawning without end; the original's SpawnActor is ... (6c073e39)
  • DEVELOPMENT.md says what empties Save/Current -- travel to another mission or a new game, as it said, and a ?restart URL too (Engine.cpp's two DeleteSaveGameFiles), while a save's load fills it with t... (fbbff9f6)
  • LICENSE.md names the third-party code where it lives and the three it lacked -- ShaderCompiler, vk_mem_alloc, volk and the Vulkan headers were named by Thirdparty/ folders that are gone (they live und... (bdcda488)
  • SDL's quit event closes every window -- SDL's own SIGTERM and SIGINT handlers post it where the engine's handler is not installed, the crash report window's process, and it was dispatched to no window... (681c28c6)
  • SIGHUP quits as a closed window does, with SIGTERM and SIGINT -- a closed terminal's or a logout's SIGHUP, reaching the engine in the launcher's process group, killed it at any time with the inis unwr... (ffbdf063)
  • The full-screen modes are the screen's size in pixels under the X11, Wayland and Win32 windows -- the backends' default answered GetScreenSize's DIPs, so on a desktop scaled 150% the list offered 1280... (64a5048e)
  • The software device's frame is kept within its guard band -- a window over 8000 pixels a side had the strip past 8000 drawn by the clear, ClearZ and the flash alone; such a frame is drawn smaller and ... (5018e71d)
  • The software device's reference check compares once a frame, at its present -- it compared at every DrawRecorded, the draws within a frame too, so the log's 60 frames came after 60 calls and the pixel... (fd05277f)
  • D3D11's detail fade takes the view depth as SV_Position.w gives it -- GLSL's 1 / gl_FragCoord.w was transcribed as 1 / input.pos.w, under 0.003 for any depth of 1 or more, so the fade was 1 at every d... (ed888b20)
  • DXL_LAUNCHER_FD is taken out of the engine's environment once its line is open -- a relaunch of the engine's own inherited the stale number, which SDL_Init may have reused, and set FD_CLOEXEC and O_NO... (239de0e7)
  • netrelay.py learns the channel types from both directions' opening bunches -- c2s and s2c each learned from its own alone, so the client's unreliable calls on the actor channels the server opened coun... (3ee9bc62)
  • D3D11's HDR swap chain asks for scRGB, the linear light its present writes, and the read-back takes the SDR present's gamma -- it asked for the PQ space, which reads linear values as codes, and with H... (e8b74da4)
  • D3D11's rectangle upload is right for every format -- RGB8 offset its source by x bytes where a texel is 3, every rect went unmasked to the unmasked cache entry alone, a padded block texture's rect la... (9605740f)
  • The music source's comment states what is read of Galaxy's song start, not a TODO -- it claimed Galaxy looks for the next non-empty pattern, which galaxy-dll.md does not say (bugs.md E15a.17) (60505620)
  • The mix queue is Latency deep and UseStereo off mixes mono -- the queue was four 10 ms buffers whatever Latency said, Galaxy's mix-ahead reaching the music fade's length alone, and UseStereo=False lef... (aac20a93)
  • NATIVES.md says the render device's Translucency is read and changes nothing -- it is read, saved, GET and SET, and no renderer reads it (bugs.md E5a.32) (77cdf181)
  • grab.py grabs the newest window of the name -- it took the first id, which with a second "Deus Ex" window (an earlier original that outlived its run) may be that one's (bugs.md E17.S4) (227583fd)
  • DrugConsole's HudWindows leaves the HUD's windows shown over the drugged view, as in play -- the console hid every window but the HUD itself, so its frame held DrunkFX's one modulated draw, which the ... (f362d4ac)
  • The palette loop's phase says why it changes nothing: the original's -- LT_TexturePaletteLoop adds LightPhase in whole turns, which the byte of the turn's 256ths drops, and takes them modulo 255, so t... (b60beaa7)
  • The reverb's guards for a delay and a gain of 0 say why they never fire -- they are Galaxy's setup's (0x106109f0), and UpdateReverb holds both to 0.001 and over, as Galaxy's subsystem does (bugs.md E1... (7870d4f6)
  • A class's defaults are read through a defaults object of its native class -- GetDefaultObject cast the UClass to UActor, UPawn, UZoneInfo or UPlayerPawn so their property accessors read the class's Pr... (5ab115c4)
  • The editor's hit test is gone from every device -- both Lock callers passed no hit data and nothing called PushHit or PopHit, yet the Vulkan, GL and D3D11 scene framebuffers carried an R32_UINT hit at... ([4e575aeb](https://gith...
Read more

2026.10.25-59dd1e49

Choose a tag to compare

@JuggyMcNutty JuggyMcNutty released this 25 Oct 00:16

DXEngine alone, at 59dd1e49, for every port, each built as its launcher branch configures it at the commits Port Ex Machina pins (6a8ac135). With the launcher, each port's app is in Port Ex Machina's releases.

You supply your own game files. None are included. What each port is and how far along: the ports.

What changed

0af3d85...59dd1e4

  • The software device's scaffold: Settings.json's "Type": "Software" opens a bitmap window (RenderAPI::Bitmap) and a device that draws on the CPU, into an 8-bit BGRA frame with a float depth buffer at t... (f8597d4)
  • The software device draws the canvas and the UI -- a frame's calls recorded (each scene node and vertex copied) and drawn at Unlock: each chunk of about 128 triangles set up and binned to tiles of 64 ... (822ca1e)
  • The software device draws the 3D scene, on one thread with the float reference shading -- each triangle in clip space by its scene node's transforms, clipped where a corner lies behind the node's clip... (5f9593c)
  • The software device's look in full, in fixed point -- Scene.frag in 2.14 fixed point in lanes of 16 bits, a quad of 2x2 pixels at a time, through SoftwareSimd.h's SSE2, NEON or plain loops, which give... (dfc5fc6)
  • The software device on every core -- a frame drawn at Unlock on every hardware thread, the game's among them (SoftwareWorkers, DXE_SW_THREADS): the chunks' set-up shared out, then the tiles, the most ... (b537abc)
  • Profiling hooks: the software device's part of unlock on a line of its own -- its front end, its tiles, its present (the ramp, the scale) and the window's present, each timed on the game's thread, whi... (5865f93)
  • The software device draws while the frame is recorded -- the chunks go to the workers in waves as they close, set up and drawn into every tile on a background thread's phases while the game's thread r... (1f411ca)
  • Profiling hooks re-based onto the software device's waves -- its part of unlock now the wait for the wave its workers drew while the frame was recorded, then the rest's front end and tiles, its presen... (5b88dfa)
  • Which device draws, as the original's -- -nohard draws with the software device, as the original's software renderer; else Settings.json's Type where it names one; else the device the game's ini names... (266ae2a)
  • Mesa's CPU drivers count as no GPU, the software device being the faster -- a Vulkan device whose only device is a CPU one (lavapipe) and a GL device on llvmpipe or softpipe do not start unless CPUDri... (c7ac0a3)
  • Docs: the software device offered -- DXLauncher's Software renderer, and the device that draws where no GPU device starts (README's switches); ENGINE.md's keys name DXLauncher's renderers for Type Sof... (b2e258f)
  • -noddraw's window where the software device takes a GPU device's place -- the original's software renderer has no fullscreen mode without DirectDraw, so where its GameRenderDevice does not start and W... (05858bb)
  • Harness: a dxe run whose GPU device does not start fails, as an original run that falls back to SoftDrv does -- the software device then draws in its place and its frames would pass for the GPU device... (adfdb92)
  • Docs swept for the software device's hand-off -- README: the renderers on the CPU too, X11's Xext among the build's files (MIT-SHM), and the engine drawing on the CPU where no GPU device starts, no lo... (0ba2243)
  • Docs: what differs from the original, in the present tense -- the README's features and status, DEVELOPMENT.md, ENGINE.md and NATIVES.md say what differs, not what "still" differs, and the engine is n... (65bdd6e)
  • Docs: the hand-off's last sweep -- ENGINE.md's fallback window full screen but with -noddraw (05858bb's, which only NATIVES.md said); the README's device chosen by the game's ini only for SoftDrv, as ... (59dd1e4)

2026.10.24-0af3d85f

Choose a tag to compare

@JuggyMcNutty JuggyMcNutty released this 24 Oct 13:21

DXEngine alone, at 0af3d85f, for every port, each built as its launcher branch configures it at the commits Port Ex Machina pins (669d07ea). With the launcher, each port's app is in Port Ex Machina's releases.

You supply your own game files. None are included. What each port is and how far along: the ports.

What changed

a628827...0af3d85

  • README laid out for a release, with screenshots: the game on the engine -- Liberty Island, Hong Kong's Tonnochi Road and market, the intro, a conversation's choices, the MJ12 helibase, the Ocean Lab -... (7052258)
  • README: the screenshots' note names no size -- the shots are 1920x1002 frames, not the 1920x1080 it said (ad3dcdd)
  • Pawn: the unused UPawn::AICanSmell goes -- the native answers 0 itself, as the original's does, and the method no one called still logged Unimplemented (b6790ca)
  • Edit fields as the original's XEditWindow: rows as the large text window breaks them, kept with each one's start, its characters without and with its trailing spaces and its text state; a place's row ... (fda779a)
  • The level's bDropDetail and bAggressiveLOD cleared before each level tick as the original's game engine clears them, only with a client -- not a frame-rate test to come, as the code's note had it: the... (ed390b2)
  • Textures: Deus Ex's formats alone, and 5.8's mod texture paths -- UT 469's formats gone from every device (the RGB10A2 uploaders, which read their own destination, the 2D-block ones, Vulkan's BC2 to B... (ff7337f)
  • Vulkan: the scene pipelines' depth bias dynamic -- 33 pipelines, 37 with the lines and points, where a mover's surfaces had 32 of their own (69 at start and on each resolution or MSAA change); the bia... (6a9ee5a)
  • The scene's polygons half a pixel right of and below its middle, as D3DDrv draws the original's -- Render.dll projects a polygon's corners about FX15 but a sprite's place and a corona's about FX2, and... (47474bc)
  • ConvertVectorToCoordinates as the original's -- the point in front of the eye or not wherever it lands, where DXEngine answered whether it fell inside the window, so the frob highlight's box takes in ... (b79b0ac)
  • The occlusion grid's pixels as the original's: a surface's by its centre, a sprite proxy's by its upper left corner -- the original's span buffer takes a surface's pixel by its lower right corner in i... (b26be5f)
  • Profiling hooks re-based on today's engine -- the surface test's hook beside the decals' test VisibleFrame gained, the rest moved lines (perf.sh on's three-way merge, perf.sh save) (e846a1e)
  • Fog maps only where a fog light reaches -- a fog map takes only the fog lights a line of sight from the eye to its texels can cross, their sphere against the pyramid from the eye to its corner texels ... (094736d)
  • Static actors filed in the BSP once, then in turn -- a static actor does not move (its Location const to scripts, the original moving none): filed when the level sorts its actors, static first as the ... (de4bbec)
  • Profiling hooks: the BSP set-up's section takes the static actors' pass -- UpdateStaticActors inside bsp-info with the dynamic actors' loop and the movers' refiling, which the three-way merge onto the... (15370cc)
  • The occlusion grid's rows a cache line each -- each row's spans in a 64-byte block of its own while 15 fit, then on the heap until the next frame's set-up (BspClipper::ClipRow), where every row was a ... (42d023f)
  • sample-report.py: an engine linked to a fixed address keeps nm's addresses -- the cross builds are ELF type EXEC, nm giving the addresses they run at, where the script took the mapping's start off eve... (7d69b75)
  • Movers' mirrors looked for among the movers with one -- ProcessMoverMirrors cast each of the level's actors to a mover every frame drawn, 2,604 dynamic_casts on Liberty Island for none there; the move... (9532c4c)
  • Light maps in shared pages, the opaque surfaces by zone, texture and light map -- each light map placed, when first built at its size, in a page of 1024 texels a side (LightmapAtlas, shelves), with a ... (aea5d4c)
  • Profiling hooks re-based on the light maps' pages -- VisibleFrame's include beside (b3958bc)
  • Light map pages: each map's border repeats its edges -- the wrap's opposite edges made a change at any edge rewrite the border on the far side, so the part sent spanned the map and its border (Battery... (4de67a5)
  • Docs swept for the hand-off -- the round's figures as they stand, without the ones before: NATIVES.md's scene's pixels (the laser's fit before the half pixel, "a sprite and the canvas draw where they ... (0af3d85)

2026.10.23-a628827a

Choose a tag to compare

@JuggyMcNutty JuggyMcNutty released this 23 Oct 02:47

DXEngine alone, at a628827a, for every port, each built as its launcher branch configures it at the commits Port Ex Machina pins (381b310b). With the launcher, each port's app is in Port Ex Machina's releases.

You supply your own game files. None are included. What each port is and how far along: the ports.

What changed

The first release.