Update all gradle dependencies we have (#1173)

This commit is contained in:
Uriel
2024-10-10 14:58:13 +02:00
committed by GitHub
parent a2d842d8cc
commit 066760bf79
18 changed files with 113 additions and 73 deletions

View File

@@ -13,8 +13,8 @@ android.useAndroidX=true
android.nonTransitiveRClass=true android.nonTransitiveRClass=true
org.gradle.unsafe.configuration-cache=false org.gradle.unsafe.configuration-cache=false
kotlinVersion=1.9.23 kotlinVersion=2.0.20
spotlessVersion=6.25.0 spotlessVersion=6.25.0
shadowJarVersion=8.1.1 shadowJarVersion=8.3.2
buildconfigVersion=5.3.5 buildconfigVersion=5.5.0
grgitVersion=5.2.2 grgitVersion=5.2.2

View File

@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.1-bin.zip
networkTimeout=10000 networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

View File

@@ -5,6 +5,7 @@
* For more details take a look at the Java Libraries chapter in the Gradle * For more details take a look at the Java Libraries chapter in the Gradle
* User Manual available at https://docs.gradle.org/6.3/userguide/java_library_plugin.html * User Manual available at https://docs.gradle.org/6.3/userguide/java_library_plugin.html
*/ */
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins { plugins {
@@ -12,7 +13,7 @@ plugins {
kotlin("plugin.serialization") kotlin("plugin.serialization")
id("com.github.gmazzo.buildconfig") id("com.github.gmazzo.buildconfig")
id("com.android.application") version "8.0.2" id("com.android.application") version "8.6.1"
id("org.ajoberstar.grgit") id("org.ajoberstar.grgit")
} }
@@ -39,8 +40,10 @@ tasks.preBuild {
} }
tasks.withType<KotlinCompile> { tasks.withType<KotlinCompile> {
kotlinOptions.jvmTarget = "17" compilerOptions {
kotlinOptions.freeCompilerArgs += "-Xvalue-classes" jvmTarget.set(JvmTarget.JVM_17)
freeCompilerArgs.set(listOf("-Xvalue-classes"))
}
} }
// Set compiler to use UTF-8 // Set compiler to use UTF-8
@@ -65,21 +68,21 @@ allprojects {
dependencies { dependencies {
implementation(project(":server:core")) implementation(project(":server:core"))
implementation("commons-cli:commons-cli:1.5.0") implementation("commons-cli:commons-cli:1.8.0")
implementation("org.apache.commons:commons-lang3:3.12.0") implementation("org.apache.commons:commons-lang3:3.15.0")
// Android stuff // Android stuff
implementation("androidx.appcompat:appcompat:1.6.1") implementation("androidx.appcompat:appcompat:1.7.0")
implementation("androidx.core:core-ktx:1.10.1") implementation("androidx.core:core-ktx:1.13.1")
implementation("com.google.android.material:material:1.9.0") implementation("com.google.android.material:material:1.12.0")
implementation("androidx.constraintlayout:constraintlayout:2.1.4") implementation("androidx.constraintlayout:constraintlayout:2.1.4")
implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar")))) implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))
androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.ext:junit:1.2.1")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1")
// For hosting web GUI // For hosting web GUI
implementation("io.ktor:ktor-server-core:2.3.0") implementation("io.ktor:ktor-server-core:2.3.12")
implementation("io.ktor:ktor-server-netty:2.3.0") implementation("io.ktor:ktor-server-netty:2.3.10")
implementation("io.ktor:ktor-server-caching-headers:2.3.0") implementation("io.ktor:ktor-server-caching-headers:2.3.12")
// Serial // Serial
implementation("com.github.mik3y:usb-serial-for-android:3.7.0") implementation("com.github.mik3y:usb-serial-for-android:3.7.0")
@@ -99,7 +102,7 @@ android {
compile your app. This means your app can use the API features included in compile your app. This means your app can use the API features included in
this API level and lower. */ this API level and lower. */
compileSdk = 33 compileSdk = 35
/* The defaultConfig block encapsulates default settings and entries for all /* The defaultConfig block encapsulates default settings and entries for all
build variants and can override some attributes in main/AndroidManifest.xml build variants and can override some attributes in main/AndroidManifest.xml
@@ -119,7 +122,7 @@ android {
minSdk = 26 minSdk = 26
// Specifies the API level used to test the app. // Specifies the API level used to test the app.
targetSdk = 33 targetSdk = 35
// Defines the version number of your app. // Defines the version number of your app.
versionCode = extra["gitVersionCode"] as? Int versionCode = extra["gitVersionCode"] as? Int

View File

@@ -6,6 +6,7 @@
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE" />
<application <application
android:allowBackup="true" android:allowBackup="true"
@@ -16,7 +17,7 @@
android:roundIcon="@mipmap/ic_launcher_round" android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/Theme.SlimeVR" android:theme="@style/Theme.SlimeVR"
tools:targetApi="33" tools:targetApi="35"
android:usesCleartextTraffic="true"> android:usesCleartextTraffic="true">
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
@@ -31,6 +32,7 @@
<service <service
android:name=".ForegroundService" android:name=".ForegroundService"
android:enabled="true" android:enabled="true"
android:foregroundServiceType="connectedDevice"
android:exported="false" /> android:exported="false" />
</application> </application>

View File

@@ -1,12 +1,15 @@
package dev.slimevr.android package dev.slimevr.android
import android.app.Notification import android.app.*
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.Service
import android.content.Intent import android.content.Intent
import android.content.pm.ServiceInfo
import android.os.Build
import android.os.IBinder import android.os.IBinder
import androidx.core.app.NotificationChannelCompat
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import androidx.core.app.ServiceCompat
import io.eiren.util.logging.LogManager
/** /**
* ForegroundService helps to keep the SlimeVR Server on Android from being killed. * ForegroundService helps to keep the SlimeVR Server on Android from being killed.
@@ -35,9 +38,26 @@ class ForegroundService : Service() {
} }
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
val notification = createNotification() try {
startForeground(NOTIFICATION_ID, notification) val notification = createNotification()
ServiceCompat.startForeground(
this,
NOTIFICATION_ID, // Cannot be 0
notification,
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
ServiceInfo.FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE
} else {
0
},
)
} catch (e: Exception) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S &&
e is ForegroundServiceStartNotAllowedException
) {
LogManager.severe("Tried to start foreground service when not allowed:", e)
}
// ...
}
/* /*
* Currently being a foreground process should be enough to keep the server running. * Currently being a foreground process should be enough to keep the server running.
* If it turns out to not be enough then the next option would be to return sticky here * If it turns out to not be enough then the next option would be to return sticky here
@@ -51,13 +71,12 @@ class ForegroundService : Service() {
override fun onBind(intent: Intent?): IBinder? = null override fun onBind(intent: Intent?): IBinder? = null
private fun createNotificationChannel() { private fun createNotificationChannel() {
val serviceChannel = NotificationChannel( val serviceChannel = NotificationChannelCompat.Builder(CHANNEL_ID, NotificationManager.IMPORTANCE_LOW)
CHANNEL_ID, .setName("SlimeVR Foreground Service Channel")
"SlimeVR Foreground Service Channel", .build()
NotificationManager.IMPORTANCE_LOW, NotificationManagerCompat
) .from(this)
val manager = getSystemService(NotificationManager::class.java) .createNotificationChannel(serviceChannel)
manager.createNotificationChannel(serviceChannel)
} }
private fun createNotification(): Notification = NotificationCompat.Builder(this, CHANNEL_ID) private fun createNotification(): Notification = NotificationCompat.Builder(this, CHANNEL_ID)

View File

@@ -37,7 +37,7 @@ configure<com.diffplug.gradle.spotless.SpotlessExtension> {
"java.util.*,kotlin.math.*,dev.slimevr.autobone.errors.*" + "java.util.*,kotlin.math.*,dev.slimevr.autobone.errors.*" +
",io.github.axisangles.ktmath.*,kotlinx.atomicfu.*" + ",io.github.axisangles.ktmath.*,kotlinx.atomicfu.*" +
",dev.slimevr.tracking.trackers.*,dev.slimevr.desktop.platform.ProtobufMessages.*" + ",dev.slimevr.tracking.trackers.*,dev.slimevr.desktop.platform.ProtobufMessages.*" +
",com.illposed.osc.*", ",com.illposed.osc.*,android.app.*",
"ij_kotlin_allow_trailing_comma" to true, "ij_kotlin_allow_trailing_comma" to true,
) )
val ktlintVersion = "1.2.1" val ktlintVersion = "1.2.1"

View File

@@ -5,6 +5,7 @@
* For more details take a look at the Java Libraries chapter in the Gradle * For more details take a look at the Java Libraries chapter in the Gradle
* User Manual available at https://docs.gradle.org/6.3/userguide/java_library_plugin.html * User Manual available at https://docs.gradle.org/6.3/userguide/java_library_plugin.html
*/ */
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins { plugins {
@@ -25,8 +26,10 @@ java {
} }
} }
tasks.withType<KotlinCompile> { tasks.withType<KotlinCompile> {
kotlinOptions.jvmTarget = "17" compilerOptions {
kotlinOptions.freeCompilerArgs += "-Xvalue-classes" jvmTarget.set(JvmTarget.JVM_17)
freeCompilerArgs.set(listOf("-Xvalue-classes"))
}
} }
// Set compiler to use UTF-8 // Set compiler to use UTF-8
@@ -60,26 +63,26 @@ dependencies {
// This dependency is used internally, // This dependency is used internally,
// and not exposed to consumers on their own compile classpath. // and not exposed to consumers on their own compile classpath.
implementation("com.google.flatbuffers:flatbuffers-java:22.10.26") implementation("com.google.flatbuffers:flatbuffers-java:22.10.26")
implementation("commons-cli:commons-cli:1.5.0") implementation("commons-cli:commons-cli:1.8.0")
implementation("com.fasterxml.jackson.core:jackson-databind:2.15.1") implementation("com.fasterxml.jackson.core:jackson-databind:2.15.1")
implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.15.1") implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.15.1")
implementation("com.github.jonpeterson:jackson-module-model-versioning:1.2.2") implementation("com.github.jonpeterson:jackson-module-model-versioning:1.2.2")
implementation("org.apache.commons:commons-math3:3.6.1") implementation("org.apache.commons:commons-math3:3.6.1")
implementation("org.apache.commons:commons-lang3:3.12.0") implementation("org.apache.commons:commons-lang3:3.15.0")
implementation("org.apache.commons:commons-collections4:4.4") implementation("org.apache.commons:commons-collections4:4.4")
implementation("com.illposed.osc:javaosc-core:0.8") implementation("com.illposed.osc:javaosc-core:0.8")
implementation("org.java-websocket:Java-WebSocket:1.+") implementation("org.java-websocket:Java-WebSocket:1.+")
implementation("com.melloware:jintellitype:1.+") implementation("com.melloware:jintellitype:1.+")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3") implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3")
// Jitpack // Jitpack
implementation("com.github.SlimeVR:oscquery-kt:566a0cba58") implementation("com.github.SlimeVR:oscquery-kt:566a0cba58")
testImplementation(kotlin("test")) testImplementation(kotlin("test"))
// Use JUnit test framework // Use JUnit test framework
testImplementation(platform("org.junit:junit-bom:5.9.0")) testImplementation(platform("org.junit:junit-bom:5.10.3"))
testImplementation("org.junit.jupiter:junit-jupiter") testImplementation("org.junit.jupiter:junit-jupiter")
testImplementation("org.junit.platform:junit-platform-launcher") testImplementation("org.junit.platform:junit-platform-launcher")
} }

