mirror of
https://github.com/SlimeVR/SlimeVR-Server.git
synced 2026-04-06 02:01:58 +02:00
Fix skeleton config loading (#635)
This commit is contained in:
@@ -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<SkeletonConfigOffsets?, Float>,
|
||||
bone: BoneType,
|
||||
getOffset: Function<SkeletonConfigOffsets, Float>,
|
||||
): Float {
|
||||
return when (bone) {
|
||||
BoneType.HEAD -> getOffset.apply(SkeletonConfigOffsets.HEAD)
|
||||
@@ -114,18 +113,19 @@ class AutoBone(server: VRServer) {
|
||||
}
|
||||
}
|
||||
|
||||
fun reloadConfigValues(trackers: List<PoseFrameTracker?>? = null) {
|
||||
private fun loadConfigValues() {
|
||||
// Remove all previous values
|
||||
offsets.clear()
|
||||
|
||||
// Get current or default skeleton configs
|
||||
val skeleton = humanPoseManager
|
||||
val getOffset: Function<SkeletonConfigOffsets?, Float> =
|
||||
val getOffset: Function<SkeletonConfigOffsets, Float> =
|
||||
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()
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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<? extends Tracker> 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<HumanSkeleton> sc : onSkeletonUpdated)
|
||||
sc.accept(skeleton);
|
||||
}
|
||||
|
||||
@@ -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<String, Float> 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<String, Boolean> 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<String, Float> 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) {
|
||||
|
||||
Reference in New Issue
Block a user