From 49b8e7023b5431d9a0547f928efe011862c59593 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 19 Jun 2024 13:15:36 +0800 Subject: [PATCH] free all resources in FilamentViewer destructor --- thermion_dart/native/src/FilamentViewer.cpp | 29 +++++++++------------ 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/thermion_dart/native/src/FilamentViewer.cpp b/thermion_dart/native/src/FilamentViewer.cpp index 653d009b..ad26485f 100644 --- a/thermion_dart/native/src/FilamentViewer.cpp +++ b/thermion_dart/native/src/FilamentViewer.cpp @@ -126,11 +126,10 @@ namespace thermion_filament static const uint16_t sFullScreenTriangleIndices[3] = {0, 1, 2}; - FilamentViewer::FilamentViewer(const void *sharedContext, const ResourceLoaderWrapperImpl *const ResourceLoaderWrapperImpl, void *const platform, const char *uberArchivePath) - : _resourceLoaderWrapper(ResourceLoaderWrapperImpl) + FilamentViewer::FilamentViewer(const void *sharedContext, const ResourceLoaderWrapperImpl *const resourceLoader, void *const platform, const char *uberArchivePath) + : _resourceLoaderWrapper(resourceLoader) { _context = (void*) sharedContext; - ASSERT_POSTCONDITION(_resourceLoaderWrapper != nullptr, "Resource loader must be non-null"); #if TARGET_OS_IPHONE @@ -269,7 +268,6 @@ namespace thermion_filament .culling(false) .build(*_engine, _imageEntity); _scene->addEntity(_imageEntity); - Log("Added imageEntity %d", _imageEntity); } void FilamentViewer::setAntiAliasing(bool msaa, bool fxaa, bool taa) @@ -444,7 +442,8 @@ namespace thermion_filament new ktxreader::Ktx1Bundle(static_cast(rb.data), static_cast(rb.size)); - // because the ResourceBuffer will go out of scope before the texture callback is invoked, we need to make a copy to the heap + // the ResourceBuffer will go out of scope before the texture callback is invoked + // make a copy to the heap ResourceBuffer *rbCopy = new ResourceBuffer(rb); std::vector *callbackData = new std::vector{(void *)_resourceLoaderWrapper, rbCopy}; @@ -680,22 +679,21 @@ namespace thermion_filament FilamentViewer::~FilamentViewer() { - clearEntities(); + clearLights(); + destroySwapChain(); + _engine->destroy(_imageEntity); + _engine->destroy(_imageTexture); + _engine->destroy(_imageVb); + _engine->destroy(_imageIb); + _engine->destroy(_imageMaterial); delete _sceneManager; - - for (auto it : _lights) - { - _engine->destroy(it); - } - _engine->destroyCameraComponent(_mainCamera->getEntity()); _mainCamera = nullptr; _engine->destroy(_view); _engine->destroy(_scene); _engine->destroy(_renderer); - _engine->destroy(_swapChain); - - Engine::destroy(&_engine); // clears engine* + Engine::destroy(&_engine); + delete _resourceLoaderWrapper; } Renderer *FilamentViewer::getRenderer() { return _renderer; } @@ -930,7 +928,6 @@ namespace thermion_filament } Log("Loading skybox from path %s", skyboxPath); - ResourceBuffer skyboxBuffer = _resourceLoaderWrapper->load(skyboxPath); // because this will go out of scope before the texture callback is invoked, we need to make a copy of the variable itself (not its contents)