KScene is an imperative Kotlin Multiplatform 3D scene runtime.
It provides a shared scene graph, camera and lifecycle API, with SceneView / Filament on Android and SceneKit on iOS.
KScene is published as a Kotlin Multiplatform library. Add Maven Central to
your repositories and depend on it from commonMain:
// settings.gradle.kts or dependencyResolutionManagement
repositories {
mavenCentral()
}// shared/build.gradle.kts
kotlin {
sourceSets {
commonMain.dependencies {
implementation("io.github.bvin:kscene:0.1.0")
}
}
}KScene is intentionally imperative: create a controller, keep your node tree, and attach it when the platform renderer is ready.
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import foto.go.scene.SceneController
import foto.go.scene.SceneView
import foto.go.scene.mesh.MeshData
import foto.go.scene.node.SceneNode
@Composable
fun SceneDemo() {
val controller = remember { SceneController() }
val root = remember {
SceneNode("root").apply {
addChild(
SceneNode(
id = "triangle",
mesh = MeshData(
positions = floatArrayOf(
0f, 1f, 0f,
-1f, -1f, 0f,
1f, -1f, 0f,
),
indices = intArrayOf(0, 1, 2),
),
),
)
}
}
SceneView(
modifier = Modifier.fillMaxSize(),
controller = controller,
onReady = { controller.attachNode(root) },
)
}SceneNode changes are synchronized incrementally after the root is attached:
root.addChild(anotherNode)
anotherNode.setVisible(false)
anotherNode.setTransform(newTransform)
root.removeChild(anotherNode)