diff --git a/server/src/main/java/dev/slimevr/autobone/AutoBone.kt b/server/src/main/java/dev/slimevr/autobone/AutoBone.kt index 38c87754c..668bf1bf7 100644 --- a/server/src/main/java/dev/slimevr/autobone/AutoBone.kt +++ b/server/src/main/java/dev/slimevr/autobone/AutoBone.kt @@ -13,7 +13,6 @@ import dev.slimevr.autobone.errors.PositionOffsetError import dev.slimevr.autobone.errors.SlideError import dev.slimevr.config.AutoBoneConfig import dev.slimevr.poserecorder.PoseFrameIO -import dev.slimevr.poserecorder.PoseFrameTracker import dev.slimevr.poserecorder.PoseFrames import dev.slimevr.tracking.processor.BoneType import dev.slimevr.tracking.processor.HumanPoseManager @@ -84,12 +83,12 @@ class AutoBone(server: VRServer) { init { config = server.configManager.vrConfig.autoBone this.server = server - reloadConfigValues() + loadConfigValues() } fun computeBoneOffset( - bone: BoneType?, - getOffset: Function, + bone: BoneType, + getOffset: Function, ): Float { return when (bone) { BoneType.HEAD -> getOffset.apply(SkeletonConfigOffsets.HEAD) @@ -114,18 +113,19 @@ class AutoBone(server: VRServer) { } } - fun reloadConfigValues(trackers: List? = null) { + private fun loadConfigValues() { // Remove all previous values offsets.clear() // Get current or default skeleton configs val skeleton = humanPoseManager - val getOffset: Function = + val getOffset: Function = if (skeleton != null) { - Function { key: SkeletonConfigOffsets? -> skeleton.getOffset(key) } + Function { key: SkeletonConfigOffsets -> skeleton.getOffset(key) } } else { - Function { config: SkeletonConfigOffsets? -> - SkeletonConfigManager(false).getOffset(config) + val defaultConfig = SkeletonConfigManager(false) + Function { config: SkeletonConfigOffsets -> + defaultConfig.getOffset(config) } } for (bone in adjustOffsets) { @@ -379,14 +379,23 @@ class AutoBone(server: VRServer) { val trackers1 = frames1.trackers val trackers2 = frames2.trackers - // Reload configs and detect chest tracker from the first frame - reloadConfigValues(trackers1) + // Load current values for adjustable configs + loadConfigValues() + val skeleton1 = HumanPoseManager( trackers1 ) val skeleton2 = HumanPoseManager( trackers2 ) + + // Load server configs into the skeleton + skeleton1.loadFromConfig(server.configManager) + skeleton2.loadFromConfig(server.configManager) + // Disable leg tweaks, this will mess with the resulting positions + skeleton1.setLegTweaksEnabled(false) + skeleton2.setLegTweaksEnabled(false) + val intermediateOffsets = EnumMap( offsets ) @@ -397,8 +406,6 @@ class AutoBone(server: VRServer) { frames, intermediateOffsets ) - skeleton1.setLegTweaksEnabled(false) - skeleton2.setLegTweaksEnabled(false) // If target height isn't specified, auto-detect if (targetHeight < 0f) { @@ -470,7 +477,8 @@ class AutoBone(server: VRServer) { .warning( "[AutoBone] Error value is invalid, resetting variables to recover" ) - reloadConfigValues(trackers1) + // Reset adjustable config values + loadConfigValues() // Reset error sum values errorStats.reset() diff --git a/server/src/main/java/dev/slimevr/posestreamer/PoseFrameStreamer.java b/server/src/main/java/dev/slimevr/posestreamer/PoseFrameStreamer.java index dffac9ecc..0df7299ed 100644 --- a/server/src/main/java/dev/slimevr/posestreamer/PoseFrameStreamer.java +++ b/server/src/main/java/dev/slimevr/posestreamer/PoseFrameStreamer.java @@ -1,5 +1,6 @@ package dev.slimevr.posestreamer; +import dev.slimevr.config.ConfigManager; import dev.slimevr.poserecorder.PoseFrameIO; import dev.slimevr.poserecorder.PoseFrames; import dev.slimevr.tracking.processor.HumanPoseManager; @@ -26,6 +27,11 @@ public class PoseFrameStreamer extends PoseStreamer { skeleton = humanPoseManager.getSkeleton(); } + public PoseFrameStreamer(PoseFrames frames, ConfigManager configManager) { + this(frames); + humanPoseManager.loadFromConfig(configManager); + } + public PoseFrames getFrames() { return frames; } 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 25cfa9bfe..042781e05 100644 --- a/server/src/main/java/dev/slimevr/tracking/processor/HumanPoseManager.java +++ b/server/src/main/java/dev/slimevr/tracking/processor/HumanPoseManager.java @@ -2,6 +2,7 @@ package dev.slimevr.tracking.processor; import com.jme3.math.Vector3f; import dev.slimevr.VRServer; +import dev.slimevr.config.ConfigManager; import dev.slimevr.tracking.processor.config.SkeletonConfigManager; import dev.slimevr.tracking.processor.config.SkeletonConfigOffsets; import dev.slimevr.tracking.processor.config.SkeletonConfigToggles; @@ -53,6 +54,8 @@ public class HumanPoseManager { public HumanPoseManager(List trackers) { this(); skeleton = new HumanSkeleton(this, trackers); + // Set default node offsets on the new skeleton + skeletonConfigManager.updateNodeOffsetsInSkeleton(); skeletonConfigManager.updateSettingsInSkeleton(); } @@ -70,6 +73,8 @@ public class HumanPoseManager { ) { this(); skeleton = new HumanSkeleton(this, trackers); + // Set default node offsets on the new skeleton + skeletonConfigManager.updateNodeOffsetsInSkeleton(); // Set offsetConfigs from given offsetConfigs on creation skeletonConfigManager.setOffsets(offsetConfigs); skeletonConfigManager.updateSettingsInSkeleton(); @@ -92,6 +97,8 @@ public class HumanPoseManager { ) { this(); skeleton = new HumanSkeleton(this, trackers); + // Set default node offsets on the new skeleton + skeletonConfigManager.updateNodeOffsetsInSkeleton(); // Set offsetConfigs from given offsetConfigs on creation if (altOffsetConfigs != null) { // Set alts first, so if there's any overlap it doesn't affect @@ -195,11 +202,18 @@ public class HumanPoseManager { ); } + public void loadFromConfig(ConfigManager configManager) { + skeletonConfigManager.loadFromConfig(configManager); + } + @VRServerThread public void updateSkeletonModelFromServer() { disconnectComputedHumanPoseTrackers(); skeleton = new HumanSkeleton(this, server); - skeletonConfigManager.loadFromConfig(server.getConfigManager()); + // This recomputes all node offsets, so the defaults don't need to be + // explicitly loaded into the skeleton (no need for + // `updateNodeOffsetsInSkeleton()`) + loadFromConfig(server.getConfigManager()); for (Consumer sc : onSkeletonUpdated) sc.accept(skeleton); } 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 67b14def4..703c0a84b 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 @@ -5,6 +5,7 @@ import dev.slimevr.Main; import dev.slimevr.autobone.errors.BodyProportionError; import dev.slimevr.autobone.errors.proportions.ProportionLimiter; import dev.slimevr.config.ConfigManager; +import dev.slimevr.config.SkeletonConfig; import dev.slimevr.tracking.processor.BoneType; import dev.slimevr.tracking.processor.HumanPoseManager; @@ -76,6 +77,17 @@ public class SkeletonConfigManager { } } + public void updateNodeOffsetsInSkeleton() { + if (humanPoseManager == null) + return; + + for (BoneType config : BoneType.values) { + Vector3f val = nodeOffsets.get(config); + if (val != null) + humanPoseManager.updateNodeOffset(config, val); + } + } + public void setOffset( SkeletonConfigOffsets config, Float newValue, @@ -430,13 +442,12 @@ public class SkeletonConfigManager { } public void loadFromConfig(ConfigManager configManager) { + SkeletonConfig skeletonConfig = configManager.getVrConfig().getSkeleton(); + // Load offsets + Map offsets = skeletonConfig.getOffsets(); for (SkeletonConfigOffsets configValue : SkeletonConfigOffsets.values) { - Float val = configManager - .getVrConfig() - .getSkeleton() - .getOffsets() - .get(configValue.configKey); + Float val = offsets.get(configValue.configKey); if (val != null) { // Do not recalculate the offsets, these are done in bulk at the // end @@ -445,12 +456,9 @@ public class SkeletonConfigManager { } // Load toggles + Map toggles = skeletonConfig.getToggles(); for (SkeletonConfigToggles configValue : SkeletonConfigToggles.values) { - Boolean val = configManager - .getVrConfig() - .getSkeleton() - .getToggles() - .get(configValue.configKey); + Boolean val = toggles.get(configValue.configKey); if (val != null) { setToggle(configValue, val); } else if (humanPoseManager != null) { @@ -459,12 +467,9 @@ public class SkeletonConfigManager { } // Load values + Map values = skeletonConfig.getValues(); for (SkeletonConfigValues configValue : SkeletonConfigValues.values) { - Float val = configManager - .getVrConfig() - .getSkeleton() - .getValues() - .get(configValue.configKey); + Float val = values.get(configValue.configKey); if (val != null) { setValue(configValue, val); } else if (humanPoseManager != null) {