BT410 5.3.51: THE 3-D WORLD RENDERS -- reconstruction to emulated board to a picture

emulator/render-bridge/first-3d-frame.png: the arena from the pod -- sky,
horizon, ground, the arena structures along the skyline -- at ~31fps on the
VelociRender bridge.

The whole chain now works in our build: MakeVideoRenderer ->
BTL4VideoRenderer over DPLRenderer -> board boot -> Renderer::LoadMission ->
DPLReadEnvironment for the art paths -> 40/40 arena objects loaded -> mission
launch -> per-frame submission over the wire.

The mistake worth remembering: the run was never stalled after
InitializePlayerLink.  I called that from a 150-second sample and it was just
too short.  CheckLoadMessageHandler reposts every second and will not advance
until the min-priority event queue drains, and with the video renderer in the
mission that takes minutes.  A BT_LAUNCH_LOG trace showed the queue draining
and then both RunMissionMessageHandler calls, the plasma display, and the
first sensor tick -- matching the shipped binary line for line.  The renderer
deliberately holds a blank screen until RunningMission (L4VIDEO.CPP:5100), so
'black' was the app still loading, not a rendering bug.

Zero unbuildable entities, zero geometry failures.  The frame is static only
because the mech is parked with no input, and the camera in the bridge title
is the bridge's own viewer, not the game's eyepoint.

