aboutsummaryrefslogtreecommitdiff
path: root/server/replaytool/src/render.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/replaytool/src/render.rs')
-rw-r--r--server/replaytool/src/render.rs56
1 files changed, 56 insertions, 0 deletions
diff --git a/server/replaytool/src/render.rs b/server/replaytool/src/render.rs
new file mode 100644
index 00000000..79eb483b
--- /dev/null
+++ b/server/replaytool/src/render.rs
@@ -0,0 +1,56 @@
+/*
+ Hurry Curry! - a game about cooking
+ Copyright (C) 2025 Hurry Curry! Contributors
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, version 3 of the License only.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+*/
+
+use crate::replay::replay;
+use anyhow::Result;
+use log::info;
+use std::path::Path;
+use tokio::{net::TcpListener, process::Command};
+
+pub async fn render(input: &Path, output: &Path, framerate: usize, headless: bool) -> Result<()> {
+ let port = 27090;
+ let ws_listener = TcpListener::bind(("127.0.0.1", port)).await?;
+
+ let mut args = Vec::new();
+ if headless {
+ args.push("wlheadless-run");
+ args.extend(["-c", "mutter"]);
+ args.push("--");
+ }
+ args.push("hurrycurry-client");
+ if headless {
+ args.extend(["--video-driver", "wayland"]);
+ args.extend(["--rendering-driver", "vulkan"]);
+ }
+ args.extend(["--write-movie", output.to_str().unwrap()]);
+ let fps = framerate.to_string();
+ args.extend(["--fixed-fps", &fps]);
+ args.push("--print-fps");
+ args.push("--");
+ let uri = format!("ws://127.0.0.1:{port}");
+ args.push(&uri);
+
+ let mut client = Command::new(args[0]).args(&args[1..]).spawn()?;
+
+ info!("listening for websockets on {}", ws_listener.local_addr()?);
+ replay(&ws_listener, &input).await?;
+
+ client.wait().await?.exit_ok()?;
+
+ Ok(())
+}