#ifdef __EMSCRIPTEN__ #include #endif #include "c_api/TGltfAssetLoader.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "Log.hpp" #ifdef __cplusplus namespace thermion { extern "C" { using namespace filament; #endif EMSCRIPTEN_KEEPALIVE TGltfAssetLoader *GltfAssetLoader_create(TEngine *tEngine, TMaterialProvider *tMaterialProvider) { auto *engine = reinterpret_cast(tEngine); auto *materialProvider = reinterpret_cast(tMaterialProvider); if(!materialProvider) { Log("No material provider specified, using default ubershader provider"); materialProvider = gltfio::createUbershaderProvider( engine, UBERARCHIVE_DEFAULT_DATA, UBERARCHIVE_DEFAULT_SIZE ); } utils::EntityManager &em = utils::EntityManager::get(); auto ncm = new utils::NameComponentManager(em); auto *assetLoader = gltfio::AssetLoader::create({engine, materialProvider, ncm, &em}); return reinterpret_cast(assetLoader); } EMSCRIPTEN_KEEPALIVE TFilamentAsset *GltfAssetLoader_load( TEngine *tEngine, TGltfAssetLoader *tAssetLoader, const uint8_t *data, size_t length, uint8_t numInstances) { auto *engine = reinterpret_cast(tEngine); auto *assetLoader = reinterpret_cast(tAssetLoader); gltfio::FilamentAsset *asset; if(numInstances > 1) { std::vector instances(numInstances); asset = assetLoader->createInstancedAsset((const uint8_t *)data, length, instances.data(), numInstances); } else { asset = assetLoader->createAsset((const uint8_t *)data, length); } if (!asset) { Log("Unknown error loading GLB asset."); return std::nullptr_t(); } const char *const *const resourceUris = asset->getResourceUris(); const size_t resourceUriCount = asset->getResourceUriCount(); Log("glTF asset : %d resource URIs, %d instances", resourceUriCount, numInstances); for(int i = 0; i < resourceUriCount; i++) { Log("%s", resourceUris[i]); } return reinterpret_cast(asset); } EMSCRIPTEN_KEEPALIVE TMaterialInstance *GltfAssetLoader_getMaterialInstance(TRenderableManager *tRenderableManager, TFilamentAsset *tAsset) { auto *renderableManager = reinterpret_cast(tRenderableManager); auto *asset = reinterpret_cast(tAsset); auto renderable = asset->getRenderableEntities(); for(int i =0; i < asset->getRenderableEntityCount(); i++) { auto renderableInstance = renderableManager->getInstance(renderable[i]); if(!renderableInstance.isValid()) { Log("INVALID RENDERABLE"); continue; } auto mi = renderableManager->getMaterialInstanceAt(renderableInstance, 0); mi->setParameter("baseColorFactor", filament::math::float4 { 1.0f, 0.0f, 0.0f, 1.0f}); } auto renderableInstance = renderableManager->getInstance(renderable[0]); auto mi = renderableManager->getMaterialInstanceAt(renderableInstance, 0); return reinterpret_cast(mi); } EMSCRIPTEN_KEEPALIVE TMaterialProvider *GltfAssetLoader_getMaterialProvider(TGltfAssetLoader *tAssetLoader) { auto *assetLoader = reinterpret_cast(tAssetLoader); auto &materialProvider = assetLoader->getMaterialProvider(); return reinterpret_cast(&materialProvider); } EMSCRIPTEN_KEEPALIVE int32_t FilamentAsset_getResourceUriCount( TFilamentAsset *tFilamentAsset ) { auto *filamentAsset = reinterpret_cast(tFilamentAsset); return filamentAsset->getResourceUriCount(); } EMSCRIPTEN_KEEPALIVE const char* const* FilamentAsset_getResourceUris( TFilamentAsset *tFilamentAsset ) { auto *filamentAsset = reinterpret_cast(tFilamentAsset); return filamentAsset->getResourceUris(); } #ifdef __cplusplus } } #endif