-
-
Notifications
You must be signed in to change notification settings - Fork 205
Closed
Description
Hello, I encountered a problem with destroying the camera when closing the window. The problematic area and how to solve it:
Problem:
override fun destroy() {
super.destroy()
engine.safeDestroyCamera(camera)
}StackTrace:
java.lang.NullPointerException
at io.github.sceneview.components.CameraComponent$DefaultImpls.getCamera(CameraComponent.kt:30)
at io.github.sceneview.node.CameraNode.getCamera(CameraNode.kt:27)
at io.github.sceneview.node.CameraNode.destroy(CameraNode.kt:330)
at io.github.sceneview.SceneKt$rememberCameraNode$$inlined$rememberNode$1$1.dispose(Effects.kt:498)
at androidx.compose.runtime.DisposableEffectImpl.onForgotten(Effects.kt:87)
at androidx.compose.runtime.CompositionImpl$RememberEventDispatcher.dispatchRememberObservers(Composition.kt:1276)
at androidx.compose.runtime.CompositionImpl.applyChangesInLocked(Composition.kt:984)
at androidx.compose.runtime.CompositionImpl.applyChanges(Composition.kt:1005)
at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$1.invoke(Recomposer.kt:639)
at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$1.invoke(Recomposer.kt:551)
at androidx.compose.ui.platform.AndroidUiFrameClock$withFrameNanos$2$callback$1.doFrame(AndroidUiFrameClock.android.kt:41)
at androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(AndroidUiDispatcher.android.kt:109)
at androidx.compose.ui.platform.AndroidUiDispatcher.access$performFrameDispatch(AndroidUiDispatcher.android.kt:41)
at androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1.doFrame(AndroidUiDispatcher.android.kt:69)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:970)
at android.view.Choreographer.doCallbacks(Choreographer.java:796)
at android.view.Choreographer.doFrame(Choreographer.java:727)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:957)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [androidx.compose.runtime.PausableMonotonicFrameClock@8b855a5, androidx.compose.ui.platform.MotionDurationScaleImpl@332ed7a, StandaloneCoroutine{Cancelling}@766792b, AndroidUiDispatcher@1cee188]Solution:
class CameraNode2(engine: Engine) : CameraNode(engine = engine) {
init {
transform = Transform(position = Vector3.back().toFloat3())
setExposure(
aperture = 16.0f,
sensitivity = 100.0f,
shutterSpeed = 1.0f / 125.0f
)
}
override fun destroy() {
engine.safeDestroyCamera(camera)
runCatching { parent = null }
engine.safeDestroyTransformable(entity)
engine.safeDestroyEntity(entity)
}
}
@Composable
fun rememberCameraNode2(engine: Engine): CameraNode =
rememberNode {
CameraNode2(engine)
}
{class CameraNode2(engine: Engine) : CameraNode(engine = engine) {
init {
transform = Transform(position = Vector3.back().toFloat3())
setExposure(
aperture = 16.0f,
sensitivity = 100.0f,
shutterSpeed = 1.0f / 125.0f
)
}
override fun destroy() {
engine.safeDestroyCamera(camera)
runCatching { parent = null }
engine.safeDestroyTransformable(entity)
engine.safeDestroyEntity(entity)
}
}
@Composable
fun rememberCameraNode2(engine: Engine): CameraNode =
rememberNode {
CameraNode2(engine)
}
}Code how use it:
val engine = rememberEngine()
val camera = rememberCameraNode2(engine)
val cameraManipulator = rememberCameraManipulator(
creator = {
Manipulator.Builder()
.orbitHomePosition(Position(x = 1F, y = 1.5F, z = 7F))
.targetPosition(boxShape.centerPosition)
.orbitSpeed(0.005F, 0.0F)
.zoomSpeed(0.05f)
.build(Manipulator.Mode.ORBIT)
}
)
Scene(
...
engine = engine,
cameraNode = camera,
cameraManipulator = cameraManipulator,
...
)Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels