diff --git a/sceneview/src/main/java/io/github/sceneview/loaders/MaterialLoader.kt b/sceneview/src/main/java/io/github/sceneview/loaders/MaterialLoader.kt index 6abe25a9..953099ce 100644 --- a/sceneview/src/main/java/io/github/sceneview/loaders/MaterialLoader.kt +++ b/sceneview/src/main/java/io/github/sceneview/loaders/MaterialLoader.kt @@ -301,14 +301,18 @@ class MaterialLoader( } fun destroyMaterial(material: Material) { - engine.safeDestroyMaterialInstance(material.defaultInstance) - engine.safeDestroyMaterial(material) - materials -= material + if (material in materials) { + engine.safeDestroyMaterialInstance(material.defaultInstance) + engine.safeDestroyMaterial(material) + materials -= material + } } fun destroyMaterialInstance(materialInstance: MaterialInstance) { - engine.safeDestroyMaterialInstance(materialInstance) - materialInstances -= materialInstance + if (materialInstance in materialInstances) { + engine.safeDestroyMaterialInstance(materialInstance) + materialInstances -= materialInstance + } } fun destroy() { @@ -319,4 +323,4 @@ class MaterialLoader( materials.toList().forEach { destroyMaterial(it) } materials.clear() } -} \ No newline at end of file +} diff --git a/sceneview/src/main/java/io/github/sceneview/node/ViewNode2.kt b/sceneview/src/main/java/io/github/sceneview/node/ViewNode2.kt index f900715d..caa16ced 100644 --- a/sceneview/src/main/java/io/github/sceneview/node/ViewNode2.kt +++ b/sceneview/src/main/java/io/github/sceneview/node/ViewNode2.kt @@ -64,7 +64,7 @@ import io.github.sceneview.safeDestroyTexture class ViewNode2( engine: Engine, val windowManager: WindowManager, - materialLoader: MaterialLoader, + private val materialLoader: MaterialLoader, view: View, unlit: Boolean = false, invertFrontFaceWinding: Boolean = false, @@ -102,13 +102,18 @@ class ViewNode2( setExternalStream(engine, stream) } - init { - materialInstance = materialLoader.createViewInstance( - viewTexture = texture, - unlit = unlit, - invertFrontFaceWinding = invertFrontFaceWinding - ) + override var materialInstance: MaterialInstance = materialLoader.createViewInstance(viewTexture = texture, + unlit = unlit, + invertFrontFaceWinding = invertFrontFaceWinding + ).also { + setMaterialInstanceAt(0, it) } + set(value) { + val old = field + materialLoader.destroyMaterialInstance(old) + field = value + setMaterialInstanceAt(0, value) + } constructor( engine: Engine, @@ -293,7 +298,7 @@ class ViewNode2( windowManager.removeView(layout) - engine.safeDestroyMaterialInstance(materialInstance) + materialLoader.destroyMaterialInstance(materialInstance) engine.safeDestroyTexture(texture) engine.safeDestroyStream(stream) @@ -426,5 +431,6 @@ class ViewNode2( private fun Context.findActivity(): ComponentActivity? { - return generateSequence(this) { (it as? ContextWrapper)?.baseContext }.filterIsInstance().firstOrNull() + return generateSequence(this) { (it as? ContextWrapper)?.baseContext }.filterIsInstance() + .firstOrNull() }