diff --git a/thermion_dart/native/include/TSceneManager.h b/thermion_dart/native/include/TSceneManager.h index 295df4db..923b04dd 100644 --- a/thermion_dart/native/include/TSceneManager.h +++ b/thermion_dart/native/include/TSceneManager.h @@ -42,11 +42,11 @@ extern "C" int numFrames, float frameLengthInMs); - // SceneManager EMSCRIPTEN_KEEPALIVE TCamera* SceneManager_createCamera(TSceneManager *sceneManager); EMSCRIPTEN_KEEPALIVE void SceneManager_destroyCamera(TSceneManager *sceneManager, TCamera* camera); EMSCRIPTEN_KEEPALIVE size_t SceneManager_getCameraCount(TSceneManager *sceneManager); EMSCRIPTEN_KEEPALIVE TCamera* SceneManager_getCameraAt(TSceneManager *sceneManager, size_t index); + EMSCRIPTEN_KEEPALIVE void SceneManager_destroyMaterialInstance(TSceneManager *sceneManager, TMaterialInstance *instance); #ifdef __cplusplus } diff --git a/thermion_dart/native/include/ThermionDartApi.h b/thermion_dart/native/include/ThermionDartApi.h index 777c02ae..f7a74336 100644 --- a/thermion_dart/native/include/ThermionDartApi.h +++ b/thermion_dart/native/include/ThermionDartApi.h @@ -13,7 +13,7 @@ extern "C" #endif EMSCRIPTEN_KEEPALIVE TViewer *Viewer_create(const void *const context, const void *const loader, void *const platform, const char *uberArchivePath); - EMSCRIPTEN_KEEPALIVE void destroy_filament_viewer(TViewer *viewer); + EMSCRIPTEN_KEEPALIVE void Viewer_destroy(TViewer *viewer); EMSCRIPTEN_KEEPALIVE TSceneManager *Viewer_getSceneManager(TViewer *viewer); EMSCRIPTEN_KEEPALIVE TRenderTarget* Viewer_createRenderTarget(TViewer *viewer, intptr_t texture, uint32_t width, uint32_t height); EMSCRIPTEN_KEEPALIVE void Viewer_destroyRenderTarget(TViewer *viewer, TRenderTarget* tRenderTarget); @@ -106,8 +106,6 @@ extern "C" EMSCRIPTEN_KEEPALIVE TMaterialInstance *create_material_instance(TSceneManager *sceneManager, TMaterialKey materialConfig); - EMSCRIPTEN_KEEPALIVE void destroy_material_instance(TSceneManager *sceneManager, TMaterialInstance *instance); - EMSCRIPTEN_KEEPALIVE void clear_morph_animation( TSceneManager *sceneManager, EntityId entity); diff --git a/thermion_dart/native/src/SceneManager.cpp b/thermion_dart/native/src/SceneManager.cpp index bda8268b..26af68f9 100644 --- a/thermion_dart/native/src/SceneManager.cpp +++ b/thermion_dart/native/src/SceneManager.cpp @@ -578,6 +578,7 @@ namespace thermion _engine->destroy(materialInstance); } + // TODO - free geometry? _textures.clear(); _assets.clear(); @@ -2503,8 +2504,12 @@ namespace thermion materialInstance->setParameter(property, filament::math::float4{value.x, value.y, value.z, value.w}); } - void SceneManager::destroy(MaterialInstance *instance) + void SceneManager::destroy(filament::MaterialInstance *instance) { + auto it = std::find(_materialInstances.begin(), _materialInstances.end(), instance); + if(it != _materialInstances.end()) { + _materialInstances.erase(it); + } _engine->destroy(instance); } diff --git a/thermion_dart/native/src/TSceneManager.cpp b/thermion_dart/native/src/TSceneManager.cpp index 6fc7085e..48c42c91 100644 --- a/thermion_dart/native/src/TSceneManager.cpp +++ b/thermion_dart/native/src/TSceneManager.cpp @@ -130,4 +130,11 @@ extern "C" { return ((SceneManager *)sceneManager)->createGeometry(vertices, static_cast(numVertices), normals, static_cast(numNormals), uvs, static_cast(numUvs), indices, static_cast(numIndices), (filament::RenderableManager::PrimitiveType)primitiveType, reinterpret_cast(materialInstance), keepData); } + + EMSCRIPTEN_KEEPALIVE void SceneManager_destroyMaterialInstance(TSceneManager *sceneManager, TMaterialInstance *instance) + { + ((SceneManager *)sceneManager)->destroy(reinterpret_cast(instance)); + } + + } \ No newline at end of file