RecurseSKLFile now builds a joint renderable for any node whose page name resolves to a live skeleton Joint: HingeX/Y/Z -> HingeRenderable (watching Joint::GetHinge), Ball -> BallJointRenderable (watching GetEulerAngles), otherwise the static path. Each holds the rest offset in one DCS and the live rotation in a child DCS, and its Execute diffs the watched value and calls DPL_FLUSH_DCS -- the engine's own mechanism (L4VIDRND.CPP:1026+). The value comes from the mech's JointSubsystem via ResolveJoint, so sim and renderer read one source. Gated on BT_JOINTS while it proves out. [skl] video\max.skl -> 26 nodes, 1 objects, 1 eye, 22 articulated The bridge reported anim_abs=1 joints=0 twist=+0.00 before; it now reports joints=1 twist=-0.86, matching the game's [torso] twist=-0.856. With the mech stationary, frames that differed by 0.0% now differ by 62-80%. A crash it exposed: Mech::ResolveJoint passed segment->GetJointIndex() straight to GetJoint unchecked, and a segment with no joint reports -1 -- GetNthImplementation then indexes [base + -1*4] and dies (guest 00426A1D). Torso never hit it because it only asks for its own authored joint name; the walk asks for every page. Now bounds-checked against GetJointCount. Open: the canopy does not stay rigid in the view, though it and the eye hang off the same articulated node. Cancelling the bridge's cage compensation (CAGE_TWIST_SIGN=0) did not close it. Leading hypothesis: SetupCull builds worldToEyeMatrix from GetSegmentToWorld(siteeyepoint) -- the SIMULATION's segment transform -- independent of the render tree, so the canopy follows our render chain and the eye follows the sim's, and they diverge whenever one carries the twist and the other does not. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
85 lines
2.8 KiB
Plaintext
85 lines
2.8 KiB
Plaintext
# pod_render_twist.conf -- rec conf with the mech STATIONARY and the torso
|
|
# sweeping (BT_FORCE_TORSO). Isolates the twist visually: with throttle and
|
|
# turn at zero the only thing that can move the view is the torso joint the
|
|
# cockpit eye hangs off, so a panning world proves the twist rather than
|
|
# the walk.
|
|
#
|
|
[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.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 BT_MAP_LOG=1
|
|
set BT_LAUNCH_LOG=1
|
|
set BT_STACK_LOG=1
|
|
set BT_MER_LOG=1
|
|
set BT_EULER_LOG=1
|
|
set BT_JOINTS=1
|
|
set BT_FORCE_TORSO=1
|
|
set BT_TORSO_LOG=1
|
|
set BT_FORCE_THROTTLE=0.0
|
|
set BT_FORCE_TURN=0.0
|
|
set HEAPSIZE=15000000
|
|
set L4GAUGE=640x480x16
|
|
call setenv.bat r s n p
|
|
32rtm.exe -x
|
|
BTL4REC.EXE -egg testarn.egg > COM3
|
|
|
|
echo GAME-RC=%errorlevel% >> RC.TXT
|
|
32rtm.exe -u
|
|
echo ALPHA1-RUN-DONE
|
|
pause
|
|
|