diff --git a/src/main/java/io/eiren/gui/VRServerGUI.java b/src/main/java/io/eiren/gui/VRServerGUI.java index 8584d474db..6a7254b32d 100644 --- a/src/main/java/io/eiren/gui/VRServerGUI.java +++ b/src/main/java/io/eiren/gui/VRServerGUI.java @@ -6,6 +6,7 @@ import io.eiren.util.ann.AWTThread; import io.eiren.vr.VRServer; +import io.eiren.vr.bridge.NamedPipeVRBridge; import java.awt.event.MouseEvent; import java.util.TimerTask; @@ -57,8 +58,12 @@ public void run() { private void build() { pane.removeAll(); + NamedPipeVRBridge npvb = server.getVRBridge(NamedPipeVRBridge.class); + pane.add(new EJBox(LINE_AXIS) {{ setBorder(new EmptyBorder(i(5))); + + add(Box.createHorizontalGlue()); add(resetButton = new JButton("RESET") {{ addMouseListener(new MouseInputAdapter() { @Override @@ -67,6 +72,19 @@ public void mouseClicked(MouseEvent e) { } }); }}); + add(Box.createHorizontalGlue()); + if(npvb != null) { + add(new JButton(npvb.isOneTrackerMode() ? "1" : "3") {{ + addMouseListener(new MouseInputAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + npvb.setSpawnOneTracker(!npvb.isOneTrackerMode()); + setText(npvb.isOneTrackerMode() ? "1" : "3"); + } + }); + }}); + add(Box.createHorizontalStrut(10)); + } }}); pane.add(new EJBox(LINE_AXIS) {{ diff --git a/src/main/java/io/eiren/vr/VRServer.java b/src/main/java/io/eiren/vr/VRServer.java index 31398dfd52..50374b4f27 100644 --- a/src/main/java/io/eiren/vr/VRServer.java +++ b/src/main/java/io/eiren/vr/VRServer.java @@ -46,6 +46,7 @@ public class VRServer extends Thread { public VRServer() { super("VRServer"); + loadConfig(); hmdTracker = new HMDTracker("HMD"); hmdTracker.position.set(0, 1.8f, 0); // Set starting position for easier debugging // TODO Multiple processors @@ -53,7 +54,7 @@ public VRServer() { List shareTrackers = humanPoseProcessor.getComputedTrackers(); // Create named pipe bridge for SteamVR driver - NamedPipeVRBridge driverBridge = new NamedPipeVRBridge(hmdTracker, shareTrackers); + NamedPipeVRBridge driverBridge = new NamedPipeVRBridge(hmdTracker, shareTrackers, this); tasks.add(() -> driverBridge.start()); bridges.add(driverBridge); @@ -71,6 +72,16 @@ public VRServer() { for(int i = 0; i < shareTrackers.size(); ++i) registerTracker(shareTrackers.get(i)); } + + @ThreadSafe + public E getVRBridge(Class cls) { + for(int i = 0; i < bridges.size(); ++i) { + VRBridge b = bridges.get(i); + if(cls.isInstance(b)) + return cls.cast(b); + } + return null; + } @ThreadSafe public TrackerConfig getTrackerConfig(Tracker tracker) { @@ -169,7 +180,6 @@ public void saveConfig() { @Override @VRServerThread public void run() { - loadConfig(); trackersServer.start(); while(true) { //final long start = System.currentTimeMillis(); diff --git a/src/main/java/io/eiren/vr/bridge/NamedPipeVRBridge.java b/src/main/java/io/eiren/vr/bridge/NamedPipeVRBridge.java index c80d67ed63..d627c11c4c 100644 --- a/src/main/java/io/eiren/vr/bridge/NamedPipeVRBridge.java +++ b/src/main/java/io/eiren/vr/bridge/NamedPipeVRBridge.java @@ -14,6 +14,7 @@ import io.eiren.util.collections.FastList; import io.eiren.util.logging.LogManager; +import io.eiren.vr.VRServer; import io.eiren.vr.trackers.ComputedTracker; import io.eiren.vr.trackers.HMDTracker; import io.eiren.vr.trackers.Tracker; @@ -32,6 +33,7 @@ public class NamedPipeVRBridge extends Thread implements VRBridge { private final Quaternion qBuffer = new Quaternion(); private final Quaternion qBuffer2 = new Quaternion(); + private final VRServer server; private Pipe hmdPipe; private final HMDTracker hmd; private final List trackerPipes; @@ -41,8 +43,11 @@ public class NamedPipeVRBridge extends Thread implements VRBridge { private final HMDTracker internalHMDTracker = new HMDTracker("itnernal://HMD"); private final AtomicBoolean newHMDData = new AtomicBoolean(false); - public NamedPipeVRBridge(HMDTracker hmd, List shareTrackers) { + private boolean spawnOneTracker = false; + + public NamedPipeVRBridge(HMDTracker hmd, List shareTrackers, VRServer server) { super("Named Pipe VR Bridge"); + this.server = server; this.hmd = hmd; this.shareTrackers = new FastList<>(shareTrackers); this.trackerPipes = new FastList<>(shareTrackers.size()); @@ -53,6 +58,26 @@ public NamedPipeVRBridge(HMDTracker hmd, List shareTrackers) ct.setStatus(TrackerStatus.OK); this.internalTrackers.add(ct); } + this.spawnOneTracker = server.config.getBoolean("openvr.onetracker", spawnOneTracker); + } + + public boolean isOneTrackerMode() { + return this.spawnOneTracker; + } + + /** + * Makes OpenVR bridge spawn only 1 tracker instead of 3, for + * use with only waist/chest tracking. Requires restart. + */ + public void setSpawnOneTracker(boolean spawnOneTracker) { + if(spawnOneTracker == this.spawnOneTracker) + return; + this.spawnOneTracker = spawnOneTracker; + if(this.spawnOneTracker) + this.server.config.setProperty("openvr.onetracker", true); + else + this.server.config.removeProperty("openvr.onetracker"); + this.server.saveConfig(); } @Override @@ -108,6 +133,8 @@ private void waitForPipesToOpen() { if(tryOpeningPipe(trackerPipe)) initTrackerPipe(trackerPipe, i); } + if(spawnOneTracker) + return; } } @@ -167,7 +194,7 @@ private void initHMDPipe(Pipe pipe) { } private void initTrackerPipe(Pipe pipe, int trackerId) { - String trackerHello = this.shareTrackers.size() + " 0"; + String trackerHello = (spawnOneTracker ? "1" : this.shareTrackers.size()) + " 0"; System.arraycopy(trackerHello.getBytes(ASCII), 0, buffer, 0, trackerHello.length()); buffer[trackerHello.length()] = '\0'; IntByReference lpNumberOfBytesWritten = new IntByReference(0);