From ead278adb1f8ca1fa69449de9eaa491c61d1f57c Mon Sep 17 00:00:00 2001 From: ImUrX Date: Wed, 31 May 2023 14:48:12 -0300 Subject: [PATCH] rewrite! --- server/.gitignore | 4 +- server/build.gradle.kts | 2 + .../src/main/java/dev/slimevr/Keybinding.java | 14 +- .../src/main/java/dev/slimevr/VRServer.java | 8 +- .../java/dev/slimevr/config/AutoBoneConfig.kt | 5 +- .../java/dev/slimevr/config/BridgeConfig.java | 32 ---- .../java/dev/slimevr/config/BridgeConfig.kt | 23 +++ .../dev/slimevr/config/ConfigManager.java | 139 -------------- .../java/dev/slimevr/config/ConfigManager.kt | 104 ++++++++++ .../slimevr/config/DriftCompensationConfig.kt | 3 + .../java/dev/slimevr/config/FiltersConfig.kt | 2 + .../dev/slimevr/config/KeybindingsConfig.java | 56 ------ .../dev/slimevr/config/KeybindingsConfig.kt | 24 +++ .../dev/slimevr/config/LegTweaksConfig.java | 14 -- .../dev/slimevr/config/LegTweaksConfig.kt | 9 + .../main/java/dev/slimevr/config/OSCConfig.kt | 3 + .../dev/slimevr/config/OverlayConfig.java | 24 --- .../java/dev/slimevr/config/OverlayConfig.kt | 12 ++ .../java/dev/slimevr/config/ServerConfig.java | 10 - .../java/dev/slimevr/config/ServerConfig.kt | 9 + .../dev/slimevr/config/SkeletonConfig.java | 38 ---- .../java/dev/slimevr/config/SkeletonConfig.kt | 26 +++ .../dev/slimevr/config/TapDetectionConfig.kt | 2 + .../dev/slimevr/config/TrackerConfig.java | 92 --------- .../java/dev/slimevr/config/TrackerConfig.kt | 40 ++++ .../main/java/dev/slimevr/config/VMCConfig.kt | 3 + .../java/dev/slimevr/config/VRCOSCConfig.kt | 4 +- .../java/dev/slimevr/config/VRConfig.java | 177 ------------------ .../main/java/dev/slimevr/config/VRConfig.kt | 128 +++++++++++++ .../dev/slimevr/protocol/rpc/RPCHandler.java | 10 +- .../rpc/settings/RPCSettingsBuilder.java | 2 +- .../rpc/settings/RPCSettingsHandler.java | 35 ++-- .../tracking/processor/HumanPoseManager.java | 12 +- .../config/SkeletonConfigManager.java | 29 ++- .../processor/skeleton/HumanSkeleton.java | 4 +- .../processor/skeleton/LegTweaks.java | 2 +- .../io/github/axisangles/ktmath/Quaternion.kt | 2 + 37 files changed, 452 insertions(+), 651 deletions(-) delete mode 100644 server/src/main/java/dev/slimevr/config/BridgeConfig.java create mode 100644 server/src/main/java/dev/slimevr/config/BridgeConfig.kt delete mode 100644 server/src/main/java/dev/slimevr/config/ConfigManager.java create mode 100644 server/src/main/java/dev/slimevr/config/ConfigManager.kt delete mode 100644 server/src/main/java/dev/slimevr/config/KeybindingsConfig.java create mode 100644 server/src/main/java/dev/slimevr/config/KeybindingsConfig.kt delete mode 100644 server/src/main/java/dev/slimevr/config/LegTweaksConfig.java create mode 100644 server/src/main/java/dev/slimevr/config/LegTweaksConfig.kt delete mode 100644 server/src/main/java/dev/slimevr/config/OverlayConfig.java create mode 100644 server/src/main/java/dev/slimevr/config/OverlayConfig.kt delete mode 100644 server/src/main/java/dev/slimevr/config/ServerConfig.java create mode 100644 server/src/main/java/dev/slimevr/config/ServerConfig.kt delete mode 100644 server/src/main/java/dev/slimevr/config/SkeletonConfig.java create mode 100644 server/src/main/java/dev/slimevr/config/SkeletonConfig.kt delete mode 100644 server/src/main/java/dev/slimevr/config/TrackerConfig.java create mode 100644 server/src/main/java/dev/slimevr/config/TrackerConfig.kt delete mode 100644 server/src/main/java/dev/slimevr/config/VRConfig.java create mode 100644 server/src/main/java/dev/slimevr/config/VRConfig.kt diff --git a/server/.gitignore b/server/.gitignore index 819c9152b8..e6520f6f2f 100644 --- a/server/.gitignore +++ b/server/.gitignore @@ -4,7 +4,7 @@ build /bin/ MagnetoLib.dll -vrconfig.yml +vrconfig.yml* # BVH BVH Recordings @@ -18,4 +18,4 @@ Load AutoBone Recordings *.log.* *.log.lck *.log -logs/ \ No newline at end of file +logs/ diff --git a/server/build.gradle.kts b/server/build.gradle.kts index 6c677489ed..4df6bb91b0 100644 --- a/server/build.gradle.kts +++ b/server/build.gradle.kts @@ -83,7 +83,9 @@ dependencies { implementation("org.java-websocket:Java-WebSocket:1.+") implementation("com.melloware:jintellitype:1.+") implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.0-RC") + implementation("com.charleskorn.kaml:kaml:0.54.0") implementation("it.unimi.dsi:fastutil:8.5.12") + implementation("com.squareup.okio:okio:3.3.0") testImplementation(kotlin("test")) // Use JUnit test framework diff --git a/server/src/main/java/dev/slimevr/Keybinding.java b/server/src/main/java/dev/slimevr/Keybinding.java index 6ee6ead453..5acd1e4403 100644 --- a/server/src/main/java/dev/slimevr/Keybinding.java +++ b/server/src/main/java/dev/slimevr/Keybinding.java @@ -22,7 +22,7 @@ public class Keybinding implements HotkeyListener { public Keybinding(VRServer server) { this.server = server; - this.config = server.getConfigManager().getVrConfig().getKeybindings(); + this.config = server.getConfigManager().getVrConfig().keybindings; if (OperatingSystem.getCurrentPlatform() != OperatingSystem.WINDOWS) { LogManager @@ -36,15 +36,15 @@ public Keybinding(VRServer server) { if (JIntellitype.getInstance() instanceof JIntellitype) { JIntellitype.getInstance().addHotKeyListener(this); - String fullResetBinding = this.config.getFullResetBinding(); + String fullResetBinding = this.config.fullResetBinding; JIntellitype.getInstance().registerHotKey(FULL_RESET, fullResetBinding); LogManager.info("[Keybinding] Bound full reset to " + fullResetBinding); - String yawResetBinding = this.config.getYawResetBinding(); + String yawResetBinding = this.config.yawResetBinding; JIntellitype.getInstance().registerHotKey(YAW_RESET, yawResetBinding); LogManager.info("[Keybinding] Bound yaw reset to " + yawResetBinding); - String mountingResetBinding = this.config.getMountingResetBinding(); + String mountingResetBinding = this.config.mountingResetBinding; JIntellitype.getInstance().registerHotKey(MOUNTING_RESET, mountingResetBinding); LogManager.info("[Keybinding] Bound reset mounting to " + mountingResetBinding); } @@ -62,18 +62,18 @@ public void onHotKey(int identifier) { switch (identifier) { case FULL_RESET -> { server.getResetHandler().sendStarted(ResetType.Full); - server.scheduleResetTrackersFull(resetSourceName, this.config.getFullResetDelay()); + server.scheduleResetTrackersFull(resetSourceName, this.config.fullResetDelay); } case YAW_RESET -> { server.getResetHandler().sendStarted(ResetType.Yaw); - server.scheduleResetTrackersYaw(resetSourceName, this.config.getYawResetDelay()); + server.scheduleResetTrackersYaw(resetSourceName, this.config.yawResetDelay); } case MOUNTING_RESET -> { server.getResetHandler().sendStarted(ResetType.Mounting); server .scheduleResetTrackersMounting( resetSourceName, - this.config.getMountingResetDelay() + this.config.mountingResetDelay ); } } diff --git a/server/src/main/java/dev/slimevr/VRServer.java b/server/src/main/java/dev/slimevr/VRServer.java index 34b2390087..701748fd33 100644 --- a/server/src/main/java/dev/slimevr/VRServer.java +++ b/server/src/main/java/dev/slimevr/VRServer.java @@ -115,7 +115,7 @@ public VRServer(String configPath) { List computedTrackers = humanPoseManager.getComputedTrackers(); // Start server for SlimeVR trackers - int trackerPort = configManager.getVrConfig().getServer().getTrackerPort(); + int trackerPort = configManager.getVrConfig().server.trackerPort; LogManager.info("Starting the tracker server on port " + trackerPort + "..."); trackersServer = new TrackersUDPServer( trackerPort, @@ -211,13 +211,13 @@ public VRServer(String configPath) { this, humanPoseManager, driverBridge, - getConfigManager().getVrConfig().getVrcOSC(), + getConfigManager().getVrConfig().vrcOSC, computedTrackers ); vmcHandler = new VMCHandler( this, humanPoseManager, - getConfigManager().getVrConfig().getVMC(), + getConfigManager().getVrConfig().getVmc(), computedTrackers ); @@ -225,7 +225,7 @@ public VRServer(String configPath) { FastList oscHandlers = new FastList<>(); oscHandlers.add(vrcOSCHandler); oscHandlers.add(vmcHandler); - oscRouter = new OSCRouter(getConfigManager().getVrConfig().getOscRouter(), oscHandlers); + oscRouter = new OSCRouter(getConfigManager().getVrConfig().oscRouter, oscHandlers); bvhRecorder = new BVHRecorder(this); diff --git a/server/src/main/java/dev/slimevr/config/AutoBoneConfig.kt b/server/src/main/java/dev/slimevr/config/AutoBoneConfig.kt index 8700c478f6..d01ee6cdb0 100644 --- a/server/src/main/java/dev/slimevr/config/AutoBoneConfig.kt +++ b/server/src/main/java/dev/slimevr/config/AutoBoneConfig.kt @@ -1,5 +1,8 @@ package dev.slimevr.config +import kotlinx.serialization.Serializable + +@Serializable class AutoBoneConfig { var cursorIncrement = 2 var minDataDistance = 1 @@ -20,6 +23,6 @@ class AutoBoneConfig { var randomizeFrameOrder = true var scaleEachStep = true var sampleCount = 1000 - var sampleRateMs: Long = 20 + var sampleRateMs = 20L var saveRecordings = false } diff --git a/server/src/main/java/dev/slimevr/config/BridgeConfig.java b/server/src/main/java/dev/slimevr/config/BridgeConfig.java deleted file mode 100644 index b0359c873f..0000000000 --- a/server/src/main/java/dev/slimevr/config/BridgeConfig.java +++ /dev/null @@ -1,32 +0,0 @@ -package dev.slimevr.config; - -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.StdKeySerializers; -import dev.slimevr.config.serializers.BooleanMapDeserializer; -import dev.slimevr.tracking.trackers.TrackerRole; -import java.util.HashMap; -import java.util.Map; - - -public class BridgeConfig { - - @JsonDeserialize(using = BooleanMapDeserializer.class) - @JsonSerialize(keyUsing = StdKeySerializers.StringKeySerializer.class) - public Map trackers = new HashMap<>(); - - public BridgeConfig() { - } - - public boolean getBridgeTrackerRole(TrackerRole role, boolean def) { - return trackers.getOrDefault(role.name().toLowerCase(), def); - } - - public void setBridgeTrackerRole(TrackerRole role, boolean val) { - this.trackers.put(role.name().toLowerCase(), val); - } - - public Map getTrackers() { - return trackers; - } -} diff --git a/server/src/main/java/dev/slimevr/config/BridgeConfig.kt b/server/src/main/java/dev/slimevr/config/BridgeConfig.kt new file mode 100644 index 0000000000..89e193a9f5 --- /dev/null +++ b/server/src/main/java/dev/slimevr/config/BridgeConfig.kt @@ -0,0 +1,23 @@ +package dev.slimevr.config + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize +import com.fasterxml.jackson.databind.annotation.JsonSerialize +import com.fasterxml.jackson.databind.ser.std.StdKeySerializers +import dev.slimevr.config.serializers.BooleanMapDeserializer +import dev.slimevr.tracking.trackers.TrackerRole +import kotlinx.serialization.Serializable +import java.util.* + +@Serializable +class BridgeConfig { + @JsonDeserialize(using = BooleanMapDeserializer::class) + @JsonSerialize(keyUsing = StdKeySerializers.StringKeySerializer::class) + var trackers: MutableMap = HashMap() + fun getBridgeTrackerRole(role: TrackerRole, def: Boolean): Boolean { + return trackers.getOrDefault(role.name.lowercase(Locale.getDefault()), def) + } + + fun setBridgeTrackerRole(role: TrackerRole, `val`: Boolean) { + trackers[role.name.lowercase(Locale.getDefault())] = `val` + } +} diff --git a/server/src/main/java/dev/slimevr/config/ConfigManager.java b/server/src/main/java/dev/slimevr/config/ConfigManager.java deleted file mode 100644 index 0ae7747d47..0000000000 --- a/server/src/main/java/dev/slimevr/config/ConfigManager.java +++ /dev/null @@ -1,139 +0,0 @@ -package dev.slimevr.config; - -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.module.SimpleModule; -import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; -import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator; -import com.github.jonpeterson.jackson.module.versioning.VersioningModule; -import dev.slimevr.config.serializers.QuaternionDeserializer; -import dev.slimevr.config.serializers.QuaternionSerializer; -import io.eiren.util.ann.ThreadSafe; -import io.eiren.util.logging.LogManager; -import io.github.axisangles.ktmath.Quaternion; - -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.nio.file.*; - - -public class ConfigManager { - - private final String configPath; - - private final ObjectMapper om; - - private VRConfig vrConfig; - - - public ConfigManager(String configPath) { - this.configPath = configPath; - om = new ObjectMapper(new YAMLFactory().disable(YAMLGenerator.Feature.SPLIT_LINES)); - om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - om.registerModule(new VersioningModule()); - SimpleModule quaternionModule = new SimpleModule(); - quaternionModule.addSerializer(Quaternion.class, new QuaternionSerializer()); - quaternionModule.addDeserializer(Quaternion.class, new QuaternionDeserializer()); - om.registerModule(quaternionModule); - } - - public void loadConfig() { - try { - this.vrConfig = om - .readValue(new FileInputStream(configPath), VRConfig.class); - } catch (FileNotFoundException e) { - // Config file didn't exist, is not an error - } catch (IOException e) { - // Log the exception - LogManager.severe("Config failed to load: " + e); - // Make a backup of the erroneous config - backupConfig(); - } - - if (this.vrConfig == null) { - this.vrConfig = new VRConfig(); - } - } - - public void atomicMove(Path from, Path to) throws IOException { - try { - // Atomic move to overwrite - Files.move(from, to, StandardCopyOption.ATOMIC_MOVE); - } catch (AtomicMoveNotSupportedException | FileAlreadyExistsException e) { - // Atomic move not supported or does not replace, try just replacing - Files.move(from, to, StandardCopyOption.REPLACE_EXISTING); - } - } - - public void backupConfig() { - Path cfgFile = Path.of(configPath); - Path tmpBakCfgFile = Path.of(configPath + ".bak.tmp"); - Path bakCfgFile = Path.of(configPath + ".bak"); - - try { - Files - .copy( - cfgFile, - tmpBakCfgFile, - StandardCopyOption.REPLACE_EXISTING, - StandardCopyOption.COPY_ATTRIBUTES - ); - LogManager.info("Made a backup copy of config to \"" + tmpBakCfgFile + "\""); - } catch (IOException e) { - LogManager - .severe( - "Unable to make backup copy of config from \"" - + cfgFile - + "\" to \"" - + tmpBakCfgFile - + "\"", - e - ); - return; // Abort write - } - - try { - atomicMove(tmpBakCfgFile, bakCfgFile); - } catch (IOException e) { - LogManager - .severe( - "Unable to move backup config from \"" - + tmpBakCfgFile - + "\" to \"" - + bakCfgFile - + "\"", - e - ); - } - } - - @ThreadSafe - public synchronized void saveConfig() { - Path tmpCfgFile = Path.of(configPath + ".tmp"); - Path cfgFile = Path.of(configPath); - - // Serialize config - try { - om.writeValue(tmpCfgFile.toFile(), this.vrConfig); - } catch (IOException e) { - LogManager.severe("Unable to write serialized config to \"" + tmpCfgFile + "\"", e); - return; // Abort write - } - - // Overwrite old config - try { - atomicMove(tmpCfgFile, cfgFile); - } catch (IOException e) { - LogManager - .severe( - "Unable to move new config from \"" + tmpCfgFile + "\" to \"" + cfgFile + "\"", - e - ); - } - } - - public VRConfig getVrConfig() { - return vrConfig; - } -} diff --git a/server/src/main/java/dev/slimevr/config/ConfigManager.kt b/server/src/main/java/dev/slimevr/config/ConfigManager.kt new file mode 100644 index 0000000000..8f204e22c4 --- /dev/null +++ b/server/src/main/java/dev/slimevr/config/ConfigManager.kt @@ -0,0 +1,104 @@ +package dev.slimevr.config + +import com.charleskorn.kaml.Yaml +import com.fasterxml.jackson.databind.DeserializationFeature +import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.databind.module.SimpleModule +import com.fasterxml.jackson.dataformat.yaml.YAMLFactory +import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator +import com.github.jonpeterson.jackson.module.versioning.VersioningModule +import dev.slimevr.config.serializers.QuaternionDeserializer +import dev.slimevr.config.serializers.QuaternionSerializer +import io.eiren.util.ann.ThreadSafe +import io.eiren.util.logging.LogManager +import io.github.axisangles.ktmath.Quaternion +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.encodeToString +import okio.FileSystem +import okio.Path.Companion.toPath +import java.io.FileNotFoundException +import java.io.IOException + +class ConfigManager(private val configPath: String) { + private val om: ObjectMapper = ObjectMapper(YAMLFactory().disable(YAMLGenerator.Feature.SPLIT_LINES)) + lateinit var vrConfig: VRConfig + private set + + init { + om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + om.registerModule(VersioningModule()) + val quaternionModule = SimpleModule() + quaternionModule.addSerializer(Quaternion::class.java, QuaternionSerializer()) + quaternionModule.addDeserializer(Quaternion::class.java, QuaternionDeserializer()) + om.registerModule(quaternionModule) + } + + fun loadConfig() { + vrConfig = VRConfig() + + try { + FileSystem.SYSTEM.read(configPath.toPath()) { + val config = readUtf8() + vrConfig = Yaml.default.decodeFromString(config) + } + } catch (e: FileNotFoundException) { + // Config file didn't exist, is not an error + } catch (e: IOException) { + // Log the exception + LogManager.severe("Config failed to load: $e") + // Make a backup of the erroneous config + backupConfig() + } + } + + fun backupConfig() { + val cfgFile = configPath.toPath() + val tmpBakCfgFile = "$configPath.bak.tmp".toPath() + val bakCfgFile = "$configPath.bak".toPath() + try { + FileSystem.SYSTEM.copy(cfgFile, tmpBakCfgFile) + LogManager.info("Made a backup copy of config to \"$tmpBakCfgFile\"") + } catch (e: IOException) { + LogManager.severe( + "Unable to make backup copy of config from \"$cfgFile\" to \"$tmpBakCfgFile\"", + e + ) + return // Abort write + } + try { + FileSystem.SYSTEM.atomicMove(tmpBakCfgFile, bakCfgFile) + } catch (e: IOException) { + LogManager.severe( + "Unable to move backup config from \"$tmpBakCfgFile\" to \"$bakCfgFile\"", + e + ) + } + } + + @ThreadSafe + @Synchronized + fun saveConfig() { + val tmpCfgFile = "$configPath.tmp".toPath() + val cfgFile = configPath.toPath() + + // Serialize config + try { + FileSystem.SYSTEM.write(tmpCfgFile) { + writeUtf8(Yaml.default.encodeToString(vrConfig)) + } + } catch (e: IOException) { + LogManager.severe("Unable to write serialized config to \"$tmpCfgFile\"", e) + return // Abort write + } + + // Overwrite old config + try { + FileSystem.SYSTEM.atomicMove(tmpCfgFile, cfgFile) + } catch (e: IOException) { + LogManager.severe( + "Unable to move new config from \"$tmpCfgFile\" to \"$cfgFile\"", + e + ) + } + } +} diff --git a/server/src/main/java/dev/slimevr/config/DriftCompensationConfig.kt b/server/src/main/java/dev/slimevr/config/DriftCompensationConfig.kt index f389f8577e..917f33b38f 100644 --- a/server/src/main/java/dev/slimevr/config/DriftCompensationConfig.kt +++ b/server/src/main/java/dev/slimevr/config/DriftCompensationConfig.kt @@ -1,7 +1,9 @@ package dev.slimevr.config import dev.slimevr.vrServer +import kotlinx.serialization.Serializable +@Serializable class DriftCompensationConfig { // Is drift compensation enabled @@ -12,6 +14,7 @@ class DriftCompensationConfig { // Max resets for the calculated average drift var maxResets = 6 + fun updateTrackersDriftCompensation() { for (t in vrServer.allTrackers) { if (t.allowFiltering) { diff --git a/server/src/main/java/dev/slimevr/config/FiltersConfig.kt b/server/src/main/java/dev/slimevr/config/FiltersConfig.kt index 3a7ae6082b..64b25cabcc 100644 --- a/server/src/main/java/dev/slimevr/config/FiltersConfig.kt +++ b/server/src/main/java/dev/slimevr/config/FiltersConfig.kt @@ -1,7 +1,9 @@ package dev.slimevr.config import dev.slimevr.vrServer +import kotlinx.serialization.Serializable +@Serializable class FiltersConfig { // Type of filtering applied (none, smoothing or prediction) diff --git a/server/src/main/java/dev/slimevr/config/KeybindingsConfig.java b/server/src/main/java/dev/slimevr/config/KeybindingsConfig.java deleted file mode 100644 index 198552f54a..0000000000 --- a/server/src/main/java/dev/slimevr/config/KeybindingsConfig.java +++ /dev/null @@ -1,56 +0,0 @@ -package dev.slimevr.config; - -public class KeybindingsConfig { - - private String fullResetBinding = "CTRL+ALT+SHIFT+Y"; - - private String yawResetBinding = "CTRL+ALT+SHIFT+U"; - - private String mountingResetBinding = "CTRL+ALT+SHIFT+I"; - - private long fullResetDelay = 0L; - - private long yawResetDelay = 0L; - - private long mountingResetDelay = 0L; - - - public KeybindingsConfig() { - } - - public String getFullResetBinding() { - return fullResetBinding; - } - - public String getYawResetBinding() { - return yawResetBinding; - } - - public String getMountingResetBinding() { - return mountingResetBinding; - } - - public long getFullResetDelay() { - return fullResetDelay; - } - - public void setFullResetDelay(long delay) { - fullResetDelay = delay; - } - - public long getYawResetDelay() { - return yawResetDelay; - } - - public void setYawResetDelay(long delay) { - yawResetDelay = delay; - } - - public long getMountingResetDelay() { - return mountingResetDelay; - } - - public void setMountingResetDelay(long delay) { - mountingResetDelay = delay; - } -} diff --git a/server/src/main/java/dev/slimevr/config/KeybindingsConfig.kt b/server/src/main/java/dev/slimevr/config/KeybindingsConfig.kt new file mode 100644 index 0000000000..83b6610b08 --- /dev/null +++ b/server/src/main/java/dev/slimevr/config/KeybindingsConfig.kt @@ -0,0 +1,24 @@ +package dev.slimevr.config + +import kotlinx.serialization.Serializable + +@Serializable +class KeybindingsConfig { + @JvmField + val fullResetBinding = "CTRL+ALT+SHIFT+Y" + + @JvmField + val yawResetBinding = "CTRL+ALT+SHIFT+U" + + @JvmField + val mountingResetBinding = "CTRL+ALT+SHIFT+I" + + @JvmField + var fullResetDelay = 0L + + @JvmField + var yawResetDelay = 0L + + @JvmField + var mountingResetDelay = 0L +} diff --git a/server/src/main/java/dev/slimevr/config/LegTweaksConfig.java b/server/src/main/java/dev/slimevr/config/LegTweaksConfig.java deleted file mode 100644 index 1752c8c29e..0000000000 --- a/server/src/main/java/dev/slimevr/config/LegTweaksConfig.java +++ /dev/null @@ -1,14 +0,0 @@ -package dev.slimevr.config; - -public class LegTweaksConfig { - - private float correctionStrength = 0.3f; - - public float getCorrectionStrength() { - return correctionStrength; - } - - public void setCorrectionStrength(float correctionStrength) { - this.correctionStrength = correctionStrength; - } -} diff --git a/server/src/main/java/dev/slimevr/config/LegTweaksConfig.kt b/server/src/main/java/dev/slimevr/config/LegTweaksConfig.kt new file mode 100644 index 0000000000..33b9c23695 --- /dev/null +++ b/server/src/main/java/dev/slimevr/config/LegTweaksConfig.kt @@ -0,0 +1,9 @@ +package dev.slimevr.config + +import kotlinx.serialization.Serializable + +@Serializable +class LegTweaksConfig { + @JvmField + var correctionStrength = 0.3f +} diff --git a/server/src/main/java/dev/slimevr/config/OSCConfig.kt b/server/src/main/java/dev/slimevr/config/OSCConfig.kt index 89b317fa37..d488c3ca04 100644 --- a/server/src/main/java/dev/slimevr/config/OSCConfig.kt +++ b/server/src/main/java/dev/slimevr/config/OSCConfig.kt @@ -1,5 +1,8 @@ package dev.slimevr.config +import kotlinx.serialization.Serializable + +@Serializable open class OSCConfig { // Are the OSC receiver and sender enabled? diff --git a/server/src/main/java/dev/slimevr/config/OverlayConfig.java b/server/src/main/java/dev/slimevr/config/OverlayConfig.java deleted file mode 100644 index 7f564e57d5..0000000000 --- a/server/src/main/java/dev/slimevr/config/OverlayConfig.java +++ /dev/null @@ -1,24 +0,0 @@ -package dev.slimevr.config; - -public class OverlayConfig { - - private boolean isMirrored = false; - private boolean isVisible = false; - - - public boolean isMirrored() { - return isMirrored; - } - - public boolean isVisible() { - return isVisible; - } - - public void setMirrored(boolean mirrored) { - isMirrored = mirrored; - } - - public void setVisible(boolean visible) { - isVisible = visible; - } -} diff --git a/server/src/main/java/dev/slimevr/config/OverlayConfig.kt b/server/src/main/java/dev/slimevr/config/OverlayConfig.kt new file mode 100644 index 0000000000..7c486dedc9 --- /dev/null +++ b/server/src/main/java/dev/slimevr/config/OverlayConfig.kt @@ -0,0 +1,12 @@ +package dev.slimevr.config + +import kotlinx.serialization.Serializable + +@Serializable +class OverlayConfig { + @JvmField + var mirrored = false + + @JvmField + var visible = false +} diff --git a/server/src/main/java/dev/slimevr/config/ServerConfig.java b/server/src/main/java/dev/slimevr/config/ServerConfig.java deleted file mode 100644 index 2daf2a749c..0000000000 --- a/server/src/main/java/dev/slimevr/config/ServerConfig.java +++ /dev/null @@ -1,10 +0,0 @@ -package dev.slimevr.config; - -public class ServerConfig { - - private int trackerPort = 6969; - - public int getTrackerPort() { - return trackerPort; - } -} diff --git a/server/src/main/java/dev/slimevr/config/ServerConfig.kt b/server/src/main/java/dev/slimevr/config/ServerConfig.kt new file mode 100644 index 0000000000..680cb0d29d --- /dev/null +++ b/server/src/main/java/dev/slimevr/config/ServerConfig.kt @@ -0,0 +1,9 @@ +package dev.slimevr.config + +import kotlinx.serialization.Serializable + +@Serializable +class ServerConfig { + @JvmField + val trackerPort = 6969 +} diff --git a/server/src/main/java/dev/slimevr/config/SkeletonConfig.java b/server/src/main/java/dev/slimevr/config/SkeletonConfig.java deleted file mode 100644 index 07ec694f3e..0000000000 --- a/server/src/main/java/dev/slimevr/config/SkeletonConfig.java +++ /dev/null @@ -1,38 +0,0 @@ -package dev.slimevr.config; - -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.StdKeySerializers; -import dev.slimevr.config.serializers.BooleanMapDeserializer; -import dev.slimevr.config.serializers.FloatMapDeserializer; - -import java.util.HashMap; -import java.util.Map; - - -public class SkeletonConfig { - - @JsonDeserialize(using = BooleanMapDeserializer.class) - @JsonSerialize(keyUsing = StdKeySerializers.StringKeySerializer.class) - public Map toggles = new HashMap<>(); - - @JsonDeserialize(using = FloatMapDeserializer.class) - @JsonSerialize(keyUsing = StdKeySerializers.StringKeySerializer.class) - public Map values = new HashMap<>(); - - @JsonDeserialize(using = FloatMapDeserializer.class) - @JsonSerialize(keyUsing = StdKeySerializers.StringKeySerializer.class) - public Map offsets = new HashMap<>(); - - public Map getToggles() { - return toggles; - } - - public Map getOffsets() { - return offsets; - } - - public Map getValues() { - return values; - } -} diff --git a/server/src/main/java/dev/slimevr/config/SkeletonConfig.kt b/server/src/main/java/dev/slimevr/config/SkeletonConfig.kt new file mode 100644 index 0000000000..fa22e0a874 --- /dev/null +++ b/server/src/main/java/dev/slimevr/config/SkeletonConfig.kt @@ -0,0 +1,26 @@ +package dev.slimevr.config + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize +import com.fasterxml.jackson.databind.annotation.JsonSerialize +import com.fasterxml.jackson.databind.ser.std.StdKeySerializers +import dev.slimevr.config.serializers.BooleanMapDeserializer +import dev.slimevr.config.serializers.FloatMapDeserializer +import kotlinx.serialization.Serializable + +@Serializable +class SkeletonConfig { + @JvmField + @JsonDeserialize(using = BooleanMapDeserializer::class) + @JsonSerialize(keyUsing = StdKeySerializers.StringKeySerializer::class) + val toggles: MutableMap = HashMap() + + @JvmField + @JsonDeserialize(using = FloatMapDeserializer::class) + @JsonSerialize(keyUsing = StdKeySerializers.StringKeySerializer::class) + val values: MutableMap = HashMap() + + @JvmField + @JsonDeserialize(using = FloatMapDeserializer::class) + @JsonSerialize(keyUsing = StdKeySerializers.StringKeySerializer::class) + val offsets: MutableMap = HashMap() +} diff --git a/server/src/main/java/dev/slimevr/config/TapDetectionConfig.kt b/server/src/main/java/dev/slimevr/config/TapDetectionConfig.kt index 721addd0b6..49f7c77b73 100644 --- a/server/src/main/java/dev/slimevr/config/TapDetectionConfig.kt +++ b/server/src/main/java/dev/slimevr/config/TapDetectionConfig.kt @@ -1,10 +1,12 @@ package dev.slimevr.config import com.jme3.math.FastMath +import kotlinx.serialization.Serializable // handles the tap detection config // this involves the number of taps, the delay, and whether or not the feature is enabled // for each reset type +@Serializable class TapDetectionConfig { var yawResetDelay = 0.2f var fullResetDelay = 1.0f diff --git a/server/src/main/java/dev/slimevr/config/TrackerConfig.java b/server/src/main/java/dev/slimevr/config/TrackerConfig.java deleted file mode 100644 index fd47a622c0..0000000000 --- a/server/src/main/java/dev/slimevr/config/TrackerConfig.java +++ /dev/null @@ -1,92 +0,0 @@ -package dev.slimevr.config; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.node.ObjectNode; -import dev.slimevr.tracking.trackers.Tracker; -import io.github.axisangles.ktmath.Quaternion; - - -public class TrackerConfig { - - private String customName; - private String designation; - private boolean hide; - private Quaternion adjustment; - private Quaternion mountingOrientation; - private Boolean allowDriftCompensation; - - - public TrackerConfig() { - } - - public TrackerConfig(Tracker tracker) { - this.designation = tracker.getTrackerPosition() - != null ? tracker.getTrackerPosition().getDesignation() : null; - this.customName = tracker.getCustomName(); - allowDriftCompensation = tracker.isImu(); - } - - static JsonNode toV2(JsonNode v1, JsonNodeFactory factory) { - ObjectNode node = factory.objectNode(); - if (v1.has("customName")) - node.set("customName", v1.get("customName")); - if (v1.has("designation")) - node.set("designation", v1.get("designation")); - if (v1.has("hide")) - node.set("hide", v1.get("hide")); - if (v1.has("mountingRotation")) - node.set("mountingRotation", v1.get("mountingRotation")); - if (v1.has("adjustment")) - node.set("adjustment", v1.get("adjustment")); - return node; - } - - public String getCustomName() { - return customName; - } - - public void setCustomName(String customName) { - this.customName = customName; - } - - public String getDesignation() { - return designation; - } - - public void setDesignation(String designation) { - this.designation = designation; - } - - public boolean isHide() { - return hide; - } - - public void setHide(boolean hide) { - this.hide = hide; - } - - public Quaternion getAdjustment() { - return adjustment; - } - - public void setAdjustment(Quaternion adjustment) { - this.adjustment = adjustment; - } - - public Quaternion getMountingOrientation() { - return mountingOrientation; - } - - public void setMountingOrientation(Quaternion mountingOrientation) { - this.mountingOrientation = mountingOrientation; - } - - public Boolean getAllowDriftCompensation() { - return allowDriftCompensation; - } - - public void setAllowDriftCompensation(Boolean allowDriftCompensation) { - this.allowDriftCompensation = allowDriftCompensation; - } -} diff --git a/server/src/main/java/dev/slimevr/config/TrackerConfig.kt b/server/src/main/java/dev/slimevr/config/TrackerConfig.kt new file mode 100644 index 0000000000..faeb86a806 --- /dev/null +++ b/server/src/main/java/dev/slimevr/config/TrackerConfig.kt @@ -0,0 +1,40 @@ +package dev.slimevr.config + +import com.fasterxml.jackson.databind.JsonNode +import com.fasterxml.jackson.databind.node.JsonNodeFactory +import dev.slimevr.tracking.trackers.Tracker +import io.github.axisangles.ktmath.Quaternion +import kotlinx.serialization.Serializable + +@Serializable +class TrackerConfig { + var customName: String? = null + var designation: String? = null + var hide = false + var adjustment: Quaternion? = null + var mountingOrientation: Quaternion? = null + var allowDriftCompensation: Boolean? = null + + constructor(tracker: Tracker) { + designation = if (tracker.trackerPosition != null) { + tracker.trackerPosition!!.designation + } else { + null + } + customName = tracker.customName + allowDriftCompensation = tracker.isImu() + } + + companion object { + @JvmStatic + fun toV2(v1: JsonNode, factory: JsonNodeFactory): JsonNode { + val node = factory.objectNode() + if (v1.has("customName")) node.set("customName", v1["customName"]) + if (v1.has("designation")) node.set("designation", v1["designation"]) + if (v1.has("hide")) node.set("hide", v1["hide"]) + if (v1.has("mountingRotation")) node.set("mountingRotation", v1["mountingRotation"]) + if (v1.has("adjustment")) node.set("adjustment", v1["adjustment"]) + return node + } + } +} diff --git a/server/src/main/java/dev/slimevr/config/VMCConfig.kt b/server/src/main/java/dev/slimevr/config/VMCConfig.kt index a424cc525c..38109e8135 100644 --- a/server/src/main/java/dev/slimevr/config/VMCConfig.kt +++ b/server/src/main/java/dev/slimevr/config/VMCConfig.kt @@ -1,5 +1,8 @@ package dev.slimevr.config +import kotlinx.serialization.Serializable + +@Serializable class VMCConfig : OSCConfig() { // Anchor the tracking at the hip? diff --git a/server/src/main/java/dev/slimevr/config/VRCOSCConfig.kt b/server/src/main/java/dev/slimevr/config/VRCOSCConfig.kt index f1ddce6432..ae9f72451b 100644 --- a/server/src/main/java/dev/slimevr/config/VRCOSCConfig.kt +++ b/server/src/main/java/dev/slimevr/config/VRCOSCConfig.kt @@ -5,15 +5,17 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize import com.fasterxml.jackson.databind.ser.std.StdKeySerializers import dev.slimevr.config.serializers.BooleanMapDeserializer import dev.slimevr.tracking.trackers.TrackerRole +import kotlinx.serialization.Serializable import java.util.* +@Serializable class VRCOSCConfig : OSCConfig() { // Which trackers' data to send @JsonDeserialize(using = BooleanMapDeserializer::class) @JsonSerialize(keyUsing = StdKeySerializers.StringKeySerializer::class) var trackers: MutableMap = HashMap() - + fun getOSCTrackerRole(role: TrackerRole, def: Boolean): Boolean { return trackers.getOrDefault(role.name.lowercase(Locale.getDefault()), def) } diff --git a/server/src/main/java/dev/slimevr/config/VRConfig.java b/server/src/main/java/dev/slimevr/config/VRConfig.java deleted file mode 100644 index e572576c2e..0000000000 --- a/server/src/main/java/dev/slimevr/config/VRConfig.java +++ /dev/null @@ -1,177 +0,0 @@ -package dev.slimevr.config; - -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.StdKeySerializers; -import com.github.jonpeterson.jackson.module.versioning.JsonVersionedModel; -import dev.slimevr.config.serializers.BridgeConfigMapDeserializer; -import dev.slimevr.config.serializers.TrackerConfigMapDeserializer; -import dev.slimevr.tracking.trackers.Tracker; -import dev.slimevr.tracking.trackers.TrackerRole; - -import java.util.HashMap; -import java.util.Map; - - -@JsonVersionedModel( - currentVersion = "8", defaultDeserializeToVersion = "8", toCurrentConverterClass = CurrentVRConfigConverter.class -) -public class VRConfig { - - private final ServerConfig server = new ServerConfig(); - - private final FiltersConfig filters = new FiltersConfig(); - - private final DriftCompensationConfig driftCompensation = new DriftCompensationConfig(); - - private final OSCConfig oscRouter = new OSCConfig(); - - private final VRCOSCConfig vrcOSC = new VRCOSCConfig(); - - private final VMCConfig vmc = new VMCConfig(); - - private final AutoBoneConfig autoBone = new AutoBoneConfig(); - - private final KeybindingsConfig keybindings = new KeybindingsConfig(); - - private final SkeletonConfig skeleton = new SkeletonConfig(); - - private final LegTweaksConfig legTweaks = new LegTweaksConfig(); - - private final TapDetectionConfig tapDetection = new TapDetectionConfig(); - - @JsonDeserialize(using = TrackerConfigMapDeserializer.class) - @JsonSerialize(keyUsing = StdKeySerializers.StringKeySerializer.class) - private final Map trackers = new HashMap<>(); - - @JsonDeserialize(using = BridgeConfigMapDeserializer.class) - @JsonSerialize(keyUsing = StdKeySerializers.StringKeySerializer.class) - private final Map bridges = new HashMap<>(); - - private final OverlayConfig overlay = new OverlayConfig(); - - public VRConfig() { - // Initialize default settings for OSC Router - oscRouter.setPortIn(9002); - oscRouter.setPortOut(9000); - - // Initialize default settings for VRC OSC - vrcOSC.setPortIn(9001); - vrcOSC.setPortOut(9000); - vrcOSC - .setOSCTrackerRole( - TrackerRole.WAIST, - vrcOSC.getOSCTrackerRole(TrackerRole.WAIST, true) - ); - vrcOSC - .setOSCTrackerRole( - TrackerRole.LEFT_FOOT, - vrcOSC.getOSCTrackerRole(TrackerRole.WAIST, true) - ); - vrcOSC - .setOSCTrackerRole( - TrackerRole.RIGHT_FOOT, - vrcOSC.getOSCTrackerRole(TrackerRole.WAIST, true) - ); - - // Initialize default settings for VMC - vmc.setPortIn(39540); - vmc.setPortOut(39539); - } - - - public ServerConfig getServer() { - return server; - } - - public FiltersConfig getFilters() { - return filters; - } - - public DriftCompensationConfig getDriftCompensation() { - return driftCompensation; - } - - public OSCConfig getOscRouter() { - return oscRouter; - } - - public VRCOSCConfig getVrcOSC() { - return vrcOSC; - } - - public VMCConfig getVMC() { - return vmc; - } - - public AutoBoneConfig getAutoBone() { - return autoBone; - } - - public KeybindingsConfig getKeybindings() { - return keybindings; - } - - public Map getTrackers() { - return trackers; - } - - public Map getBridges() { - return bridges; - } - - public SkeletonConfig getSkeleton() { - return skeleton; - } - - public LegTweaksConfig getLegTweaks() { - return legTweaks; - } - - public TapDetectionConfig getTapDetection() { - return tapDetection; - } - - public OverlayConfig getOverlay() { - return overlay; - } - - public TrackerConfig getTracker(Tracker tracker) { - TrackerConfig config = trackers.get(tracker.getName()); - if (config == null) { - config = new TrackerConfig(tracker); - trackers.put(tracker.getName(), config); - } - return config; - } - - public void readTrackerConfig(Tracker tracker) { - if (tracker.getUserEditable()) { - TrackerConfig config = getTracker(tracker); - tracker.readConfig(config); - if (tracker.isImu()) - tracker.getResetsHandler().readDriftCompensationConfig(driftCompensation); - if (tracker.getAllowFiltering()) - tracker - .getFilteringHandler() - .readFilteringConfig(filters, tracker.getRawRotation()); - } - } - - public void writeTrackerConfig(Tracker tracker) { - if (tracker.getUserEditable()) { - TrackerConfig tc = getTracker(tracker); - tracker.writeConfig(tc); - } - } - - public BridgeConfig getBridge(String bridgeKey) { - BridgeConfig config = bridges.get(bridgeKey); - if (config == null) { - config = new BridgeConfig(); - bridges.put(bridgeKey, config); - } - return config; - } -} - diff --git a/server/src/main/java/dev/slimevr/config/VRConfig.kt b/server/src/main/java/dev/slimevr/config/VRConfig.kt new file mode 100644 index 0000000000..a647c61647 --- /dev/null +++ b/server/src/main/java/dev/slimevr/config/VRConfig.kt @@ -0,0 +1,128 @@ +package dev.slimevr.config + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize +import com.fasterxml.jackson.databind.annotation.JsonSerialize +import com.fasterxml.jackson.databind.ser.std.StdKeySerializers +import com.github.jonpeterson.jackson.module.versioning.JsonVersionedModel +import dev.slimevr.config.serializers.BridgeConfigMapDeserializer +import dev.slimevr.config.serializers.TrackerConfigMapDeserializer +import dev.slimevr.tracking.trackers.Tracker +import dev.slimevr.tracking.trackers.TrackerRole +import kotlinx.serialization.KSerializer +import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.SerialDescriptor + +@JsonVersionedModel( + currentVersion = "8", + defaultDeserializeToVersion = "8", + toCurrentConverterClass = CurrentVRConfigConverter::class +) +@Serializable +class VRConfig { + @JvmField + val server = ServerConfig() + + @JvmField + val filters = FiltersConfig() + + @JvmField + val driftCompensation = DriftCompensationConfig() + + @JvmField + val oscRouter = OSCConfig() + + @JvmField + val vrcOSC = VRCOSCConfig() + val vmc = VMCConfig() + val autoBone = AutoBoneConfig() + + @JvmField + val keybindings = KeybindingsConfig() + + @JvmField + val skeleton = SkeletonConfig() + + @JvmField + val legTweaks = LegTweaksConfig() + + @JvmField + val tapDetection = TapDetectionConfig() + + @JsonDeserialize(using = TrackerConfigMapDeserializer::class) + @JsonSerialize(keyUsing = StdKeySerializers.StringKeySerializer::class) + val trackers: MutableMap = HashMap() + + @JsonDeserialize(using = BridgeConfigMapDeserializer::class) + @JsonSerialize(keyUsing = StdKeySerializers.StringKeySerializer::class) + val bridges: MutableMap = HashMap() + + @JvmField + val overlay = OverlayConfig() + + init { + // Initialize default settings for OSC Router + oscRouter.portIn = 9002 + oscRouter.portOut = 9000 + + // Initialize default settings for VRC OSC + vrcOSC.portIn = 9001 + vrcOSC.portOut = 9000 + vrcOSC + .setOSCTrackerRole( + TrackerRole.WAIST, + vrcOSC.getOSCTrackerRole(TrackerRole.WAIST, true) + ) + vrcOSC + .setOSCTrackerRole( + TrackerRole.LEFT_FOOT, + vrcOSC.getOSCTrackerRole(TrackerRole.WAIST, true) + ) + vrcOSC + .setOSCTrackerRole( + TrackerRole.RIGHT_FOOT, + vrcOSC.getOSCTrackerRole(TrackerRole.WAIST, true) + ) + + // Initialize default settings for VMC + vmc.portIn = 39540 + vmc.portOut = 39539 + } + + fun getTracker(tracker: Tracker): TrackerConfig { + var config = trackers[tracker.name] + if (config == null) { + config = TrackerConfig(tracker) + trackers[tracker.name] = config + } + return config + } + + fun readTrackerConfig(tracker: Tracker) { + if (tracker.userEditable) { + val config = getTracker(tracker) + tracker.readConfig(config) + if (tracker.isImu()) tracker.resetsHandler.readDriftCompensationConfig(driftCompensation) + if (tracker.allowFiltering) { + tracker + .filteringHandler + .readFilteringConfig(filters, tracker.getRawRotation()) + } + } + } + + fun writeTrackerConfig(tracker: Tracker) { + if (tracker.userEditable) { + val tc = getTracker(tracker) + tracker.writeConfig(tc) + } + } + + fun getBridge(bridgeKey: String): BridgeConfig { + var config = bridges[bridgeKey] + if (config == null) { + config = BridgeConfig() + bridges[bridgeKey] = config + } + return config + } +} diff --git a/server/src/main/java/dev/slimevr/protocol/rpc/RPCHandler.java b/server/src/main/java/dev/slimevr/protocol/rpc/RPCHandler.java index 3d9597e76b..ac15fbf82d 100644 --- a/server/src/main/java/dev/slimevr/protocol/rpc/RPCHandler.java +++ b/server/src/main/java/dev/slimevr/protocol/rpc/RPCHandler.java @@ -111,9 +111,9 @@ private void onOverlayDisplayModeRequest( RpcMessageHeader messageHeader ) { FlatBufferBuilder fbb = new FlatBufferBuilder(32); - OverlayConfig config = this.api.server.getConfigManager().getVrConfig().getOverlay(); + OverlayConfig config = this.api.server.getConfigManager().getVrConfig().overlay; int response = OverlayDisplayModeResponse - .createOverlayDisplayModeResponse(fbb, config.isVisible(), config.isMirrored()); + .createOverlayDisplayModeResponse(fbb, config.visible, config.mirrored); int outbound = this.createRPCMessage(fbb, RpcMessage.OverlayDisplayModeResponse, response); fbb.finish(outbound); conn.send(fbb.dataBuffer()); @@ -127,9 +127,9 @@ private void onOverlayDisplayModeChangeRequest( .message(new OverlayDisplayModeChangeRequest()); if (req == null) return; - OverlayConfig config = this.api.server.getConfigManager().getVrConfig().getOverlay(); - config.setMirrored(req.isMirrored()); - config.setVisible(req.isVisible()); + OverlayConfig config = this.api.server.getConfigManager().getVrConfig().overlay; + config.mirrored = req.isMirrored(); + config.visible = req.isVisible(); this.api.server.getConfigManager().saveConfig(); } diff --git a/server/src/main/java/dev/slimevr/protocol/rpc/settings/RPCSettingsBuilder.java b/server/src/main/java/dev/slimevr/protocol/rpc/settings/RPCSettingsBuilder.java index cd25ef4efe..f3c5966450 100644 --- a/server/src/main/java/dev/slimevr/protocol/rpc/settings/RPCSettingsBuilder.java +++ b/server/src/main/java/dev/slimevr/protocol/rpc/settings/RPCSettingsBuilder.java @@ -198,7 +198,7 @@ public static int createModelSettings( int legTweaksOffset = LegTweaksSettings .createLegTweaksSettings( fbb, - legTweaksConfig.getCorrectionStrength() + legTweaksConfig.correctionStrength ); return ModelSettings.createModelSettings(fbb, togglesOffset, ratiosOffset, legTweaksOffset); } diff --git a/server/src/main/java/dev/slimevr/protocol/rpc/settings/RPCSettingsHandler.java b/server/src/main/java/dev/slimevr/protocol/rpc/settings/RPCSettingsHandler.java index 6c3a296494..b9d1f81148 100644 --- a/server/src/main/java/dev/slimevr/protocol/rpc/settings/RPCSettingsHandler.java +++ b/server/src/main/java/dev/slimevr/protocol/rpc/settings/RPCSettingsHandler.java @@ -46,38 +46,38 @@ public void onSettingsRequest(GenericConnection conn, RpcMessageHeader messageHe RPCSettingsBuilder .createFilterSettings( fbb, - this.api.server.getConfigManager().getVrConfig().getFilters() + this.api.server.getConfigManager().getVrConfig().filters ), RPCSettingsBuilder .createDriftCompensationSettings( fbb, - this.api.server.getConfigManager().getVrConfig().getDriftCompensation() + this.api.server.getConfigManager().getVrConfig().driftCompensation ), RPCSettingsBuilder .createOSCRouterSettings( fbb, - this.api.server.getConfigManager().getVrConfig().getOscRouter() + this.api.server.getConfigManager().getVrConfig().oscRouter ), RPCSettingsBuilder .createVRCOSCSettings( fbb, - this.api.server.getConfigManager().getVrConfig().getVrcOSC() + this.api.server.getConfigManager().getVrConfig().vrcOSC ), RPCSettingsBuilder .createVMCOSCSettings( fbb, - this.api.server.getConfigManager().getVrConfig().getVMC() + this.api.server.getConfigManager().getVrConfig().getVmc() ), RPCSettingsBuilder .createModelSettings( fbb, this.api.server.humanPoseManager, - this.api.server.getConfigManager().getVrConfig().getLegTweaks() + this.api.server.getConfigManager().getVrConfig().legTweaks ), RPCSettingsBuilder .createTapDetectionSettings( fbb, - this.api.server.getConfigManager().getVrConfig().getTapDetection() + this.api.server.getConfigManager().getVrConfig().tapDetection ) ); int outbound = rpcHandler.createRPCMessage(fbb, RpcMessage.SettingsResponse, settings); @@ -114,8 +114,7 @@ public void onChangeSettingsRequest(GenericConnection conn, RpcMessageHeader mes if (type != null) { FiltersConfig filtersConfig = this.api.server .getConfigManager() - .getVrConfig() - .getFilters(); + .getVrConfig().filters; filtersConfig.setType(type.getConfigKey()); filtersConfig.setAmount(req.filtering().amount()); filtersConfig.updateTrackersFilters(); @@ -125,8 +124,7 @@ public void onChangeSettingsRequest(GenericConnection conn, RpcMessageHeader mes if (req.driftCompensation() != null) { DriftCompensationConfig driftCompensationConfig = this.api.server .getConfigManager() - .getVrConfig() - .getDriftCompensation(); + .getVrConfig().driftCompensation; driftCompensationConfig.setEnabled(req.driftCompensation().enabled()); driftCompensationConfig.setAmount(req.driftCompensation().amount()); driftCompensationConfig.setMaxResets(req.driftCompensation().maxResets()); @@ -136,8 +134,7 @@ public void onChangeSettingsRequest(GenericConnection conn, RpcMessageHeader mes if (req.oscRouter() != null) { OSCConfig oscRouterConfig = this.api.server .getConfigManager() - .getVrConfig() - .getOscRouter(); + .getVrConfig().oscRouter; if (oscRouterConfig != null) { OSCRouter oscRouter = this.api.server.getOSCRouter(); var osc = req.oscRouter().oscSettings(); @@ -155,8 +152,7 @@ public void onChangeSettingsRequest(GenericConnection conn, RpcMessageHeader mes if (req.vrcOsc() != null) { VRCOSCConfig vrcOSCConfig = this.api.server .getConfigManager() - .getVrConfig() - .getVrcOSC(); + .getVrConfig().vrcOSC; if (vrcOSCConfig != null) { VRCOSCHandler VRCOSCHandler = this.api.server.getVrcOSCHandler(); var osc = req.vrcOsc().oscSettings(); @@ -190,7 +186,7 @@ public void onChangeSettingsRequest(GenericConnection conn, RpcMessageHeader mes VMCConfig vmcConfig = this.api.server .getConfigManager() .getVrConfig() - .getVMC(); + .getVmc(); if (vmcConfig != null) { VMCHandler VMCHandler = this.api.server.getVMCHandler(); var osc = req.vmcOsc().oscSettings(); @@ -212,8 +208,7 @@ public void onChangeSettingsRequest(GenericConnection conn, RpcMessageHeader mes if (req.tapDetectionSettings() != null) { TapDetectionConfig tapDetectionConfig = this.api.server .getConfigManager() - .getVrConfig() - .getTapDetection(); + .getVrConfig().tapDetection; var tapDetectionSettings = req.tapDetectionSettings(); if (tapDetectionSettings != null) { @@ -257,7 +252,7 @@ public void onChangeSettingsRequest(GenericConnection conn, RpcMessageHeader mes var modelSettings = req.modelSettings(); if (modelSettings != null) { var hpm = this.api.server.humanPoseManager; - var legTweaksConfig = this.api.server.getConfigManager().getVrConfig().getLegTweaks(); + var legTweaksConfig = this.api.server.getConfigManager().getVrConfig().legTweaks; var toggles = modelSettings.toggles(); var ratios = modelSettings.ratios(); var legTweaks = modelSettings.legTweaks(); @@ -343,7 +338,7 @@ public void onChangeSettingsRequest(GenericConnection conn, RpcMessageHeader mes if (legTweaks != null) { if (legTweaks.hasCorrectionStrength()) { - legTweaksConfig.setCorrectionStrength(legTweaks.correctionStrength()); + legTweaksConfig.correctionStrength = legTweaks.correctionStrength(); } this.api.server.humanPoseManager.updateLegTweaksConfig(); } diff --git a/server/src/main/java/dev/slimevr/tracking/processor/HumanPoseManager.java b/server/src/main/java/dev/slimevr/tracking/processor/HumanPoseManager.java index 83a1dd041d..1d6996ab6a 100644 --- a/server/src/main/java/dev/slimevr/tracking/processor/HumanPoseManager.java +++ b/server/src/main/java/dev/slimevr/tracking/processor/HumanPoseManager.java @@ -756,10 +756,8 @@ public void setFloorClipEnabled(boolean value) { if (server != null) { server .getConfigManager() - .getVrConfig() - .getSkeleton() - .getToggles() - .put(SkeletonConfigToggles.FLOOR_CLIP.configKey, value); + .getVrConfig().skeleton.toggles + .put(SkeletonConfigToggles.FLOOR_CLIP.configKey, value); server.getConfigManager().saveConfig(); } } @@ -772,10 +770,8 @@ public void setSkatingCorrectionEnabled(boolean value) { if (server != null) { server .getConfigManager() - .getVrConfig() - .getSkeleton() - .getToggles() - .put(SkeletonConfigToggles.SKATING_CORRECTION.configKey, value); + .getVrConfig().skeleton.toggles + .put(SkeletonConfigToggles.SKATING_CORRECTION.configKey, value); server.getConfigManager().saveConfig(); } } diff --git a/server/src/main/java/dev/slimevr/tracking/processor/config/SkeletonConfigManager.java b/server/src/main/java/dev/slimevr/tracking/processor/config/SkeletonConfigManager.java index c329772d06..fa79bbd54e 100644 --- a/server/src/main/java/dev/slimevr/tracking/processor/config/SkeletonConfigManager.java +++ b/server/src/main/java/dev/slimevr/tracking/processor/config/SkeletonConfigManager.java @@ -373,10 +373,8 @@ public void resetToggles() { Main .getVrServer() .getConfigManager() - .getVrConfig() - .getSkeleton() - .getToggles() - .remove(value.configKey); + .getVrConfig().skeleton.toggles + .remove(value.configKey); // Set default in skeleton setToggle(value, value.defaultValue); } @@ -398,10 +396,8 @@ public void resetValues() { Main .getVrServer() .getConfigManager() - .getVrConfig() - .getSkeleton() - .getValues() - .remove(value.configKey); + .getVrConfig().skeleton.values + .remove(value.configKey); // Set default in skeleton setValue(value, value.defaultValue); } @@ -442,10 +438,10 @@ public void resetOffset(SkeletonConfigOffsets config) { } public void loadFromConfig(ConfigManager configManager) { - SkeletonConfig skeletonConfig = configManager.getVrConfig().getSkeleton(); + SkeletonConfig skeletonConfig = configManager.getVrConfig().skeleton; // Load offsets - Map offsets = skeletonConfig.getOffsets(); + Map offsets = skeletonConfig.offsets; for (SkeletonConfigOffsets configValue : SkeletonConfigOffsets.values) { Float val = offsets.get(configValue.configKey); if (val != null) { @@ -456,7 +452,7 @@ public void loadFromConfig(ConfigManager configManager) { } // Load toggles - Map toggles = skeletonConfig.getToggles(); + Map toggles = skeletonConfig.toggles; for (SkeletonConfigToggles configValue : SkeletonConfigToggles.values) { Boolean val = toggles.get(configValue.configKey); if (val != null) { @@ -467,7 +463,7 @@ public void loadFromConfig(ConfigManager configManager) { } // Load values - Map values = skeletonConfig.getValues(); + Map values = skeletonConfig.values; for (SkeletonConfigValues configValue : SkeletonConfigValues.values) { Float val = values.get(configValue.configKey); if (val != null) { @@ -487,24 +483,23 @@ public void save() { dev.slimevr.config.SkeletonConfig skeletonConfig = Main .getVrServer() .getConfigManager() - .getVrConfig() - .getSkeleton(); + .getVrConfig().skeleton; // Write all possible values to keep consistent even if defaults changed for (SkeletonConfigOffsets value : SkeletonConfigOffsets.values) { - skeletonConfig.getOffsets().put(value.configKey, getOffset(value)); + skeletonConfig.offsets.put(value.configKey, getOffset(value)); } // Only write changed values to keep using defaults if not changed for (SkeletonConfigToggles value : SkeletonConfigToggles.values) { if (changedToggles[value.id - 1]) - skeletonConfig.getToggles().put(value.configKey, getToggle(value)); + skeletonConfig.toggles.put(value.configKey, getToggle(value)); } // Only write changed values to keep using defaults if not changed for (SkeletonConfigValues value : SkeletonConfigValues.values) { if (changedValues[value.id - 1]) - skeletonConfig.getValues().put(value.configKey, getValue(value)); + skeletonConfig.values.put(value.configKey, getValue(value)); } } } diff --git a/server/src/main/java/dev/slimevr/tracking/processor/skeleton/HumanSkeleton.java b/server/src/main/java/dev/slimevr/tracking/processor/skeleton/HumanSkeleton.java index 09d4d98724..ed1cbe02e3 100644 --- a/server/src/main/java/dev/slimevr/tracking/processor/skeleton/HumanSkeleton.java +++ b/server/src/main/java/dev/slimevr/tracking/processor/skeleton/HumanSkeleton.java @@ -178,12 +178,12 @@ public HumanSkeleton( tapDetectionManager = new TapDetectionManager( this, humanPoseManager, - server.getConfigManager().getVrConfig().getTapDetection(), + server.getConfigManager().getVrConfig().tapDetection, server.getResetHandler(), server.getTapSetupHandler(), server.getAllTrackers() ); - legTweaks.setConfig(server.getConfigManager().getVrConfig().getLegTweaks()); + legTweaks.setConfig(server.getConfigManager().getVrConfig().legTweaks); } public HumanSkeleton( diff --git a/server/src/main/java/dev/slimevr/tracking/processor/skeleton/LegTweaks.java b/server/src/main/java/dev/slimevr/tracking/processor/skeleton/LegTweaks.java index 00678700f2..91ed06a92e 100644 --- a/server/src/main/java/dev/slimevr/tracking/processor/skeleton/LegTweaks.java +++ b/server/src/main/java/dev/slimevr/tracking/processor/skeleton/LegTweaks.java @@ -250,7 +250,7 @@ public void setConfig(LegTweaksConfig config) { } public void updateConfig() { - LegTweaks.updateHyperParameters(config.getCorrectionStrength()); + LegTweaks.updateHyperParameters(config.correctionStrength); floorclipEnabled = skeleton.humanPoseManager.getToggle(SkeletonConfigToggles.FLOOR_CLIP); skatingCorrectionEnabled = skeleton.humanPoseManager diff --git a/server/src/main/java/io/github/axisangles/ktmath/Quaternion.kt b/server/src/main/java/io/github/axisangles/ktmath/Quaternion.kt index be13fc4130..d76a4098ce 100644 --- a/server/src/main/java/io/github/axisangles/ktmath/Quaternion.kt +++ b/server/src/main/java/io/github/axisangles/ktmath/Quaternion.kt @@ -2,8 +2,10 @@ package io.github.axisangles.ktmath +import kotlinx.serialization.Serializable import kotlin.math.* +@Serializable data class Quaternion(val w: Float, val x: Float, val y: Float, val z: Float) { companion object { val NULL = Quaternion(0f, 0f, 0f, 0f)