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]>
This commit is contained in:
1 parent
1a45bf9a86
commit
299cd8c312
11 files changed
+239
-28
No files matched your search
@@ -29,6 +29,31 @@ std::filesystem::path module_folder()
|
||||
|
||||
std::string narrow(const std::wstring& text) { return std::filesystem::path(text).string(); }
|
||||
|
||||
// The renderer process runs from a copy in %TEMP%\t5de-renderer, one per version of the program (by size and
|
||||
// modification time), so the program in the client's folder can be replaced (updated) while the client runs: the
|
||||
// next engine runs the new one. Copies no longer running are removed. Falls back to the program itself.
|
||||
std::filesystem::path running_copy(const std::filesystem::path& exe)
|
||||
{
|
||||
std::error_code error;
|
||||
const auto size = std::filesystem::file_size(exe, error);
|
||||
const auto modified = std::filesystem::last_write_time(exe, error);
|
||||
if (error) {
|
||||
return exe;
|
||||
}
|
||||
const auto folder = std::filesystem::temp_directory_path(error) / L"t5de-renderer";
|
||||
std::filesystem::create_directories(folder, error);
|
||||
const auto copy = folder / std::format(L"t5de-renderer-{}-{}.exe", size, modified.time_since_epoch().count());
|
||||
if (!std::filesystem::exists(copy, error)) {
|
||||
for (const auto& old : std::filesystem::directory_iterator(folder, error)) {
|
||||
std::filesystem::remove(old.path(), error); // fails, harmlessly, for copies still running
|
||||
}
|
||||
if (!CopyFileW(exe.c_str(), copy.c_str(), FALSE)) {
|
||||
return exe;
|
||||
}
|
||||
}
|
||||
return copy;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
std::unique_ptr<RendererProcess> RendererProcess::start(HWND window, protocol::View view)
|
||||
@@ -64,7 +89,7 @@ std::unique_ptr<RendererProcess> RendererProcess::start(HWND window, protocol::V
|
||||
// The renderer's window goes on top of the client's 3D view: keep the client's drawing out of it.
|
||||
SetWindowLongW(window, GWL_STYLE, GetWindowLongW(window, GWL_STYLE) | WS_CLIPCHILDREN);
|
||||
|
||||
const auto exe = module_folder() / L"t5de-renderer.exe";
|
||||
const auto exe = running_copy(module_folder() / L"t5de-renderer.exe");
|
||||
std::wstring command = std::format(L"\"{}\" --channel {} --parent {}", exe.wstring(), name, GetCurrentProcessId());
|
||||
STARTUPINFOW startup{.cb = sizeof(STARTUPINFOW)};
|
||||
PROCESS_INFORMATION process{};
|
||||
|
||||
Reference in new issue
Block a user