Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions gui/src/components/commons/BodyPartIcon.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,8 @@ export const mapPart: Record<
<FingersIcon width={width} />
),
[BodyPart.RIGHT_LITTLE_DISTAL]: ({ width }) => <FingersIcon width={width} />,
[BodyPart.LEFT_HAND_INPUT]: ({ width }) => <FingersIcon width={width} />,
[BodyPart.RIGHT_HAND_INPUT]: ({ width }) => <FingersIcon width={width} />
};

export function BodyPartIcon({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ fun createVRCOSCSettings(
config.getOSCTrackerRole(TrackerRole.LEFT_ELBOW, false) &&
config.getOSCTrackerRole(TrackerRole.RIGHT_ELBOW, false),
config.getOSCTrackerRole(TrackerRole.LEFT_HAND, false) &&
config.getOSCTrackerRole(TrackerRole.RIGHT_HAND, false),
config.getOSCTrackerRole(TrackerRole.RIGHT_HAND, false)
)
VRCOSCSettings.startVRCOSCSettings(fbb)
VRCOSCSettings.addOscSettings(fbb, generalSettingOffset)
Expand Down Expand Up @@ -182,7 +182,7 @@ fun createSteamVRSettings(fbb: FlatBufferBuilder, bridge: ISteamVRBridge?): Int
bridge.getShareSetting(TrackerRole.LEFT_ELBOW),
bridge.getShareSetting(TrackerRole.RIGHT_ELBOW),
bridge.getShareSetting(TrackerRole.LEFT_HAND),
bridge.getShareSetting(TrackerRole.RIGHT_HAND),
bridge.getShareSetting(TrackerRole.RIGHT_HAND)
)
}
return steamvrTrackerSettings
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -300,7 +300,7 @@ class SkeletonConfigManager(
nodeOffset,
0f,
-getOffset(SkeletonConfigOffsets.HAND_Y),
-getOffset(SkeletonConfigOffsets.HAND_Z),
0f,
)

