Fix skeleton config loading (#635)

This commit is contained in:
Butterscotch!
2023-03-25 17:39:49 -04:00
committed by GitHub
parent f64c72f1d8
commit 56d47996f0
4 changed files with 63 additions and 30 deletions

View File

@@ -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()

View File

@@ -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;
}

View File

@@ -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);
}

View File

@@ -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) {