diff --git a/app/build.gradle.kts b/app/build.gradle.kts index ccf538d..7cee73d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -60,7 +60,6 @@ dependencies { implementation(libs.androidx.arcore) implementation(libs.androidx.scenecore) implementation(libs.androidx.compose) - implementation(libs.kotlinx.coroutines.guava) compileOnly(libs.androidx.extensions.xr) //This is necessary for Proguard minification implementation(libs.material) diff --git a/app/src/main/assets/environments/green_hills_ibl.zip b/app/src/main/assets/environments/green_hills_ibl.zip new file mode 100644 index 0000000..987a28e Binary files /dev/null and b/app/src/main/assets/environments/green_hills_ibl.zip differ diff --git a/app/src/main/assets/green_hills_ktx2_mipmap.glb b/app/src/main/assets/environments/green_hills_ktx2_mipmap.glb similarity index 100% rename from app/src/main/assets/green_hills_ktx2_mipmap.glb rename to app/src/main/assets/environments/green_hills_ktx2_mipmap.glb diff --git a/app/src/main/java/com/example/helloandroidxr/environment/EnvironmentController.kt b/app/src/main/java/com/example/helloandroidxr/environment/EnvironmentController.kt index 3846a72..1c01024 100644 --- a/app/src/main/java/com/example/helloandroidxr/environment/EnvironmentController.kt +++ b/app/src/main/java/com/example/helloandroidxr/environment/EnvironmentController.kt @@ -16,14 +16,17 @@ package com.example.helloandroidxr.environment -import android.net.Uri +import android.annotation.SuppressLint import android.util.Log +import androidx.core.net.toUri import androidx.xr.runtime.Session +import androidx.xr.scenecore.ExrImage import androidx.xr.scenecore.GltfModel import androidx.xr.scenecore.SpatialEnvironment import androidx.xr.scenecore.scene import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch +import java.nio.file.Paths class EnvironmentController(private val xrSession: Session, private val coroutineScope: CoroutineScope) { private val assetCache: HashMap = HashMap() @@ -40,18 +43,22 @@ class EnvironmentController(private val xrSession: Session, private val coroutin /** * Request the system load a custom Environment */ + @SuppressLint("NewApi") // Paths.get is API 26+, but Android XR devices are 34+ fun requestCustomEnvironment(environmentModelName: String) { coroutineScope.launch { try { if (activeEnvironmentModelName == null || activeEnvironmentModelName != environmentModelName ) { - + val lightingForSkybox = ExrImage.createFromZip( + xrSession, + Paths.get("environments/green_hills_ibl.zip") + ) val environmentModel = assetCache[environmentModelName] as GltfModel SpatialEnvironment.SpatialEnvironmentPreference( - skybox = null, - geometry = environmentModel + geometry = environmentModel, + skybox = lightingForSkybox, ).let { xrSession.scene.spatialEnvironment.preferredSpatialEnvironment = it } @@ -74,7 +81,7 @@ class EnvironmentController(private val xrSession: Session, private val coroutin if (!assetCache.containsKey(modelName)) { try { val gltfModel = - GltfModel.create(xrSession, Uri.parse(modelName)) + GltfModel.create(xrSession, modelName.toUri()) assetCache[modelName] = gltfModel } catch (e: Exception) { diff --git a/app/src/main/java/com/example/helloandroidxr/ui/components/BugdroidModel.kt b/app/src/main/java/com/example/helloandroidxr/ui/components/BugdroidModel.kt index bb51bd5..02919a5 100644 --- a/app/src/main/java/com/example/helloandroidxr/ui/components/BugdroidModel.kt +++ b/app/src/main/java/com/example/helloandroidxr/ui/components/BugdroidModel.kt @@ -79,7 +79,7 @@ fun BugdroidModel( // Create and apply a custom PBR material to the model when the XR session or target node changes. LaunchedEffect(xrSession, bugdroidNode) { - val material = KhronosPbrMaterial.create( + val material = pbrMaterial ?: KhronosPbrMaterial.create( session = xrSession, alphaMode = AlphaMode.OPAQUE ).also { diff --git a/app/src/main/java/com/example/helloandroidxr/ui/components/EnvironmentControls.kt b/app/src/main/java/com/example/helloandroidxr/ui/components/EnvironmentControls.kt index ba30416..4fd741c 100644 --- a/app/src/main/java/com/example/helloandroidxr/ui/components/EnvironmentControls.kt +++ b/app/src/main/java/com/example/helloandroidxr/ui/components/EnvironmentControls.kt @@ -61,7 +61,7 @@ fun EnvironmentControls(modifier: Modifier = Modifier) { EnvironmentController(session, activity.lifecycleScope) } //load the model early so it's in memory for when we need it - val environmentModelName = "green_hills_ktx2_mipmap.glb" + val environmentModelName = "environments/green_hills_ktx2_mipmap.glb" environmentController.loadModelAsset(environmentModelName) Surface(modifier.clip(CircleShape)) { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 19c26ca..ed35926 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,12 +5,11 @@ arcore = "1.0.0-alpha13" compose = "1.0.0-alpha13" extensionsXr = "1.3.0" scenecore = "1.0.0-alpha14" -kotlinxCoroutinesGuava = "1.10.2" kotlin = "2.3.21" concurrentFuturesKtx = "1.3.0" activityCompose = "1.13.0" composeBom = "2026.05.00" -material = "1.13.0" +material = "1.14.0" adaptiveAndroid = "1.2.0" [libraries] @@ -18,7 +17,6 @@ androidx-arcore = { module = "androidx.xr.arcore:arcore", version.ref = "arcore" androidx-compose = { module = "androidx.xr.compose:compose", version.ref = "compose" } androidx-scenecore = { module = "androidx.xr.scenecore:scenecore", version.ref = "scenecore" } androidx-extensions-xr = { module = "com.android.extensions.xr:extensions-xr", version.ref = "extensionsXr" } -kotlinx-coroutines-guava = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-guava", version.ref = "kotlinxCoroutinesGuava" } androidx-compose-material3 = { module = "androidx.compose.material3:material3" } material = { module = "com.google.android.material:material", version.ref = "material" } androidx-compose-ui-tooling = { module = "androidx.compose.ui:ui-tooling" }