From 0d90cf9c20a08af79f48df292fcbe27829052d10 Mon Sep 17 00:00:00 2001 From: Butterscotch! Date: Mon, 7 Feb 2022 01:40:11 -0500 Subject: [PATCH] Add simple BVH recording button --- .../java/dev/slimevr/gui/VRServerGUI.java | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/src/main/java/dev/slimevr/gui/VRServerGUI.java b/src/main/java/dev/slimevr/gui/VRServerGUI.java index 01d639c964..54aa468d76 100644 --- a/src/main/java/dev/slimevr/gui/VRServerGUI.java +++ b/src/main/java/dev/slimevr/gui/VRServerGUI.java @@ -13,10 +13,14 @@ import dev.slimevr.gui.swing.EJBox; import dev.slimevr.gui.swing.EJBoxNoStretch; import dev.slimevr.vr.trackers.TrackerRole; +import dev.slimevr.posestreamer.BVHFileStream; +import dev.slimevr.posestreamer.PoseDataStream; +import dev.slimevr.posestreamer.ServerPoseStreamer; import io.eiren.util.MacOSX; import io.eiren.util.OperatingSystem; import io.eiren.util.StringUtils; import io.eiren.util.ann.AWTThread; +import io.eiren.util.logging.LogManager; import java.awt.Component; import java.awt.Container; @@ -29,6 +33,8 @@ import java.awt.event.ComponentEvent; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; +import java.io.File; +import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -45,6 +51,10 @@ public class VRServerGUI extends JFrame { private final SkeletonList skeletonList; private JButton resetButton; private EJBox pane; + + private static File bvhSaveDir = new File("BVH Recordings"); + private final ServerPoseStreamer poseStreamer; + private PoseDataStream poseDataStream = null; private float zoom = 1.5f; private float initZoom = zoom; @@ -88,6 +98,8 @@ public VRServerGUI(VRServer server) { this.trackersList = new TrackersList(server, this); this.skeletonList = new SkeletonList(server, this); + this.poseStreamer = new ServerPoseStreamer(server); + add(new JScrollPane(pane = new EJBox(PAGE_AXIS), ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED)); GraphicsConfiguration gc = getGraphicsConfiguration(); Rectangle screenBounds = gc.getBounds(); @@ -136,6 +148,22 @@ public void run() { }); } + private File getBvhFile() { + if (bvhSaveDir.isDirectory() || bvhSaveDir.mkdirs()) { + File saveRecording; + int recordingIndex = 1; + do { + saveRecording = new File(bvhSaveDir, "BVH-Recording" + recordingIndex++ + ".bvh"); + } while(saveRecording.exists()); + + return saveRecording; + } else { + LogManager.log.severe("[BVH] Failed to create the recording directory \"" + bvhSaveDir.getPath() + "\"."); + } + + return null; + } + @AWTThread private void build() { pane.removeAll(); @@ -162,6 +190,37 @@ public void mouseClicked(MouseEvent e) { }); }}); add(Box.createHorizontalGlue()); + add(new JButton("Record BVH") {{ + addMouseListener(new MouseInputAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + if (poseDataStream == null) { + File bvhFile = getBvhFile(); + if (bvhFile != null) { + try { + poseDataStream = new BVHFileStream(bvhFile); + setText("Stop Recording BVH..."); + poseStreamer.setOutput(poseDataStream, 1000L / 100L); + } catch (IOException e1) { + LogManager.log.severe("[BVH] Failed to create the recording file \"" + bvhFile.getPath() + "\"."); + } + } else { + LogManager.log.severe("[BVH] Unable to get file to save to"); + } + } else { + try { + poseStreamer.closeOutput(poseDataStream); + } catch (Exception e1) { + LogManager.log.severe("[BVH] Exception while closing poseDataStream", e1); + } finally { + poseDataStream = null; + setText("Record BVH"); + } + } + } + }); + }}); + add(Box.createHorizontalGlue()); add(new JButton("GUI Zoom (x" + StringUtils.prettyNumber(zoom, 2) + ")") {{ addMouseListener(new MouseInputAdapter() { @Override