fix: remove MaterialInstance from SceneManager storage when destroyed
This commit is contained in:
@@ -42,11 +42,11 @@ extern "C"
|
|||||||
int numFrames,
|
int numFrames,
|
||||||
float frameLengthInMs);
|
float frameLengthInMs);
|
||||||
|
|
||||||
// SceneManager
|
|
||||||
EMSCRIPTEN_KEEPALIVE TCamera* SceneManager_createCamera(TSceneManager *sceneManager);
|
EMSCRIPTEN_KEEPALIVE TCamera* SceneManager_createCamera(TSceneManager *sceneManager);
|
||||||
EMSCRIPTEN_KEEPALIVE void SceneManager_destroyCamera(TSceneManager *sceneManager, TCamera* camera);
|
EMSCRIPTEN_KEEPALIVE void SceneManager_destroyCamera(TSceneManager *sceneManager, TCamera* camera);
|
||||||
EMSCRIPTEN_KEEPALIVE size_t SceneManager_getCameraCount(TSceneManager *sceneManager);
|
EMSCRIPTEN_KEEPALIVE size_t SceneManager_getCameraCount(TSceneManager *sceneManager);
|
||||||
EMSCRIPTEN_KEEPALIVE TCamera* SceneManager_getCameraAt(TSceneManager *sceneManager, size_t index);
|
EMSCRIPTEN_KEEPALIVE TCamera* SceneManager_getCameraAt(TSceneManager *sceneManager, size_t index);
|
||||||
|
EMSCRIPTEN_KEEPALIVE void SceneManager_destroyMaterialInstance(TSceneManager *sceneManager, TMaterialInstance *instance);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ extern "C"
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
EMSCRIPTEN_KEEPALIVE TViewer *Viewer_create(const void *const context, const void *const loader, void *const platform, const char *uberArchivePath);
|
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 TSceneManager *Viewer_getSceneManager(TViewer *viewer);
|
||||||
EMSCRIPTEN_KEEPALIVE TRenderTarget* Viewer_createRenderTarget(TViewer *viewer, intptr_t texture, uint32_t width, uint32_t height);
|
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);
|
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 TMaterialInstance *create_material_instance(TSceneManager *sceneManager, TMaterialKey materialConfig);
|
||||||
|
|
||||||
EMSCRIPTEN_KEEPALIVE void destroy_material_instance(TSceneManager *sceneManager, TMaterialInstance *instance);
|
|
||||||
|
|
||||||
EMSCRIPTEN_KEEPALIVE void clear_morph_animation(
|
EMSCRIPTEN_KEEPALIVE void clear_morph_animation(
|
||||||
TSceneManager *sceneManager,
|
TSceneManager *sceneManager,
|
||||||
EntityId entity);
|
EntityId entity);
|
||||||
|
|||||||
@@ -578,6 +578,7 @@ namespace thermion
|
|||||||
_engine->destroy(materialInstance);
|
_engine->destroy(materialInstance);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// TODO - free geometry?
|
// TODO - free geometry?
|
||||||
_textures.clear();
|
_textures.clear();
|
||||||
_assets.clear();
|
_assets.clear();
|
||||||
@@ -2503,8 +2504,12 @@ namespace thermion
|
|||||||
materialInstance->setParameter(property, filament::math::float4{value.x, value.y, value.z, value.w});
|
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);
|
_engine->destroy(instance);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -130,4 +130,11 @@ extern "C"
|
|||||||
{
|
{
|
||||||
return ((SceneManager *)sceneManager)->createGeometry(vertices, static_cast<uint32_t>(numVertices), normals, static_cast<uint32_t>(numNormals), uvs, static_cast<uint32_t>(numUvs), indices, static_cast<uint32_t>(numIndices), (filament::RenderableManager::PrimitiveType)primitiveType, reinterpret_cast<MaterialInstance *>(materialInstance), keepData);
|
return ((SceneManager *)sceneManager)->createGeometry(vertices, static_cast<uint32_t>(numVertices), normals, static_cast<uint32_t>(numNormals), uvs, static_cast<uint32_t>(numUvs), indices, static_cast<uint32_t>(numIndices), (filament::RenderableManager::PrimitiveType)primitiveType, reinterpret_cast<MaterialInstance *>(materialInstance), keepData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EMSCRIPTEN_KEEPALIVE void SceneManager_destroyMaterialInstance(TSceneManager *sceneManager, TMaterialInstance *instance)
|
||||||
|
{
|
||||||
|
((SceneManager *)sceneManager)->destroy(reinterpret_cast<MaterialInstance *>(instance));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user