BoneType.LEFT_ELBOW_TRACKER, BoneType.RIGHT_ELBOW_TRACKER -> setNodeOffset(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,8 @@ class HumanSkeleton(
var rightUpperArmTracker: Tracker? = null
var leftHandTracker: Tracker? = null
var rightHandTracker: Tracker? = null
var leftHandInput: Tracker? = null
var rightHandInput: Tracker? = null
var leftShoulderTracker: Tracker? = null
var rightShoulderTracker: Tracker? = null
var leftThumbMetacarpalTracker: Tracker? = null
Expand Down Expand Up @@ -396,6 +398,8 @@ class HumanSkeleton(
rightUpperArmTracker = getTrackerForSkeleton(trackers, TrackerPosition.RIGHT_UPPER_ARM)
leftHandTracker = getTrackerForSkeleton(trackers, TrackerPosition.LEFT_HAND)
rightHandTracker = getTrackerForSkeleton(trackers, TrackerPosition.RIGHT_HAND)
leftHandInput = getTrackerForSkeleton(trackers, TrackerPosition.LEFT_HAND_INPUT)
rightHandInput = getTrackerForSkeleton(trackers, TrackerPosition.RIGHT_HAND_INPUT)
leftShoulderTracker = getTrackerForSkeleton(trackers, TrackerPosition.LEFT_SHOULDER)
rightShoulderTracker = getTrackerForSkeleton(trackers, TrackerPosition.RIGHT_SHOULDER)

Expand Down Expand Up @@ -1162,15 +1166,30 @@ class HumanSkeleton(
updateComputedTracker(computedRightFootTracker, rightFootTrackerBone)
updateComputedTracker(computedLeftElbowTracker, leftElbowTrackerBone)
updateComputedTracker(computedRightElbowTracker, rightElbowTrackerBone)
updateComputedTracker(computedLeftHandTracker, leftHandTrackerBone)
updateComputedTracker(computedRightHandTracker, rightHandTrackerBone)

// For hand inputs, check and see whether we have a device dedicated to just controller input, otherwise assume hand trackers have their own inputs.
var leftInput = if (leftHandInput != null) leftHandInput else if(leftHandTracker != null && leftHandTracker!!.hasControls) leftHandTracker else leftLowerArmTracker
var rightInput = if (rightHandInput != null) rightHandInput else if(rightHandTracker != null && rightHandTracker!!.hasControls) rightHandTracker else rightLowerArmTracker
updateComputedTracker(computedLeftHandTracker, leftHandTrackerBone,leftInput)
updateComputedTracker(computedRightHandTracker, rightHandTrackerBone, rightInput)
}

private fun updateComputedTracker(computedTracker: Tracker?, trackerBone: Bone) {
private fun updateComputedTracker(computedTracker: Tracker?, trackerBone: Bone, originalTracker: Tracker? = null) {
computedTracker?.let {
it.position = trackerBone.getTailPosition()
it.setRotation(trackerBone.getGlobalRotation() * trackerBone.rotationOffset.inv())
it.dataTick()
if(originalTracker != null) {
it.setButton1(originalTracker.getButton1())
it.setButton2(originalTracker.getButton2())
it.setMenuRecenterButton(originalTracker.getMenuRecenterButton())
it.setStickClickButton(originalTracker.getStickClickButton());
it.setTrackpadClickButton(originalTracker.getTrackpadClickButton());
it.setThumbstick(originalTracker.getThumbstick());
it.setTrigger(originalTracker.getTrigger());
it.setGrip(originalTracker.getGrip());
it.hasControls = originalTracker.hasControls;
it.dataTick()
}
}
}

Expand Down
133 changes: 129 additions & 4 deletions server/core/src/main/java/dev/slimevr/tracking/trackers/Tracker.kt
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ class Tracker @JvmOverloads constructor(
trackerNum: Int? = null,
val hasPosition: Boolean = false,
val hasRotation: Boolean = false,
var hasControls: Boolean = false,
val hasAcceleration: Boolean = false,
/**
* User can change TrackerPosition, mounting...
Expand Down Expand Up @@ -97,7 +98,6 @@ class Tracker @JvmOverloads constructor(
* NOT the same as hasRotation (other data types emulate rotation)
*/
val trackerDataType: TrackerDataType = TrackerDataType.ROTATION,

/**
* Set status when tracker is sleeping
*/
Expand All @@ -110,8 +110,7 @@ class Tracker @JvmOverloads constructor(

// IMU: +z forward, +x left, +y up
// SlimeVR: +z backward, +x right, +y up
private var _acceleration = Vector3.NULL
private var _magVector = Vector3.NULL

var position = Vector3.NULL
val resetsHandler: TrackerResetsHandler = TrackerResetsHandler(this)
val filteringHandler: TrackerFilteringHandler = TrackerFilteringHandler()
Expand All @@ -128,6 +127,17 @@ class Tracker @JvmOverloads constructor(
var packetLoss: Float? = null
var customName: String? = null
var magStatus: MagnetometerStatus = magStatus
private var _acceleration = Vector3.NULL
private var _magVector = Vector3.NULL
private var _analogueThumbstick = Vector3.NULL
private var _analogueTrackpad = Vector3.NULL
private var _button1 = false
private var _button2 = false
private var _menuRecenterButton = false
private var _stickClickButton = false
private var _trackpadClickButton = false
private var _trigger = 0f
private var _grip = 0f
private set

/**
Expand Down Expand Up @@ -466,10 +476,125 @@ class Tracker @JvmOverloads constructor(
fun resetFilteringQuats(reference: Quaternion) {
filteringHandler.resetMovingAverage(getAdjustedRotation(), reference)
}
/**
* Sets the first button of the tracker.
*/
fun setButton1(button1: Boolean) {
this.hasControls = true;
this._button1 = button1
}
/**
* Gets the first button of the tracker.
*/
fun getButton1(): Boolean {
return this._button1
}
/**
* Sets the second button of the tracker.
*/
fun setButton2(button2: Boolean) {
this.hasControls = true;
this._button2 = button2
}
/**
* Gets the second button of the tracker.
*/
fun getButton2(): Boolean {
this.hasControls = true;
return this._button2
}
/**
* Sets the menu/recenter button of the tracker.
*/
fun setMenuRecenterButton(menuRecenterButton: Boolean) {
this.hasControls = true;
this._menuRecenterButton = menuRecenterButton
}
/**
* Gets the menu/recenter button of the tracker.
*/
fun getMenuRecenterButton(): Boolean {
return this._menuRecenterButton
}

/**
* Sets time in future if a tracker is expected to sleep
* Sets the stick click button of the tracker.
*/
fun setStickClickButton(stickClickButton: Boolean) {
this.hasControls = true;
this._stickClickButton = stickClickButton
}
/**
* Gets the stick click button of the tracker.
*/
fun getStickClickButton(): Boolean {
return this._stickClickButton
}
/**
* Sets the stick click button of the tracker.
*/
fun setTrackpadClickButton(trackpadClickButton: Boolean) {
this.hasControls = true;
this._trackpadClickButton = trackpadClickButton
}
/**
* Gets the stick click button of the tracker.
*/
fun getTrackpadClickButton(): Boolean {
return this._trackpadClickButton
}
/**
* Sets the grip of the tracker.
*/
fun setGrip(grip: Float) {
this._grip = grip
this.hasControls = true;
}
/**
* Gets the grip of the tracker.
*/
fun getGrip(): Float {
return this._grip
}
/**
* Sets the grip of the tracker.
*/
fun setTrigger(trigger: Float) {
this.hasControls = true;
this._trigger = trigger
}
/**
* Gets the grip of the tracker.
*/
fun getTrigger(): Float {
return this._trigger
}
/**
* Sets the thumbstick the tracker.
*/
fun setThumbstick(analogueThumbstick: Vector3) {
this.hasControls = true;
this._analogueThumbstick = analogueThumbstick
}
/**
* Gets the thumbstick of the tracker.
*/
fun getThumbstick(): Vector3 {
return this._analogueThumbstick
}
/**
* Sets the trackpad of the tracker.
*/
fun setTrackpad(analogueTrackpad: Vector3) {
this.hasControls = true;
this._analogueTrackpad = analogueTrackpad
}
/**
* Gets the trackpad of the tracker.
*/
fun getTrackpad(): Vector3 {
return this._analogueTrackpad
}
fun setSleepTime(time: Long) {
this.timeScheduledSleep = time
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,8 @@ enum class TrackerPosition(
RIGHT_LITTLE_PROXIMAL("body:right_little_proximal", null, BodyPart.RIGHT_LITTLE_PROXIMAL, 48),
RIGHT_LITTLE_INTERMEDIATE("body:right_little_intermediate", null, BodyPart.RIGHT_LITTLE_INTERMEDIATE, 49),
RIGHT_LITTLE_DISTAL("body:right_little_distal", null, BodyPart.RIGHT_LITTLE_DISTAL, 50),
LEFT_HAND_INPUT("body:left_hand_input", TrackerRole.LEFT_HAND_INPUT, BodyPart.LEFT_HAND_INPUT, 70),
RIGHT_HAND_INPUT("body:right_hand_input", TrackerRole.RIGHT_HAND_INPUT, BodyPart.RIGHT_HAND_INPUT, 71)
;

/**
Expand Down Expand Up @@ -197,7 +199,7 @@ enum class TrackerPosition(

companion object {
/** Indexed by `BodyPart` int value. EFFICIENCY FTW */
private val byBodyPart: Array<out TrackerPosition?> = arrayOfNulls<TrackerPosition>(BodyPart.names.size).apply {
private val byBodyPart: Array<out TrackerPosition?> = arrayOfNulls<TrackerPosition>(entries.maxOf { it.bodyPart } + 1).apply {
for (position in entries) {
this[position.bodyPart] = position
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ enum class TrackerRole(val id: Int, val roleHint: String, val viveRole: String)
HMD(19, "", ""),
BEACON(20, "", ""),
GENERIC_CONTROLLER(21, "vive_tracker_handed", "TrackerRole_Handed"),
LEFT_HAND_INPUT(30, "vive_tracker_handed", "TrackerRole_Handed"),
RIGHT_HAND_INPUT(31, "vive_tracker_handed", "TrackerRole_Handed"),
;

companion object {
Expand Down
Loading