diff --git a/android/gltfio-android/src/main/cpp/MaterialProvider.cpp b/android/gltfio-android/src/main/cpp/MaterialProvider.cpp index 480a0455f9..7a8247b04e 100644 --- a/android/gltfio-android/src/main/cpp/MaterialProvider.cpp +++ b/android/gltfio-android/src/main/cpp/MaterialProvider.cpp @@ -34,3 +34,10 @@ Java_com_google_android_filament_gltfio_MaterialProvider_nDestroyMaterialProvide auto provider = (MaterialProvider*) nativeProvider; delete provider; } + +extern "C" JNIEXPORT void JNICALL +Java_com_google_android_filament_gltfio_MaterialProvider_nDestroyMaterials(JNIEnv*, jclass, + jlong nativeProvider) { + auto provider = (MaterialProvider*) nativeProvider; + provider->destroyMaterials(); +} diff --git a/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/AssetLoader.java b/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/AssetLoader.java index a40db6fa3a..927a8d0be8 100644 --- a/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/AssetLoader.java +++ b/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/AssetLoader.java @@ -78,9 +78,10 @@ import java.nio.Buffer; public class AssetLoader { private long mNativeObject; private Engine mEngine; + private MaterialProvider mMaterialCache; /** - * Constructs an AssetLoader that can be used to create and destroy instances of + * Constructs an AssetLoader that can be used to create and destroy instances of * {@link FilamentAsset}. * * @param engine the engine that the loader should pass to builder objects @@ -100,6 +101,7 @@ public class AssetLoader { } mEngine = engine; + mMaterialCache = generator; } /** @@ -107,6 +109,7 @@ public class AssetLoader { */ public void destroy() { nDestroyAssetLoader(mNativeObject); + mMaterialCache.destroyMaterials(); mNativeObject = 0; } diff --git a/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/MaterialProvider.java b/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/MaterialProvider.java index b59d73852f..a4d65e4ffa 100644 --- a/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/MaterialProvider.java +++ b/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/MaterialProvider.java @@ -47,10 +47,21 @@ public class MaterialProvider { mNativeObject = 0; } + /** + * Destroys all cached materials. + * + * This is not called automatically when MaterialProvider is destroyed, which allows + * clients to take ownership of the cache if desired. + */ + public void destroyMaterials() { + nDestroyMaterials(mNativeObject); + } + long getNativeObject() { return mNativeObject; } private static native long nCreateMaterialProvider(long nativeEngine); private static native void nDestroyMaterialProvider(long nativeProvider); + private static native void nDestroyMaterials(long nativeProvider); } diff --git a/libs/gltfio/include/gltfio/MaterialProvider.h b/libs/gltfio/include/gltfio/MaterialProvider.h index 58be327681..9b9374dfec 100644 --- a/libs/gltfio/include/gltfio/MaterialProvider.h +++ b/libs/gltfio/include/gltfio/MaterialProvider.h @@ -114,6 +114,11 @@ enum MaterialSource { * - The \c UbershaderLoader implementation uses a small number of pre-built materials with complex * fragment shaders, but does not require any run time work or usage of filamat. See * createUbershaderLoader(). + * + * Both implementations of MaterialProvider maintain a small cache of materials which must be + * explicitly freed using destroyMaterials(). These materials are not freed automatically when the + * MaterialProvider is destroyed, which allows clients to take ownership if desired. + * */ class MaterialProvider { public: