Skip to content

Commit

Permalink
Update to use GeoviewCompose - SceneView (#191)
Browse files Browse the repository at this point in the history
  • Loading branch information
shubham7109 authored Apr 1, 2024
1 parent 9f628d2 commit c538ba4
Show file tree
Hide file tree
Showing 23 changed files with 129 additions and 315 deletions.
6 changes: 5 additions & 1 deletion add-scene-layer-with-elevation/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ Run the sample to display a scene service with an `ArcGISSceneLayer`. Pan and zo

The scene launches with a northward view of the city of Brest, France ([SceneServer](https://tiles.arcgis.com/tiles/P3ePLMYs2RVChkJx/arcgis/rest/services/Buildings_Brest/SceneServer)). A 3D scene layer representing buildings (some textured) is used as an example.

## Additional information

This sample uses the GeoViewCompose Toolkit module to be able to implement a Composable SceneView.

## Tags

3D, layer, scene
3D, geoviewcompose, layer, scene
2 changes: 1 addition & 1 deletion add-scene-layer-with-elevation/README.metadata.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
],
"keywords": [
"3D",
"geoviewcompose",
"layer",
"scene",
"ArcGISScene",
Expand All @@ -23,7 +24,6 @@
],
"snippets": [
"src/main/java/com/esri/arcgismaps/sample/addscenelayerwithelevation/MainActivity.kt",
"src/main/java/com/esri/arcgismaps/sample/addscenelayerwithelevation/components/ComposeSceneView.kt",
"src/main/java/com/esri/arcgismaps/sample/addscenelayerwithelevation/components/SceneViewModel.kt",
"src/main/java/com/esri/arcgismaps/sample/addscenelayerwithelevation/screens/MainScreen.kt"
],
Expand Down
3 changes: 3 additions & 0 deletions add-scene-layer-with-elevation/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,7 @@ dependencies {
implementation(libs.androidx.compose.ui.tooling)
implementation(libs.androidx.compose.ui.tooling.preview)
implementation(project(":samples-lib"))
// Toolkit dependencies
implementation(platform(libs.arcgis.maps.kotlin.toolkit.bom))
implementation(libs.arcgis.maps.kotlin.toolkit.geoview.compose)
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,8 @@ class MainActivity : ComponentActivity() {

@Composable
private fun SceneLayerWithElevationApp() {
Surface(
color = MaterialTheme.colorScheme.background
) {
MainScreen(
sampleName = getString(R.string.app_name),
application = application
)
Surface(color = MaterialTheme.colorScheme.background) {
MainScreen(sampleName = getString(R.string.app_name))
}
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -18,29 +18,41 @@ package com.esri.arcgismaps.sample.addscenelayerwithelevation.components

import android.app.Application
import androidx.lifecycle.AndroidViewModel
import com.arcgismaps.geometry.Point
import com.arcgismaps.mapping.ArcGISScene
import com.arcgismaps.mapping.BasemapStyle
import com.arcgismaps.mapping.Viewpoint
import com.arcgismaps.mapping.layers.ArcGISSceneLayer
import com.arcgismaps.mapping.view.Camera
import com.esri.arcgismaps.sample.addscenelayerwithelevation.R

class SceneViewModel(application: Application) : AndroidViewModel(application) {
// set the SceneView state
val sceneViewState = SceneViewState()

private val initLocation = Point(
x = 48.378,
y = -4.494
)

// create a camera position for the scene
private val camera: Camera = Camera(
latitude = 48.378,
longitude = -4.494,
altitude = 200.0,
heading = 345.0,
pitch = 65.0,
roll = 0.0
)
// the scene used to display on the SceneView
val scene: ArcGISScene = ArcGISScene(BasemapStyle.ArcGISTopographic).apply {
initialViewpoint = Viewpoint(initLocation,camera)
}

// add a scene layer to the ArcGISScene
init {
// create a scene layer from a scene service for viewing buildings
val sceneLayer = ArcGISSceneLayer(application.getString(R.string.brest_buildings))
// add the scene layer to the scene's operational layer
sceneViewState.arcGISScene.operationalLayers.add(sceneLayer)
scene.operationalLayers.add(sceneLayer)
}
}

/**
* Data class that represents the SceneView state
*/
class SceneViewState(
val arcGISScene: ArcGISScene = ArcGISScene(BasemapStyle.ArcGISTopographic),
val camera: Camera = Camera(48.378, -4.494, 200.0, 345.0, 65.0, 0.0)
)
Original file line number Diff line number Diff line change
Expand Up @@ -23,15 +23,18 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Scaffold
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import com.esri.arcgismaps.sample.addscenelayerwithelevation.components.ComposeSceneView
import androidx.compose.ui.platform.LocalContext
import com.arcgismaps.toolkit.geoviewcompose.SceneView
import com.esri.arcgismaps.sample.addscenelayerwithelevation.components.SceneViewModel
import com.esri.arcgismaps.sample.sampleslib.components.SampleTopAppBar

/**
* Main screen layout for the sample app
*/
@Composable
fun MainScreen(sampleName: String, application: Application) {
fun MainScreen(sampleName: String) {
// get the application context
val application = LocalContext.current.applicationContext as Application
// create a ViewModel to handle SceneView interactions
val sceneViewModel = SceneViewModel(application)

Expand All @@ -44,10 +47,9 @@ fun MainScreen(sampleName: String, application: Application) {
.padding(it)
) {
// composable function that wraps the SceneView
ComposeSceneView(
modifier = Modifier
.fillMaxSize(),
sceneViewModel = sceneViewModel
SceneView(
modifier = Modifier.fillMaxSize(),
arcGISScene = sceneViewModel.scene
)
}
}
Expand Down
6 changes: 5 additions & 1 deletion display-scene-from-mobile-scene-package/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ This sample takes a mobile scene package that was created in ArcGIS Pro, and dis
* MobileScenePackage
* SceneView

## Additional information

This sample uses the GeoViewCompose Toolkit module to be able to implement a Composable SceneView.

## Tags

3d, mobile scene package, mspk, offline, scene
3d, geoviewcompose, mobile scene package, mspk, offline, scene
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
],
"keywords": [
"3d",
"geoviewcompose",
"mobile scene package",
"mspk",
"offline",
Expand All @@ -26,7 +27,6 @@
"snippets": [
"src/main/java/com/esri/arcgismaps/sample/displayscenefrommobilescenepackage/DownloadActivity.kt",
"src/main/java/com/esri/arcgismaps/sample/displayscenefrommobilescenepackage/MainActivity.kt",
"src/main/java/com/esri/arcgismaps/sample/displayscenefrommobilescenepackage/components/ComposeSceneView.kt",
"src/main/java/com/esri/arcgismaps/sample/displayscenefrommobilescenepackage/components/SceneViewModel.kt",
"src/main/java/com/esri/arcgismaps/sample/displayscenefrommobilescenepackage/screens/MainScreen.kt"
],
Expand Down
3 changes: 3 additions & 0 deletions display-scene-from-mobile-scene-package/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,7 @@ dependencies {
implementation(libs.androidx.compose.ui.tooling)
implementation(libs.androidx.compose.ui.tooling.preview)
implementation(project(":samples-lib"))
// Toolkit dependencies
implementation(platform(libs.arcgis.maps.kotlin.toolkit.bom))
implementation(libs.arcgis.maps.kotlin.toolkit.geoview.compose)
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,8 @@ class MainActivity : ComponentActivity() {

@Composable
private fun DisplaySceneFromMobileScenePackageApp() {
Surface(
color = MaterialTheme.colorScheme.background
) {
MainScreen(
sampleName = getString(R.string.app_name),
application = application
)
Surface(color = MaterialTheme.colorScheme.background) {
MainScreen(sampleName = getString(R.string.app_name))
}
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,16 @@
package com.esri.arcgismaps.sample.displayscenefrommobilescenepackage.components

import android.app.Application
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.lifecycle.AndroidViewModel
import com.arcgismaps.mapping.ArcGISScene
import com.arcgismaps.mapping.BasemapStyle
import com.arcgismaps.mapping.MobileScenePackage
import com.esri.arcgismaps.sample.displayscenefrommobilescenepackage.R
import com.esri.arcgismaps.sample.sampleslib.components.MessageDialogViewModel
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch
import java.io.File

Expand All @@ -34,11 +35,8 @@ class SceneViewModel(
private val sampleCoroutineScope: CoroutineScope
) : AndroidViewModel(application) {

// create a mutable state holder for the first scene
private val _firstScene = MutableStateFlow<ArcGISScene?>(null)

// expose a read-only state flow for observing changes to the first scene
val firstScene: StateFlow<ArcGISScene?> = _firstScene.asStateFlow()
// create a base scene to be used to load the mobile scene package
var scene by mutableStateOf(ArcGISScene(BasemapStyle.ArcGISStreets))

// create a ViewModel to handle dialog interactions
val messageDialogVM: MessageDialogViewModel = MessageDialogViewModel()
Expand All @@ -64,7 +62,7 @@ class SceneViewModel(
// load the mobile scene package
mobileScenePackage.load().onSuccess {
// update the mutable state holder with the first scene from the MobileScenePackage
_firstScene.value = mobileScenePackage.scenes.first()
scene = mobileScenePackage.scenes.first()
}.onFailure { error ->
// show the message dialog and pass the error message to be displayed in the dialog
messageDialogVM.showMessageDialog(error.message.toString(), error.cause.toString())
Expand Down
Loading

0 comments on commit c538ba4

Please sign in to comment.