Commit Graph
21 Commits
Author SHA1 Message Date
dhkatzandClaude Opus 5.5 8055099920 Draw all of a client's views in one renderer process
CI / build (push) Successful in 40s
The adapter starts one renderer process per client, with the first engine
(again if it has exited), and attaches each engine's channel to it through a
control section (protocol version 5: Control, the -attach event). The renderer
process keeps a window, swap chain and scene per channel on one Direct3D
device, takes the views' frames in turns, and closes a view when its engine
does.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 19:16:01 -07:00
dhkatzandClaude Opus 5.5 6e4fe589e5 Draw render targets in the renderer process
CI / build (push) Successful in 48s
While the renderer process runs, the adapter makes the client's render targets
itself and the renderer process draws frames into them: texture targets are
drawn with like any texture, and a pixmap target's frame is read back through
the channel into its Pixmap (protocol version 4: BeginFrame names its target,
CreateRenderTarget, Channel::readSize and the -read event). Frames into render
targets are drawn even while the window is hidden.

The client uses pixmap targets for snapshots (outfit pictures, photos), checked
to look right. The render target interfaces are declared from IMVU's vtables.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 19:09:48 -07:00
dhkatzandClaude Opus 5.5 fa883892db Say in release notes that T5DE's setup installs the renderer
CI / build (push) Successful in 26s
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 18:57:13 -07:00
dhkatzandClaude Opus 5.5 a021e2caa9 Note the full view's speed on real hardware
CI / build (push) Successful in 23s
Co-Authored-By: Claude Opus 5.5 <[email protected]>
v0.1.0
2026-10-28 18:47:29 -07:00
dhkatzandClaude Opus 5.5 7bf29f3e4c Clear WS_CLIPCHILDREN on the client's window
CI / build (push) Successful in 54s
The client creates its 3D view's window with it, so not adding it wasn't
enough: covered entirely by the renderer's window, the client's window got no
WM_PAINT and the client still drew about once a second.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 18:18:23 -07:00
dhkatzandClaude Opus 5.5 97b1d36466 Run CI steps whatever the runner's execution policy
CI / build (push) Successful in 39s
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 18:15:07 -07:00
dhkatzandClaude Opus 5.5 2d9da249fa Draw the whole 3D view in place of the client's renderer
CI / build (push) Failing after 0s
The full view is now the default. While the renderer process covers the whole
view (Channel::covering, set after each frame it presents), the adapter skips
the client's renderer's clears and draws, decided per frame; the client's
renderer still gets state and resources, and draws again as soon as the
renderer process stops covering the view.

The client's window no longer gets WS_CLIPCHILDREN: the client draws when its
window gets WM_PAINT, which a window entirely covered by clipped children never
gets (it fell to about one frame a second). The flip model swap chain shows
above the client's drawing anyway.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 18:14:17 -07:00
dhkatzandClaude Opus 5.5 64e152de3c Send a User-Agent when publishing
CI / build (push) Successful in 29s
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 18:00:24 -07:00
dhkatzandClaude Opus 5.5 c48c666309 Build and publish the renderer in CI
CI / build (push) Failing after 1m47s
Builds both programs and runs the tests on T5DE's Windows runner, and publishes
them like T5DE's own releases: pushes to main replace the nightly pre-release,
vX.Y.Z tags make release X.Y.Z.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 17:57:52 -07:00
dhkatzandClaude Opus 5.5 7d17cb0b1f Note the renderer's speed on real hardware
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 07:39:30 -07:00
dhkatzandClaude Opus 5.5 3cdda4c7ed Map projections' depth like the client's renderer
IMVU's projections give depth from -1 to 1; its Direct3D renderer maps it to 0 to 1, and now so does ours. Without that, the nearer half of the depth range was clipped, the whole 2D overlay (name tags, the frame rate, the room's title) with it. The adapter also draws drawTrianglesFromMemory without indices, and sums up what the client draws in its log.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
dev-3cdda4c
2026-10-28 07:01:47 -07:00
dhkatzandClaude Opus 5.5 299cd8c312 Fix particle sizes, and add tools for comparing renderers
Particles: Direct3D 9's size limit evidently isn't the documented 64 pixels; unclamped (up to 2048) they match the client's renderer. A compare view shows the left half's scene over the right half, both renderers side by side; %TEMP%\t5de-renderer-view.txt switches views and %TEMP%\t5de-renderer-shaders\fixed_function.hlsl replaces the shaders while the client runs. The renderer process runs from a copy, so the program can be replaced meanwhile. The adapter recognizes only the textures and buffers it made (others reach the client renderer unchanged) and logs the others and render targets.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 06:43:34 -07:00
dhkatzandClaude Opus 5.5 1a45bf9a86 Fog by view depth again
Fogging by depth buffer value, as Direct3D 9's documentation suggests for IMVU's projections, looks nothing like the client; fogging by view depth matched it.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 06:16:57 -07:00
dhkatzandClaude Opus 5.5 a04dba18c1 Draw particles, match the client's fog, and measure frame delay
Particles (point sprites) are drawn as instanced camera-facing squares sized like Direct3D 9's. Fog is by depth buffer value, as Direct3D 9 does with IMVU's projections. At most one frame is queued for display, frames carry the adapter's timestamp so the renderer process logs the delay to presenting, and the log's lines from several processes no longer mix.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 06:11:51 -07:00
dhkatzandClaude Opus 5.5 42fc55cb91 Draw the client's scene in the renderer process
The adapter records everything the client draws (state, transforms, lights, fog, textures and buffers) as a command stream, sent in chunks through the shared memory channel, while IMVU's Direct3D renderer still draws the whole view. The renderer process draws it with Diligent, with shaders reproducing IMVU's Direct3D 9 fixed-function setup, over the right half of the 3D view to compare. It skips to the newest frame when it falls behind, and logs its errors and frame times.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 05:52:15 -07:00
dhkatzandClaude Opus 5.5 5c35c8b63a Note the renderer process spike's results
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 05:22:28 -07:00
dhkatzandClaude Opus 5.5 9a7d7d2908 Add the renderer process
The renderer becomes two programs: the adapter (t5deRenderEngine.dll, 32-bit, in IMVU's process) and a 64-bit renderer process (t5de-renderer.exe) drawing with Diligent Engine, fetched with FetchContent and pinned. For now a spike: the adapter starts the renderer process for each engine and signals each frame through a shared memory channel, and the renderer process draws a box into a child window in the client's 3D view.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 05:17:03 -07:00
dhkatzandClaude Opus 5.5 0d126574bf Note the data types checked in the client
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 04:39:15 -07:00
dhkatzandClaude Opus 5.5 83e0665681 Declare the renderer interface's data types
Transforms, matrices, colors, lights, blend modes, fog, texture transforms, vertex arrays and the engine's buffer and texture objects, worked out from IMVU's Direct3D engine. The pass-through logs the first calls' arguments read through them, to check them in the client.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 04:36:37 -07:00
dhkatzandClaude Opus 5.5 3c28a8794b Wrap IMVU's Direct3D renderer in the pass-through
IMVU's OpenGL renderer needs a real graphics driver; Direct3D also runs on Windows' basic display driver and is what most players use. The log can now be read while the client runs. Verified in rooms: every call goes through.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 04:28:26 -07:00
dhkatzandClaude Opus 5.5 dc643d271b Add a pass-through renderer plugin
t5deRenderEngine.dll implements IMVU Classic's renderer plugin interface by wrapping IMVU's own OpenGL renderer, and logs what each frame calls, to prove our declarations of the interface. Built with CMake presets for 32-bit MSVC; docs/interface.md has the findings.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 03:31:00 -07:00