Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
523 commits
Select commit Hold shift + click to select a range
1ca497e
fix(sdl3): restore edge-scroll mouse capture
bobtista Jun 28, 2026
89ca335
build: guard strings.h include behind _WIN32 so the SDL3 trunk builds…
bobtista Jun 8, 2026
f70d78b
feat(bigfile): load Zero Hour archives from $CNC_ZH_INSTALLPATH on no…
bobtista Jun 8, 2026
ea3e966
fix(gui): stop updating window transitions after their GameWindow is …
bobtista Jun 9, 2026
54afbed
bugfix(shroud): bounds-check getShroudLevel so river-water shroud sam…
bobtista Jun 11, 2026
ad2a699
bugfix(specialpower): charge uninitialized building special powers re…
bobtista Jun 12, 2026
d863531
bugfix(challenge): set difficulty and frame cap when continuing a Gen…
bobtista Jun 13, 2026
14599b6
bugfix(challenge): skip stale shell-map new-game so Generals Challeng…
bobtista Jun 13, 2026
11cf060
build(sdl3): define ApplicationHInstance in the Windows SDL3 entry po…
bobtista Jun 13, 2026
add3682
tweak(camera): remove hardcoded zoom-out/aspect scaling and GGC_FORCE…
bobtista Jun 14, 2026
9f60e71
perf(debug): buffer debug log writes instead of flushing every line
bobtista Jun 15, 2026
80aac22
bugfix(challenge): finish opponent taunts before starting the match
bobtista Jul 24, 2026
8ca06f5
bugfix(gui): hide radius targeting cursors behind the quit menu
bobtista Jul 24, 2026
c90ea16
tweak(mod): Report a missing mod folder in release builds
bobtista Jul 29, 2026
687f207
feat(bgfx): add split-screen wipe to compare composite post effects
bobtista Jun 15, 2026
55ee01c
feat(bgfx): add toggleable color-grade post effect (tone curve, tempe…
bobtista Jun 15, 2026
7b20786
feat(bgfx): add half-res bloom post effect (bright-pass, separable bl…
bobtista Jun 15, 2026
ae5e7fc
feat(bgfx): add opt-in HDR scene color with ACES tonemapping
bobtista Jun 15, 2026
c333793
tweak(bgfx): show fully-unprocessed scene on the wipe's before side
bobtista Jun 15, 2026
e161b7f
tweak(bgfx): make bloom highlight-only (soft knee, higher default thr…
bobtista Jun 15, 2026
b1583fa
tweak(bgfx): gentle HDR highlight rolloff so the base scene is not ov…
bobtista Jun 15, 2026
1bed6d5
feat(bgfx): add vignette, chromatic aberration, and film grain post e…
bobtista Jun 15, 2026
1feaff5
feat(bgfx): add screen-space ambient occlusion (SSAO)
bobtista Jun 15, 2026
6e2e247
feat(bgfx): true MSAA on the offscreen scene framebuffer with smudge …
bobtista Jun 15, 2026
f9c29b7
feat(bgfx): add internal render-scale (supersampling) for the 3D scene
bobtista Jun 15, 2026
81cecef
feat(bgfx): add per-pixel specular highlights to the uber shader
bobtista Jun 15, 2026
1756126
feat(bgfx): add fresnel rim lighting with alpha-test gate and soft hi…
bobtista Jun 15, 2026
32c0372
feat(bgfx): add material emissive boost for self-illuminated surfaces
bobtista Jun 15, 2026
bd3ef21
feat(bgfx): add sun shadow map with stencil-volume suppression
bobtista Jun 16, 2026
ddbeb8e
tweak(bgfx): fade material specular and rim toward white to prevent b…
bobtista Jun 16, 2026
644ec70
feat(bgfx): add point-filter debug toggle for texture-filtering A/B
bobtista Jun 16, 2026
2aa8859
tweak(bgfx): sun shadow normal-offset bias and 5x5 PCF for cleaner so…
bobtista Jun 16, 2026
3144503
feat(bgfx): cascaded sun shadow maps (3 cascades in a 2x2 atlas)
bobtista Jun 16, 2026
b7e121c
feat(bgfx): infantry/foliage cast real silhouette shadows via alpha-a…
bobtista Jun 16, 2026
8608630
bugfix(bgfx): only apply sun shadow to sun-facing surfaces to stop ba…
bobtista Jun 16, 2026
fe38c33
bugfix(bgfx): apply sun shadow to terrain pixel-shader path so the gr…
bobtista Jun 16, 2026
8663ff6
tweak(bgfx): texel-snap sun shadow cascades to stop thin-shadow flicker
bobtista Jun 16, 2026
5734260
bugfix(bgfx): objects only cast sun shadows, never receive them (kill…
bobtista Jun 16, 2026
29871ef
tweak(bgfx): sharpen sun shadow PCF to 3x3 for crisper silhouette edges
bobtista Jun 16, 2026
1b1bf79
bugfix(bgfx): always allocate the sun shadow target so a load-time fr…
bobtista Jun 16, 2026
46f58c9
fix(bgfx): render terrain sun shadows - order shadow cascades before …
bobtista Jun 16, 2026
6065650
fix(bgfx): receive sun shadows on roads and ground decals
bobtista Jun 17, 2026
c236bb8
feat(bgfx): Persist sun shadows for off-screen casters with soft PCF
bobtista Jun 17, 2026
c877bb2
bugfix(bgfx): Keep road textures unmipped so distant roads stop fadin…
bobtista Jun 17, 2026
4b3d2ee
feat(bgfx): Soften sun shadow strength and let objects receive cast s…
bobtista Jun 17, 2026
2b88275
tweak(bgfx): Default to 4x MSAA to anti-alias building and terrain edges
bobtista Jun 18, 2026
59eb211
feat(bgfx): Cast helicopter rotor-blur into the sun shadow map so rot…
bobtista Jun 18, 2026
0884556
bugfix(bgfx): Lock sun-shadow direction to the scene sun so dynamic l…
bobtista Jun 18, 2026
c5640a7
tweak(bgfx): Gate render diagnostics behind GGC_TRACE and mute benign…
bobtista Jun 18, 2026
aa06bf4
bugfix(bgfx): Sample coarser sun-shadow cascades when the tight one h…
bobtista Jun 18, 2026
12d04c4
feat(bgfx): Add capped shader-side anisotropic base-texture sampling …
bobtista Jun 18, 2026
e2b56c6
bugfix(bgfx): Blend sun-shadow cascades and restrict the off-screen-c…
bobtista Jun 18, 2026
f5618bc
bugfix(bgfx): Sync shader cull mode in Set_Shader so two-sided effect…
bobtista Jun 19, 2026
4a7d93e
refactor(bgfx): Replace sun-shadow cascades with a single camera-fit …
bobtista Jun 19, 2026
0f9878c
feat(bgfx): Add Ctrl+Alt dev hotkeys to toggle bloom/HDR/SSAO/MSAA/re…
bobtista Jun 19, 2026
88793c5
bugfix(bgfx): Fix Strategy Center slab banding artifacts
bobtista Jun 19, 2026
10a591a
bugfix(bgfx): restore DX8 alpha-blend smudge model so heat haze stops…
bobtista Jun 21, 2026
8b8d147
perf(bgfx): cache env and slab-texture lookups and gate perf timing t…
bobtista Jun 21, 2026
170cba2
tweak(bgfx): raise default specular strength to 3.0
bobtista Jun 21, 2026
bb23dd5
chore(bgfx): remove unused BgfxHeatHazeOpacityScale global
bobtista Jun 21, 2026
8119995
style(bgfx): normalize smudge submit block indentation to spaces
bobtista Jun 22, 2026
fe596d9
bugfix(bgfx): keep offscreen tree shadow casters submitted
bobtista Jun 25, 2026
438469f
perf(bgfx): cut sun-shadow PCF from 36 to 9 texture fetches per pixel
bobtista Jun 29, 2026
1fd0e53
fix(bgfx): convert instance matrices and cast instanced meshes into t…
bobtista Jun 29, 2026
43d1c61
fix(bgfx): match EMP Patriot effect rendering
bobtista Jul 2, 2026
3668bb1
tweak(bgfx): name the post-effect defaults, hotkey values, and shader…
bobtista Jul 7, 2026
ae7af30
feat(bgfx): add CastsShadows flag to dynamic lights and LightPulse FX
bobtista Jun 22, 2026
590fe22
feat(bgfx): query strongest shadow-casting dynamic light from the scene
bobtista Jun 22, 2026
658d4ff
feat(bgfx): add point-shadow target, uniforms, and view id
bobtista Jun 22, 2026
f174026
feat(bgfx): render a perspective shadow map for the caster dynamic light
bobtista Jun 22, 2026
7c2dbfd
feat(bgfx): sample the point-light shadow and darken its per-light co…
bobtista Jun 22, 2026
ffb6db2
fix(bgfx): correct point-shadow strength/bias packing and add GGC_POI…
bobtista Jun 23, 2026
df80e55
feat(bgfx): add BgfxDynamicLightShadows toggle and dev hotkey (defaul…
bobtista Jun 23, 2026
60c637d
fix(bgfx): move GGC_POINT_SHADOW_VIZ blit to top-left clear of the co…
bobtista Jun 23, 2026
7c1dd3f
refactor(bgfx): apply nuke shadow as a dedicated point light (not a L…
bobtista Jun 23, 2026
434229d
feat(bgfx): apply the dedicated nuke point light + cast shadow to ter…
bobtista Jun 23, 2026
198b32b
feat: spawn a shadow-casting dynamic light at the nuke (neutron missi…
bobtista Jun 23, 2026
68f72c2
tweak: dim the nuke light and darken its cast shadow; gate the spawn …
bobtista Jun 23, 2026
3ec294d
feat(bgfx): particle-cannon beam glow with faction color, specular gl…
bobtista Jun 23, 2026
f4c4a9d
fix(bgfx): tame terrain cloud-shadow (reduce strength, guard offset t…
bobtista Jun 23, 2026
90d1b20
feat(bgfx): add -bgfxEffects CLI flag to enable optional lighting eff…
bobtista Jun 23, 2026
2494cc1
fix(bgfx): tame nuke cast shadows via LightPulse ShadowStrength and f…
bobtista Jul 17, 2026
d2e5219
perf(bgfx): merge volume-particle depth layers into one draw to cut s…
bobtista Jun 3, 2026
585a0d4
perf(bgfx): gate O(n^2) coplanar-normal scan to decal draws instead o…
bobtista Jun 3, 2026
7a81685
perf(bgfx): skip texture upload-plan re-derivation and DXT5 alpha res…
bobtista Jun 3, 2026
bf70c78
perf(bgfx): coalesce additive sorted-particle runs into one draw per …
bobtista Jun 4, 2026
52e18fd
perf(bgfx): pipeline bgfx::frame() onto a dedicated render thread (GG…
bobtista Jun 4, 2026
2a62269
diag: attribute End_Dynamic_Vertex_Write ownership (scan/alloc/verts …
bobtista Jun 4, 2026
05316ed
perf(bgfx): default macOS to bgfx render thread and no flush-after-re…
bobtista Jun 4, 2026
1989ee1
perf(bgfx): default the bgfx render thread on for Windows/DX11
bobtista Jun 4, 2026
6825c13
perf(bgfx): optional sub-pixel mesh rejection (GGC_BGFX_CULL_SUBPIXEL)
bobtista Jun 4, 2026
73a6506
docs(scene): correct sub-pixel-cull comment - culling also skips the …
bobtista Jun 6, 2026
f2ba87b
perf(bgfx): skip disabled point-shadow uniform payload
bobtista Jun 26, 2026
0c56a35
tweak(bgfx): add a logic_frame column to the render profiling CSV
bobtista Jun 26, 2026
89466c6
tweak: decouple GUI window-move animations from the render frame rate
bobtista Jun 27, 2026
c86fe40
tweak: decouple GUI window-move animations from the render frame rate…
bobtista Jun 27, 2026
e155cbd
perf(bgfx): default GPU instancing on for rigid mesh draws
bobtista Jul 1, 2026
14bea77
fix(bgfx): use bgfx's descending TEXCOORD semantics for instance data…
bobtista Jul 2, 2026
9a41d73
perf(bgfx): trim sorted replay CPU overhead and add probe/instancing/…
bobtista Jul 2, 2026
d587caa
fix(bgfx): preserve vertexColorFlags[0] in sorted material snapshot s…
bobtista Jul 2, 2026
d1717a5
tweak: use MSEC_PER_SECOND in the auto-exit diagnostic timer
bobtista Jul 7, 2026
daa7f4e
tweak(bgfx): name the subpixel-cull default and shroud diagnostic has…
bobtista Jul 7, 2026
95ef04d
refactor(bgfx): share one case-insensitive substring helper across th…
bobtista Jul 7, 2026
c2ebdab
fix(bgfx): skip resource destruction from static destructors after pr…
bobtista Jul 8, 2026
3d7354e
fix(bgfx): extend the exit-teardown guard to the texture cache entry …
bobtista Jul 8, 2026
f853316
feat: add GgcRuntimeFlags registry for GGC_ runtime environment flags
bobtista Jul 8, 2026
db58bea
refactor(bgfx): read backend runtime flags through GgcRuntimeFlags
bobtista Jul 8, 2026
123f014
refactor: read engine and client GGC_ runtime flags through GgcRuntim…
bobtista Jul 8, 2026
807d1dd
tweak: drop dead -bgfxInstancing and -bgfxKeepStaticVolumeShadows arg…
bobtista Jul 8, 2026
66316ae
tweak(bgfx): remove vestigial GGC_MACOS_NO_FLUSH and GGC_MACOS_PREWAR…
bobtista Jul 8, 2026
b8204f2
refactor: set command-line GGC flag overrides through GgcRuntimeFlags
bobtista Jul 8, 2026
55d5be9
feat(bgfx): add INI settings for renderer, stencil shadows, sRGB and …
bobtista Jul 8, 2026
279697c
tweak: warn when a runtime-flag override is dropped by the diagnostic…
bobtista Jul 8, 2026
3b41272
refactor(bgfx): read the legacy z-bias trace toggle through GgcRuntim…
bobtista Jul 8, 2026
54d1477
feat(diag): Add GGC_LOG_SLEEPY_FINGERPRINT per-frame scheduler finger…
bobtista Jul 13, 2026
9bdd9da
fix(bgfx): compensate camera-space engine-view draws for the retroact…
bobtista Jul 8, 2026
0c36ec3
feat(bgfx): add opt-in sorted texture-array merge path for adjacent s…
bobtista Jul 8, 2026
880d5b1
feat: add -bgfxSortedTextureArray argument for the sorted texture-arr…
bobtista Jul 8, 2026
156d03d
feat(bgfx): world-bake eligible sorted runs so texture-array merges s…
bobtista Jul 8, 2026
ab4ae09
fix(bgfx): sample the texture array on the uber base path and pass th…
bobtista Jul 8, 2026
a2ea7fc
fix(bgfx): invalidate sorted texture-array slots on texture release a…
bobtista Jul 8, 2026
4cb904f
fix(bgfx): upload fully defined sorted texture-array page mips and st…
bobtista Jul 8, 2026
31defcc
fix(bgfx): exclude tiled-UV and potentially-lit draws from sorted tex…
bobtista Jul 8, 2026
854efc6
feat(bgfx): decode DXT1 and DXT3 textures into sorted texture-array p…
bobtista Jul 8, 2026
fa1c685
tweak(bgfx): gate sorted-array diagnostics, drop dead matcher and wri…
bobtista Jul 8, 2026
73dfc2e
fix(bgfx): correct the sorted-array lit-draw exclusion to the emissiv…
bobtista Jul 8, 2026
1d7fc38
fix(bgfx): keep mesh-origin sorted sprites on the classic replay path
bobtista Jul 8, 2026
73aa4b0
refactor(bgfx): resolve sorted texture-array eligibility at capture t…
bobtista Jul 8, 2026
1ff97b2
fix(bgfx): suppress the fallback engine submit when a sorted texture-…
bobtista Jul 8, 2026
6e914ca
fix(bgfx): exclude streaks from sorted texture-array world-bake eligi…
bobtista Jul 10, 2026
ddc55d9
fix(bgfx): apply sorted texture-array page and baked-run transform on…
bobtista Jul 10, 2026
a914d03
fix(bgfx): require matching material snapshots when merging sorted te…
bobtista Jul 10, 2026
7acf8f0
refactor(bgfx): submit sorted-pool runs through a single packet entry…
bobtista Jul 10, 2026
856cae7
refactor(bgfx): hand sorted packet submits to the engine-submit core …
bobtista Jul 10, 2026
41c2fb7
refactor(bgfx): factor the final pipeline-state derivation into one s…
bobtista Jul 10, 2026
4de5ab1
perf(bgfx): resolve the sorted pipeline-state word once at capture time
bobtista Jul 10, 2026
a55d3bf
perf(bgfx): upload frame-constant shadow/eye/ambient uniforms once pe…
bobtista Jul 10, 2026
c092ece
perf(bgfx): elide unchanged material and light uniform blocks per fra…
bobtista Jul 10, 2026
caf0b32
refactor(bgfx): submit rigid mesh draws through a single packet entry…
bobtista Jul 10, 2026
c8b0750
fix(maps): normalize map-name separators for the Windows map-cache lo…
bobtista Jul 11, 2026
badaf1a
fix(save): normalize legacy portable map paths before parsing on load
bobtista Jul 11, 2026
535beaf
perf(bgfx): enable the sorted texture-array merge by default
bobtista Jul 11, 2026
a123979
fix(archive): retry transient BIG archive open failures and report fa…
bobtista Jul 11, 2026
b554214
feat(diag): surface silent asset-load failures in release builds
bobtista Jul 11, 2026
8bceeeb
feat(diag): report end-of-load object, drawable, and shroud census un…
bobtista Jul 11, 2026
d2ea23b
bugfix(camera): cancel in-flight scripted camera moves when restoring…
bobtista Jul 11, 2026
1645289
Revert "bugfix(camera): cancel in-flight scripted camera moves when r…
bobtista Jul 11, 2026
a2fa235
bugfix(sdl3): seed the mouse position from the OS cursor so an untouc…
bobtista Jul 11, 2026
e9f2f93
bugfix(sdl3): reconcile the mouse position with the OS cursor instead…
bobtista Jul 11, 2026
84836cc
feat(diag): drill-down phase timers for sorted insertion, state captu…
bobtista Jul 11, 2026
1a14dc4
bugfix(mempool): skip strict pool teardown on all bgfx builds, not on…
bobtista Jul 12, 2026
83c3314
bugfix(except): guard thread unregistration against the destructed ex…
bobtista Jul 12, 2026
3e3860f
bugfix(sdl3): quit through the engine on auto-exit instead of bypassi…
bobtista Jul 12, 2026
1259d2f
bugfix(weapon): Fix use-after-free when firing a shot rebuilds the so…
bobtista Jul 9, 2026
7cddbb1
bugfix(script): Fix iterator invalidation and use-after-free when scr…
bobtista Jul 9, 2026
b9446f0
bugfix(team): Damage team members from a snapshot so garrisoned build…
bobtista Jul 9, 2026
c029dcf
bugfix(globaldata): Stop GlobalData overrides sharing the weapon bonu…
bobtista Jul 9, 2026
61af0cc
bugfix(body): Iterate a copy of the contain list when killing garriso…
bobtista Jul 9, 2026
ee7db01
bugfix(locomotor): Fix invalidated map iterator when LocomotorStore r…
bobtista Jul 9, 2026
94d8d35
bugfix(recorder): Fix one-past-the-end write when reading replay stri…
bobtista Jul 9, 2026
4b8a6c0
bugfix(gui): Remove destroyed windows from the whole modal stack inst…
bobtista Jul 9, 2026
e3b73a3
feat(screenshot): Capture PNG screenshots on the bgfx backend and def…
bobtista Jul 9, 2026
9cd10fa
bugfix(gameengine): Prevent logic time accumulation while the game is…
bobtista Jul 9, 2026
0a8f9ca
bugfix(gameengine): Check for halted game before fast forward so paus…
bobtista Jul 10, 2026
40b06f5
bugfix(commandxlat): Unpause the game when engaging replay fast forwa…
bobtista Jul 12, 2026
27611ac
bugfix(framepacer): Ignore the user logic time scale during replay pl…
bobtista Jul 12, 2026
8094383
bugfix(gamelogic): Keep replay auto-selection out of the observer HUD
bobtista Jul 13, 2026
6bc7e79
bugfix(recorder): Do not inject recorded commands before the replay's…
bobtista Jul 13, 2026
9e693d3
bugfix(ww3d2): Prevent overflow of sorting buffers when exceeding 655…
bobtista Jul 13, 2026
8c9a3eb
fix(gui): Stop game time clock from jittering horizontally
bobtista Jul 7, 2026
2fe2c15
bugfix(bgfx): bounds-check the fixed 8MB Metal per-frame uniform buff…
bobtista Jul 13, 2026
82b9762
perf(bgfx): read global per-frame shadow constants from a data textur…
bobtista Jul 14, 2026
9724a4a
feature(bgfx): Load optional Data/INI/Bgfx.ini so bgfx render setting…
bobtista Jul 14, 2026
cf0e23f
feature(bgfx): Ship annotated Bgfx.ini template and stage it into new…
bobtista Jul 16, 2026
3e8f4e2
build(dist): Share the default Bgfx.ini across packages
bobtista Jul 30, 2026
495972e
build(macos): Point the launch wrapper at a configurable retail archi…
bobtista Jul 30, 2026
581873d
fix(bgfx): apply vertex-material UV mappers at material bind so anima…
bobtista Jul 16, 2026
d3247bb
fix(bgfx): keep explicit alpha-test overrides from being reset to the…
bobtista Jul 16, 2026
87889aa
fix(bgfx): translate the missing detail-color funcs and render SUBR w…
bobtista Jul 16, 2026
84e9794
fix(bgfx): match the retail inverse linear+quadratic point-light fall…
bobtista Jul 16, 2026
8450ac5
fix(bgfx): kick texture loading at bind time and make runtime texture…
bobtista Jul 16, 2026
56983b4
fix(bgfx): stop advertising fog support the backend does not implement
bobtista Jul 16, 2026
b6e206f
fix(bgfx): restore the retail road stage-1 alpha op and correct the s…
bobtista Jul 16, 2026
5295ab3
tweak(bgfx): document why cull inversion and spot cones are intention…
bobtista Jul 16, 2026
561c31b
feat(scripts): add W3D content-coverage scanner cross-referencing shi…
bobtista Jul 16, 2026
f5463ce
feat(scripts): add logic-frame anchored A/B capture and comparison ha…
bobtista Jul 16, 2026
de840ee
feat(bgfx): experimental GGC_PCANNON_ENHANCED particle-cannon effects…
bobtista Jul 14, 2026
7cecf45
feat(bgfx): light camera shake while the enhanced particle-cannon bea…
bobtista Jul 17, 2026
462116e
tweak(bgfx): Refine enhanced Particle Cannon flashes and shadows, exp…
bobtista Jul 18, 2026
87d2c8c
ci: Add BGFX Builds workflow publishing win64 and macOS builds to a r…
bobtista Jul 15, 2026
f7a7daf
ci: Stage the macOS runtime dir inside the workspace
bobtista Jul 15, 2026
1d51e57
ci: Disable the MiniDumper crash dump on the fresh macOS configure
bobtista Jul 15, 2026
c924d90
ci: Also publish exe-only Windows zips for users who already have the…
bobtista Jul 15, 2026
2b24ff3
ci: Cache compilations with sccache to speed up warm builds
bobtista Jul 15, 2026
4093915
ci: Use ccache on macOS because sccache drops the ObjC++ language flag
bobtista Jul 15, 2026
5b383ab
ci(bgfx): auto-build and publish the rolling release on every trunk push
bobtista Jul 16, 2026
1de49c7
ci(bgfx): cache compilation via single-archive sccache/ccache to stop…
bobtista Jul 16, 2026
5c52ed4
ci(bgfx): Bundle the default Bgfx.ini in release archives
bobtista Jul 30, 2026
3976ec4
bugfix(gui): Render windowless whole-screen fades on non-Windows builds
bobtista Jul 18, 2026
35642ee
bugfix(bgfx): Render the mission-start multiply fade
bobtista Jul 18, 2026
4a552b1
fix(bgfx): release sorted-array mapper peek, refuse partial instance …
bobtista Jul 16, 2026
91fc857
fix(bgfx): detect the delayed shroud pass before guarded uniform uplo…
bobtista Jul 16, 2026
418e40f
fix(bgfx): mirror light environments into the fixed-function state so…
bobtista Jul 16, 2026
6208a3e
fix(bgfx): run the effect-overlay and RTT views sequentially to honor…
bobtista Jul 16, 2026
bf9282d
fix(bgfx): restrict the instancing reorder to opaque batch candidates…
bobtista Jul 16, 2026
8b36deb
tweak(bgfx): document the strategy-center UV remap and skip the copla…
bobtista Jul 16, 2026
fff9b8d
fix(w3d): reverse the crossfade mask texture-projection factor order …
bobtista Jul 16, 2026
7cc27f8
fix(bgfx): drop the ground-alignment vertex fixup that halved and mir…
bobtista Jul 16, 2026
b4a13a8
fix(bgfx): restrict particle size compensation to water wakes
bobtista Jul 24, 2026
5188963
fix(bgfx): require snapshot and array-page agreement before merging s…
bobtista Jul 16, 2026
9147aa5
feat(bgfx): apply the static terrain noise lightmap in the uber shade…
bobtista Jul 16, 2026
2449e76
fix(bgfx): route the deforming grid water mesh through the water view…
bobtista Jul 16, 2026
594d916
fix(bgfx): reset shadow-related fields when recycling a pooled dynami…
bobtista Jul 17, 2026
bf8002e
fix: only inset atlas UV sub-rects on the shader pipeline, keeping re…
bobtista Jul 17, 2026
4bcb2d7
fix(bgfx): keep vertex alpha unscaled in vs_trees to match the DX8 v1…
bobtista Jul 17, 2026
a314616
bugfix(bgfx): match vs_trees varying output to fs_uber inputs (v_scen…
bobtista Jul 20, 2026
617ab2c
bugfix(video): service the movie audio stream instead of restarting i…
bobtista Jul 13, 2026
92b8670
bugfix(video): restore the Bink frame index contract so movie complet…
bobtista Jul 13, 2026
05e3a26
bugfix(video): make frameGoto seek to the requested frame
bobtista Jul 13, 2026
f25fd19
bugfix(video): keep fractional frame time so video stays synced with …
bobtista Jul 13, 2026
5bec8f7
bugfix(video): stop movie audio when the video stream closes
bobtista Jul 13, 2026
98c1fa6
bugfix(video): map 24 bit video buffers to BGR byte order
bobtista Jul 13, 2026
92953d5
bugfix(sdl3): generate mouse double click events from the SDL click c…
bobtista Jul 13, 2026
fb77c15
bugfix(sdl3): read the live Caps Lock toggle state from SDL
bobtista Jul 13, 2026
0773e87
bugfix(sdl3): route window close through the quit menu like the Win32…
bobtista Jul 13, 2026
4a6fe67
bugfix(sdl3): idle the engine while the window is minimized like the …
bobtista Jul 13, 2026
ceeb570
bugfix(gui): Skip shell screen re-init during teardown to prevent Gam…
bobtista Jul 21, 2026
263802f
fix(bgfx): remove custom EMP Patriot recoloring
bobtista Jul 24, 2026
1c448ac
feat(linux): Add native Linux SDL3/bgfx build with preset, port fixes…
bobtista Jul 24, 2026
8766102
build(linux): Guard strlcpy/strlcat/wcslcpy/wcslcat against glibc 2.38+
bobtista Jul 24, 2026
7e51f3f
build(linux): Guard strlcpy family declarations for glibc 2.38 and ma…
bobtista Jul 24, 2026
06ed4e6
build(linux): Fix case-sensitive include of Common/file.h in FFmpegFile
bobtista Jul 24, 2026
ef86ab2
feat(linux): render text with FreeType and Fontconfig
bobtista Jul 24, 2026
a8489f2
build(linux): Keep FreeType out of render2dsentence public header; ad…
bobtista Jul 24, 2026
3bcdb51
build(linux): Bundle the default Bgfx.ini
bobtista Jul 30, 2026
5844a36
docs(release): Drop unbundled install-mod.sh from Linux download notes
bobtista Jul 25, 2026
fd9ab2d
feat(linux): Add WINE/Proton import helper to migrate existing .big f…
bobtista Jul 25, 2026
52bb266
build(linux): Build and bundle a minimal self-contained FFmpeg for di…
bobtista Jul 25, 2026
3838109
feat(linux): Search Steam Deck SD-card and Proton compatdata paths in…
bobtista Jul 25, 2026
e209a07
build(linux): Leave the host freetype/fontconfig sub-stack unbundled …
bobtista Jul 25, 2026
c57c5fd
docs(release): Split download page into Windows, macOS and Linux setu…
bobtista Jul 25, 2026
52a8674
docs(release): Reword game-data note to reference only a copy you own
bobtista Jul 25, 2026
7597b61
feat(linux): Find Steam installs across distros and import loose Data…
bobtista Jul 28, 2026
e347580
docs(release): Lead the Linux setup with the import helper
bobtista Jul 28, 2026
6bf929d
fix(linux): Ignore the build folder when locating game data in import…
bobtista Jul 29, 2026
8786372
ci(bgfx): Fetch the pinned FFmpeg asset from the latest-tagged release
bobtista Jul 29, 2026
df974a8
ci(bgfx): Retry the FFmpeg download around asset republishing
bobtista Jul 29, 2026
f106b71
build: Resolve upstream rebase integration gaps
bobtista Jul 30, 2026
1d1f66d
build(release): Make rolling archives self-contained
bobtista Jul 30, 2026
5649803
bugfix(string): Keep %hs printable when rewriting wide formats for libc
githubawn Jul 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
383 changes: 383 additions & 0 deletions .github/workflows/bgfx-builds.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,383 @@
name: BGFX Builds

run-name: bgfx builds from ${{ inputs.ref || github.ref_name }}

permissions:
contents: write

on:
push:
branches:
- bobtista/topic/trunk
workflow_dispatch:
inputs:
ref:
description: "Branch, tag, or SHA to build"
required: false
default: "bobtista/topic/trunk"
type: string
publish:
description: "Update the latest-bgfx rolling release"
required: false
default: true
type: boolean

concurrency:
group: bgfx-builds
cancel-in-progress: true

env:
FFMPEG_WIN64_ASSET: ffmpeg-n8.1-latest-win64-gpl-shared-8.1

jobs:
win64:
name: ${{ matrix.preset }}
strategy:
fail-fast: false
matrix:
include:
- preset: win64
config: Release
zip: GeneralsZH-win64
- preset: win64-debug
config: Debug
zip: GeneralsZH-win64-debug
runs-on: windows-2022
timeout-minutes: 120
outputs:
sha: ${{ steps.sha.outputs.sha }}
steps:
- name: Checkout Code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
ref: ${{ inputs.ref || github.ref_name }}

- name: Resolve Built Commit
id: sha
shell: pwsh
run: |
"sha=$(git rev-parse HEAD)" >> $env:GITHUB_OUTPUT

- name: Cache FFmpeg
id: cache-ffmpeg
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
with:
path: .deps-cache/ffmpeg-x64
key: ffmpeg-win64-${{ env.FFMPEG_WIN64_ASSET }}

- name: Download FFmpeg
if: steps.cache-ffmpeg.outputs.cache-hit != 'true'
shell: pwsh
run: |
$asset = "$env:FFMPEG_WIN64_ASSET.zip"
# The rolling alias assets (ffmpeg-nX.Y-latest-*) live in the release TAGGED
# "latest", which is not the same thing as the newest release. Asking for
# releases/latest/download resolves to whatever autobuild-* published most
# recently, and those carry versioned names only, so the pinned asset 404s.
$uri = "https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/$asset"
# Every autobuild deletes and re-uploads those alias assets, so a download
# landing in that window 404s on a file that exists minutes either side.
# Retry instead of failing the build over a few seconds of republishing.
$downloaded = $false
foreach ($attempt in 1..5) {
try {
Invoke-WebRequest -Uri $uri -OutFile ffmpeg.zip
$downloaded = $true
break
} catch {
Write-Host "FFmpeg download attempt $attempt/5 failed: $($_.Exception.Message)"
if ($attempt -lt 5) { Start-Sleep -Seconds 30 }
}
}
if (-not $downloaded) { throw "FFmpeg download failed after 5 attempts: $uri" }
Expand-Archive -Path ffmpeg.zip -DestinationPath ffmpeg-tmp
$inner = Get-ChildItem -Directory ffmpeg-tmp | Select-Object -First 1
New-Item -ItemType Directory -Force -Path .deps-cache | Out-Null
Move-Item -Path $inner.FullName -Destination .deps-cache/ffmpeg-x64
Remove-Item ffmpeg.zip

- name: Set Up VC2022 Environment
uses: ilammy/msvc-dev-cmd@0b201ec74fa43914dc39ae48a89fd1d8cb592756 # v1.13.0
with:
arch: x64

- name: Set Up sccache
# Single-archive local sccache dir cached as ONE entry per run (not the GHA
# per-object backend, which fragmented into thousands of tiny cache entries and
# hit API rate limits -> silent false misses). append-timestamp + restore-key
# prefix warm-restore each run; max-size bounds it well under the repo cache cap.
uses: hendrikmuhs/ccache-action@d62db5f07c26379fc4b4e0916f098a92573c3b03 # v1.2.23
with:
variant: sccache
key: bgfx-${{ matrix.preset }}
max-size: 2G
verbose: 1

- name: Cache CMake Dependencies
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
with:
path: build\${{ matrix.preset }}\_deps
key: cmake-deps-${{ matrix.preset }}-${{ hashFiles('CMakePresets.json','cmake/**/*.cmake','**/CMakeLists.txt') }}
restore-keys: |
cmake-deps-${{ matrix.preset }}-

- name: Configure with CMake
shell: pwsh
run: |
cmake --preset ${{ matrix.preset }} -DCMAKE_C_COMPILER_LAUNCHER=sccache -DCMAKE_CXX_COMPILER_LAUNCHER=sccache

- name: Build GeneralsMD
shell: pwsh
run: |
cmake --build build/${{ matrix.preset }} --config ${{ matrix.config }} --target z_generals
sccache --show-stats

- name: Stage and Zip
shell: pwsh
run: |
$build = "build/${{ matrix.preset }}"
$cfg = "${{ matrix.config }}"
$stage = New-Item -ItemType Directory -Force -Path "stage/${{ matrix.zip }}"

Copy-Item "$build/GeneralsMD/$cfg/*.exe" $stage
if (Test-Path "$build/GeneralsMD/$cfg/*.pdb") {
Copy-Item "$build/GeneralsMD/$cfg/*.pdb" $stage
}

$dlls = Get-ChildItem -Path "$build/_deps" -Recurse -Include "SDL3*.dll","OpenAL32*.dll" |
Where-Object { $_.FullName -like "*\$cfg\*" }
if (-not $dlls) {
throw "No SDL3/OpenAL runtime DLLs found under $build/_deps for config $cfg"
}
$dlls | Copy-Item -Destination $stage
Copy-Item ".deps-cache/ffmpeg-x64/bin/*.dll" $stage

@(
"Command & Conquer Generals Zero Hour (GeneralsMD) bgfx build",
"preset: ${{ matrix.preset }} ($cfg)",
"ref: ${{ inputs.ref || github.ref_name }}",
"commit: $(git rev-parse HEAD)",
"built: $((Get-Date).ToUniversalTime().ToString('o'))"
) | Set-Content "$stage/BUILD_INFO.txt"

# Ship the default render settings (sun shadow map on). The exe-only zip
# excludes Data\ via the $slim filter below.
New-Item -ItemType Directory -Force -Path "$stage/Data/INI" | Out-Null
Copy-Item "scripts/build/dist/Bgfx.ini" "$stage/Data/INI/Bgfx.ini"
Copy-Item "LICENSE.md","INSTALLING.md" $stage

Compress-Archive -Path $stage.FullName -DestinationPath "${{ matrix.zip }}.zip"

$slimStage = New-Item -ItemType Directory -Force -Path "stage/${{ matrix.zip }}-exe-only"
Get-ChildItem "$stage/*" -Include "*.exe","*.pdb","BUILD_INFO.txt" |
Copy-Item -Destination $slimStage
Copy-Item "LICENSE.md","INSTALLING.md" $slimStage
Compress-Archive -Path $slimStage.FullName -DestinationPath "${{ matrix.zip }}-exe-only.zip"

- name: Upload Artifact
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: ${{ matrix.zip }}
path: |
${{ matrix.zip }}.zip
${{ matrix.zip }}-exe-only.zip
retention-days: 30
if-no-files-found: error

macos:
name: macos-generalsmd-sdl3-bgfx
runs-on: macos-15
timeout-minutes: 120
env:
GGC_MACOS_RUNTIME_DIR: ${{ github.workspace }}/stage-macos/GeneralsZH-macos-arm64
steps:
- name: Checkout Code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
ref: ${{ inputs.ref || github.ref_name }}

- name: Install Dependencies
run: |
brew install ninja dylibbundler ffmpeg ccache
command -v pkg-config || brew install pkgconf

- name: Cache CMake Dependencies
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
with:
path: build/macos-generalsmd-sdl3-bgfx/_deps
key: cmake-deps-macos-generalsmd-sdl3-bgfx-${{ hashFiles('CMakePresets.json','cmake/**/*.cmake','**/CMakeLists.txt') }}
restore-keys: |
cmake-deps-macos-generalsmd-sdl3-bgfx-

- name: Set Up ccache
# Single-archive ccache dir, append-timestamp + restore-key prefix so each run
# saves a fresh entry and warm-restores the latest; max-size caps total size.
uses: hendrikmuhs/ccache-action@d62db5f07c26379fc4b4e0916f098a92573c3b03 # v1.2.23
with:
variant: ccache
key: bgfx-macos
max-size: 2G
verbose: 1

- name: Configure with CMake
run: |
cmake --preset macos-generalsmd-sdl3-bgfx -DRTS_CRASHDUMP_ENABLE=OFF -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache

- name: Build and Stage GeneralsMD
run: |
bash scripts/build/macos/build-macos-generalsmd.sh
ccache -s

- name: Zip
run: |
{
echo "Command & Conquer Generals Zero Hour (GeneralsMD) bgfx build"
echo "preset: macos-generalsmd-sdl3-bgfx (Release, arm64)"
echo "ref: ${{ inputs.ref || github.ref_name }}"
echo "commit: $(git rev-parse HEAD)"
echo "built: $(date -u +%Y-%m-%dT%H:%M:%SZ)"
} > "${GGC_MACOS_RUNTIME_DIR}/BUILD_INFO.txt"
cd "$(dirname "${GGC_MACOS_RUNTIME_DIR}")"
zip -ry "${GITHUB_WORKSPACE}/GeneralsZH-macos-arm64.zip" "$(basename "${GGC_MACOS_RUNTIME_DIR}")"

- name: Upload Artifact
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: GeneralsZH-macos-arm64
path: GeneralsZH-macos-arm64.zip
retention-days: 30
if-no-files-found: error

linux:
name: linux-generalsmd-sdl3-bgfx
runs-on: ubuntu-latest
timeout-minutes: 120
steps:
- name: Checkout Code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
ref: ${{ inputs.ref || github.ref_name }}

- name: Install Dependencies
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
build-essential cmake ninja-build pkg-config ccache \
libx11-dev libxext-dev libxrandr-dev libxi-dev libxcursor-dev \
libxinerama-dev libxfixes-dev libxrender-dev libxss-dev libxtst-dev \
libxkbcommon-dev libwayland-dev wayland-protocols libdecor-0-dev \
libgl1-mesa-dev libegl1-mesa-dev libvulkan-dev \
libfreetype6-dev libfontconfig1-dev \
libasound2-dev libpulse-dev \
nasm curl xz-utils

- name: Cache CMake Dependencies
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
with:
path: build/linux-generalsmd-sdl3-bgfx/_deps
key: cmake-deps-linux-generalsmd-sdl3-bgfx-${{ hashFiles('CMakePresets.json','cmake/**/*.cmake','**/CMakeLists.txt') }}
restore-keys: |
cmake-deps-linux-generalsmd-sdl3-bgfx-

- name: Set Up ccache
uses: hendrikmuhs/ccache-action@d62db5f07c26379fc4b4e0916f098a92573c3b03 # v1.2.23
with:
variant: ccache
key: bgfx-linux
max-size: 2G
verbose: 1

- name: Cache Minimal FFmpeg
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
with:
path: ${{ github.workspace }}/ffmpeg-min
key: ffmpeg-min-${{ hashFiles('scripts/build/linux/build-ffmpeg-minimal.sh') }}

- name: Build Minimal FFmpeg
run: |
bash scripts/build/linux/build-ffmpeg-minimal.sh "${GITHUB_WORKSPACE}/ffmpeg-min"

- name: Configure with CMake
env:
PKG_CONFIG_PATH: ${{ github.workspace }}/ffmpeg-min/lib/pkgconfig
run: |
cmake --preset linux-generalsmd-sdl3-bgfx -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache

- name: Build GeneralsMD
run: |
cmake --build build/linux-generalsmd-sdl3-bgfx --config Release --target z_generals -j"$(nproc)"
ccache -s

- name: Stage
run: |
bash scripts/build/linux/deploy-linux-generalsmd.sh linux-generalsmd-sdl3-bgfx Release
{
echo "Command & Conquer Generals Zero Hour (GeneralsMD) bgfx build"
echo "preset: linux-generalsmd-sdl3-bgfx (Release, x86_64)"
echo "ref: ${{ inputs.ref || github.ref_name }}"
echo "commit: $(git rev-parse HEAD)"
echo "built: $(date -u +%Y-%m-%dT%H:%M:%SZ)"
} > "${GITHUB_WORKSPACE}/stage-linux/GeneralsZH-linux-x64/BUILD_INFO.txt"

- name: Zip
run: |
cd "${GITHUB_WORKSPACE}/stage-linux"
zip -ry "${GITHUB_WORKSPACE}/GeneralsZH-linux-x64.zip" GeneralsZH-linux-x64

- name: Upload Artifact
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: GeneralsZH-linux-x64
path: GeneralsZH-linux-x64.zip
retention-days: 30
if-no-files-found: error

publish:
name: Update latest-bgfx release
needs: [win64, macos, linux]
if: ${{ always() && needs.win64.result == 'success' && needs.macos.result == 'success' && (github.event_name != 'workflow_dispatch' || inputs.publish) }}
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- name: Download Artifacts
uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0
with:
path: dist
merge-multiple: true

- name: Publish Rolling Release
env:
GH_TOKEN: ${{ github.token }}
SHA: ${{ needs.win64.outputs.sha }}
REF: ${{ inputs.ref || github.ref_name }}
run: |
(
cd dist
LC_ALL=C sha256sum *.zip > SHA256SUMS.txt
)

cat > notes.md <<EOF
Latest bgfx builds of Zero Hour (GeneralsMD), automatically updated.

Built from \`${REF}\` @ ${SHA} on $(date -u +%Y-%m-%d\ %H:%M\ UTC).

See the [installation guide](https://github.com/${GITHUB_REPOSITORY}/blob/${SHA}/INSTALLING.md) for platform requirements, retail game-data setup, mods and troubleshooting. Every archive also contains \`INSTALLING.md\`, \`LICENSE.md\` and \`BUILD_INFO.txt\`.

| Asset | Contents |
| --- | --- |
| GeneralsZH-win64.zip | Windows x64 Release: generalszh.exe + SDL3/OpenAL/FFmpeg DLLs |
| GeneralsZH-win64-exe-only.zip | Windows x64 Release: exe + PDB (requires matching runtime DLLs) |
| GeneralsZH-win64-debug.zip | Windows x64 Debug: exe + PDB + DLLs |
| GeneralsZH-win64-debug-exe-only.zip | Windows x64 Debug: exe + PDB (requires matching runtime DLLs) |
| GeneralsZH-macos-arm64.zip | macOS Apple Silicon: generalszh + bundled dylibs + run.sh |
| GeneralsZH-linux-x64.zip | Linux x86_64: generalszh + bundled libs + run.sh |
| SHA256SUMS.txt | SHA-256 checksums for every build archive |
EOF

gh release delete latest-bgfx --repo "$GITHUB_REPOSITORY" --cleanup-tag --yes || true
gh release create latest-bgfx dist/*.zip dist/SHA256SUMS.txt \
--repo "$GITHUB_REPOSITORY" \
--target "$SHA" \
--prerelease \
--title "Latest bgfx builds" \
--notes-file notes.md
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -66,4 +66,7 @@ build.ninja

## Python
__pycache__/
*.pyc
*.pyc
# Local prebuilt dependency cache (ffmpeg, etc.) to avoid slow rebuilds
.deps-cache/
scripts/render/ab_scenes.json.baseframes
Loading