diff --git a/android/gltfio-android/src/main/cpp/ResourceLoader.cpp b/android/gltfio-android/src/main/cpp/ResourceLoader.cpp index 60fc272169..1dad00871a 100644 --- a/android/gltfio-android/src/main/cpp/ResourceLoader.cpp +++ b/android/gltfio-android/src/main/cpp/ResourceLoader.cpp @@ -52,10 +52,21 @@ Java_com_google_android_filament_gltfio_ResourceLoader_nAddResourceData(JNIEnv* jlong nativeLoader, jstring url, jobject javaBuffer, jint remaining) { ResourceLoader* loader = (ResourceLoader*) nativeLoader; AutoBuffer* buffer = new AutoBuffer(env, javaBuffer, remaining); - const char* curl = env->GetStringUTFChars(url, nullptr); - loader->addResourceData(curl, + const char* cstring = env->GetStringUTFChars(url, nullptr); + loader->addResourceData(cstring, ResourceLoader::BufferDescriptor(buffer->getData(), buffer->getSize(), &destroy, buffer)); + env->ReleaseStringUTFChars(url, cstring); +} + +extern "C" JNIEXPORT jboolean JNICALL +Java_com_google_android_filament_gltfio_ResourceLoader_nHasResourceData(JNIEnv* env, jclass, + jlong nativeLoader, jstring url) { + ResourceLoader* loader = (ResourceLoader*) nativeLoader; + const char* cstring = env->GetStringUTFChars(url, nullptr); + bool status = loader->hasResourceData(cstring); + env->ReleaseStringUTFChars(url, cstring); + return status; } extern "C" JNIEXPORT void JNICALL diff --git a/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/ResourceLoader.java b/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/ResourceLoader.java index 1850f6f541..12b92f91be 100644 --- a/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/ResourceLoader.java +++ b/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/ResourceLoader.java @@ -75,6 +75,13 @@ public class ResourceLoader { return this; } + /** + * Checks if the given resource has already been loaded. + */ + public boolean hasResourceData(@NonNull String uri) { + return nHasResourceData(mNativeObject, uri); + } + /** * Iterates through all external buffers and images and creates corresponding Filament objects * (vertex buffers, textures, etc), which become owned by the asset. @@ -95,5 +102,6 @@ public class ResourceLoader { private static native void nDestroyResourceLoader(long nativeLoader); private static native void nAddResourceData(long nativeLoader, String url, Buffer buffer, int remaining); + private static native boolean nHasResourceData(long nativeLoader, String url); private static native void nLoadResources(long nativeLoader, long nativeAsset); } diff --git a/libs/gltfio/include/gltfio/ResourceLoader.h b/libs/gltfio/include/gltfio/ResourceLoader.h index 6f341d8a9e..2e2637078e 100644 --- a/libs/gltfio/include/gltfio/ResourceLoader.h +++ b/libs/gltfio/include/gltfio/ResourceLoader.h @@ -92,7 +92,12 @@ public: * Adds raw resource data into a cache for platforms that do not have filesystem or network * access. */ - void addResourceData(std::string url, BufferDescriptor&& buffer); + void addResourceData(const char* url, BufferDescriptor&& buffer); + + /** + * Checks if the given resource has already been loaded. + */ + bool hasResourceData(const char* url) const; private: bool createTextures(details::FFilamentAsset* asset) const; diff --git a/libs/gltfio/src/ResourceLoader.cpp b/libs/gltfio/src/ResourceLoader.cpp index 0dc8eb856f..82cc298bcb 100644 --- a/libs/gltfio/src/ResourceLoader.cpp +++ b/libs/gltfio/src/ResourceLoader.cpp @@ -116,10 +116,14 @@ static void importSkinningData(Skin& dstSkin, const cgltf_skin& srcSkin) { } } -void ResourceLoader::addResourceData(std::string url, BufferDescriptor&& buffer) { +void ResourceLoader::addResourceData(const char* url, BufferDescriptor&& buffer) { pImpl->mUserCache.emplace(url, std::move(buffer)); } +bool ResourceLoader::hasResourceData(const char* url) const { + return pImpl->mUserCache.find(url) != pImpl->mUserCache.end(); +} + static void convertBytesToShorts(uint16_t* dst, const uint8_t* src, size_t count) { for (size_t i = 0; i < count; ++i) { dst[i] = src[i]; diff --git a/web/filament-js/jsbindings.cpp b/web/filament-js/jsbindings.cpp index 33ae30d305..32dc244696 100644 --- a/web/filament-js/jsbindings.cpp +++ b/web/filament-js/jsbindings.cpp @@ -1447,7 +1447,11 @@ class_("gltfio$ResourceLoader") .function("addResourceData", EMBIND_LAMBDA(void, (ResourceLoader* self, std::string url, BufferDescriptor buffer), { - self->addResourceData(url, std::move(*buffer.bd)); + self->addResourceData(url.c_str(), std::move(*buffer.bd)); + }), allow_raw_pointers()) + + .function("hasResourceData", EMBIND_LAMBDA(bool, (ResourceLoader* self, std::string url), { + return self->hasResourceData(url.c_str()); }), allow_raw_pointers()) .function("loadResources", &ResourceLoader::loadResources, allow_raw_pointers());