fix: glTF instancing when loaded via buffer
This commit is contained in:
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user