# SceneCoreEntity

## Functions summary

|---|---|
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `@https://developer.android.com/reference/kotlin/androidx/compose/runtime/Composable @https://developer.android.com/reference/kotlin/androidx/xr/compose/subspace/SubspaceComposable <T : https://developer.android.com/reference/kotlin/androidx/xr/scenecore/Entity> https://developer.android.com/reference/kotlin/androidx/xr/compose/subspace/SceneCoreEntity.composable#SceneCoreEntity(kotlin.Function0,androidx.xr.compose.subspace.layout.SubspaceModifier,kotlin.Function1,androidx.xr.compose.subspace.SceneCoreEntitySizeAdapter,kotlin.Function0)( factory: () -> T, modifier: https://developer.android.com/reference/kotlin/androidx/xr/compose/subspace/layout/SubspaceModifier, update: (T) -> https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html, sizeAdapter: https://developer.android.com/reference/kotlin/androidx/xr/compose/subspace/SceneCoreEntitySizeAdapter<T>?, content: @https://developer.android.com/reference/kotlin/androidx/compose/runtime/Composable @https://developer.android.com/reference/kotlin/androidx/xr/compose/subspace/SubspaceComposable () -> https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html )` A composable that attaches to a SceneCore entity and allow compose to size, position, reparent, add children, and apply modifiers to the entity. |

## Functions

### SceneCoreEntity

Artifact: [androidx.xr.compose:compose](https://developer.android.com/jetpack/androidx/releases/xr-compose) [View Source](https://cs.android.com/search?q=file:androidx/xr/compose/subspace/SceneCoreEntity.kt+function:SceneCoreEntity)

```
@Composable
@SubspaceComposable
fun <T : Entity> SceneCoreEntity(
    factory: () -> T,
    modifier: SubspaceModifier = SubspaceModifier,
    update: (T) -> Unit = {},
    sizeAdapter: SceneCoreEntitySizeAdapter<T>? = null,
    content: @Composable @SubspaceComposable () -> Unit = {}
): Unit
```

A composable that attaches to a SceneCore entity and allow compose to size, position, reparent, add children, and apply modifiers to the entity.

Usage of this API requires the SceneCore dependency to be added. See https://developer.android.com/jetpack/androidx/releases/xr-scenecore

```kotlin
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.unit.dp
import androidx.xr.compose.platform.LocalSession
import androidx.xr.compose.subspace.SceneCoreEntity
import androidx.xr.runtime.math.FloatSize2d
import androidx.xr.scenecore.PanelEntity
import androidx.xr.scenecore.scene

val session = checkNotNull(LocalSession.current)
val context = LocalContext.current
val view = remember(context) { View(context) }
val density = LocalDensity.current
val virtualPixelDensity = session.scene.virtualPixelDensity

// A state variable to dynamically control the size of the panel in DP
var panelSizeDp by remember { mutableStateOf(400.dp) }

SceneCoreEntity(
    factory = {
        // Convert the DP size to meters using the virtual pixel density, PanelEntity also has
        // APIs that use pixels directly, but a lot of other SceneCore APIs do not have this.
        val sizeInPx = with(density) { panelSizeDp.toPx() }
        val sizeInMeters = virtualPixelDensity.convertPixelsToMeters(sizeInPx)

        PanelEntity.create(
            session = session,
            view = view,
            dimensions = FloatSize2d(sizeInMeters, sizeInMeters),
            name = "SamplePanel",
        )
    },
    update = { entity ->
        // Update the entity size when state changes
        val sizeInPx = with(density) { panelSizeDp.toPx() }
        val sizeInMeters = virtualPixelDensity.convertPixelsToMeters(sizeInPx)
        entity.size = FloatSize2d(sizeInMeters, sizeInMeters)
    },
)
```

| Parameters |
|---|---|
| `factory: () -> T` | the factory method for creating the SceneCore `https://developer.android.com/reference/kotlin/androidx/xr/scenecore/Entity`. |
| `modifier: https://developer.android.com/reference/kotlin/androidx/xr/compose/subspace/layout/SubspaceModifier = SubspaceModifier` | the `https://developer.android.com/reference/kotlin/androidx/xr/compose/subspace/layout/SubspaceModifier` that will be applied to this node. |
| `update: (T) -> https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html = {}` | a callback to be invoked on recomposition to apply any state changes to the Entity. This will track snapshot state reads and call `https://developer.android.com/reference/kotlin/androidx/xr/compose/subspace/package-summary#SceneCoreEntity(kotlin.Function0,androidx.xr.compose.subspace.layout.SubspaceModifier,kotlin.Function1,androidx.xr.compose.subspace.SceneCoreEntitySizeAdapter,kotlin.Function0)` when they change. |
| `sizeAdapter: https://developer.android.com/reference/kotlin/androidx/xr/compose/subspace/SceneCoreEntitySizeAdapter<T>? = null` | an adapter that allows compose to integrate its layout size changes with the rendered entity size. This adapter implementation will likely be different for every entity and some SceneCore entities may not require sizing at all (this may be null). |
| `content: @https://developer.android.com/reference/kotlin/androidx/compose/runtime/Composable @https://developer.android.com/reference/kotlin/androidx/xr/compose/subspace/SubspaceComposable () -> https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html = {}` | the children of this `https://developer.android.com/reference/kotlin/androidx/xr/scenecore/Entity`. |

| See also |
|---|---|
| `https://developer.android.com/reference/kotlin/androidx/xr/compose/subspace/SceneCoreEntitySizeAdapter` | for more information on how compose sizes SceneCore entities. |