Also banked the launch-gate trace (BT_LAUNCH_LOG) behind an env var.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Cyd
2026-07-28 10:30:20 -05:00
co-authored by Claude Fable 5
parent 060078e4ae
commit 09192367c0
7 changed files with 3022 additions and 0 deletions
@@ -54,6 +54,8 @@ set BLASTER=A220 I5 D1 H5 P330 T6
set BLASTER=A220 I5 D1 H5 P330 T6
c:\sb16\diagnose /s
set BLASTER=A240 I7 D3 H6 P300 T6
c:\sb16\diagnose /s
set BLASTER=A220 I5 D1 H5 P330 T6
set TEMP=c:\
rem arena1 city mission (TESTARN.EGG: map=arena1, time=day) with the RIO
rem attached; stdout redirected so mission-load progress survives kills.
@@ -0,0 +1,73 @@
[sdl]
output=opengl
# higher,higher not highest: HIGH_PRIORITY_CLASS starved the host desktop;
# with the retry patches a rare dropout self-recovers (see gauge_rio.conf).
priority=higher,higher
[dosbox]
memsize=32
machine=svga_s3
[cpu]
core=dynamic
cputype=pentium
cycles=max
[sblaster]
sbtype=sb16
sbbase=220
irq=5
dma=1
hdma=5
[mixer]
# match the EMU8000s' native rate (no resample) and buffer ~60ms so brief
# emulation-thread stalls (RIO retry recovery) don't audibly chop
rate=44100
blocksize=1024
prebuffer=60
[serial]
# RIO on COM1 with the low-latency options (rxpollus/rxburst) so the board's
# few-ms ACK deadline is met; plasma display on COM2 (real pod has both).
# VWE fork namedpipe backend (com0com/realport retired -- COM1/COM2 gone):
# DOSBox = pipe client (retry), vRIO/vPLASMA apps = servers; an unconnected
# pipe behaves as an unplugged cable so the mission still runs. serialnamedpipe.h
serial1=namedpipe pipe:vrio rxpollus:100 rxburst:16
serial2=namedpipe pipe:vplasma
# live UNBUFFERED game output: DOS char devices are not buffered, so
# redirecting stdout to COM3 lands every line immediately. A normal
# '> file' redirect stays 0 bytes until the process exits, which hides
# all progress on a run that does NOT crash.
serial3=file file:C:\VWE\TeslaRel410\emulator\render-bridge\podlog_test.txt
[autoexec]
mount c "C:\VWE\TeslaRel410\ALPHA_1"
c:
cd \REL410\BT
set VIDEOFORMAT=svga
rem production pod card init (PARAMETR.BAT:181-186): DIAGNOSE + AWEUTIL per
rem card -- AWEUTIL /S does the EMU8000 bring-up and DRAM detect the HMI SOS
rem driver relies on; skipping it left the cards uninitialized (silent).
rem aweutil /s SKIPPED for now: it verifies the AWE32 GM ROM, which the
rem emulated cards lack (hangs in a retry loop) -- restore once the ROM is
rem dumped from a real card. diagnose /s kept (passes, sets mixer config).
set BLASTER=A220 I5 D1 H5 P330 T6
c:\sb16\diagnose /s
set BLASTER=A240 I7 D3 H6 P300 T6
c:\sb16\diagnose /s
set BLASTER=A220 I5 D1 H5 P330 T6
set TEMP=c:\
rem arena1 city mission (TESTARN.EGG: map=arena1, time=day) with the RIO
rem attached; stdout redirected so mission-load progress survives kills.
set BT_MECH_LOG=1
set HEAPSIZE=15000000
set L4GAUGE=640x480x16
call setenv.bat r s n p
32rtm.exe -x
BTL4REC.EXE -egg test.egg > COM3
echo GAME-RC=%errorlevel% >> RC.TXT
32rtm.exe -u
echo ALPHA1-RUN-DONE
pause
File diff suppressed because it is too large Load Diff
+18
View File
@@ -0,0 +1,18 @@
BattleTech v4.10
BTL4Application::BTL4Application
GaugeInterpreter: undefined label 'Initialization'
MakeVehicleSystems hud=0x01150bfc
Warning: damage zone 'dz_missle' not found!
Warning: damage zone 'dz_missle' not found!
Warning: damage zone 'dz_lmissle' not found!
Warning: damage zone 'dz_rmissle' not found!
Warning: damage zone 'dz_ftorso' not found!
Warning: damage zone 'dz_btorso' not found!
LBE4ControlsManager::Execute, lost RIO analog request
iThinkIRQIsOn =1, actual state =1, characters sent =416
LBE4ControlsManager::Execute, lost RIO analog request
iThinkIRQIsOn =1, actual state =1, characters sent =641
BTL4Application::RunMissionMessageHandler
Turning Plasma Score Display On
BTL4Application::RunMissionMessageHandler
Turning Plasma Score Display On
+50
View File
@@ -0,0 +1,50 @@
BattleTech v4.10
BTL4Application::BTL4Application
GaugeInterpreter: undefined label 'Initialization'
[exp] master player experience=3 simLive=1 heatModelOn=1 advDamage=1
[role] 'Role::Default' lives=1000 killBonus=500 dmgMod=1
[torso] horizJoint '' -> 0x00000000 enabled=0
[weap] 'PPC_1' seg=5 mount=sitelugunport rear=0
[weap] 'PPC_2' seg=14 mount=siterugunport rear=0
[weap] 'ERMLaser_1' seg=40 mount=siteltorsoport rear=0
[weap] 'ERMLaser_2' seg=16 mount=siterbgunport rear=1
[weap] 'ERMLaser_3' seg=7 mount=sitelbgunport rear=1
[weap] 'SRM6_1' seg=40 mount=siteltorsoport rear=0
[proj] 'SRM6_1' ammoBinIndex=27 -> AmmoBinSRM6_1 (rounds=24)
[weap] 'SRM6_2' seg=39 mount=sitertorsoport rear=0
[proj] 'SRM6_2' ammoBinIndex=29 -> AmmoBinSRM6_2 (rounds=24)
[mech] segment walk done: subsystemCount=33 weaponCount=7
[skel] jointSubsystem=0x00c24634 jointCount=19
[mech] model params: walkTR=75 runTR=50 maxAcc=30 throttleAdj=1 (deg,deg,u/s^2,scale)
[mech] look angles: L=60 R=-60 F=-10 B=0 (deg)
[mech] damage zones streamed: 20 [dz_dtorso,dz_larm,dz_ldleg,dz_lfoot,dz_lgun,dz_lsearchlight,dz_ltorso,dz_luleg,dz_rarm,dz_rdleg,dz_reardtorso,dz_rearltorso,dz_rearrtorso,dz_rearutorso,dz_rfoot,dz_rgun,dz_rsearchlight,dz_rtorso,dz_ruleg,dz_utorso]
[cyl] table 'bhk1' LOADED rows=7
[valve] 'Condenser1' valve=1 flow=0.166667
[valve] 'Condenser2' valve=1 flow=0.166667
[valve] 'Condenser3' valve=1 flow=0.166667
[valve] 'Condenser4' valve=1 flow=0.166667
[valve] 'Condenser5' valve=1 flow=0.166667
[valve] 'Condenser6' valve=1 flow=0.166667
[mapper] ctor id=0 throttleAttr=0x00c25dd4 controlModeAttr=0x00c25e10
[gau2] cluster slot=14 classID=3011 auxScreen=5 name=Avionics
[gau2] cluster slot=15 classID=3014 auxScreen=6 name=Myomers
[gau2] cluster slot=22 classID=3028 auxScreen=1 name=PPC_1
[gau2] cluster slot=23 classID=3028 auxScreen=10 name=PPC_2
[gau2] cluster slot=24 classID=3016 auxScreen=4 name=ERMLaser_1
[gau2] cluster slot=25 classID=3016 auxScreen=8 name=ERMLaser_2
[gau2] cluster slot=26 classID=3016 auxScreen=7 name=ERMLaser_3
[gau2] cluster slot=28 classID=3024 auxScreen=2 name=SRM6_1
[gau2] cluster slot=30 classID=3024 auxScreen=9 name=SRM6_2
ColorMapperArmor warning: damage zone dz_missle not found
ColorMapperArmor warning: damage zone dz_hip not found
ColorMapperArmor warning: damage zone dz_missle not found
ColorMapperArmor warning: damage zone dz_searchlight not found
ColorMapperArmor warning: damage zone dz_lmissle not found
ColorMapperArmor warning: damage zone dz_rmissle not found
ColorMapperArmor warning: damage zone dz_ftorso not found
ColorMapperArmor warning: damage zone dz_btorso not found
[link] InitializePlayerLink -> vehicle playerLink=0x00a9c368
Entity -1:63 class42 couldn't figure out how to MakeEntityRenderables
Reference to a page you don't own
PF cr2= 7000 FA64 at 00FF 0000 66D9
Unhandled exception 000E at 00FF 66D9 ErrCode 0004
+13
View File
@@ -1379,6 +1379,19 @@ void
case CreatingMission:
case LoadingMission:
case WaitingForLaunch:
//
// LAUNCH-GATE TRACE (env BT_LAUNCH_LOG): this handler reposts
// itself every second and will not advance until the low-priority
// event queue drains, so a queue that never empties parks the
// application at WaitingForLaunch forever -- no RunMissionMessage,
// no RunningMission, and the video renderer deliberately holds a
// BLANK SCREEN until then (L4VIDEO.CPP:5100).
//
if (getenv("BT_LAUNCH_LOG"))
DEBUG_STREAM << "[launch] state=" << (int)applicationState.GetState()
<< " minPriorityEmpty="
<< (eventQueue->IsPriorityEmpty(MinEventPriority) ? 1 : 0)
<< "\n" << flush;
if (eventQueue->IsPriorityEmpty(MinEventPriority))
{
Host *console_host;
@@ -531,3 +531,50 @@ emulator/render-bridge/pod_render_rec.conf + `launch_pod.ps1 -NoSound`
the process exits normally -- which is why every readable log before this
came from a run that crashed.
* pod_render_shp.conf is the same conf running the SHIPPED exe, for the A/B.
================================================================================
THE 3-D WORLD RENDERS. Reconstruction -> emulated Division card -> a picture.
================================================================================
emulator/render-bridge/first-3d-frame.png -- the arena from the pod: sky,
horizon, ground, the arena structures along the skyline with their markings,
running at ~31fps on the VelociRender bridge.
The full chain now works end to end in OUR build: MakeVideoRenderer ->
BTL4VideoRenderer over DPLRenderer -> board boot (transputer + i860 firmware)
-> Renderer::LoadMission -> DPLReadEnvironment (art paths) -> 40/40 arena
objects loaded -> mission launch -> per-frame submission over the wire.
WHAT ACTUALLY UNBLOCKED IT, and the mistake worth remembering:
the run was NOT stalled after InitializePlayerLink. I concluded that from a
150-second sample and it was simply too short. Application::
CheckLoadMessageHandler (APP.CPP) reposts itself every second and refuses to
advance until the MIN-priority event queue drains; with the video renderer in
the mission that load takes minutes, not seconds. Traced with BT_LAUNCH_LOG:
[launch] state=11 minPriorityEmpty=0 <- loading, queue busy
... 60+ ticks ...
[launch] state=2 minPriorityEmpty=0
[launch] state=2 minPriorityEmpty=1 <- drained
BTL4Application::RunMissionMessageHandler (x2 -- the two messages that
Turning Plasma Score Display On carry WaitingForLaunch ->
BTL4Application::RunMissionMessageHandler LaunchingMission ->
Turning Plasma Score Display On RunningMission)
[tick] roster live (first Sensor frame), radarPercent=1 voltState=4
and that matches the SHIPPED binary's sequence line for line. The renderer
holds a deliberately blank screen until RunningMission
(L4VIDEO.CPP:5100, "Simple HACK to hold us on a blank screen till the mission
is actually started") -- so "black" was never a rendering bug, it was the app
still loading. WAIT FOR THE LAUNCH MARKERS before diagnosing a black pod.
STATE OF THE SCENE: no entity is unbuildable any more (zero "couldn't figure
out how to MakeEntityRenderables"), zero geometry failures, and the frame is
static only because the mech is parked with no pilot input. The camera in
the bridge title is the BRIDGE's own viewer (launch_pod: "arrows in the RENDER
window tune eye height", FP_UPOFF), not the game's eyepoint -- do not read it
as the pilot view without checking.
NEXT: drive it. With controls fed (vRIO is already running in this rig) the
mech should move and the scene should animate; then the mech's own model and
the cockpit-interior renderables are what to verify against the shipped
binary, which is a cheap A/B now (pod_render_shp.conf).