fix: glTF instancing when loaded via buffer

This commit is contained in:
Nick Fisher
2025-01-02 15:16:12 +08:00
parent 3e39aa3630
commit 8e0ba8ac4e
6 changed files with 9 additions and 6 deletions

View File

@@ -48,7 +48,7 @@ extern "C"
EMSCRIPTEN_KEEPALIVE int SceneManager_removeFromScene(TSceneManager *tSceneManager, EntityId entity); EMSCRIPTEN_KEEPALIVE int SceneManager_removeFromScene(TSceneManager *tSceneManager, EntityId entity);
EMSCRIPTEN_KEEPALIVE void SceneManager_transformToUnitCube(TSceneManager *sceneManager, EntityId asset); EMSCRIPTEN_KEEPALIVE void SceneManager_transformToUnitCube(TSceneManager *sceneManager, EntityId asset);
EMSCRIPTEN_KEEPALIVE TSceneAsset *SceneManager_loadGlbFromBuffer(TSceneManager *tSceneManager, const uint8_t *const, size_t length, bool keepData, int priority, int layer, bool loadResourcesAsync); EMSCRIPTEN_KEEPALIVE TSceneAsset *SceneManager_loadGlbFromBuffer(TSceneManager *tSceneManager, const uint8_t *const, size_t length, int numInstances, bool keepData, int priority, int layer, bool loadResourcesAsync);
EMSCRIPTEN_KEEPALIVE TSceneAsset *SceneManager_loadGlb(TSceneManager *sceneManager, const char *assetPath, int numInstances, bool keepData); EMSCRIPTEN_KEEPALIVE TSceneAsset *SceneManager_loadGlb(TSceneManager *sceneManager, const char *assetPath, int numInstances, bool keepData);
EMSCRIPTEN_KEEPALIVE TSceneAsset *SceneManager_loadGltf(TSceneManager *sceneManager, const char *assetPath, const char *relativePath, bool keepData); EMSCRIPTEN_KEEPALIVE TSceneAsset *SceneManager_loadGltf(TSceneManager *sceneManager, const char *assetPath, const char *relativePath, bool keepData);

View File

@@ -42,6 +42,7 @@ namespace thermion
_materialInstances(materialInstances), _materialInstances(materialInstances),
_materialInstanceCount(materialInstanceCount) _materialInstanceCount(materialInstanceCount)
{ {
TRACE("Created GltfSceneAsset with %d reserved instances", asset->getAssetInstanceCount());
} }
~GltfSceneAsset(); ~GltfSceneAsset();

View File

@@ -57,10 +57,10 @@ extern "C"
} }
EMSCRIPTEN_KEEPALIVE TSceneAsset *SceneManager_loadGlbFromBuffer(TSceneManager *tSceneManager, const uint8_t *const data, size_t length, bool keepData, int priority, int layer, bool loadResourcesAsync) EMSCRIPTEN_KEEPALIVE TSceneAsset *SceneManager_loadGlbFromBuffer(TSceneManager *tSceneManager, const uint8_t *const data, size_t length, int numInstances, bool keepData, int priority, int layer, bool loadResourcesAsync)
{ {
auto *sceneManager = reinterpret_cast<SceneManager *>(tSceneManager); auto *sceneManager = reinterpret_cast<SceneManager *>(tSceneManager);
auto *asset = sceneManager->loadGlbFromBuffer((const uint8_t *)data, length, 1, keepData, priority, layer, loadResourcesAsync); auto *asset = sceneManager->loadGlbFromBuffer((const uint8_t *)data, length, numInstances, keepData, priority, layer, loadResourcesAsync);
return reinterpret_cast<TSceneAsset *>(asset); return reinterpret_cast<TSceneAsset *>(asset);
} }

View File

@@ -495,7 +495,7 @@ extern "C"
std::packaged_task<void()> lambda( std::packaged_task<void()> lambda(
[=]() mutable [=]() mutable
{ {
auto *asset = SceneManager_loadGlbFromBuffer(sceneManager, data, length, keepData, priority, layer, loadResourcesAsync); auto *asset = SceneManager_loadGlbFromBuffer(sceneManager, data, length, numInstances, keepData, priority, layer, loadResourcesAsync);
callback(asset); callback(asset);
}); });
auto fut = _rl->add_task(lambda); auto fut = _rl->add_task(lambda);

View File

@@ -19,7 +19,9 @@ namespace thermion
if (instanceNumber > _asset->getAssetInstanceCount() - 1) if (instanceNumber > _asset->getAssetInstanceCount() - 1)
{ {
Log("No instances available for reuse. When loading the asset, you must pre-allocate the number of instances you wish to make available for use. Try increasing this number."); Log("glTF asset was created with %d instances reserved, and %d instances have been used. Increase the number of instances pre-allocated when the asset is loaded.",
_asset->getAssetInstanceCount(), _instances.size()
);
return std::nullptr_t(); return std::nullptr_t();
} }
TRACE("Creating instance %d", instanceNumber); TRACE("Creating instance %d", instanceNumber);

View File

@@ -369,7 +369,7 @@ namespace thermion
FilamentAsset *asset = _assetLoader->createInstancedAsset((const uint8_t *)data, length, instances.data(), numInstances); FilamentAsset *asset = _assetLoader->createInstancedAsset((const uint8_t *)data, length, instances.data(), numInstances);
Log("Created instanced asset."); Log("Created glTF asset with %d instances.", numInstances);
if (!asset) if (!asset)
{ {