View File

@@ -35,7 +35,7 @@ class QuaternionMovingAverage(
// GUI should clamp it from 0.01 (1%) or 0.1 (10%) // GUI should clamp it from 0.01 (1%) or 0.1 (10%)
// to 1 (100%). // to 1 (100%).
amount = amount.coerceAtLeast(0f) amount = amount.coerceAtLeast(0f)
if (type === TrackerFilters.SMOOTHING) { if (type == TrackerFilters.SMOOTHING) {
// lower smoothFactor = more smoothing // lower smoothFactor = more smoothing
smoothFactor = SMOOTH_MULTIPLIER * (1 - amount.coerceAtMost(1f)) + SMOOTH_MIN smoothFactor = SMOOTH_MULTIPLIER * (1 - amount.coerceAtMost(1f)) + SMOOTH_MIN
// Totally a hack // Totally a hack
@@ -43,7 +43,7 @@ class QuaternionMovingAverage(
smoothFactor /= amount smoothFactor /= amount
} }
} }
if (type === TrackerFilters.PREDICTION) { if (type == TrackerFilters.PREDICTION) {
// higher predictFactor = more prediction // higher predictFactor = more prediction
predictFactor = PREDICT_MULTIPLIER * amount + PREDICT_MIN predictFactor = PREDICT_MULTIPLIER * amount + PREDICT_MIN
rotBuffer = CircularArrayList(PREDICT_BUFFER) rotBuffer = CircularArrayList(PREDICT_BUFFER)
@@ -95,7 +95,7 @@ class QuaternionMovingAverage(
@Synchronized @Synchronized
fun addQuaternion(q: Quaternion) { fun addQuaternion(q: Quaternion) {
if (type === TrackerFilters.PREDICTION) { if (type == TrackerFilters.PREDICTION) {
if (rotBuffer.size == rotBuffer.capacity()) { if (rotBuffer.size == rotBuffer.capacity()) {
rotBuffer.removeLast() rotBuffer.removeLast()
} }

View File

@@ -102,7 +102,7 @@ class UnityArmature(localRot: Boolean) {
fun setLocalRotationForBone(unityBone: UnityBone, localRot: Quaternion) { fun setLocalRotationForBone(unityBone: UnityBone, localRot: Quaternion) {
val node = getHeadNodeOfBone(unityBone) val node = getHeadNodeOfBone(unityBone)
if (node != null) { if (node != null) {
if (unityBone === UnityBone.HIPS) { if (unityBone == UnityBone.HIPS) {
node.worldTransform.rotation = localRot node.worldTransform.rotation = localRot
} else { } else {
node.localTransform.rotation = when (unityBone) { node.localTransform.rotation = when (unityBone) {
@@ -117,7 +117,7 @@ class UnityArmature(localRot: Boolean) {
fun getGlobalTranslationForBone(unityBone: UnityBone): Vector3 { fun getGlobalTranslationForBone(unityBone: UnityBone): Vector3 {
val node = getHeadNodeOfBone(unityBone) val node = getHeadNodeOfBone(unityBone)
return if (node != null) { return if (node != null) {
if (unityBone === UnityBone.HIPS) { if (unityBone == UnityBone.HIPS) {
val hipsAverage = ( val hipsAverage = (
leftHipNode.worldTransform.translation + leftHipNode.worldTransform.translation +
rightHipNode.worldTransform.translation rightHipNode.worldTransform.translation
@@ -134,7 +134,7 @@ class UnityArmature(localRot: Boolean) {
fun getLocalTranslationForBone(unityBone: UnityBone): Vector3 { fun getLocalTranslationForBone(unityBone: UnityBone): Vector3 {
val node = getHeadNodeOfBone(unityBone) val node = getHeadNodeOfBone(unityBone)
return if (node != null) { return if (node != null) {
if (unityBone === UnityBone.HIPS) { if (unityBone == UnityBone.HIPS) {
val hipsAverage = ( val hipsAverage = (
leftHipNode.worldTransform.translation + leftHipNode.worldTransform.translation +
rightHipNode.worldTransform.translation rightHipNode.worldTransform.translation
@@ -160,7 +160,7 @@ class UnityArmature(localRot: Boolean) {
fun getLocalRotationForBone(unityBone: UnityBone): Quaternion { fun getLocalRotationForBone(unityBone: UnityBone): Quaternion {
val node = getHeadNodeOfBone(unityBone) val node = getHeadNodeOfBone(unityBone)
return if (node != null) { return if (node != null) {
if (unityBone === UnityBone.HIPS) { if (unityBone == UnityBone.HIPS) {
node.worldTransform.rotation * rootRotation node.worldTransform.rotation * rootRotation
} else { } else {
node.parent!!.worldTransform.rotation.inv() * node.worldTransform.rotation node.parent!!.worldTransform.rotation.inv() * node.worldTransform.rotation

View File

@@ -169,7 +169,7 @@ class VMCHandler(
try { try {
val addr = InetAddress.getByName(ip) val addr = InetAddress.getByName(ip)
oscSender = OSCPortOut(InetSocketAddress(addr, portOut)) oscSender = OSCPortOut(InetSocketAddress(addr, portOut))
if ((lastPortOut != portOut && lastAddress !== addr) || !wasConnected) { if ((lastPortOut != portOut && lastAddress != addr) || !wasConnected) {
LogManager LogManager
.info( .info(
"[VMCHandler] Sending to port $portOut at address $ip", "[VMCHandler] Sending to port $portOut at address $ip",

View File

@@ -80,7 +80,7 @@ class VRCOSCHandler(
override fun refreshSettings(refreshRouterSettings: Boolean) { override fun refreshSettings(refreshRouterSettings: Boolean) {
// Sets which trackers are enabled and force head and hands to false // Sets which trackers are enabled and force head and hands to false
for (i in computedTrackers.indices) { for (i in computedTrackers.indices) {
if (computedTrackers[i].trackerPosition !== TrackerPosition.HEAD || computedTrackers[i].trackerPosition !== TrackerPosition.LEFT_HAND || computedTrackers[i].trackerPosition !== TrackerPosition.RIGHT_HAND) { if (computedTrackers[i].trackerPosition != TrackerPosition.HEAD || computedTrackers[i].trackerPosition != TrackerPosition.LEFT_HAND || computedTrackers[i].trackerPosition != TrackerPosition.RIGHT_HAND) {
trackersEnabled[i] = config trackersEnabled[i] = config
.getOSCTrackerRole( .getOSCTrackerRole(
computedTrackers[i].trackerPosition!!.trackerRole!!, computedTrackers[i].trackerPosition!!.trackerRole!!,
@@ -199,7 +199,7 @@ class VRCOSCHandler(
try { try {
val addr = InetAddress.getByName(ip) val addr = InetAddress.getByName(ip)
oscSender = OSCPortOut(InetSocketAddress(addr, portOut)) oscSender = OSCPortOut(InetSocketAddress(addr, portOut))
if (oscPortOut != portOut && oscIp !== addr || !wasConnected) { if (oscPortOut != portOut && oscIp != addr || !wasConnected) {
LogManager.info("[VRCOSCHandler] Sending to port $portOut at address $ip") LogManager.info("[VRCOSCHandler] Sending to port $portOut at address $ip")
} }
oscPortOut = portOut oscPortOut = portOut
@@ -463,7 +463,7 @@ class VRCOSCHandler(
), ),
) )
} }
if (computedTrackers[i].trackerPosition === TrackerPosition.HEAD) { if (computedTrackers[i].trackerPosition == TrackerPosition.HEAD) {
// Send HMD position // Send HMD position
val (x, y, z) = computedTrackers[i].position val (x, y, z) = computedTrackers[i].position
oscArgs.clear() oscArgs.clear()

View File

@@ -111,7 +111,7 @@ class SkeletonConfigManager(
fun setToggle(config: SkeletonConfigToggles, newValue: Boolean?) { fun setToggle(config: SkeletonConfigToggles, newValue: Boolean?) {
if (newValue != null) { if (newValue != null) {
if (configToggles[config] != null && (newValue !== configToggles[config])) { if (configToggles[config] != null && (newValue != configToggles[config])) {
changedToggles[config.id - 1] = true changedToggles[config.id - 1] = true
} }
configToggles[config] = newValue configToggles[config] = newValue

View File

@@ -210,7 +210,7 @@ class Localizer(humanSkeleton: HumanSkeleton) {
// update the target position of the foot // update the target position of the foot
private fun updateTargetPos(loc: Vector3, foot: MovementStates) { private fun updateTargetPos(loc: Vector3, foot: MovementStates) {
if (foot == plantedFoot) { if (foot == plantedFoot) {
if (worldReference === MovementStates.FOLLOW_COM) { if (worldReference == MovementStates.FOLLOW_COM) {
targetFoot = loc targetFoot = loc
} }
} else { } else {
@@ -255,16 +255,16 @@ class Localizer(humanSkeleton: HumanSkeleton) {
// update how long the COM has been the reference and how long the foot // update how long the COM has been the reference and how long the foot
// has been // has been
comFrames = if (worldReference === MovementStates.FOLLOW_COM) comFrames + 1 else 0 comFrames = if (worldReference == MovementStates.FOLLOW_COM) comFrames + 1 else 0
footFrames = if (worldReference === MovementStates.FOLLOW_FOOT) footFrames + 1 else 0 footFrames = if (worldReference == MovementStates.FOLLOW_FOOT) footFrames + 1 else 0
sittingFrames = if (worldReference === MovementStates.FOLLOW_SITTING) sittingFrames + 1 else 0 sittingFrames = if (worldReference == MovementStates.FOLLOW_SITTING) sittingFrames + 1 else 0
} }
// gets the position the COM should be at based on the velocity of the com and // gets the position the COM should be at based on the velocity of the com and
// the location of the floor // the location of the floor
private fun updateTargetCOM() { private fun updateTargetCOM() {
// if not in COM tracking mode, just use the current COM // if not in COM tracking mode, just use the current COM
if (worldReference === MovementStates.FOLLOW_FOOT || worldReference === MovementStates.FOLLOW_SITTING) { if (worldReference == MovementStates.FOLLOW_FOOT || worldReference == MovementStates.FOLLOW_SITTING) {
targetCOM = bufCur.centerOfMass targetCOM = bufCur.centerOfMass
} else { } else {
currentCOM = targetCOM currentCOM = targetCOM
@@ -293,7 +293,7 @@ class Localizer(humanSkeleton: HumanSkeleton) {
val comPosStart: Vector3 = buf.centerOfMass val comPosStart: Vector3 = buf.centerOfMass
// get the buffer that occurred VELOCITY_SAMPLE_RATE ago in time // get the buffer that occurred VELOCITY_SAMPLE_RATE ago in time
while (buf.timeOfFrame > timeEnd && buf.parent !== null) { while (buf.timeOfFrame > timeEnd && buf.parent != null) {
buf = buf.parent!! buf = buf.parent!!
} }

View File

@@ -73,7 +73,7 @@ class TapDetection {
accelList.add(listval) accelList.add(listval)
// remove old values from the list (if they are too old) // remove old values from the list (if they are too old)
while (time - accelList.first[1] > CLUMP_TIME_NS) { while (time - accelList.first()[1] > CLUMP_TIME_NS) {
accelList.removeFirst() accelList.removeFirst()
} }
@@ -93,7 +93,7 @@ class TapDetection {
// remove old taps from the list (if they are too old) // remove old taps from the list (if they are too old)
if (!tapTimes.isEmpty()) { if (!tapTimes.isEmpty()) {
while (time - tapTimes.first > timeWindowNS) { while (time - tapTimes.first() > timeWindowNS) {
tapTimes.removeFirst() tapTimes.removeFirst()
if (tapTimes.isEmpty()) return if (tapTimes.isEmpty()) return
} }

View File

@@ -31,7 +31,7 @@ object TrackerUtils {
position: TrackerPosition, position: TrackerPosition,
): Tracker? { ): Tracker? {
val resetTrackers = allTrackers.filter { val resetTrackers = allTrackers.filter {
it.trackerPosition === position && it.trackerPosition == position &&
!it.isInternal && !it.isInternal &&
!it.status.reset !it.status.reset
} }
@@ -51,7 +51,7 @@ object TrackerUtils {
position: TrackerPosition, position: TrackerPosition,
): Tracker? { ): Tracker? {
val resetTrackers = allTrackers.filter { val resetTrackers = allTrackers.filter {
it.trackerPosition === position && it.trackerPosition == position &&
!it.isComputed && !it.isComputed &&
!it.isInternal && !it.isInternal &&
!it.status.reset !it.status.reset
@@ -72,7 +72,7 @@ object TrackerUtils {
position: TrackerPosition, position: TrackerPosition,
): Tracker? { ): Tracker? {
val resetTrackers = allTrackers.filter { val resetTrackers = allTrackers.filter {
it.trackerPosition === position && it.trackerPosition == position &&
!it.isImu() && !it.isImu() &&
!it.isInternal && !it.isInternal &&
!it.status.reset !it.status.reset

View File

@@ -221,15 +221,15 @@ value class Matrix3
* finds the rotation matrix closest to all given rotation matrices. * finds the rotation matrix closest to all given rotation matrices.
* multiply input matrices by a weight for weighted averaging. * multiply input matrices by a weight for weighted averaging.
* WARNING: NOT ANGULAR * WARNING: NOT ANGULAR
* @param others a variable number of additional matrices to average * @param others a variable number of additional boxed matrices to average
* @return the average rotation matrix * @return the average rotation matrix
*/ */
fun average(vararg others: Matrix3): Matrix3 { fun average(vararg others: ObjectMatrix3): Matrix3 {
var count = 1f var count = 1f
var sum = this var sum = this
others.forEach { others.forEach {
count += 1f count += 1f
sum += it sum += it.toValue()
} }
return (sum / count).orthonormalize() return (sum / count).orthonormalize()
} }
@@ -460,6 +460,16 @@ value class Matrix3
*/ */
fun toEulerAngles(order: EulerOrder): EulerAngles = fun toEulerAngles(order: EulerOrder): EulerAngles =
orthonormalize().toEulerAnglesAssumingOrthonormal(order) orthonormalize().toEulerAnglesAssumingOrthonormal(order)
fun toObject() = ObjectMatrix3(xx, yx, zx, xy, yy, zy, xz, yz, zz)
}
data class ObjectMatrix3(
val xx: Float, val yx: Float, val zx: Float,
val xy: Float, val yy: Float, val zy: Float,
val xz: Float, val yz: Float, val zz: Float
) {
fun toValue() = Matrix3(xx, yx, zx, xy, yy, zy, xz, yz, zz)
} }
operator fun Float.times(that: Matrix3): Matrix3 = that * this operator fun Float.times(that: Matrix3): Matrix3 = that * this

View File

@@ -5,12 +5,13 @@
* For more details take a look at the Java Libraries chapter in the Gradle * For more details take a look at the Java Libraries chapter in the Gradle
* User Manual available at https://docs.gradle.org/6.3/userguide/java_library_plugin.html * User Manual available at https://docs.gradle.org/6.3/userguide/java_library_plugin.html
*/ */
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins { plugins {
kotlin("jvm") kotlin("jvm")
application application
id("com.github.johnrengelman.shadow") id("com.gradleup.shadow")
id("com.github.gmazzo.buildconfig") id("com.github.gmazzo.buildconfig")
id("org.ajoberstar.grgit") id("org.ajoberstar.grgit")
} }
@@ -26,8 +27,10 @@ java {
} }
} }
tasks.withType<KotlinCompile> { tasks.withType<KotlinCompile> {
kotlinOptions.jvmTarget = "17" compilerOptions {
kotlinOptions.freeCompilerArgs += "-Xvalue-classes" jvmTarget.set(JvmTarget.JVM_17)
freeCompilerArgs.set(listOf("-Xvalue-classes"))
}
} }
// Set compiler to use UTF-8 // Set compiler to use UTF-8
@@ -54,8 +57,8 @@ dependencies {
implementation(project(":server:core")) implementation(project(":server:core"))
implementation(project(":solarxr-protocol")) implementation(project(":solarxr-protocol"))
implementation("commons-cli:commons-cli:1.5.0") implementation("commons-cli:commons-cli:1.8.0")
implementation("org.apache.commons:commons-lang3:3.12.0") implementation("org.apache.commons:commons-lang3:3.15.0")
implementation("com.google.protobuf:protobuf-java:3.21.12") implementation("com.google.protobuf:protobuf-java:3.21.12")
implementation("net.java.dev.jna:jna:5.+") implementation("net.java.dev.jna:jna:5.+")
implementation("net.java.dev.jna:jna-platform:5.+") implementation("net.java.dev.jna:jna-platform:5.+")

View File

@@ -26,7 +26,7 @@ pluginManagement {
kotlin("jvm") version kotlinVersion kotlin("jvm") version kotlinVersion
kotlin("android") version kotlinVersion kotlin("android") version kotlinVersion
id("com.diffplug.spotless") version spotlessVersion id("com.diffplug.spotless") version spotlessVersion
id("com.github.johnrengelman.shadow") version shadowJarVersion id("com.gradleup.shadow") version shadowJarVersion
id("com.github.gmazzo.buildconfig") version buildconfigVersion id("com.github.gmazzo.buildconfig") version buildconfigVersion
id("org.ajoberstar.grgit") version grgitVersion id("org.ajoberstar.grgit") version grgitVersion
} }